{"roots":["6:1529"],"nodeById":{"2224:2966":{"type":"FRAME","id":"2224:2966","name":"Footer copyright","absoluteBoundingBox":{"x":-803.0,"y":3222.0,"width":197.0,"height":26.0},"isolatedAbsoluteRenderBounds":{"x":-803.0,"y":3222.0,"width":197.0,"height":26.0},"relativeTransform":[[1.0,0.0,32.0],[0.0,1.0,360.0]],"size":{"x":197.0,"y":26.0},"fills":[],"strokeAlign":"INSIDE","strokes":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"layoutMode":"HORIZONTAL","itemSpacing":10.0,"counterAxisAlignItems":"CENTER","children":["2224:2967"]},"2224:2959":{"type":"FRAME","id":"2224:2959","name":"Footer contact information","absoluteBoundingBox":{"x":-803.0,"y":3119.0,"width":122.0,"height":46.0},"isolatedAbsoluteRenderBounds":{"x":-803.0,"y":3119.0,"width":558.0,"height":77.0},"relativeTransform":[[1.0,0.0,32.0],[0.0,1.0,257.0]],"size":{"x":122.0,"y":46.0},"fills":[],"strokeAlign":"INSIDE","strokes":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"layoutMode":"HORIZONTAL","primaryAxisSizingMode":"FIXED","counterAxisSizingMode":"FIXED","children":["2224:2960","2224:2963","2224:2965"]},"2224:2965":{"type":"FRAME","id":"2224:2965","name":"Contact column 4","absoluteBoundingBox":{"x":-500.0,"y":3119.0,"width":255.0,"height":20.0},"isolatedAbsoluteRenderBounds":{"x":-500.0,"y":3119.0,"width":255.0,"height":20.0},"relativeTransform":[[1.0,0.0,303.0],[0.0,1.0,0.0]],"size":{"x":255.0,"y":20.0},"fills":[],"strokeAlign":"INSIDE","strokes":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"layoutMode":"VERTICAL","itemSpacing":2.0,"primaryAxisAlignItems":"CENTER","children":[]},"2224:2964":{"type":"TEXT","id":"2224:2964","name":"서울특별시 서초구 마방로 6길 28, 5층 502호","absoluteBoundingBox":{"x":-655.0,"y":3120.0,"width":155.0,"height":75.0},"isolatedAbsoluteRenderBounds":{"x":-654.703002929688,"y":3123.90307617188,"width":151.708221435547,"height":27.932861328125},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,1.0]],"size":{"x":155.0,"y":75.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":0.0,"g":0.0,"b":0.0,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"OUTSIDE","strokes":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"behaviors":{"hover":{"transition":{"easingType":"OUT_CUBIC","easingFunction":[0.215000003576279,0.610000014305115,0.354999989271164,1.0],"transitionDuration":0.300000011920929,"delay":0.0},"state":{"transform":{"m00":1.0,"m01":0.0,"m02":0.0,"m10":0.0,"m11":1.0,"m12":0.0},"opacity":0.699999988079071},"behaviorType":"hover"}},"characterStyleOverrides":[],"characters":"서울특별시 서초구 마방로 6길 28, \n5층 502호\n","lineIndentations":[0,0,0],"lineTypes":["NONE","NONE","NONE"],"listStartOffsets":[],"lineStyleOverrides":[0,0,0],"lineTextDirections":null,"resolvedParagraphValues":{"0":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":0.0},"1":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":0.0},"2":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":0.0}},"style":{"fontFamily":"Noto Sans KR","fontPostScriptName":"NotoSansKR-Regular","fontStyle":"Regular","fontVariantPosition":"NORMAL","fontSize":11.0,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","letterSpacing":0.0,"letterSpacingValue":0.0,"letterSpacingUnit":"PERCENT","lineHeightPx":17.8199996948242,"lineHeightPercent":135.0,"lineHeightPercentFontSize":162.0,"lineHeightUnit":"FONT_SIZE_%","paragraphSpacing":0,"paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecoration":"NONE","textDecorationSkipInk":false,"textDecorationStyle":"solid","textAutoResize":"NONE","textTruncation":"DISABLED"},"styleOverrideTable":{}},"2224:2960":{"type":"FRAME","id":"2224:2960","name":"Contact column 1","absoluteBoundingBox":{"x":-803.0,"y":3119.0,"width":148.0,"height":46.0},"isolatedAbsoluteRenderBounds":{"x":-803.0,"y":3119.0,"width":148.0,"height":46.0},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,0.0]],"size":{"x":148.0,"y":46.0},"fills":[],"strokeAlign":"INSIDE","strokes":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"layoutMode":"VERTICAL","itemSpacing":2.0,"primaryAxisAlignItems":"CENTER","primaryAxisSizingMode":"FIXED","counterAxisSizingMode":"FIXED","children":["2224:2961","2224:2962"]},"2224:2961":{"type":"TEXT","id":"2224:2961","name":"hello@brainable.co.kr","absoluteBoundingBox":{"x":-803.0,"y":3133.5,"width":255.0,"height":20.0},"isolatedAbsoluteRenderBounds":{"x":-803.0,"y":3133.5,"width":255.0,"height":20.0},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,14.5]],"size":{"x":255.0,"y":20.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":0.0,"g":0.0,"b":0.0,"a":1.0},"visible":true,"opacity":1.0}],"visible":false,"strokeAlign":"OUTSIDE","strokes":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"behaviors":{"hover":{"transition":{"easingType":"OUT_CUBIC","easingFunction":[0.215000003576279,0.610000014305115,0.354999989271164,1.0],"transitionDuration":0.300000011920929,"delay":0.0},"state":{"transform":{"m00":1.0,"m01":0.0,"m02":0.0,"m10":0.0,"m11":1.0,"m12":0.0},"opacity":0.699999988079071},"behaviorType":"hover"}},"characterStyleOverrides":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1],"characters":"hello@brainable.co.kr","lineIndentations":[0],"lineTypes":["NONE"],"listStartOffsets":[],"lineStyleOverrides":[0],"lineTextDirections":null,"resolvedParagraphValues":{"0":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":0.0}},"textAutoResize":"HEIGHT","style":{"styleIdForText":"StyleId:6:1356","fontFamily":"Geist","fontPostScriptName":"Geist-Regular","fontStyle":"Regular","hyperlink":{"type":"URL","url":"mailto:hello@figma.com","openInNewTab":true},"textAutoResize":"HEIGHT","responsiveTextStyleVariants":[{"minWidth":1280.0,"name":"Desktop","style":{"styleIdForText":"StyleId:6:1356","fontSize":14.0,"letterSpacing":0.0,"letterSpacingValue":0.0,"letterSpacingUnit":"PERCENT","lineHeightPx":19.6000003814697,"lineHeightPercent":119.466667175293,"lineHeightPercentFontSize":140.0,"lineHeightUnit":"FONT_SIZE_%"}},{"minWidth":800.0,"name":"Tablet","style":{"styleIdForText":"StyleId:6:1356","fontSize":14.0,"letterSpacing":0.0,"letterSpacingValue":0.0,"letterSpacingUnit":"PERCENT","lineHeightPx":19.6000003814697,"lineHeightPercent":119.466667175293,"lineHeightPercentFontSize":140.0,"lineHeightUnit":"FONT_SIZE_%"}},{"minWidth":0.0,"name":"Mobile","style":{"styleIdForText":"StyleId:6:1356","fontSize":14.0,"letterSpacing":0.0,"letterSpacingValue":0.0,"letterSpacingUnit":"PERCENT","lineHeightPx":19.6000003814697,"lineHeightPercent":119.466667175293,"lineHeightPercentFontSize":140.0,"lineHeightUnit":"FONT_SIZE_%"}}],"fontVariantPosition":"NORMAL","fontSize":14.0,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","letterSpacing":0.0,"letterSpacingValue":0.0,"letterSpacingUnit":"PERCENT","lineHeightPx":19.6000003814697,"lineHeightPercent":107.692314147949,"lineHeightPercentFontSize":140.0,"lineHeightUnit":"FONT_SIZE_%","paragraphSpacing":0,"paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecoration":"NONE","textDecorationSkipInk":false,"textDecorationStyle":"solid","textTruncation":"DISABLED"},"styleOverrideTable":{"1":{"styleIdForText":"StyleId:6:1356","paragraphSpacing":0,"paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecoration":"NONE","textDecorationSkipInk":false,"textDecorationStyle":"solid","textAutoResize":"NONE","textTruncation":"DISABLED","lineHeightPercent":100,"lineHeightPercentFontSize":100}}},"2224:2954":{"type":"FRAME","id":"2224:2954","name":"Footer header","absoluteBoundingBox":{"x":-803.0,"y":2949.0,"width":311.0,"height":42.0},"isolatedAbsoluteRenderBounds":{"x":-803.0,"y":2949.0,"width":311.0,"height":42.0},"relativeTransform":[[1.0,0.0,32.0],[0.0,1.0,87.0]],"size":{"x":311.0,"y":42.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":1.0,"g":1.0,"b":1.0,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"INSIDE","layoutAlign":"STRETCH","strokes":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"layoutMode":"VERTICAL","itemSpacing":24.0,"primaryAxisAlignItems":"CENTER","primaryAxisSizingMode":"FIXED","counterAxisSizingMode":"FIXED","children":["2224:2955","2224:2956"]},"2224:2956":{"type":"RECTANGLE","id":"2224:2956","name":"brainable_logo_ver.001-01 1","absoluteBoundingBox":{"x":-803.0,"y":2952.5,"width":42.0,"height":35.0},"targetAspectRatio":{"x":1400.0,"y":1167.0},"isolatedAbsoluteRenderBounds":{"x":-803.0,"y":2952.5,"width":42.0,"height":35.0},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,3.5]],"size":{"x":42.0,"y":35.0},"fills":[{"blendMode":"NORMAL","type":"IMAGE","scaleMode":"FILL","imageRef":"4f89b370cf29c22c8bfd83ffd6ad48b1dd2cd6af","originalImageWidth":1400,"originalImageHeight":1167,"visible":true,"opacity":1.0,"rotation":0.0}],"strokeAlign":"INSIDE","strokes":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[]},"2224:2932":{"type":"FRAME","id":"2224:2932","name":"Footer section","absoluteBoundingBox":{"x":-835.0,"y":2623.0,"width":375.0,"height":932.0},"isolatedAbsoluteRenderBounds":{"x":-835.0,"y":2623.0,"width":375.0,"height":932.0},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,1801.0]],"size":{"x":375.0,"y":932.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":1.0,"g":1.0,"b":1.0,"a":1.0},"visible":true,"opacity":1.0}],"visible":false,"strokeAlign":"INSIDE","layoutAlign":"STRETCH","strokes":[],"accessibleHTMLTag":"FOOTER","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"paddingBottom":185.0,"layoutMode":"VERTICAL","itemSpacing":105.0,"counterAxisAlignItems":"CENTER","primaryAxisAlignItems":"CENTER","primaryAxisSizingMode":"FIXED","counterAxisSizingMode":"FIXED","children":["2224:2933","2224:2936","2224:2938","2224:2945"]},"2224:2945":{"type":"FRAME","id":"2224:2945","name":"Footer copyright","absoluteBoundingBox":{"x":-1144.5,"y":3262.0,"width":994.0,"height":28.0},"isolatedAbsoluteRenderBounds":{"x":-1144.5,"y":3262.0,"width":994.0,"height":28.0},"relativeTransform":[[1.0,0.0,-309.5],[0.0,1.0,639.0]],"size":{"x":994.0,"y":28.0},"fills":[],"strokeAlign":"INSIDE","strokes":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"layoutMode":"HORIZONTAL","itemSpacing":10.0,"counterAxisAlignItems":"CENTER","primaryAxisSizingMode":"FIXED","children":["2224:2946"]},"2224:2946":{"type":"TEXT","id":"2224:2946","name":"Brainable Co., LTD. © 2025 All Rights Reserved","absoluteBoundingBox":{"x":-1144.5,"y":3262.0,"width":197.0,"height":28.0},"isolatedAbsoluteRenderBounds":{"x":-1143.94995117188,"y":3265.0400390625,"width":146.85888671875,"height":24.4599609375},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,0.0]],"size":{"x":197.0,"y":28.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":0.443900465965271,"g":0.442026853561401,"b":0.442026853561401,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"OUTSIDE","strokes":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"characterStyleOverrides":[],"characters":"Brainable Co., LTD.\n© 2025 All Rights Reserved","lineIndentations":[0,0],"lineTypes":["NONE","NONE"],"listStartOffsets":[],"lineStyleOverrides":[0,0],"lineTextDirections":null,"resolvedParagraphValues":{"0":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":0.0},"1":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":0.0}},"textAutoResize":"HEIGHT","style":{"fontFamily":"Noto Sans KR","fontPostScriptName":"NotoSansKR-Regular","fontStyle":"Regular","textAutoResize":"HEIGHT","fontVariantPosition":"NORMAL","fontSize":10.0,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","letterSpacing":1.0,"letterSpacingValue":10.0,"letterSpacingUnit":"PERCENT","lineHeightPx":14.0,"lineHeightPercent":116.666664123535,"lineHeightPercentFontSize":140.0,"lineHeightUnit":"FONT_SIZE_%","paragraphSpacing":0,"paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecoration":"NONE","textDecorationSkipInk":false,"textDecorationStyle":"solid","textTruncation":"DISABLED"},"styleOverrideTable":{}},"2224:2938":{"type":"FRAME","id":"2224:2938","name":"Footer contact information","absoluteBoundingBox":{"x":-1144.5,"y":3090.0,"width":994.0,"height":67.0},"isolatedAbsoluteRenderBounds":{"x":-1144.5,"y":3090.0,"width":994.0,"height":67.0},"relativeTransform":[[1.0,0.0,-309.5],[0.0,1.0,467.0]],"size":{"x":994.0,"y":67.0},"fills":[],"strokeAlign":"INSIDE","strokes":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"paddingBottom":1.0,"layoutMode":"HORIZONTAL","primaryAxisSizingMode":"FIXED","children":["2224:2939","2224:2942","2224:2944"]},"2224:2944":{"type":"FRAME","id":"2224:2944","name":"Contact column 4","absoluteBoundingBox":{"x":-537.5,"y":3090.0,"width":255.0,"height":20.0},"isolatedAbsoluteRenderBounds":{"x":-537.5,"y":3090.0,"width":255.0,"height":20.0},"relativeTransform":[[1.0,0.0,607.0],[0.0,1.0,0.0]],"size":{"x":255.0,"y":20.0},"fills":[],"strokeAlign":"INSIDE","strokes":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"layoutMode":"VERTICAL","itemSpacing":2.0,"primaryAxisAlignItems":"CENTER","children":[]},"2224:2942":{"type":"FRAME","id":"2224:2942","name":"Contact column 2","absoluteBoundingBox":{"x":-792.5,"y":3090.0,"width":255.0,"height":66.0},"isolatedAbsoluteRenderBounds":{"x":-792.5,"y":3090.0,"width":255.0,"height":66.0},"relativeTransform":[[1.0,0.0,352.0],[0.0,1.0,0.0]],"size":{"x":255.0,"y":66.0},"fills":[],"strokeAlign":"INSIDE","strokes":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"layoutMode":"VERTICAL","itemSpacing":2.0,"primaryAxisAlignItems":"CENTER","children":["2224:2943"]},"2224:2939":{"type":"FRAME","id":"2224:2939","name":"Contact column 1","absoluteBoundingBox":{"x":-1144.5,"y":3090.0,"width":352.0,"height":60.0},"isolatedAbsoluteRenderBounds":{"x":-1144.5,"y":3090.0,"width":352.0,"height":60.0},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,0.0]],"size":{"x":352.0,"y":60.0},"fills":[],"strokeAlign":"INSIDE","strokes":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"layoutMode":"VERTICAL","itemSpacing":2.0,"primaryAxisAlignItems":"CENTER","primaryAxisSizingMode":"FIXED","counterAxisSizingMode":"FIXED","children":["2224:2940","2224:2941"]},"2224:2940":{"type":"TEXT","id":"2224:2940","name":"hello@brainable.co.kr","absoluteBoundingBox":{"x":-1144.5,"y":3090.0,"width":255.0,"height":20.0},"isolatedAbsoluteRenderBounds":{"x":-1144.5,"y":3090.0,"width":255.0,"height":20.0},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,0.0]],"size":{"x":255.0,"y":20.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":0.0,"g":0.0,"b":0.0,"a":1.0},"visible":true,"opacity":1.0}],"visible":false,"strokeAlign":"OUTSIDE","strokes":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"behaviors":{"hover":{"transition":{"easingType":"OUT_CUBIC","easingFunction":[0.215000003576279,0.610000014305115,0.354999989271164,1.0],"transitionDuration":0.300000011920929,"delay":0.0},"state":{"transform":{"m00":1.0,"m01":0.0,"m02":0.0,"m10":0.0,"m11":1.0,"m12":0.0},"opacity":0.699999988079071},"behaviorType":"hover"}},"characterStyleOverrides":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1],"characters":"hello@brainable.co.kr","lineIndentations":[0],"lineTypes":["NONE"],"listStartOffsets":[],"lineStyleOverrides":[0],"lineTextDirections":null,"resolvedParagraphValues":{"0":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":0.0}},"textAutoResize":"HEIGHT","style":{"styleIdForText":"StyleId:6:1356","fontFamily":"Geist","fontPostScriptName":"Geist-Regular","fontStyle":"Regular","hyperlink":{"type":"URL","url":"mailto:hello@figma.com","openInNewTab":true},"textAutoResize":"HEIGHT","responsiveTextStyleVariants":[{"minWidth":1280.0,"name":"Desktop","style":{"styleIdForText":"StyleId:6:1356","fontSize":14.0,"letterSpacing":0.0,"letterSpacingValue":0.0,"letterSpacingUnit":"PERCENT","lineHeightPx":19.6000003814697,"lineHeightPercent":119.466667175293,"lineHeightPercentFontSize":140.0,"lineHeightUnit":"FONT_SIZE_%"}},{"minWidth":800.0,"name":"Tablet","style":{"styleIdForText":"StyleId:6:1356","fontSize":14.0,"letterSpacing":0.0,"letterSpacingValue":0.0,"letterSpacingUnit":"PERCENT","lineHeightPx":19.6000003814697,"lineHeightPercent":119.466667175293,"lineHeightPercentFontSize":140.0,"lineHeightUnit":"FONT_SIZE_%"}},{"minWidth":0.0,"name":"Mobile","style":{"styleIdForText":"StyleId:6:1356","fontSize":14.0,"letterSpacing":0.0,"letterSpacingValue":0.0,"letterSpacingUnit":"PERCENT","lineHeightPx":19.6000003814697,"lineHeightPercent":119.466667175293,"lineHeightPercentFontSize":140.0,"lineHeightUnit":"FONT_SIZE_%"}}],"fontVariantPosition":"NORMAL","fontSize":14.0,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","letterSpacing":0.0,"letterSpacingValue":0.0,"letterSpacingUnit":"PERCENT","lineHeightPx":19.6000003814697,"lineHeightPercent":107.692314147949,"lineHeightPercentFontSize":140.0,"lineHeightUnit":"FONT_SIZE_%","paragraphSpacing":0,"paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecoration":"NONE","textDecorationSkipInk":false,"textDecorationStyle":"solid","textTruncation":"DISABLED"},"styleOverrideTable":{"1":{"styleIdForText":"StyleId:6:1356","paragraphSpacing":0,"paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecoration":"NONE","textDecorationSkipInk":false,"textDecorationStyle":"solid","textAutoResize":"NONE","textTruncation":"DISABLED","lineHeightPercent":100,"lineHeightPercentFontSize":100}}},"2224:2936":{"type":"FRAME","id":"2224:2936","name":"Footer subhead","absoluteBoundingBox":{"x":-1144.5,"y":2934.0,"width":994.0,"height":51.0},"isolatedAbsoluteRenderBounds":{"x":-1144.5,"y":2934.0,"width":994.0,"height":51.0},"relativeTransform":[[1.0,0.0,-309.5],[0.0,1.0,311.0]],"size":{"x":994.0,"y":51.0},"fills":[],"strokeAlign":"INSIDE","strokes":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"layoutMode":"HORIZONTAL","itemSpacing":10.0,"counterAxisAlignItems":"CENTER","primaryAxisAlignItems":"CENTER","primaryAxisSizingMode":"FIXED","counterAxisSizingMode":"FIXED","children":["2224:2937"]},"2224:2937":{"type":"TEXT","id":"2224:2937","name":"Pioneer of the Wellness-tech Solution.","absoluteBoundingBox":{"x":-1144.5,"y":2950.0,"width":994.0,"height":19.0},"isolatedAbsoluteRenderBounds":{"x":-1143.07202148438,"y":2953.67407226562,"width":501.282836914062,"height":11.5078125},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,16.0]],"size":{"x":994.0,"y":19.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":0.0,"g":0.0,"b":0.0,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"OUTSIDE","layoutGrow":1.0,"strokes":[],"strokeWeight":3.21430063247681,"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"characterStyleOverrides":[],"characters":"Pioneer of the Wellness-tech Solution.","lineIndentations":[0],"lineTypes":["NONE"],"listStartOffsets":[],"lineStyleOverrides":[0],"lineTextDirections":null,"resolvedParagraphValues":{"0":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":0.0}},"textAutoResize":"HEIGHT","style":{"fontFamily":"Noto Sans KR","fontPostScriptName":"NotoSansKR-DemiLight","fontStyle":"DemiLight","textAutoResize":"HEIGHT","fontVariantPosition":"NORMAL","fontSize":14.0,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","letterSpacing":7.0,"letterSpacingValue":50.0,"letterSpacingUnit":"PERCENT","lineHeightPx":18.8999996185303,"lineHeightPercent":112.499992370605,"lineHeightPercentFontSize":135.0,"lineHeightUnit":"FONT_SIZE_%","paragraphSpacing":0,"paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecoration":"NONE","textDecorationSkipInk":false,"textDecorationStyle":"solid","textTruncation":"DISABLED"},"styleOverrideTable":{}},"2224:2933":{"type":"FRAME","id":"2224:2933","name":"Footer header","absoluteBoundingBox":{"x":-1158.5,"y":2703.0,"width":1022.0,"height":126.0},"isolatedAbsoluteRenderBounds":{"x":-1158.5,"y":2703.0,"width":1022.0,"height":126.0},"relativeTransform":[[1.0,0.0,-323.5],[0.0,1.0,80.0]],"size":{"x":1022.0,"y":126.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":1.0,"g":1.0,"b":1.0,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"INSIDE","strokes":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"layoutMode":"HORIZONTAL","itemSpacing":18.0,"counterAxisAlignItems":"CENTER","primaryAxisSizingMode":"FIXED","counterAxisSizingMode":"FIXED","children":["2224:2934","2224:2935"]},"2224:2941":{"type":"TEXT","id":"2224:2941","name":"010-8123-7857 02)-581-7856","absoluteBoundingBox":{"x":-1144.5,"y":3092.5,"width":255.0,"height":55.0},"isolatedAbsoluteRenderBounds":{"x":-1143.69995117188,"y":3098.56396484375,"width":126.371704101562,"height":38.072021484375},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,2.5]],"size":{"x":255.0,"y":55.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":0.0,"g":0.0,"b":0.0,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"OUTSIDE","strokes":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"behaviors":{"hover":{"transition":{"easingType":"OUT_CUBIC","easingFunction":[0.215000003576279,0.610000014305115,0.354999989271164,1.0],"transitionDuration":0.300000011920929,"delay":0.0},"state":{"transform":{"m00":1.0,"m01":0.0,"m02":0.0,"m10":0.0,"m11":1.0,"m12":0.0},"opacity":0.699999988079071},"behaviorType":"hover"}},"characterStyleOverrides":[],"characters":"010-8123-7857\n02)-581-7856","lineIndentations":[0,0],"lineTypes":["NONE","NONE"],"listStartOffsets":[],"lineStyleOverrides":[0,0],"lineTextDirections":null,"resolvedParagraphValues":{"0":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":0.0},"1":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":0.0}},"style":{"fontFamily":"Noto Sans KR","fontPostScriptName":"NotoSansKR-Regular","fontStyle":"Regular","fontVariantPosition":"NORMAL","fontSize":16.0,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","letterSpacing":1.6,"letterSpacingValue":10.0,"letterSpacingUnit":"PERCENT","lineHeightPx":22.8799991607666,"lineHeightPercent":119.166664123535,"lineHeightPercentFontSize":143.0,"lineHeightUnit":"FONT_SIZE_%","paragraphSpacing":0,"paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecoration":"NONE","textDecorationSkipInk":false,"textDecorationStyle":"solid","textAutoResize":"NONE","textTruncation":"DISABLED"},"styleOverrideTable":{}},"2224:2934":{"type":"RECTANGLE","id":"2224:2934","name":"brainable_logo_ver.001-01 1","absoluteBoundingBox":{"x":-1158.5,"y":2717.5,"width":117.0,"height":97.0},"targetAspectRatio":{"x":1400.0,"y":1167.0},"isolatedAbsoluteRenderBounds":{"x":-1158.5,"y":2717.5,"width":117.0,"height":97.0},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,14.5]],"size":{"x":117.0,"y":97.0},"fills":[{"blendMode":"NORMAL","type":"IMAGE","scaleMode":"FILL","imageRef":"4f89b370cf29c22c8bfd83ffd6ad48b1dd2cd6af","originalImageWidth":1400,"originalImageHeight":1167,"visible":true,"opacity":1.0,"rotation":0.0}],"strokeAlign":"INSIDE","strokes":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[]},"119:265":{"type":"FRAME","id":"119:265","name":"Image divider section","absoluteBoundingBox":{"x":-835.0,"y":2612.0,"width":375.0,"height":250.0},"isolatedAbsoluteRenderBounds":{"x":-835.0,"y":2612.0,"width":375.0,"height":250.0},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,1790.0]],"size":{"x":375.0,"y":250.0},"fills":[{"blendMode":"NORMAL","type":"IMAGE","scaleMode":"FILL","imageRef":"5254ebc44a873806e532a942d974e05bc220731e","originalImageWidth":4096,"originalImageHeight":2731,"visible":true,"opacity":1.0,"rotation":0.0},{"opacity":0.409999996423721,"blendMode":"NORMAL","type":"SOLID","color":{"r":0.0,"g":0.0,"b":0.0,"a":1.0},"visible":true}],"strokeAlign":"INSIDE","layoutAlign":"STRETCH","strokes":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"accessibleLabel":"Photo of a study hall area with desks and people studying.","ariaAttributes":{},"interactions":[],"behaviors":{"appear":{"otherLayer":{"sessionID":-1,"localID":-1},"trigger":"THIS_LAYER_IN_VIEW","direction":"UP","enterTransition":{"easingType":"OUT_CUBIC","easingFunction":[0.215000003576279,0.610000014305115,0.354999989271164,1.0],"transitionDuration":0.800000011920929,"delay":0.0},"enterState":{"transform":{"m00":1.0,"m01":0.0,"m02":0.0,"m10":0.0,"m11":1.0,"m12":0.0},"opacity":0.0},"exitTransition":{"easingType":"OUT_CUBIC","easingFunction":[0.215000003576279,0.610000014305115,0.354999989271164,1.0],"transitionDuration":0.600000023841858,"delay":0.0},"exitState":{"transform":{"m00":1.0,"m01":0.0,"m02":0.0,"m10":0.0,"m11":1.0,"m12":0.0},"opacity":1.0},"playsOnce":false,"behaviorType":"appear"}},"paddingTop":10.0,"paddingRight":10.0,"paddingBottom":10.0,"paddingLeft":10.0,"layoutMode":"VERTICAL","itemSpacing":10.0,"primaryAxisSizingMode":"FIXED","counterAxisSizingMode":"FIXED","children":[]},"8:2149":{"type":"FRAME","id":"8:2149","name":"Our services content","absoluteBoundingBox":{"x":-815.0,"y":1495.0,"width":323.0,"height":78.0},"isolatedAbsoluteRenderBounds":{"x":-815.0,"y":1495.0,"width":323.0,"height":899.0},"relativeTransform":[[1.0,0.0,20.0],[0.0,1.0,145.0]],"size":{"x":323.0,"y":78.0},"fills":[],"strokeAlign":"INSIDE","maxWidth":1180.0,"strokes":[],"individualStrokeWeights":{"top":0.0,"right":0.0,"bottom":0.5,"left":0.0},"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"paddingBottom":9.0,"layoutMode":"VERTICAL","itemSpacing":58.0,"primaryAxisSizingMode":"FIXED","counterAxisSizingMode":"FIXED","children":["91:391","8:2150","8:2151"]},"8:2151":{"type":"FRAME","id":"8:2151","name":"Services list","absoluteBoundingBox":{"x":-815.0,"y":1631.0,"width":322.0,"height":736.0},"isolatedAbsoluteRenderBounds":{"x":-815.0,"y":1631.0,"width":322.0,"height":763.0},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,136.0]],"size":{"x":322.0,"y":736.0},"fills":[],"strokeAlign":"INSIDE","strokes":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"layoutMode":"VERTICAL","itemSpacing":-22.0,"primaryAxisSizingMode":"FIXED","counterAxisSizingMode":"FIXED","children":["8:2152","8:2155","8:2158","8:2161","8:2164","8:2167"]},"8:2168":{"type":"TEXT","id":"8:2168","name":"Immigration Law","absoluteBoundingBox":{"x":-815.0,"y":2263.0,"width":136.0,"height":24.0},"isolatedAbsoluteRenderBounds":{"x":-813.452026367188,"y":2268.1298828125,"width":133.182189941406,"height":15.7861328125},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,20.0]],"size":{"x":136.0,"y":24.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":1.0,"g":1.0,"b":1.0,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"OUTSIDE","strokes":[],"strokeWeight":3.21430063247681,"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"characterStyleOverrides":[],"characters":"Immigration Law","lineIndentations":[0],"lineTypes":["NONE"],"listStartOffsets":[],"lineStyleOverrides":[0],"lineTextDirections":null,"resolvedParagraphValues":{"0":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":0.0}},"textAutoResize":"WIDTH_AND_HEIGHT","style":{"styleIdForText":"StyleId:4:749","fontFamily":"Geist","fontPostScriptName":"Geist-Medium","fontStyle":"Medium","textAutoResize":"WIDTH_AND_HEIGHT","fontVariantPosition":"NORMAL","fontSize":18.0,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","letterSpacing":-0.36,"letterSpacingValue":-2.0,"letterSpacingUnit":"PERCENT","lineHeightPx":24.3000011444092,"lineHeightPercent":103.846160888672,"lineHeightPercentFontSize":135.0,"lineHeightUnit":"FONT_SIZE_%","paragraphSpacing":0,"paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecoration":"NONE","textDecorationSkipInk":false,"textDecorationStyle":"solid","textTruncation":"DISABLED"},"styleOverrideTable":{}},"8:2166":{"type":"TEXT","id":"8:2166","name":"Property transactions (buying, selling, leasing) Landlord-tenant disputes Zoning and land use Construction law Real estate development","absoluteBoundingBox":{"x":-255.0,"y":2263.0,"width":420.0,"height":120.0},"isolatedAbsoluteRenderBounds":{"x":-254.496002197266,"y":2267.5,"width":359.494873046875,"height":112.199951171875},"relativeTransform":[[1.0,0.0,560.0],[0.0,1.0,20.0]],"size":{"x":420.0,"y":120.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":1.0,"g":1.0,"b":1.0,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"OUTSIDE","strokes":[],"strokeWeight":3.21430063247681,"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"characterStyleOverrides":[],"characters":"Property transactions (buying, selling, leasing)\nLandlord-tenant disputes\nZoning and land use\nConstruction law\nReal estate development","lineIndentations":[0,0,0,0,0],"lineTypes":["NONE","NONE","NONE","NONE","NONE"],"listStartOffsets":[],"lineStyleOverrides":[0,0,0,0,0],"lineTextDirections":null,"resolvedParagraphValues":{"0":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":0.0},"1":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":0.0},"2":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":0.0},"3":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":0.0},"4":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":0.0}},"textAutoResize":"HEIGHT","style":{"styleIdForText":"StyleId:6:1353","fontFamily":"Geist","fontPostScriptName":"Geist-Regular","fontStyle":"Regular","textAutoResize":"HEIGHT","responsiveTextStyleVariants":[{"minWidth":1280.0,"name":"Desktop","style":{"styleIdForText":"StyleId:6:1353","fontSize":18.0,"letterSpacing":-0.36,"letterSpacingValue":-2.0,"letterSpacingUnit":"PERCENT","lineHeightPx":24.3000011444092,"lineHeightPercent":115.199996948242,"lineHeightPercentFontSize":135.0,"lineHeightUnit":"FONT_SIZE_%"}}],"fontVariantPosition":"NORMAL","fontSize":18.0,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","letterSpacing":-0.36,"letterSpacingValue":-2.0,"letterSpacingUnit":"PERCENT","lineHeightPx":24.3000011444092,"lineHeightPercent":103.846160888672,"lineHeightPercentFontSize":135.0,"lineHeightUnit":"FONT_SIZE_%","paragraphSpacing":0,"paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecoration":"NONE","textDecorationSkipInk":false,"textDecorationStyle":"solid","textTruncation":"DISABLED"},"styleOverrideTable":{}},"8:2161":{"type":"FRAME","id":"8:2161","name":"Service 4","absoluteBoundingBox":{"x":-815.0,"y":2243.0,"width":980.0,"height":160.0},"isolatedAbsoluteRenderBounds":{"x":-815.0,"y":2243.0,"width":980.0,"height":160.0},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,612.0]],"size":{"x":980.0,"y":160.0},"fills":[],"visible":false,"strokeAlign":"INSIDE","layoutAlign":"STRETCH","strokes":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":1.0,"g":1.0,"b":1.0,"a":1.0},"visible":true,"opacity":1.0}],"individualStrokeWeights":{"top":0.5,"right":0.0,"bottom":0.0,"left":0.0},"accessibleHTMLTag":"SECTION","isDecorativeImage":false,"accessibleLabel":"Specific areas of criminal defense that we help with","ariaAttributes":{},"interactions":[],"behaviors":{"appear":{"otherLayer":{"sessionID":-1,"localID":-1},"trigger":"THIS_LAYER_IN_VIEW","direction":"UP","enterTransition":{"easingType":"OUT_CUBIC","easingFunction":[0.215000003576279,0.610000014305115,0.354999989271164,1.0],"transitionDuration":0.800000011920929,"delay":0.0},"enterState":{"transform":{"m00":1.0,"m01":0.0,"m02":0.0,"m10":0.0,"m11":1.0,"m12":0.0},"opacity":0.0},"exitTransition":{"easingType":"OUT_CUBIC","easingFunction":[0.215000003576279,0.610000014305115,0.354999989271164,1.0],"transitionDuration":0.600000023841858,"delay":0.0},"exitState":{"transform":{"m00":1.0,"m01":0.0,"m02":0.0,"m10":0.0,"m11":1.0,"m12":0.0},"opacity":1.0},"playsOnce":false,"behaviorType":"appear"}},"paddingTop":20.0,"paddingBottom":20.0,"layoutMode":"HORIZONTAL","itemSpacing":266.0,"counterAxisSizingMode":"FIXED","children":["8:2162","8:2163"]},"8:2162":{"type":"TEXT","id":"8:2162","name":"Criminal Defense","absoluteBoundingBox":{"x":-815.0,"y":2263.0,"width":139.0,"height":24.0},"isolatedAbsoluteRenderBounds":{"x":-814.2080078125,"y":2267.93188476562,"width":137.418090820312,"height":13.356201171875},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,20.0]],"size":{"x":139.0,"y":24.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":1.0,"g":1.0,"b":1.0,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"OUTSIDE","strokes":[],"strokeWeight":3.21430063247681,"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"characterStyleOverrides":[],"characters":"Criminal Defense","lineIndentations":[0],"lineTypes":["NONE"],"listStartOffsets":[],"lineStyleOverrides":[0],"lineTextDirections":null,"resolvedParagraphValues":{"0":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":0.0}},"textAutoResize":"WIDTH_AND_HEIGHT","style":{"styleIdForText":"StyleId:4:749","fontFamily":"Geist","fontPostScriptName":"Geist-Medium","fontStyle":"Medium","textAutoResize":"WIDTH_AND_HEIGHT","fontVariantPosition":"NORMAL","fontSize":18.0,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","letterSpacing":-0.36,"letterSpacingValue":-2.0,"letterSpacingUnit":"PERCENT","lineHeightPx":24.3000011444092,"lineHeightPercent":103.846160888672,"lineHeightPercentFontSize":135.0,"lineHeightUnit":"FONT_SIZE_%","paragraphSpacing":0,"paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecoration":"NONE","textDecorationSkipInk":false,"textDecorationStyle":"solid","textTruncation":"DISABLED"},"styleOverrideTable":{}},"8:2160":{"type":"TEXT","id":"8:2160","name":"현재 구파발, 광주, 청주, 창원 등 여러 지역에 센터가 운영되고 있습니다. 브레인에이블의 네트워크는 더 가까이 더 나은 삶의 공유를 위해 빠르게 확장중입니다.","absoluteBoundingBox":{"x":-815.0,"y":2242.0,"width":322.0,"height":114.0},"isolatedAbsoluteRenderBounds":{"x":-814.5,"y":2278.64990234375,"width":310.966003417969,"height":41.14013671875},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,84.0]],"size":{"x":322.0,"y":114.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":1.0,"g":1.0,"b":1.0,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"OUTSIDE","layoutAlign":"STRETCH","strokes":[],"strokeWeight":3.21430063247681,"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"characterStyleOverrides":[36,36,36,35,35,35,35,35,35,35,35,35,35,35,35,35,35,35,35,35,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37],"characters":"현재 구파발, 광주, 청주, 창원 등 여러 지역에 센터가 운영되고 있습니다. 브레인에이블의 네트워크는 더 가까이 더 나은 삶의 \n공유를 위해 빠르게 확장중입니다.","lineIndentations":[0,0],"lineTypes":["NONE","NONE"],"listStartOffsets":[],"lineStyleOverrides":[0,0],"lineTextDirections":null,"resolvedParagraphValues":{"0":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":0.0},"1":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":0.0}},"textAlignVertical":"CENTER","style":{"fontFamily":"Noto Sans KR","fontPostScriptName":"NotoSansKR-Regular","fontStyle":"Regular","fontVariantPosition":"NORMAL","fontSize":10.0,"textAlignHorizontal":"LEFT","textAlignVertical":"CENTER","letterSpacing":0.5,"letterSpacingValue":5.0,"letterSpacingUnit":"PERCENT","lineHeightPx":16.0,"lineHeightPercent":133.33332824707,"lineHeightPercentFontSize":160.0,"lineHeightUnit":"FONT_SIZE_%","paragraphSpacing":0,"paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecoration":"NONE","textDecorationSkipInk":false,"textDecorationStyle":"solid","textAutoResize":"NONE","textTruncation":"DISABLED"},"styleOverrideTable":{"37":{"letterSpacing":0.5,"letterSpacingValue":5.0,"letterSpacingUnit":"PERCENT","paragraphSpacing":0,"paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecoration":"NONE","textDecorationSkipInk":false,"textDecorationStyle":"solid","textAutoResize":"NONE","textTruncation":"DISABLED","lineHeightPercent":100,"lineHeightPercentFontSize":100},"36":{"letterSpacing":0.5,"letterSpacingValue":5.0,"letterSpacingUnit":"PERCENT","lineHeightPx":16.0,"lineHeightPercent":136.533340454102,"lineHeightPercentFontSize":160.0,"lineHeightUnit":"FONT_SIZE_%","paragraphSpacing":0,"paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecoration":"NONE","textDecorationSkipInk":false,"textDecorationStyle":"solid","textAutoResize":"NONE","textTruncation":"DISABLED"},"35":{"fontFamily":"Noto Sans KR","fontPostScriptName":"NotoSansKR-Medium","fontStyle":"Medium","letterSpacing":0.5,"letterSpacingValue":5.0,"letterSpacingUnit":"PERCENT","lineHeightPx":16.0,"lineHeightPercent":133.33332824707,"lineHeightPercentFontSize":160.0,"lineHeightUnit":"FONT_SIZE_%","paragraphSpacing":0,"paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecoration":"NONE","textDecorationSkipInk":false,"textDecorationStyle":"solid","textAutoResize":"NONE","textTruncation":"DISABLED"}}},"8:2155":{"type":"FRAME","id":"8:2155","name":"Service 2","absoluteBoundingBox":{"x":-815.0,"y":1854.0,"width":322.0,"height":326.0},"isolatedAbsoluteRenderBounds":{"x":-815.0,"y":1854.0,"width":322.0,"height":326.0},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,223.0]],"size":{"x":322.0,"y":326.0},"fills":[],"strokeAlign":"INSIDE","strokes":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":1.0,"g":1.0,"b":1.0,"a":1.0},"visible":true,"opacity":1.0}],"individualStrokeWeights":{"top":0.5,"right":0.0,"bottom":0.0,"left":0.0},"accessibleHTMLTag":"SECTION","isDecorativeImage":false,"accessibleLabel":"Specific areas of litigation and dispute resolution that we help with","ariaAttributes":{},"interactions":[],"behaviors":{"appear":{"otherLayer":{"sessionID":-1,"localID":-1},"trigger":"THIS_LAYER_IN_VIEW","direction":"UP","enterTransition":{"easingType":"OUT_CUBIC","easingFunction":[0.215000003576279,0.610000014305115,0.354999989271164,1.0],"transitionDuration":0.800000011920929,"delay":0.0},"enterState":{"transform":{"m00":1.0,"m01":0.0,"m02":0.0,"m10":0.0,"m11":1.0,"m12":0.0},"opacity":0.0},"exitTransition":{"easingType":"OUT_CUBIC","easingFunction":[0.215000003576279,0.610000014305115,0.354999989271164,1.0],"transitionDuration":0.600000023841858,"delay":0.0},"exitState":{"transform":{"m00":1.0,"m01":0.0,"m02":0.0,"m10":0.0,"m11":1.0,"m12":0.0},"opacity":1.0},"playsOnce":false,"behaviorType":"appear"}},"paddingBottom":15.0,"layoutMode":"VERTICAL","itemSpacing":40.0,"primaryAxisAlignItems":"CENTER","primaryAxisSizingMode":"FIXED","counterAxisSizingMode":"FIXED","children":["8:2156","8:2157"]},"8:2156":{"type":"TEXT","id":"8:2156","name":"전문적인 의료 연계 시스템","absoluteBoundingBox":{"x":-815.0,"y":1933.5,"width":118.0,"height":16.0},"isolatedAbsoluteRenderBounds":{"x":-814.622009277344,"y":1936.69055175781,"width":114.795532226562,"height":9.75439453125},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,79.5]],"size":{"x":118.0,"y":16.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":1.0,"g":1.0,"b":1.0,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"OUTSIDE","strokes":[],"strokeWeight":3.21430063247681,"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"characterStyleOverrides":[],"characters":"전문적인 의료 연계 시스템","lineIndentations":[0],"lineTypes":["NONE"],"listStartOffsets":[],"lineStyleOverrides":[0],"lineTextDirections":null,"resolvedParagraphValues":{"0":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":0.0}},"textAutoResize":"HEIGHT","style":{"fontFamily":"Noto Sans KR","fontPostScriptName":"NotoSansKR-Bold","fontStyle":"Bold","textAutoResize":"HEIGHT","fontVariantPosition":"NORMAL","fontSize":10.5,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","letterSpacing":0.21,"letterSpacingValue":2.0,"letterSpacingUnit":"PERCENT","lineHeightPx":15.75,"lineHeightPercent":124.999992370605,"lineHeightPercentFontSize":150.0,"lineHeightUnit":"FONT_SIZE_%","paragraphSpacing":0,"paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecoration":"NONE","textDecorationSkipInk":false,"textDecorationStyle":"solid","textTruncation":"DISABLED"},"styleOverrideTable":{}},"8:2154":{"type":"TEXT","id":"8:2154","name":"브레인에이블은 지속적이고 체계적인 연구를 통해 기술의 한계를 뛰어넘으며, 새로운 도구를 개발하고 있습니다. 우리의 노력은 뇌 건강 분야에서의 획기적인 발전을 이루어내고 있으며, 더 나은 옵션을 제공하기 위해 꾸준히 진보하고 있습니다.","absoluteBoundingBox":{"x":-815.0,"y":1693.0,"width":320.0,"height":64.0},"isolatedAbsoluteRenderBounds":{"x":-814.559997558594,"y":1696.72998046875,"width":312.337951660156,"height":57.06005859375},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,62.0]],"size":{"x":320.0,"y":64.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":1.0,"g":1.0,"b":1.0,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"OUTSIDE","layoutAlign":"STRETCH","strokes":[],"strokeWeight":3.21430063247681,"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"characterStyleOverrides":[],"characters":"브레인에이블은 지속적이고 체계적인 연구를 통해 기술의 한계를 \n뛰어넘으며, 새로운 도구를 개발하고 있습니다. \n우리의 노력은 뇌 건강 분야에서의 획기적인 발전을 이루어내고 있으며, \n더 나은 옵션을 제공하기 위해 꾸준히 진보하고 있습니다.","lineIndentations":[0,0,0,0],"lineTypes":["NONE","NONE","NONE","NONE"],"listStartOffsets":[],"lineStyleOverrides":[0,0,0,0],"lineTextDirections":null,"resolvedParagraphValues":{"0":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":0.0},"1":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":0.0},"2":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":0.0},"3":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":0.0}},"textAutoResize":"HEIGHT","style":{"fontFamily":"Noto Sans KR","fontPostScriptName":"NotoSansKR-Regular","fontStyle":"Regular","textAutoResize":"HEIGHT","fontVariantPosition":"NORMAL","fontSize":10.0,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","letterSpacing":0.7,"letterSpacingValue":7.0,"letterSpacingUnit":"PERCENT","lineHeightPx":16.0,"lineHeightPercent":133.33332824707,"lineHeightPercentFontSize":160.0,"lineHeightUnit":"FONT_SIZE_%","paragraphSpacing":0,"paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecoration":"NONE","textDecorationSkipInk":false,"textDecorationStyle":"solid","textTruncation":"DISABLED"},"styleOverrideTable":{}},"6:1529":{"type":"WEBPAGE","id":"6:1529","name":"/about_us","absoluteBoundingBox":{"x":-2243.0,"y":-259.0,"width":1847.0,"height":5063.0},"isolatedAbsoluteRenderBounds":{"x":-2243.0,"y":-259.0,"width":1847.0,"height":5063.0},"relativeTransform":[[1.0,0.0,-2243.0],[0.0,1.0,-259.0]],"size":{"x":1847.0,"y":5063.0},"fills":[{"opacity":0.0470588244497776,"blendMode":"NORMAL","type":"SOLID","color":{"r":1.0,"g":1.0,"b":1.0,"a":1.0},"visible":true}],"strokeAlign":"INSIDE","strokes":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"children":["6:1530","6:1531","6:1532"]},"2224:2967":{"type":"TEXT","id":"2224:2967","name":"Brainable Co., LTD. © 2025 All Rights Reserved","absoluteBoundingBox":{"x":-803.0,"y":3222.0,"width":197.0,"height":26.0},"isolatedAbsoluteRenderBounds":{"x":-802.486999511719,"y":3224.85400390625,"width":125.53759765625,"height":22.458984375},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,0.0]],"size":{"x":197.0,"y":26.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":0.0,"g":0.0,"b":0.0,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"OUTSIDE","strokes":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"characterStyleOverrides":[],"characters":"Brainable Co., LTD.\n© 2025 All Rights Reserved","lineIndentations":[0,0],"lineTypes":["NONE","NONE"],"listStartOffsets":[],"lineStyleOverrides":[0,0],"lineTextDirections":null,"resolvedParagraphValues":{"0":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":0.0},"1":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":0.0}},"textAutoResize":"HEIGHT","style":{"fontFamily":"Noto Sans KR","fontPostScriptName":"NotoSansKR-Thin","fontStyle":"Thin","textAutoResize":"HEIGHT","fontVariantPosition":"NORMAL","fontSize":9.0,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","letterSpacing":0.9,"letterSpacingValue":10.0,"letterSpacingUnit":"PERCENT","lineHeightPx":12.5999994277954,"lineHeightPercent":116.666664123535,"lineHeightPercentFontSize":140.0,"lineHeightUnit":"FONT_SIZE_%","paragraphSpacing":0,"paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecoration":"NONE","textDecorationSkipInk":false,"textDecorationStyle":"solid","textTruncation":"DISABLED"},"styleOverrideTable":{}},"8:2153":{"type":"TEXT","id":"8:2153","name":"독자적인 연구개발","absoluteBoundingBox":{"x":-815.0,"y":1631.0,"width":320.0,"height":14.0},"isolatedAbsoluteRenderBounds":{"x":-814.569519042969,"y":1633.20104980469,"width":83.1181640625,"height":9.75439453125},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,0.0]],"size":{"x":320.0,"y":14.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":1.0,"g":1.0,"b":1.0,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"OUTSIDE","layoutAlign":"STRETCH","strokes":[],"strokeWeight":3.21430063247681,"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"characterStyleOverrides":[],"characters":"독자적인 연구개발","lineIndentations":[0],"lineTypes":["NONE"],"listStartOffsets":[],"lineStyleOverrides":[0],"lineTextDirections":null,"resolvedParagraphValues":{"0":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":0.0}},"textAutoResize":"HEIGHT","style":{"fontFamily":"Noto Sans KR","fontPostScriptName":"NotoSansKR-Bold","fontStyle":"Bold","textAutoResize":"HEIGHT","fontVariantPosition":"NORMAL","fontSize":10.5,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","letterSpacing":0.525,"letterSpacingValue":5.0,"letterSpacingUnit":"PERCENT","lineHeightPx":14.1750001907349,"lineHeightPercent":112.499992370605,"lineHeightPercentFontSize":135.0,"lineHeightUnit":"FONT_SIZE_%","paragraphSpacing":0,"paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecoration":"NONE","textDecorationSkipInk":false,"textDecorationStyle":"solid","textTruncation":"DISABLED"},"styleOverrideTable":{}},"91:391":{"type":"TEXT","id":"91:391","name":"Navigating Complex Legal Landscapes?  We Can Help.","absoluteBoundingBox":{"x":-815.0,"y":1495.0,"width":672.0,"height":48.0},"isolatedAbsoluteRenderBounds":{"x":-815.0,"y":1495.0,"width":672.0,"height":48.0},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,0.0]],"size":{"x":672.0,"y":48.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":1.0,"g":1.0,"b":1.0,"a":1.0},"visible":true,"opacity":1.0}],"visible":false,"strokeAlign":"OUTSIDE","layoutAlign":"STRETCH","strokes":[],"strokeWeight":3.21430063247681,"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"characterStyleOverrides":[],"characters":"Navigating Complex Legal Landscapes?  We Can Help.","lineIndentations":[0],"lineTypes":["NONE"],"listStartOffsets":[],"lineStyleOverrides":[0],"lineTextDirections":null,"resolvedParagraphValues":{"0":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":0.0}},"textAutoResize":"HEIGHT","style":{"styleIdForText":"StyleId:4:748","fontFamily":"Geist","fontPostScriptName":"Geist-Regular","fontStyle":"Regular","textAutoResize":"HEIGHT","responsiveTextStyleVariants":[{"minWidth":1280.0,"name":"Desktop","style":{"styleIdForText":"StyleId:4:748","fontSize":32.0,"letterSpacing":-1.6,"letterSpacingValue":-5.0,"letterSpacingUnit":"PERCENT","lineHeightPx":34.8800010681152,"lineHeightPercent":93.0133361816406,"lineHeightPercentFontSize":109.0,"lineHeightUnit":"FONT_SIZE_%"}},{"minWidth":800.0,"name":"Tablet","style":{"styleIdForText":"StyleId:4:748","fontSize":32.0,"letterSpacing":-1.6,"letterSpacingValue":-5.0,"letterSpacingUnit":"PERCENT","lineHeightPx":34.8800010681152,"lineHeightPercent":93.0133361816406,"lineHeightPercentFontSize":109.0,"lineHeightUnit":"FONT_SIZE_%"}},{"minWidth":1.0,"name":"Mobile","style":{"styleIdForText":"StyleId:4:748","fontSize":22.0,"letterSpacing":-1.1,"letterSpacingValue":-5.0,"letterSpacingUnit":"PERCENT","lineHeightPx":23.980001449585,"lineHeightPercent":93.0133361816406,"lineHeightPercentFontSize":109.0,"lineHeightUnit":"FONT_SIZE_%"}}],"fontVariantPosition":"NORMAL","fontSize":22.0,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","letterSpacing":-1.1,"letterSpacingValue":-5.0,"letterSpacingUnit":"PERCENT","lineHeightPx":23.980001449585,"lineHeightPercent":83.8461532592773,"lineHeightPercentFontSize":109.0,"lineHeightUnit":"FONT_SIZE_%","paragraphSpacing":0,"paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecoration":"NONE","textDecorationSkipInk":false,"textDecorationStyle":"solid","textTruncation":"DISABLED"},"styleOverrideTable":{}},"8:1957":{"type":"TEXT","id":"8:1957","name":"50 +","absoluteBoundingBox":{"x":-588.0,"y":890.0,"width":107.0,"height":122.0},"isolatedAbsoluteRenderBounds":{"x":-586.335998535156,"y":897.744018554688,"width":74.22998046875,"height":102.216003417969},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,0.0]],"size":{"x":107.0,"y":122.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":1.0,"g":1.0,"b":1.0,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"OUTSIDE","layoutAlign":"STRETCH","strokes":[],"strokeWeight":3.21430063247681,"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"characterStyleOverrides":[],"characters":"50\n+","lineIndentations":[0,0],"lineTypes":["NONE","NONE"],"listStartOffsets":[],"lineStyleOverrides":[0,0],"lineTextDirections":null,"resolvedParagraphValues":{"0":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":0.0},"1":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":0.0}},"textAutoResize":"HEIGHT","style":{"fontFamily":"Noto Sans KR","fontPostScriptName":"NotoSansKR-Bold","fontStyle":"Bold","textAutoResize":"HEIGHT","fontVariantPosition":"NORMAL","fontSize":64.0,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","letterSpacing":3.2,"letterSpacingValue":5.0,"letterSpacingUnit":"PERCENT","lineHeightPx":60.7999992370605,"lineHeightPercent":79.1666641235352,"lineHeightPercentFontSize":95.0,"lineHeightUnit":"FONT_SIZE_%","paragraphSpacing":0,"paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecoration":"NONE","textDecorationSkipInk":false,"textDecorationStyle":"solid","textTruncation":"DISABLED"},"styleOverrideTable":{}},"8:1950":{"type":"FRAME","id":"8:1950","name":"Stat 1","absoluteBoundingBox":{"x":-804.0,"y":890.0,"width":111.0,"height":178.0},"isolatedAbsoluteRenderBounds":{"x":-804.0,"y":890.0,"width":111.0,"height":194.912963867188},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,0.0]],"size":{"x":111.0,"y":178.0},"fills":[],"strokeAlign":"INSIDE","strokes":[],"accessibleHTMLTag":"SECTION","isDecorativeImage":false,"accessibleLabel":"Statistic 1 about Jones and Brown","ariaAttributes":{},"interactions":[],"behaviors":{"appear":{"otherLayer":{"sessionID":-1,"localID":-1},"trigger":"THIS_LAYER_IN_VIEW","direction":"UP","enterTransition":{"easingType":"OUT_CUBIC","easingFunction":[0.215000003576279,0.610000014305115,0.354999989271164,1.0],"transitionDuration":0.800000011920929,"delay":0.0500000007450581},"enterState":{"transform":{"m00":1.0,"m01":0.0,"m02":0.0,"m10":0.0,"m11":1.0,"m12":0.0},"opacity":0.0},"exitTransition":{"easingType":"OUT_CUBIC","easingFunction":[0.215000003576279,0.610000014305115,0.354999989271164,1.0],"transitionDuration":0.600000023841858,"delay":0.0},"exitState":{"transform":{"m00":1.0,"m01":0.0,"m02":0.0,"m10":0.0,"m11":1.0,"m12":0.0},"opacity":1.0},"playsOnce":false,"behaviorType":"appear"}},"layoutMode":"VERTICAL","primaryAxisSizingMode":"FIXED","counterAxisSizingMode":"FIXED","children":["8:1951","8:1952"]},"8:1951":{"type":"TEXT","id":"8:1951","name":"20 +","absoluteBoundingBox":{"x":-804.0,"y":890.0,"width":111.0,"height":112.0},"isolatedAbsoluteRenderBounds":{"x":-801.567993164062,"y":900.0,"width":70.739990234375,"height":104.768005371094},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,0.0]],"size":{"x":111.0,"y":112.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":1.0,"g":1.0,"b":1.0,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"OUTSIDE","strokes":[],"strokeWeight":3.21430063247681,"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"characterStyleOverrides":[],"characters":"20\n+","lineIndentations":[0,0],"lineTypes":["NONE","NONE"],"listStartOffsets":[],"lineStyleOverrides":[0,0],"lineTextDirections":null,"resolvedParagraphValues":{"0":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":0.0},"1":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":0.0}},"style":{"fontFamily":"Noto Sans KR","fontPostScriptName":"NotoSansKR-Medium","fontStyle":"Medium","fontVariantPosition":"NORMAL","fontSize":64.0,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","letterSpacing":3.2,"letterSpacingValue":5.0,"letterSpacingUnit":"PERCENT","lineHeightPx":64.0,"lineHeightPercent":83.3333282470703,"lineHeightPercentFontSize":100.0,"lineHeightUnit":"FONT_SIZE_%","paragraphSpacing":0,"paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecoration":"NONE","textDecorationSkipInk":false,"textDecorationStyle":"solid","textAutoResize":"NONE","textTruncation":"DISABLED"},"styleOverrideTable":{}},"7:1796":{"type":"FRAME","id":"7:1796","name":"Header section","absoluteBoundingBox":{"x":-835.0,"y":291.0,"width":375.0,"height":531.0},"isolatedAbsoluteRenderBounds":{"x":-835.0,"y":291.0,"width":375.0,"height":531.0},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,450.0]],"size":{"x":375.0,"y":531.0},"fills":[{"blendMode":"NORMAL","type":"IMAGE","scaleMode":"FILL","imageRef":"b148c3ce7c808daad98db6f016d6f8fe9e8687ef","originalImageWidth":4096,"originalImageHeight":2731,"visible":true,"opacity":1.0,"rotation":0.0},{"opacity":0.400000005960464,"blendMode":"NORMAL","type":"SOLID","color":{"r":0.0,"g":0.0,"b":0.0,"a":1.0},"visible":true}],"strokeAlign":"INSIDE","layoutAlign":"STRETCH","strokes":[],"accessibleHTMLTag":"HEADER","isDecorativeImage":false,"accessibleLabel":"Close-up photo of a bookshelf with old books.","ariaAttributes":{},"interactions":[],"paddingTop":94.0,"paddingRight":19.0,"paddingLeft":25.0,"layoutMode":"VERTICAL","itemSpacing":13.0,"primaryAxisAlignItems":"CENTER","primaryAxisSizingMode":"FIXED","counterAxisSizingMode":"FIXED","children":["7:1797"]},"2108:1137":{"type":"TEXT","id":"2108:1137","name":"우리는 모든 사람이 자신의 뇌를 최대한 활용할 수 있는 세상을 만들어갑니다. 브레인에이블은 단순한 뇌기능 개선을 넘어, 건강한 뇌를 기반으로 행복한 삶을 실현하는 것을 목표로 합니다. 유아부터 성인 그리고 노인에 이르기까지 각 생애주기에 따른 맞춤형 두뇌 기능 향상 솔루션을 제공하여 더 나은 삶으로 안내합니다.","absoluteBoundingBox":{"x":-810.0,"y":475.0,"width":326.0,"height":219.0},"isolatedAbsoluteRenderBounds":{"x":-809.460021972656,"y":480.713989257812,"width":321.939910888672,"height":150.3525390625},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,73.0]],"size":{"x":326.0,"y":219.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":1.0,"g":1.0,"b":1.0,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"OUTSIDE","strokes":[],"strokeWeight":3.21430063247681,"accessibleHTMLTag":"H1","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"behaviors":{"appear":{"otherLayer":{"sessionID":7,"localID":1796},"trigger":"OTHER_LAYER_IN_VIEW","direction":"UP","enterTransition":{"easingType":"OUT_CUBIC","easingFunction":[0.215000003576279,0.610000014305115,0.354999989271164,1.0],"transitionDuration":0.800000011920929,"delay":0.0},"enterState":{"transform":{"m00":1.0,"m01":0.0,"m02":0.0,"m10":0.0,"m11":1.0,"m12":0.0},"opacity":0.0},"exitTransition":{"easingType":"OUT_CUBIC","easingFunction":[0.215000003576279,0.610000014305115,0.354999989271164,1.0],"transitionDuration":0.600000023841858,"delay":0.0},"exitState":{"transform":{"m00":1.0,"m01":0.0,"m02":0.0,"m10":0.0,"m11":1.0,"m12":0.0},"opacity":1.0},"playsOnce":false,"behaviorType":"appear"}},"characterStyleOverrides":[],"characters":"우리는 모든 사람이 자신의 뇌를 최대한 활용할 수 있는 세상을 만들어갑니다.\n브레인에이블은 단순한 뇌기능 개선을 넘어, 건강한 뇌를 기반으로 행복한 삶을 실현하는 것을 목표로 합니다. \n유아부터 성인 그리고 노인에 이르기까지 각 생애주기에 따른 맞춤형 두뇌 기능 향상 솔루션을 제공하여 더 나은 삶으로 안내합니다.","lineIndentations":[0,0,0],"lineTypes":["NONE","NONE","NONE"],"listStartOffsets":[],"lineStyleOverrides":[0,0,0],"lineTextDirections":null,"resolvedParagraphValues":{"0":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":0.0},"1":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":0.0},"2":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":0.0}},"style":{"fontFamily":"Noto Sans KR","fontPostScriptName":"NotoSansKR-Regular","fontStyle":"Regular","fontVariantPosition":"NORMAL","fontSize":13.5,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","letterSpacing":0.54,"letterSpacingValue":4.0,"letterSpacingUnit":"PERCENT","lineHeightPx":22.5450000762939,"lineHeightPercent":139.166656494141,"lineHeightPercentFontSize":167.0,"lineHeightUnit":"FONT_SIZE_%","paragraphSpacing":0,"paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecoration":"NONE","textDecorationSkipInk":false,"textDecorationStyle":"solid","textAutoResize":"NONE","textTruncation":"DISABLED"},"styleOverrideTable":{}},"2108:1140":{"type":"TEXT","id":"2108:1140","name":"VISION","absoluteBoundingBox":{"x":-810.0,"y":402.0,"width":130.0,"height":31.0},"isolatedAbsoluteRenderBounds":{"x":-810.164978027344,"y":406.118011474609,"width":126.550048828125,"height":25.343994140625},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,0.0]],"size":{"x":130.0,"y":31.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":1.0,"g":1.0,"b":1.0,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"OUTSIDE","strokes":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"behaviors":{"appear":{"otherLayer":{"sessionID":-1,"localID":-1},"trigger":"PAGE_LOAD","direction":"UP","enterTransition":{"easingType":"OUT_CUBIC","easingFunction":[0.215000003576279,0.610000014305115,0.354999989271164,1.0],"transitionDuration":0.600000023841858,"delay":0.0},"enterState":{"transform":{"m00":1.0,"m01":0.0,"m02":0.0,"m10":0.0,"m11":1.0,"m12":0.0},"opacity":0.0},"exitTransition":{"easingType":"OUT_CUBIC","easingFunction":[0.215000003576279,0.610000014305115,0.354999989271164,1.0],"transitionDuration":0.600000023841858,"delay":0.0},"exitState":{"transform":{"m00":1.0,"m01":0.0,"m02":0.0,"m10":0.0,"m11":1.0,"m12":0.0},"opacity":1.0},"playsOnce":false,"behaviorType":"appear"}},"characterStyleOverrides":[20,20,20,20,18,20],"characters":"VISION","lineIndentations":[0],"lineTypes":["NONE"],"listStartOffsets":[],"lineStyleOverrides":[0],"lineTextDirections":null,"resolvedParagraphValues":{"0":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":0.0}},"textAutoResize":"WIDTH_AND_HEIGHT","textAlignVertical":"CENTER","style":{"fontFamily":"Noto Sans KR","fontPostScriptName":"NotoSansKR-Medium","fontStyle":"Medium","textAutoResize":"WIDTH_AND_HEIGHT","fontVariantPosition":"NORMAL","fontSize":33.0,"textAlignHorizontal":"LEFT","textAlignVertical":"CENTER","letterSpacing":3.3,"letterSpacingValue":10.0,"letterSpacingUnit":"PERCENT","lineHeightPx":31.3500003814697,"lineHeightPercent":79.1666641235352,"lineHeightPercentFontSize":95.0,"lineHeightUnit":"FONT_SIZE_%","paragraphSpacing":0,"paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecoration":"NONE","textDecorationSkipInk":false,"textDecorationStyle":"solid","textTruncation":"DISABLED"},"styleOverrideTable":{"20":{"fontFamily":"Noto Sans KR","fontPostScriptName":"NotoSansKR-Bold","fontStyle":"Bold","letterSpacing":3.3,"letterSpacingValue":10.0,"letterSpacingUnit":"PERCENT","paragraphSpacing":0,"paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecoration":"NONE","textDecorationSkipInk":false,"textDecorationStyle":"solid","textAutoResize":"NONE","textTruncation":"DISABLED","lineHeightPercent":100,"lineHeightPercentFontSize":100},"18":{"fontFamily":"Noto Sans KR","fontPostScriptName":"NotoSansKR-Bold","fontStyle":"Bold","fontSize":33.0,"letterSpacing":3.3,"letterSpacingValue":10.0,"letterSpacingUnit":"PERCENT","paragraphSpacing":0,"paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecoration":"NONE","textDecorationSkipInk":false,"textDecorationStyle":"solid","textAutoResize":"NONE","textTruncation":"DISABLED","lineHeightPercent":100,"lineHeightPercentFontSize":100}}},"7:1797":{"type":"FRAME","id":"7:1797","name":"Header content","absoluteBoundingBox":{"x":-810.0,"y":402.0,"width":331.0,"height":403.0},"isolatedAbsoluteRenderBounds":{"x":-810.164978027344,"y":402.0,"width":331.164978027344,"height":403.0},"relativeTransform":[[1.0,0.0,25.0],[0.0,1.0,111.0]],"size":{"x":331.0,"y":403.0},"fills":[],"strokeAlign":"INSIDE","layoutAlign":"STRETCH","strokes":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"layoutMode":"VERTICAL","itemSpacing":42.0,"primaryAxisSizingMode":"FIXED","counterAxisSizingMode":"FIXED","children":["2108:1140","2108:1137"]},"2715:1068":{"type":"FRAME","id":"2715:1068","name":"Frame 2","absoluteBoundingBox":{"x":-830.0,"y":-159.0,"width":365.0,"height":450.0},"isolatedAbsoluteRenderBounds":{"x":-830.0,"y":-159.0,"width":365.0,"height":450.0},"relativeTransform":[[1.0,0.0,5.0],[0.0,1.0,0.0]],"size":{"x":365.0,"y":450.0},"fills":[],"strokeAlign":"INSIDE","maxWidth":375.0,"strokes":[],"accessibleHTMLTag":"HEADER","isDecorativeImage":false,"ariaAttributes":{},"interactions":[{"id":{"sessionID":2608,"localID":1765},"event":{"interactionType":"ON_CLICK"},"actions":[{"transitionNodeID":{"sessionID":0,"localID":3},"connectionType":"INTERNAL_NODE","navigationType":"NAVIGATE","connectionURL":"/"}],"isDeleted":false,"stateManagementVersion":1}],"paddingTop":24.0,"paddingRight":44.0,"paddingBottom":24.0,"paddingLeft":44.0,"layoutMode":"VERTICAL","itemSpacing":40.0,"counterAxisAlignItems":"CENTER","primaryAxisSizingMode":"FIXED","children":["2715:1069"]},"2715:1076":{"type":"TEXT","id":"2715:1076","name":"오시는길","absoluteBoundingBox":{"x":-683.0,"y":200.0,"width":71.0,"height":23.0},"isolatedAbsoluteRenderBounds":{"x":-682.697509765625,"y":204.688003540039,"width":70.396240234375,"height":16.5119934082031},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,220.0]],"size":{"x":71.0,"y":23.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":0.443900465965271,"g":0.442026853561401,"b":0.442026853561401,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"OUTSIDE","strokes":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"characterStyleOverrides":[2,2,2,2],"characters":"센터소개","lineIndentations":[0],"lineTypes":["NONE"],"listStartOffsets":[],"lineStyleOverrides":[0],"lineTextDirections":null,"resolvedParagraphValues":{"0":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":16.0}},"textAutoResize":"WIDTH_AND_HEIGHT","textAlignHorizontal":"CENTER","textAlignVertical":"CENTER","paragraphSpacing":16.0,"style":{"styleIdForText":"StyleId:2608:2916","fontFamily":"Noto Sans KR","fontPostScriptName":"NotoSansKR-Medium","fontStyle":"Medium","paragraphSpacing":16.0,"textAutoResize":"WIDTH_AND_HEIGHT","fontVariantPosition":"NORMAL","textDecoration":"UNDERLINE","textDecorationSkipInk":true,"fontSize":16.0,"textAlignHorizontal":"CENTER","textAlignVertical":"CENTER","letterSpacing":3.84,"letterSpacingValue":24.0,"letterSpacingUnit":"PERCENT","lineHeightPx":23.2000007629395,"lineHeightPercent":120.83332824707,"lineHeightPercentFontSize":145.0,"lineHeightUnit":"FONT_SIZE_%","paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecorationStyle":"solid","textTruncation":"DISABLED"},"styleOverrideTable":{"2":{"styleIdForText":"StyleId:2608:2916","fontFamily":"Noto Sans KR","fontPostScriptName":"NotoSansKR-Medium","fontStyle":"Medium","hyperlink":{"type":"NODE","nodeID":"/센터소개"},"paragraphSpacing":16.0,"textAutoResize":"WIDTH_AND_HEIGHT","fontVariantPosition":"NORMAL","textDecoration":"UNDERLINE","textDecorationSkipInk":true,"isOverrideOverTextStyle":true,"fontSize":16.0,"letterSpacing":3.84,"letterSpacingValue":24.0,"letterSpacingUnit":"PERCENT","lineHeightPx":23.2000007629395,"lineHeightPercent":120.83332824707,"lineHeightPercentFontSize":145.0,"lineHeightUnit":"FONT_SIZE_%","inheritTextStyleId":"2608:2916","paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecorationStyle":"solid","textTruncation":"DISABLED"}}},"2133:3203":{"type":"TEXT","id":"2133:3203","name":"브레인에이블은 지금도 혁신하고 발전중입니다.","absoluteBoundingBox":{"x":-789.0,"y":1042.0,"width":283.0,"height":219.0},"isolatedAbsoluteRenderBounds":{"x":-722.579772949219,"y":1135.35205078125,"width":149.839599609375,"height":33.823974609375},"relativeTransform":[[1.0,0.0,46.0],[0.0,1.0,220.0]],"size":{"x":283.0,"y":219.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":1.0,"g":1.0,"b":1.0,"a":1.0},"visible":true,"opacity":1.0}],"constraints":{"vertical":"CENTER","horizontal":"CENTER"},"constraintValues":{"left":{"pixelOffset":-141.5,"sizeFraction":0.5},"right":{"pixelOffset":141.5,"sizeFraction":0.5},"top":{"pixelOffset":-44.0,"sizeFraction":0.5},"bottom":{"pixelOffset":175.0,"sizeFraction":0.5}},"strokeAlign":"OUTSIDE","layoutPositioning":"ABSOLUTE","strokes":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"characterStyleOverrides":[],"characters":"브레인에이블은 지금도 \n혁신하고 발전중입니다.","lineIndentations":[0,0],"lineTypes":["NONE","NONE"],"listStartOffsets":[],"lineStyleOverrides":[0,0],"lineTextDirections":null,"resolvedParagraphValues":{"0":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":0.0},"1":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":0.0}},"textAlignHorizontal":"CENTER","textAlignVertical":"CENTER","style":{"fontFamily":"Noto Sans KR","fontPostScriptName":"NotoSansKR-Medium","fontStyle":"Medium","fontVariantPosition":"NORMAL","fontSize":14.0,"textAlignHorizontal":"CENTER","textAlignVertical":"CENTER","letterSpacing":1.4,"letterSpacingValue":10.0,"letterSpacingUnit":"PERCENT","lineHeightPx":21.0,"lineHeightPercent":124.999992370605,"lineHeightPercentFontSize":150.0,"lineHeightUnit":"FONT_SIZE_%","paragraphSpacing":0,"paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecoration":"NONE","textDecorationSkipInk":false,"textDecorationStyle":"solid","textAutoResize":"NONE","textTruncation":"DISABLED"},"styleOverrideTable":{}},"2715:1074":{"type":"TEXT","id":"2715:1074","name":"제품소개","absoluteBoundingBox":{"x":-683.0,"y":90.0,"width":71.0,"height":23.0},"isolatedAbsoluteRenderBounds":{"x":-682.697509765625,"y":94.6879959106445,"width":70.396240234375,"height":16.5120010375977},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,110.0]],"size":{"x":71.0,"y":23.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":0.443900465965271,"g":0.442026853561401,"b":0.442026853561401,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"OUTSIDE","strokes":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"characterStyleOverrides":[],"characters":"제품소개","lineIndentations":[0],"lineTypes":["NONE"],"listStartOffsets":[],"lineStyleOverrides":[0],"lineTextDirections":null,"resolvedParagraphValues":{"0":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":16.0}},"textAutoResize":"WIDTH_AND_HEIGHT","textAlignHorizontal":"CENTER","textAlignVertical":"CENTER","paragraphSpacing":16.0,"style":{"styleIdForText":"StyleId:2608:2916","fontFamily":"Noto Sans KR","fontPostScriptName":"NotoSansKR-Medium","fontStyle":"Medium","hyperlink":{"type":"NODE","nodeID":"/laserable"},"paragraphSpacing":16.0,"textAutoResize":"WIDTH_AND_HEIGHT","fontVariantPosition":"NORMAL","textDecoration":"UNDERLINE","textDecorationSkipInk":true,"fontSize":16.0,"textAlignHorizontal":"CENTER","textAlignVertical":"CENTER","letterSpacing":3.84,"letterSpacingValue":24.0,"letterSpacingUnit":"PERCENT","lineHeightPx":23.2000007629395,"lineHeightPercent":120.83332824707,"lineHeightPercentFontSize":145.0,"lineHeightUnit":"FONT_SIZE_%","paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecorationStyle":"solid","textTruncation":"DISABLED"},"styleOverrideTable":{}},"2715:1072":{"type":"TEXT","id":"2715:1072","name":"회사소개","absoluteBoundingBox":{"x":-677.0,"y":-20.0,"width":59.0,"height":23.0},"isolatedAbsoluteRenderBounds":{"x":-676.658447265625,"y":-14.0000009536743,"width":58.3231201171875,"height":15.2000017166138},"relativeTransform":[[1.0,0.0,6.0],[0.0,1.0,0.0]],"size":{"x":59.0,"y":23.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":0.443900465965271,"g":0.442026853561401,"b":0.442026853561401,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"OUTSIDE","strokes":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"characterStyleOverrides":[],"characters":"HOME","lineIndentations":[0],"lineTypes":["NONE"],"listStartOffsets":[],"lineStyleOverrides":[0],"lineTextDirections":null,"resolvedParagraphValues":{"0":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":16.0}},"textAutoResize":"WIDTH_AND_HEIGHT","textAlignHorizontal":"CENTER","textAlignVertical":"CENTER","paragraphSpacing":16.0,"style":{"styleIdForText":"StyleId:2608:2916","fontFamily":"Noto Sans KR","fontPostScriptName":"NotoSansKR-Medium","fontStyle":"Medium","hyperlink":{"type":"NODE","nodeID":"/"},"paragraphSpacing":16.0,"textAutoResize":"WIDTH_AND_HEIGHT","fontVariantPosition":"NORMAL","textDecoration":"UNDERLINE","textDecorationSkipInk":true,"fontSize":16.0,"textAlignHorizontal":"CENTER","textAlignVertical":"CENTER","letterSpacing":3.84,"letterSpacingValue":24.0,"letterSpacingUnit":"PERCENT","lineHeightPx":23.2000007629395,"lineHeightPercent":120.83332824707,"lineHeightPercentFontSize":145.0,"lineHeightUnit":"FONT_SIZE_%","paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecorationStyle":"solid","textTruncation":"DISABLED"},"styleOverrideTable":{}},"2715:1060":{"type":"FRAME","id":"2715:1060","name":"Header 1","absoluteBoundingBox":{"x":-835.0,"y":-159.0,"width":375.0,"height":123.0},"isolatedAbsoluteRenderBounds":{"x":-835.0,"y":-159.0,"width":375.0,"height":123.0},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,0.0]],"size":{"x":375.0,"y":123.0},"fills":[],"visible":false,"strokeAlign":"INSIDE","layoutAlign":"STRETCH","strokes":[],"accessibleHTMLTag":"HEADER","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"paddingTop":24.0,"paddingRight":64.0,"paddingBottom":24.0,"paddingLeft":64.0,"layoutMode":"HORIZONTAL","itemSpacing":16.0,"counterAxisAlignItems":"CENTER","primaryAxisAlignItems":"SPACE_BETWEEN","primaryAxisSizingMode":"FIXED","children":["2715:1061","2715:1062"]},"2715:1062":{"type":"FRAME","id":"2715:1062","name":"Nav","absoluteBoundingBox":{"x":-560.0,"y":-109.0,"width":412.0,"height":23.0},"isolatedAbsoluteRenderBounds":{"x":-560.0,"y":-109.0,"width":412.0,"height":23.0},"relativeTransform":[[1.0,0.0,275.0],[0.0,1.0,50.0]],"size":{"x":412.0,"y":23.0},"fills":[],"strokeAlign":"INSIDE","strokes":[],"accessibleHTMLTag":"NAV","isDecorativeImage":false,"ariaAttributes":{},"interactions":[{"id":{"sessionID":2608,"localID":4804},"event":{"interactionType":"ON_CLICK"},"actions":[{"transitionNodeID":{"sessionID":0,"localID":3},"connectionType":"INTERNAL_NODE","navigationType":"NAVIGATE","connectionURL":"/"}],"isDeleted":false,"stateManagementVersion":1}],"layoutMode":"HORIZONTAL","itemSpacing":32.0,"counterAxisAlignItems":"CENTER","children":["2715:1063","2715:1064","2715:1065","2715:1066","2715:1067"]},"2715:1067":{"type":"TEXT","id":"2715:1067","name":"센터소개","absoluteBoundingBox":{"x":-207.0,"y":-109.0,"width":59.0,"height":23.0},"isolatedAbsoluteRenderBounds":{"x":-206.817504882812,"y":-105.312004089355,"width":58.6362457275391,"height":16.5120010375977},"relativeTransform":[[1.0,0.0,353.0],[0.0,1.0,0.0]],"size":{"x":59.0,"y":23.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":0.443900465965271,"g":0.442026853561401,"b":0.442026853561401,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"OUTSIDE","strokes":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"characterStyleOverrides":[],"characters":"센터소개","lineIndentations":[0],"lineTypes":["NONE"],"listStartOffsets":[],"lineStyleOverrides":[0],"lineTextDirections":null,"resolvedParagraphValues":{"0":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":16.0}},"textAutoResize":"WIDTH_AND_HEIGHT","textAlignHorizontal":"CENTER","textAlignVertical":"CENTER","paragraphSpacing":16.0,"fallbackFonts":[{"fontFamily":"Noto Sans KR","fontStyle":"Medium"}],"style":{"fontFamily":"Inter","fontPostScriptName":"Inter-Medium","fontStyle":"Medium","fallbackFonts":[{"fontFamily":"Noto Sans KR","fontStyle":"Medium"}],"hyperlink":{"type":"NODE","nodeID":"/센터소개"},"paragraphSpacing":16.0,"textAutoResize":"WIDTH_AND_HEIGHT","fontVariantPosition":"NORMAL","textDecoration":"UNDERLINE","textDecorationSkipInk":true,"fontSize":16.0,"textAlignHorizontal":"CENTER","textAlignVertical":"CENTER","letterSpacing":-0.08,"letterSpacingValue":-0.5,"letterSpacingUnit":"PERCENT","lineHeightPx":23.2000007629395,"lineHeightPercent":119.812210083008,"lineHeightPercentFontSize":145.0,"lineHeightUnit":"FONT_SIZE_%","paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecorationStyle":"solid","textTruncation":"DISABLED"},"styleOverrideTable":{}},"2715:1064":{"type":"TEXT","id":"2715:1064","name":"회사소개","absoluteBoundingBox":{"x":-480.0,"y":-109.0,"width":59.0,"height":23.0},"isolatedAbsoluteRenderBounds":{"x":-479.817504882812,"y":-105.312004089355,"width":58.6362609863281,"height":16.5120010375977},"relativeTransform":[[1.0,0.0,80.0],[0.0,1.0,0.0]],"size":{"x":59.0,"y":23.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":0.443900465965271,"g":0.442026853561401,"b":0.442026853561401,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"OUTSIDE","strokes":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"characterStyleOverrides":[],"characters":"회사소개","lineIndentations":[0],"lineTypes":["NONE"],"listStartOffsets":[],"lineStyleOverrides":[0],"lineTextDirections":null,"resolvedParagraphValues":{"0":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":16.0}},"textAutoResize":"WIDTH_AND_HEIGHT","textAlignHorizontal":"CENTER","textAlignVertical":"CENTER","paragraphSpacing":16.0,"fallbackFonts":[{"fontFamily":"Noto Sans KR","fontStyle":"Medium"}],"style":{"fontFamily":"Inter","fontPostScriptName":"Inter-Medium","fontStyle":"Medium","fallbackFonts":[{"fontFamily":"Noto Sans KR","fontStyle":"Medium"}],"hyperlink":{"type":"NODE","nodeID":"/about_us"},"paragraphSpacing":16.0,"textAutoResize":"WIDTH_AND_HEIGHT","fontVariantPosition":"NORMAL","textDecoration":"UNDERLINE","textDecorationSkipInk":true,"fontSize":16.0,"textAlignHorizontal":"CENTER","textAlignVertical":"CENTER","letterSpacing":-0.08,"letterSpacingValue":-0.5,"letterSpacingUnit":"PERCENT","lineHeightPx":23.2000007629395,"lineHeightPercent":119.812210083008,"lineHeightPercentFontSize":145.0,"lineHeightUnit":"FONT_SIZE_%","paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecorationStyle":"solid","textTruncation":"DISABLED"},"styleOverrideTable":{}},"2715:1063":{"type":"TEXT","id":"2715:1063","name":"HOME","absoluteBoundingBox":{"x":-560.0,"y":-109.0,"width":48.0,"height":23.0},"isolatedAbsoluteRenderBounds":{"x":-559.965942382812,"y":-103.795455932617,"width":47.93896484375,"height":16.0681838989258},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,0.0]],"size":{"x":48.0,"y":23.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":0.443900465965271,"g":0.442026853561401,"b":0.442026853561401,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"OUTSIDE","strokes":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"characterStyleOverrides":[],"characters":"HOME","lineIndentations":[0],"lineTypes":["NONE"],"listStartOffsets":[],"lineStyleOverrides":[0],"lineTextDirections":null,"resolvedParagraphValues":{"0":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":16.0}},"textAutoResize":"WIDTH_AND_HEIGHT","textAlignHorizontal":"CENTER","textAlignVertical":"CENTER","paragraphSpacing":16.0,"style":{"fontFamily":"Inter","fontPostScriptName":"Inter-Medium","fontStyle":"Medium","hyperlink":{"type":"NODE","nodeID":"/"},"paragraphSpacing":16.0,"textAutoResize":"WIDTH_AND_HEIGHT","fontVariantPosition":"NORMAL","textDecoration":"UNDERLINE","textDecorationSkipInk":true,"fontSize":16.0,"textAlignHorizontal":"CENTER","textAlignVertical":"CENTER","letterSpacing":-0.08,"letterSpacingValue":-0.5,"letterSpacingUnit":"PERCENT","lineHeightPx":23.2000007629395,"lineHeightPercent":119.812210083008,"lineHeightPercentFontSize":145.0,"lineHeightUnit":"FONT_SIZE_%","paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecorationStyle":"solid","textTruncation":"DISABLED"},"styleOverrideTable":{}},"6:1531":{"type":"FRAME","id":"6:1531","name":"Tablet","absoluteBoundingBox":{"x":-835.0,"y":-159.0,"width":800.0,"height":3569.0},"isolatedAbsoluteRenderBounds":{"x":-835.0,"y":-159.0,"width":800.0,"height":3569.0},"relativeTransform":[[1.0,0.0,1408.0],[0.0,1.0,100.0]],"size":{"x":800.0,"y":3569.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":1.0,"g":1.0,"b":1.0,"a":1.0},"visible":true,"opacity":1.0}],"visible":false,"strokeAlign":"INSIDE","strokes":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"clipsContent":true,"overflowDirection":"VERTICAL_SCROLLING","layoutMode":"VERTICAL","counterAxisAlignItems":"CENTER","primaryAxisSizingMode":"FIXED","counterAxisSizingMode":"FIXED","isBreakpointFrame":true,"children":["2715:1052","2715:1279","7:1792","161:107","2224:3000"]},"2224:3000":{"type":"FRAME","id":"2224:3000","name":"Footer section","absoluteBoundingBox":{"x":-835.0,"y":3334.0,"width":375.0,"height":464.0},"isolatedAbsoluteRenderBounds":{"x":-835.0,"y":3334.0,"width":375.0,"height":464.0},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,3493.0]],"size":{"x":375.0,"y":464.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":1.0,"g":1.0,"b":1.0,"a":1.0},"visible":true,"opacity":1.0}],"visible":false,"strokeAlign":"INSIDE","layoutAlign":"STRETCH","strokes":[],"accessibleHTMLTag":"FOOTER","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"paddingTop":87.0,"paddingRight":32.0,"paddingBottom":29.0,"paddingLeft":32.0,"layoutMode":"VERTICAL","itemSpacing":57.0,"primaryAxisSizingMode":"FIXED","counterAxisSizingMode":"FIXED","children":["2224:3001","2224:3004","2224:3006","2224:3013"]},"2224:3006":{"type":"FRAME","id":"2224:3006","name":"Footer contact information","absoluteBoundingBox":{"x":-803.0,"y":3591.0,"width":122.0,"height":46.0},"isolatedAbsoluteRenderBounds":{"x":-803.0,"y":3591.0,"width":558.0,"height":77.0},"relativeTransform":[[1.0,0.0,32.0],[0.0,1.0,257.0]],"size":{"x":122.0,"y":46.0},"fills":[],"strokeAlign":"INSIDE","strokes":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"layoutMode":"HORIZONTAL","primaryAxisSizingMode":"FIXED","counterAxisSizingMode":"FIXED","children":["2224:3007","2224:3010","2224:3012"]},"2224:3012":{"type":"FRAME","id":"2224:3012","name":"Contact column 4","absoluteBoundingBox":{"x":-500.0,"y":3591.0,"width":255.0,"height":20.0},"isolatedAbsoluteRenderBounds":{"x":-500.0,"y":3591.0,"width":255.0,"height":20.0},"relativeTransform":[[1.0,0.0,303.0],[0.0,1.0,0.0]],"size":{"x":255.0,"y":20.0},"fills":[],"strokeAlign":"INSIDE","strokes":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"layoutMode":"VERTICAL","itemSpacing":2.0,"primaryAxisAlignItems":"CENTER","children":[]},"2224:3010":{"type":"FRAME","id":"2224:3010","name":"Contact column 2","absoluteBoundingBox":{"x":-655.0,"y":3591.0,"width":155.0,"height":77.0},"isolatedAbsoluteRenderBounds":{"x":-655.0,"y":3591.0,"width":155.0,"height":77.0},"relativeTransform":[[1.0,0.0,148.0],[0.0,1.0,0.0]],"size":{"x":155.0,"y":77.0},"fills":[],"strokeAlign":"INSIDE","strokes":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"layoutMode":"VERTICAL","itemSpacing":2.0,"primaryAxisAlignItems":"CENTER","primaryAxisSizingMode":"FIXED","counterAxisSizingMode":"FIXED","children":["2224:3011"]},"2715:1061":{"type":"RECTANGLE","id":"2715:1061","name":"Logo","absoluteBoundingBox":{"x":-771.0,"y":-135.0,"width":211.0,"height":75.0},"isolatedAbsoluteRenderBounds":{"x":-771.0,"y":-135.0,"width":211.0,"height":75.0},"relativeTransform":[[1.0,0.0,64.0],[0.0,1.0,24.0]],"size":{"x":211.0,"y":75.0},"fills":[{"blendMode":"NORMAL","type":"IMAGE","scaleMode":"FILL","imageRef":"64270238d3de4edd07597c9179b36856b5a53af3","originalImageWidth":1400,"originalImageHeight":1167,"visible":true,"opacity":1.0,"rotation":0.0}],"strokeAlign":"INSIDE","strokes":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"accessibleLabel":"Logomark","ariaAttributes":{},"interactions":[{"id":{"sessionID":2608,"localID":4807},"event":{"interactionType":"ON_CLICK"},"actions":[{"transitionNodeID":{"sessionID":0,"localID":3},"connectionType":"INTERNAL_NODE","navigationType":"NAVIGATE","connectionURL":"/"}],"isDeleted":false,"stateManagementVersion":1}]},"2224:2997":{"type":"FRAME","id":"2224:2997","name":"Contact column 4","absoluteBoundingBox":{"x":-1844.0,"y":3591.0,"width":255.0,"height":20.0},"isolatedAbsoluteRenderBounds":{"x":-1844.0,"y":3591.0,"width":255.0,"height":20.0},"relativeTransform":[[1.0,0.0,303.0],[0.0,1.0,0.0]],"size":{"x":255.0,"y":20.0},"fills":[],"strokeAlign":"INSIDE","strokes":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"layoutMode":"VERTICAL","itemSpacing":2.0,"primaryAxisAlignItems":"CENTER","children":[]},"8:2139":{"type":"FRAME","id":"8:2139","name":"Service 4","absoluteBoundingBox":{"x":-771.0,"y":2183.0,"width":980.0,"height":160.0},"isolatedAbsoluteRenderBounds":{"x":-771.0,"y":2183.0,"width":980.0,"height":160.0},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,612.0]],"size":{"x":980.0,"y":160.0},"fills":[],"visible":false,"strokeAlign":"INSIDE","strokes":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":1.0,"g":1.0,"b":1.0,"a":1.0},"visible":true,"opacity":1.0}],"individualStrokeWeights":{"top":0.5,"right":0.0,"bottom":0.0,"left":0.0},"accessibleHTMLTag":"SECTION","isDecorativeImage":false,"accessibleLabel":"Specific areas of criminal defense that we help with","ariaAttributes":{},"interactions":[],"behaviors":{"appear":{"otherLayer":{"sessionID":-1,"localID":-1},"trigger":"THIS_LAYER_IN_VIEW","direction":"UP","enterTransition":{"easingType":"OUT_CUBIC","easingFunction":[0.215000003576279,0.610000014305115,0.354999989271164,1.0],"transitionDuration":0.800000011920929,"delay":0.0},"enterState":{"transform":{"m00":1.0,"m01":0.0,"m02":0.0,"m10":0.0,"m11":1.0,"m12":0.0},"opacity":0.0},"exitTransition":{"easingType":"OUT_CUBIC","easingFunction":[0.215000003576279,0.610000014305115,0.354999989271164,1.0],"transitionDuration":0.600000023841858,"delay":0.0},"exitState":{"transform":{"m00":1.0,"m01":0.0,"m02":0.0,"m10":0.0,"m11":1.0,"m12":0.0},"opacity":1.0},"playsOnce":false,"behaviorType":"appear"}},"paddingTop":20.0,"paddingBottom":20.0,"layoutMode":"HORIZONTAL","itemSpacing":266.0,"counterAxisSizingMode":"FIXED","children":["8:2140","8:2141"]},"2224:3008":{"type":"TEXT","id":"2224:3008","name":"hello@brainable.co.kr","absoluteBoundingBox":{"x":-803.0,"y":3605.5,"width":255.0,"height":20.0},"isolatedAbsoluteRenderBounds":{"x":-803.0,"y":3605.5,"width":255.0,"height":20.0},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,14.5]],"size":{"x":255.0,"y":20.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":0.0,"g":0.0,"b":0.0,"a":1.0},"visible":true,"opacity":1.0}],"visible":false,"strokeAlign":"OUTSIDE","strokes":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"behaviors":{"hover":{"transition":{"easingType":"OUT_CUBIC","easingFunction":[0.215000003576279,0.610000014305115,0.354999989271164,1.0],"transitionDuration":0.300000011920929,"delay":0.0},"state":{"transform":{"m00":1.0,"m01":0.0,"m02":0.0,"m10":0.0,"m11":1.0,"m12":0.0},"opacity":0.699999988079071},"behaviorType":"hover"}},"characterStyleOverrides":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1],"characters":"hello@brainable.co.kr","lineIndentations":[0],"lineTypes":["NONE"],"listStartOffsets":[],"lineStyleOverrides":[0],"lineTextDirections":null,"resolvedParagraphValues":{"0":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":0.0}},"textAutoResize":"HEIGHT","style":{"styleIdForText":"StyleId:bcc262e16c06dc528ec5203195d6322cbd051b62/6:1102","fontFamily":"Geist","fontPostScriptName":"Geist-Regular","fontStyle":"Regular","hyperlink":{"type":"URL","url":"mailto:hello@figma.com","openInNewTab":true},"textAutoResize":"HEIGHT","fontVariantPosition":"NORMAL","fontSize":14.0,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","letterSpacing":0.0,"letterSpacingValue":0.0,"letterSpacingUnit":"PERCENT","lineHeightPx":19.6000003814697,"lineHeightPercent":107.692314147949,"lineHeightPercentFontSize":140.0,"lineHeightUnit":"FONT_SIZE_%","paragraphSpacing":0,"paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecoration":"NONE","textDecorationSkipInk":false,"textDecorationStyle":"solid","textTruncation":"DISABLED"},"styleOverrideTable":{"1":{"styleIdForText":"StyleId:bcc262e16c06dc528ec5203195d6322cbd051b62/6:1102","paragraphSpacing":0,"paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecoration":"NONE","textDecorationSkipInk":false,"textDecorationStyle":"solid","textAutoResize":"NONE","textTruncation":"DISABLED","lineHeightPercent":100,"lineHeightPercentFontSize":100}}},"8:1952":{"type":"TEXT","id":"8:1952","name":"20년 이상의 지속적인 연구개발","absoluteBoundingBox":{"x":-804.0,"y":1002.0,"width":111.0,"height":139.0},"isolatedAbsoluteRenderBounds":{"x":-794.14990234375,"y":1058.84802246094,"width":91.4107055664062,"height":26.06494140625},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,112.0]],"size":{"x":111.0,"y":139.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":1.0,"g":1.0,"b":1.0,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"OUTSIDE","layoutAlign":"STRETCH","strokes":[],"strokeWeight":3.21430063247681,"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"characterStyleOverrides":[],"characters":"20년 이상의 \n지속적인 연구개발","lineIndentations":[0,0],"lineTypes":["NONE","NONE"],"listStartOffsets":[],"lineStyleOverrides":[0,0],"lineTextDirections":null,"resolvedParagraphValues":{"0":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":0.0},"1":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":0.0}},"textAlignHorizontal":"CENTER","textAlignVertical":"CENTER","style":{"fontFamily":"Noto Sans KR","fontPostScriptName":"NotoSansKR-Medium","fontStyle":"Medium","fontVariantPosition":"NORMAL","fontSize":11.0,"textAlignHorizontal":"CENTER","textAlignVertical":"CENTER","letterSpacing":1.1,"letterSpacingValue":10.0,"letterSpacingUnit":"PERCENT","lineHeightPx":15.7299995422363,"lineHeightPercent":119.166664123535,"lineHeightPercentFontSize":143.0,"lineHeightUnit":"FONT_SIZE_%","paragraphSpacing":0,"paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecoration":"NONE","textDecorationSkipInk":false,"textDecorationStyle":"solid","textAutoResize":"NONE","textTruncation":"DISABLED"},"styleOverrideTable":{}},"2224:3005":{"type":"TEXT","id":"2224:3005","name":"Pioneer of the Wellness-tech Solution.","absoluteBoundingBox":{"x":-803.0,"y":3520.0,"width":311.0,"height":14.0},"isolatedAbsoluteRenderBounds":{"x":-801.989990234375,"y":3522.90991210938,"width":271.185302734375,"height":8.219970703125},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,0.0]],"size":{"x":311.0,"y":14.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":0.0,"g":0.0,"b":0.0,"a":1.0},"visible":true,"opacity":1.0}],"constraints":{"vertical":"TOP","horizontal":"SCALE"},"constraintValues":{"left":{"pixelOffset":0.0,"sizeFraction":0.0},"right":{"pixelOffset":0.0,"sizeFraction":1.0},"top":{"pixelOffset":0.0,"sizeFraction":0.0}},"strokeAlign":"OUTSIDE","strokes":[],"strokeWeight":3.21430063247681,"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"characterStyleOverrides":[],"characters":"Pioneer of the Wellness-tech Solution.","lineIndentations":[0],"lineTypes":["NONE"],"listStartOffsets":[],"lineStyleOverrides":[0],"lineTextDirections":null,"resolvedParagraphValues":{"0":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":0.0}},"textAutoResize":"HEIGHT","style":{"fontFamily":"Noto Sans KR","fontPostScriptName":"NotoSansKR-Regular","fontStyle":"Regular","textAutoResize":"HEIGHT","fontVariantPosition":"NORMAL","fontSize":10.0,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","letterSpacing":2.6,"letterSpacingValue":26.0,"letterSpacingUnit":"PERCENT","lineHeightPx":13.5,"lineHeightPercent":112.499992370605,"lineHeightPercentFontSize":135.0,"lineHeightUnit":"FONT_SIZE_%","paragraphSpacing":0,"paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecoration":"NONE","textDecorationSkipInk":false,"textDecorationStyle":"solid","textTruncation":"DISABLED"},"styleOverrideTable":{}},"6:1353":{"key":"97dafb45fff15bf769b52f3a6ba1d1c9a7c3d06a","name":"Paragraph/Paragraph 2","styleType":"TEXT","remote":false,"description":"","id":"6:1353","assetId":"StyleId:6:1353","type":"STYLE","style":{"fontFamily":"Geist","fontPostScriptName":"Geist-Regular","fontStyle":"Regular","textAutoResize":"WIDTH_AND_HEIGHT","responsiveTextStyleVariants":[{"minWidth":1280.0,"name":"Desktop","style":{"fontSize":18.0,"letterSpacing":-0.36,"letterSpacingValue":-2.0,"letterSpacingUnit":"PERCENT","lineHeightPx":24.3000011444092,"lineHeightPercent":115.199996948242,"lineHeightPercentFontSize":135.0,"lineHeightUnit":"FONT_SIZE_%"}}],"fontSize":18.0,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","letterSpacing":-0.36,"letterSpacingValue":-2.0,"letterSpacingUnit":"PERCENT","lineHeightPx":24.3000011444092,"lineHeightPercent":103.846160888672,"lineHeightPercentFontSize":135.0,"lineHeightUnit":"FONT_SIZE_%"},"responsiveTextStyleVariants":[{"minWidth":1280.0,"name":"Desktop","style":{"fontSize":18.0,"letterSpacing":-0.36,"letterSpacingValue":-2.0,"letterSpacingUnit":"PERCENT","lineHeightPx":24.3000011444092,"lineHeightPercent":115.199996948242,"lineHeightPercentFontSize":135.0,"lineHeightUnit":"FONT_SIZE_%"}}]},"2224:3001":{"type":"FRAME","id":"2224:3001","name":"Footer header","absoluteBoundingBox":{"x":-803.0,"y":3421.0,"width":311.0,"height":42.0},"isolatedAbsoluteRenderBounds":{"x":-803.0,"y":3421.0,"width":311.0,"height":42.0},"relativeTransform":[[1.0,0.0,32.0],[0.0,1.0,87.0]],"size":{"x":311.0,"y":42.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":1.0,"g":1.0,"b":1.0,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"INSIDE","layoutAlign":"STRETCH","strokes":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"layoutMode":"VERTICAL","itemSpacing":24.0,"primaryAxisAlignItems":"CENTER","primaryAxisSizingMode":"FIXED","counterAxisSizingMode":"FIXED","children":["2224:3002","2224:3003"]},"2224:2999":{"type":"TEXT","id":"2224:2999","name":"Brainable Co., LTD. © 2025 All Rights Reserved","absoluteBoundingBox":{"x":-2147.0,"y":3694.0,"width":197.0,"height":26.0},"isolatedAbsoluteRenderBounds":{"x":-2146.48706054688,"y":3696.85400390625,"width":125.537719726562,"height":22.458984375},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,0.0]],"size":{"x":197.0,"y":26.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":0.0,"g":0.0,"b":0.0,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"OUTSIDE","strokes":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"characterStyleOverrides":[],"characters":"Brainable Co., LTD.\n© 2025 All Rights Reserved","lineIndentations":[0,0],"lineTypes":["NONE","NONE"],"listStartOffsets":[],"lineStyleOverrides":[0,0],"lineTextDirections":null,"resolvedParagraphValues":{"0":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":0.0},"1":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":0.0}},"textAutoResize":"HEIGHT","style":{"fontFamily":"Noto Sans KR","fontPostScriptName":"NotoSansKR-Thin","fontStyle":"Thin","textAutoResize":"HEIGHT","fontVariantPosition":"NORMAL","fontSize":9.0,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","letterSpacing":0.9,"letterSpacingValue":10.0,"letterSpacingUnit":"PERCENT","lineHeightPx":12.5999994277954,"lineHeightPercent":116.666664123535,"lineHeightPercentFontSize":140.0,"lineHeightUnit":"FONT_SIZE_%","paragraphSpacing":0,"paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecoration":"NONE","textDecorationSkipInk":false,"textDecorationStyle":"solid","textTruncation":"DISABLED"},"styleOverrideTable":{}},"2224:3003":{"type":"RECTANGLE","id":"2224:3003","name":"brainable_logo_ver.001-01 1","absoluteBoundingBox":{"x":-803.0,"y":3424.5,"width":42.0,"height":35.0},"targetAspectRatio":{"x":1400.0,"y":1167.0},"isolatedAbsoluteRenderBounds":{"x":-803.0,"y":3424.5,"width":42.0,"height":35.0},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,3.5]],"size":{"x":42.0,"y":35.0},"fills":[{"blendMode":"NORMAL","type":"IMAGE","scaleMode":"FILL","imageRef":"4f89b370cf29c22c8bfd83ffd6ad48b1dd2cd6af","originalImageWidth":1400,"originalImageHeight":1167,"visible":true,"opacity":1.0,"rotation":0.0}],"strokeAlign":"INSIDE","strokes":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[]},"2224:3002":{"type":"RECTANGLE","id":"2224:3002","name":"brainable_logo_ver.001-03 1","absoluteBoundingBox":{"x":-768.0,"y":3405.0,"width":89.0,"height":74.0},"targetAspectRatio":{"x":1400.0,"y":1167.0},"isolatedAbsoluteRenderBounds":{"x":-768.0,"y":3405.0,"width":89.0,"height":74.0},"relativeTransform":[[1.0,0.0,35.0],[0.0,1.0,-16.0]],"size":{"x":89.0,"y":74.0},"fills":[{"blendMode":"NORMAL","type":"IMAGE","scaleMode":"FILL","imageRef":"d5fa8c9a8fa609d8b7d06565c3a9a33ab9d65149","originalImageWidth":1400,"originalImageHeight":1167,"visible":true,"opacity":1.0,"rotation":0.0}],"visible":false,"constraintValues":{"left":{"pixelOffset":35.0,"sizeFraction":0.0},"top":{"pixelOffset":-16.0,"sizeFraction":0.0}},"strokeAlign":"INSIDE","layoutPositioning":"ABSOLUTE","strokes":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[]},"8:1940":{"type":"FRAME","id":"8:1940","name":"Stat 1","absoluteBoundingBox":{"x":-675.0,"y":723.0,"width":183.0,"height":182.0},"isolatedAbsoluteRenderBounds":{"x":-675.0,"y":723.0,"width":183.0,"height":182.0},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,0.0]],"size":{"x":183.0,"y":182.0},"fills":[],"strokeAlign":"INSIDE","strokes":[],"accessibleHTMLTag":"SECTION","isDecorativeImage":false,"accessibleLabel":"Statistic 1 about Jones and Brown","ariaAttributes":{},"interactions":[],"behaviors":{"appear":{"otherLayer":{"sessionID":-1,"localID":-1},"trigger":"THIS_LAYER_IN_VIEW","direction":"UP","enterTransition":{"easingType":"OUT_CUBIC","easingFunction":[0.215000003576279,0.610000014305115,0.354999989271164,1.0],"transitionDuration":0.800000011920929,"delay":0.0500000007450581},"enterState":{"transform":{"m00":1.0,"m01":0.0,"m02":0.0,"m10":0.0,"m11":1.0,"m12":0.0},"opacity":0.0},"exitTransition":{"easingType":"OUT_CUBIC","easingFunction":[0.215000003576279,0.610000014305115,0.354999989271164,1.0],"transitionDuration":0.600000023841858,"delay":0.0},"exitState":{"transform":{"m00":1.0,"m01":0.0,"m02":0.0,"m10":0.0,"m11":1.0,"m12":0.0},"opacity":1.0},"playsOnce":false,"behaviorType":"appear"}},"layoutMode":"VERTICAL","itemSpacing":56.0,"counterAxisSizingMode":"FIXED","children":["8:1941","8:1942"]},"2224:2925":{"type":"TEXT","id":"2224:2925","name":"Brainable Co., LTD. © 2025 All Rights Reserved","absoluteBoundingBox":{"x":-932.0,"y":3401.0,"width":197.0,"height":28.0},"isolatedAbsoluteRenderBounds":{"x":-931.450012207031,"y":3404.0400390625,"width":146.858947753906,"height":24.4599609375},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,0.0]],"size":{"x":197.0,"y":28.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":0.443900465965271,"g":0.442026853561401,"b":0.442026853561401,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"OUTSIDE","strokes":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"characterStyleOverrides":[],"characters":"Brainable Co., LTD.\n© 2025 All Rights Reserved","lineIndentations":[0,0],"lineTypes":["NONE","NONE"],"listStartOffsets":[],"lineStyleOverrides":[0,0],"lineTextDirections":null,"resolvedParagraphValues":{"0":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":0.0},"1":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":0.0}},"textAutoResize":"HEIGHT","style":{"fontFamily":"Noto Sans KR","fontPostScriptName":"NotoSansKR-Regular","fontStyle":"Regular","textAutoResize":"HEIGHT","fontVariantPosition":"NORMAL","fontSize":10.0,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","letterSpacing":1.0,"letterSpacingValue":10.0,"letterSpacingUnit":"PERCENT","lineHeightPx":14.0,"lineHeightPercent":116.666664123535,"lineHeightPercentFontSize":140.0,"lineHeightUnit":"FONT_SIZE_%","paragraphSpacing":0,"paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecoration":"NONE","textDecorationSkipInk":false,"textDecorationStyle":"solid","textTruncation":"DISABLED"},"styleOverrideTable":{}},"2224:2920":{"type":"TEXT","id":"2224:2920","name":"010-8123-7857 02)-581-7856","absoluteBoundingBox":{"x":-932.0,"y":3231.5,"width":255.0,"height":55.0},"isolatedAbsoluteRenderBounds":{"x":-931.200012207031,"y":3237.56396484375,"width":126.371765136719,"height":38.072021484375},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,2.5]],"size":{"x":255.0,"y":55.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":0.0,"g":0.0,"b":0.0,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"OUTSIDE","strokes":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"behaviors":{"hover":{"transition":{"easingType":"OUT_CUBIC","easingFunction":[0.215000003576279,0.610000014305115,0.354999989271164,1.0],"transitionDuration":0.300000011920929,"delay":0.0},"state":{"transform":{"m00":1.0,"m01":0.0,"m02":0.0,"m10":0.0,"m11":1.0,"m12":0.0},"opacity":0.699999988079071},"behaviorType":"hover"}},"characterStyleOverrides":[],"characters":"010-8123-7857\n02)-581-7856","lineIndentations":[0,0],"lineTypes":["NONE","NONE"],"listStartOffsets":[],"lineStyleOverrides":[0,0],"lineTextDirections":null,"resolvedParagraphValues":{"0":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":0.0},"1":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":0.0}},"style":{"fontFamily":"Noto Sans KR","fontPostScriptName":"NotoSansKR-Regular","fontStyle":"Regular","fontVariantPosition":"NORMAL","fontSize":16.0,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","letterSpacing":1.6,"letterSpacingValue":10.0,"letterSpacingUnit":"PERCENT","lineHeightPx":22.8799991607666,"lineHeightPercent":119.166664123535,"lineHeightPercentFontSize":143.0,"lineHeightUnit":"FONT_SIZE_%","paragraphSpacing":0,"paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecoration":"NONE","textDecorationSkipInk":false,"textDecorationStyle":"solid","textAutoResize":"NONE","textTruncation":"DISABLED"},"styleOverrideTable":{}},"8:2132":{"type":"TEXT","id":"8:2132","name":"브레인에이블은 지속적이고 체계적인 연구를 통해 기술의 한계를 뛰어넘으며, 새로운 도구를 개발하고 있습니다. 우리의 노력은 뇌 건강 분야에서의 획기적인 발전을 이루어내고 있으며, 더 나은 옵션을 제공하기 위해 꾸준히 진보하고 있습니다.","absoluteBoundingBox":{"x":-371.0,"y":1591.0,"width":420.0,"height":130.0},"isolatedAbsoluteRenderBounds":{"x":-364.833129882812,"y":1595.11401367188,"width":406.53369140625,"height":120.307983398438},"relativeTransform":[[1.0,0.0,400.0],[0.0,1.0,20.0]],"size":{"x":420.0,"y":130.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":1.0,"g":1.0,"b":1.0,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"OUTSIDE","strokes":[],"strokeWeight":3.21430063247681,"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"characterStyleOverrides":[],"characters":"브레인에이블은 지속적이고 체계적인 연구를 통해 기술의 한계를 뛰어넘으며, 새로운 도구를 개발하고 있습니다. \n우리의 노력은 뇌 건강 분야에서의 획기적인 발전을\n이루어내고 있으며, 더 나은 옵션을 제공하기 위해 꾸준히 진보하고 있습니다.","lineIndentations":[0,0,0],"lineTypes":["NONE","NONE","NONE"],"listStartOffsets":[],"lineStyleOverrides":[0,0,0],"lineTextDirections":null,"resolvedParagraphValues":{"0":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":0.0},"1":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":0.0},"2":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":0.0}},"textAutoResize":"HEIGHT","textAlignHorizontal":"CENTER","style":{"fontFamily":"Geist","fontPostScriptName":"Geist-Regular","fontStyle":"Regular","textAutoResize":"HEIGHT","fontVariantPosition":"NORMAL","fontSize":18.0,"textAlignHorizontal":"CENTER","textAlignVertical":"TOP","letterSpacing":-0.36,"letterSpacingValue":-2.0,"letterSpacingUnit":"PERCENT","lineHeightPx":25.7399997711182,"lineHeightPercent":110.000007629395,"lineHeightPercentFontSize":143.0,"lineHeightUnit":"FONT_SIZE_%","paragraphSpacing":0,"paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecoration":"NONE","textDecorationSkipInk":false,"textDecorationStyle":"solid","textTruncation":"DISABLED"},"styleOverrideTable":{}},"2715:1283":{"type":"TEXT","id":"2715:1283","name":"회사소개","absoluteBoundingBox":{"x":-677.0,"y":-20.0,"width":59.0,"height":23.0},"isolatedAbsoluteRenderBounds":{"x":-676.658447265625,"y":-14.0000009536743,"width":58.3231201171875,"height":15.2000017166138},"relativeTransform":[[1.0,0.0,6.0],[0.0,1.0,0.0]],"size":{"x":59.0,"y":23.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":0.443900465965271,"g":0.442026853561401,"b":0.442026853561401,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"OUTSIDE","strokes":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"characterStyleOverrides":[],"characters":"HOME","lineIndentations":[0],"lineTypes":["NONE"],"listStartOffsets":[],"lineStyleOverrides":[0],"lineTextDirections":null,"resolvedParagraphValues":{"0":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":16.0}},"textAutoResize":"WIDTH_AND_HEIGHT","textAlignHorizontal":"CENTER","textAlignVertical":"CENTER","paragraphSpacing":16.0,"style":{"styleIdForText":"StyleId:2608:2916","fontFamily":"Noto Sans KR","fontPostScriptName":"NotoSansKR-Medium","fontStyle":"Medium","hyperlink":{"type":"NODE","nodeID":"/"},"paragraphSpacing":16.0,"textAutoResize":"WIDTH_AND_HEIGHT","fontVariantPosition":"NORMAL","textDecoration":"UNDERLINE","textDecorationSkipInk":true,"fontSize":16.0,"textAlignHorizontal":"CENTER","textAlignVertical":"CENTER","letterSpacing":3.84,"letterSpacingValue":24.0,"letterSpacingUnit":"PERCENT","lineHeightPx":23.2000007629395,"lineHeightPercent":120.83332824707,"lineHeightPercentFontSize":145.0,"lineHeightUnit":"FONT_SIZE_%","paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecorationStyle":"solid","textTruncation":"DISABLED"},"styleOverrideTable":{}},"2224:2919":{"type":"TEXT","id":"2224:2919","name":"hello@brainable.co.kr","absoluteBoundingBox":{"x":-932.0,"y":3229.0,"width":255.0,"height":20.0},"isolatedAbsoluteRenderBounds":{"x":-932.0,"y":3229.0,"width":255.0,"height":20.0},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,0.0]],"size":{"x":255.0,"y":20.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":0.0,"g":0.0,"b":0.0,"a":1.0},"visible":true,"opacity":1.0}],"visible":false,"strokeAlign":"OUTSIDE","strokes":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"behaviors":{"hover":{"transition":{"easingType":"OUT_CUBIC","easingFunction":[0.215000003576279,0.610000014305115,0.354999989271164,1.0],"transitionDuration":0.300000011920929,"delay":0.0},"state":{"transform":{"m00":1.0,"m01":0.0,"m02":0.0,"m10":0.0,"m11":1.0,"m12":0.0},"opacity":0.699999988079071},"behaviorType":"hover"}},"characterStyleOverrides":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1],"characters":"hello@brainable.co.kr","lineIndentations":[0],"lineTypes":["NONE"],"listStartOffsets":[],"lineStyleOverrides":[0],"lineTextDirections":null,"resolvedParagraphValues":{"0":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":0.0}},"textAutoResize":"HEIGHT","style":{"styleIdForText":"StyleId:6:1356","fontFamily":"Geist","fontPostScriptName":"Geist-Regular","fontStyle":"Regular","hyperlink":{"type":"URL","url":"mailto:hello@figma.com","openInNewTab":true},"textAutoResize":"HEIGHT","responsiveTextStyleVariants":[{"minWidth":1280.0,"name":"Desktop","style":{"styleIdForText":"StyleId:6:1356","fontSize":14.0,"letterSpacing":0.0,"letterSpacingValue":0.0,"letterSpacingUnit":"PERCENT","lineHeightPx":19.6000003814697,"lineHeightPercent":119.466667175293,"lineHeightPercentFontSize":140.0,"lineHeightUnit":"FONT_SIZE_%"}},{"minWidth":800.0,"name":"Tablet","style":{"styleIdForText":"StyleId:6:1356","fontSize":14.0,"letterSpacing":0.0,"letterSpacingValue":0.0,"letterSpacingUnit":"PERCENT","lineHeightPx":19.6000003814697,"lineHeightPercent":119.466667175293,"lineHeightPercentFontSize":140.0,"lineHeightUnit":"FONT_SIZE_%"}},{"minWidth":0.0,"name":"Mobile","style":{"styleIdForText":"StyleId:6:1356","fontSize":14.0,"letterSpacing":0.0,"letterSpacingValue":0.0,"letterSpacingUnit":"PERCENT","lineHeightPx":19.6000003814697,"lineHeightPercent":119.466667175293,"lineHeightPercentFontSize":140.0,"lineHeightUnit":"FONT_SIZE_%"}}],"fontVariantPosition":"NORMAL","fontSize":14.0,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","letterSpacing":0.0,"letterSpacingValue":0.0,"letterSpacingUnit":"PERCENT","lineHeightPx":19.6000003814697,"lineHeightPercent":107.692314147949,"lineHeightPercentFontSize":140.0,"lineHeightUnit":"FONT_SIZE_%","paragraphSpacing":0,"paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecoration":"NONE","textDecorationSkipInk":false,"textDecorationStyle":"solid","textTruncation":"DISABLED"},"styleOverrideTable":{"1":{"styleIdForText":"StyleId:6:1356","paragraphSpacing":0,"paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecoration":"NONE","textDecorationSkipInk":false,"textDecorationStyle":"solid","textAutoResize":"NONE","textTruncation":"DISABLED","lineHeightPercent":100,"lineHeightPercentFontSize":100}}},"2715:1282":{"type":"FRAME","id":"2715:1282","name":"Nav","absoluteBoundingBox":{"x":-683.0,"y":-20.0,"width":71.0,"height":243.0},"isolatedAbsoluteRenderBounds":{"x":-683.0,"y":-20.0,"width":71.0,"height":243.0},"relativeTransform":[[1.0,0.0,103.0],[0.0,1.0,115.0]],"size":{"x":71.0,"y":243.0},"fills":[],"strokeAlign":"INSIDE","strokes":[],"accessibleHTMLTag":"NAV","isDecorativeImage":false,"ariaAttributes":{},"interactions":[{"id":{"sessionID":2608,"localID":1766},"event":{"interactionType":"ON_CLICK"},"actions":[{"transitionNodeID":{"sessionID":6,"localID":1529},"connectionType":"INTERNAL_NODE","navigationType":"NAVIGATE","connectionURL":"/about_us"}],"isDeleted":false,"stateManagementVersion":1}],"layoutMode":"VERTICAL","itemSpacing":32.0,"counterAxisAlignItems":"CENTER","children":["2715:1283","2715:1284","2715:1285","2715:1286","2715:1287"]},"2715:1034":{"type":"FRAME","id":"2715:1034","name":"Header 1","absoluteBoundingBox":{"x":-2179.0,"y":-159.0,"width":1280.0,"height":123.0},"isolatedAbsoluteRenderBounds":{"x":-2179.0,"y":-159.0,"width":1280.0,"height":123.0},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,0.0]],"size":{"x":1280.0,"y":123.0},"fills":[],"strokeAlign":"INSIDE","layoutAlign":"STRETCH","strokes":[],"accessibleHTMLTag":"HEADER","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"paddingTop":24.0,"paddingRight":64.0,"paddingBottom":24.0,"paddingLeft":64.0,"layoutMode":"HORIZONTAL","itemSpacing":16.0,"counterAxisAlignItems":"CENTER","primaryAxisAlignItems":"SPACE_BETWEEN","primaryAxisSizingMode":"FIXED","children":["2715:1035","2715:1036"]},"2224:2915":{"type":"FRAME","id":"2224:2915","name":"Footer subhead","absoluteBoundingBox":{"x":-932.0,"y":3073.0,"width":994.0,"height":51.0},"isolatedAbsoluteRenderBounds":{"x":-932.0,"y":3073.0,"width":994.0,"height":51.0},"relativeTransform":[[1.0,0.0,-97.0],[0.0,1.0,311.0]],"size":{"x":994.0,"y":51.0},"fills":[],"strokeAlign":"INSIDE","strokes":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"layoutMode":"HORIZONTAL","itemSpacing":10.0,"counterAxisAlignItems":"CENTER","primaryAxisAlignItems":"CENTER","primaryAxisSizingMode":"FIXED","counterAxisSizingMode":"FIXED","children":["2224:2916"]},"8:2126":{"type":"FRAME","id":"8:2126","name":"Our services section","absoluteBoundingBox":{"x":-835.0,"y":1124.0,"width":800.0,"height":1158.0},"isolatedAbsoluteRenderBounds":{"x":-835.0,"y":1124.0,"width":1176.0,"height":1158.0},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,533.0]],"size":{"x":800.0,"y":1158.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":0.0510419681668282,"g":0.12193451076746,"b":0.0317076370120049,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"INSIDE","layoutAlign":"STRETCH","strokes":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"paddingTop":114.0,"paddingRight":64.0,"paddingBottom":114.0,"paddingLeft":64.0,"layoutMode":"HORIZONTAL","itemSpacing":10.0,"counterAxisAlignItems":"CENTER","primaryAxisAlignItems":"CENTER","primaryAxisSizingMode":"FIXED","counterAxisSizingMode":"FIXED","children":["8:2127"]},"8:2112":{"type":"TEXT","id":"8:2112","name":"전문적인 의료 연계 시스템","absoluteBoundingBox":{"x":-2063.5,"y":2253.5,"width":242.0,"height":27.0},"isolatedAbsoluteRenderBounds":{"x":-2062.78002929688,"y":2258.71997070312,"width":239.458129882812,"height":18.580078125},"relativeTransform":[[1.0,0.0,5.0],[0.0,1.0,43.0]],"size":{"x":242.0,"y":27.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":1.0,"g":1.0,"b":1.0,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"OUTSIDE","strokes":[],"strokeWeight":3.21430063247681,"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"characterStyleOverrides":[],"characters":"전문적인 의료 연계 시스템","lineIndentations":[0],"lineTypes":["NONE"],"listStartOffsets":[],"lineStyleOverrides":[0],"lineTextDirections":null,"resolvedParagraphValues":{"0":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":0.0}},"textAutoResize":"WIDTH_AND_HEIGHT","style":{"fontFamily":"Noto Sans KR","fontPostScriptName":"NotoSansKR-Bold","fontStyle":"Bold","textAutoResize":"WIDTH_AND_HEIGHT","fontVariantPosition":"NORMAL","fontSize":20.0,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","letterSpacing":2.0,"letterSpacingValue":10.0,"letterSpacingUnit":"PERCENT","lineHeightPx":27.0,"lineHeightPercent":112.499992370605,"lineHeightPercentFontSize":135.0,"lineHeightUnit":"FONT_SIZE_%","paragraphSpacing":0,"paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecoration":"NONE","textDecorationSkipInk":false,"textDecorationStyle":"solid","textTruncation":"DISABLED"},"styleOverrideTable":{}},"8:2129":{"type":"FRAME","id":"8:2129","name":"Services list","absoluteBoundingBox":{"x":-771.0,"y":1571.0,"width":672.0,"height":544.0},"isolatedAbsoluteRenderBounds":{"x":-771.0,"y":1571.0,"width":1112.0,"height":555.422119140625},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,300.0]],"size":{"x":672.0,"y":544.0},"fills":[],"strokeAlign":"INSIDE","layoutAlign":"STRETCH","strokes":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"layoutMode":"VERTICAL","itemSpacing":20.0,"counterAxisSizingMode":"FIXED","children":["8:2130","8:2133","8:2136","8:2139","8:2142","8:2145"]},"8:2145":{"type":"FRAME","id":"8:2145","name":"Service 6","absoluteBoundingBox":{"x":-771.0,"y":2183.0,"width":980.0,"height":136.0},"isolatedAbsoluteRenderBounds":{"x":-771.0,"y":2183.0,"width":980.0,"height":136.0},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,612.0]],"size":{"x":980.0,"y":136.0},"fills":[],"visible":false,"strokeAlign":"INSIDE","strokes":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":1.0,"g":1.0,"b":1.0,"a":1.0},"visible":true,"opacity":1.0}],"individualStrokeWeights":{"top":0.5,"right":0.0,"bottom":0.0,"left":0.0},"accessibleHTMLTag":"SECTION","isDecorativeImage":false,"accessibleLabel":"Specific areas of immigration law that we help with","ariaAttributes":{},"interactions":[],"behaviors":{"appear":{"otherLayer":{"sessionID":-1,"localID":-1},"trigger":"THIS_LAYER_IN_VIEW","direction":"UP","enterTransition":{"easingType":"OUT_CUBIC","easingFunction":[0.215000003576279,0.610000014305115,0.354999989271164,1.0],"transitionDuration":0.800000011920929,"delay":0.0},"enterState":{"transform":{"m00":1.0,"m01":0.0,"m02":0.0,"m10":0.0,"m11":1.0,"m12":0.0},"opacity":0.0},"exitTransition":{"easingType":"OUT_CUBIC","easingFunction":[0.215000003576279,0.610000014305115,0.354999989271164,1.0],"transitionDuration":0.600000023841858,"delay":0.0},"exitState":{"transform":{"m00":1.0,"m01":0.0,"m02":0.0,"m10":0.0,"m11":1.0,"m12":0.0},"opacity":1.0},"playsOnce":false,"behaviorType":"appear"}},"paddingTop":20.0,"paddingBottom":20.0,"layoutMode":"HORIZONTAL","itemSpacing":266.0,"counterAxisSizingMode":"FIXED","children":["8:2146","8:2147"]},"8:2163":{"type":"TEXT","id":"8:2163","name":"DUI and traffic offenses White-collar crime defese Drug charges Assault and battery cases Expungements and record sealing","absoluteBoundingBox":{"x":-255.0,"y":2263.0,"width":420.0,"height":120.0},"isolatedAbsoluteRenderBounds":{"x":-254.639999389648,"y":2268.20190429688,"width":266.703338623047,"height":111.714111328125},"relativeTransform":[[1.0,0.0,560.0],[0.0,1.0,20.0]],"size":{"x":420.0,"y":120.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":1.0,"g":1.0,"b":1.0,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"OUTSIDE","strokes":[],"strokeWeight":3.21430063247681,"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"characterStyleOverrides":[],"characters":"DUI and traffic offenses\nWhite-collar crime defese\nDrug charges\nAssault and battery cases\nExpungements and record sealing","lineIndentations":[0,0,0,0,0],"lineTypes":["NONE","NONE","NONE","NONE","NONE"],"listStartOffsets":[],"lineStyleOverrides":[0,0,0,0,0],"lineTextDirections":null,"resolvedParagraphValues":{"0":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":0.0},"1":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":0.0},"2":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":0.0},"3":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":0.0},"4":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":0.0}},"textAutoResize":"HEIGHT","style":{"styleIdForText":"StyleId:6:1353","fontFamily":"Geist","fontPostScriptName":"Geist-Regular","fontStyle":"Regular","textAutoResize":"HEIGHT","responsiveTextStyleVariants":[{"minWidth":1280.0,"name":"Desktop","style":{"styleIdForText":"StyleId:6:1353","fontSize":18.0,"letterSpacing":-0.36,"letterSpacingValue":-2.0,"letterSpacingUnit":"PERCENT","lineHeightPx":24.3000011444092,"lineHeightPercent":115.199996948242,"lineHeightPercentFontSize":135.0,"lineHeightUnit":"FONT_SIZE_%"}}],"fontVariantPosition":"NORMAL","fontSize":18.0,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","letterSpacing":-0.36,"letterSpacingValue":-2.0,"letterSpacingUnit":"PERCENT","lineHeightPx":24.3000011444092,"lineHeightPercent":103.846160888672,"lineHeightPercentFontSize":135.0,"lineHeightUnit":"FONT_SIZE_%","paragraphSpacing":0,"paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecoration":"NONE","textDecorationSkipInk":false,"textDecorationStyle":"solid","textTruncation":"DISABLED"},"styleOverrideTable":{}},"2715:1066":{"type":"TEXT","id":"2715:1066","name":"제품소개","absoluteBoundingBox":{"x":-298.0,"y":-109.0,"width":59.0,"height":23.0},"isolatedAbsoluteRenderBounds":{"x":-297.817504882812,"y":-105.312004089355,"width":58.6362457275391,"height":16.5120010375977},"relativeTransform":[[1.0,0.0,262.0],[0.0,1.0,0.0]],"size":{"x":59.0,"y":23.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":0.443900465965271,"g":0.442026853561401,"b":0.442026853561401,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"OUTSIDE","strokes":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"characterStyleOverrides":[],"characters":"커뮤니티","lineIndentations":[0],"lineTypes":["NONE"],"listStartOffsets":[],"lineStyleOverrides":[0],"lineTextDirections":null,"resolvedParagraphValues":{"0":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":16.0}},"textAutoResize":"WIDTH_AND_HEIGHT","textAlignHorizontal":"CENTER","textAlignVertical":"CENTER","paragraphSpacing":16.0,"fallbackFonts":[{"fontFamily":"Noto Sans KR","fontStyle":"Medium"}],"style":{"fontFamily":"Inter","fontPostScriptName":"Inter-Medium","fontStyle":"Medium","fallbackFonts":[{"fontFamily":"Noto Sans KR","fontStyle":"Medium"}],"hyperlink":{"type":"NODE","nodeID":"/커뮤니티Articles"},"paragraphSpacing":16.0,"textAutoResize":"WIDTH_AND_HEIGHT","fontVariantPosition":"NORMAL","textDecoration":"UNDERLINE","textDecorationSkipInk":true,"fontSize":16.0,"textAlignHorizontal":"CENTER","textAlignVertical":"CENTER","letterSpacing":-0.08,"letterSpacingValue":-0.5,"letterSpacingUnit":"PERCENT","lineHeightPx":23.2000007629395,"lineHeightPercent":119.812210083008,"lineHeightPercentFontSize":145.0,"lineHeightUnit":"FONT_SIZE_%","paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecorationStyle":"solid","textTruncation":"DISABLED"},"styleOverrideTable":{}},"8:2146":{"type":"TEXT","id":"8:2146","name":"Immigration Law","absoluteBoundingBox":{"x":-771.0,"y":2203.0,"width":136.0,"height":24.0},"isolatedAbsoluteRenderBounds":{"x":-769.452026367188,"y":2208.1298828125,"width":133.182189941406,"height":15.7861328125},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,20.0]],"size":{"x":136.0,"y":24.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":1.0,"g":1.0,"b":1.0,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"OUTSIDE","strokes":[],"strokeWeight":3.21430063247681,"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"characterStyleOverrides":[],"characters":"Immigration Law","lineIndentations":[0],"lineTypes":["NONE"],"listStartOffsets":[],"lineStyleOverrides":[0],"lineTextDirections":null,"resolvedParagraphValues":{"0":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":0.0}},"textAutoResize":"WIDTH_AND_HEIGHT","style":{"styleIdForText":"StyleId:4:749","fontFamily":"Geist","fontPostScriptName":"Geist-Medium","fontStyle":"Medium","textAutoResize":"WIDTH_AND_HEIGHT","fontVariantPosition":"NORMAL","fontSize":18.0,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","letterSpacing":-0.36,"letterSpacingValue":-2.0,"letterSpacingUnit":"PERCENT","lineHeightPx":24.3000011444092,"lineHeightPercent":103.846160888672,"lineHeightPercentFontSize":135.0,"lineHeightUnit":"FONT_SIZE_%","paragraphSpacing":0,"paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecoration":"NONE","textDecorationSkipInk":false,"textDecorationStyle":"solid","textTruncation":"DISABLED"},"styleOverrideTable":{}},"2281:545":{"type":"TEXT","id":"2281:545","name":"Rich text/Header 4","absoluteBoundingBox":{"x":0.0,"y":0.0,"width":32.0,"height":34.0},"isolatedAbsoluteRenderBounds":{"x":0.588068187236786,"y":8.54545402526855,"width":29.0839786529541,"height":22.6363639831543},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,0.0]],"size":{"x":32.0,"y":34.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":0.0,"g":0.0,"b":0.0,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"INSIDE","strokes":[],"strokeWeight":0.0,"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"characterStyleOverrides":[],"characters":"Ag","lineIndentations":[0],"lineTypes":["NONE"],"listStartOffsets":[],"lineStyleOverrides":[0],"lineTextDirections":null,"resolvedParagraphValues":{"0":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":0.0}},"textAutoResize":"WIDTH_AND_HEIGHT","style":{"fontFamily":"Inter","fontPostScriptName":null,"fontStyle":"Semi Bold","textAutoResize":"WIDTH_AND_HEIGHT","fontVariantPosition":"NORMAL","fontSize":24.0,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","letterSpacing":-0.72,"letterSpacingValue":-3.0,"letterSpacingUnit":"PERCENT","lineHeightPx":33.5999984741211,"lineHeightPercent":115.680755615234,"lineHeightPercentFontSize":140.0,"lineHeightUnit":"FONT_SIZE_%","paragraphSpacing":0,"paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecoration":"NONE","textDecorationSkipInk":false,"textDecorationStyle":"solid","textTruncation":"DISABLED"},"styleOverrideTable":{}},"8:2140":{"type":"TEXT","id":"8:2140","name":"Criminal Defense","absoluteBoundingBox":{"x":-771.0,"y":2203.0,"width":139.0,"height":24.0},"isolatedAbsoluteRenderBounds":{"x":-770.2080078125,"y":2207.93188476562,"width":137.418090820312,"height":13.356201171875},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,20.0]],"size":{"x":139.0,"y":24.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":1.0,"g":1.0,"b":1.0,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"OUTSIDE","strokes":[],"strokeWeight":3.21430063247681,"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"characterStyleOverrides":[],"characters":"Criminal Defense","lineIndentations":[0],"lineTypes":["NONE"],"listStartOffsets":[],"lineStyleOverrides":[0],"lineTextDirections":null,"resolvedParagraphValues":{"0":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":0.0}},"textAutoResize":"WIDTH_AND_HEIGHT","style":{"styleIdForText":"StyleId:4:749","fontFamily":"Geist","fontPostScriptName":"Geist-Medium","fontStyle":"Medium","textAutoResize":"WIDTH_AND_HEIGHT","fontVariantPosition":"NORMAL","fontSize":18.0,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","letterSpacing":-0.36,"letterSpacingValue":-2.0,"letterSpacingUnit":"PERCENT","lineHeightPx":24.3000011444092,"lineHeightPercent":103.846160888672,"lineHeightPercentFontSize":135.0,"lineHeightUnit":"FONT_SIZE_%","paragraphSpacing":0,"paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecoration":"NONE","textDecorationSkipInk":false,"textDecorationStyle":"solid","textTruncation":"DISABLED"},"styleOverrideTable":{}},"2133:3196":{"type":"TEXT","id":"2133:3196","name":"확장중인 브레인에이블 전국 네트워크","absoluteBoundingBox":{"x":-588.0,"y":1050.0,"width":103.0,"height":111.0},"isolatedAbsoluteRenderBounds":{"x":-582.606567382812,"y":1052.82604980469,"width":91.1139831542969,"height":42.031982421875},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,160.0]],"size":{"x":103.0,"y":111.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":1.0,"g":1.0,"b":1.0,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"OUTSIDE","strokes":[],"strokeWeight":3.21430063247681,"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"characterStyleOverrides":[],"characters":"확장중인\n브레인에이블 전국 네트워크","lineIndentations":[0,0],"lineTypes":["NONE","NONE"],"listStartOffsets":[],"lineStyleOverrides":[0,0],"lineTextDirections":null,"resolvedParagraphValues":{"0":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":0.0},"1":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":0.0}},"textAlignHorizontal":"CENTER","style":{"styleIdForText":"StyleId:1b867025d508444d7eca72483d3d5dc7e3b969bc/67:428","fontFamily":"Noto Sans KR","fontPostScriptName":"NotoSansKR-Regular","fontStyle":"Regular","fontVariantPosition":"NORMAL","fontSize":11.0,"textAlignHorizontal":"CENTER","textAlignVertical":"TOP","letterSpacing":1.1,"letterSpacingValue":10.0,"letterSpacingUnit":"PERCENT","lineHeightPx":15.7299995422363,"lineHeightPercent":119.166664123535,"lineHeightPercentFontSize":143.0,"lineHeightUnit":"FONT_SIZE_%","paragraphSpacing":0,"paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecoration":"NONE","textDecorationSkipInk":false,"textDecorationStyle":"solid","textAutoResize":"NONE","textTruncation":"DISABLED"},"styleOverrideTable":{}},"2715:1069":{"type":"FRAME","id":"2715:1069","name":"Header 1","absoluteBoundingBox":{"x":-786.0,"y":-135.0,"width":277.0,"height":382.0},"isolatedAbsoluteRenderBounds":{"x":-786.0,"y":-135.0,"width":277.0,"height":382.0},"relativeTransform":[[1.0,0.0,44.0],[0.0,1.0,24.0]],"size":{"x":277.0,"y":382.0},"fills":[],"strokeAlign":"INSIDE","strokes":[],"accessibleHTMLTag":"HEADER","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"paddingTop":24.0,"paddingRight":33.0,"paddingBottom":24.0,"paddingLeft":33.0,"layoutMode":"VERTICAL","itemSpacing":16.0,"counterAxisAlignItems":"CENTER","children":["2715:1070","2715:1071"]},"8:2137":{"type":"TEXT","id":"8:2137","name":"지속적인 확장","absoluteBoundingBox":{"x":-771.0,"y":2023.0,"width":127.0,"height":27.0},"isolatedAbsoluteRenderBounds":{"x":-770.340026855469,"y":2028.09997558594,"width":125.703491210938,"height":18.6800537109375},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,20.0]],"size":{"x":127.0,"y":27.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":1.0,"g":1.0,"b":1.0,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"OUTSIDE","strokes":[],"strokeWeight":3.21430063247681,"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"characterStyleOverrides":[],"characters":"지속적인 확장","lineIndentations":[0],"lineTypes":["NONE"],"listStartOffsets":[],"lineStyleOverrides":[0],"lineTextDirections":null,"resolvedParagraphValues":{"0":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":0.0}},"textAutoResize":"WIDTH_AND_HEIGHT","style":{"fontFamily":"Noto Sans KR","fontPostScriptName":"NotoSansKR-Bold","fontStyle":"Bold","textAutoResize":"WIDTH_AND_HEIGHT","fontVariantPosition":"NORMAL","fontSize":20.0,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","letterSpacing":2.0,"letterSpacingValue":10.0,"letterSpacingUnit":"PERCENT","lineHeightPx":27.0,"lineHeightPercent":112.499992370605,"lineHeightPercentFontSize":135.0,"lineHeightUnit":"FONT_SIZE_%","paragraphSpacing":0,"paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecoration":"NONE","textDecorationSkipInk":false,"textDecorationStyle":"solid","textTruncation":"DISABLED"},"styleOverrideTable":{}},"8:1941":{"type":"TEXT","id":"8:1941","name":"20+","absoluteBoundingBox":{"x":-675.0,"y":723.0,"width":183.0,"height":80.0},"isolatedAbsoluteRenderBounds":{"x":-671.807983398438,"y":734.0,"width":132.268493652344,"height":64.176025390625},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,0.0]],"size":{"x":183.0,"y":80.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":1.0,"g":1.0,"b":1.0,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"OUTSIDE","layoutAlign":"STRETCH","strokes":[],"strokeWeight":3.21430063247681,"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"characterStyleOverrides":[],"characters":"20+","lineIndentations":[0],"lineTypes":["NONE"],"listStartOffsets":[],"lineStyleOverrides":[0],"lineTextDirections":null,"resolvedParagraphValues":{"0":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":0.0}},"textAutoResize":"HEIGHT","style":{"styleIdForText":"StyleId:2:721","fontFamily":"Noto Sans KR","fontPostScriptName":"NotoSansKR-Medium","fontStyle":"Medium","textAutoResize":"HEIGHT","responsiveTextStyleVariants":[{"minWidth":1280.0,"name":"Desktop","style":{"styleIdForText":"StyleId:2:721","fontSize":120.0,"letterSpacing":-3.6,"letterSpacingValue":-3.0,"letterSpacingUnit":"PERCENT","lineHeightPx":114.0,"lineHeightPercent":81.0666656494141,"lineHeightPercentFontSize":95.0,"lineHeightUnit":"FONT_SIZE_%"}},{"minWidth":800.0,"name":"Tablet","style":{"styleIdForText":"StyleId:2:721","fontSize":84.0,"letterSpacing":-2.52,"letterSpacingValue":-3.0,"letterSpacingUnit":"PERCENT","lineHeightPx":79.7999954223633,"lineHeightPercent":81.0666656494141,"lineHeightPercentFontSize":95.0,"lineHeightUnit":"FONT_SIZE_%"}},{"minWidth":1.0,"name":"Mobile","style":{"styleIdForText":"StyleId:2:721","fontSize":84.0,"letterSpacing":-2.52,"letterSpacingValue":-3.0,"letterSpacingUnit":"PERCENT","lineHeightPx":79.7999954223633,"lineHeightPercent":81.0666656494141,"lineHeightPercentFontSize":95.0,"lineHeightUnit":"FONT_SIZE_%"}}],"fontVariantPosition":"NORMAL","fontSize":84.0,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","letterSpacing":-2.52,"letterSpacingValue":-3.0,"letterSpacingUnit":"PERCENT","lineHeightPx":79.7999954223633,"lineHeightPercent":79.1666641235352,"lineHeightPercentFontSize":95.0,"lineHeightUnit":"FONT_SIZE_%","paragraphSpacing":0,"paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecoration":"NONE","textDecorationSkipInk":false,"textDecorationStyle":"solid","textTruncation":"DISABLED"},"styleOverrideTable":{}},"8:2133":{"type":"FRAME","id":"8:2133","name":"Service 2","absoluteBoundingBox":{"x":-771.0,"y":1751.0,"width":1112.0,"height":232.0},"isolatedAbsoluteRenderBounds":{"x":-771.0,"y":1751.0,"width":1112.0,"height":232.0},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,180.0]],"size":{"x":1112.0,"y":232.0},"fills":[],"strokeAlign":"INSIDE","strokes":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":1.0,"g":1.0,"b":1.0,"a":1.0},"visible":true,"opacity":1.0}],"individualStrokeWeights":{"top":0.5,"right":0.0,"bottom":0.0,"left":0.0},"accessibleHTMLTag":"SECTION","isDecorativeImage":false,"accessibleLabel":"Specific areas of litigation and dispute resolution that we help with","ariaAttributes":{},"interactions":[],"behaviors":{"appear":{"otherLayer":{"sessionID":-1,"localID":-1},"trigger":"THIS_LAYER_IN_VIEW","direction":"UP","enterTransition":{"easingType":"OUT_CUBIC","easingFunction":[0.215000003576279,0.610000014305115,0.354999989271164,1.0],"transitionDuration":0.800000011920929,"delay":0.0},"enterState":{"transform":{"m00":1.0,"m01":0.0,"m02":0.0,"m10":0.0,"m11":1.0,"m12":0.0},"opacity":0.0},"exitTransition":{"easingType":"OUT_CUBIC","easingFunction":[0.215000003576279,0.610000014305115,0.354999989271164,1.0],"transitionDuration":0.600000023841858,"delay":0.0},"exitState":{"transform":{"m00":1.0,"m01":0.0,"m02":0.0,"m10":0.0,"m11":1.0,"m12":0.0},"opacity":1.0},"playsOnce":false,"behaviorType":"appear"}},"paddingTop":20.0,"paddingBottom":20.0,"layoutMode":"HORIZONTAL","itemSpacing":266.0,"counterAxisSizingMode":"FIXED","children":["8:2134","8:2135"]},"8:2131":{"type":"TEXT","id":"8:2131","name":"독자적인 연구개발","absoluteBoundingBox":{"x":-771.0,"y":1591.0,"width":134.0,"height":24.0},"isolatedAbsoluteRenderBounds":{"x":-770.171997070312,"y":1594.02404785156,"width":132.563110351562,"height":16.5599365234375},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,20.0]],"size":{"x":134.0,"y":24.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":1.0,"g":1.0,"b":1.0,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"OUTSIDE","strokes":[],"strokeWeight":3.21430063247681,"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"characterStyleOverrides":[],"characters":"독자적인 연구개발","lineIndentations":[0],"lineTypes":["NONE"],"listStartOffsets":[],"lineStyleOverrides":[0],"lineTextDirections":null,"resolvedParagraphValues":{"0":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":0.0}},"textAutoResize":"WIDTH_AND_HEIGHT","style":{"styleIdForText":"StyleId:4:749","fontFamily":"Geist","fontPostScriptName":"Geist-Medium","fontStyle":"Medium","textAutoResize":"WIDTH_AND_HEIGHT","fontVariantPosition":"NORMAL","fontSize":18.0,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","letterSpacing":-0.36,"letterSpacingValue":-2.0,"letterSpacingUnit":"PERCENT","lineHeightPx":24.3000011444092,"lineHeightPercent":103.846160888672,"lineHeightPercentFontSize":135.0,"lineHeightUnit":"FONT_SIZE_%","paragraphSpacing":0,"paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecoration":"NONE","textDecorationSkipInk":false,"textDecorationStyle":"solid","textTruncation":"DISABLED"},"styleOverrideTable":{}},"2715:1053":{"type":"RECTANGLE","id":"2715:1053","name":"Logo","absoluteBoundingBox":{"x":-771.0,"y":-135.0,"width":211.0,"height":75.0},"isolatedAbsoluteRenderBounds":{"x":-771.0,"y":-135.0,"width":211.0,"height":75.0},"relativeTransform":[[1.0,0.0,64.0],[0.0,1.0,24.0]],"size":{"x":211.0,"y":75.0},"fills":[{"blendMode":"NORMAL","type":"IMAGE","scaleMode":"FILL","imageRef":"64270238d3de4edd07597c9179b36856b5a53af3","originalImageWidth":1400,"originalImageHeight":1167,"visible":true,"opacity":1.0,"rotation":0.0}],"strokeAlign":"INSIDE","strokes":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"accessibleLabel":"Logomark","ariaAttributes":{},"interactions":[{"id":{"sessionID":2608,"localID":4807},"event":{"interactionType":"ON_CLICK"},"actions":[{"transitionNodeID":{"sessionID":0,"localID":3},"connectionType":"INTERNAL_NODE","navigationType":"NAVIGATE","connectionURL":"/"}],"isDeleted":false,"stateManagementVersion":1}]},"8:2128":{"type":"TEXT","id":"8:2128","name":"Navigating Complex Legal Landscapes?  We Can Help.","absoluteBoundingBox":{"x":-771.0,"y":1421.0,"width":672.0,"height":70.0},"isolatedAbsoluteRenderBounds":{"x":-769.783996582031,"y":1426.76794433594,"width":527.451477050781,"height":63.0321044921875},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,150.0]],"size":{"x":672.0,"y":70.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":1.0,"g":1.0,"b":1.0,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"OUTSIDE","layoutAlign":"STRETCH","strokes":[],"strokeWeight":3.21430063247681,"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"characterStyleOverrides":[],"characters":"Navigating Complex Legal Landscapes?  We Can Help.","lineIndentations":[0],"lineTypes":["NONE"],"listStartOffsets":[],"lineStyleOverrides":[0],"lineTextDirections":null,"resolvedParagraphValues":{"0":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":0.0}},"textAutoResize":"HEIGHT","style":{"styleIdForText":"StyleId:4:748","fontFamily":"Geist","fontPostScriptName":"Geist-Regular","fontStyle":"Regular","textAutoResize":"HEIGHT","responsiveTextStyleVariants":[{"minWidth":1280.0,"name":"Desktop","style":{"styleIdForText":"StyleId:4:748","fontSize":32.0,"letterSpacing":-1.6,"letterSpacingValue":-5.0,"letterSpacingUnit":"PERCENT","lineHeightPx":34.8800010681152,"lineHeightPercent":93.0133361816406,"lineHeightPercentFontSize":109.0,"lineHeightUnit":"FONT_SIZE_%"}},{"minWidth":800.0,"name":"Tablet","style":{"styleIdForText":"StyleId:4:748","fontSize":32.0,"letterSpacing":-1.6,"letterSpacingValue":-5.0,"letterSpacingUnit":"PERCENT","lineHeightPx":34.8800010681152,"lineHeightPercent":93.0133361816406,"lineHeightPercentFontSize":109.0,"lineHeightUnit":"FONT_SIZE_%"}},{"minWidth":1.0,"name":"Mobile","style":{"styleIdForText":"StyleId:4:748","fontSize":22.0,"letterSpacing":-1.1,"letterSpacingValue":-5.0,"letterSpacingUnit":"PERCENT","lineHeightPx":23.980001449585,"lineHeightPercent":93.0133361816406,"lineHeightPercentFontSize":109.0,"lineHeightUnit":"FONT_SIZE_%"}}],"fontVariantPosition":"NORMAL","fontSize":32.0,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","letterSpacing":-1.6,"letterSpacingValue":-5.0,"letterSpacingUnit":"PERCENT","lineHeightPx":34.8800010681152,"lineHeightPercent":83.8461532592773,"lineHeightPercentFontSize":109.0,"lineHeightUnit":"FONT_SIZE_%","paragraphSpacing":0,"paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecoration":"NONE","textDecorationSkipInk":false,"textDecorationStyle":"solid","textTruncation":"DISABLED"},"styleOverrideTable":{}},"2577:673":{"type":"TEXT","id":"2577:673","name":"Text sm / Regular","absoluteBoundingBox":{"x":0.0,"y":0.0,"width":54.0,"height":20.0},"isolatedAbsoluteRenderBounds":{"x":0.0,"y":0.0,"width":54.0,"height":20.0},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,0.0]],"size":{"x":54.0,"y":20.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":0.0,"g":0.0,"b":0.0,"a":1.0},"visible":true,"opacity":1.0}],"visible":false,"strokeAlign":"INSIDE","strokes":[],"strokeWeight":0.0,"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"characterStyleOverrides":[],"characters":"Rag 123","lineIndentations":[0],"lineTypes":["NONE"],"listStartOffsets":[],"lineStyleOverrides":[0],"lineTextDirections":null,"resolvedParagraphValues":{"0":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":14.0}},"textAutoResize":"WIDTH_AND_HEIGHT","paragraphSpacing":14.0,"style":{"fontFamily":"Inter","fontPostScriptName":null,"fontStyle":"Regular","paragraphSpacing":14.0,"textAutoResize":"WIDTH_AND_HEIGHT","fontVariantPosition":"NORMAL","fontSize":14.0,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","letterSpacing":0.0,"letterSpacingValue":0.0,"letterSpacingUnit":"PERCENT","lineHeightPx":20.0,"lineHeightPercent":118.04158782959,"lineHeightPercentFontSize":142.857147216797,"lineHeightUnit":"PIXELS","paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecoration":"NONE","textDecorationSkipInk":false,"textDecorationStyle":"solid","textTruncation":"DISABLED"},"styleOverrideTable":{}},"2715:1059":{"type":"TEXT","id":"2715:1059","name":"센터소개","absoluteBoundingBox":{"x":-158.0,"y":-109.0,"width":59.0,"height":23.0},"isolatedAbsoluteRenderBounds":{"x":-157.817504882812,"y":-105.312004089355,"width":58.6362533569336,"height":16.5120010375977},"relativeTransform":[[1.0,0.0,353.0],[0.0,1.0,0.0]],"size":{"x":59.0,"y":23.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":0.443900465965271,"g":0.442026853561401,"b":0.442026853561401,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"OUTSIDE","strokes":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"characterStyleOverrides":[],"characters":"센터소개","lineIndentations":[0],"lineTypes":["NONE"],"listStartOffsets":[],"lineStyleOverrides":[0],"lineTextDirections":null,"resolvedParagraphValues":{"0":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":16.0}},"textAutoResize":"WIDTH_AND_HEIGHT","textAlignHorizontal":"CENTER","textAlignVertical":"CENTER","paragraphSpacing":16.0,"fallbackFonts":[{"fontFamily":"Noto Sans KR","fontStyle":"Medium"}],"style":{"fontFamily":"Inter","fontPostScriptName":"Inter-Medium","fontStyle":"Medium","fallbackFonts":[{"fontFamily":"Noto Sans KR","fontStyle":"Medium"}],"hyperlink":{"type":"NODE","nodeID":"/센터소개"},"paragraphSpacing":16.0,"textAutoResize":"WIDTH_AND_HEIGHT","fontVariantPosition":"NORMAL","textDecoration":"UNDERLINE","textDecorationSkipInk":true,"fontSize":16.0,"textAlignHorizontal":"CENTER","textAlignVertical":"CENTER","letterSpacing":-0.08,"letterSpacingValue":-0.5,"letterSpacingUnit":"PERCENT","lineHeightPx":23.2000007629395,"lineHeightPercent":119.812210083008,"lineHeightPercentFontSize":145.0,"lineHeightUnit":"FONT_SIZE_%","paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecorationStyle":"solid","textTruncation":"DISABLED"},"styleOverrideTable":{}},"91:301":{"type":"TEXT","id":"91:301","name":"INNOVATION SYSTEM OF BRAINABLE 브레인에이블만의 혁신 시스템","absoluteBoundingBox":{"x":-771.0,"y":1271.0,"width":980.0,"height":70.0},"isolatedAbsoluteRenderBounds":{"x":-769.400024414062,"y":1276.76794433594,"width":494.690795898438,"height":60.760009765625},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,0.0]],"size":{"x":980.0,"y":70.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":1.0,"g":1.0,"b":1.0,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"OUTSIDE","strokes":[],"strokeWeight":3.21430063247681,"accessibleHTMLTag":"H2","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"characterStyleOverrides":[],"characters":"INNOVATION SYSTEM OF BRAINABLE\n브레인에이블만의 혁신 시스템","lineIndentations":[0,0],"lineTypes":["NONE","NONE"],"listStartOffsets":[],"lineStyleOverrides":[0,0],"lineTextDirections":null,"resolvedParagraphValues":{"0":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":0.0},"1":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":0.0}},"textAutoResize":"HEIGHT","fallbackFonts":[{"fontFamily":"Noto Sans KR","fontStyle":"Regular"}],"style":{"fontFamily":"Geist","fontPostScriptName":"Geist-Regular","fontStyle":"Regular","fallbackFonts":[{"fontFamily":"Noto Sans KR","fontStyle":"Regular"}],"textAutoResize":"HEIGHT","fontVariantPosition":"NORMAL","fontSize":32.0,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","letterSpacing":-1.6,"letterSpacingValue":-5.0,"letterSpacingUnit":"PERCENT","lineHeightPx":34.8800010681152,"lineHeightPercent":83.8461532592773,"lineHeightPercentFontSize":109.0,"lineHeightUnit":"FONT_SIZE_%","paragraphSpacing":0,"paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecoration":"NONE","textDecorationSkipInk":false,"textDecorationStyle":"solid","textTruncation":"DISABLED"},"styleOverrideTable":{}},"2224:2922":{"type":"TEXT","id":"2224:2922","name":"서울특별시 서초구 마방로 6길 28, 5층 502호","absoluteBoundingBox":{"x":-580.0,"y":3229.0,"width":255.0,"height":66.0},"isolatedAbsoluteRenderBounds":{"x":-579.552001953125,"y":3232.80004882812,"width":220.162750244141,"height":36.384033203125},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,0.0]],"size":{"x":255.0,"y":66.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":0.0,"g":0.0,"b":0.0,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"OUTSIDE","strokes":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"behaviors":{"hover":{"transition":{"easingType":"OUT_CUBIC","easingFunction":[0.215000003576279,0.610000014305115,0.354999989271164,1.0],"transitionDuration":0.300000011920929,"delay":0.0},"state":{"transform":{"m00":1.0,"m01":0.0,"m02":0.0,"m10":0.0,"m11":1.0,"m12":0.0},"opacity":0.699999988079071},"behaviorType":"hover"}},"characterStyleOverrides":[],"characters":"서울특별시 서초구 마방로 6길 28, \n5층 502호\n","lineIndentations":[0,0,0],"lineTypes":["NONE","NONE","NONE"],"listStartOffsets":[],"lineStyleOverrides":[0,0,0],"lineTextDirections":null,"resolvedParagraphValues":{"0":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":0.0},"1":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":0.0},"2":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":0.0}},"textAutoResize":"HEIGHT","style":{"fontFamily":"Noto Sans KR","fontPostScriptName":"NotoSansKR-DemiLight","fontStyle":"DemiLight","textAutoResize":"HEIGHT","fontVariantPosition":"NORMAL","fontSize":16.0,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","letterSpacing":0.0,"letterSpacingValue":0.0,"letterSpacingUnit":"PERCENT","lineHeightPx":22.3999996185303,"lineHeightPercent":116.666664123535,"lineHeightPercentFontSize":140.0,"lineHeightUnit":"FONT_SIZE_%","paragraphSpacing":0,"paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecoration":"NONE","textDecorationSkipInk":false,"textDecorationStyle":"solid","textTruncation":"DISABLED"},"styleOverrideTable":{}},"8:1963":{"type":"FRAME","id":"8:1963","name":"Stats section","absoluteBoundingBox":{"x":-835.0,"y":591.0,"width":800.0,"height":533.0},"isolatedAbsoluteRenderBounds":{"x":-835.0,"y":591.0,"width":800.0,"height":533.0},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,0.0]],"size":{"x":800.0,"y":533.0},"fills":[{"blendMode":"NORMAL","type":"VIDEO","scaleMode":"FILL","imageRef":"0f70eb3d7d45e5313949ca2a9d7e198f47ae7f5c","originalImageWidth":1920,"originalImageHeight":1080,"videoRef":"bce5b26506a58716a00e2309e004bf4a70c9b341","visible":true,"opacity":1.0,"autoplay":true,"mediaLoop":true,"muted":true,"showControls":false},{"opacity":0.200000002980232,"blendMode":"NORMAL","type":"SOLID","color":{"r":0.0,"g":0.0,"b":0.0,"a":1.0},"visible":true}],"strokeAlign":"INSIDE","layoutAlign":"STRETCH","strokes":[],"accessibleHTMLTag":"SECTION","isDecorativeImage":false,"accessibleLabel":"Statistics about John and Brown Legal","ariaAttributes":{},"interactions":[],"paddingTop":96.0,"paddingRight":160.0,"paddingBottom":96.0,"paddingLeft":160.0,"layoutMode":"VERTICAL","itemSpacing":10.0,"counterAxisAlignItems":"CENTER","primaryAxisSizingMode":"FIXED","counterAxisSizingMode":"FIXED","children":["2133:3204","8:1939"]},"8:1939":{"type":"FRAME","id":"8:1939","name":"Stats content","absoluteBoundingBox":{"x":-675.0,"y":723.0,"width":480.0,"height":311.0},"isolatedAbsoluteRenderBounds":{"x":-675.0,"y":723.0,"width":480.0,"height":311.0},"relativeTransform":[[1.0,0.0,160.0],[0.0,1.0,132.0]],"size":{"x":480.0,"y":311.0},"fills":[],"strokeAlign":"INSIDE","layoutAlign":"STRETCH","maxWidth":1180.0,"strokes":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"layoutMode":"HORIZONTAL","itemSpacing":32.0,"primaryAxisSizingMode":"FIXED","children":["8:1940","8:1946"]},"2224:2887":{"type":"TEXT","id":"2224:2887","name":"hello@brainable.co.kr","absoluteBoundingBox":{"x":-2036.0,"y":4275.0,"width":255.0,"height":20.0},"isolatedAbsoluteRenderBounds":{"x":-2036.0,"y":4275.0,"width":255.0,"height":20.0},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,0.0]],"size":{"x":255.0,"y":20.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":0.0,"g":0.0,"b":0.0,"a":1.0},"visible":true,"opacity":1.0}],"visible":false,"strokeAlign":"OUTSIDE","strokes":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"behaviors":{"hover":{"transition":{"easingType":"OUT_CUBIC","easingFunction":[0.215000003576279,0.610000014305115,0.354999989271164,1.0],"transitionDuration":0.300000011920929,"delay":0.0},"state":{"transform":{"m00":1.0,"m01":0.0,"m02":0.0,"m10":0.0,"m11":1.0,"m12":0.0},"opacity":0.699999988079071},"behaviorType":"hover"}},"characterStyleOverrides":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1],"characters":"hello@brainable.co.kr","lineIndentations":[0],"lineTypes":["NONE"],"listStartOffsets":[],"lineStyleOverrides":[0],"lineTextDirections":null,"resolvedParagraphValues":{"0":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":0.0}},"textAutoResize":"HEIGHT","style":{"styleIdForText":"StyleId:6:1356","fontFamily":"Geist","fontPostScriptName":"Geist-Regular","fontStyle":"Regular","hyperlink":{"type":"URL","url":"mailto:hello@figma.com","openInNewTab":true},"textAutoResize":"HEIGHT","responsiveTextStyleVariants":[{"minWidth":1280.0,"name":"Desktop","style":{"styleIdForText":"StyleId:6:1356","fontSize":14.0,"letterSpacing":0.0,"letterSpacingValue":0.0,"letterSpacingUnit":"PERCENT","lineHeightPx":19.6000003814697,"lineHeightPercent":119.466667175293,"lineHeightPercentFontSize":140.0,"lineHeightUnit":"FONT_SIZE_%"}},{"minWidth":800.0,"name":"Tablet","style":{"styleIdForText":"StyleId:6:1356","fontSize":14.0,"letterSpacing":0.0,"letterSpacingValue":0.0,"letterSpacingUnit":"PERCENT","lineHeightPx":19.6000003814697,"lineHeightPercent":119.466667175293,"lineHeightPercentFontSize":140.0,"lineHeightUnit":"FONT_SIZE_%"}},{"minWidth":0.0,"name":"Mobile","style":{"styleIdForText":"StyleId:6:1356","fontSize":14.0,"letterSpacing":0.0,"letterSpacingValue":0.0,"letterSpacingUnit":"PERCENT","lineHeightPx":19.6000003814697,"lineHeightPercent":119.466667175293,"lineHeightPercentFontSize":140.0,"lineHeightUnit":"FONT_SIZE_%"}}],"fontVariantPosition":"NORMAL","fontSize":14.0,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","letterSpacing":0.0,"letterSpacingValue":0.0,"letterSpacingUnit":"PERCENT","lineHeightPx":19.6000003814697,"lineHeightPercent":107.692314147949,"lineHeightPercentFontSize":140.0,"lineHeightUnit":"FONT_SIZE_%","paragraphSpacing":0,"paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecoration":"NONE","textDecorationSkipInk":false,"textDecorationStyle":"solid","textTruncation":"DISABLED"},"styleOverrideTable":{"1":{"styleIdForText":"StyleId:6:1356","paragraphSpacing":0,"paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecoration":"NONE","textDecorationSkipInk":false,"textDecorationStyle":"solid","textAutoResize":"NONE","textTruncation":"DISABLED","lineHeightPercent":100,"lineHeightPercentFontSize":100}}},"2133:3195":{"type":"TEXT","id":"2133:3195","name":"확장중인 브레인에이블 전국 네트워크","absoluteBoundingBox":{"x":-460.0,"y":939.0,"width":272.0,"height":95.0},"isolatedAbsoluteRenderBounds":{"x":-425.490631103516,"y":943.656005859375,"width":202.934494018555,"height":37.6079711914062},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,216.0]],"size":{"x":272.0,"y":95.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":1.0,"g":1.0,"b":1.0,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"OUTSIDE","strokes":[],"strokeWeight":3.21430063247681,"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"characterStyleOverrides":[],"characters":"확장중인\n브레인에이블 전국 네트워크","lineIndentations":[0,0],"lineTypes":["NONE","NONE"],"listStartOffsets":[],"lineStyleOverrides":[0,0],"lineTextDirections":null,"resolvedParagraphValues":{"0":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":0.0},"1":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":0.0}},"textAlignHorizontal":"CENTER","style":{"styleIdForText":"StyleId:1b867025d508444d7eca72483d3d5dc7e3b969bc/67:428","fontFamily":"Noto Sans KR","fontPostScriptName":"NotoSansKR-Regular","fontStyle":"Regular","fontVariantPosition":"NORMAL","fontSize":16.0,"textAlignHorizontal":"CENTER","textAlignVertical":"TOP","letterSpacing":1.6,"letterSpacingValue":10.0,"letterSpacingUnit":"PERCENT","lineHeightPx":22.8799991607666,"lineHeightPercent":119.166664123535,"lineHeightPercentFontSize":143.0,"lineHeightUnit":"FONT_SIZE_%","paragraphSpacing":0,"paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecoration":"NONE","textDecorationSkipInk":false,"textDecorationStyle":"solid","textAutoResize":"NONE","textTruncation":"DISABLED"},"styleOverrideTable":{}},"8:1949":{"type":"FRAME","id":"8:1949","name":"Stats content","absoluteBoundingBox":{"x":-804.0,"y":890.0,"width":313.0,"height":247.0},"isolatedAbsoluteRenderBounds":{"x":-804.0,"y":890.0,"width":323.0,"height":247.0},"relativeTransform":[[1.0,0.0,31.0],[0.0,1.0,68.0]],"size":{"x":313.0,"y":247.0},"fills":[],"strokeAlign":"INSIDE","maxWidth":1180.0,"strokes":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"layoutMode":"HORIZONTAL","itemSpacing":105.0,"primaryAxisSizingMode":"FIXED","counterAxisSizingMode":"FIXED","children":["8:1950","8:1956"]},"8:1947":{"type":"TEXT","id":"8:1947","name":"50 +","absoluteBoundingBox":{"x":-460.0,"y":723.0,"width":213.0,"height":160.0},"isolatedAbsoluteRenderBounds":{"x":-397.878265380859,"y":734.0,"width":87.0502624511719,"height":133.507995605469},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,0.0]],"size":{"x":213.0,"y":160.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":1.0,"g":1.0,"b":1.0,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"OUTSIDE","layoutAlign":"STRETCH","strokes":[],"strokeWeight":3.21430063247681,"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"characterStyleOverrides":[],"characters":"50\n+","lineIndentations":[0,0],"lineTypes":["NONE","NONE"],"listStartOffsets":[],"lineStyleOverrides":[0,0],"lineTextDirections":null,"resolvedParagraphValues":{"0":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":0.0},"1":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":0.0}},"textAutoResize":"HEIGHT","textAlignHorizontal":"CENTER","style":{"styleIdForText":"StyleId:2:721","fontFamily":"Noto Sans KR","fontPostScriptName":"NotoSansKR-Medium","fontStyle":"Medium","textAutoResize":"HEIGHT","responsiveTextStyleVariants":[{"minWidth":1280.0,"name":"Desktop","style":{"styleIdForText":"StyleId:2:721","fontSize":120.0,"letterSpacing":-3.6,"letterSpacingValue":-3.0,"letterSpacingUnit":"PERCENT","lineHeightPx":114.0,"lineHeightPercent":81.0666656494141,"lineHeightPercentFontSize":95.0,"lineHeightUnit":"FONT_SIZE_%"}},{"minWidth":800.0,"name":"Tablet","style":{"styleIdForText":"StyleId:2:721","fontSize":84.0,"letterSpacing":-2.52,"letterSpacingValue":-3.0,"letterSpacingUnit":"PERCENT","lineHeightPx":79.7999954223633,"lineHeightPercent":81.0666656494141,"lineHeightPercentFontSize":95.0,"lineHeightUnit":"FONT_SIZE_%"}},{"minWidth":1.0,"name":"Mobile","style":{"styleIdForText":"StyleId:2:721","fontSize":84.0,"letterSpacing":-2.52,"letterSpacingValue":-3.0,"letterSpacingUnit":"PERCENT","lineHeightPx":79.7999954223633,"lineHeightPercent":81.0666656494141,"lineHeightPercentFontSize":95.0,"lineHeightUnit":"FONT_SIZE_%"}}],"fontVariantPosition":"NORMAL","fontSize":84.0,"textAlignHorizontal":"CENTER","textAlignVertical":"TOP","letterSpacing":-2.52,"letterSpacingValue":-3.0,"letterSpacingUnit":"PERCENT","lineHeightPx":79.7999954223633,"lineHeightPercent":79.1666641235352,"lineHeightPercentFontSize":95.0,"lineHeightUnit":"FONT_SIZE_%","paragraphSpacing":0,"paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecoration":"NONE","textDecorationSkipInk":false,"textDecorationStyle":"solid","textTruncation":"DISABLED"},"styleOverrideTable":{}},"2715:1273":{"type":"FRAME","id":"2715:1273","name":"Nav","absoluteBoundingBox":{"x":-2027.0,"y":-20.0,"width":71.0,"height":243.0},"isolatedAbsoluteRenderBounds":{"x":-2027.0,"y":-20.0,"width":71.0,"height":243.0},"relativeTransform":[[1.0,0.0,103.0],[0.0,1.0,115.0]],"size":{"x":71.0,"y":243.0},"fills":[],"strokeAlign":"INSIDE","strokes":[],"accessibleHTMLTag":"NAV","isDecorativeImage":false,"ariaAttributes":{},"interactions":[{"id":{"sessionID":2608,"localID":1766},"event":{"interactionType":"ON_CLICK"},"actions":[{"transitionNodeID":{"sessionID":6,"localID":1529},"connectionType":"INTERNAL_NODE","navigationType":"NAVIGATE","connectionURL":"/about_us"}],"isDeleted":false,"stateManagementVersion":1}],"layoutMode":"VERTICAL","itemSpacing":32.0,"counterAxisAlignItems":"CENTER","children":["2715:1274","2715:1275","2715:1276","2715:1277","2715:1278"]},"2224:2913":{"type":"RECTANGLE","id":"2224:2913","name":"brainable_logo_ver.001-01 1","absoluteBoundingBox":{"x":-946.0,"y":2856.5,"width":117.0,"height":97.0},"targetAspectRatio":{"x":1400.0,"y":1167.0},"isolatedAbsoluteRenderBounds":{"x":-946.0,"y":2856.5,"width":117.0,"height":97.0},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,14.5]],"size":{"x":117.0,"y":97.0},"fills":[{"blendMode":"NORMAL","type":"IMAGE","scaleMode":"FILL","imageRef":"4f89b370cf29c22c8bfd83ffd6ad48b1dd2cd6af","originalImageWidth":1400,"originalImageHeight":1167,"visible":true,"opacity":1.0,"rotation":0.0}],"strokeAlign":"INSIDE","strokes":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[]},"8:2105":{"type":"FRAME","id":"8:2105","name":"Our services content","absoluteBoundingBox":{"x":-2068.5,"y":1655.5,"width":1069.0,"height":1317.0},"isolatedAbsoluteRenderBounds":{"x":-2068.5,"y":1655.5,"width":1069.0,"height":1317.0},"relativeTransform":[[1.0,0.0,110.5],[0.0,1.0,150.5]],"size":{"x":1069.0,"y":1317.0},"fills":[],"strokeAlign":"INSIDE","maxWidth":1180.0,"strokes":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":1.0,"g":1.0,"b":1.0,"a":1.0},"visible":true,"opacity":1.0}],"individualStrokeWeights":{"top":0.0,"right":0.0,"bottom":0.5,"left":0.0},"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"paddingBottom":221.0,"layoutMode":"VERTICAL","itemSpacing":101.0,"primaryAxisSizingMode":"FIXED","counterAxisSizingMode":"FIXED","children":["91:299","8:2106","8:2107"]},"7:1792":{"type":"FRAME","id":"7:1792","name":"Header section","absoluteBoundingBox":{"x":-835.0,"y":-159.0,"width":800.0,"height":750.0},"isolatedAbsoluteRenderBounds":{"x":-835.0,"y":-159.0,"width":800.0,"height":750.0},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,0.0]],"size":{"x":800.0,"y":750.0},"fills":[{"blendMode":"NORMAL","type":"IMAGE","scaleMode":"FILL","imageRef":"b148c3ce7c808daad98db6f016d6f8fe9e8687ef","originalImageWidth":4096,"originalImageHeight":2731,"visible":true,"opacity":1.0,"rotation":0.0},{"opacity":0.400000005960464,"blendMode":"NORMAL","type":"SOLID","color":{"r":0.0,"g":0.0,"b":0.0,"a":1.0},"visible":true}],"strokeAlign":"INSIDE","layoutAlign":"STRETCH","strokes":[],"accessibleHTMLTag":"HEADER","isDecorativeImage":false,"accessibleLabel":"Close-up photo of a bookshelf with old books.","ariaAttributes":{},"interactions":[],"paddingTop":50.0,"paddingRight":50.0,"paddingBottom":70.0,"paddingLeft":50.0,"layoutMode":"VERTICAL","itemSpacing":10.0,"primaryAxisAlignItems":"MAX","primaryAxisSizingMode":"FIXED","counterAxisSizingMode":"FIXED","children":["7:1793"]},"2224:2993":{"type":"TEXT","id":"2224:2993","name":"hello@brainable.co.kr","absoluteBoundingBox":{"x":-2147.0,"y":3605.5,"width":255.0,"height":20.0},"isolatedAbsoluteRenderBounds":{"x":-2147.0,"y":3605.5,"width":255.0,"height":20.0},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,14.5]],"size":{"x":255.0,"y":20.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":0.0,"g":0.0,"b":0.0,"a":1.0},"visible":true,"opacity":1.0}],"visible":false,"strokeAlign":"OUTSIDE","strokes":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"behaviors":{"hover":{"transition":{"easingType":"OUT_CUBIC","easingFunction":[0.215000003576279,0.610000014305115,0.354999989271164,1.0],"transitionDuration":0.300000011920929,"delay":0.0},"state":{"transform":{"m00":1.0,"m01":0.0,"m02":0.0,"m10":0.0,"m11":1.0,"m12":0.0},"opacity":0.699999988079071},"behaviorType":"hover"}},"characterStyleOverrides":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1],"characters":"hello@brainable.co.kr","lineIndentations":[0],"lineTypes":["NONE"],"listStartOffsets":[],"lineStyleOverrides":[0],"lineTextDirections":null,"resolvedParagraphValues":{"0":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":0.0}},"textAutoResize":"HEIGHT","style":{"styleIdForText":"StyleId:bcc262e16c06dc528ec5203195d6322cbd051b62/6:1102","fontFamily":"Geist","fontPostScriptName":"Geist-Regular","fontStyle":"Regular","hyperlink":{"type":"URL","url":"mailto:hello@figma.com","openInNewTab":true},"textAutoResize":"HEIGHT","fontVariantPosition":"NORMAL","fontSize":14.0,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","letterSpacing":0.0,"letterSpacingValue":0.0,"letterSpacingUnit":"PERCENT","lineHeightPx":19.6000003814697,"lineHeightPercent":107.692314147949,"lineHeightPercentFontSize":140.0,"lineHeightUnit":"FONT_SIZE_%","paragraphSpacing":0,"paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecoration":"NONE","textDecorationSkipInk":false,"textDecorationStyle":"solid","textTruncation":"DISABLED"},"styleOverrideTable":{"1":{"styleIdForText":"StyleId:bcc262e16c06dc528ec5203195d6322cbd051b62/6:1102","paragraphSpacing":0,"paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecoration":"NONE","textDecorationSkipInk":false,"textDecorationStyle":"solid","textAutoResize":"NONE","textTruncation":"DISABLED","lineHeightPercent":100,"lineHeightPercentFontSize":100}}},"119:264":{"type":"FRAME","id":"119:264","name":"Image divider section","absoluteBoundingBox":{"x":-2179.0,"y":3206.0,"width":1280.0,"height":602.0},"isolatedAbsoluteRenderBounds":{"x":-2179.0,"y":3206.0,"width":1280.0,"height":602.0},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,2357.0]],"size":{"x":1280.0,"y":602.0},"fills":[{"blendMode":"NORMAL","type":"IMAGE","scaleMode":"FILL","imageRef":"ba5368df267457e2415636e11f7a59324b623fed","originalImageWidth":4096,"originalImageHeight":2731,"visible":true,"opacity":1.0,"rotation":0.0},{"opacity":0.400000005960464,"blendMode":"NORMAL","type":"SOLID","color":{"r":0.0,"g":0.0,"b":0.0,"a":1.0},"visible":true}],"strokeAlign":"INSIDE","layoutAlign":"STRETCH","strokes":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"accessibleLabel":"Photo of a study hall area with desks and people studying.","ariaAttributes":{},"interactions":[],"behaviors":{"appear":{"otherLayer":{"sessionID":-1,"localID":-1},"trigger":"THIS_LAYER_IN_VIEW","direction":"UP","enterTransition":{"easingType":"OUT_CUBIC","easingFunction":[0.215000003576279,0.610000014305115,0.354999989271164,1.0],"transitionDuration":0.800000011920929,"delay":0.0},"enterState":{"transform":{"m00":1.0,"m01":0.0,"m02":0.0,"m10":0.0,"m11":1.0,"m12":0.0},"opacity":0.0},"exitTransition":{"easingType":"OUT_CUBIC","easingFunction":[0.215000003576279,0.610000014305115,0.354999989271164,1.0],"transitionDuration":0.600000023841858,"delay":0.0},"exitState":{"transform":{"m00":1.0,"m01":0.0,"m02":0.0,"m10":0.0,"m11":1.0,"m12":0.0},"opacity":1.0},"playsOnce":false,"behaviorType":"appear"}},"paddingTop":10.0,"paddingRight":10.0,"paddingBottom":10.0,"paddingLeft":10.0,"clipsContent":true,"layoutMode":"HORIZONTAL","itemSpacing":10.0,"primaryAxisSizingMode":"FIXED","counterAxisSizingMode":"FIXED","children":[]},"2108:1136":{"type":"TEXT","id":"2108:1136","name":"우리는 모든 사람이 자신의 뇌를 최대한 활용할 수 있는 세상을 만들어갑니다. 브레인에이블은 단순한 뇌기능 개선을 넘어, 건강한 뇌를 기반으로 행복한 삶을 실현하는 것을 목표로 합니다. 유아부터 성인 그리고 노인에 이르기까지 각 생애주기에 따른 맞춤형 두뇌 기능 향상 솔루션을 제공하여 더 나은 삶으로 안내합니다.","absoluteBoundingBox":{"x":-785.0,"y":386.0,"width":700.0,"height":135.0},"isolatedAbsoluteRenderBounds":{"x":-784.262023925781,"y":391.880004882812,"width":685.518676757812,"height":124.632019042969},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,0.0]],"size":{"x":700.0,"y":135.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":1.0,"g":1.0,"b":1.0,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"OUTSIDE","layoutAlign":"STRETCH","strokes":[],"strokeWeight":3.21430063247681,"accessibleHTMLTag":"H1","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"behaviors":{"appear":{"otherLayer":{"sessionID":7,"localID":1792},"trigger":"OTHER_LAYER_IN_VIEW","direction":"UP","enterTransition":{"easingType":"OUT_CUBIC","easingFunction":[0.215000003576279,0.610000014305115,0.354999989271164,1.0],"transitionDuration":0.800000011920929,"delay":0.0},"enterState":{"transform":{"m00":1.0,"m01":0.0,"m02":0.0,"m10":0.0,"m11":1.0,"m12":0.0},"opacity":0.0},"exitTransition":{"easingType":"OUT_CUBIC","easingFunction":[0.215000003576279,0.610000014305115,0.354999989271164,1.0],"transitionDuration":0.600000023841858,"delay":0.0},"exitState":{"transform":{"m00":1.0,"m01":0.0,"m02":0.0,"m10":0.0,"m11":1.0,"m12":0.0},"opacity":1.0},"playsOnce":false,"behaviorType":"appear"}},"characterStyleOverrides":[],"characters":"우리는 모든 사람이 자신의 뇌를 최대한 활용할 수 있는 세상을 만들어갑니다.\n브레인에이블은 단순한 뇌기능 개선을 넘어, 건강한 뇌를 기반으로 행복한 삶을 실현하는 것을 목표로 합니다. \n유아부터 성인 그리고 노인에 이르기까지 각 생애주기에 따른 맞춤형 두뇌 기능 향상 솔루션을 제공하여 더 나은 삶으로 안내합니다.","lineIndentations":[0,0,0],"lineTypes":["NONE","NONE","NONE"],"listStartOffsets":[],"lineStyleOverrides":[0,0,0],"lineTextDirections":null,"resolvedParagraphValues":{"0":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":0.0},"1":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":0.0},"2":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":0.0}},"textAutoResize":"HEIGHT","textAlignVertical":"CENTER","style":{"fontFamily":"Noto Sans KR","fontPostScriptName":"NotoSansKR-Medium","fontStyle":"Medium","textAutoResize":"HEIGHT","fontVariantPosition":"NORMAL","fontSize":18.0,"textAlignHorizontal":"LEFT","textAlignVertical":"CENTER","letterSpacing":1.8,"letterSpacingValue":10.0,"letterSpacingUnit":"PERCENT","lineHeightPx":27.0,"lineHeightPercent":124.999992370605,"lineHeightPercentFontSize":150.0,"lineHeightUnit":"FONT_SIZE_%","paragraphSpacing":0,"paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecoration":"NONE","textDecorationSkipInk":false,"textDecorationStyle":"solid","textTruncation":"DISABLED"},"styleOverrideTable":{}},"2715:1280":{"type":"FRAME","id":"2715:1280","name":"Header 1","absoluteBoundingBox":{"x":-786.0,"y":-135.0,"width":277.0,"height":382.0},"isolatedAbsoluteRenderBounds":{"x":-786.0,"y":-135.0,"width":277.0,"height":382.0},"relativeTransform":[[1.0,0.0,44.0],[0.0,1.0,24.0]],"size":{"x":277.0,"y":382.0},"fills":[],"strokeAlign":"INSIDE","strokes":[],"accessibleHTMLTag":"HEADER","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"paddingTop":24.0,"paddingRight":33.0,"paddingBottom":24.0,"paddingLeft":33.0,"layoutMode":"VERTICAL","itemSpacing":16.0,"counterAxisAlignItems":"CENTER","children":["2715:1281","2715:1282"]},"2715:1272":{"type":"RECTANGLE","id":"2715:1272","name":"Logo","absoluteBoundingBox":{"x":-2097.0,"y":-111.0,"width":211.0,"height":75.0},"isolatedAbsoluteRenderBounds":{"x":-2097.0,"y":-111.0,"width":211.0,"height":75.0},"relativeTransform":[[1.0,0.0,33.0],[0.0,1.0,24.0]],"size":{"x":211.0,"y":75.0},"fills":[{"blendMode":"NORMAL","type":"IMAGE","scaleMode":"FILL","imageRef":"64270238d3de4edd07597c9179b36856b5a53af3","originalImageWidth":1400,"originalImageHeight":1167,"visible":true,"opacity":1.0,"rotation":0.0}],"strokeAlign":"INSIDE","strokes":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"accessibleLabel":"Logomark","ariaAttributes":{},"interactions":[]},"2224:2991":{"type":"FRAME","id":"2224:2991","name":"Footer contact information","absoluteBoundingBox":{"x":-2147.0,"y":3591.0,"width":122.0,"height":46.0},"isolatedAbsoluteRenderBounds":{"x":-2147.0,"y":3591.0,"width":558.0,"height":77.0},"relativeTransform":[[1.0,0.0,32.0],[0.0,1.0,257.0]],"size":{"x":122.0,"y":46.0},"fills":[],"strokeAlign":"INSIDE","strokes":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"layoutMode":"HORIZONTAL","primaryAxisSizingMode":"FIXED","counterAxisSizingMode":"FIXED","children":["2224:2992","2224:2995","2224:2997"]},"2715:1286":{"type":"TEXT","id":"2715:1286","name":"커뮤니티","absoluteBoundingBox":{"x":-683.0,"y":145.0,"width":71.0,"height":23.0},"isolatedAbsoluteRenderBounds":{"x":-682.697509765625,"y":149.688003540039,"width":70.396240234375,"height":16.5119934082031},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,165.0]],"size":{"x":71.0,"y":23.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":0.443900465965271,"g":0.442026853561401,"b":0.442026853561401,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"OUTSIDE","strokes":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"characterStyleOverrides":[],"characters":"커뮤니티","lineIndentations":[0],"lineTypes":["NONE"],"listStartOffsets":[],"lineStyleOverrides":[0],"lineTextDirections":null,"resolvedParagraphValues":{"0":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":16.0}},"textAutoResize":"WIDTH_AND_HEIGHT","textAlignHorizontal":"CENTER","textAlignVertical":"CENTER","paragraphSpacing":16.0,"style":{"styleIdForText":"StyleId:2608:2916","fontFamily":"Noto Sans KR","fontPostScriptName":"NotoSansKR-Medium","fontStyle":"Medium","hyperlink":{"type":"NODE","nodeID":"/커뮤니티Articles"},"paragraphSpacing":16.0,"textAutoResize":"WIDTH_AND_HEIGHT","fontVariantPosition":"NORMAL","textDecoration":"UNDERLINE","textDecorationSkipInk":true,"fontSize":16.0,"textAlignHorizontal":"CENTER","textAlignVertical":"CENTER","letterSpacing":3.84,"letterSpacingValue":24.0,"letterSpacingUnit":"PERCENT","lineHeightPx":23.2000007629395,"lineHeightPercent":120.83332824707,"lineHeightPercentFontSize":145.0,"lineHeightUnit":"FONT_SIZE_%","paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecorationStyle":"solid","textTruncation":"DISABLED"},"styleOverrideTable":{}},"2715:1285":{"type":"TEXT","id":"2715:1285","name":"제품소개","absoluteBoundingBox":{"x":-683.0,"y":90.0,"width":71.0,"height":23.0},"isolatedAbsoluteRenderBounds":{"x":-682.697509765625,"y":94.6879959106445,"width":70.396240234375,"height":16.5120010375977},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,110.0]],"size":{"x":71.0,"y":23.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":0.443900465965271,"g":0.442026853561401,"b":0.442026853561401,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"OUTSIDE","strokes":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"characterStyleOverrides":[],"characters":"제품소개","lineIndentations":[0],"lineTypes":["NONE"],"listStartOffsets":[],"lineStyleOverrides":[0],"lineTextDirections":null,"resolvedParagraphValues":{"0":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":16.0}},"textAutoResize":"WIDTH_AND_HEIGHT","textAlignHorizontal":"CENTER","textAlignVertical":"CENTER","paragraphSpacing":16.0,"style":{"styleIdForText":"StyleId:2608:2916","fontFamily":"Noto Sans KR","fontPostScriptName":"NotoSansKR-Medium","fontStyle":"Medium","hyperlink":{"type":"NODE","nodeID":"/laserable"},"paragraphSpacing":16.0,"textAutoResize":"WIDTH_AND_HEIGHT","fontVariantPosition":"NORMAL","textDecoration":"UNDERLINE","textDecorationSkipInk":true,"fontSize":16.0,"textAlignHorizontal":"CENTER","textAlignVertical":"CENTER","letterSpacing":3.84,"letterSpacingValue":24.0,"letterSpacingUnit":"PERCENT","lineHeightPx":23.2000007629395,"lineHeightPercent":120.83332824707,"lineHeightPercentFontSize":145.0,"lineHeightUnit":"FONT_SIZE_%","paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecorationStyle":"solid","textTruncation":"DISABLED"},"styleOverrideTable":{}},"8:2157":{"type":"TEXT","id":"8:2157","name":"브레인에이블은 전문 의료진과의 긴밀한 협력을 통한 실용적인 솔루션을 제공하며, 삶의 질을 향상시키기 위해 끊임없이 노력하고 있습니다. 다방면의 지속적인 협력과 피드백을 통해 제품의 개선과 발전을 만들어 내고 있으며 모든 단계에서의 투명한 소통을 보장합니다. 독자적으로 개발된 최신 기술을 활용하여 개별적인 필요에 맞춘 맞춤형 솔루션을 제공중입니다.","absoluteBoundingBox":{"x":-815.0,"y":1989.5,"width":322.0,"height":96.0},"isolatedAbsoluteRenderBounds":{"x":-814.609985351562,"y":1993.15002441406,"width":315.911651611328,"height":89.1400146484375},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,135.5]],"size":{"x":322.0,"y":96.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":1.0,"g":1.0,"b":1.0,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"OUTSIDE","layoutAlign":"STRETCH","strokes":[],"strokeWeight":3.21430063247681,"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"characterStyleOverrides":[],"characters":"브레인에이블은 전문 의료진과의 긴밀한 협력을 통한 실용적인 솔루션을 제공하며, 삶의 질을 향상시키기 위해 끊임없이 노력하고 있습니다. \n다방면의 지속적인 협력과 피드백을 통해 제품의 개선과 발전을 만들어 내고 있으며 모든 단계에서의 투명한 소통을 보장합니다.\n독자적으로 개발된 최신 기술을 활용하여 개별적인 필요에 맞춘 맞춤형 솔루션을 제공중입니다.","lineIndentations":[0,0,0],"lineTypes":["NONE","NONE","NONE"],"listStartOffsets":[],"lineStyleOverrides":[0,0,0],"lineTextDirections":null,"resolvedParagraphValues":{"0":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":0.0},"1":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":0.0},"2":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":0.0}},"textAutoResize":"HEIGHT","textAlignVertical":"CENTER","style":{"fontFamily":"Noto Sans KR","fontPostScriptName":"NotoSansKR-Regular","fontStyle":"Regular","textAutoResize":"HEIGHT","fontVariantPosition":"NORMAL","fontSize":10.0,"textAlignHorizontal":"LEFT","textAlignVertical":"CENTER","letterSpacing":0.7,"letterSpacingValue":7.0,"letterSpacingUnit":"PERCENT","lineHeightPx":16.0,"lineHeightPercent":133.33332824707,"lineHeightPercentFontSize":160.0,"lineHeightUnit":"FONT_SIZE_%","paragraphSpacing":0,"paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecoration":"NONE","textDecorationSkipInk":false,"textDecorationStyle":"solid","textTruncation":"DISABLED"},"styleOverrideTable":{}},"2715:1281":{"type":"RECTANGLE","id":"2715:1281","name":"Logo","absoluteBoundingBox":{"x":-753.0,"y":-111.0,"width":211.0,"height":75.0},"isolatedAbsoluteRenderBounds":{"x":-753.0,"y":-111.0,"width":211.0,"height":75.0},"relativeTransform":[[1.0,0.0,33.0],[0.0,1.0,24.0]],"size":{"x":211.0,"y":75.0},"fills":[{"blendMode":"NORMAL","type":"IMAGE","scaleMode":"FILL","imageRef":"64270238d3de4edd07597c9179b36856b5a53af3","originalImageWidth":1400,"originalImageHeight":1167,"visible":true,"opacity":1.0,"rotation":0.0}],"strokeAlign":"INSIDE","strokes":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"accessibleLabel":"Logomark","ariaAttributes":{},"interactions":[]},"2715:1036":{"type":"FRAME","id":"2715:1036","name":"Nav","absoluteBoundingBox":{"x":-1375.0,"y":-109.0,"width":412.0,"height":23.0},"isolatedAbsoluteRenderBounds":{"x":-1375.0,"y":-109.0,"width":412.0,"height":23.0},"relativeTransform":[[1.0,0.0,804.0],[0.0,1.0,50.0]],"size":{"x":412.0,"y":23.0},"fills":[],"strokeAlign":"INSIDE","strokes":[],"accessibleHTMLTag":"NAV","isDecorativeImage":false,"ariaAttributes":{},"interactions":[{"id":{"sessionID":2608,"localID":4804},"event":{"interactionType":"ON_CLICK"},"actions":[{"transitionNodeID":{"sessionID":0,"localID":3},"connectionType":"INTERNAL_NODE","navigationType":"NAVIGATE","connectionURL":"/"}],"isDeleted":false,"stateManagementVersion":1}],"layoutMode":"HORIZONTAL","itemSpacing":32.0,"counterAxisAlignItems":"CENTER","children":["2715:1037","2715:1038","2715:1039","2715:1040","2715:1041"]},"2224:2888":{"type":"TEXT","id":"2224:2888","name":"010-8123-7857 02)-581-7856","absoluteBoundingBox":{"x":-2036.0,"y":4277.5,"width":255.0,"height":55.0},"isolatedAbsoluteRenderBounds":{"x":-2035.19995117188,"y":4283.56396484375,"width":126.371704101562,"height":38.072265625},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,2.5]],"size":{"x":255.0,"y":55.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":0.0,"g":0.0,"b":0.0,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"OUTSIDE","strokes":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"behaviors":{"hover":{"transition":{"easingType":"OUT_CUBIC","easingFunction":[0.215000003576279,0.610000014305115,0.354999989271164,1.0],"transitionDuration":0.300000011920929,"delay":0.0},"state":{"transform":{"m00":1.0,"m01":0.0,"m02":0.0,"m10":0.0,"m11":1.0,"m12":0.0},"opacity":0.699999988079071},"behaviorType":"hover"}},"characterStyleOverrides":[],"characters":"010-8123-7857\n02)-581-7856","lineIndentations":[0,0],"lineTypes":["NONE","NONE"],"listStartOffsets":[],"lineStyleOverrides":[0,0],"lineTextDirections":null,"resolvedParagraphValues":{"0":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":0.0},"1":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":0.0}},"style":{"fontFamily":"Noto Sans KR","fontPostScriptName":"NotoSansKR-Regular","fontStyle":"Regular","fontVariantPosition":"NORMAL","fontSize":16.0,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","letterSpacing":1.6,"letterSpacingValue":10.0,"letterSpacingUnit":"PERCENT","lineHeightPx":22.8799991607666,"lineHeightPercent":119.166664123535,"lineHeightPercentFontSize":143.0,"lineHeightUnit":"FONT_SIZE_%","paragraphSpacing":0,"paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecoration":"NONE","textDecorationSkipInk":false,"textDecorationStyle":"solid","textAutoResize":"NONE","textTruncation":"DISABLED"},"styleOverrideTable":{}},"2715:1052":{"type":"FRAME","id":"2715:1052","name":"Header 1","absoluteBoundingBox":{"x":-835.0,"y":-159.0,"width":800.0,"height":123.0},"isolatedAbsoluteRenderBounds":{"x":-835.0,"y":-159.0,"width":800.0,"height":123.0},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,0.0]],"size":{"x":800.0,"y":123.0},"fills":[],"strokeAlign":"INSIDE","layoutAlign":"STRETCH","strokes":[],"accessibleHTMLTag":"HEADER","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"paddingTop":24.0,"paddingRight":64.0,"paddingBottom":24.0,"paddingLeft":64.0,"layoutMode":"HORIZONTAL","itemSpacing":16.0,"counterAxisAlignItems":"CENTER","primaryAxisAlignItems":"SPACE_BETWEEN","primaryAxisSizingMode":"FIXED","children":["2715:1053","2715:1054"]},"119:266":{"type":"FRAME","id":"119:266","name":"Image divider section","absoluteBoundingBox":{"x":-835.0,"y":2282.0,"width":800.0,"height":480.0},"isolatedAbsoluteRenderBounds":{"x":-835.0,"y":2282.0,"width":800.0,"height":480.0},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,1691.0]],"size":{"x":800.0,"y":480.0},"fills":[{"blendMode":"NORMAL","type":"IMAGE","scaleMode":"FILL","imageRef":"5254ebc44a873806e532a942d974e05bc220731e","originalImageWidth":4096,"originalImageHeight":2731,"visible":true,"opacity":1.0,"rotation":0.0},{"opacity":0.300000011920929,"blendMode":"NORMAL","type":"SOLID","color":{"r":0.0,"g":0.0,"b":0.0,"a":1.0},"visible":true}],"strokeAlign":"INSIDE","layoutAlign":"STRETCH","strokes":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"accessibleLabel":"Photo of a study hall area with desks and people studying.","ariaAttributes":{},"interactions":[],"behaviors":{"appear":{"otherLayer":{"sessionID":-1,"localID":-1},"trigger":"THIS_LAYER_IN_VIEW","direction":"UP","enterTransition":{"easingType":"OUT_CUBIC","easingFunction":[0.215000003576279,0.610000014305115,0.354999989271164,1.0],"transitionDuration":0.800000011920929,"delay":0.0},"enterState":{"transform":{"m00":1.0,"m01":0.0,"m02":0.0,"m10":0.0,"m11":1.0,"m12":0.0},"opacity":0.0},"exitTransition":{"easingType":"OUT_CUBIC","easingFunction":[0.215000003576279,0.610000014305115,0.354999989271164,1.0],"transitionDuration":0.600000023841858,"delay":0.0},"exitState":{"transform":{"m00":1.0,"m01":0.0,"m02":0.0,"m10":0.0,"m11":1.0,"m12":0.0},"opacity":1.0},"playsOnce":false,"behaviorType":"appear"}},"paddingTop":10.0,"paddingRight":10.0,"paddingBottom":10.0,"paddingLeft":10.0,"clipsContent":true,"layoutMode":"HORIZONTAL","itemSpacing":10.0,"primaryAxisSizingMode":"FIXED","counterAxisSizingMode":"FIXED","children":[]},"2715:1054":{"type":"FRAME","id":"2715:1054","name":"Nav","absoluteBoundingBox":{"x":-511.0,"y":-109.0,"width":412.0,"height":23.0},"isolatedAbsoluteRenderBounds":{"x":-511.0,"y":-109.0,"width":412.0,"height":23.0},"relativeTransform":[[1.0,0.0,324.0],[0.0,1.0,50.0]],"size":{"x":412.0,"y":23.0},"fills":[],"strokeAlign":"INSIDE","strokes":[],"accessibleHTMLTag":"NAV","isDecorativeImage":false,"ariaAttributes":{},"interactions":[{"id":{"sessionID":2608,"localID":4804},"event":{"interactionType":"ON_CLICK"},"actions":[{"transitionNodeID":{"sessionID":0,"localID":3},"connectionType":"INTERNAL_NODE","navigationType":"NAVIGATE","connectionURL":"/"}],"isDeleted":false,"stateManagementVersion":1}],"layoutMode":"HORIZONTAL","itemSpacing":32.0,"counterAxisAlignItems":"CENTER","children":["2715:1055","2715:1056","2715:1057","2715:1058","2715:1059"]},"8:2141":{"type":"TEXT","id":"8:2141","name":"DUI and traffic offenses White-collar crime defese Drug charges Assault and battery cases Expungements and record sealing","absoluteBoundingBox":{"x":-211.0,"y":2203.0,"width":420.0,"height":120.0},"isolatedAbsoluteRenderBounds":{"x":-210.639999389648,"y":2208.20190429688,"width":266.703338623047,"height":111.714111328125},"relativeTransform":[[1.0,0.0,560.0],[0.0,1.0,20.0]],"size":{"x":420.0,"y":120.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":1.0,"g":1.0,"b":1.0,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"OUTSIDE","strokes":[],"strokeWeight":3.21430063247681,"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"characterStyleOverrides":[],"characters":"DUI and traffic offenses\nWhite-collar crime defese\nDrug charges\nAssault and battery cases\nExpungements and record sealing","lineIndentations":[0,0,0,0,0],"lineTypes":["NONE","NONE","NONE","NONE","NONE"],"listStartOffsets":[],"lineStyleOverrides":[0,0,0,0,0],"lineTextDirections":null,"resolvedParagraphValues":{"0":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":0.0},"1":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":0.0},"2":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":0.0},"3":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":0.0},"4":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":0.0}},"textAutoResize":"HEIGHT","style":{"styleIdForText":"StyleId:6:1353","fontFamily":"Geist","fontPostScriptName":"Geist-Regular","fontStyle":"Regular","textAutoResize":"HEIGHT","responsiveTextStyleVariants":[{"minWidth":1280.0,"name":"Desktop","style":{"styleIdForText":"StyleId:6:1353","fontSize":18.0,"letterSpacing":-0.36,"letterSpacingValue":-2.0,"letterSpacingUnit":"PERCENT","lineHeightPx":24.3000011444092,"lineHeightPercent":115.199996948242,"lineHeightPercentFontSize":135.0,"lineHeightUnit":"FONT_SIZE_%"}}],"fontVariantPosition":"NORMAL","fontSize":18.0,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","letterSpacing":-0.36,"letterSpacingValue":-2.0,"letterSpacingUnit":"PERCENT","lineHeightPx":24.3000011444092,"lineHeightPercent":103.846160888672,"lineHeightPercentFontSize":135.0,"lineHeightUnit":"FONT_SIZE_%","paragraphSpacing":0,"paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecoration":"NONE","textDecorationSkipInk":false,"textDecorationStyle":"solid","textTruncation":"DISABLED"},"styleOverrideTable":{}},"2715:1057":{"type":"TEXT","id":"2715:1057","name":"제품소개","absoluteBoundingBox":{"x":-340.0,"y":-109.0,"width":59.0,"height":23.0},"isolatedAbsoluteRenderBounds":{"x":-339.817504882812,"y":-105.312004089355,"width":58.6362609863281,"height":16.5120010375977},"relativeTransform":[[1.0,0.0,171.0],[0.0,1.0,0.0]],"size":{"x":59.0,"y":23.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":0.443900465965271,"g":0.442026853561401,"b":0.442026853561401,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"OUTSIDE","strokes":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"characterStyleOverrides":[],"characters":"제품소개","lineIndentations":[0],"lineTypes":["NONE"],"listStartOffsets":[],"lineStyleOverrides":[0],"lineTextDirections":null,"resolvedParagraphValues":{"0":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":16.0}},"textAutoResize":"WIDTH_AND_HEIGHT","textAlignHorizontal":"CENTER","textAlignVertical":"CENTER","paragraphSpacing":16.0,"fallbackFonts":[{"fontFamily":"Noto Sans KR","fontStyle":"Medium"}],"style":{"fontFamily":"Inter","fontPostScriptName":"Inter-Medium","fontStyle":"Medium","fallbackFonts":[{"fontFamily":"Noto Sans KR","fontStyle":"Medium"}],"hyperlink":{"type":"NODE","nodeID":"/laserable"},"paragraphSpacing":16.0,"textAutoResize":"WIDTH_AND_HEIGHT","fontVariantPosition":"NORMAL","textDecoration":"UNDERLINE","textDecorationSkipInk":true,"fontSize":16.0,"textAlignHorizontal":"CENTER","textAlignVertical":"CENTER","letterSpacing":-0.08,"letterSpacingValue":-0.5,"letterSpacingUnit":"PERCENT","lineHeightPx":23.2000007629395,"lineHeightPercent":119.812210083008,"lineHeightPercentFontSize":145.0,"lineHeightUnit":"FONT_SIZE_%","paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecorationStyle":"solid","textTruncation":"DISABLED"},"styleOverrideTable":{}},"2715:1056":{"type":"TEXT","id":"2715:1056","name":"회사소개","absoluteBoundingBox":{"x":-431.0,"y":-109.0,"width":59.0,"height":23.0},"isolatedAbsoluteRenderBounds":{"x":-430.817504882812,"y":-105.312004089355,"width":58.6362609863281,"height":16.5120010375977},"relativeTransform":[[1.0,0.0,80.0],[0.0,1.0,0.0]],"size":{"x":59.0,"y":23.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":0.443900465965271,"g":0.442026853561401,"b":0.442026853561401,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"OUTSIDE","strokes":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"characterStyleOverrides":[],"characters":"회사소개","lineIndentations":[0],"lineTypes":["NONE"],"listStartOffsets":[],"lineStyleOverrides":[0],"lineTextDirections":null,"resolvedParagraphValues":{"0":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":16.0}},"textAutoResize":"WIDTH_AND_HEIGHT","textAlignHorizontal":"CENTER","textAlignVertical":"CENTER","paragraphSpacing":16.0,"fallbackFonts":[{"fontFamily":"Noto Sans KR","fontStyle":"Medium"}],"style":{"fontFamily":"Inter","fontPostScriptName":"Inter-Medium","fontStyle":"Medium","fallbackFonts":[{"fontFamily":"Noto Sans KR","fontStyle":"Medium"}],"hyperlink":{"type":"NODE","nodeID":"/about_us"},"paragraphSpacing":16.0,"textAutoResize":"WIDTH_AND_HEIGHT","fontVariantPosition":"NORMAL","textDecoration":"UNDERLINE","textDecorationSkipInk":true,"fontSize":16.0,"textAlignHorizontal":"CENTER","textAlignVertical":"CENTER","letterSpacing":-0.08,"letterSpacingValue":-0.5,"letterSpacingUnit":"PERCENT","lineHeightPx":23.2000007629395,"lineHeightPercent":119.812210083008,"lineHeightPercentFontSize":145.0,"lineHeightUnit":"FONT_SIZE_%","paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecorationStyle":"solid","textTruncation":"DISABLED"},"styleOverrideTable":{}},"7:1793":{"type":"FRAME","id":"7:1793","name":"Header content","absoluteBoundingBox":{"x":-785.0,"y":386.0,"width":700.0,"height":135.0},"isolatedAbsoluteRenderBounds":{"x":-785.0,"y":120.0,"width":700.0,"height":401.0},"relativeTransform":[[1.0,0.0,50.0],[0.0,1.0,545.0]],"size":{"x":700.0,"y":135.0},"fills":[],"strokeAlign":"INSIDE","layoutAlign":"STRETCH","strokes":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"layoutMode":"VERTICAL","itemSpacing":28.0,"counterAxisSizingMode":"FIXED","children":["2108:1141","2108:1136"]},"2715:1055":{"type":"TEXT","id":"2715:1055","name":"HOME","absoluteBoundingBox":{"x":-511.0,"y":-109.0,"width":48.0,"height":23.0},"isolatedAbsoluteRenderBounds":{"x":-510.965942382812,"y":-103.795455932617,"width":47.93896484375,"height":16.0681838989258},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,0.0]],"size":{"x":48.0,"y":23.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":0.443900465965271,"g":0.442026853561401,"b":0.442026853561401,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"OUTSIDE","strokes":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"characterStyleOverrides":[],"characters":"HOME","lineIndentations":[0],"lineTypes":["NONE"],"listStartOffsets":[],"lineStyleOverrides":[0],"lineTextDirections":null,"resolvedParagraphValues":{"0":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":16.0}},"textAutoResize":"WIDTH_AND_HEIGHT","textAlignHorizontal":"CENTER","textAlignVertical":"CENTER","paragraphSpacing":16.0,"style":{"fontFamily":"Inter","fontPostScriptName":"Inter-Medium","fontStyle":"Medium","hyperlink":{"type":"NODE","nodeID":"/"},"paragraphSpacing":16.0,"textAutoResize":"WIDTH_AND_HEIGHT","fontVariantPosition":"NORMAL","textDecoration":"UNDERLINE","textDecorationSkipInk":true,"fontSize":16.0,"textAlignHorizontal":"CENTER","textAlignVertical":"CENTER","letterSpacing":-0.08,"letterSpacingValue":-0.5,"letterSpacingUnit":"PERCENT","lineHeightPx":23.2000007629395,"lineHeightPercent":119.812210083008,"lineHeightPercentFontSize":145.0,"lineHeightUnit":"FONT_SIZE_%","paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecorationStyle":"solid","textTruncation":"DISABLED"},"styleOverrideTable":{}},"8:2150":{"type":"TEXT","id":"8:2150","name":"INNOVATIVE SYSTEMS OF BRAINABLE 브레인에이블만의 혁신 시스템","absoluteBoundingBox":{"x":-815.0,"y":1495.0,"width":323.0,"height":78.0},"isolatedAbsoluteRenderBounds":{"x":-814.263977050781,"y":1503.0,"width":312.286346435547,"height":40.343994140625},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,0.0]],"size":{"x":323.0,"y":78.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":1.0,"g":1.0,"b":1.0,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"OUTSIDE","layoutAlign":"STRETCH","strokes":[],"strokeWeight":3.21430063247681,"accessibleHTMLTag":"H2","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"characterStyleOverrides":[46,46,46,46,46,46,46,46,46,46,46,46,46,46,46,46,46,46,46,46,46,46,46,46,46,46,46,46,46,46,46,46,47,47,47,47,47,47,47,47,47,47,47,47,47,47,47],"characters":"INNOVATIVE SYSTEMS OF BRAINABLE\n브레인에이블만의 혁신 시스템","lineIndentations":[0,0],"lineTypes":["NONE","NONE"],"listStartOffsets":[],"lineStyleOverrides":[0,0],"lineTextDirections":null,"resolvedParagraphValues":{"0":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":0.0},"1":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":0.0}},"style":{"fontFamily":"Noto Sans KR","fontPostScriptName":"NotoSansKR-Medium","fontStyle":"Medium","fontVariantPosition":"NORMAL","fontSize":16.0,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","letterSpacing":1.6,"letterSpacingValue":10.0,"letterSpacingUnit":"PERCENT","lineHeightPx":27.0400009155273,"lineHeightPercent":140.83332824707,"lineHeightPercentFontSize":169.0,"lineHeightUnit":"FONT_SIZE_%","paragraphSpacing":0,"paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecoration":"NONE","textDecorationSkipInk":false,"textDecorationStyle":"solid","textAutoResize":"NONE","textTruncation":"DISABLED"},"styleOverrideTable":{"47":{"letterSpacing":1.12,"letterSpacingValue":7.0,"letterSpacingUnit":"PERCENT","paragraphSpacing":0,"paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecoration":"NONE","textDecorationSkipInk":false,"textDecorationStyle":"solid","textAutoResize":"NONE","textTruncation":"DISABLED","lineHeightPercent":100,"lineHeightPercentFontSize":100},"46":{"letterSpacing":1.12,"letterSpacingValue":7.0,"letterSpacingUnit":"PERCENT","lineHeightPx":27.0400009155273,"lineHeightPercent":144.213333129883,"lineHeightPercentFontSize":169.0,"lineHeightUnit":"FONT_SIZE_%","paragraphSpacing":0,"paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecoration":"NONE","textDecorationSkipInk":false,"textDecorationStyle":"solid","textAutoResize":"NONE","textTruncation":"DISABLED"}}},"8:2144":{"type":"TEXT","id":"8:2144","name":"Property transactions (buying, selling, leasing) Landlord-tenant disputes Zoning and land use Construction law Real estate development","absoluteBoundingBox":{"x":-211.0,"y":2203.0,"width":420.0,"height":120.0},"isolatedAbsoluteRenderBounds":{"x":-210.496002197266,"y":2207.5,"width":359.494873046875,"height":112.199951171875},"relativeTransform":[[1.0,0.0,560.0],[0.0,1.0,20.0]],"size":{"x":420.0,"y":120.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":1.0,"g":1.0,"b":1.0,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"OUTSIDE","strokes":[],"strokeWeight":3.21430063247681,"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"characterStyleOverrides":[],"characters":"Property transactions (buying, selling, leasing)\nLandlord-tenant disputes\nZoning and land use\nConstruction law\nReal estate development","lineIndentations":[0,0,0,0,0],"lineTypes":["NONE","NONE","NONE","NONE","NONE"],"listStartOffsets":[],"lineStyleOverrides":[0,0,0,0,0],"lineTextDirections":null,"resolvedParagraphValues":{"0":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":0.0},"1":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":0.0},"2":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":0.0},"3":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":0.0},"4":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":0.0}},"textAutoResize":"HEIGHT","style":{"styleIdForText":"StyleId:6:1353","fontFamily":"Geist","fontPostScriptName":"Geist-Regular","fontStyle":"Regular","textAutoResize":"HEIGHT","responsiveTextStyleVariants":[{"minWidth":1280.0,"name":"Desktop","style":{"styleIdForText":"StyleId:6:1353","fontSize":18.0,"letterSpacing":-0.36,"letterSpacingValue":-2.0,"letterSpacingUnit":"PERCENT","lineHeightPx":24.3000011444092,"lineHeightPercent":115.199996948242,"lineHeightPercentFontSize":135.0,"lineHeightUnit":"FONT_SIZE_%"}}],"fontVariantPosition":"NORMAL","fontSize":18.0,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","letterSpacing":-0.36,"letterSpacingValue":-2.0,"letterSpacingUnit":"PERCENT","lineHeightPx":24.3000011444092,"lineHeightPercent":103.846160888672,"lineHeightPercentFontSize":135.0,"lineHeightUnit":"FONT_SIZE_%","paragraphSpacing":0,"paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecoration":"NONE","textDecorationSkipInk":false,"textDecorationStyle":"solid","textTruncation":"DISABLED"},"styleOverrideTable":{}},"8:2135":{"type":"TEXT","id":"8:2135","name":"브레인에이블은 전문 의료진과의 긴밀한 협력을 통한 실용적인 솔루션을 제공하며, 삶의 질을 향상시키기 위해 끊임없이 노력하고 있습니다. 다방면의 지속적인 협력과 피드백을 통해 제품의 개선과 발전을 만들어 내고 있으며 모든 단계에서의 투명한 소통을 보장합니다. 독자적으로 개발된 최신 기술을 활용하여 개별적인 필요에 맞춘 맞춤형 솔루션을 제공함으로써 더욱 맞춤화된 서비스를 제공하고 있습니다.","absoluteBoundingBox":{"x":-263.0,"y":1771.0,"width":604.0,"height":135.0},"isolatedAbsoluteRenderBounds":{"x":-262.2080078125,"y":1776.96997070312,"width":590.995239257812,"height":124.452026367188},"relativeTransform":[[1.0,0.0,508.0],[0.0,1.0,20.0]],"size":{"x":604.0,"y":135.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":1.0,"g":1.0,"b":1.0,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"OUTSIDE","strokes":[],"strokeWeight":3.21430063247681,"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"characterStyleOverrides":[],"characters":"브레인에이블은 전문 의료진과의 긴밀한 협력을 통한 실용적인 솔루션을 제공하며, 삶의 질을 향상시키기 위해 끊임없이 노력하고 있습니다. 다방면의 지속적인 협력과 피드백을 통해 제품의 개선과 발전을 만들어 내고 있으며 모든 단계에서의 투명한 소통을 보장합니다. 독자적으로 개발된 최신 기술을 활용하여 개별적인 필요에 맞춘 맞춤형 솔루션을 제공함으로써 더욱 맞춤화된 서비스를 제공하고 있습니다.","lineIndentations":[0],"lineTypes":["NONE"],"listStartOffsets":[],"lineStyleOverrides":[0],"lineTextDirections":null,"resolvedParagraphValues":{"0":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":0.0}},"textAutoResize":"HEIGHT","style":{"fontFamily":"Noto Sans KR","fontPostScriptName":"NotoSansKR-Regular","fontStyle":"Regular","textAutoResize":"HEIGHT","fontVariantPosition":"NORMAL","fontSize":18.0,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","letterSpacing":-0.36,"letterSpacingValue":-2.0,"letterSpacingUnit":"PERCENT","lineHeightPx":27.0,"lineHeightPercent":124.999992370605,"lineHeightPercentFontSize":150.0,"lineHeightUnit":"FONT_SIZE_%","paragraphSpacing":0,"paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecoration":"NONE","textDecorationSkipInk":false,"textDecorationStyle":"solid","textTruncation":"DISABLED"},"styleOverrideTable":{}},"6:1530":{"type":"FRAME","id":"6:1530","name":"Desktop","absoluteBoundingBox":{"x":-2179.0,"y":-159.0,"width":1280.0,"height":4899.0},"isolatedAbsoluteRenderBounds":{"x":-2179.0,"y":-159.0,"width":1280.0,"height":4899.0},"relativeTransform":[[1.0,0.0,64.0],[0.0,1.0,100.0]],"size":{"x":1280.0,"y":4899.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":1.0,"g":1.0,"b":1.0,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"INSIDE","strokes":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"clipsContent":true,"overflowDirection":"VERTICAL_SCROLLING","layoutMode":"VERTICAL","counterAxisAlignItems":"CENTER","counterAxisSizingMode":"FIXED","isBreakpointFrame":true,"children":["2715:1034","2715:1270","7:1788","161:105","2224:2985"]},"2224:2998":{"type":"FRAME","id":"2224:2998","name":"Footer copyright","absoluteBoundingBox":{"x":-2147.0,"y":3694.0,"width":197.0,"height":26.0},"isolatedAbsoluteRenderBounds":{"x":-2147.0,"y":3694.0,"width":197.0,"height":26.0},"relativeTransform":[[1.0,0.0,32.0],[0.0,1.0,360.0]],"size":{"x":197.0,"y":26.0},"fills":[],"strokeAlign":"INSIDE","strokes":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"layoutMode":"HORIZONTAL","itemSpacing":10.0,"counterAxisAlignItems":"CENTER","children":["2224:2999"]},"2224:2955":{"type":"RECTANGLE","id":"2224:2955","name":"brainable_logo_ver.001-03 1","absoluteBoundingBox":{"x":-768.0,"y":2933.0,"width":89.0,"height":74.0},"targetAspectRatio":{"x":1400.0,"y":1167.0},"isolatedAbsoluteRenderBounds":{"x":-768.0,"y":2933.0,"width":89.0,"height":74.0},"relativeTransform":[[1.0,0.0,35.0],[0.0,1.0,-16.0]],"size":{"x":89.0,"y":74.0},"fills":[{"blendMode":"NORMAL","type":"IMAGE","scaleMode":"FILL","imageRef":"d5fa8c9a8fa609d8b7d06565c3a9a33ab9d65149","originalImageWidth":1400,"originalImageHeight":1167,"visible":true,"opacity":1.0,"rotation":0.0}],"visible":false,"constraintValues":{"left":{"pixelOffset":35.0,"sizeFraction":0.0},"top":{"pixelOffset":-16.0,"sizeFraction":0.0}},"strokeAlign":"INSIDE","layoutPositioning":"ABSOLUTE","strokes":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[]},"8:2167":{"type":"FRAME","id":"8:2167","name":"Service 6","absoluteBoundingBox":{"x":-815.0,"y":2243.0,"width":980.0,"height":136.0},"isolatedAbsoluteRenderBounds":{"x":-815.0,"y":2243.0,"width":980.0,"height":136.0},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,612.0]],"size":{"x":980.0,"y":136.0},"fills":[],"visible":false,"strokeAlign":"INSIDE","layoutAlign":"STRETCH","strokes":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":1.0,"g":1.0,"b":1.0,"a":1.0},"visible":true,"opacity":1.0}],"individualStrokeWeights":{"top":0.5,"right":0.0,"bottom":0.0,"left":0.0},"accessibleHTMLTag":"SECTION","isDecorativeImage":false,"accessibleLabel":"Specific areas of immigration law that we help with","ariaAttributes":{},"interactions":[],"behaviors":{"appear":{"otherLayer":{"sessionID":-1,"localID":-1},"trigger":"THIS_LAYER_IN_VIEW","direction":"UP","enterTransition":{"easingType":"OUT_CUBIC","easingFunction":[0.215000003576279,0.610000014305115,0.354999989271164,1.0],"transitionDuration":0.800000011920929,"delay":0.0},"enterState":{"transform":{"m00":1.0,"m01":0.0,"m02":0.0,"m10":0.0,"m11":1.0,"m12":0.0},"opacity":0.0},"exitTransition":{"easingType":"OUT_CUBIC","easingFunction":[0.215000003576279,0.610000014305115,0.354999989271164,1.0],"transitionDuration":0.600000023841858,"delay":0.0},"exitState":{"transform":{"m00":1.0,"m01":0.0,"m02":0.0,"m10":0.0,"m11":1.0,"m12":0.0},"opacity":1.0},"playsOnce":false,"behaviorType":"appear"}},"paddingTop":20.0,"paddingBottom":20.0,"layoutMode":"HORIZONTAL","itemSpacing":266.0,"counterAxisSizingMode":"FIXED","children":["8:2168","8:2169"]},"2224:2996":{"type":"TEXT","id":"2224:2996","name":"서울특별시 서초구 마방로 6길 28, 5층 502호","absoluteBoundingBox":{"x":-1999.0,"y":3592.0,"width":155.0,"height":75.0},"isolatedAbsoluteRenderBounds":{"x":-1998.70300292969,"y":3595.90307617188,"width":151.708251953125,"height":27.932861328125},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,1.0]],"size":{"x":155.0,"y":75.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":0.0,"g":0.0,"b":0.0,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"OUTSIDE","strokes":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"behaviors":{"hover":{"transition":{"easingType":"OUT_CUBIC","easingFunction":[0.215000003576279,0.610000014305115,0.354999989271164,1.0],"transitionDuration":0.300000011920929,"delay":0.0},"state":{"transform":{"m00":1.0,"m01":0.0,"m02":0.0,"m10":0.0,"m11":1.0,"m12":0.0},"opacity":0.699999988079071},"behaviorType":"hover"}},"characterStyleOverrides":[],"characters":"서울특별시 서초구 마방로 6길 28, \n5층 502호\n","lineIndentations":[0,0,0],"lineTypes":["NONE","NONE","NONE"],"listStartOffsets":[],"lineStyleOverrides":[0,0,0],"lineTextDirections":null,"resolvedParagraphValues":{"0":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":0.0},"1":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":0.0},"2":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":0.0}},"style":{"fontFamily":"Noto Sans KR","fontPostScriptName":"NotoSansKR-Regular","fontStyle":"Regular","fontVariantPosition":"NORMAL","fontSize":11.0,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","letterSpacing":0.0,"letterSpacingValue":0.0,"letterSpacingUnit":"PERCENT","lineHeightPx":17.8199996948242,"lineHeightPercent":135.0,"lineHeightPercentFontSize":162.0,"lineHeightUnit":"FONT_SIZE_%","paragraphSpacing":0,"paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecoration":"NONE","textDecorationSkipInk":false,"textDecorationStyle":"solid","textAutoResize":"NONE","textTruncation":"DISABLED"},"styleOverrideTable":{}},"2224:2962":{"type":"TEXT","id":"2224:2962","name":"010-8123-7857 02)-581-7856","absoluteBoundingBox":{"x":-803.0,"y":3119.5,"width":122.0,"height":45.0},"isolatedAbsoluteRenderBounds":{"x":-802.450012207031,"y":3124.2939453125,"width":85.5606079101562,"height":28.362060546875},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,0.5]],"size":{"x":122.0,"y":45.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":0.0,"g":0.0,"b":0.0,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"OUTSIDE","strokes":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"behaviors":{"hover":{"transition":{"easingType":"OUT_CUBIC","easingFunction":[0.215000003576279,0.610000014305115,0.354999989271164,1.0],"transitionDuration":0.300000011920929,"delay":0.0},"state":{"transform":{"m00":1.0,"m01":0.0,"m02":0.0,"m10":0.0,"m11":1.0,"m12":0.0},"opacity":0.699999988079071},"behaviorType":"hover"}},"characterStyleOverrides":[],"characters":"010-8123-7857\n02)-581-7856\n","lineIndentations":[0,0,0],"lineTypes":["NONE","NONE","NONE"],"listStartOffsets":[],"lineStyleOverrides":[0,0,0],"lineTextDirections":null,"resolvedParagraphValues":{"0":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":0.0},"1":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":0.0},"2":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":0.0}},"style":{"fontFamily":"Noto Sans KR","fontPostScriptName":"NotoSansKR-Regular","fontStyle":"Regular","fontVariantPosition":"NORMAL","fontSize":11.0,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","letterSpacing":0.99,"letterSpacingValue":9.0,"letterSpacingUnit":"PERCENT","lineHeightPx":17.8199996948242,"lineHeightPercent":135.0,"lineHeightPercentFontSize":162.0,"lineHeightUnit":"FONT_SIZE_%","paragraphSpacing":0,"paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecoration":"NONE","textDecorationSkipInk":false,"textDecorationStyle":"solid","textAutoResize":"NONE","textTruncation":"DISABLED"},"styleOverrideTable":{}},"2281:547":{"type":"TEXT","id":"2281:547","name":"Rich text/Header 6","absoluteBoundingBox":{"x":0.0,"y":0.0,"width":21.0,"height":22.0},"isolatedAbsoluteRenderBounds":{"x":0.392045468091965,"y":5.3636360168457,"width":19.3893184661865,"height":15.0909099578857},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,0.0]],"size":{"x":21.0,"y":22.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":0.0,"g":0.0,"b":0.0,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"INSIDE","strokes":[],"strokeWeight":0.0,"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"characterStyleOverrides":[],"characters":"Ag","lineIndentations":[0],"lineTypes":["NONE"],"listStartOffsets":[],"lineStyleOverrides":[0],"lineTextDirections":null,"resolvedParagraphValues":{"0":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":0.0}},"textAutoResize":"WIDTH_AND_HEIGHT","style":{"fontFamily":"Inter","fontPostScriptName":null,"fontStyle":"Semi Bold","textAutoResize":"WIDTH_AND_HEIGHT","fontVariantPosition":"NORMAL","fontSize":16.0,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","letterSpacing":-0.48,"letterSpacingValue":-3.0,"letterSpacingUnit":"PERCENT","lineHeightPx":22.3999996185303,"lineHeightPercent":115.680755615234,"lineHeightPercentFontSize":140.0,"lineHeightUnit":"FONT_SIZE_%","paragraphSpacing":0,"paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecoration":"NONE","textDecorationSkipInk":false,"textDecorationStyle":"solid","textTruncation":"DISABLED"},"styleOverrideTable":{}},"2224:2994":{"type":"TEXT","id":"2224:2994","name":"010-8123-7857 02)-581-7856","absoluteBoundingBox":{"x":-2147.0,"y":3591.5,"width":122.0,"height":45.0},"isolatedAbsoluteRenderBounds":{"x":-2146.44995117188,"y":3596.2939453125,"width":85.560546875,"height":28.362060546875},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,0.5]],"size":{"x":122.0,"y":45.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":0.0,"g":0.0,"b":0.0,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"OUTSIDE","strokes":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"behaviors":{"hover":{"transition":{"easingType":"OUT_CUBIC","easingFunction":[0.215000003576279,0.610000014305115,0.354999989271164,1.0],"transitionDuration":0.300000011920929,"delay":0.0},"state":{"transform":{"m00":1.0,"m01":0.0,"m02":0.0,"m10":0.0,"m11":1.0,"m12":0.0},"opacity":0.699999988079071},"behaviorType":"hover"}},"characterStyleOverrides":[],"characters":"010-8123-7857\n02)-581-7856\n","lineIndentations":[0,0,0],"lineTypes":["NONE","NONE","NONE"],"listStartOffsets":[],"lineStyleOverrides":[0,0,0],"lineTextDirections":null,"resolvedParagraphValues":{"0":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":0.0},"1":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":0.0},"2":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":0.0}},"style":{"fontFamily":"Noto Sans KR","fontPostScriptName":"NotoSansKR-Regular","fontStyle":"Regular","fontVariantPosition":"NORMAL","fontSize":11.0,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","letterSpacing":0.99,"letterSpacingValue":9.0,"letterSpacingUnit":"PERCENT","lineHeightPx":17.8199996948242,"lineHeightPercent":135.0,"lineHeightPercentFontSize":162.0,"lineHeightUnit":"FONT_SIZE_%","paragraphSpacing":0,"paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecoration":"NONE","textDecorationSkipInk":false,"textDecorationStyle":"solid","textAutoResize":"NONE","textTruncation":"DISABLED"},"styleOverrideTable":{}},"2715:1277":{"type":"TEXT","id":"2715:1277","name":"커뮤니티","absoluteBoundingBox":{"x":-2027.0,"y":145.0,"width":71.0,"height":23.0},"isolatedAbsoluteRenderBounds":{"x":-2026.69750976562,"y":149.688003540039,"width":70.396240234375,"height":16.5119934082031},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,165.0]],"size":{"x":71.0,"y":23.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":0.443900465965271,"g":0.442026853561401,"b":0.442026853561401,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"OUTSIDE","strokes":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"characterStyleOverrides":[],"characters":"커뮤니티","lineIndentations":[0],"lineTypes":["NONE"],"listStartOffsets":[],"lineStyleOverrides":[0],"lineTextDirections":null,"resolvedParagraphValues":{"0":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":16.0}},"textAutoResize":"WIDTH_AND_HEIGHT","textAlignHorizontal":"CENTER","textAlignVertical":"CENTER","paragraphSpacing":16.0,"style":{"styleIdForText":"StyleId:2608:2916","fontFamily":"Noto Sans KR","fontPostScriptName":"NotoSansKR-Medium","fontStyle":"Medium","hyperlink":{"type":"NODE","nodeID":"/커뮤니티Articles"},"paragraphSpacing":16.0,"textAutoResize":"WIDTH_AND_HEIGHT","fontVariantPosition":"NORMAL","textDecoration":"UNDERLINE","textDecorationSkipInk":true,"fontSize":16.0,"textAlignHorizontal":"CENTER","textAlignVertical":"CENTER","letterSpacing":3.84,"letterSpacingValue":24.0,"letterSpacingUnit":"PERCENT","lineHeightPx":23.2000007629395,"lineHeightPercent":120.83332824707,"lineHeightPercentFontSize":145.0,"lineHeightUnit":"FONT_SIZE_%","paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecorationStyle":"solid","textTruncation":"DISABLED"},"styleOverrideTable":{}},"2224:2989":{"type":"GROUP","id":"2224:2989","name":"Footer subhead","absoluteBoundingBox":{"x":-2147.0,"y":3520.0,"width":311.0,"height":14.0},"isolatedAbsoluteRenderBounds":{"x":-2147.0,"y":3520.0,"width":311.0,"height":14.0},"relativeTransform":[[1.0,0.0,32.0],[0.0,1.0,186.0]],"size":{"x":311.0,"y":14.0},"fills":[],"strokeAlign":"INSIDE","layoutAlign":"STRETCH","strokes":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"children":["2224:2990"]},"2224:2879":{"type":"FRAME","id":"2224:2879","name":"Footer section","absoluteBoundingBox":{"x":-2179.0,"y":3808.0,"width":1280.0,"height":932.0},"isolatedAbsoluteRenderBounds":{"x":-2179.0,"y":3808.0,"width":1280.0,"height":932.0},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,2959.0]],"size":{"x":1280.0,"y":932.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":1.0,"g":1.0,"b":1.0,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"INSIDE","layoutAlign":"STRETCH","strokes":[],"accessibleHTMLTag":"FOOTER","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"paddingBottom":185.0,"layoutMode":"VERTICAL","itemSpacing":105.0,"counterAxisAlignItems":"CENTER","primaryAxisAlignItems":"CENTER","primaryAxisSizingMode":"FIXED","counterAxisSizingMode":"FIXED","children":["2224:2880","2224:2883","2224:2885","2224:2892"]},"2224:2886":{"type":"FRAME","id":"2224:2886","name":"Contact column 1","absoluteBoundingBox":{"x":-2036.0,"y":4275.0,"width":352.0,"height":60.0},"isolatedAbsoluteRenderBounds":{"x":-2036.0,"y":4275.0,"width":352.0,"height":60.0},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,0.0]],"size":{"x":352.0,"y":60.0},"fills":[],"strokeAlign":"INSIDE","strokes":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"layoutMode":"VERTICAL","itemSpacing":2.0,"primaryAxisAlignItems":"CENTER","primaryAxisSizingMode":"FIXED","counterAxisSizingMode":"FIXED","children":["2224:2887","2224:2888"]},"2224:2990":{"type":"TEXT","id":"2224:2990","name":"Pioneer of the Wellness-tech Solution.","absoluteBoundingBox":{"x":-2147.0,"y":3520.0,"width":311.0,"height":14.0},"isolatedAbsoluteRenderBounds":{"x":-2145.98999023438,"y":3522.90991210938,"width":271.185302734375,"height":8.219970703125},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,0.0]],"size":{"x":311.0,"y":14.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":0.0,"g":0.0,"b":0.0,"a":1.0},"visible":true,"opacity":1.0}],"constraints":{"vertical":"TOP","horizontal":"SCALE"},"constraintValues":{"left":{"pixelOffset":0.0,"sizeFraction":0.0},"right":{"pixelOffset":0.0,"sizeFraction":1.0},"top":{"pixelOffset":0.0,"sizeFraction":0.0}},"strokeAlign":"OUTSIDE","strokes":[],"strokeWeight":3.21430063247681,"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"characterStyleOverrides":[],"characters":"Pioneer of the Wellness-tech Solution.","lineIndentations":[0],"lineTypes":["NONE"],"listStartOffsets":[],"lineStyleOverrides":[0],"lineTextDirections":null,"resolvedParagraphValues":{"0":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":0.0}},"textAutoResize":"HEIGHT","style":{"fontFamily":"Noto Sans KR","fontPostScriptName":"NotoSansKR-Regular","fontStyle":"Regular","textAutoResize":"HEIGHT","fontVariantPosition":"NORMAL","fontSize":10.0,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","letterSpacing":2.6,"letterSpacingValue":26.0,"letterSpacingUnit":"PERCENT","lineHeightPx":13.5,"lineHeightPercent":112.499992370605,"lineHeightPercentFontSize":135.0,"lineHeightUnit":"FONT_SIZE_%","paragraphSpacing":0,"paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecoration":"NONE","textDecorationSkipInk":false,"textDecorationStyle":"solid","textTruncation":"DISABLED"},"styleOverrideTable":{}},"2224:2988":{"type":"RECTANGLE","id":"2224:2988","name":"brainable_logo_ver.001-01 1","absoluteBoundingBox":{"x":-2147.0,"y":3424.5,"width":42.0,"height":35.0},"targetAspectRatio":{"x":1400.0,"y":1167.0},"isolatedAbsoluteRenderBounds":{"x":-2147.0,"y":3424.5,"width":42.0,"height":35.0},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,3.5]],"size":{"x":42.0,"y":35.0},"fills":[{"blendMode":"NORMAL","type":"IMAGE","scaleMode":"FILL","imageRef":"4f89b370cf29c22c8bfd83ffd6ad48b1dd2cd6af","originalImageWidth":1400,"originalImageHeight":1167,"visible":true,"opacity":1.0,"rotation":0.0}],"strokeAlign":"INSIDE","strokes":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[]},"8:1931":{"type":"TEXT","id":"8:1931","name":"20+","absoluteBoundingBox":{"x":-2018.5,"y":973.0,"width":183.0,"height":228.0},"isolatedAbsoluteRenderBounds":{"x":-1989.07751464844,"y":988.0,"width":123.037475585938,"height":190.43994140625},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,0.0]],"size":{"x":183.0,"y":228.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":1.0,"g":1.0,"b":1.0,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"OUTSIDE","layoutAlign":"STRETCH","strokes":[],"strokeWeight":3.21430063247681,"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"characterStyleOverrides":[],"characters":"20+","lineIndentations":[0],"lineTypes":["NONE"],"listStartOffsets":[],"lineStyleOverrides":[0],"lineTextDirections":null,"resolvedParagraphValues":{"0":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":0.0}},"textAutoResize":"HEIGHT","textAlignHorizontal":"CENTER","style":{"styleIdForText":"StyleId:2:721","fontFamily":"Noto Sans KR","fontPostScriptName":"NotoSansKR-Medium","fontStyle":"Medium","textAutoResize":"HEIGHT","responsiveTextStyleVariants":[{"minWidth":1280.0,"name":"Desktop","style":{"styleIdForText":"StyleId:2:721","fontSize":120.0,"letterSpacing":-3.6,"letterSpacingValue":-3.0,"letterSpacingUnit":"PERCENT","lineHeightPx":114.0,"lineHeightPercent":81.0666656494141,"lineHeightPercentFontSize":95.0,"lineHeightUnit":"FONT_SIZE_%"}},{"minWidth":800.0,"name":"Tablet","style":{"styleIdForText":"StyleId:2:721","fontSize":84.0,"letterSpacing":-2.52,"letterSpacingValue":-3.0,"letterSpacingUnit":"PERCENT","lineHeightPx":79.7999954223633,"lineHeightPercent":81.0666656494141,"lineHeightPercentFontSize":95.0,"lineHeightUnit":"FONT_SIZE_%"}},{"minWidth":1.0,"name":"Mobile","style":{"styleIdForText":"StyleId:2:721","fontSize":84.0,"letterSpacing":-2.52,"letterSpacingValue":-3.0,"letterSpacingUnit":"PERCENT","lineHeightPx":79.7999954223633,"lineHeightPercent":81.0666656494141,"lineHeightPercentFontSize":95.0,"lineHeightUnit":"FONT_SIZE_%"}}],"fontVariantPosition":"NORMAL","fontSize":120.0,"textAlignHorizontal":"CENTER","textAlignVertical":"TOP","letterSpacing":-3.6,"letterSpacingValue":-3.0,"letterSpacingUnit":"PERCENT","lineHeightPx":114.0,"lineHeightPercent":79.1666641235352,"lineHeightPercentFontSize":95.0,"lineHeightUnit":"FONT_SIZE_%","paragraphSpacing":0,"paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecoration":"NONE","textDecorationSkipInk":false,"textDecorationStyle":"solid","textTruncation":"DISABLED"},"styleOverrideTable":{}},"2224:2987":{"type":"RECTANGLE","id":"2224:2987","name":"brainable_logo_ver.001-03 1","absoluteBoundingBox":{"x":-2112.0,"y":3405.0,"width":89.0,"height":74.0},"targetAspectRatio":{"x":1400.0,"y":1167.0},"isolatedAbsoluteRenderBounds":{"x":-2112.0,"y":3405.0,"width":89.0,"height":74.0},"relativeTransform":[[1.0,0.0,35.0],[0.0,1.0,-16.0]],"size":{"x":89.0,"y":74.0},"fills":[{"blendMode":"NORMAL","type":"IMAGE","scaleMode":"FILL","imageRef":"d5fa8c9a8fa609d8b7d06565c3a9a33ab9d65149","originalImageWidth":1400,"originalImageHeight":1167,"visible":true,"opacity":1.0,"rotation":0.0}],"visible":false,"constraintValues":{"left":{"pixelOffset":35.0,"sizeFraction":0.0},"top":{"pixelOffset":-16.0,"sizeFraction":0.0}},"strokeAlign":"INSIDE","layoutPositioning":"ABSOLUTE","strokes":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[]},"8:1946":{"type":"FRAME","id":"8:1946","name":"Stat 3","absoluteBoundingBox":{"x":-460.0,"y":723.0,"width":213.0,"height":311.0},"isolatedAbsoluteRenderBounds":{"x":-460.0,"y":723.0,"width":237.443862915039,"height":311.0},"relativeTransform":[[1.0,0.0,215.0],[0.0,1.0,0.0]],"size":{"x":213.0,"y":311.0},"fills":[],"strokeAlign":"INSIDE","strokes":[],"accessibleHTMLTag":"SECTION","isDecorativeImage":false,"accessibleLabel":"Statistic 3 about Jones and Brown","ariaAttributes":{},"interactions":[],"behaviors":{"appear":{"otherLayer":{"sessionID":-1,"localID":-1},"trigger":"THIS_LAYER_IN_VIEW","direction":"UP","enterTransition":{"easingType":"OUT_CUBIC","easingFunction":[0.215000003576279,0.610000014305115,0.354999989271164,1.0],"transitionDuration":0.800000011920929,"delay":0.150000005960464},"enterState":{"transform":{"m00":1.0,"m01":0.0,"m02":0.0,"m10":0.0,"m11":1.0,"m12":0.0},"opacity":0.0},"exitTransition":{"easingType":"OUT_CUBIC","easingFunction":[0.215000003576279,0.610000014305115,0.354999989271164,1.0],"transitionDuration":0.600000023841858,"delay":0.0},"exitState":{"transform":{"m00":1.0,"m01":0.0,"m02":0.0,"m10":0.0,"m11":1.0,"m12":0.0},"opacity":1.0},"playsOnce":false,"behaviorType":"appear"}},"layoutMode":"VERTICAL","itemSpacing":56.0,"counterAxisSizingMode":"FIXED","children":["8:1947","2133:3195"]},"2224:2892":{"type":"FRAME","id":"2224:2892","name":"Footer copyright","absoluteBoundingBox":{"x":-2036.0,"y":4447.0,"width":994.0,"height":28.0},"isolatedAbsoluteRenderBounds":{"x":-2036.0,"y":4447.0,"width":994.0,"height":28.0},"relativeTransform":[[1.0,0.0,143.0],[0.0,1.0,639.0]],"size":{"x":994.0,"y":28.0},"fills":[],"strokeAlign":"INSIDE","strokes":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"layoutMode":"HORIZONTAL","itemSpacing":10.0,"counterAxisAlignItems":"CENTER","primaryAxisSizingMode":"FIXED","children":["2224:2893"]},"2224:3011":{"type":"TEXT","id":"2224:3011","name":"서울특별시 서초구 마방로 6길 28, 5층 502호","absoluteBoundingBox":{"x":-655.0,"y":3592.0,"width":155.0,"height":75.0},"isolatedAbsoluteRenderBounds":{"x":-654.703002929688,"y":3595.90307617188,"width":151.708221435547,"height":27.932861328125},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,1.0]],"size":{"x":155.0,"y":75.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":0.0,"g":0.0,"b":0.0,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"OUTSIDE","strokes":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"behaviors":{"hover":{"transition":{"easingType":"OUT_CUBIC","easingFunction":[0.215000003576279,0.610000014305115,0.354999989271164,1.0],"transitionDuration":0.300000011920929,"delay":0.0},"state":{"transform":{"m00":1.0,"m01":0.0,"m02":0.0,"m10":0.0,"m11":1.0,"m12":0.0},"opacity":0.699999988079071},"behaviorType":"hover"}},"characterStyleOverrides":[],"characters":"서울특별시 서초구 마방로 6길 28, \n5층 502호\n","lineIndentations":[0,0,0],"lineTypes":["NONE","NONE","NONE"],"listStartOffsets":[],"lineStyleOverrides":[0,0,0],"lineTextDirections":null,"resolvedParagraphValues":{"0":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":0.0},"1":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":0.0},"2":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":0.0}},"style":{"fontFamily":"Noto Sans KR","fontPostScriptName":"NotoSansKR-Regular","fontStyle":"Regular","fontVariantPosition":"NORMAL","fontSize":11.0,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","letterSpacing":0.0,"letterSpacingValue":0.0,"letterSpacingUnit":"PERCENT","lineHeightPx":17.8199996948242,"lineHeightPercent":135.0,"lineHeightPercentFontSize":162.0,"lineHeightUnit":"FONT_SIZE_%","paragraphSpacing":0,"paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecoration":"NONE","textDecorationSkipInk":false,"textDecorationStyle":"solid","textAutoResize":"NONE","textTruncation":"DISABLED"},"styleOverrideTable":{}},"2224:2893":{"type":"TEXT","id":"2224:2893","name":"Brainable Co., LTD. © 2025 All Rights Reserved","absoluteBoundingBox":{"x":-2036.0,"y":4447.0,"width":197.0,"height":28.0},"isolatedAbsoluteRenderBounds":{"x":-2035.44995117188,"y":4450.0400390625,"width":146.85888671875,"height":24.4599609375},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,0.0]],"size":{"x":197.0,"y":28.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":0.443900465965271,"g":0.442026853561401,"b":0.442026853561401,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"OUTSIDE","strokes":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"characterStyleOverrides":[],"characters":"Brainable Co., LTD.\n© 2025 All Rights Reserved","lineIndentations":[0,0],"lineTypes":["NONE","NONE"],"listStartOffsets":[],"lineStyleOverrides":[0,0],"lineTextDirections":null,"resolvedParagraphValues":{"0":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":0.0},"1":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":0.0}},"textAutoResize":"HEIGHT","style":{"fontFamily":"Noto Sans KR","fontPostScriptName":"NotoSansKR-Regular","fontStyle":"Regular","textAutoResize":"HEIGHT","fontVariantPosition":"NORMAL","fontSize":10.0,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","letterSpacing":1.0,"letterSpacingValue":10.0,"letterSpacingUnit":"PERCENT","lineHeightPx":14.0,"lineHeightPercent":116.666664123535,"lineHeightPercentFontSize":140.0,"lineHeightUnit":"FONT_SIZE_%","paragraphSpacing":0,"paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecoration":"NONE","textDecorationSkipInk":false,"textDecorationStyle":"solid","textTruncation":"DISABLED"},"styleOverrideTable":{}},"8:2134":{"type":"TEXT","id":"8:2134","name":"전문적인 의료 연계 시스템","absoluteBoundingBox":{"x":-771.0,"y":1771.0,"width":242.0,"height":27.0},"isolatedAbsoluteRenderBounds":{"x":-770.280029296875,"y":1776.21997070312,"width":239.458129882812,"height":18.580078125},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,20.0]],"size":{"x":242.0,"y":27.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":1.0,"g":1.0,"b":1.0,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"OUTSIDE","strokes":[],"strokeWeight":3.21430063247681,"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"characterStyleOverrides":[],"characters":"전문적인 의료 연계 시스템","lineIndentations":[0],"lineTypes":["NONE"],"listStartOffsets":[],"lineStyleOverrides":[0],"lineTextDirections":null,"resolvedParagraphValues":{"0":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":0.0}},"textAutoResize":"WIDTH_AND_HEIGHT","style":{"fontFamily":"Noto Sans KR","fontPostScriptName":"NotoSansKR-Bold","fontStyle":"Bold","textAutoResize":"WIDTH_AND_HEIGHT","fontVariantPosition":"NORMAL","fontSize":20.0,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","letterSpacing":2.0,"letterSpacingValue":10.0,"letterSpacingUnit":"PERCENT","lineHeightPx":27.0,"lineHeightPercent":112.499992370605,"lineHeightPercentFontSize":135.0,"lineHeightUnit":"FONT_SIZE_%","paragraphSpacing":0,"paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecoration":"NONE","textDecorationSkipInk":false,"textDecorationStyle":"solid","textTruncation":"DISABLED"},"styleOverrideTable":{}},"2224:2891":{"type":"FRAME","id":"2224:2891","name":"Contact column 4","absoluteBoundingBox":{"x":-1429.0,"y":4275.0,"width":255.0,"height":20.0},"isolatedAbsoluteRenderBounds":{"x":-1429.0,"y":4275.0,"width":255.0,"height":20.0},"relativeTransform":[[1.0,0.0,607.0],[0.0,1.0,0.0]],"size":{"x":255.0,"y":20.0},"fills":[],"strokeAlign":"INSIDE","strokes":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"layoutMode":"VERTICAL","itemSpacing":2.0,"primaryAxisAlignItems":"CENTER","children":[]},"2224:2917":{"type":"FRAME","id":"2224:2917","name":"Footer contact information","absoluteBoundingBox":{"x":-932.0,"y":3229.0,"width":994.0,"height":67.0},"isolatedAbsoluteRenderBounds":{"x":-932.0,"y":3229.0,"width":994.0,"height":67.0},"relativeTransform":[[1.0,0.0,-97.0],[0.0,1.0,467.0]],"size":{"x":994.0,"y":67.0},"fills":[],"strokeAlign":"INSIDE","strokes":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"paddingBottom":1.0,"layoutMode":"HORIZONTAL","primaryAxisSizingMode":"FIXED","children":["2224:2918","2224:2921","2224:2923"]},"2224:2889":{"type":"FRAME","id":"2224:2889","name":"Contact column 2","absoluteBoundingBox":{"x":-1684.0,"y":4275.0,"width":255.0,"height":66.0},"isolatedAbsoluteRenderBounds":{"x":-1684.0,"y":4275.0,"width":255.0,"height":66.0},"relativeTransform":[[1.0,0.0,352.0],[0.0,1.0,0.0]],"size":{"x":255.0,"y":66.0},"fills":[],"strokeAlign":"INSIDE","strokes":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"layoutMode":"VERTICAL","itemSpacing":2.0,"primaryAxisAlignItems":"CENTER","children":["2224:2890"]},"2224:2953":{"type":"FRAME","id":"2224:2953","name":"Footer section","absoluteBoundingBox":{"x":-835.0,"y":2862.0,"width":375.0,"height":464.0},"isolatedAbsoluteRenderBounds":{"x":-835.0,"y":2862.0,"width":590.0,"height":464.0},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,3021.0]],"size":{"x":375.0,"y":464.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":1.0,"g":1.0,"b":1.0,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"INSIDE","layoutAlign":"STRETCH","strokes":[],"accessibleHTMLTag":"FOOTER","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"paddingTop":87.0,"paddingRight":32.0,"paddingBottom":29.0,"paddingLeft":32.0,"layoutMode":"VERTICAL","itemSpacing":57.0,"primaryAxisSizingMode":"FIXED","counterAxisSizingMode":"FIXED","children":["2224:2954","2224:2957","2224:2959","2224:2966"]},"2224:2958":{"type":"TEXT","id":"2224:2958","name":"Pioneer of the Wellness-tech Solution.","absoluteBoundingBox":{"x":-803.0,"y":3048.0,"width":311.0,"height":14.0},"isolatedAbsoluteRenderBounds":{"x":-801.989990234375,"y":3050.90991210938,"width":271.185302734375,"height":8.219970703125},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,0.0]],"size":{"x":311.0,"y":14.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":0.0,"g":0.0,"b":0.0,"a":1.0},"visible":true,"opacity":1.0}],"constraints":{"vertical":"TOP","horizontal":"SCALE"},"constraintValues":{"left":{"pixelOffset":0.0,"sizeFraction":0.0},"right":{"pixelOffset":0.0,"sizeFraction":1.0},"top":{"pixelOffset":0.0,"sizeFraction":0.0}},"strokeAlign":"OUTSIDE","strokes":[],"strokeWeight":3.21430063247681,"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"characterStyleOverrides":[],"characters":"Pioneer of the Wellness-tech Solution.","lineIndentations":[0],"lineTypes":["NONE"],"listStartOffsets":[],"lineStyleOverrides":[0],"lineTextDirections":null,"resolvedParagraphValues":{"0":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":0.0}},"textAutoResize":"HEIGHT","style":{"fontFamily":"Noto Sans KR","fontPostScriptName":"NotoSansKR-Regular","fontStyle":"Regular","textAutoResize":"HEIGHT","fontVariantPosition":"NORMAL","fontSize":10.0,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","letterSpacing":2.6,"letterSpacingValue":26.0,"letterSpacingUnit":"PERCENT","lineHeightPx":13.5,"lineHeightPercent":112.499992370605,"lineHeightPercentFontSize":135.0,"lineHeightUnit":"FONT_SIZE_%","paragraphSpacing":0,"paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecoration":"NONE","textDecorationSkipInk":false,"textDecorationStyle":"solid","textTruncation":"DISABLED"},"styleOverrideTable":{}},"2715:1284":{"type":"TEXT","id":"2715:1284","name":"제품소개","absoluteBoundingBox":{"x":-683.0,"y":35.0,"width":71.0,"height":23.0},"isolatedAbsoluteRenderBounds":{"x":-682.697509765625,"y":39.6879997253418,"width":70.396240234375,"height":16.5120010375977},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,55.0]],"size":{"x":71.0,"y":23.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":0.443900465965271,"g":0.442026853561401,"b":0.442026853561401,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"OUTSIDE","strokes":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"characterStyleOverrides":[],"characters":"회사소개","lineIndentations":[0],"lineTypes":["NONE"],"listStartOffsets":[],"lineStyleOverrides":[0],"lineTextDirections":null,"resolvedParagraphValues":{"0":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":16.0}},"textAutoResize":"WIDTH_AND_HEIGHT","textAlignHorizontal":"CENTER","textAlignVertical":"CENTER","paragraphSpacing":16.0,"style":{"styleIdForText":"StyleId:2608:2916","fontFamily":"Noto Sans KR","fontPostScriptName":"NotoSansKR-Medium","fontStyle":"Medium","hyperlink":{"type":"NODE","nodeID":"/about_us"},"paragraphSpacing":16.0,"textAutoResize":"WIDTH_AND_HEIGHT","fontVariantPosition":"NORMAL","textDecoration":"UNDERLINE","textDecorationSkipInk":true,"fontSize":16.0,"textAlignHorizontal":"CENTER","textAlignVertical":"CENTER","letterSpacing":3.84,"letterSpacingValue":24.0,"letterSpacingUnit":"PERCENT","lineHeightPx":23.2000007629395,"lineHeightPercent":120.83332824707,"lineHeightPercentFontSize":145.0,"lineHeightUnit":"FONT_SIZE_%","paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecorationStyle":"solid","textTruncation":"DISABLED"},"styleOverrideTable":{}},"2224:2995":{"type":"FRAME","id":"2224:2995","name":"Contact column 2","absoluteBoundingBox":{"x":-1999.0,"y":3591.0,"width":155.0,"height":77.0},"isolatedAbsoluteRenderBounds":{"x":-1999.0,"y":3591.0,"width":155.0,"height":77.0},"relativeTransform":[[1.0,0.0,148.0],[0.0,1.0,0.0]],"size":{"x":155.0,"y":77.0},"fills":[],"strokeAlign":"INSIDE","strokes":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"layoutMode":"VERTICAL","itemSpacing":2.0,"primaryAxisAlignItems":"CENTER","primaryAxisSizingMode":"FIXED","counterAxisSizingMode":"FIXED","children":["2224:2996"]},"8:2165":{"type":"TEXT","id":"8:2165","name":"Real Estate Law","absoluteBoundingBox":{"x":-815.0,"y":2263.0,"width":131.0,"height":24.0},"isolatedAbsoluteRenderBounds":{"x":-813.452026367188,"y":2268.21997070312,"width":128.523986816406,"height":12.99609375},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,20.0]],"size":{"x":131.0,"y":24.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":1.0,"g":1.0,"b":1.0,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"OUTSIDE","strokes":[],"strokeWeight":3.21430063247681,"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"characterStyleOverrides":[],"characters":"Real Estate Law","lineIndentations":[0],"lineTypes":["NONE"],"listStartOffsets":[],"lineStyleOverrides":[0],"lineTextDirections":null,"resolvedParagraphValues":{"0":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":0.0}},"textAutoResize":"WIDTH_AND_HEIGHT","style":{"styleIdForText":"StyleId:4:749","fontFamily":"Geist","fontPostScriptName":"Geist-Medium","fontStyle":"Medium","textAutoResize":"WIDTH_AND_HEIGHT","fontVariantPosition":"NORMAL","fontSize":18.0,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","letterSpacing":-0.36,"letterSpacingValue":-2.0,"letterSpacingUnit":"PERCENT","lineHeightPx":24.3000011444092,"lineHeightPercent":103.846160888672,"lineHeightPercentFontSize":135.0,"lineHeightUnit":"FONT_SIZE_%","paragraphSpacing":0,"paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecoration":"NONE","textDecorationSkipInk":false,"textDecorationStyle":"solid","textTruncation":"DISABLED"},"styleOverrideTable":{}},"2224:2890":{"type":"TEXT","id":"2224:2890","name":"서울특별시 서초구 마방로 6길 28, 5층 502호","absoluteBoundingBox":{"x":-1684.0,"y":4275.0,"width":255.0,"height":66.0},"isolatedAbsoluteRenderBounds":{"x":-1683.55200195312,"y":4278.7998046875,"width":220.162719726562,"height":36.38427734375},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,0.0]],"size":{"x":255.0,"y":66.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":0.0,"g":0.0,"b":0.0,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"OUTSIDE","strokes":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"behaviors":{"hover":{"transition":{"easingType":"OUT_CUBIC","easingFunction":[0.215000003576279,0.610000014305115,0.354999989271164,1.0],"transitionDuration":0.300000011920929,"delay":0.0},"state":{"transform":{"m00":1.0,"m01":0.0,"m02":0.0,"m10":0.0,"m11":1.0,"m12":0.0},"opacity":0.699999988079071},"behaviorType":"hover"}},"characterStyleOverrides":[],"characters":"서울특별시 서초구 마방로 6길 28, \n5층 502호\n","lineIndentations":[0,0,0],"lineTypes":["NONE","NONE","NONE"],"listStartOffsets":[],"lineStyleOverrides":[0,0,0],"lineTextDirections":null,"resolvedParagraphValues":{"0":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":0.0},"1":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":0.0},"2":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":0.0}},"textAutoResize":"HEIGHT","style":{"fontFamily":"Noto Sans KR","fontPostScriptName":"NotoSansKR-DemiLight","fontStyle":"DemiLight","textAutoResize":"HEIGHT","fontVariantPosition":"NORMAL","fontSize":16.0,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","letterSpacing":0.0,"letterSpacingValue":0.0,"letterSpacingUnit":"PERCENT","lineHeightPx":22.3999996185303,"lineHeightPercent":116.666664123535,"lineHeightPercentFontSize":140.0,"lineHeightUnit":"FONT_SIZE_%","paragraphSpacing":0,"paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecoration":"NONE","textDecorationSkipInk":false,"textDecorationStyle":"solid","textTruncation":"DISABLED"},"styleOverrideTable":{}},"2224:2880":{"type":"FRAME","id":"2224:2880","name":"Footer header","absoluteBoundingBox":{"x":-2050.0,"y":3888.0,"width":1022.0,"height":126.0},"isolatedAbsoluteRenderBounds":{"x":-2050.0,"y":3888.0,"width":1022.0,"height":126.0},"relativeTransform":[[1.0,0.0,129.0],[0.0,1.0,80.0]],"size":{"x":1022.0,"y":126.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":1.0,"g":1.0,"b":1.0,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"INSIDE","strokes":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"layoutMode":"HORIZONTAL","itemSpacing":18.0,"counterAxisAlignItems":"CENTER","primaryAxisSizingMode":"FIXED","counterAxisSizingMode":"FIXED","children":["2224:2881","2224:2882"]},"2:722":{"type":"TEXT","id":"2:722","name":"Display/Display 3","absoluteBoundingBox":{"x":0.0,"y":0.0,"width":90.0,"height":72.0},"isolatedAbsoluteRenderBounds":{"x":1.5200001001358,"y":9.03999710083008,"width":82.413688659668,"height":66.2720031738281},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,0.0]],"size":{"x":90.0,"y":72.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":0.0,"g":0.0,"b":0.0,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"INSIDE","strokes":[],"strokeWeight":0.0,"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"characterStyleOverrides":[],"characters":"Ag","lineIndentations":[0],"lineTypes":["NONE"],"listStartOffsets":[],"lineStyleOverrides":[0],"lineTextDirections":null,"resolvedParagraphValues":{"0":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":0.0}},"textAutoResize":"WIDTH_AND_HEIGHT","style":{"fontFamily":"Geist","fontPostScriptName":"Geist-Regular","fontStyle":"Regular","hangingPunctuation":true,"textCase":"TITLE","textAutoResize":"WIDTH_AND_HEIGHT","responsiveTextStyleVariants":[{"minWidth":1200.0,"name":"Desktop","style":{"fontSize":76.0,"letterSpacing":-4.56,"letterSpacingValue":-6.0,"letterSpacingUnit":"PERCENT","lineHeightPx":72.1999969482422,"lineHeightPercent":81.0666656494141,"lineHeightPercentFontSize":95.0,"lineHeightUnit":"FONT_SIZE_%"}},{"minWidth":800.0,"name":"Tablet","style":{"fontSize":64.0,"letterSpacing":-3.84,"letterSpacingValue":-6.0,"letterSpacingUnit":"PERCENT","lineHeightPx":60.7999992370605,"lineHeightPercent":81.0666656494141,"lineHeightPercentFontSize":95.0,"lineHeightUnit":"FONT_SIZE_%"}},{"minWidth":1.0,"name":"Mobile","style":{"paragraphSpacing":12.0,"fontSize":36.0,"letterSpacing":-2.16,"letterSpacingValue":-6.0,"letterSpacingUnit":"PERCENT","lineHeightPx":34.2000007629395,"lineHeightPercent":81.0666656494141,"lineHeightPercentFontSize":95.0,"lineHeightUnit":"FONT_SIZE_%"}}],"fontVariantPosition":"NORMAL","fontSize":76.0,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","letterSpacing":-4.56,"letterSpacingValue":-6.0,"letterSpacingUnit":"PERCENT","lineHeightPx":72.1999969482422,"lineHeightPercent":73.0769271850586,"lineHeightPercentFontSize":95.0,"lineHeightUnit":"FONT_SIZE_%","paragraphSpacing":0,"paragraphIndent":0,"listSpacing":0,"italic":false,"textDecoration":"NONE","textDecorationSkipInk":false,"textDecorationStyle":"solid","textTruncation":"DISABLED"},"styleOverrideTable":{}},"8:2104":{"type":"FRAME","id":"8:2104","name":"Our services section","absoluteBoundingBox":{"x":-2179.0,"y":1505.0,"width":1280.0,"height":1701.0},"isolatedAbsoluteRenderBounds":{"x":-2183.0,"y":1505.0,"width":1288.0,"height":1709.0},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,656.0]],"size":{"x":1280.0,"y":1701.0},"fills":[{"blendMode":"NORMAL","type":"IMAGE","scaleMode":"FILL","imageRef":"cc318729f7d2f525731ddc2c91f842f8615c8d25","originalImageWidth":4096,"originalImageHeight":2730,"visible":true,"opacity":1.0,"rotation":0.0},{"opacity":0.589999973773956,"blendMode":"NORMAL","type":"SOLID","color":{"r":0.0,"g":0.0,"b":0.0,"a":1.0},"visible":true}],"strokeAlign":"INSIDE","layoutAlign":"STRETCH","strokes":[],"effects":[{"type":"DROP_SHADOW","visible":true,"color":{"r":0.0,"g":0.0,"b":0.0,"a":0.25},"blendMode":"NORMAL","offset":{"x":0.0,"y":4.0},"radius":4.0,"showShadowBehindNode":false,"spread":0.0}],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"paddingTop":128.0,"paddingRight":150.0,"paddingBottom":211.0,"paddingLeft":160.0,"layoutMode":"HORIZONTAL","itemSpacing":10.0,"counterAxisAlignItems":"CENTER","primaryAxisAlignItems":"CENTER","primaryAxisSizingMode":"FIXED","counterAxisSizingMode":"FIXED","children":["8:2105"]},"8:1962":{"type":"FRAME","id":"8:1962","name":"Stats section","absoluteBoundingBox":{"x":-835.0,"y":822.0,"width":375.0,"height":528.0},"isolatedAbsoluteRenderBounds":{"x":-835.0,"y":822.0,"width":375.0,"height":528.0},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,0.0]],"size":{"x":375.0,"y":528.0},"fills":[{"blendMode":"NORMAL","type":"VIDEO","scaleMode":"FILL","imageRef":"da2985ea5e77802d0e547ecd3c29d99a0245219c","originalImageWidth":1920,"originalImageHeight":1080,"videoRef":"74a54c3de77e8cfa940c1bbcf58dcd2aea219671","visible":true,"opacity":1.0,"autoplay":true,"mediaLoop":true,"muted":true,"showControls":true}],"strokeAlign":"INSIDE","layoutAlign":"STRETCH","strokes":[],"accessibleHTMLTag":"SECTION","isDecorativeImage":false,"accessibleLabel":"Statistics about John and Brown Legal","ariaAttributes":{},"interactions":[],"paddingTop":68.0,"paddingRight":25.0,"paddingBottom":30.0,"paddingLeft":25.0,"layoutMode":"VERTICAL","itemSpacing":25.0,"counterAxisAlignItems":"CENTER","primaryAxisAlignItems":"SPACE_BETWEEN","primaryAxisSizingMode":"FIXED","counterAxisSizingMode":"FIXED","children":["2133:3203","8:1949"]},"2224:2884":{"type":"TEXT","id":"2224:2884","name":"Pioneer of the Wellness-tech Solution.","absoluteBoundingBox":{"x":-2036.0,"y":4135.0,"width":994.0,"height":19.0},"isolatedAbsoluteRenderBounds":{"x":-2034.57202148438,"y":4138.673828125,"width":501.282836914062,"height":11.50830078125},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,16.0]],"size":{"x":994.0,"y":19.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":0.0,"g":0.0,"b":0.0,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"OUTSIDE","layoutGrow":1.0,"strokes":[],"strokeWeight":3.21430063247681,"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"characterStyleOverrides":[],"characters":"Pioneer of the Wellness-tech Solution.","lineIndentations":[0],"lineTypes":["NONE"],"listStartOffsets":[],"lineStyleOverrides":[0],"lineTextDirections":null,"resolvedParagraphValues":{"0":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":0.0}},"textAutoResize":"HEIGHT","style":{"fontFamily":"Noto Sans KR","fontPostScriptName":"NotoSansKR-DemiLight","fontStyle":"DemiLight","textAutoResize":"HEIGHT","fontVariantPosition":"NORMAL","fontSize":14.0,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","letterSpacing":7.0,"letterSpacingValue":50.0,"letterSpacingUnit":"PERCENT","lineHeightPx":18.8999996185303,"lineHeightPercent":112.499992370605,"lineHeightPercentFontSize":135.0,"lineHeightUnit":"FONT_SIZE_%","paragraphSpacing":0,"paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecoration":"NONE","textDecorationSkipInk":false,"textDecorationStyle":"solid","textTruncation":"DISABLED"},"styleOverrideTable":{}},"8:2107":{"type":"FRAME","id":"8:2107","name":"Services list","absoluteBoundingBox":{"x":-2068.5,"y":1903.5,"width":1069.0,"height":1063.0},"isolatedAbsoluteRenderBounds":{"x":-2068.5,"y":1903.5,"width":1069.0,"height":1063.0},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,248.0]],"size":{"x":1069.0,"y":1063.0},"fills":[],"strokeAlign":"INSIDE","strokes":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"layoutMode":"VERTICAL","itemSpacing":102.0,"primaryAxisSizingMode":"FIXED","counterAxisSizingMode":"FIXED","children":["8:2108","8:2111","8:2114","8:2117","8:2120","8:2123"]},"8:2152":{"type":"FRAME","id":"8:2152","name":"Service 1","absoluteBoundingBox":{"x":-815.0,"y":1631.0,"width":320.0,"height":245.0},"isolatedAbsoluteRenderBounds":{"x":-815.0,"y":1631.0,"width":320.0,"height":245.0},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,0.0]],"size":{"x":320.0,"y":245.0},"fills":[],"strokeAlign":"INSIDE","strokes":[],"individualStrokeWeights":{"top":0.5,"right":0.0,"bottom":0.0,"left":0.0},"accessibleHTMLTag":"SECTION","isDecorativeImage":false,"accessibleLabel":"Specific areas of business and corporate law that we help with","ariaAttributes":{},"interactions":[],"behaviors":{"appear":{"otherLayer":{"sessionID":-1,"localID":-1},"trigger":"THIS_LAYER_IN_VIEW","direction":"UP","enterTransition":{"easingType":"OUT_CUBIC","easingFunction":[0.215000003576279,0.610000014305115,0.354999989271164,1.0],"transitionDuration":0.800000011920929,"delay":0.0},"enterState":{"transform":{"m00":1.0,"m01":0.0,"m02":0.0,"m10":0.0,"m11":1.0,"m12":0.0},"opacity":0.0},"exitTransition":{"easingType":"OUT_CUBIC","easingFunction":[0.215000003576279,0.610000014305115,0.354999989271164,1.0],"transitionDuration":0.600000023841858,"delay":0.0},"exitState":{"transform":{"m00":1.0,"m01":0.0,"m02":0.0,"m10":0.0,"m11":1.0,"m12":0.0},"opacity":1.0},"playsOnce":false,"behaviorType":"appear"}},"paddingBottom":20.0,"layoutMode":"VERTICAL","itemSpacing":48.0,"primaryAxisSizingMode":"FIXED","counterAxisSizingMode":"FIXED","children":["8:2153","8:2154"]},"2224:2924":{"type":"FRAME","id":"2224:2924","name":"Footer copyright","absoluteBoundingBox":{"x":-932.0,"y":3401.0,"width":994.0,"height":28.0},"isolatedAbsoluteRenderBounds":{"x":-932.0,"y":3401.0,"width":994.0,"height":28.0},"relativeTransform":[[1.0,0.0,-97.0],[0.0,1.0,639.0]],"size":{"x":994.0,"y":28.0},"fills":[],"strokeAlign":"INSIDE","strokes":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"layoutMode":"HORIZONTAL","itemSpacing":10.0,"counterAxisAlignItems":"CENTER","primaryAxisSizingMode":"FIXED","children":["2224:2925"]},"2224:2883":{"type":"FRAME","id":"2224:2883","name":"Footer subhead","absoluteBoundingBox":{"x":-2036.0,"y":4119.0,"width":994.0,"height":51.0},"isolatedAbsoluteRenderBounds":{"x":-2036.0,"y":4119.0,"width":994.0,"height":51.0},"relativeTransform":[[1.0,0.0,143.0],[0.0,1.0,311.0]],"size":{"x":994.0,"y":51.0},"fills":[],"strokeAlign":"INSIDE","strokes":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"layoutMode":"HORIZONTAL","itemSpacing":10.0,"counterAxisAlignItems":"CENTER","primaryAxisAlignItems":"CENTER","primaryAxisSizingMode":"FIXED","counterAxisSizingMode":"FIXED","children":["2224:2884"]},"8:1964":{"type":"FRAME","id":"8:1964","name":"Stats section","absoluteBoundingBox":{"x":-2179.0,"y":849.0,"width":1280.0,"height":656.0},"isolatedAbsoluteRenderBounds":{"x":-2179.0,"y":849.0,"width":1280.0,"height":656.0},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,0.0]],"size":{"x":1280.0,"y":656.0},"fills":[{"blendMode":"NORMAL","type":"VIDEO","scaleMode":"FILL","imageRef":"da2985ea5e77802d0e547ecd3c29d99a0245219c","originalImageWidth":1920,"originalImageHeight":1080,"videoRef":"74a54c3de77e8cfa940c1bbcf58dcd2aea219671","visible":true,"opacity":1.0,"autoplay":true,"mediaLoop":true,"muted":true,"showControls":false}],"strokeAlign":"INSIDE","layoutAlign":"STRETCH","strokes":[],"accessibleHTMLTag":"SECTION","isDecorativeImage":false,"accessibleLabel":"Statistics about John and Brown Legal","ariaAttributes":{},"interactions":[],"paddingTop":124.0,"paddingRight":176.0,"paddingBottom":121.0,"paddingLeft":194.0,"layoutMode":"VERTICAL","itemSpacing":10.0,"counterAxisAlignItems":"CENTER","primaryAxisSizingMode":"FIXED","counterAxisSizingMode":"FIXED","children":["2133:3201","8:1929"]},"2715:1058":{"type":"TEXT","id":"2715:1058","name":"제품소개","absoluteBoundingBox":{"x":-249.0,"y":-109.0,"width":59.0,"height":23.0},"isolatedAbsoluteRenderBounds":{"x":-248.817504882812,"y":-105.312004089355,"width":58.6362457275391,"height":16.5120010375977},"relativeTransform":[[1.0,0.0,262.0],[0.0,1.0,0.0]],"size":{"x":59.0,"y":23.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":0.443900465965271,"g":0.442026853561401,"b":0.442026853561401,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"OUTSIDE","strokes":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"characterStyleOverrides":[],"characters":"커뮤니티","lineIndentations":[0],"lineTypes":["NONE"],"listStartOffsets":[],"lineStyleOverrides":[0],"lineTextDirections":null,"resolvedParagraphValues":{"0":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":16.0}},"textAutoResize":"WIDTH_AND_HEIGHT","textAlignHorizontal":"CENTER","textAlignVertical":"CENTER","paragraphSpacing":16.0,"fallbackFonts":[{"fontFamily":"Noto Sans KR","fontStyle":"Medium"}],"style":{"fontFamily":"Inter","fontPostScriptName":"Inter-Medium","fontStyle":"Medium","fallbackFonts":[{"fontFamily":"Noto Sans KR","fontStyle":"Medium"}],"hyperlink":{"type":"NODE","nodeID":"/커뮤니티Articles"},"paragraphSpacing":16.0,"textAutoResize":"WIDTH_AND_HEIGHT","fontVariantPosition":"NORMAL","textDecoration":"UNDERLINE","textDecorationSkipInk":true,"fontSize":16.0,"textAlignHorizontal":"CENTER","textAlignVertical":"CENTER","letterSpacing":-0.08,"letterSpacingValue":-0.5,"letterSpacingUnit":"PERCENT","lineHeightPx":23.2000007629395,"lineHeightPercent":119.812210083008,"lineHeightPercentFontSize":145.0,"lineHeightUnit":"FONT_SIZE_%","paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecorationStyle":"solid","textTruncation":"DISABLED"},"styleOverrideTable":{}},"8:2121":{"type":"TEXT","id":"8:2121","name":"Real Estate Law","absoluteBoundingBox":{"x":-2068.5,"y":2535.5,"width":131.0,"height":24.0},"isolatedAbsoluteRenderBounds":{"x":-2066.95190429688,"y":2540.71997070312,"width":128.523803710938,"height":12.99609375},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,20.0]],"size":{"x":131.0,"y":24.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":1.0,"g":1.0,"b":1.0,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"OUTSIDE","strokes":[],"strokeWeight":3.21430063247681,"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"characterStyleOverrides":[],"characters":"Real Estate Law","lineIndentations":[0],"lineTypes":["NONE"],"listStartOffsets":[],"lineStyleOverrides":[0],"lineTextDirections":null,"resolvedParagraphValues":{"0":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":0.0}},"textAutoResize":"WIDTH_AND_HEIGHT","style":{"styleIdForText":"StyleId:4:749","fontFamily":"Geist","fontPostScriptName":"Geist-Medium","fontStyle":"Medium","textAutoResize":"WIDTH_AND_HEIGHT","fontVariantPosition":"NORMAL","fontSize":18.0,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","letterSpacing":-0.36,"letterSpacingValue":-2.0,"letterSpacingUnit":"PERCENT","lineHeightPx":24.3000011444092,"lineHeightPercent":103.846160888672,"lineHeightPercentFontSize":135.0,"lineHeightUnit":"FONT_SIZE_%","paragraphSpacing":0,"paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecoration":"NONE","textDecorationSkipInk":false,"textDecorationStyle":"solid","textTruncation":"DISABLED"},"styleOverrideTable":{}},"8:2119":{"type":"TEXT","id":"8:2119","name":"DUI and traffic offenses White-collar crime defese Drug charges Assault and battery cases Expungements and record sealing","absoluteBoundingBox":{"x":-1508.5,"y":2535.5,"width":420.0,"height":120.0},"isolatedAbsoluteRenderBounds":{"x":-1508.14001464844,"y":2540.70190429688,"width":266.703369140625,"height":111.714111328125},"relativeTransform":[[1.0,0.0,560.0],[0.0,1.0,20.0]],"size":{"x":420.0,"y":120.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":1.0,"g":1.0,"b":1.0,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"OUTSIDE","strokes":[],"strokeWeight":3.21430063247681,"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"characterStyleOverrides":[],"characters":"DUI and traffic offenses\nWhite-collar crime defese\nDrug charges\nAssault and battery cases\nExpungements and record sealing","lineIndentations":[0,0,0,0,0],"lineTypes":["NONE","NONE","NONE","NONE","NONE"],"listStartOffsets":[],"lineStyleOverrides":[0,0,0,0,0],"lineTextDirections":null,"resolvedParagraphValues":{"0":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":0.0},"1":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":0.0},"2":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":0.0},"3":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":0.0},"4":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":0.0}},"textAutoResize":"HEIGHT","style":{"styleIdForText":"StyleId:6:1353","fontFamily":"Geist","fontPostScriptName":"Geist-Regular","fontStyle":"Regular","textAutoResize":"HEIGHT","responsiveTextStyleVariants":[{"minWidth":1280.0,"name":"Desktop","style":{"styleIdForText":"StyleId:6:1353","fontSize":18.0,"letterSpacing":-0.36,"letterSpacingValue":-2.0,"letterSpacingUnit":"PERCENT","lineHeightPx":24.3000011444092,"lineHeightPercent":115.199996948242,"lineHeightPercentFontSize":135.0,"lineHeightUnit":"FONT_SIZE_%"}}],"fontVariantPosition":"NORMAL","fontSize":18.0,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","letterSpacing":-0.36,"letterSpacingValue":-2.0,"letterSpacingUnit":"PERCENT","lineHeightPx":24.3000011444092,"lineHeightPercent":103.846160888672,"lineHeightPercentFontSize":135.0,"lineHeightUnit":"FONT_SIZE_%","paragraphSpacing":0,"paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecoration":"NONE","textDecorationSkipInk":false,"textDecorationStyle":"solid","textTruncation":"DISABLED"},"styleOverrideTable":{}},"2224:2918":{"type":"FRAME","id":"2224:2918","name":"Contact column 1","absoluteBoundingBox":{"x":-932.0,"y":3229.0,"width":352.0,"height":60.0},"isolatedAbsoluteRenderBounds":{"x":-932.0,"y":3229.0,"width":352.0,"height":60.0},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,0.0]],"size":{"x":352.0,"y":60.0},"fills":[],"strokeAlign":"INSIDE","strokes":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"layoutMode":"VERTICAL","itemSpacing":2.0,"primaryAxisAlignItems":"CENTER","primaryAxisSizingMode":"FIXED","counterAxisSizingMode":"FIXED","children":["2224:2919","2224:2920"]},"4:749":{"key":"556357e863bd517cf8197a5190f96795b0e23e64","name":"Header/Header 3","styleType":"TEXT","remote":false,"description":"","id":"4:749","assetId":"StyleId:4:749","type":"STYLE","style":{"fontFamily":"Geist","fontPostScriptName":"Geist-Medium","fontStyle":"Medium","textAutoResize":"WIDTH_AND_HEIGHT","fontSize":18.0,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","letterSpacing":-0.36,"letterSpacingValue":-2.0,"letterSpacingUnit":"PERCENT","lineHeightPx":24.3000011444092,"lineHeightPercent":103.846160888672,"lineHeightPercentFontSize":135.0,"lineHeightUnit":"FONT_SIZE_%"}},"2608:2834":{"type":"TEXT","id":"2608:2834","name":"Text","absoluteBoundingBox":{"x":0.0,"y":0.0,"width":12.0,"height":12.0},"isolatedAbsoluteRenderBounds":{"x":0.0800000056624413,"y":2.70999956130981,"width":11.1089067459106,"height":9.82999992370605},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,0.0]],"size":{"x":12.0,"y":12.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":0.0,"g":0.0,"b":0.0,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"INSIDE","strokes":[],"strokeWeight":0.0,"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"characterStyleOverrides":[],"characters":"Ag","lineIndentations":[0],"lineTypes":["NONE"],"listStartOffsets":[],"lineStyleOverrides":[0],"lineTextDirections":null,"resolvedParagraphValues":{"0":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":0.0}},"textAutoResize":"WIDTH_AND_HEIGHT","style":{"fontFamily":"Noto Sans KR","fontPostScriptName":"NotoSansKR-Light","fontStyle":"Light","textAutoResize":"WIDTH_AND_HEIGHT","fontVariantPosition":"NORMAL","fontSize":10.0,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","letterSpacing":0.0,"letterSpacingValue":0.0,"letterSpacingUnit":"PERCENT","lineHeightPx":12.0,"lineHeightPercent":100.0,"lineHeightUnit":"INTRINSIC_%","paragraphSpacing":0,"paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecoration":"NONE","textDecorationSkipInk":false,"textDecorationStyle":"solid","textTruncation":"DISABLED","lineHeightPercentFontSize":100},"styleOverrideTable":{}},"8:2118":{"type":"TEXT","id":"8:2118","name":"Criminal Defense","absoluteBoundingBox":{"x":-2068.5,"y":2535.5,"width":139.0,"height":24.0},"isolatedAbsoluteRenderBounds":{"x":-2067.7080078125,"y":2540.43188476562,"width":137.418090820312,"height":13.356201171875},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,20.0]],"size":{"x":139.0,"y":24.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":1.0,"g":1.0,"b":1.0,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"OUTSIDE","strokes":[],"strokeWeight":3.21430063247681,"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"characterStyleOverrides":[],"characters":"Criminal Defense","lineIndentations":[0],"lineTypes":["NONE"],"listStartOffsets":[],"lineStyleOverrides":[0],"lineTextDirections":null,"resolvedParagraphValues":{"0":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":0.0}},"textAutoResize":"WIDTH_AND_HEIGHT","style":{"styleIdForText":"StyleId:4:749","fontFamily":"Geist","fontPostScriptName":"Geist-Medium","fontStyle":"Medium","textAutoResize":"WIDTH_AND_HEIGHT","fontVariantPosition":"NORMAL","fontSize":18.0,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","letterSpacing":-0.36,"letterSpacingValue":-2.0,"letterSpacingUnit":"PERCENT","lineHeightPx":24.3000011444092,"lineHeightPercent":103.846160888672,"lineHeightPercentFontSize":135.0,"lineHeightUnit":"FONT_SIZE_%","paragraphSpacing":0,"paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecoration":"NONE","textDecorationSkipInk":false,"textDecorationStyle":"solid","textTruncation":"DISABLED"},"styleOverrideTable":{}},"8:2113":{"type":"TEXT","id":"8:2113","name":"브레인에이블은 전문 의료진과의 긴밀한 협력을 통한 실용적인 솔루션을 제공하며, 삶의 질을 향상시키기 위해 끊임없이 노력하고 있습니다. 다방면의 지속적인 협력과 피드백을 통해 제품의 개선과 발전을 이루고 있습니다. 모든 단계에서의 투명한 소통을 통한 최적의 사용자 맞춤형 자체개발 솔루션을 제공합니다.","absoluteBoundingBox":{"x":-1709.5,"y":2253.5,"width":716.0,"height":203.0},"isolatedAbsoluteRenderBounds":{"x":-1708.79797363281,"y":2259.46997070312,"width":698.209838867188,"height":97.4521484375},"relativeTransform":[[1.0,0.0,359.0],[0.0,1.0,43.0]],"size":{"x":716.0,"y":203.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":1.0,"g":1.0,"b":1.0,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"OUTSIDE","strokes":[],"strokeWeight":3.21430063247681,"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"characterStyleOverrides":[6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,4,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,0,0,0,0,0,0,0,0,0,0,0,0,0,6,6,6,0,0,0,0,0,6,6,6,6,6,6,6,6],"characters":"브레인에이블은 전문 의료진과의 긴밀한 협력을 통한 실용적인 솔루션을 \n제공하며, 삶의 질을 향상시키기 위해 끊임없이 노력하고 있습니다. \n다방면의 지속적인 협력과 피드백을 통해 제품의 개선과 발전을 이루고 있습니다. \n모든 단계에서의 투명한 소통을 통한 최적의 사용자 맞춤형 자체개발 솔루션을 제공합니다.","lineIndentations":[0,0,0,0],"lineTypes":["NONE","NONE","NONE","NONE"],"listStartOffsets":[],"lineStyleOverrides":[0,0,0,0],"lineTextDirections":null,"resolvedParagraphValues":{"0":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":0.0},"1":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":0.0},"2":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":0.0},"3":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":0.0}},"style":{"fontFamily":"Noto Sans KR","fontPostScriptName":"NotoSansKR-Regular","fontStyle":"Regular","fontVariantPosition":"NORMAL","fontSize":18.0,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","letterSpacing":0.9,"letterSpacingValue":5.0,"letterSpacingUnit":"PERCENT","lineHeightPx":27.0,"lineHeightPercent":124.999992370605,"lineHeightPercentFontSize":150.0,"lineHeightUnit":"FONT_SIZE_%","paragraphSpacing":0,"paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecoration":"NONE","textDecorationSkipInk":false,"textDecorationStyle":"solid","textAutoResize":"NONE","textTruncation":"DISABLED"},"styleOverrideTable":{"6":{"letterSpacing":0.9,"letterSpacingValue":5.0,"letterSpacingUnit":"PERCENT","paragraphSpacing":0,"paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecoration":"NONE","textDecorationSkipInk":false,"textDecorationStyle":"solid","textAutoResize":"NONE","textTruncation":"DISABLED","lineHeightPercent":100,"lineHeightPercentFontSize":100},"4":{"letterSpacing":0.9,"letterSpacingValue":5.0,"letterSpacingUnit":"PERCENT","lineHeightPx":27.0,"lineHeightPercent":128.0,"lineHeightPercentFontSize":150.0,"lineHeightUnit":"FONT_SIZE_%","paragraphSpacing":0,"paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecoration":"NONE","textDecorationSkipInk":false,"textDecorationStyle":"solid","textAutoResize":"NONE","textTruncation":"DISABLED"}}},"8:2164":{"type":"FRAME","id":"8:2164","name":"Service 5","absoluteBoundingBox":{"x":-815.0,"y":2243.0,"width":980.0,"height":160.0},"isolatedAbsoluteRenderBounds":{"x":-815.0,"y":2243.0,"width":980.0,"height":160.0},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,612.0]],"size":{"x":980.0,"y":160.0},"fills":[],"visible":false,"strokeAlign":"INSIDE","layoutAlign":"STRETCH","strokes":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":1.0,"g":1.0,"b":1.0,"a":1.0},"visible":true,"opacity":1.0}],"individualStrokeWeights":{"top":0.5,"right":0.0,"bottom":0.0,"left":0.0},"accessibleHTMLTag":"SECTION","isDecorativeImage":false,"accessibleLabel":"Specific areas of real estate law that we help with","ariaAttributes":{},"interactions":[],"behaviors":{"appear":{"otherLayer":{"sessionID":-1,"localID":-1},"trigger":"THIS_LAYER_IN_VIEW","direction":"UP","enterTransition":{"easingType":"OUT_CUBIC","easingFunction":[0.215000003576279,0.610000014305115,0.354999989271164,1.0],"transitionDuration":0.800000011920929,"delay":0.0},"enterState":{"transform":{"m00":1.0,"m01":0.0,"m02":0.0,"m10":0.0,"m11":1.0,"m12":0.0},"opacity":0.0},"exitTransition":{"easingType":"OUT_CUBIC","easingFunction":[0.215000003576279,0.610000014305115,0.354999989271164,1.0],"transitionDuration":0.600000023841858,"delay":0.0},"exitState":{"transform":{"m00":1.0,"m01":0.0,"m02":0.0,"m10":0.0,"m11":1.0,"m12":0.0},"opacity":1.0},"playsOnce":false,"behaviorType":"appear"}},"paddingTop":20.0,"paddingBottom":20.0,"layoutMode":"HORIZONTAL","itemSpacing":266.0,"counterAxisSizingMode":"FIXED","children":["8:2165","8:2166"]},"8:2114":{"type":"FRAME","id":"8:2114","name":"Service 3","absoluteBoundingBox":{"x":-2068.5,"y":2574.5,"width":1069.0,"height":335.0},"isolatedAbsoluteRenderBounds":{"x":-2068.5,"y":2574.5,"width":1069.0,"height":335.0},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,671.0]],"size":{"x":1069.0,"y":335.0},"fills":[],"strokeAlign":"INSIDE","layoutAlign":"STRETCH","strokes":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":1.0,"g":1.0,"b":1.0,"a":1.0},"visible":true,"opacity":1.0}],"individualStrokeWeights":{"top":0.5,"right":0.0,"bottom":0.0,"left":0.0},"accessibleHTMLTag":"SECTION","isDecorativeImage":false,"accessibleLabel":"Specific areas of family law that we help with","ariaAttributes":{},"interactions":[],"behaviors":{"appear":{"otherLayer":{"sessionID":-1,"localID":-1},"trigger":"THIS_LAYER_IN_VIEW","direction":"UP","enterTransition":{"easingType":"OUT_CUBIC","easingFunction":[0.215000003576279,0.610000014305115,0.354999989271164,1.0],"transitionDuration":0.800000011920929,"delay":0.0},"enterState":{"transform":{"m00":1.0,"m01":0.0,"m02":0.0,"m10":0.0,"m11":1.0,"m12":0.0},"opacity":0.0},"exitTransition":{"easingType":"OUT_CUBIC","easingFunction":[0.215000003576279,0.610000014305115,0.354999989271164,1.0],"transitionDuration":0.600000023841858,"delay":0.0},"exitState":{"transform":{"m00":1.0,"m01":0.0,"m02":0.0,"m10":0.0,"m11":1.0,"m12":0.0},"opacity":1.0},"playsOnce":false,"behaviorType":"appear"}},"paddingTop":43.0,"paddingBottom":20.0,"paddingLeft":5.0,"layoutMode":"HORIZONTAL","itemSpacing":218.0,"primaryAxisSizingMode":"FIXED","counterAxisSizingMode":"FIXED","children":["8:2115","8:2116"]},"2715:1039":{"type":"TEXT","id":"2715:1039","name":"제품소개","absoluteBoundingBox":{"x":-1204.0,"y":-109.0,"width":59.0,"height":23.0},"isolatedAbsoluteRenderBounds":{"x":-1203.81750488281,"y":-105.312004089355,"width":58.63623046875,"height":16.5120010375977},"relativeTransform":[[1.0,0.0,171.0],[0.0,1.0,0.0]],"size":{"x":59.0,"y":23.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":0.443900465965271,"g":0.442026853561401,"b":0.442026853561401,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"OUTSIDE","strokes":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"characterStyleOverrides":[],"characters":"제품소개","lineIndentations":[0],"lineTypes":["NONE"],"listStartOffsets":[],"lineStyleOverrides":[0],"lineTextDirections":null,"resolvedParagraphValues":{"0":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":16.0}},"textAutoResize":"WIDTH_AND_HEIGHT","textAlignHorizontal":"CENTER","textAlignVertical":"CENTER","paragraphSpacing":16.0,"fallbackFonts":[{"fontFamily":"Noto Sans KR","fontStyle":"Medium"}],"style":{"fontFamily":"Inter","fontPostScriptName":"Inter-Medium","fontStyle":"Medium","fallbackFonts":[{"fontFamily":"Noto Sans KR","fontStyle":"Medium"}],"hyperlink":{"type":"NODE","nodeID":"/laserable"},"paragraphSpacing":16.0,"textAutoResize":"WIDTH_AND_HEIGHT","fontVariantPosition":"NORMAL","textDecoration":"UNDERLINE","textDecorationSkipInk":true,"fontSize":16.0,"textAlignHorizontal":"CENTER","textAlignVertical":"CENTER","letterSpacing":-0.08,"letterSpacingValue":-0.5,"letterSpacingUnit":"PERCENT","lineHeightPx":23.2000007629395,"lineHeightPercent":119.812210083008,"lineHeightPercentFontSize":145.0,"lineHeightUnit":"FONT_SIZE_%","paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecorationStyle":"solid","textTruncation":"DISABLED"},"styleOverrideTable":{}},"2224:2911":{"type":"FRAME","id":"2224:2911","name":"Footer section","absoluteBoundingBox":{"x":-835.0,"y":2762.0,"width":800.0,"height":932.0},"isolatedAbsoluteRenderBounds":{"x":-946.0,"y":2762.0,"width":1022.0,"height":932.0},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,2171.0]],"size":{"x":800.0,"y":932.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":1.0,"g":1.0,"b":1.0,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"INSIDE","layoutAlign":"STRETCH","strokes":[],"accessibleHTMLTag":"FOOTER","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"paddingBottom":185.0,"layoutMode":"VERTICAL","itemSpacing":105.0,"counterAxisAlignItems":"CENTER","primaryAxisAlignItems":"CENTER","primaryAxisSizingMode":"FIXED","counterAxisSizingMode":"FIXED","children":["2224:2912","2224:2915","2224:2917","2224:2924"]},"2715:1070":{"type":"RECTANGLE","id":"2715:1070","name":"Logo","absoluteBoundingBox":{"x":-753.0,"y":-111.0,"width":211.0,"height":75.0},"isolatedAbsoluteRenderBounds":{"x":-753.0,"y":-111.0,"width":211.0,"height":75.0},"relativeTransform":[[1.0,0.0,33.0],[0.0,1.0,24.0]],"size":{"x":211.0,"y":75.0},"fills":[{"blendMode":"NORMAL","type":"IMAGE","scaleMode":"FILL","imageRef":"64270238d3de4edd07597c9179b36856b5a53af3","originalImageWidth":1400,"originalImageHeight":1167,"visible":true,"opacity":1.0,"rotation":0.0}],"strokeAlign":"INSIDE","strokes":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"accessibleLabel":"Logomark","ariaAttributes":{},"interactions":[]},"8:2110":{"type":"TEXT","id":"8:2110","name":"브레인에이블은 지속적이고 자체적인 연구를 통해 기술의 한계를 뛰어넘으며, 새로운 도구를 개발하고 있습니다. 우리의 노력은 뇌 건강 분야에서의 획기적인 발전을 이루어내고 있으며, 더 나은 옵션을 제공하기 위해 꾸준히 진보하고 있습니다.","absoluteBoundingBox":{"x":-1709.5,"y":1946.5,"width":597.0,"height":108.0},"isolatedAbsoluteRenderBounds":{"x":-1708.61804199219,"y":1952.61401367188,"width":594.2626953125,"height":99.305908203125},"relativeTransform":[[1.0,0.0,359.0],[0.0,1.0,43.0]],"size":{"x":597.0,"y":108.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":1.0,"g":1.0,"b":1.0,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"OUTSIDE","strokes":[],"strokeWeight":3.21430063247681,"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"characterStyleOverrides":[23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,22,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23],"characters":"브레인에이블은 지속적이고 자체적인 연구를 통해\n기술의 한계를 뛰어넘으며, 새로운 도구를 개발하고 있습니다. \n우리의 노력은 뇌 건강 분야에서의 획기적인 발전을\n이루어내고 있으며, 더 나은 옵션을 제공하기 위해 꾸준히 진보하고 있습니다.","lineIndentations":[0,0,0,0],"lineTypes":["NONE","NONE","NONE","NONE"],"listStartOffsets":[],"lineStyleOverrides":[0,0,0,0],"lineTextDirections":null,"resolvedParagraphValues":{"0":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":0.0},"1":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":0.0},"2":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":0.0},"3":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":0.0}},"textAutoResize":"WIDTH_AND_HEIGHT","textAlignVertical":"CENTER","style":{"fontFamily":"Geist","fontPostScriptName":"Geist-Regular","fontStyle":"Regular","textAutoResize":"WIDTH_AND_HEIGHT","fontVariantPosition":"NORMAL","fontSize":18.0,"textAlignHorizontal":"LEFT","textAlignVertical":"CENTER","letterSpacing":0.9,"letterSpacingValue":5.0,"letterSpacingUnit":"PERCENT","lineHeightPx":27.0,"lineHeightPercent":115.384620666504,"lineHeightPercentFontSize":150.0,"lineHeightUnit":"FONT_SIZE_%","paragraphSpacing":0,"paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecoration":"NONE","textDecorationSkipInk":false,"textDecorationStyle":"solid","textTruncation":"DISABLED"},"styleOverrideTable":{"23":{"fontFamily":"Noto Sans KR","fontPostScriptName":"NotoSansKR-Regular","fontStyle":"Regular","letterSpacing":0.9,"letterSpacingValue":5.0,"letterSpacingUnit":"PERCENT","lineHeightPx":27.0,"lineHeightPercent":124.999992370605,"lineHeightPercentFontSize":150.0,"lineHeightUnit":"FONT_SIZE_%","paragraphSpacing":0,"paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecoration":"NONE","textDecorationSkipInk":false,"textDecorationStyle":"solid","textAutoResize":"NONE","textTruncation":"DISABLED"},"22":{"fontFamily":"Noto Sans KR","fontPostScriptName":"NotoSansKR-Regular","fontStyle":"Regular","letterSpacing":0.9,"letterSpacingValue":5.0,"letterSpacingUnit":"PERCENT","lineHeightPx":27.0,"lineHeightPercent":124.999992370605,"lineHeightPercentFontSize":150.0,"lineHeightUnit":"FONT_SIZE_%","paragraphSpacing":0,"paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecoration":"NONE","textDecorationSkipInk":false,"textDecorationStyle":"solid","textAutoResize":"NONE","textTruncation":"DISABLED"}}},"8:2116":{"type":"TEXT","id":"8:2116","name":"현재 구파발, 광주, 청주, 창원 등 여러 지역에 센터가 운영되고 있습니다. 브레인에이블 네트워크는 더 가까이 더 나은 삶의 공유를 위해 빠르게 확장중입니다.","absoluteBoundingBox":{"x":-1718.5,"y":2617.5,"width":695.0,"height":54.0},"isolatedAbsoluteRenderBounds":{"x":-1717.59997558594,"y":2623.36206054688,"width":685.236083984375,"height":43.56005859375},"relativeTransform":[[1.0,0.0,350.0],[0.0,1.0,43.0]],"size":{"x":695.0,"y":54.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":1.0,"g":1.0,"b":1.0,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"OUTSIDE","strokes":[],"strokeWeight":3.21430063247681,"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"characterStyleOverrides":[3,3,3,5,5,5,5,5,5,5,5,5,5,5,5,4,5,5,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,0,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3],"characters":"현재 구파발, 광주, 청주, 창원 등 여러 지역에 센터가 운영되고 있습니다. \n브레인에이블 네트워크는 더 가까이 더 나은 삶의 공유를 위해 빠르게 확장중입니다.","lineIndentations":[0,0],"lineTypes":["NONE","NONE"],"listStartOffsets":[],"lineStyleOverrides":[0,0],"lineTextDirections":null,"resolvedParagraphValues":{"0":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":0.0},"1":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":0.0}},"textAutoResize":"HEIGHT","style":{"fontFamily":"Noto Sans KR","fontPostScriptName":"NotoSansKR-Regular","fontStyle":"Regular","textAutoResize":"HEIGHT","fontVariantPosition":"NORMAL","fontSize":18.0,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","letterSpacing":1.8,"letterSpacingValue":10.0,"letterSpacingUnit":"PERCENT","lineHeightPx":27.0,"lineHeightPercent":124.999992370605,"lineHeightPercentFontSize":150.0,"lineHeightUnit":"FONT_SIZE_%","paragraphSpacing":0,"paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecoration":"NONE","textDecorationSkipInk":false,"textDecorationStyle":"solid","textTruncation":"DISABLED"},"styleOverrideTable":{"5":{"fontFamily":"Noto Sans KR","fontPostScriptName":"NotoSansKR-Bold","fontStyle":"Bold","paragraphSpacing":0,"paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecoration":"NONE","textDecorationSkipInk":false,"textDecorationStyle":"solid","textAutoResize":"NONE","textTruncation":"DISABLED","lineHeightPercent":100,"lineHeightPercentFontSize":100},"4":{"fontFamily":"Noto Sans KR","fontPostScriptName":"NotoSansKR-Bold","fontStyle":"Bold","letterSpacing":0.9,"letterSpacingValue":5.0,"letterSpacingUnit":"PERCENT","fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":1.0,"g":1.0,"b":1.0,"a":1.0},"visible":true,"opacity":1.0}],"paragraphSpacing":0,"paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecoration":"NONE","textDecorationSkipInk":false,"textDecorationStyle":"solid","textAutoResize":"NONE","textTruncation":"DISABLED","lineHeightPercent":100,"lineHeightPercentFontSize":100},"3":{"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":1.0,"g":1.0,"b":1.0,"a":1.0},"visible":true,"opacity":1.0}],"paragraphSpacing":0,"paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecoration":"NONE","textDecorationSkipInk":false,"textDecorationStyle":"solid","textAutoResize":"NONE","textTruncation":"DISABLED","lineHeightPercent":100,"lineHeightPercentFontSize":100}}},"8:1956":{"type":"FRAME","id":"8:1956","name":"Stat 3","absoluteBoundingBox":{"x":-588.0,"y":890.0,"width":107.0,"height":247.0},"isolatedAbsoluteRenderBounds":{"x":-588.0,"y":890.0,"width":107.0,"height":247.0},"relativeTransform":[[1.0,0.0,216.0],[0.0,1.0,0.0]],"size":{"x":107.0,"y":247.0},"fills":[],"strokeAlign":"INSIDE","strokes":[],"accessibleHTMLTag":"SECTION","isDecorativeImage":false,"accessibleLabel":"Statistic 3 about Jones and Brown","ariaAttributes":{},"interactions":[],"behaviors":{"appear":{"otherLayer":{"sessionID":-1,"localID":-1},"trigger":"THIS_LAYER_IN_VIEW","direction":"UP","enterTransition":{"easingType":"OUT_CUBIC","easingFunction":[0.215000003576279,0.610000014305115,0.354999989271164,1.0],"transitionDuration":0.800000011920929,"delay":0.150000005960464},"enterState":{"transform":{"m00":1.0,"m01":0.0,"m02":0.0,"m10":0.0,"m11":1.0,"m12":0.0},"opacity":0.0},"exitTransition":{"easingType":"OUT_CUBIC","easingFunction":[0.215000003576279,0.610000014305115,0.354999989271164,1.0],"transitionDuration":0.600000023841858,"delay":0.0},"exitState":{"transform":{"m00":1.0,"m01":0.0,"m02":0.0,"m10":0.0,"m11":1.0,"m12":0.0},"opacity":1.0},"playsOnce":false,"behaviorType":"appear"}},"layoutMode":"VERTICAL","itemSpacing":38.0,"primaryAxisSizingMode":"FIXED","counterAxisSizingMode":"FIXED","children":["8:1957","2133:3196"]},"8:2125":{"type":"TEXT","id":"8:2125","name":"Visa applications Green cards and citizenship Deportation defense Employment-based immigration","absoluteBoundingBox":{"x":-1508.5,"y":2535.5,"width":420.0,"height":96.0},"isolatedAbsoluteRenderBounds":{"x":-1508.14001464844,"y":2540.70190429688,"width":251.14892578125,"height":87.714111328125},"relativeTransform":[[1.0,0.0,560.0],[0.0,1.0,20.0]],"size":{"x":420.0,"y":96.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":1.0,"g":1.0,"b":1.0,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"OUTSIDE","strokes":[],"strokeWeight":3.21430063247681,"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"characterStyleOverrides":[],"characters":"Visa applications\nGreen cards and citizenship\nDeportation defense\nEmployment-based immigration","lineIndentations":[0,0,0,0],"lineTypes":["NONE","NONE","NONE","NONE"],"listStartOffsets":[],"lineStyleOverrides":[0,0,0,0],"lineTextDirections":null,"resolvedParagraphValues":{"0":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":0.0},"1":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":0.0},"2":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":0.0},"3":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":0.0}},"textAutoResize":"HEIGHT","style":{"styleIdForText":"StyleId:6:1353","fontFamily":"Geist","fontPostScriptName":"Geist-Regular","fontStyle":"Regular","textAutoResize":"HEIGHT","responsiveTextStyleVariants":[{"minWidth":1280.0,"name":"Desktop","style":{"styleIdForText":"StyleId:6:1353","fontSize":18.0,"letterSpacing":-0.36,"letterSpacingValue":-2.0,"letterSpacingUnit":"PERCENT","lineHeightPx":24.3000011444092,"lineHeightPercent":115.199996948242,"lineHeightPercentFontSize":135.0,"lineHeightUnit":"FONT_SIZE_%"}}],"fontVariantPosition":"NORMAL","fontSize":18.0,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","letterSpacing":-0.36,"letterSpacingValue":-2.0,"letterSpacingUnit":"PERCENT","lineHeightPx":24.3000011444092,"lineHeightPercent":103.846160888672,"lineHeightPercentFontSize":135.0,"lineHeightUnit":"FONT_SIZE_%","paragraphSpacing":0,"paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecoration":"NONE","textDecorationSkipInk":false,"textDecorationStyle":"solid","textTruncation":"DISABLED"},"styleOverrideTable":{}},"8:2148":{"type":"FRAME","id":"8:2148","name":"Our services section","absoluteBoundingBox":{"x":-835.0,"y":1350.0,"width":375.0,"height":1262.0},"isolatedAbsoluteRenderBounds":{"x":-835.0,"y":1350.0,"width":375.0,"height":1262.0},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,528.0]],"size":{"x":375.0,"y":1262.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":0.0,"g":0.0,"b":0.0,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"INSIDE","layoutAlign":"STRETCH","strokes":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"paddingRight":40.0,"paddingBottom":894.0,"paddingLeft":28.0,"layoutMode":"VERTICAL","itemSpacing":10.0,"counterAxisAlignItems":"CENTER","primaryAxisAlignItems":"CENTER","primaryAxisSizingMode":"FIXED","counterAxisSizingMode":"FIXED","children":["8:2149"]},"2715:1279":{"type":"FRAME","id":"2715:1279","name":"Frame 2","absoluteBoundingBox":{"x":-830.0,"y":-159.0,"width":365.0,"height":450.0},"isolatedAbsoluteRenderBounds":{"x":-830.0,"y":-159.0,"width":365.0,"height":450.0},"relativeTransform":[[1.0,0.0,5.0],[0.0,1.0,0.0]],"size":{"x":365.0,"y":450.0},"fills":[],"visible":false,"strokeAlign":"INSIDE","maxWidth":375.0,"strokes":[],"accessibleHTMLTag":"HEADER","isDecorativeImage":false,"ariaAttributes":{},"interactions":[{"id":{"sessionID":2608,"localID":1765},"event":{"interactionType":"ON_CLICK"},"actions":[{"transitionNodeID":{"sessionID":0,"localID":3},"connectionType":"INTERNAL_NODE","navigationType":"NAVIGATE","connectionURL":"/"}],"isDeleted":false,"stateManagementVersion":1}],"paddingTop":24.0,"paddingRight":44.0,"paddingBottom":24.0,"paddingLeft":44.0,"layoutMode":"VERTICAL","itemSpacing":40.0,"counterAxisAlignItems":"CENTER","primaryAxisSizingMode":"FIXED","children":["2715:1280"]},"6:1356":{"key":"bcc262e16c06dc528ec5203195d6322cbd051b62","name":"Paragraph/Paragraph 3","styleType":"TEXT","remote":false,"description":"","id":"6:1356","assetId":"StyleId:6:1356","type":"STYLE","style":{"fontFamily":"Geist","fontPostScriptName":"Geist-Regular","fontStyle":"Regular","textAutoResize":"WIDTH_AND_HEIGHT","responsiveTextStyleVariants":[{"minWidth":1280.0,"name":"Desktop","style":{"fontSize":14.0,"letterSpacing":0.0,"letterSpacingValue":0.0,"letterSpacingUnit":"PERCENT","lineHeightPx":19.6000003814697,"lineHeightPercent":119.466667175293,"lineHeightPercentFontSize":140.0,"lineHeightUnit":"FONT_SIZE_%"}},{"minWidth":800.0,"name":"Tablet","style":{"fontSize":14.0,"letterSpacing":0.0,"letterSpacingValue":0.0,"letterSpacingUnit":"PERCENT","lineHeightPx":19.6000003814697,"lineHeightPercent":119.466667175293,"lineHeightPercentFontSize":140.0,"lineHeightUnit":"FONT_SIZE_%"}},{"minWidth":0.0,"name":"Mobile","style":{"fontSize":14.0,"letterSpacing":0.0,"letterSpacingValue":0.0,"letterSpacingUnit":"PERCENT","lineHeightPx":19.6000003814697,"lineHeightPercent":119.466667175293,"lineHeightPercentFontSize":140.0,"lineHeightUnit":"FONT_SIZE_%"}}],"fontSize":14.0,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","letterSpacing":0.0,"letterSpacingValue":0.0,"letterSpacingUnit":"PERCENT","lineHeightPx":19.6000003814697,"lineHeightPercent":107.692314147949,"lineHeightPercentFontSize":140.0,"lineHeightUnit":"FONT_SIZE_%"},"responsiveTextStyleVariants":[{"minWidth":1280.0,"name":"Desktop","style":{"fontSize":14.0,"letterSpacing":0.0,"letterSpacingValue":0.0,"letterSpacingUnit":"PERCENT","lineHeightPx":19.6000003814697,"lineHeightPercent":119.466667175293,"lineHeightPercentFontSize":140.0,"lineHeightUnit":"FONT_SIZE_%"}},{"minWidth":800.0,"name":"Tablet","style":{"fontSize":14.0,"letterSpacing":0.0,"letterSpacingValue":0.0,"letterSpacingUnit":"PERCENT","lineHeightPx":19.6000003814697,"lineHeightPercent":119.466667175293,"lineHeightPercentFontSize":140.0,"lineHeightUnit":"FONT_SIZE_%"}},{"minWidth":0.0,"name":"Mobile","style":{"fontSize":14.0,"letterSpacing":0.0,"letterSpacingValue":0.0,"letterSpacingUnit":"PERCENT","lineHeightPx":19.6000003814697,"lineHeightPercent":119.466667175293,"lineHeightPercentFontSize":140.0,"lineHeightUnit":"FONT_SIZE_%"}}]},"8:2158":{"type":"FRAME","id":"8:2158","name":"Service 3","absoluteBoundingBox":{"x":-815.0,"y":2158.0,"width":322.0,"height":236.0},"isolatedAbsoluteRenderBounds":{"x":-815.0,"y":2158.0,"width":322.0,"height":236.0},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,527.0]],"size":{"x":322.0,"y":236.0},"fills":[],"strokeAlign":"INSIDE","layoutAlign":"STRETCH","strokes":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":1.0,"g":1.0,"b":1.0,"a":1.0},"visible":true,"opacity":1.0}],"individualStrokeWeights":{"top":0.5,"right":0.0,"bottom":0.0,"left":0.0},"accessibleHTMLTag":"SECTION","isDecorativeImage":false,"accessibleLabel":"Specific areas of family law that we help with","ariaAttributes":{},"interactions":[],"behaviors":{"appear":{"otherLayer":{"sessionID":-1,"localID":-1},"trigger":"THIS_LAYER_IN_VIEW","direction":"UP","enterTransition":{"easingType":"OUT_CUBIC","easingFunction":[0.215000003576279,0.610000014305115,0.354999989271164,1.0],"transitionDuration":0.800000011920929,"delay":0.0},"enterState":{"transform":{"m00":1.0,"m01":0.0,"m02":0.0,"m10":0.0,"m11":1.0,"m12":0.0},"opacity":0.0},"exitTransition":{"easingType":"OUT_CUBIC","easingFunction":[0.215000003576279,0.610000014305115,0.354999989271164,1.0],"transitionDuration":0.600000023841858,"delay":0.0},"exitState":{"transform":{"m00":1.0,"m01":0.0,"m02":0.0,"m10":0.0,"m11":1.0,"m12":0.0},"opacity":1.0},"playsOnce":false,"behaviorType":"appear"}},"layoutMode":"VERTICAL","itemSpacing":32.0,"primaryAxisAlignItems":"CENTER","primaryAxisSizingMode":"FIXED","counterAxisSizingMode":"FIXED","children":["8:2159","8:2160"]},"2133:3191":{"type":"TEXT","id":"2133:3191","name":"확장중인 브레인에이블 전국 네트워크","absoluteBoundingBox":{"x":-1250.5,"y":1257.0,"width":229.0,"height":69.0},"isolatedAbsoluteRenderBounds":{"x":-1237.49060058594,"y":1272.65600585938,"width":202.934448242188,"height":37.6080322265625},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,284.0]],"size":{"x":229.0,"y":69.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":1.0,"g":1.0,"b":1.0,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"OUTSIDE","strokes":[],"strokeWeight":3.21430063247681,"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"characterStyleOverrides":[],"characters":"확장중인\n브레인에이블 전국 네트워크","lineIndentations":[0,0],"lineTypes":["NONE","NONE"],"listStartOffsets":[],"lineStyleOverrides":[0,0],"lineTextDirections":null,"resolvedParagraphValues":{"0":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":0.0},"1":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":0.0}},"textAlignHorizontal":"CENTER","textAlignVertical":"CENTER","style":{"fontFamily":"Noto Sans KR","fontPostScriptName":"NotoSansKR-Regular","fontStyle":"Regular","fontVariantPosition":"NORMAL","fontSize":16.0,"textAlignHorizontal":"CENTER","textAlignVertical":"CENTER","letterSpacing":1.6,"letterSpacingValue":10.0,"letterSpacingUnit":"PERCENT","lineHeightPx":22.8799991607666,"lineHeightPercent":119.166664123535,"lineHeightPercentFontSize":143.0,"lineHeightUnit":"FONT_SIZE_%","paragraphSpacing":0,"paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecoration":"NONE","textDecorationSkipInk":false,"textDecorationStyle":"solid","textAutoResize":"NONE","textTruncation":"DISABLED"},"styleOverrideTable":{}},"8:2120":{"type":"FRAME","id":"8:2120","name":"Service 5","absoluteBoundingBox":{"x":-2068.5,"y":2515.5,"width":980.0,"height":160.0},"isolatedAbsoluteRenderBounds":{"x":-2068.5,"y":2515.5,"width":980.0,"height":160.0},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,612.0]],"size":{"x":980.0,"y":160.0},"fills":[],"visible":false,"strokeAlign":"INSIDE","layoutAlign":"STRETCH","strokes":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":1.0,"g":1.0,"b":1.0,"a":1.0},"visible":true,"opacity":1.0}],"individualStrokeWeights":{"top":0.5,"right":0.0,"bottom":0.0,"left":0.0},"accessibleHTMLTag":"SECTION","isDecorativeImage":false,"accessibleLabel":"Specific areas of real estate law that we help with","ariaAttributes":{},"interactions":[],"behaviors":{"appear":{"otherLayer":{"sessionID":-1,"localID":-1},"trigger":"THIS_LAYER_IN_VIEW","direction":"UP","enterTransition":{"easingType":"OUT_CUBIC","easingFunction":[0.215000003576279,0.610000014305115,0.354999989271164,1.0],"transitionDuration":0.800000011920929,"delay":0.0},"enterState":{"transform":{"m00":1.0,"m01":0.0,"m02":0.0,"m10":0.0,"m11":1.0,"m12":0.0},"opacity":0.0},"exitTransition":{"easingType":"OUT_CUBIC","easingFunction":[0.215000003576279,0.610000014305115,0.354999989271164,1.0],"transitionDuration":0.600000023841858,"delay":0.0},"exitState":{"transform":{"m00":1.0,"m01":0.0,"m02":0.0,"m10":0.0,"m11":1.0,"m12":0.0},"opacity":1.0},"playsOnce":false,"behaviorType":"appear"}},"paddingTop":20.0,"paddingBottom":20.0,"layoutMode":"HORIZONTAL","itemSpacing":266.0,"primaryAxisAlignItems":"SPACE_BETWEEN","primaryAxisSizingMode":"FIXED","children":["8:2121","8:2122"]},"8:2106":{"type":"TEXT","id":"8:2106","name":"INNOVATION SYSTEM OF BRAINABLE 브레인에이블만의 혁신 시스템","absoluteBoundingBox":{"x":-2068.5,"y":1655.5,"width":1069.0,"height":147.0},"isolatedAbsoluteRenderBounds":{"x":-2067.31201171875,"y":1692.48596191406,"width":690.7568359375,"height":78.215087890625},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,0.0]],"size":{"x":1069.0,"y":147.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":1.0,"g":1.0,"b":1.0,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"OUTSIDE","layoutAlign":"STRETCH","strokes":[],"strokeWeight":3.21430063247681,"accessibleHTMLTag":"H2","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"characterStyleOverrides":[],"characters":"INNOVATION SYSTEM OF BRAINABLE\n브레인에이블만의 혁신 시스템","lineIndentations":[0,0],"lineTypes":["NONE","NONE"],"listStartOffsets":[],"lineStyleOverrides":[0,0],"lineTextDirections":null,"resolvedParagraphValues":{"0":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":0.0},"1":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":0.0}},"textAlignVertical":"CENTER","style":{"fontFamily":"Noto Sans KR","fontPostScriptName":"NotoSansKR-Black","fontStyle":"Black","fontVariantPosition":"NORMAL","fontSize":33.0,"textAlignHorizontal":"LEFT","textAlignVertical":"CENTER","letterSpacing":3.3,"letterSpacingValue":10.0,"letterSpacingUnit":"PERCENT","lineHeightPx":49.5,"lineHeightPercent":124.999992370605,"lineHeightPercentFontSize":150.0,"lineHeightUnit":"FONT_SIZE_%","paragraphSpacing":0,"paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecoration":"NONE","textDecorationSkipInk":false,"textDecorationStyle":"solid","textAutoResize":"NONE","textTruncation":"DISABLED"},"styleOverrideTable":{}},"2715:1071":{"type":"FRAME","id":"2715:1071","name":"Nav","absoluteBoundingBox":{"x":-683.0,"y":-20.0,"width":71.0,"height":243.0},"isolatedAbsoluteRenderBounds":{"x":-683.0,"y":-20.0,"width":71.0,"height":243.0},"relativeTransform":[[1.0,0.0,103.0],[0.0,1.0,115.0]],"size":{"x":71.0,"y":243.0},"fills":[],"strokeAlign":"INSIDE","strokes":[],"accessibleHTMLTag":"NAV","isDecorativeImage":false,"ariaAttributes":{},"interactions":[{"id":{"sessionID":2608,"localID":1766},"event":{"interactionType":"ON_CLICK"},"actions":[{"transitionNodeID":{"sessionID":6,"localID":1529},"connectionType":"INTERNAL_NODE","navigationType":"NAVIGATE","connectionURL":"/about_us"}],"isDeleted":false,"stateManagementVersion":1}],"layoutMode":"VERTICAL","itemSpacing":32.0,"counterAxisAlignItems":"CENTER","children":["2715:1072","2715:1073","2715:1074","2715:1075","2715:1076"]},"8:2122":{"type":"TEXT","id":"8:2122","name":"Property transactions (buying, selling, leasing) Landlord-tenant disputes Zoning and land use Construction law Real estate development","absoluteBoundingBox":{"x":-1508.5,"y":2535.5,"width":420.0,"height":120.0},"isolatedAbsoluteRenderBounds":{"x":-1507.99597167969,"y":2540.0,"width":359.494873046875,"height":112.199951171875},"relativeTransform":[[1.0,0.0,560.0],[0.0,1.0,20.0]],"size":{"x":420.0,"y":120.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":1.0,"g":1.0,"b":1.0,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"OUTSIDE","strokes":[],"strokeWeight":3.21430063247681,"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"characterStyleOverrides":[],"characters":"Property transactions (buying, selling, leasing)\nLandlord-tenant disputes\nZoning and land use\nConstruction law\nReal estate development","lineIndentations":[0,0,0,0,0],"lineTypes":["NONE","NONE","NONE","NONE","NONE"],"listStartOffsets":[],"lineStyleOverrides":[0,0,0,0,0],"lineTextDirections":null,"resolvedParagraphValues":{"0":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":0.0},"1":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":0.0},"2":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":0.0},"3":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":0.0},"4":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":0.0}},"textAutoResize":"HEIGHT","style":{"styleIdForText":"StyleId:6:1353","fontFamily":"Geist","fontPostScriptName":"Geist-Regular","fontStyle":"Regular","textAutoResize":"HEIGHT","responsiveTextStyleVariants":[{"minWidth":1280.0,"name":"Desktop","style":{"styleIdForText":"StyleId:6:1353","fontSize":18.0,"letterSpacing":-0.36,"letterSpacingValue":-2.0,"letterSpacingUnit":"PERCENT","lineHeightPx":24.3000011444092,"lineHeightPercent":115.199996948242,"lineHeightPercentFontSize":135.0,"lineHeightUnit":"FONT_SIZE_%"}}],"fontVariantPosition":"NORMAL","fontSize":18.0,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","letterSpacing":-0.36,"letterSpacingValue":-2.0,"letterSpacingUnit":"PERCENT","lineHeightPx":24.3000011444092,"lineHeightPercent":103.846160888672,"lineHeightPercentFontSize":135.0,"lineHeightUnit":"FONT_SIZE_%","paragraphSpacing":0,"paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecoration":"NONE","textDecorationSkipInk":false,"textDecorationStyle":"solid","textTruncation":"DISABLED"},"styleOverrideTable":{}},"161:106":{"type":"FRAME","id":"161:106","name":"Main","absoluteBoundingBox":{"x":-835.0,"y":822.0,"width":375.0,"height":2040.0},"isolatedAbsoluteRenderBounds":{"x":-835.0,"y":822.0,"width":375.0,"height":2040.0},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,981.0]],"size":{"x":375.0,"y":2040.0},"fills":[],"strokeAlign":"INSIDE","layoutAlign":"STRETCH","strokes":[],"accessibleHTMLTag":"MAIN","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"layoutMode":"VERTICAL","counterAxisSizingMode":"FIXED","children":["8:1962","8:2148","119:265","2224:2932"]},"8:2124":{"type":"TEXT","id":"8:2124","name":"Immigration Law","absoluteBoundingBox":{"x":-2068.5,"y":2535.5,"width":136.0,"height":24.0},"isolatedAbsoluteRenderBounds":{"x":-2066.95190429688,"y":2540.6298828125,"width":133.182006835938,"height":15.7861328125},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,20.0]],"size":{"x":136.0,"y":24.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":1.0,"g":1.0,"b":1.0,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"OUTSIDE","strokes":[],"strokeWeight":3.21430063247681,"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"characterStyleOverrides":[],"characters":"Immigration Law","lineIndentations":[0],"lineTypes":["NONE"],"listStartOffsets":[],"lineStyleOverrides":[0],"lineTextDirections":null,"resolvedParagraphValues":{"0":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":0.0}},"textAutoResize":"WIDTH_AND_HEIGHT","style":{"styleIdForText":"StyleId:4:749","fontFamily":"Geist","fontPostScriptName":"Geist-Medium","fontStyle":"Medium","textAutoResize":"WIDTH_AND_HEIGHT","fontVariantPosition":"NORMAL","fontSize":18.0,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","letterSpacing":-0.36,"letterSpacingValue":-2.0,"letterSpacingUnit":"PERCENT","lineHeightPx":24.3000011444092,"lineHeightPercent":103.846160888672,"lineHeightPercentFontSize":135.0,"lineHeightUnit":"FONT_SIZE_%","paragraphSpacing":0,"paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecoration":"NONE","textDecorationSkipInk":false,"textDecorationStyle":"solid","textTruncation":"DISABLED"},"styleOverrideTable":{}},"2224:3014":{"type":"TEXT","id":"2224:3014","name":"Brainable Co., LTD. © 2025 All Rights Reserved","absoluteBoundingBox":{"x":-803.0,"y":3694.0,"width":197.0,"height":26.0},"isolatedAbsoluteRenderBounds":{"x":-802.486999511719,"y":3696.85400390625,"width":125.53759765625,"height":22.458984375},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,0.0]],"size":{"x":197.0,"y":26.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":0.0,"g":0.0,"b":0.0,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"OUTSIDE","strokes":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"characterStyleOverrides":[],"characters":"Brainable Co., LTD.\n© 2025 All Rights Reserved","lineIndentations":[0,0],"lineTypes":["NONE","NONE"],"listStartOffsets":[],"lineStyleOverrides":[0,0],"lineTextDirections":null,"resolvedParagraphValues":{"0":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":0.0},"1":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":0.0}},"textAutoResize":"HEIGHT","style":{"fontFamily":"Noto Sans KR","fontPostScriptName":"NotoSansKR-Thin","fontStyle":"Thin","textAutoResize":"HEIGHT","fontVariantPosition":"NORMAL","fontSize":9.0,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","letterSpacing":0.9,"letterSpacingValue":10.0,"letterSpacingUnit":"PERCENT","lineHeightPx":12.5999994277954,"lineHeightPercent":116.666664123535,"lineHeightPercentFontSize":140.0,"lineHeightUnit":"FONT_SIZE_%","paragraphSpacing":0,"paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecoration":"NONE","textDecorationSkipInk":false,"textDecorationStyle":"solid","textTruncation":"DISABLED"},"styleOverrideTable":{}},"2464:490":{"type":"TEXT","id":"2464:490","name":"Text","absoluteBoundingBox":{"x":0.0,"y":0.0,"width":14.0,"height":12.0},"isolatedAbsoluteRenderBounds":{"x":0.248579546809196,"y":2.72727251052856,"width":12.1271305084229,"height":9.43181800842285},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,0.0]],"size":{"x":14.0,"y":12.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":0.0,"g":0.0,"b":0.0,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"INSIDE","strokes":[],"strokeWeight":0.0,"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"characterStyleOverrides":[],"characters":"Ag","lineIndentations":[0],"lineTypes":["NONE"],"listStartOffsets":[],"lineStyleOverrides":[0],"lineTextDirections":null,"resolvedParagraphValues":{"0":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":0.0}},"textAutoResize":"WIDTH_AND_HEIGHT","style":{"fontFamily":"Inter","fontPostScriptName":"Inter-Medium","fontStyle":"Medium","textAutoResize":"WIDTH_AND_HEIGHT","fontVariantPosition":"NORMAL","fontSize":10.0,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","letterSpacing":0.0,"letterSpacingValue":0.0,"letterSpacingUnit":"PERCENT","lineHeightPx":12.1022720336914,"lineHeightPercent":100.0,"lineHeightUnit":"INTRINSIC_%","paragraphSpacing":0,"paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecoration":"NONE","textDecorationSkipInk":false,"textDecorationStyle":"solid","textTruncation":"DISABLED","lineHeightPercentFontSize":100},"styleOverrideTable":{}},"2224:3009":{"type":"TEXT","id":"2224:3009","name":"010-8123-7857 02)-581-7856","absoluteBoundingBox":{"x":-803.0,"y":3591.5,"width":122.0,"height":45.0},"isolatedAbsoluteRenderBounds":{"x":-802.450012207031,"y":3596.2939453125,"width":85.5606079101562,"height":28.362060546875},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,0.5]],"size":{"x":122.0,"y":45.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":0.0,"g":0.0,"b":0.0,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"OUTSIDE","strokes":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"behaviors":{"hover":{"transition":{"easingType":"OUT_CUBIC","easingFunction":[0.215000003576279,0.610000014305115,0.354999989271164,1.0],"transitionDuration":0.300000011920929,"delay":0.0},"state":{"transform":{"m00":1.0,"m01":0.0,"m02":0.0,"m10":0.0,"m11":1.0,"m12":0.0},"opacity":0.699999988079071},"behaviorType":"hover"}},"characterStyleOverrides":[],"characters":"010-8123-7857\n02)-581-7856\n","lineIndentations":[0,0,0],"lineTypes":["NONE","NONE","NONE"],"listStartOffsets":[],"lineStyleOverrides":[0,0,0],"lineTextDirections":null,"resolvedParagraphValues":{"0":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":0.0},"1":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":0.0},"2":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":0.0}},"style":{"fontFamily":"Noto Sans KR","fontPostScriptName":"NotoSansKR-Regular","fontStyle":"Regular","fontVariantPosition":"NORMAL","fontSize":11.0,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","letterSpacing":0.99,"letterSpacingValue":9.0,"letterSpacingUnit":"PERCENT","lineHeightPx":17.8199996948242,"lineHeightPercent":135.0,"lineHeightPercentFontSize":162.0,"lineHeightUnit":"FONT_SIZE_%","paragraphSpacing":0,"paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecoration":"NONE","textDecorationSkipInk":false,"textDecorationStyle":"solid","textAutoResize":"NONE","textTruncation":"DISABLED"},"styleOverrideTable":{}},"2108:1141":{"type":"TEXT","id":"2108:1141","name":"VISION","absoluteBoundingBox":{"x":-772.0,"y":112.0,"width":198.0,"height":57.0},"isolatedAbsoluteRenderBounds":{"x":-772.119995117188,"y":120.0,"width":191.534545898438,"height":45.8399963378906},"relativeTransform":[[1.0,0.0,13.0],[0.0,1.0,-274.0]],"size":{"x":198.0,"y":57.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":1.0,"g":1.0,"b":1.0,"a":1.0},"visible":true,"opacity":1.0}],"constraintValues":{"left":{"pixelOffset":13.0,"sizeFraction":0.0},"top":{"pixelOffset":-274.0,"sizeFraction":0.0}},"strokeAlign":"OUTSIDE","layoutPositioning":"ABSOLUTE","strokes":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"behaviors":{"appear":{"otherLayer":{"sessionID":-1,"localID":-1},"trigger":"PAGE_LOAD","direction":"UP","enterTransition":{"easingType":"OUT_CUBIC","easingFunction":[0.215000003576279,0.610000014305115,0.354999989271164,1.0],"transitionDuration":0.600000023841858,"delay":0.0},"enterState":{"transform":{"m00":1.0,"m01":0.0,"m02":0.0,"m10":0.0,"m11":1.0,"m12":0.0},"opacity":0.0},"exitTransition":{"easingType":"OUT_CUBIC","easingFunction":[0.215000003576279,0.610000014305115,0.354999989271164,1.0],"transitionDuration":0.600000023841858,"delay":0.0},"exitState":{"transform":{"m00":1.0,"m01":0.0,"m02":0.0,"m10":0.0,"m11":1.0,"m12":0.0},"opacity":1.0},"playsOnce":false,"behaviorType":"appear"}},"characterStyleOverrides":[0,0,0,0,14],"characters":"VISION","lineIndentations":[0],"lineTypes":["NONE"],"listStartOffsets":[],"lineStyleOverrides":[0],"lineTextDirections":null,"resolvedParagraphValues":{"0":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":0.0}},"textAutoResize":"WIDTH_AND_HEIGHT","textAlignVertical":"CENTER","style":{"fontFamily":"Noto Sans KR","fontPostScriptName":"NotoSansKR-Medium","fontStyle":"Medium","textAutoResize":"WIDTH_AND_HEIGHT","fontVariantPosition":"NORMAL","fontSize":60.0,"textAlignHorizontal":"LEFT","textAlignVertical":"CENTER","letterSpacing":-1.8,"letterSpacingValue":-3.0,"letterSpacingUnit":"PERCENT","lineHeightPx":57.0,"lineHeightPercent":79.1666641235352,"lineHeightPercentFontSize":95.0,"lineHeightUnit":"FONT_SIZE_%","paragraphSpacing":0,"paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecoration":"NONE","textDecorationSkipInk":false,"textDecorationStyle":"solid","textTruncation":"DISABLED"},"styleOverrideTable":{"14":{"letterSpacing":6.0,"letterSpacingValue":10.0,"letterSpacingUnit":"PERCENT","paragraphSpacing":0,"paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecoration":"NONE","textDecorationSkipInk":false,"textDecorationStyle":"solid","textAutoResize":"NONE","textTruncation":"DISABLED","lineHeightPercent":100,"lineHeightPercentFontSize":100}}},"8:2123":{"type":"FRAME","id":"8:2123","name":"Service 6","absoluteBoundingBox":{"x":-2068.5,"y":2515.5,"width":980.0,"height":136.0},"isolatedAbsoluteRenderBounds":{"x":-2068.5,"y":2515.5,"width":980.0,"height":136.0},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,612.0]],"size":{"x":980.0,"y":136.0},"fills":[],"visible":false,"strokeAlign":"INSIDE","layoutAlign":"STRETCH","strokes":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":1.0,"g":1.0,"b":1.0,"a":1.0},"visible":true,"opacity":1.0}],"individualStrokeWeights":{"top":0.5,"right":0.0,"bottom":0.0,"left":0.0},"accessibleHTMLTag":"SECTION","isDecorativeImage":false,"accessibleLabel":"Specific areas of immigration law that we help with","ariaAttributes":{},"interactions":[],"behaviors":{"appear":{"otherLayer":{"sessionID":-1,"localID":-1},"trigger":"THIS_LAYER_IN_VIEW","direction":"UP","enterTransition":{"easingType":"OUT_CUBIC","easingFunction":[0.215000003576279,0.610000014305115,0.354999989271164,1.0],"transitionDuration":0.800000011920929,"delay":0.0},"enterState":{"transform":{"m00":1.0,"m01":0.0,"m02":0.0,"m10":0.0,"m11":1.0,"m12":0.0},"opacity":0.0},"exitTransition":{"easingType":"OUT_CUBIC","easingFunction":[0.215000003576279,0.610000014305115,0.354999989271164,1.0],"transitionDuration":0.600000023841858,"delay":0.0},"exitState":{"transform":{"m00":1.0,"m01":0.0,"m02":0.0,"m10":0.0,"m11":1.0,"m12":0.0},"opacity":1.0},"playsOnce":false,"behaviorType":"appear"}},"paddingTop":20.0,"paddingBottom":20.0,"layoutMode":"HORIZONTAL","itemSpacing":266.0,"primaryAxisAlignItems":"SPACE_BETWEEN","primaryAxisSizingMode":"FIXED","children":["8:2124","8:2125"]},"2224:2914":{"type":"RECTANGLE","id":"2224:2914","name":"brainable_logo_ver.001-03 1","absoluteBoundingBox":{"x":-811.0,"y":2845.5,"width":142.800003051758,"height":119.0},"targetAspectRatio":{"x":142.800003051758,"y":119.0},"isolatedAbsoluteRenderBounds":{"x":-811.0,"y":2845.5,"width":142.799987792969,"height":119.0},"relativeTransform":[[1.0,0.0,135.0],[0.0,1.0,3.5]],"size":{"x":142.800003051758,"y":119.0},"fills":[{"blendMode":"NORMAL","type":"IMAGE","scaleMode":"FILL","imageRef":"64270238d3de4edd07597c9179b36856b5a53af3","originalImageWidth":1400,"originalImageHeight":1167,"visible":true,"opacity":1.0,"rotation":0.0}],"strokeAlign":"INSIDE","strokes":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[]},"91:299":{"type":"TEXT","id":"91:299","name":"Navigating Complex Legal Landscapes?  We Can Help.","absoluteBoundingBox":{"x":-2068.5,"y":1655.5,"width":672.0,"height":70.0},"isolatedAbsoluteRenderBounds":{"x":-2068.5,"y":1655.5,"width":672.0,"height":70.0},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,0.0]],"size":{"x":672.0,"y":70.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":1.0,"g":1.0,"b":1.0,"a":1.0},"visible":true,"opacity":1.0}],"visible":false,"strokeAlign":"OUTSIDE","layoutAlign":"STRETCH","strokes":[],"strokeWeight":3.21430063247681,"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"characterStyleOverrides":[],"characters":"Navigating Complex Legal Landscapes?  We Can Help.","lineIndentations":[0],"lineTypes":["NONE"],"listStartOffsets":[],"lineStyleOverrides":[0],"lineTextDirections":null,"resolvedParagraphValues":{"0":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":0.0}},"textAutoResize":"HEIGHT","style":{"styleIdForText":"StyleId:4:748","fontFamily":"Geist","fontPostScriptName":"Geist-Regular","fontStyle":"Regular","textAutoResize":"HEIGHT","responsiveTextStyleVariants":[{"minWidth":1280.0,"name":"Desktop","style":{"styleIdForText":"StyleId:4:748","fontSize":32.0,"letterSpacing":-1.6,"letterSpacingValue":-5.0,"letterSpacingUnit":"PERCENT","lineHeightPx":34.8800010681152,"lineHeightPercent":93.0133361816406,"lineHeightPercentFontSize":109.0,"lineHeightUnit":"FONT_SIZE_%"}},{"minWidth":800.0,"name":"Tablet","style":{"styleIdForText":"StyleId:4:748","fontSize":32.0,"letterSpacing":-1.6,"letterSpacingValue":-5.0,"letterSpacingUnit":"PERCENT","lineHeightPx":34.8800010681152,"lineHeightPercent":93.0133361816406,"lineHeightPercentFontSize":109.0,"lineHeightUnit":"FONT_SIZE_%"}},{"minWidth":1.0,"name":"Mobile","style":{"styleIdForText":"StyleId:4:748","fontSize":22.0,"letterSpacing":-1.1,"letterSpacingValue":-5.0,"letterSpacingUnit":"PERCENT","lineHeightPx":23.980001449585,"lineHeightPercent":93.0133361816406,"lineHeightPercentFontSize":109.0,"lineHeightUnit":"FONT_SIZE_%"}}],"fontVariantPosition":"NORMAL","fontSize":32.0,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","letterSpacing":-1.6,"letterSpacingValue":-5.0,"letterSpacingUnit":"PERCENT","lineHeightPx":34.8800010681152,"lineHeightPercent":83.8461532592773,"lineHeightPercentFontSize":109.0,"lineHeightUnit":"FONT_SIZE_%","paragraphSpacing":0,"paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecoration":"NONE","textDecorationSkipInk":false,"textDecorationStyle":"solid","textTruncation":"DISABLED"},"styleOverrideTable":{}},"8:1929":{"type":"FRAME","id":"8:1929","name":"Stats content","absoluteBoundingBox":{"x":-2018.5,"y":973.0,"width":977.0,"height":532.0},"isolatedAbsoluteRenderBounds":{"x":-2018.5,"y":973.0,"width":1015.0,"height":532.0},"relativeTransform":[[1.0,0.0,160.5],[0.0,1.0,124.0]],"size":{"x":977.0,"y":532.0},"fills":[],"strokeAlign":"INSIDE","maxWidth":1180.0,"strokes":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"layoutMode":"HORIZONTAL","itemSpacing":585.0,"primaryAxisSizingMode":"FIXED","counterAxisSizingMode":"FIXED","children":["8:1930","8:1936"]},"2715:1075":{"type":"TEXT","id":"2715:1075","name":"커뮤니티","absoluteBoundingBox":{"x":-683.0,"y":145.0,"width":71.0,"height":23.0},"isolatedAbsoluteRenderBounds":{"x":-682.697509765625,"y":149.688003540039,"width":70.396240234375,"height":16.5119934082031},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,165.0]],"size":{"x":71.0,"y":23.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":0.443900465965271,"g":0.442026853561401,"b":0.442026853561401,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"OUTSIDE","strokes":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"characterStyleOverrides":[],"characters":"커뮤니티","lineIndentations":[0],"lineTypes":["NONE"],"listStartOffsets":[],"lineStyleOverrides":[0],"lineTextDirections":null,"resolvedParagraphValues":{"0":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":16.0}},"textAutoResize":"WIDTH_AND_HEIGHT","textAlignHorizontal":"CENTER","textAlignVertical":"CENTER","paragraphSpacing":16.0,"style":{"styleIdForText":"StyleId:2608:2916","fontFamily":"Noto Sans KR","fontPostScriptName":"NotoSansKR-Medium","fontStyle":"Medium","hyperlink":{"type":"NODE","nodeID":"/커뮤니티Articles"},"paragraphSpacing":16.0,"textAutoResize":"WIDTH_AND_HEIGHT","fontVariantPosition":"NORMAL","textDecoration":"UNDERLINE","textDecorationSkipInk":true,"fontSize":16.0,"textAlignHorizontal":"CENTER","textAlignVertical":"CENTER","letterSpacing":3.84,"letterSpacingValue":24.0,"letterSpacingUnit":"PERCENT","lineHeightPx":23.2000007629395,"lineHeightPercent":120.83332824707,"lineHeightPercentFontSize":145.0,"lineHeightUnit":"FONT_SIZE_%","paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecorationStyle":"solid","textTruncation":"DISABLED"},"styleOverrideTable":{}},"8:1930":{"type":"FRAME","id":"8:1930","name":"Stat 1","absoluteBoundingBox":{"x":-2018.5,"y":973.0,"width":183.0,"height":353.0},"isolatedAbsoluteRenderBounds":{"x":-2018.5,"y":973.0,"width":183.0,"height":353.0},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,0.0]],"size":{"x":183.0,"y":353.0},"fills":[],"strokeAlign":"INSIDE","strokes":[],"accessibleHTMLTag":"SECTION","isDecorativeImage":false,"accessibleLabel":"Statistic 1 about Jones and Brown","ariaAttributes":{},"interactions":[],"behaviors":{"appear":{"otherLayer":{"sessionID":-1,"localID":-1},"trigger":"THIS_LAYER_IN_VIEW","direction":"UP","enterTransition":{"easingType":"OUT_CUBIC","easingFunction":[0.215000003576279,0.610000014305115,0.354999989271164,1.0],"transitionDuration":0.800000011920929,"delay":0.0500000007450581},"enterState":{"transform":{"m00":1.0,"m01":0.0,"m02":0.0,"m10":0.0,"m11":1.0,"m12":0.0},"opacity":0.0},"exitTransition":{"easingType":"OUT_CUBIC","easingFunction":[0.215000003576279,0.610000014305115,0.354999989271164,1.0],"transitionDuration":0.600000023841858,"delay":0.0},"exitState":{"transform":{"m00":1.0,"m01":0.0,"m02":0.0,"m10":0.0,"m11":1.0,"m12":0.0},"opacity":1.0},"playsOnce":false,"behaviorType":"appear"}},"layoutMode":"VERTICAL","itemSpacing":55.0,"primaryAxisSizingMode":"FIXED","counterAxisSizingMode":"FIXED","children":["8:1931","8:1932"]},"8:2111":{"type":"FRAME","id":"8:2111","name":"Service 2","absoluteBoundingBox":{"x":-2068.5,"y":2210.5,"width":1069.0,"height":262.0},"isolatedAbsoluteRenderBounds":{"x":-2068.5,"y":2210.5,"width":1069.0,"height":262.0},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,307.0]],"size":{"x":1069.0,"y":262.0},"fills":[],"strokeAlign":"INSIDE","layoutAlign":"STRETCH","strokes":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":1.0,"g":1.0,"b":1.0,"a":1.0},"visible":true,"opacity":1.0}],"individualStrokeWeights":{"top":0.5,"right":0.0,"bottom":0.0,"left":0.0},"accessibleHTMLTag":"SECTION","isDecorativeImage":false,"accessibleLabel":"Specific areas of litigation and dispute resolution that we help with","ariaAttributes":{},"interactions":[],"behaviors":{"appear":{"otherLayer":{"sessionID":-1,"localID":-1},"trigger":"THIS_LAYER_IN_VIEW","direction":"UP","enterTransition":{"easingType":"OUT_CUBIC","easingFunction":[0.215000003576279,0.610000014305115,0.354999989271164,1.0],"transitionDuration":0.800000011920929,"delay":0.0},"enterState":{"transform":{"m00":1.0,"m01":0.0,"m02":0.0,"m10":0.0,"m11":1.0,"m12":0.0},"opacity":0.0},"exitTransition":{"easingType":"OUT_CUBIC","easingFunction":[0.215000003576279,0.610000014305115,0.354999989271164,1.0],"transitionDuration":0.600000023841858,"delay":0.0},"exitState":{"transform":{"m00":1.0,"m01":0.0,"m02":0.0,"m10":0.0,"m11":1.0,"m12":0.0},"opacity":1.0},"playsOnce":false,"behaviorType":"appear"}},"paddingTop":43.0,"paddingBottom":48.0,"paddingLeft":5.0,"layoutMode":"HORIZONTAL","itemSpacing":112.0,"primaryAxisSizingMode":"FIXED","counterAxisSizingMode":"FIXED","children":["8:2112","8:2113"]},"2133:3201":{"type":"TEXT","id":"2133:3201","name":"브레인에이블은 지금도 혁신하고 발전중입니다.","absoluteBoundingBox":{"x":-1799.0,"y":1164.0,"width":521.0,"height":26.0},"isolatedAbsoluteRenderBounds":{"x":-1797.95581054688,"y":1166.71997070312,"width":518.186889648438,"height":22.4400634765625},"relativeTransform":[[1.0,0.0,380.0],[0.0,1.0,315.0]],"size":{"x":521.0,"y":26.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":1.0,"g":1.0,"b":1.0,"a":1.0},"visible":true,"opacity":1.0}],"constraints":{"vertical":"CENTER","horizontal":"CENTER"},"constraintValues":{"left":{"pixelOffset":-260.0,"sizeFraction":0.5},"right":{"pixelOffset":261.0,"sizeFraction":0.5},"top":{"pixelOffset":-13.0,"sizeFraction":0.5},"bottom":{"pixelOffset":13.0,"sizeFraction":0.5}},"strokeAlign":"OUTSIDE","layoutPositioning":"ABSOLUTE","strokes":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"characterStyleOverrides":[],"characters":"브레인에이블은 지금도 혁신하고 발전중입니다.","lineIndentations":[0],"lineTypes":["NONE"],"listStartOffsets":[],"lineStyleOverrides":[0],"lineTextDirections":null,"resolvedParagraphValues":{"0":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":0.0}},"textAutoResize":"WIDTH_AND_HEIGHT","textAlignHorizontal":"CENTER","textAlignVertical":"CENTER","style":{"fontFamily":"Noto Sans KR","fontPostScriptName":"NotoSansKR-Bold","fontStyle":"Bold","textAutoResize":"WIDTH_AND_HEIGHT","fontVariantPosition":"NORMAL","fontSize":24.0,"textAlignHorizontal":"CENTER","textAlignVertical":"CENTER","letterSpacing":2.4,"letterSpacingValue":10.0,"letterSpacingUnit":"PERCENT","lineHeightPx":26.1599998474121,"lineHeightPercent":90.8333282470703,"lineHeightPercentFontSize":109.0,"lineHeightUnit":"FONT_SIZE_%","paragraphSpacing":0,"paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecoration":"NONE","textDecorationSkipInk":false,"textDecorationStyle":"solid","textTruncation":"DISABLED"},"styleOverrideTable":{}},"7:1789":{"type":"FRAME","id":"7:1789","name":"Header content","absoluteBoundingBox":{"x":-2040.0,"y":186.0,"width":1378.0,"height":595.0},"isolatedAbsoluteRenderBounds":{"x":-2040.30004882812,"y":186.0,"width":1378.30004882812,"height":595.0},"relativeTransform":[[1.0,0.0,139.0],[0.0,1.0,222.0]],"size":{"x":1378.0,"y":595.0},"fills":[],"strokeAlign":"INSIDE","strokes":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"layoutMode":"VERTICAL","itemSpacing":46.0,"primaryAxisSizingMode":"FIXED","counterAxisSizingMode":"FIXED","children":["2108:1138","7:1791"]},"7:1791":{"type":"TEXT","id":"7:1791","name":"우리는 모든 사람이 자신의 뇌를 최대한 활용할 수 있는 세상을 만들어갑니다. 브레인에이블은 단순한 뇌기능 개선을 넘어, 건강한 뇌를 기반으로 행복한 삶을 실현하는 것을 목표로 합니다. 유아부터 성인 그리고 노인에 이르기까지 각 생애주기에 따른 맞춤형 두뇌 기능 향상 솔루션을 제공하여 더 나은 삶으로 안내합니다.","absoluteBoundingBox":{"x":-2040.0,"y":355.0,"width":1078.0,"height":81.0},"isolatedAbsoluteRenderBounds":{"x":-2039.17199707031,"y":360.880004882812,"width":1075.59399414062,"height":70.6319885253906},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,169.0]],"size":{"x":1078.0,"y":81.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":1.0,"g":1.0,"b":1.0,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"OUTSIDE","strokes":[],"strokeWeight":3.21430063247681,"accessibleHTMLTag":"H1","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"behaviors":{"appear":{"otherLayer":{"sessionID":7,"localID":1788},"trigger":"OTHER_LAYER_IN_VIEW","direction":"UP","enterTransition":{"easingType":"OUT_CUBIC","easingFunction":[0.215000003576279,0.610000014305115,0.354999989271164,1.0],"transitionDuration":0.800000011920929,"delay":0.0},"enterState":{"transform":{"m00":1.0,"m01":0.0,"m02":0.0,"m10":0.0,"m11":1.0,"m12":0.0},"opacity":0.0},"exitTransition":{"easingType":"OUT_CUBIC","easingFunction":[0.215000003576279,0.610000014305115,0.354999989271164,1.0],"transitionDuration":0.600000023841858,"delay":0.0},"exitState":{"transform":{"m00":1.0,"m01":0.0,"m02":0.0,"m10":0.0,"m11":1.0,"m12":0.0},"opacity":1.0},"playsOnce":false,"behaviorType":"appear"}},"characterStyleOverrides":[],"characters":"우리는 모든 사람이 자신의 뇌를 최대한 활용할 수 있는 세상을 만들어갑니다.\n브레인에이블은 단순한 뇌기능 개선을 넘어, 건강한 뇌를 기반으로 행복한 삶을 실현하는 것을 목표로 합니다. \n유아부터 성인 그리고 노인에 이르기까지 각 생애주기에 따른 맞춤형 두뇌 기능 향상 솔루션을 제공하여 더 나은 삶으로 안내합니다.","lineIndentations":[0,0,0],"lineTypes":["NONE","NONE","NONE"],"listStartOffsets":[],"lineStyleOverrides":[0,0,0],"lineTextDirections":null,"resolvedParagraphValues":{"0":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":0.0},"1":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":0.0},"2":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":0.0}},"textAutoResize":"WIDTH_AND_HEIGHT","style":{"fontFamily":"Noto Sans KR","fontPostScriptName":"NotoSansKR-Medium","fontStyle":"Medium","textAutoResize":"WIDTH_AND_HEIGHT","fontVariantPosition":"NORMAL","fontSize":18.0,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","letterSpacing":1.8,"letterSpacingValue":10.0,"letterSpacingUnit":"PERCENT","lineHeightPx":27.0,"lineHeightPercent":124.999992370605,"lineHeightPercentFontSize":150.0,"lineHeightUnit":"FONT_SIZE_%","paragraphSpacing":0,"paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecoration":"NONE","textDecorationSkipInk":false,"textDecorationStyle":"solid","textTruncation":"DISABLED"},"styleOverrideTable":{}},"8:2108":{"type":"FRAME","id":"8:2108","name":"Service 1","absoluteBoundingBox":{"x":-2068.5,"y":1903.5,"width":1069.0,"height":205.0},"isolatedAbsoluteRenderBounds":{"x":-2068.5,"y":1903.5,"width":1069.0,"height":205.0},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,0.0]],"size":{"x":1069.0,"y":205.0},"fills":[],"strokeAlign":"INSIDE","layoutAlign":"STRETCH","strokes":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":1.0,"g":1.0,"b":1.0,"a":1.0},"visible":true,"opacity":1.0}],"individualStrokeWeights":{"top":0.5,"right":0.0,"bottom":0.0,"left":0.0},"accessibleHTMLTag":"SECTION","isDecorativeImage":false,"accessibleLabel":"Specific areas of business and corporate law that we help with","ariaAttributes":{},"interactions":[],"behaviors":{"appear":{"otherLayer":{"sessionID":-1,"localID":-1},"trigger":"THIS_LAYER_IN_VIEW","direction":"UP","enterTransition":{"easingType":"OUT_CUBIC","easingFunction":[0.215000003576279,0.610000014305115,0.354999989271164,1.0],"transitionDuration":0.800000011920929,"delay":0.0},"enterState":{"transform":{"m00":1.0,"m01":0.0,"m02":0.0,"m10":0.0,"m11":1.0,"m12":0.0},"opacity":0.0},"exitTransition":{"easingType":"OUT_CUBIC","easingFunction":[0.215000003576279,0.610000014305115,0.354999989271164,1.0],"transitionDuration":0.600000023841858,"delay":0.0},"exitState":{"transform":{"m00":1.0,"m01":0.0,"m02":0.0,"m10":0.0,"m11":1.0,"m12":0.0},"opacity":1.0},"playsOnce":false,"behaviorType":"appear"}},"paddingTop":43.0,"paddingBottom":20.0,"paddingLeft":5.0,"layoutMode":"HORIZONTAL","itemSpacing":186.0,"primaryAxisSizingMode":"FIXED","counterAxisSizingMode":"FIXED","children":["8:2109","8:2110"]},"2224:3004":{"type":"GROUP","id":"2224:3004","name":"Footer subhead","absoluteBoundingBox":{"x":-803.0,"y":3520.0,"width":311.0,"height":14.0},"isolatedAbsoluteRenderBounds":{"x":-803.0,"y":3520.0,"width":311.0,"height":14.0},"relativeTransform":[[1.0,0.0,32.0],[0.0,1.0,186.0]],"size":{"x":311.0,"y":14.0},"fills":[],"strokeAlign":"INSIDE","layoutAlign":"STRETCH","strokes":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"children":["2224:3005"]},"2133:3204":{"type":"TEXT","id":"2133:3204","name":"브레인에이블은 지금도 혁신하고 발전중입니다.","absoluteBoundingBox":{"x":-695.5,"y":687.0,"width":521.0,"height":26.0},"isolatedAbsoluteRenderBounds":{"x":-694.455871582031,"y":689.719970703125,"width":518.18701171875,"height":22.4400024414062},"relativeTransform":[[1.0,0.0,139.5],[0.0,1.0,96.0]],"size":{"x":521.0,"y":26.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":1.0,"g":1.0,"b":1.0,"a":1.0},"visible":true,"opacity":1.0}],"constraints":{"vertical":"CENTER","horizontal":"CENTER"},"strokeAlign":"OUTSIDE","strokes":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"characterStyleOverrides":[],"characters":"브레인에이블은 지금도 혁신하고 발전중입니다.","lineIndentations":[0],"lineTypes":["NONE"],"listStartOffsets":[],"lineStyleOverrides":[0],"lineTextDirections":null,"resolvedParagraphValues":{"0":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":0.0}},"textAutoResize":"WIDTH_AND_HEIGHT","textAlignHorizontal":"CENTER","textAlignVertical":"CENTER","style":{"fontFamily":"Noto Sans KR","fontPostScriptName":"NotoSansKR-Bold","fontStyle":"Bold","textAutoResize":"WIDTH_AND_HEIGHT","fontVariantPosition":"NORMAL","fontSize":24.0,"textAlignHorizontal":"CENTER","textAlignVertical":"CENTER","letterSpacing":2.4,"letterSpacingValue":10.0,"letterSpacingUnit":"PERCENT","lineHeightPx":26.1599998474121,"lineHeightPercent":90.8333282470703,"lineHeightPercentFontSize":109.0,"lineHeightUnit":"FONT_SIZE_%","paragraphSpacing":0,"paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecoration":"NONE","textDecorationSkipInk":false,"textDecorationStyle":"solid","textTruncation":"DISABLED"},"styleOverrideTable":{}},"2715:1270":{"type":"FRAME","id":"2715:1270","name":"Frame 2","absoluteBoundingBox":{"x":-2174.0,"y":-159.0,"width":365.0,"height":450.0},"isolatedAbsoluteRenderBounds":{"x":-2174.0,"y":-159.0,"width":365.0,"height":450.0},"relativeTransform":[[1.0,0.0,5.0],[0.0,1.0,0.0]],"size":{"x":365.0,"y":450.0},"fills":[],"visible":false,"strokeAlign":"INSIDE","maxWidth":375.0,"strokes":[],"accessibleHTMLTag":"HEADER","isDecorativeImage":false,"ariaAttributes":{},"interactions":[{"id":{"sessionID":2608,"localID":1765},"event":{"interactionType":"ON_CLICK"},"actions":[{"transitionNodeID":{"sessionID":0,"localID":3},"connectionType":"INTERNAL_NODE","navigationType":"NAVIGATE","connectionURL":"/"}],"isDeleted":false,"stateManagementVersion":1}],"paddingTop":24.0,"paddingRight":44.0,"paddingBottom":24.0,"paddingLeft":44.0,"layoutMode":"VERTICAL","itemSpacing":40.0,"counterAxisAlignItems":"CENTER","primaryAxisSizingMode":"FIXED","children":["2715:1271"]},"9:2655":{"type":"TEXT","id":"9:2655","name":"Header/Header 2","absoluteBoundingBox":{"x":0.0,"y":0.0,"width":29.0,"height":26.0},"isolatedAbsoluteRenderBounds":{"x":0.480000019073486,"y":4.95999908447266,"width":26.2653751373291,"height":20.9280014038086},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,0.0]],"size":{"x":29.0,"y":26.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":0.0,"g":0.0,"b":0.0,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"INSIDE","strokes":[],"strokeWeight":0.0,"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"characterStyleOverrides":[],"characters":"Ag","lineIndentations":[0],"lineTypes":["NONE"],"listStartOffsets":[],"lineStyleOverrides":[0],"lineTextDirections":null,"resolvedParagraphValues":{"0":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":0.0}},"textAutoResize":"WIDTH_AND_HEIGHT","style":{"fontFamily":"Geist","fontPostScriptName":"Geist-Regular","fontStyle":"Regular","textAutoResize":"WIDTH_AND_HEIGHT","responsiveTextStyleVariants":[{"minWidth":1280.0,"name":"Desktop","style":{"fontSize":24.0,"letterSpacing":-1.2,"letterSpacingValue":-5.0,"letterSpacingUnit":"PERCENT","lineHeightPx":26.1599998474121,"lineHeightPercent":93.0133361816406,"lineHeightPercentFontSize":109.0,"lineHeightUnit":"FONT_SIZE_%"}},{"minWidth":800.0,"name":"Tablet","style":{"fontSize":20.0,"letterSpacing":-1.0,"letterSpacingValue":-5.0,"letterSpacingUnit":"PERCENT","lineHeightPx":21.8000011444092,"lineHeightPercent":93.0133361816406,"lineHeightPercentFontSize":109.0,"lineHeightUnit":"FONT_SIZE_%"}},{"minWidth":0.0,"name":"Mobile","style":{"fontSize":20.0,"letterSpacing":-1.0,"letterSpacingValue":-5.0,"letterSpacingUnit":"PERCENT","lineHeightPx":21.8000011444092,"lineHeightPercent":93.0133361816406,"lineHeightPercentFontSize":109.0,"lineHeightUnit":"FONT_SIZE_%"}}],"fontVariantPosition":"NORMAL","fontSize":24.0,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","letterSpacing":-1.2,"letterSpacingValue":-5.0,"letterSpacingUnit":"PERCENT","lineHeightPx":26.1599998474121,"lineHeightPercent":83.8461532592773,"lineHeightPercentFontSize":109.0,"lineHeightUnit":"FONT_SIZE_%","paragraphSpacing":0,"paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecoration":"NONE","textDecorationSkipInk":false,"textDecorationStyle":"solid","textTruncation":"DISABLED"},"styleOverrideTable":{}},"161:107":{"type":"FRAME","id":"161:107","name":"Main","absoluteBoundingBox":{"x":-835.0,"y":591.0,"width":800.0,"height":3103.0},"isolatedAbsoluteRenderBounds":{"x":-946.0,"y":591.0,"width":1287.0,"height":3103.0},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,750.0]],"size":{"x":800.0,"y":3103.0},"fills":[],"strokeAlign":"INSIDE","layoutAlign":"STRETCH","strokes":[],"accessibleHTMLTag":"MAIN","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"layoutMode":"VERTICAL","counterAxisSizingMode":"FIXED","children":["8:1963","8:2126","119:266","2224:2911"]},"8:2147":{"type":"TEXT","id":"8:2147","name":"Visa applications Green cards and citizenship Deportation defense Employment-based immigration","absoluteBoundingBox":{"x":-211.0,"y":2203.0,"width":420.0,"height":96.0},"isolatedAbsoluteRenderBounds":{"x":-210.639999389648,"y":2208.20190429688,"width":251.148941040039,"height":87.714111328125},"relativeTransform":[[1.0,0.0,560.0],[0.0,1.0,20.0]],"size":{"x":420.0,"y":96.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":1.0,"g":1.0,"b":1.0,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"OUTSIDE","strokes":[],"strokeWeight":3.21430063247681,"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"characterStyleOverrides":[],"characters":"Visa applications\nGreen cards and citizenship\nDeportation defense\nEmployment-based immigration","lineIndentations":[0,0,0,0],"lineTypes":["NONE","NONE","NONE","NONE"],"listStartOffsets":[],"lineStyleOverrides":[0,0,0,0],"lineTextDirections":null,"resolvedParagraphValues":{"0":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":0.0},"1":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":0.0},"2":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":0.0},"3":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":0.0}},"textAutoResize":"HEIGHT","style":{"styleIdForText":"StyleId:6:1353","fontFamily":"Geist","fontPostScriptName":"Geist-Regular","fontStyle":"Regular","textAutoResize":"HEIGHT","responsiveTextStyleVariants":[{"minWidth":1280.0,"name":"Desktop","style":{"styleIdForText":"StyleId:6:1353","fontSize":18.0,"letterSpacing":-0.36,"letterSpacingValue":-2.0,"letterSpacingUnit":"PERCENT","lineHeightPx":24.3000011444092,"lineHeightPercent":115.199996948242,"lineHeightPercentFontSize":135.0,"lineHeightUnit":"FONT_SIZE_%"}}],"fontVariantPosition":"NORMAL","fontSize":18.0,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","letterSpacing":-0.36,"letterSpacingValue":-2.0,"letterSpacingUnit":"PERCENT","lineHeightPx":24.3000011444092,"lineHeightPercent":103.846160888672,"lineHeightPercentFontSize":135.0,"lineHeightUnit":"FONT_SIZE_%","paragraphSpacing":0,"paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecoration":"NONE","textDecorationSkipInk":false,"textDecorationStyle":"solid","textTruncation":"DISABLED"},"styleOverrideTable":{}},"8:2130":{"type":"FRAME","id":"8:2130","name":"Service 1","absoluteBoundingBox":{"x":-771.0,"y":1571.0,"width":820.0,"height":160.0},"isolatedAbsoluteRenderBounds":{"x":-771.0,"y":1571.0,"width":820.0,"height":160.0},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,0.0]],"size":{"x":820.0,"y":160.0},"fills":[],"strokeAlign":"INSIDE","strokes":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":1.0,"g":1.0,"b":1.0,"a":1.0},"visible":true,"opacity":1.0}],"individualStrokeWeights":{"top":0.5,"right":0.0,"bottom":0.0,"left":0.0},"accessibleHTMLTag":"SECTION","isDecorativeImage":false,"accessibleLabel":"Specific areas of business and corporate law that we help with","ariaAttributes":{},"interactions":[],"behaviors":{"appear":{"otherLayer":{"sessionID":-1,"localID":-1},"trigger":"THIS_LAYER_IN_VIEW","direction":"UP","enterTransition":{"easingType":"OUT_CUBIC","easingFunction":[0.215000003576279,0.610000014305115,0.354999989271164,1.0],"transitionDuration":0.800000011920929,"delay":0.0},"enterState":{"transform":{"m00":1.0,"m01":0.0,"m02":0.0,"m10":0.0,"m11":1.0,"m12":0.0},"opacity":0.0},"exitTransition":{"easingType":"OUT_CUBIC","easingFunction":[0.215000003576279,0.610000014305115,0.354999989271164,1.0],"transitionDuration":0.600000023841858,"delay":0.0},"exitState":{"transform":{"m00":1.0,"m01":0.0,"m02":0.0,"m10":0.0,"m11":1.0,"m12":0.0},"opacity":1.0},"playsOnce":false,"behaviorType":"appear"}},"paddingTop":20.0,"paddingBottom":20.0,"layoutMode":"HORIZONTAL","itemSpacing":266.0,"counterAxisSizingMode":"FIXED","children":["8:2131","8:2132"]},"2715:1271":{"type":"FRAME","id":"2715:1271","name":"Header 1","absoluteBoundingBox":{"x":-2130.0,"y":-135.0,"width":277.0,"height":382.0},"isolatedAbsoluteRenderBounds":{"x":-2130.0,"y":-135.0,"width":277.0,"height":382.0},"relativeTransform":[[1.0,0.0,44.0],[0.0,1.0,24.0]],"size":{"x":277.0,"y":382.0},"fills":[],"strokeAlign":"INSIDE","strokes":[],"accessibleHTMLTag":"HEADER","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"paddingTop":24.0,"paddingRight":33.0,"paddingBottom":24.0,"paddingLeft":33.0,"layoutMode":"VERTICAL","itemSpacing":16.0,"counterAxisAlignItems":"CENTER","children":["2715:1272","2715:1273"]},"2224:2985":{"type":"FRAME","id":"2224:2985","name":"Footer section","absoluteBoundingBox":{"x":-2179.0,"y":3334.0,"width":375.0,"height":464.0},"isolatedAbsoluteRenderBounds":{"x":-2179.0,"y":3334.0,"width":375.0,"height":464.0},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,3493.0]],"size":{"x":375.0,"y":464.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":1.0,"g":1.0,"b":1.0,"a":1.0},"visible":true,"opacity":1.0}],"visible":false,"strokeAlign":"INSIDE","layoutAlign":"STRETCH","strokes":[],"accessibleHTMLTag":"FOOTER","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"paddingTop":87.0,"paddingRight":32.0,"paddingBottom":29.0,"paddingLeft":32.0,"layoutMode":"VERTICAL","itemSpacing":57.0,"primaryAxisSizingMode":"FIXED","counterAxisSizingMode":"FIXED","children":["2224:2986","2224:2989","2224:2991","2224:2998"]},"2281:541":{"type":"TEXT","id":"2281:541","name":"Rich text/Body","absoluteBoundingBox":{"x":0.0,"y":0.0,"width":21.0,"height":24.0},"isolatedAbsoluteRenderBounds":{"x":0.409090936183929,"y":6.3636360168457,"width":18.9261379241943,"height":15.0909099578857},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,0.0]],"size":{"x":21.0,"y":24.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":0.0,"g":0.0,"b":0.0,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"INSIDE","strokes":[],"strokeWeight":0.0,"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"characterStyleOverrides":[],"characters":"Ag","lineIndentations":[0],"lineTypes":["NONE"],"listStartOffsets":[],"lineStyleOverrides":[0],"lineTextDirections":null,"resolvedParagraphValues":{"0":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":0.0}},"textAutoResize":"WIDTH_AND_HEIGHT","style":{"fontFamily":"Inter","fontPostScriptName":null,"fontStyle":"Regular","textAutoResize":"WIDTH_AND_HEIGHT","fontVariantPosition":"NORMAL","fontSize":16.0,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","letterSpacing":0.0,"letterSpacingValue":0.0,"letterSpacingUnit":"PERCENT","lineHeightPx":24.0,"lineHeightPercent":123.943664550781,"lineHeightPercentFontSize":150.0,"lineHeightUnit":"FONT_SIZE_%","paragraphSpacing":0,"paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecoration":"NONE","textDecorationSkipInk":false,"textDecorationStyle":"solid","textTruncation":"DISABLED"},"styleOverrideTable":{}},"2715:1035":{"type":"RECTANGLE","id":"2715:1035","name":"Logo","absoluteBoundingBox":{"x":-2115.0,"y":-135.0,"width":211.0,"height":75.0},"isolatedAbsoluteRenderBounds":{"x":-2115.0,"y":-135.0,"width":211.0,"height":75.0},"relativeTransform":[[1.0,0.0,64.0],[0.0,1.0,24.0]],"size":{"x":211.0,"y":75.0},"fills":[{"blendMode":"NORMAL","type":"IMAGE","scaleMode":"FILL","imageRef":"64270238d3de4edd07597c9179b36856b5a53af3","originalImageWidth":1400,"originalImageHeight":1167,"visible":true,"opacity":1.0,"rotation":0.0}],"strokeAlign":"INSIDE","strokes":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"accessibleLabel":"Logomark","ariaAttributes":{},"interactions":[{"id":{"sessionID":2608,"localID":4807},"event":{"interactionType":"ON_CLICK"},"actions":[{"transitionNodeID":{"sessionID":0,"localID":3},"connectionType":"INTERNAL_NODE","navigationType":"NAVIGATE","connectionURL":"/"}],"isDeleted":false,"stateManagementVersion":1}]},"2715:1038":{"type":"TEXT","id":"2715:1038","name":"회사소개","absoluteBoundingBox":{"x":-1295.0,"y":-109.0,"width":59.0,"height":23.0},"isolatedAbsoluteRenderBounds":{"x":-1294.81750488281,"y":-105.312004089355,"width":58.63623046875,"height":16.5120010375977},"relativeTransform":[[1.0,0.0,80.0],[0.0,1.0,0.0]],"size":{"x":59.0,"y":23.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":0.443900465965271,"g":0.442026853561401,"b":0.442026853561401,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"OUTSIDE","strokes":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"characterStyleOverrides":[],"characters":"회사소개","lineIndentations":[0],"lineTypes":["NONE"],"listStartOffsets":[],"lineStyleOverrides":[0],"lineTextDirections":null,"resolvedParagraphValues":{"0":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":16.0}},"textAutoResize":"WIDTH_AND_HEIGHT","textAlignHorizontal":"CENTER","textAlignVertical":"CENTER","paragraphSpacing":16.0,"fallbackFonts":[{"fontFamily":"Noto Sans KR","fontStyle":"Medium"}],"style":{"fontFamily":"Inter","fontPostScriptName":"Inter-Medium","fontStyle":"Medium","fallbackFonts":[{"fontFamily":"Noto Sans KR","fontStyle":"Medium"}],"hyperlink":{"type":"NODE","nodeID":"/about_us"},"paragraphSpacing":16.0,"textAutoResize":"WIDTH_AND_HEIGHT","fontVariantPosition":"NORMAL","textDecoration":"UNDERLINE","textDecorationSkipInk":true,"fontSize":16.0,"textAlignHorizontal":"CENTER","textAlignVertical":"CENTER","letterSpacing":-0.08,"letterSpacingValue":-0.5,"letterSpacingUnit":"PERCENT","lineHeightPx":23.2000007629395,"lineHeightPercent":119.812210083008,"lineHeightPercentFontSize":145.0,"lineHeightUnit":"FONT_SIZE_%","paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecorationStyle":"solid","textTruncation":"DISABLED"},"styleOverrideTable":{}},"2715:1278":{"type":"TEXT","id":"2715:1278","name":"오시는길","absoluteBoundingBox":{"x":-2027.0,"y":200.0,"width":71.0,"height":23.0},"isolatedAbsoluteRenderBounds":{"x":-2026.69750976562,"y":204.688003540039,"width":70.396240234375,"height":16.5119934082031},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,220.0]],"size":{"x":71.0,"y":23.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":0.443900465965271,"g":0.442026853561401,"b":0.442026853561401,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"OUTSIDE","strokes":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"characterStyleOverrides":[2,2,2,2],"characters":"센터소개","lineIndentations":[0],"lineTypes":["NONE"],"listStartOffsets":[],"lineStyleOverrides":[0],"lineTextDirections":null,"resolvedParagraphValues":{"0":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":16.0}},"textAutoResize":"WIDTH_AND_HEIGHT","textAlignHorizontal":"CENTER","textAlignVertical":"CENTER","paragraphSpacing":16.0,"style":{"styleIdForText":"StyleId:2608:2916","fontFamily":"Noto Sans KR","fontPostScriptName":"NotoSansKR-Medium","fontStyle":"Medium","paragraphSpacing":16.0,"textAutoResize":"WIDTH_AND_HEIGHT","fontVariantPosition":"NORMAL","textDecoration":"UNDERLINE","textDecorationSkipInk":true,"fontSize":16.0,"textAlignHorizontal":"CENTER","textAlignVertical":"CENTER","letterSpacing":3.84,"letterSpacingValue":24.0,"letterSpacingUnit":"PERCENT","lineHeightPx":23.2000007629395,"lineHeightPercent":120.83332824707,"lineHeightPercentFontSize":145.0,"lineHeightUnit":"FONT_SIZE_%","paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecorationStyle":"solid","textTruncation":"DISABLED"},"styleOverrideTable":{"2":{"styleIdForText":"StyleId:2608:2916","fontFamily":"Noto Sans KR","fontPostScriptName":"NotoSansKR-Medium","fontStyle":"Medium","hyperlink":{"type":"NODE","nodeID":"/센터소개"},"paragraphSpacing":16.0,"textAutoResize":"WIDTH_AND_HEIGHT","fontVariantPosition":"NORMAL","textDecoration":"UNDERLINE","textDecorationSkipInk":true,"isOverrideOverTextStyle":true,"fontSize":16.0,"letterSpacing":3.84,"letterSpacingValue":24.0,"letterSpacingUnit":"PERCENT","lineHeightPx":23.2000007629395,"lineHeightPercent":120.83332824707,"lineHeightPercentFontSize":145.0,"lineHeightUnit":"FONT_SIZE_%","inheritTextStyleId":"2608:2916","paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecorationStyle":"solid","textTruncation":"DISABLED"}}},"7:1788":{"type":"FRAME","id":"7:1788","name":"Header section","absoluteBoundingBox":{"x":-2179.0,"y":-36.0,"width":1280.0,"height":885.0},"isolatedAbsoluteRenderBounds":{"x":-2179.0,"y":-36.0,"width":1517.0,"height":885.0},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,123.0]],"size":{"x":1280.0,"y":885.0},"fills":[{"blendMode":"NORMAL","type":"IMAGE","scaleMode":"FILL","imageRef":"c061b8052963d35db5cc58747021352e4affc360","originalImageWidth":4096,"originalImageHeight":2731,"visible":true,"opacity":1.0,"rotation":0.0},{"opacity":0.560000002384186,"blendMode":"NORMAL","type":"SOLID","color":{"r":0.125490203499794,"g":0.125490203499794,"b":0.125490203499794,"a":1.0},"visible":true}],"strokeAlign":"INSIDE","layoutAlign":"STRETCH","strokes":[],"accessibleHTMLTag":"HEADER","isDecorativeImage":false,"accessibleLabel":"Close-up photo of a bookshelf with old books.","ariaAttributes":{},"interactions":[],"paddingTop":184.0,"paddingBottom":68.0,"paddingLeft":139.0,"layoutMode":"VERTICAL","itemSpacing":-161.0,"primaryAxisAlignItems":"MAX","primaryAxisSizingMode":"FIXED","counterAxisSizingMode":"FIXED","children":["7:1789"]},"8:1936":{"type":"FRAME","id":"8:1936","name":"Stat 3","absoluteBoundingBox":{"x":-1250.5,"y":973.0,"width":247.0,"height":353.0},"isolatedAbsoluteRenderBounds":{"x":-1250.5,"y":973.0,"width":247.0,"height":353.0},"relativeTransform":[[1.0,0.0,768.0],[0.0,1.0,0.0]],"size":{"x":247.0,"y":353.0},"fills":[],"strokeAlign":"INSIDE","strokes":[],"accessibleHTMLTag":"SECTION","isDecorativeImage":false,"accessibleLabel":"Statistic 3 about Jones and Brown","ariaAttributes":{},"interactions":[],"behaviors":{"appear":{"otherLayer":{"sessionID":-1,"localID":-1},"trigger":"THIS_LAYER_IN_VIEW","direction":"UP","enterTransition":{"easingType":"OUT_CUBIC","easingFunction":[0.215000003576279,0.610000014305115,0.354999989271164,1.0],"transitionDuration":0.800000011920929,"delay":0.150000005960464},"enterState":{"transform":{"m00":1.0,"m01":0.0,"m02":0.0,"m10":0.0,"m11":1.0,"m12":0.0},"opacity":0.0},"exitTransition":{"easingType":"OUT_CUBIC","easingFunction":[0.215000003576279,0.610000014305115,0.354999989271164,1.0],"transitionDuration":0.600000023841858,"delay":0.0},"exitState":{"transform":{"m00":1.0,"m01":0.0,"m02":0.0,"m10":0.0,"m11":1.0,"m12":0.0},"opacity":1.0},"playsOnce":false,"behaviorType":"appear"}},"layoutMode":"VERTICAL","itemSpacing":56.0,"primaryAxisSizingMode":"FIXED","counterAxisSizingMode":"FIXED","children":["8:1937","2133:3191"]},"2715:1275":{"type":"TEXT","id":"2715:1275","name":"제품소개","absoluteBoundingBox":{"x":-2027.0,"y":35.0,"width":71.0,"height":23.0},"isolatedAbsoluteRenderBounds":{"x":-2026.69750976562,"y":39.6879997253418,"width":70.396240234375,"height":16.5120010375977},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,55.0]],"size":{"x":71.0,"y":23.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":0.443900465965271,"g":0.442026853561401,"b":0.442026853561401,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"OUTSIDE","strokes":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"characterStyleOverrides":[],"characters":"회사소개","lineIndentations":[0],"lineTypes":["NONE"],"listStartOffsets":[],"lineStyleOverrides":[0],"lineTextDirections":null,"resolvedParagraphValues":{"0":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":16.0}},"textAutoResize":"WIDTH_AND_HEIGHT","textAlignHorizontal":"CENTER","textAlignVertical":"CENTER","paragraphSpacing":16.0,"style":{"styleIdForText":"StyleId:2608:2916","fontFamily":"Noto Sans KR","fontPostScriptName":"NotoSansKR-Medium","fontStyle":"Medium","hyperlink":{"type":"NODE","nodeID":"/about_us"},"paragraphSpacing":16.0,"textAutoResize":"WIDTH_AND_HEIGHT","fontVariantPosition":"NORMAL","textDecoration":"UNDERLINE","textDecorationSkipInk":true,"fontSize":16.0,"textAlignHorizontal":"CENTER","textAlignVertical":"CENTER","letterSpacing":3.84,"letterSpacingValue":24.0,"letterSpacingUnit":"PERCENT","lineHeightPx":23.2000007629395,"lineHeightPercent":120.83332824707,"lineHeightPercentFontSize":145.0,"lineHeightUnit":"FONT_SIZE_%","paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecorationStyle":"solid","textTruncation":"DISABLED"},"styleOverrideTable":{}},"8:2115":{"type":"TEXT","id":"8:2115","name":"지속적인 확장","absoluteBoundingBox":{"x":-2063.5,"y":2617.5,"width":127.0,"height":27.0},"isolatedAbsoluteRenderBounds":{"x":-2062.84008789062,"y":2622.60009765625,"width":125.703491210938,"height":18.679931640625},"relativeTransform":[[1.0,0.0,5.0],[0.0,1.0,43.0]],"size":{"x":127.0,"y":27.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":1.0,"g":1.0,"b":1.0,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"OUTSIDE","strokes":[],"strokeWeight":3.21430063247681,"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"characterStyleOverrides":[],"characters":"지속적인 확장","lineIndentations":[0],"lineTypes":["NONE"],"listStartOffsets":[],"lineStyleOverrides":[0],"lineTextDirections":null,"resolvedParagraphValues":{"0":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":0.0}},"textAutoResize":"WIDTH_AND_HEIGHT","style":{"fontFamily":"Noto Sans KR","fontPostScriptName":"NotoSansKR-Bold","fontStyle":"Bold","textAutoResize":"WIDTH_AND_HEIGHT","fontVariantPosition":"NORMAL","fontSize":20.0,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","letterSpacing":2.0,"letterSpacingValue":10.0,"letterSpacingUnit":"PERCENT","lineHeightPx":27.0,"lineHeightPercent":112.499992370605,"lineHeightPercentFontSize":135.0,"lineHeightUnit":"FONT_SIZE_%","paragraphSpacing":0,"paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecoration":"NONE","textDecorationSkipInk":false,"textDecorationStyle":"solid","textTruncation":"DISABLED"},"styleOverrideTable":{}},"2715:1041":{"type":"TEXT","id":"2715:1041","name":"센터소개","absoluteBoundingBox":{"x":-1022.0,"y":-109.0,"width":59.0,"height":23.0},"isolatedAbsoluteRenderBounds":{"x":-1021.81750488281,"y":-105.312004089355,"width":58.63623046875,"height":16.5120010375977},"relativeTransform":[[1.0,0.0,353.0],[0.0,1.0,0.0]],"size":{"x":59.0,"y":23.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":0.443900465965271,"g":0.442026853561401,"b":0.442026853561401,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"OUTSIDE","strokes":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"characterStyleOverrides":[],"characters":"센터소개","lineIndentations":[0],"lineTypes":["NONE"],"listStartOffsets":[],"lineStyleOverrides":[0],"lineTextDirections":null,"resolvedParagraphValues":{"0":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":16.0}},"textAutoResize":"WIDTH_AND_HEIGHT","textAlignHorizontal":"CENTER","textAlignVertical":"CENTER","paragraphSpacing":16.0,"fallbackFonts":[{"fontFamily":"Noto Sans KR","fontStyle":"Medium"}],"style":{"fontFamily":"Inter","fontPostScriptName":"Inter-Medium","fontStyle":"Medium","fallbackFonts":[{"fontFamily":"Noto Sans KR","fontStyle":"Medium"}],"hyperlink":{"type":"NODE","nodeID":"/센터소개"},"paragraphSpacing":16.0,"textAutoResize":"WIDTH_AND_HEIGHT","fontVariantPosition":"NORMAL","textDecoration":"UNDERLINE","textDecorationSkipInk":true,"fontSize":16.0,"textAlignHorizontal":"CENTER","textAlignVertical":"CENTER","letterSpacing":-0.08,"letterSpacingValue":-0.5,"letterSpacingUnit":"PERCENT","lineHeightPx":23.2000007629395,"lineHeightPercent":119.812210083008,"lineHeightPercentFontSize":145.0,"lineHeightUnit":"FONT_SIZE_%","paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecorationStyle":"solid","textTruncation":"DISABLED"},"styleOverrideTable":{}},"8:2143":{"type":"TEXT","id":"8:2143","name":"Real Estate Law","absoluteBoundingBox":{"x":-771.0,"y":2203.0,"width":131.0,"height":24.0},"isolatedAbsoluteRenderBounds":{"x":-769.452026367188,"y":2208.21997070312,"width":128.523986816406,"height":12.99609375},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,20.0]],"size":{"x":131.0,"y":24.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":1.0,"g":1.0,"b":1.0,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"OUTSIDE","strokes":[],"strokeWeight":3.21430063247681,"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"characterStyleOverrides":[],"characters":"Real Estate Law","lineIndentations":[0],"lineTypes":["NONE"],"listStartOffsets":[],"lineStyleOverrides":[0],"lineTextDirections":null,"resolvedParagraphValues":{"0":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":0.0}},"textAutoResize":"WIDTH_AND_HEIGHT","style":{"styleIdForText":"StyleId:4:749","fontFamily":"Geist","fontPostScriptName":"Geist-Medium","fontStyle":"Medium","textAutoResize":"WIDTH_AND_HEIGHT","fontVariantPosition":"NORMAL","fontSize":18.0,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","letterSpacing":-0.36,"letterSpacingValue":-2.0,"letterSpacingUnit":"PERCENT","lineHeightPx":24.3000011444092,"lineHeightPercent":103.846160888672,"lineHeightPercentFontSize":135.0,"lineHeightUnit":"FONT_SIZE_%","paragraphSpacing":0,"paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecoration":"NONE","textDecorationSkipInk":false,"textDecorationStyle":"solid","textTruncation":"DISABLED"},"styleOverrideTable":{}},"2715:1040":{"type":"TEXT","id":"2715:1040","name":"제품소개","absoluteBoundingBox":{"x":-1113.0,"y":-109.0,"width":59.0,"height":23.0},"isolatedAbsoluteRenderBounds":{"x":-1112.81750488281,"y":-105.312004089355,"width":58.63623046875,"height":16.5120010375977},"relativeTransform":[[1.0,0.0,262.0],[0.0,1.0,0.0]],"size":{"x":59.0,"y":23.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":0.443900465965271,"g":0.442026853561401,"b":0.442026853561401,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"OUTSIDE","strokes":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"characterStyleOverrides":[],"characters":"커뮤니티","lineIndentations":[0],"lineTypes":["NONE"],"listStartOffsets":[],"lineStyleOverrides":[0],"lineTextDirections":null,"resolvedParagraphValues":{"0":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":16.0}},"textAutoResize":"WIDTH_AND_HEIGHT","textAlignHorizontal":"CENTER","textAlignVertical":"CENTER","paragraphSpacing":16.0,"fallbackFonts":[{"fontFamily":"Noto Sans KR","fontStyle":"Medium"}],"style":{"fontFamily":"Inter","fontPostScriptName":"Inter-Medium","fontStyle":"Medium","fallbackFonts":[{"fontFamily":"Noto Sans KR","fontStyle":"Medium"}],"hyperlink":{"type":"NODE","nodeID":"/커뮤니티Articles"},"paragraphSpacing":16.0,"textAutoResize":"WIDTH_AND_HEIGHT","fontVariantPosition":"NORMAL","textDecoration":"UNDERLINE","textDecorationSkipInk":true,"fontSize":16.0,"textAlignHorizontal":"CENTER","textAlignVertical":"CENTER","letterSpacing":-0.08,"letterSpacingValue":-0.5,"letterSpacingUnit":"PERCENT","lineHeightPx":23.2000007629395,"lineHeightPercent":119.812210083008,"lineHeightPercentFontSize":145.0,"lineHeightUnit":"FONT_SIZE_%","paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecorationStyle":"solid","textTruncation":"DISABLED"},"styleOverrideTable":{}},"2715:1287":{"type":"TEXT","id":"2715:1287","name":"오시는길","absoluteBoundingBox":{"x":-683.0,"y":200.0,"width":71.0,"height":23.0},"isolatedAbsoluteRenderBounds":{"x":-682.697509765625,"y":204.688003540039,"width":70.396240234375,"height":16.5119934082031},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,220.0]],"size":{"x":71.0,"y":23.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":0.443900465965271,"g":0.442026853561401,"b":0.442026853561401,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"OUTSIDE","strokes":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"characterStyleOverrides":[2,2,2,2],"characters":"센터소개","lineIndentations":[0],"lineTypes":["NONE"],"listStartOffsets":[],"lineStyleOverrides":[0],"lineTextDirections":null,"resolvedParagraphValues":{"0":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":16.0}},"textAutoResize":"WIDTH_AND_HEIGHT","textAlignHorizontal":"CENTER","textAlignVertical":"CENTER","paragraphSpacing":16.0,"style":{"styleIdForText":"StyleId:2608:2916","fontFamily":"Noto Sans KR","fontPostScriptName":"NotoSansKR-Medium","fontStyle":"Medium","paragraphSpacing":16.0,"textAutoResize":"WIDTH_AND_HEIGHT","fontVariantPosition":"NORMAL","textDecoration":"UNDERLINE","textDecorationSkipInk":true,"fontSize":16.0,"textAlignHorizontal":"CENTER","textAlignVertical":"CENTER","letterSpacing":3.84,"letterSpacingValue":24.0,"letterSpacingUnit":"PERCENT","lineHeightPx":23.2000007629395,"lineHeightPercent":120.83332824707,"lineHeightPercentFontSize":145.0,"lineHeightUnit":"FONT_SIZE_%","paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecorationStyle":"solid","textTruncation":"DISABLED"},"styleOverrideTable":{"2":{"styleIdForText":"StyleId:2608:2916","fontFamily":"Noto Sans KR","fontPostScriptName":"NotoSansKR-Medium","fontStyle":"Medium","hyperlink":{"type":"NODE","nodeID":"/센터소개"},"paragraphSpacing":16.0,"textAutoResize":"WIDTH_AND_HEIGHT","fontVariantPosition":"NORMAL","textDecoration":"UNDERLINE","textDecorationSkipInk":true,"isOverrideOverTextStyle":true,"fontSize":16.0,"letterSpacing":3.84,"letterSpacingValue":24.0,"letterSpacingUnit":"PERCENT","lineHeightPx":23.2000007629395,"lineHeightPercent":120.83332824707,"lineHeightPercentFontSize":145.0,"lineHeightUnit":"FONT_SIZE_%","inheritTextStyleId":"2608:2916","paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecorationStyle":"solid","textTruncation":"DISABLED"}}},"2281:543":{"type":"TEXT","id":"2281:543","name":"Rich text/Header 2","absoluteBoundingBox":{"x":0.0,"y":0.0,"width":63.0,"height":53.0},"isolatedAbsoluteRenderBounds":{"x":1.17613637447357,"y":9.09090805053711,"width":58.1679573059082,"height":45.2727279663086},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,0.0]],"size":{"x":63.0,"y":53.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":0.0,"g":0.0,"b":0.0,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"INSIDE","strokes":[],"strokeWeight":0.0,"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"characterStyleOverrides":[],"characters":"Ag","lineIndentations":[0],"lineTypes":["NONE"],"listStartOffsets":[],"lineStyleOverrides":[0],"lineTextDirections":null,"resolvedParagraphValues":{"0":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":0.0}},"textAutoResize":"WIDTH_AND_HEIGHT","style":{"fontFamily":"Inter","fontPostScriptName":null,"fontStyle":"Semi Bold","textAutoResize":"WIDTH_AND_HEIGHT","fontVariantPosition":"NORMAL","fontSize":48.0,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","letterSpacing":-1.44,"letterSpacingValue":-3.0,"letterSpacingUnit":"PERCENT","lineHeightPx":52.8000030517578,"lineHeightPercent":90.8920211791992,"lineHeightPercentFontSize":110.0,"lineHeightUnit":"FONT_SIZE_%","paragraphSpacing":0,"paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecoration":"NONE","textDecorationSkipInk":false,"textDecorationStyle":"solid","textTruncation":"DISABLED"},"styleOverrideTable":{}},"6:1532":{"type":"FRAME","id":"6:1532","name":"Mobile","absoluteBoundingBox":{"x":-835.0,"y":-159.0,"width":375.0,"height":3485.0},"isolatedAbsoluteRenderBounds":{"x":-835.0,"y":-159.0,"width":375.0,"height":3485.0},"relativeTransform":[[1.0,0.0,1408.0],[0.0,1.0,100.0]],"size":{"x":375.0,"y":3485.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":1.0,"g":1.0,"b":1.0,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"INSIDE","strokes":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"clipsContent":true,"overflowDirection":"VERTICAL_SCROLLING","layoutMode":"VERTICAL","counterAxisAlignItems":"CENTER","counterAxisSizingMode":"FIXED","isBreakpointFrame":true,"children":["2715:1060","2715:1068","7:1796","161:106","2224:2953"]},"2715:1037":{"type":"TEXT","id":"2715:1037","name":"HOME","absoluteBoundingBox":{"x":-1375.0,"y":-109.0,"width":48.0,"height":23.0},"isolatedAbsoluteRenderBounds":{"x":-1374.96594238281,"y":-103.795455932617,"width":47.93896484375,"height":16.0681838989258},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,0.0]],"size":{"x":48.0,"y":23.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":0.443900465965271,"g":0.442026853561401,"b":0.442026853561401,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"OUTSIDE","strokes":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"characterStyleOverrides":[],"characters":"HOME","lineIndentations":[0],"lineTypes":["NONE"],"listStartOffsets":[],"lineStyleOverrides":[0],"lineTextDirections":null,"resolvedParagraphValues":{"0":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":16.0}},"textAutoResize":"WIDTH_AND_HEIGHT","textAlignHorizontal":"CENTER","textAlignVertical":"CENTER","paragraphSpacing":16.0,"style":{"fontFamily":"Inter","fontPostScriptName":"Inter-Medium","fontStyle":"Medium","hyperlink":{"type":"NODE","nodeID":"/"},"paragraphSpacing":16.0,"textAutoResize":"WIDTH_AND_HEIGHT","fontVariantPosition":"NORMAL","textDecoration":"UNDERLINE","textDecorationSkipInk":true,"fontSize":16.0,"textAlignHorizontal":"CENTER","textAlignVertical":"CENTER","letterSpacing":-0.08,"letterSpacingValue":-0.5,"letterSpacingUnit":"PERCENT","lineHeightPx":23.2000007629395,"lineHeightPercent":119.812210083008,"lineHeightPercentFontSize":145.0,"lineHeightUnit":"FONT_SIZE_%","paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecorationStyle":"solid","textTruncation":"DISABLED"},"styleOverrideTable":{}},"2715:1073":{"type":"TEXT","id":"2715:1073","name":"제품소개","absoluteBoundingBox":{"x":-683.0,"y":35.0,"width":71.0,"height":23.0},"isolatedAbsoluteRenderBounds":{"x":-682.697509765625,"y":39.6879997253418,"width":70.396240234375,"height":16.5120010375977},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,55.0]],"size":{"x":71.0,"y":23.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":0.443900465965271,"g":0.442026853561401,"b":0.442026853561401,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"OUTSIDE","strokes":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"characterStyleOverrides":[],"characters":"회사소개","lineIndentations":[0],"lineTypes":["NONE"],"listStartOffsets":[],"lineStyleOverrides":[0],"lineTextDirections":null,"resolvedParagraphValues":{"0":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":16.0}},"textAutoResize":"WIDTH_AND_HEIGHT","textAlignHorizontal":"CENTER","textAlignVertical":"CENTER","paragraphSpacing":16.0,"style":{"styleIdForText":"StyleId:2608:2916","fontFamily":"Noto Sans KR","fontPostScriptName":"NotoSansKR-Medium","fontStyle":"Medium","hyperlink":{"type":"NODE","nodeID":"/about_us"},"paragraphSpacing":16.0,"textAutoResize":"WIDTH_AND_HEIGHT","fontVariantPosition":"NORMAL","textDecoration":"UNDERLINE","textDecorationSkipInk":true,"fontSize":16.0,"textAlignHorizontal":"CENTER","textAlignVertical":"CENTER","letterSpacing":3.84,"letterSpacingValue":24.0,"letterSpacingUnit":"PERCENT","lineHeightPx":23.2000007629395,"lineHeightPercent":120.83332824707,"lineHeightPercentFontSize":145.0,"lineHeightUnit":"FONT_SIZE_%","paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecorationStyle":"solid","textTruncation":"DISABLED"},"styleOverrideTable":{}},"2281:544":{"type":"TEXT","id":"2281:544","name":"Rich text/Header 3","absoluteBoundingBox":{"x":0.0,"y":0.0,"width":43.0,"height":42.0},"isolatedAbsoluteRenderBounds":{"x":0.761363685131073,"y":9.72727203369141,"width":39.7331848144531,"height":30.1818199157715},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,0.0]],"size":{"x":43.0,"y":42.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":0.0,"g":0.0,"b":0.0,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"INSIDE","strokes":[],"strokeWeight":0.0,"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"characterStyleOverrides":[],"characters":"Ag","lineIndentations":[0],"lineTypes":["NONE"],"listStartOffsets":[],"lineStyleOverrides":[0],"lineTextDirections":null,"resolvedParagraphValues":{"0":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":0.0}},"textAutoResize":"WIDTH_AND_HEIGHT","style":{"fontFamily":"Inter","fontPostScriptName":null,"fontStyle":"Bold","textAutoResize":"WIDTH_AND_HEIGHT","fontVariantPosition":"NORMAL","fontSize":32.0,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","letterSpacing":-0.96,"letterSpacingValue":-3.0,"letterSpacingUnit":"PERCENT","lineHeightPx":41.5999984741211,"lineHeightPercent":107.417839050293,"lineHeightPercentFontSize":130.0,"lineHeightUnit":"FONT_SIZE_%","paragraphSpacing":0,"paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecoration":"NONE","textDecorationSkipInk":false,"textDecorationStyle":"solid","textTruncation":"DISABLED"},"styleOverrideTable":{}},"8:2109":{"type":"TEXT","id":"8:2109","name":"독자적인 연구개발","absoluteBoundingBox":{"x":-2063.5,"y":1946.5,"width":168.0,"height":27.0},"isolatedAbsoluteRenderBounds":{"x":-2062.67993164062,"y":1951.73999023438,"width":166.320190429688,"height":18.5799560546875},"relativeTransform":[[1.0,0.0,5.0],[0.0,1.0,43.0]],"size":{"x":168.0,"y":27.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":1.0,"g":1.0,"b":1.0,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"OUTSIDE","strokes":[],"strokeWeight":3.21430063247681,"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"characterStyleOverrides":[],"characters":"독자적인 연구개발","lineIndentations":[0],"lineTypes":["NONE"],"listStartOffsets":[],"lineStyleOverrides":[0],"lineTextDirections":null,"resolvedParagraphValues":{"0":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":0.0}},"textAutoResize":"WIDTH_AND_HEIGHT","textAlignVertical":"CENTER","style":{"fontFamily":"Noto Sans KR","fontPostScriptName":"NotoSansKR-Bold","fontStyle":"Bold","textAutoResize":"WIDTH_AND_HEIGHT","fontVariantPosition":"NORMAL","fontSize":20.0,"textAlignHorizontal":"LEFT","textAlignVertical":"CENTER","letterSpacing":2.0,"letterSpacingValue":10.0,"letterSpacingUnit":"PERCENT","lineHeightPx":27.0,"lineHeightPercent":112.499992370605,"lineHeightPercentFontSize":135.0,"lineHeightUnit":"FONT_SIZE_%","paragraphSpacing":0,"paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecoration":"NONE","textDecorationSkipInk":false,"textDecorationStyle":"solid","textTruncation":"DISABLED"},"styleOverrideTable":{}},"2224:2921":{"type":"FRAME","id":"2224:2921","name":"Contact column 2","absoluteBoundingBox":{"x":-580.0,"y":3229.0,"width":255.0,"height":66.0},"isolatedAbsoluteRenderBounds":{"x":-580.0,"y":3229.0,"width":255.0,"height":66.0},"relativeTransform":[[1.0,0.0,352.0],[0.0,1.0,0.0]],"size":{"x":255.0,"y":66.0},"fills":[],"strokeAlign":"INSIDE","strokes":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"layoutMode":"VERTICAL","itemSpacing":2.0,"primaryAxisAlignItems":"CENTER","children":["2224:2922"]},"8:2136":{"type":"FRAME","id":"8:2136","name":"Service 3","absoluteBoundingBox":{"x":-771.0,"y":2003.0,"width":813.0,"height":112.0},"isolatedAbsoluteRenderBounds":{"x":-771.0,"y":2003.0,"width":813.0,"height":123.422119140625},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,432.0]],"size":{"x":813.0,"y":112.0},"fills":[],"strokeAlign":"INSIDE","strokes":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":1.0,"g":1.0,"b":1.0,"a":1.0},"visible":true,"opacity":1.0}],"individualStrokeWeights":{"top":0.5,"right":0.0,"bottom":0.0,"left":0.0},"accessibleHTMLTag":"SECTION","isDecorativeImage":false,"accessibleLabel":"Specific areas of family law that we help with","ariaAttributes":{},"interactions":[],"behaviors":{"appear":{"otherLayer":{"sessionID":-1,"localID":-1},"trigger":"THIS_LAYER_IN_VIEW","direction":"UP","enterTransition":{"easingType":"OUT_CUBIC","easingFunction":[0.215000003576279,0.610000014305115,0.354999989271164,1.0],"transitionDuration":0.800000011920929,"delay":0.0},"enterState":{"transform":{"m00":1.0,"m01":0.0,"m02":0.0,"m10":0.0,"m11":1.0,"m12":0.0},"opacity":0.0},"exitTransition":{"easingType":"OUT_CUBIC","easingFunction":[0.215000003576279,0.610000014305115,0.354999989271164,1.0],"transitionDuration":0.600000023841858,"delay":0.0},"exitState":{"transform":{"m00":1.0,"m01":0.0,"m02":0.0,"m10":0.0,"m11":1.0,"m12":0.0},"opacity":1.0},"playsOnce":false,"behaviorType":"appear"}},"paddingTop":20.0,"paddingBottom":20.0,"layoutMode":"HORIZONTAL","itemSpacing":266.0,"counterAxisSizingMode":"FIXED","children":["8:2137","8:2138"]},"8:2142":{"type":"FRAME","id":"8:2142","name":"Service 5","absoluteBoundingBox":{"x":-771.0,"y":2183.0,"width":980.0,"height":160.0},"isolatedAbsoluteRenderBounds":{"x":-771.0,"y":2183.0,"width":980.0,"height":160.0},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,612.0]],"size":{"x":980.0,"y":160.0},"fills":[],"visible":false,"strokeAlign":"INSIDE","strokes":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":1.0,"g":1.0,"b":1.0,"a":1.0},"visible":true,"opacity":1.0}],"individualStrokeWeights":{"top":0.5,"right":0.0,"bottom":0.0,"left":0.0},"accessibleHTMLTag":"SECTION","isDecorativeImage":false,"accessibleLabel":"Specific areas of real estate law that we help with","ariaAttributes":{},"interactions":[],"behaviors":{"appear":{"otherLayer":{"sessionID":-1,"localID":-1},"trigger":"THIS_LAYER_IN_VIEW","direction":"UP","enterTransition":{"easingType":"OUT_CUBIC","easingFunction":[0.215000003576279,0.610000014305115,0.354999989271164,1.0],"transitionDuration":0.800000011920929,"delay":0.0},"enterState":{"transform":{"m00":1.0,"m01":0.0,"m02":0.0,"m10":0.0,"m11":1.0,"m12":0.0},"opacity":0.0},"exitTransition":{"easingType":"OUT_CUBIC","easingFunction":[0.215000003576279,0.610000014305115,0.354999989271164,1.0],"transitionDuration":0.600000023841858,"delay":0.0},"exitState":{"transform":{"m00":1.0,"m01":0.0,"m02":0.0,"m10":0.0,"m11":1.0,"m12":0.0},"opacity":1.0},"playsOnce":false,"behaviorType":"appear"}},"paddingTop":20.0,"paddingBottom":20.0,"layoutMode":"HORIZONTAL","itemSpacing":266.0,"counterAxisSizingMode":"FIXED","children":["8:2143","8:2144"]},"2224:2986":{"type":"FRAME","id":"2224:2986","name":"Footer header","absoluteBoundingBox":{"x":-2147.0,"y":3421.0,"width":311.0,"height":42.0},"isolatedAbsoluteRenderBounds":{"x":-2147.0,"y":3421.0,"width":311.0,"height":42.0},"relativeTransform":[[1.0,0.0,32.0],[0.0,1.0,87.0]],"size":{"x":311.0,"y":42.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":1.0,"g":1.0,"b":1.0,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"INSIDE","layoutAlign":"STRETCH","strokes":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"layoutMode":"VERTICAL","itemSpacing":24.0,"primaryAxisAlignItems":"CENTER","primaryAxisSizingMode":"FIXED","counterAxisSizingMode":"FIXED","children":["2224:2987","2224:2988"]},"2608:2992":{"type":"TEXT","id":"2608:2992","name":"데스크탑_네비","absoluteBoundingBox":{"x":0.0,"y":0.0,"width":32.0,"height":29.0},"isolatedAbsoluteRenderBounds":{"x":0.0,"y":6.31199884414673,"width":31.3216896057129,"height":23.6160011291504},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,0.0]],"size":{"x":32.0,"y":29.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":0.0,"g":0.0,"b":0.0,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"INSIDE","strokes":[],"strokeWeight":0.0,"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"characterStyleOverrides":[],"characters":"Ag","lineIndentations":[0],"lineTypes":["NONE"],"listStartOffsets":[],"lineStyleOverrides":[0],"lineTextDirections":null,"resolvedParagraphValues":{"0":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":0.0}},"textAutoResize":"WIDTH_AND_HEIGHT","style":{"fontFamily":"Noto Sans KR","fontPostScriptName":"NotoSansKR-Medium","fontStyle":"Medium","textAutoResize":"WIDTH_AND_HEIGHT","responsiveTextStyleVariants":[{"minWidth":1280.0,"name":"데스크톱","style":{"fontSize":24.0,"letterSpacing":2.88,"letterSpacingValue":12.0,"letterSpacingUnit":"PERCENT","lineHeightPx":28.125,"lineHeightPercent":100.0,"lineHeightUnit":"INTRINSIC_%"}}],"fontVariantPosition":"NORMAL","fontSize":24.0,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","letterSpacing":2.88,"letterSpacingValue":12.0,"letterSpacingUnit":"PERCENT","lineHeightPx":28.8000011444092,"lineHeightPercent":100.0,"lineHeightUnit":"INTRINSIC_%","paragraphSpacing":0,"paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecoration":"NONE","textDecorationSkipInk":false,"textDecorationStyle":"solid","textTruncation":"DISABLED","lineHeightPercentFontSize":100},"styleOverrideTable":{}},"2281:542":{"type":"TEXT","id":"2281:542","name":"Rich text/Header 1","absoluteBoundingBox":{"x":0.0,"y":0.0,"width":86.0,"height":70.0},"isolatedAbsoluteRenderBounds":{"x":1.52272737026215,"y":11.4545440673828,"width":79.7863693237305,"height":60.363639831543},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,0.0]],"size":{"x":86.0,"y":70.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":0.0,"g":0.0,"b":0.0,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"INSIDE","strokes":[],"strokeWeight":0.0,"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"characterStyleOverrides":[],"characters":"Ag","lineIndentations":[0],"lineTypes":["NONE"],"listStartOffsets":[],"lineStyleOverrides":[0],"lineTextDirections":null,"resolvedParagraphValues":{"0":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":0.0}},"textAutoResize":"WIDTH_AND_HEIGHT","style":{"fontFamily":"Inter","fontPostScriptName":null,"fontStyle":"Bold","textAutoResize":"WIDTH_AND_HEIGHT","fontVariantPosition":"NORMAL","fontSize":64.0,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","letterSpacing":-1.6,"letterSpacingValue":-2.5,"letterSpacingUnit":"PERCENT","lineHeightPx":70.4000015258789,"lineHeightPercent":90.8920211791992,"lineHeightPercentFontSize":110.0,"lineHeightUnit":"FONT_SIZE_%","paragraphSpacing":0,"paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecoration":"NONE","textDecorationSkipInk":false,"textDecorationStyle":"solid","textTruncation":"DISABLED"},"styleOverrideTable":{}},"2224:2882":{"type":"RECTANGLE","id":"2224:2882","name":"brainable_logo_ver.001-03 1","absoluteBoundingBox":{"x":-1915.0,"y":3891.5,"width":142.800003051758,"height":119.0},"targetAspectRatio":{"x":142.800003051758,"y":119.0},"isolatedAbsoluteRenderBounds":{"x":-1915.0,"y":3891.5,"width":142.800048828125,"height":119.0},"relativeTransform":[[1.0,0.0,135.0],[0.0,1.0,3.5]],"size":{"x":142.800003051758,"y":119.0},"fills":[{"blendMode":"NORMAL","type":"IMAGE","scaleMode":"FILL","imageRef":"64270238d3de4edd07597c9179b36856b5a53af3","originalImageWidth":1400,"originalImageHeight":1167,"visible":true,"opacity":1.0,"rotation":0.0}],"strokeAlign":"INSIDE","strokes":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[]},"2224:2881":{"type":"RECTANGLE","id":"2224:2881","name":"brainable_logo_ver.001-01 1","absoluteBoundingBox":{"x":-2050.0,"y":3902.5,"width":117.0,"height":97.0},"targetAspectRatio":{"x":1400.0,"y":1167.0},"isolatedAbsoluteRenderBounds":{"x":-2050.0,"y":3902.5,"width":117.0,"height":97.0},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,14.5]],"size":{"x":117.0,"y":97.0},"fills":[{"blendMode":"NORMAL","type":"IMAGE","scaleMode":"FILL","imageRef":"4f89b370cf29c22c8bfd83ffd6ad48b1dd2cd6af","originalImageWidth":1400,"originalImageHeight":1167,"visible":true,"opacity":1.0,"rotation":0.0}],"strokeAlign":"INSIDE","strokes":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[]},"6:1466":{"type":"TEXT","id":"6:1466","name":"Display/Hero DIsplay","absoluteBoundingBox":{"x":0.0,"y":0.0,"width":146.0,"height":114.0},"isolatedAbsoluteRenderBounds":{"x":2.40000009536743,"y":14.7999954223633,"width":133.72688293457,"height":104.640007019043},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,0.0]],"size":{"x":146.0,"y":114.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":0.0,"g":0.0,"b":0.0,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"INSIDE","strokes":[],"strokeWeight":0.0,"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"characterStyleOverrides":[],"characters":"Ag","lineIndentations":[0],"lineTypes":["NONE"],"listStartOffsets":[],"lineStyleOverrides":[0],"lineTextDirections":null,"resolvedParagraphValues":{"0":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":0.0}},"textAutoResize":"WIDTH_AND_HEIGHT","style":{"fontFamily":"Geist","fontPostScriptName":"Geist-Regular","fontStyle":"Regular","textAutoResize":"WIDTH_AND_HEIGHT","responsiveTextStyleVariants":[{"minWidth":1280.0,"name":"Desktop","style":{"fontSize":120.0,"letterSpacing":-3.6,"letterSpacingValue":-3.0,"letterSpacingUnit":"PERCENT","lineHeightPx":114.0,"lineHeightPercent":81.0666656494141,"lineHeightPercentFontSize":95.0,"lineHeightUnit":"FONT_SIZE_%"}},{"minWidth":800.0,"name":"Tablet","style":{"fontSize":72.0,"letterSpacing":-2.16,"letterSpacingValue":-3.0,"letterSpacingUnit":"PERCENT","lineHeightPx":68.4000015258789,"lineHeightPercent":81.0666656494141,"lineHeightPercentFontSize":95.0,"lineHeightUnit":"FONT_SIZE_%"}},{"minWidth":0.0,"name":"Mobile","style":{"fontSize":36.0,"letterSpacing":-1.08,"letterSpacingValue":-3.0,"letterSpacingUnit":"PERCENT","lineHeightPx":34.2000007629395,"lineHeightPercent":81.0666656494141,"lineHeightPercentFontSize":95.0,"lineHeightUnit":"FONT_SIZE_%"}}],"fontVariantPosition":"NORMAL","fontSize":120.0,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","letterSpacing":-3.6,"letterSpacingValue":-3.0,"letterSpacingUnit":"PERCENT","lineHeightPx":114.0,"lineHeightPercent":73.0769271850586,"lineHeightPercentFontSize":95.0,"lineHeightUnit":"FONT_SIZE_%","paragraphSpacing":0,"paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecoration":"NONE","textDecorationSkipInk":false,"textDecorationStyle":"solid","textTruncation":"DISABLED"},"styleOverrideTable":{}},"2224:2923":{"type":"FRAME","id":"2224:2923","name":"Contact column 4","absoluteBoundingBox":{"x":-325.0,"y":3229.0,"width":255.0,"height":20.0},"isolatedAbsoluteRenderBounds":{"x":-325.0,"y":3229.0,"width":255.0,"height":20.0},"relativeTransform":[[1.0,0.0,607.0],[0.0,1.0,0.0]],"size":{"x":255.0,"y":20.0},"fills":[],"strokeAlign":"INSIDE","strokes":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"layoutMode":"VERTICAL","itemSpacing":2.0,"primaryAxisAlignItems":"CENTER","children":[]},"2224:2943":{"type":"TEXT","id":"2224:2943","name":"서울특별시 서초구 마방로 6길 28, 5층 502호","absoluteBoundingBox":{"x":-792.5,"y":3090.0,"width":255.0,"height":66.0},"isolatedAbsoluteRenderBounds":{"x":-792.052001953125,"y":3093.80004882812,"width":220.162780761719,"height":36.384033203125},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,0.0]],"size":{"x":255.0,"y":66.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":0.0,"g":0.0,"b":0.0,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"OUTSIDE","strokes":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"behaviors":{"hover":{"transition":{"easingType":"OUT_CUBIC","easingFunction":[0.215000003576279,0.610000014305115,0.354999989271164,1.0],"transitionDuration":0.300000011920929,"delay":0.0},"state":{"transform":{"m00":1.0,"m01":0.0,"m02":0.0,"m10":0.0,"m11":1.0,"m12":0.0},"opacity":0.699999988079071},"behaviorType":"hover"}},"characterStyleOverrides":[],"characters":"서울특별시 서초구 마방로 6길 28, \n5층 502호\n","lineIndentations":[0,0,0],"lineTypes":["NONE","NONE","NONE"],"listStartOffsets":[],"lineStyleOverrides":[0,0,0],"lineTextDirections":null,"resolvedParagraphValues":{"0":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":0.0},"1":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":0.0},"2":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":0.0}},"textAutoResize":"HEIGHT","style":{"fontFamily":"Noto Sans KR","fontPostScriptName":"NotoSansKR-DemiLight","fontStyle":"DemiLight","textAutoResize":"HEIGHT","fontVariantPosition":"NORMAL","fontSize":16.0,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","letterSpacing":0.0,"letterSpacingValue":0.0,"letterSpacingUnit":"PERCENT","lineHeightPx":22.3999996185303,"lineHeightPercent":116.666664123535,"lineHeightPercentFontSize":140.0,"lineHeightUnit":"FONT_SIZE_%","paragraphSpacing":0,"paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecoration":"NONE","textDecorationSkipInk":false,"textDecorationStyle":"solid","textTruncation":"DISABLED"},"styleOverrideTable":{}},"32:1153":{"type":"TEXT","id":"32:1153","name":"Link","absoluteBoundingBox":{"x":0.0,"y":0.0,"width":16.0,"height":12.0},"isolatedAbsoluteRenderBounds":{"x":0.260000020265579,"y":1.76999950408936,"width":14.4870777130127,"height":11.3360004425049},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,0.0]],"size":{"x":16.0,"y":12.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":0.0,"g":0.0,"b":0.0,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"INSIDE","strokes":[],"strokeWeight":0.0,"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"characterStyleOverrides":[],"characters":"Ag","lineIndentations":[0],"lineTypes":["NONE"],"listStartOffsets":[],"lineStyleOverrides":[0],"lineTextDirections":null,"resolvedParagraphValues":{"0":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":0.0}},"textAutoResize":"WIDTH_AND_HEIGHT","style":{"fontFamily":"Geist","fontPostScriptName":"Geist-Regular","fontStyle":"Regular","textAutoResize":"WIDTH_AND_HEIGHT","responsiveTextStyleVariants":[{"minWidth":1280.0,"name":"Desktop","style":{"fontSize":13.0,"letterSpacing":-0.39,"letterSpacingValue":-3.0,"letterSpacingUnit":"PERCENT","lineHeightPx":12.3499994277954,"lineHeightPercent":81.0666656494141,"lineHeightPercentFontSize":95.0,"lineHeightUnit":"FONT_SIZE_%"}},{"minWidth":800.0,"name":"Tablet","style":{"fontSize":13.0,"letterSpacing":-0.39,"letterSpacingValue":-3.0,"letterSpacingUnit":"PERCENT","lineHeightPx":12.3499994277954,"lineHeightPercent":81.0666656494141,"lineHeightPercentFontSize":95.0,"lineHeightUnit":"FONT_SIZE_%"}},{"minWidth":0.0,"name":"Mobile","style":{"fontSize":13.0,"letterSpacing":-0.39,"letterSpacingValue":-3.0,"letterSpacingUnit":"PERCENT","lineHeightPx":12.3499994277954,"lineHeightPercent":81.0666656494141,"lineHeightPercentFontSize":95.0,"lineHeightUnit":"FONT_SIZE_%"}}],"fontVariantPosition":"NORMAL","fontSize":13.0,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","letterSpacing":-0.39,"letterSpacingValue":-3.0,"letterSpacingUnit":"PERCENT","lineHeightPx":12.3499994277954,"lineHeightPercent":73.0769271850586,"lineHeightPercentFontSize":95.0,"lineHeightUnit":"FONT_SIZE_%","paragraphSpacing":0,"paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecoration":"NONE","textDecorationSkipInk":false,"textDecorationStyle":"solid","textTruncation":"DISABLED"},"styleOverrideTable":{}},"4:743":{"type":"TEXT","id":"4:743","name":"Header/Header 1","absoluteBoundingBox":{"x":0.0,"y":0.0,"width":40.0,"height":48.0},"isolatedAbsoluteRenderBounds":{"x":0.0,"y":13.4159984588623,"width":39.2022514343262,"height":31.488000869751},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,0.0]],"size":{"x":40.0,"y":48.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":0.0,"g":0.0,"b":0.0,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"INSIDE","strokes":[],"strokeWeight":0.0,"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"characterStyleOverrides":[],"characters":"Ag","lineIndentations":[0],"lineTypes":["NONE"],"listStartOffsets":[],"lineStyleOverrides":[0],"lineTextDirections":null,"resolvedParagraphValues":{"0":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":0.0}},"textAutoResize":"WIDTH_AND_HEIGHT","style":{"fontFamily":"Noto Sans KR","fontPostScriptName":"NotoSansKR-Medium","fontStyle":"Medium","textAutoResize":"WIDTH_AND_HEIGHT","responsiveTextStyleVariants":[{"minWidth":1200.0,"name":"Desktop","style":{"fontSize":32.0,"letterSpacing":-1.6,"letterSpacingValue":-5.0,"letterSpacingUnit":"PERCENT","lineHeightPx":34.8800010681152,"lineHeightPercent":93.0133361816406,"lineHeightPercentFontSize":109.0,"lineHeightUnit":"FONT_SIZE_%"}},{"minWidth":800.0,"name":"Tablet","style":{"fontSize":32.0,"letterSpacing":-1.6,"letterSpacingValue":-5.0,"letterSpacingUnit":"PERCENT","lineHeightPx":34.8800010681152,"lineHeightPercent":93.0133361816406,"lineHeightPercentFontSize":109.0,"lineHeightUnit":"FONT_SIZE_%"}},{"minWidth":1.0,"name":"Mobile","style":{"fontSize":22.0,"letterSpacing":-1.1,"letterSpacingValue":-5.0,"letterSpacingUnit":"PERCENT","lineHeightPx":23.980001449585,"lineHeightPercent":93.0133361816406,"lineHeightPercentFontSize":109.0,"lineHeightUnit":"FONT_SIZE_%"}}],"fontVariantPosition":"NORMAL","fontSize":32.0,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","letterSpacing":1.28,"letterSpacingValue":4.0,"letterSpacingUnit":"PERCENT","lineHeightPx":48.0,"lineHeightPercent":124.999992370605,"lineHeightPercentFontSize":150.0,"lineHeightUnit":"FONT_SIZE_%","paragraphSpacing":0,"paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecoration":"NONE","textDecorationSkipInk":false,"textDecorationStyle":"solid","textTruncation":"DISABLED"},"styleOverrideTable":{}},"8:2117":{"type":"FRAME","id":"8:2117","name":"Service 4","absoluteBoundingBox":{"x":-2068.5,"y":2515.5,"width":980.0,"height":160.0},"isolatedAbsoluteRenderBounds":{"x":-2068.5,"y":2515.5,"width":980.0,"height":160.0},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,612.0]],"size":{"x":980.0,"y":160.0},"fills":[],"visible":false,"strokeAlign":"INSIDE","layoutAlign":"STRETCH","strokes":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":1.0,"g":1.0,"b":1.0,"a":1.0},"visible":true,"opacity":1.0}],"individualStrokeWeights":{"top":0.5,"right":0.0,"bottom":0.0,"left":0.0},"accessibleHTMLTag":"SECTION","isDecorativeImage":false,"accessibleLabel":"Specific areas of criminal defense that we help with","ariaAttributes":{},"interactions":[],"behaviors":{"appear":{"otherLayer":{"sessionID":-1,"localID":-1},"trigger":"THIS_LAYER_IN_VIEW","direction":"UP","enterTransition":{"easingType":"OUT_CUBIC","easingFunction":[0.215000003576279,0.610000014305115,0.354999989271164,1.0],"transitionDuration":0.800000011920929,"delay":0.0},"enterState":{"transform":{"m00":1.0,"m01":0.0,"m02":0.0,"m10":0.0,"m11":1.0,"m12":0.0},"opacity":0.0},"exitTransition":{"easingType":"OUT_CUBIC","easingFunction":[0.215000003576279,0.610000014305115,0.354999989271164,1.0],"transitionDuration":0.600000023841858,"delay":0.0},"exitState":{"transform":{"m00":1.0,"m01":0.0,"m02":0.0,"m10":0.0,"m11":1.0,"m12":0.0},"opacity":1.0},"playsOnce":false,"behaviorType":"appear"}},"paddingTop":20.0,"paddingBottom":20.0,"layoutMode":"HORIZONTAL","itemSpacing":266.0,"primaryAxisAlignItems":"SPACE_BETWEEN","primaryAxisSizingMode":"FIXED","children":["8:2118","8:2119"]},"2817:1153":{"type":"TEXT","id":"2817:1153","name":"Button","absoluteBoundingBox":{"x":0.0,"y":0.0,"width":23.0,"height":22.0},"isolatedAbsoluteRenderBounds":{"x":0.0,"y":0.0,"width":23.0,"height":22.0},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,0.0]],"size":{"x":23.0,"y":22.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":0.0,"g":0.0,"b":0.0,"a":1.0},"visible":true,"opacity":1.0}],"visible":false,"strokeAlign":"INSIDE","strokes":[],"strokeWeight":0.0,"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"characterStyleOverrides":[],"characters":"Ag","lineIndentations":[0],"lineTypes":["NONE"],"listStartOffsets":[],"lineStyleOverrides":[0],"lineTextDirections":null,"resolvedParagraphValues":{"0":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":0.0}},"textAutoResize":"WIDTH_AND_HEIGHT","style":{"fontFamily":"Geist","fontPostScriptName":"Geist-Regular","fontStyle":"Regular","textAutoResize":"WIDTH_AND_HEIGHT","responsiveTextStyleVariants":[{"minWidth":1280.0,"name":"Desktop","style":{"fontSize":18.0,"letterSpacing":-0.36,"letterSpacingValue":-2.0,"letterSpacingUnit":"PERCENT","lineHeightPx":21.6000003814697,"lineHeightPercent":102.400009155273,"lineHeightPercentFontSize":120.000007629395,"lineHeightUnit":"FONT_SIZE_%"}},{"minWidth":800.0,"name":"Tablet","style":{"fontSize":18.0,"letterSpacing":-0.36,"letterSpacingValue":-2.0,"letterSpacingUnit":"PERCENT","lineHeightPx":21.6000003814697,"lineHeightPercent":102.400009155273,"lineHeightPercentFontSize":120.000007629395,"lineHeightUnit":"FONT_SIZE_%"}},{"minWidth":0.0,"name":"Mobile","style":{"fontSize":18.0,"letterSpacing":-0.36,"letterSpacingValue":-2.0,"letterSpacingUnit":"PERCENT","lineHeightPx":21.6000003814697,"lineHeightPercent":102.400009155273,"lineHeightPercentFontSize":120.000007629395,"lineHeightUnit":"FONT_SIZE_%"}}],"fontVariantPosition":"NORMAL","fontSize":18.0,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","letterSpacing":-0.36,"letterSpacingValue":-2.0,"letterSpacingUnit":"PERCENT","lineHeightPx":21.6000003814697,"lineHeightPercent":92.3077011108398,"lineHeightPercentFontSize":120.000007629395,"lineHeightUnit":"FONT_SIZE_%","paragraphSpacing":0,"paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecoration":"NONE","textDecorationSkipInk":false,"textDecorationStyle":"solid","textTruncation":"DISABLED"},"styleOverrideTable":{}},"4:982":{"type":"TEXT","id":"4:982","name":"Button","absoluteBoundingBox":{"x":0.0,"y":0.0,"width":23.0,"height":22.0},"isolatedAbsoluteRenderBounds":{"x":0.360000014305115,"y":4.21999931335449,"width":20.2390308380127,"height":15.6960010528564},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,0.0]],"size":{"x":23.0,"y":22.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":0.0,"g":0.0,"b":0.0,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"INSIDE","strokes":[],"strokeWeight":0.0,"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"characterStyleOverrides":[],"characters":"Ag","lineIndentations":[0],"lineTypes":["NONE"],"listStartOffsets":[],"lineStyleOverrides":[0],"lineTextDirections":null,"resolvedParagraphValues":{"0":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":0.0}},"textAutoResize":"WIDTH_AND_HEIGHT","style":{"fontFamily":"Geist","fontPostScriptName":"Geist-Regular","fontStyle":"Regular","textAutoResize":"WIDTH_AND_HEIGHT","responsiveTextStyleVariants":[{"minWidth":1280.0,"name":"Desktop","style":{"fontSize":18.0,"letterSpacing":-0.36,"letterSpacingValue":-2.0,"letterSpacingUnit":"PERCENT","lineHeightPx":21.6000003814697,"lineHeightPercent":102.400009155273,"lineHeightPercentFontSize":120.000007629395,"lineHeightUnit":"FONT_SIZE_%"}},{"minWidth":800.0,"name":"Tablet","style":{"fontSize":18.0,"letterSpacing":-0.36,"letterSpacingValue":-2.0,"letterSpacingUnit":"PERCENT","lineHeightPx":21.6000003814697,"lineHeightPercent":102.400009155273,"lineHeightPercentFontSize":120.000007629395,"lineHeightUnit":"FONT_SIZE_%"}},{"minWidth":0.0,"name":"Mobile","style":{"fontSize":18.0,"letterSpacing":-0.36,"letterSpacingValue":-2.0,"letterSpacingUnit":"PERCENT","lineHeightPx":21.6000003814697,"lineHeightPercent":102.400009155273,"lineHeightPercentFontSize":120.000007629395,"lineHeightUnit":"FONT_SIZE_%"}}],"fontVariantPosition":"NORMAL","fontSize":18.0,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","letterSpacing":-0.36,"letterSpacingValue":-2.0,"letterSpacingUnit":"PERCENT","lineHeightPx":21.6000003814697,"lineHeightPercent":92.3077011108398,"lineHeightPercentFontSize":120.000007629395,"lineHeightUnit":"FONT_SIZE_%","paragraphSpacing":0,"paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecoration":"NONE","textDecorationSkipInk":false,"textDecorationStyle":"solid","textTruncation":"DISABLED"},"styleOverrideTable":{}},"2715:1276":{"type":"TEXT","id":"2715:1276","name":"제품소개","absoluteBoundingBox":{"x":-2027.0,"y":90.0,"width":71.0,"height":23.0},"isolatedAbsoluteRenderBounds":{"x":-2026.69750976562,"y":94.6879959106445,"width":70.396240234375,"height":16.5120010375977},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,110.0]],"size":{"x":71.0,"y":23.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":0.443900465965271,"g":0.442026853561401,"b":0.442026853561401,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"OUTSIDE","strokes":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"characterStyleOverrides":[],"characters":"제품소개","lineIndentations":[0],"lineTypes":["NONE"],"listStartOffsets":[],"lineStyleOverrides":[0],"lineTextDirections":null,"resolvedParagraphValues":{"0":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":16.0}},"textAutoResize":"WIDTH_AND_HEIGHT","textAlignHorizontal":"CENTER","textAlignVertical":"CENTER","paragraphSpacing":16.0,"style":{"styleIdForText":"StyleId:2608:2916","fontFamily":"Noto Sans KR","fontPostScriptName":"NotoSansKR-Medium","fontStyle":"Medium","hyperlink":{"type":"NODE","nodeID":"/laserable"},"paragraphSpacing":16.0,"textAutoResize":"WIDTH_AND_HEIGHT","fontVariantPosition":"NORMAL","textDecoration":"UNDERLINE","textDecorationSkipInk":true,"fontSize":16.0,"textAlignHorizontal":"CENTER","textAlignVertical":"CENTER","letterSpacing":3.84,"letterSpacingValue":24.0,"letterSpacingUnit":"PERCENT","lineHeightPx":23.2000007629395,"lineHeightPercent":120.83332824707,"lineHeightPercentFontSize":145.0,"lineHeightUnit":"FONT_SIZE_%","paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecorationStyle":"solid","textTruncation":"DISABLED"},"styleOverrideTable":{}},"2579:6693":{"type":"TEXT","id":"2579:6693","name":"Text","absoluteBoundingBox":{"x":0.0,"y":0.0,"width":13.0,"height":12.0},"isolatedAbsoluteRenderBounds":{"x":-0.0800000056624413,"y":2.54999923706055,"width":12.6715631484985,"height":9.84000110626221},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,0.0]],"size":{"x":13.0,"y":12.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":0.0,"g":0.0,"b":0.0,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"INSIDE","strokes":[],"strokeWeight":0.0,"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"characterStyleOverrides":[],"characters":"Ag","lineIndentations":[0],"lineTypes":["NONE"],"listStartOffsets":[],"lineStyleOverrides":[0],"lineTextDirections":null,"resolvedParagraphValues":{"0":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":0.0}},"textAutoResize":"WIDTH_AND_HEIGHT","style":{"fontFamily":"Noto Sans KR","fontPostScriptName":"NotoSansKR-Black","fontStyle":"Black","textAutoResize":"WIDTH_AND_HEIGHT","fontVariantPosition":"NORMAL","fontSize":10.0,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","letterSpacing":0.0,"letterSpacingValue":0.0,"letterSpacingUnit":"PERCENT","lineHeightPx":12.0,"lineHeightPercent":100.0,"lineHeightUnit":"INTRINSIC_%","paragraphSpacing":0,"paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecoration":"NONE","textDecorationSkipInk":false,"textDecorationStyle":"solid","textTruncation":"DISABLED","lineHeightPercentFontSize":100},"styleOverrideTable":{}},"2224:2992":{"type":"FRAME","id":"2224:2992","name":"Contact column 1","absoluteBoundingBox":{"x":-2147.0,"y":3591.0,"width":148.0,"height":46.0},"isolatedAbsoluteRenderBounds":{"x":-2147.0,"y":3591.0,"width":148.0,"height":46.0},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,0.0]],"size":{"x":148.0,"y":46.0},"fills":[],"strokeAlign":"INSIDE","strokes":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"layoutMode":"VERTICAL","itemSpacing":2.0,"primaryAxisAlignItems":"CENTER","primaryAxisSizingMode":"FIXED","counterAxisSizingMode":"FIXED","children":["2224:2993","2224:2994"]},"2224:2885":{"type":"FRAME","id":"2224:2885","name":"Footer contact information","absoluteBoundingBox":{"x":-2036.0,"y":4275.0,"width":994.0,"height":67.0},"isolatedAbsoluteRenderBounds":{"x":-2036.0,"y":4275.0,"width":994.0,"height":67.0},"relativeTransform":[[1.0,0.0,143.0],[0.0,1.0,467.0]],"size":{"x":994.0,"y":67.0},"fills":[],"strokeAlign":"INSIDE","strokes":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"paddingBottom":1.0,"layoutMode":"HORIZONTAL","primaryAxisSizingMode":"FIXED","children":["2224:2886","2224:2889","2224:2891"]},"2281:546":{"type":"TEXT","id":"2281:546","name":"Rich text/Header 5","absoluteBoundingBox":{"x":0.0,"y":0.0,"width":27.0,"height":28.0},"isolatedAbsoluteRenderBounds":{"x":0.490056842565536,"y":6.45454502105713,"width":24.2366466522217,"height":18.8636360168457},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,0.0]],"size":{"x":27.0,"y":28.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":0.0,"g":0.0,"b":0.0,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"INSIDE","strokes":[],"strokeWeight":0.0,"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"characterStyleOverrides":[],"characters":"Ag","lineIndentations":[0],"lineTypes":["NONE"],"listStartOffsets":[],"lineStyleOverrides":[0],"lineTextDirections":null,"resolvedParagraphValues":{"0":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":0.0}},"textAutoResize":"WIDTH_AND_HEIGHT","style":{"fontFamily":"Inter","fontPostScriptName":null,"fontStyle":"Semi Bold","textAutoResize":"WIDTH_AND_HEIGHT","fontVariantPosition":"NORMAL","fontSize":20.0,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","letterSpacing":-0.6,"letterSpacingValue":-3.0,"letterSpacingUnit":"PERCENT","lineHeightPx":28.0,"lineHeightPercent":115.680755615234,"lineHeightPercentFontSize":140.0,"lineHeightUnit":"FONT_SIZE_%","paragraphSpacing":0,"paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecoration":"NONE","textDecorationSkipInk":false,"textDecorationStyle":"solid","textTruncation":"DISABLED"},"styleOverrideTable":{}},"2:720":{"type":"TEXT","id":"2:720","name":"Display/디스플레이 1","absoluteBoundingBox":{"x":0.0,"y":0.0,"width":81.0,"height":66.0},"isolatedAbsoluteRenderBounds":{"x":-0.240000009536743,"y":12.5399971008301,"width":79.5374984741211,"height":59.0400047302246},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,0.0]],"size":{"x":81.0,"y":66.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":0.0,"g":0.0,"b":0.0,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"INSIDE","strokes":[],"strokeWeight":0.0,"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"characterStyleOverrides":[],"characters":"Ag","lineIndentations":[0],"lineTypes":["NONE"],"listStartOffsets":[],"lineStyleOverrides":[0],"lineTextDirections":null,"resolvedParagraphValues":{"0":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":0.0}},"textAutoResize":"WIDTH_AND_HEIGHT","style":{"fontFamily":"Noto Sans KR","fontPostScriptName":"NotoSansKR-Bold","fontStyle":"Bold","textAutoResize":"WIDTH_AND_HEIGHT","responsiveTextStyleVariants":[{"minWidth":1280.0,"name":"Desktop","style":{"fontSize":300.0,"letterSpacing":30.0,"letterSpacingValue":10.0,"letterSpacingUnit":"PERCENT","lineHeightPx":330.0,"lineHeightPercent":93.8666687011719,"lineHeightPercentFontSize":110.0,"lineHeightUnit":"FONT_SIZE_%"}},{"minWidth":800.0,"name":"Tablet","style":{"fontSize":200.0,"letterSpacing":20.0,"letterSpacingValue":10.0,"letterSpacingUnit":"PERCENT","lineHeightPx":220.0,"lineHeightPercent":93.8666687011719,"lineHeightPercentFontSize":110.0,"lineHeightUnit":"FONT_SIZE_%"}},{"minWidth":1.0,"name":"Mobile","style":{"fontSize":100.0,"letterSpacing":10.0,"letterSpacingValue":10.0,"letterSpacingUnit":"PERCENT","lineHeightPx":110.0,"lineHeightPercent":93.8666687011719,"lineHeightPercentFontSize":110.0,"lineHeightUnit":"FONT_SIZE_%"}}],"fontVariantPosition":"NORMAL","fontSize":60.0,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","letterSpacing":6.0,"letterSpacingValue":10.0,"letterSpacingUnit":"PERCENT","lineHeightPx":66.0,"lineHeightPercent":91.6666641235352,"lineHeightPercentFontSize":110.0,"lineHeightUnit":"FONT_SIZE_%","paragraphSpacing":0,"paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecoration":"NONE","textDecorationSkipInk":false,"textDecorationStyle":"solid","textTruncation":"DISABLED"},"styleOverrideTable":{}},"2715:1065":{"type":"TEXT","id":"2715:1065","name":"제품소개","absoluteBoundingBox":{"x":-389.0,"y":-109.0,"width":59.0,"height":23.0},"isolatedAbsoluteRenderBounds":{"x":-388.817504882812,"y":-105.312004089355,"width":58.6362609863281,"height":16.5120010375977},"relativeTransform":[[1.0,0.0,171.0],[0.0,1.0,0.0]],"size":{"x":59.0,"y":23.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":0.443900465965271,"g":0.442026853561401,"b":0.442026853561401,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"OUTSIDE","strokes":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"characterStyleOverrides":[],"characters":"제품소개","lineIndentations":[0],"lineTypes":["NONE"],"listStartOffsets":[],"lineStyleOverrides":[0],"lineTextDirections":null,"resolvedParagraphValues":{"0":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":16.0}},"textAutoResize":"WIDTH_AND_HEIGHT","textAlignHorizontal":"CENTER","textAlignVertical":"CENTER","paragraphSpacing":16.0,"fallbackFonts":[{"fontFamily":"Noto Sans KR","fontStyle":"Medium"}],"style":{"fontFamily":"Inter","fontPostScriptName":"Inter-Medium","fontStyle":"Medium","fallbackFonts":[{"fontFamily":"Noto Sans KR","fontStyle":"Medium"}],"hyperlink":{"type":"NODE","nodeID":"/laserable"},"paragraphSpacing":16.0,"textAutoResize":"WIDTH_AND_HEIGHT","fontVariantPosition":"NORMAL","textDecoration":"UNDERLINE","textDecorationSkipInk":true,"fontSize":16.0,"textAlignHorizontal":"CENTER","textAlignVertical":"CENTER","letterSpacing":-0.08,"letterSpacingValue":-0.5,"letterSpacingUnit":"PERCENT","lineHeightPx":23.2000007629395,"lineHeightPercent":119.812210083008,"lineHeightPercentFontSize":145.0,"lineHeightUnit":"FONT_SIZE_%","paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecorationStyle":"solid","textTruncation":"DISABLED"},"styleOverrideTable":{}},"2577:745":{"type":"TEXT","id":"2577:745","name":"Text sm / Medium","absoluteBoundingBox":{"x":0.0,"y":0.0,"width":54.0,"height":20.0},"isolatedAbsoluteRenderBounds":{"x":0.0,"y":0.0,"width":54.0,"height":20.0},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,0.0]],"size":{"x":54.0,"y":20.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":0.0,"g":0.0,"b":0.0,"a":1.0},"visible":true,"opacity":1.0}],"visible":false,"strokeAlign":"INSIDE","strokes":[],"strokeWeight":0.0,"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"characterStyleOverrides":[],"characters":"Rag 123","lineIndentations":[0],"lineTypes":["NONE"],"listStartOffsets":[],"lineStyleOverrides":[0],"lineTextDirections":null,"resolvedParagraphValues":{"0":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":14.0}},"textAutoResize":"WIDTH_AND_HEIGHT","paragraphSpacing":14.0,"style":{"fontFamily":"Inter","fontPostScriptName":"Inter-Medium","fontStyle":"Medium","paragraphSpacing":14.0,"textAutoResize":"WIDTH_AND_HEIGHT","fontVariantPosition":"NORMAL","fontSize":14.0,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","letterSpacing":0.0,"letterSpacingValue":0.0,"letterSpacingUnit":"PERCENT","lineHeightPx":20.0,"lineHeightPercent":118.04158782959,"lineHeightPercentFontSize":142.857147216797,"lineHeightUnit":"PIXELS","paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecoration":"NONE","textDecorationSkipInk":false,"textDecorationStyle":"solid","textTruncation":"DISABLED"},"styleOverrideTable":{}},"4:748":{"key":"7aa8e3397bdf15c0f346f2cbc2db3f1f00b8f278","name":"Paragraph/Paragraph 1","styleType":"TEXT","remote":false,"description":"","id":"4:748","assetId":"StyleId:4:748","type":"STYLE","style":{"fontFamily":"Geist","fontPostScriptName":"Geist-Regular","fontStyle":"Regular","textAutoResize":"WIDTH_AND_HEIGHT","responsiveTextStyleVariants":[{"minWidth":1280.0,"name":"Desktop","style":{"fontSize":32.0,"letterSpacing":-1.6,"letterSpacingValue":-5.0,"letterSpacingUnit":"PERCENT","lineHeightPx":34.8800010681152,"lineHeightPercent":93.0133361816406,"lineHeightPercentFontSize":109.0,"lineHeightUnit":"FONT_SIZE_%"}},{"minWidth":800.0,"name":"Tablet","style":{"fontSize":32.0,"letterSpacing":-1.6,"letterSpacingValue":-5.0,"letterSpacingUnit":"PERCENT","lineHeightPx":34.8800010681152,"lineHeightPercent":93.0133361816406,"lineHeightPercentFontSize":109.0,"lineHeightUnit":"FONT_SIZE_%"}},{"minWidth":1.0,"name":"Mobile","style":{"fontSize":22.0,"letterSpacing":-1.1,"letterSpacingValue":-5.0,"letterSpacingUnit":"PERCENT","lineHeightPx":23.980001449585,"lineHeightPercent":93.0133361816406,"lineHeightPercentFontSize":109.0,"lineHeightUnit":"FONT_SIZE_%"}}],"fontSize":32.0,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","letterSpacing":-1.6,"letterSpacingValue":-5.0,"letterSpacingUnit":"PERCENT","lineHeightPx":34.8800010681152,"lineHeightPercent":83.8461532592773,"lineHeightPercentFontSize":109.0,"lineHeightUnit":"FONT_SIZE_%"},"responsiveTextStyleVariants":[{"minWidth":1280.0,"name":"Desktop","style":{"fontSize":32.0,"letterSpacing":-1.6,"letterSpacingValue":-5.0,"letterSpacingUnit":"PERCENT","lineHeightPx":34.8800010681152,"lineHeightPercent":93.0133361816406,"lineHeightPercentFontSize":109.0,"lineHeightUnit":"FONT_SIZE_%"}},{"minWidth":800.0,"name":"Tablet","style":{"fontSize":32.0,"letterSpacing":-1.6,"letterSpacingValue":-5.0,"letterSpacingUnit":"PERCENT","lineHeightPx":34.8800010681152,"lineHeightPercent":93.0133361816406,"lineHeightPercentFontSize":109.0,"lineHeightUnit":"FONT_SIZE_%"}},{"minWidth":1.0,"name":"Mobile","style":{"fontSize":22.0,"letterSpacing":-1.1,"letterSpacingValue":-5.0,"letterSpacingUnit":"PERCENT","lineHeightPx":23.980001449585,"lineHeightPercent":93.0133361816406,"lineHeightPercentFontSize":109.0,"lineHeightUnit":"FONT_SIZE_%"}}]},"161:105":{"type":"FRAME","id":"161:105","name":"Main","absoluteBoundingBox":{"x":-2179.0,"y":849.0,"width":1280.0,"height":3891.0},"isolatedAbsoluteRenderBounds":{"x":-2183.0,"y":849.0,"width":1288.0,"height":3891.0},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,1008.0]],"size":{"x":1280.0,"y":3891.0},"fills":[],"strokeAlign":"INSIDE","layoutAlign":"STRETCH","strokes":[],"accessibleHTMLTag":"MAIN","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"layoutMode":"VERTICAL","counterAxisSizingMode":"FIXED","children":["8:1964","8:2104","119:264","2224:2879"]},"2475:6406":{"type":"TEXT","id":"2475:6406","name":"Text","absoluteBoundingBox":{"x":0.0,"y":0.0,"width":14.0,"height":12.0},"isolatedAbsoluteRenderBounds":{"x":0.237926155328751,"y":2.72727251052856,"width":12.7166194915771,"height":9.43181800842285},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,0.0]],"size":{"x":14.0,"y":12.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":0.0,"g":0.0,"b":0.0,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"INSIDE","strokes":[],"strokeWeight":0.0,"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"characterStyleOverrides":[],"characters":"Ag","lineIndentations":[0],"lineTypes":["NONE"],"listStartOffsets":[],"lineStyleOverrides":[0],"lineTextDirections":null,"resolvedParagraphValues":{"0":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":0.0}},"textAutoResize":"WIDTH_AND_HEIGHT","style":{"fontFamily":"Inter","fontPostScriptName":"Inter-Bold","fontStyle":"Bold","textAutoResize":"WIDTH_AND_HEIGHT","fontVariantPosition":"NORMAL","fontSize":10.0,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","letterSpacing":0.0,"letterSpacingValue":0.0,"letterSpacingUnit":"PERCENT","lineHeightPx":12.1022720336914,"lineHeightPercent":100.0,"lineHeightUnit":"INTRINSIC_%","paragraphSpacing":0,"paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecoration":"NONE","textDecorationSkipInk":false,"textDecorationStyle":"solid","textTruncation":"DISABLED","lineHeightPercentFontSize":100},"styleOverrideTable":{}},"8:1942":{"type":"TEXT","id":"8:1942","name":"20년 이상의 지속적인 연구개발","absoluteBoundingBox":{"x":-675.0,"y":859.0,"width":183.0,"height":46.0},"isolatedAbsoluteRenderBounds":{"x":-674.392028808594,"y":863.68798828125,"width":133.025024414062,"height":37.6400146484375},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,136.0]],"size":{"x":183.0,"y":46.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":1.0,"g":1.0,"b":1.0,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"OUTSIDE","layoutAlign":"STRETCH","strokes":[],"strokeWeight":3.21430063247681,"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"characterStyleOverrides":[],"characters":"20년 이상의 \n지속적인 연구개발","lineIndentations":[0,0],"lineTypes":["NONE","NONE"],"listStartOffsets":[],"lineStyleOverrides":[0,0],"lineTextDirections":null,"resolvedParagraphValues":{"0":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":0.0},"1":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":0.0}},"textAutoResize":"HEIGHT","textAlignVertical":"CENTER","style":{"fontFamily":"Noto Sans KR","fontPostScriptName":"NotoSansKR-Medium","fontStyle":"Medium","textAutoResize":"HEIGHT","fontVariantPosition":"NORMAL","fontSize":16.0,"textAlignHorizontal":"LEFT","textAlignVertical":"CENTER","letterSpacing":1.6,"letterSpacingValue":10.0,"letterSpacingUnit":"PERCENT","lineHeightPx":22.8799991607666,"lineHeightPercent":119.166664123535,"lineHeightPercentFontSize":143.0,"lineHeightUnit":"FONT_SIZE_%","paragraphSpacing":0,"paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecoration":"NONE","textDecorationSkipInk":false,"textDecorationStyle":"solid","textTruncation":"DISABLED"},"styleOverrideTable":{}},"8:2127":{"type":"FRAME","id":"8:2127","name":"Our services content","absoluteBoundingBox":{"x":-771.0,"y":1271.0,"width":672.0,"height":864.0},"isolatedAbsoluteRenderBounds":{"x":-771.0,"y":1271.0,"width":1112.0,"height":864.0},"relativeTransform":[[1.0,0.0,64.0],[0.0,1.0,147.0]],"size":{"x":672.0,"y":864.0},"fills":[],"strokeAlign":"INSIDE","layoutGrow":1.0,"maxWidth":1180.0,"strokes":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":1.0,"g":1.0,"b":1.0,"a":1.0},"visible":true,"opacity":1.0}],"individualStrokeWeights":{"top":0.0,"right":0.0,"bottom":0.5,"left":0.0},"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"paddingBottom":20.0,"layoutMode":"VERTICAL","itemSpacing":80.0,"counterAxisSizingMode":"FIXED","children":["91:301","8:2128","8:2129"]},"8:2169":{"type":"TEXT","id":"8:2169","name":"Visa applications Green cards and citizenship Deportation defense Employment-based immigration","absoluteBoundingBox":{"x":-255.0,"y":2263.0,"width":420.0,"height":96.0},"isolatedAbsoluteRenderBounds":{"x":-254.639999389648,"y":2268.20190429688,"width":251.148941040039,"height":87.714111328125},"relativeTransform":[[1.0,0.0,560.0],[0.0,1.0,20.0]],"size":{"x":420.0,"y":96.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":1.0,"g":1.0,"b":1.0,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"OUTSIDE","strokes":[],"strokeWeight":3.21430063247681,"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"characterStyleOverrides":[],"characters":"Visa applications\nGreen cards and citizenship\nDeportation defense\nEmployment-based immigration","lineIndentations":[0,0,0,0],"lineTypes":["NONE","NONE","NONE","NONE"],"listStartOffsets":[],"lineStyleOverrides":[0,0,0,0],"lineTextDirections":null,"resolvedParagraphValues":{"0":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":0.0},"1":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":0.0},"2":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":0.0},"3":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":0.0}},"textAutoResize":"HEIGHT","style":{"styleIdForText":"StyleId:6:1353","fontFamily":"Geist","fontPostScriptName":"Geist-Regular","fontStyle":"Regular","textAutoResize":"HEIGHT","responsiveTextStyleVariants":[{"minWidth":1280.0,"name":"Desktop","style":{"styleIdForText":"StyleId:6:1353","fontSize":18.0,"letterSpacing":-0.36,"letterSpacingValue":-2.0,"letterSpacingUnit":"PERCENT","lineHeightPx":24.3000011444092,"lineHeightPercent":115.199996948242,"lineHeightPercentFontSize":135.0,"lineHeightUnit":"FONT_SIZE_%"}}],"fontVariantPosition":"NORMAL","fontSize":18.0,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","letterSpacing":-0.36,"letterSpacingValue":-2.0,"letterSpacingUnit":"PERCENT","lineHeightPx":24.3000011444092,"lineHeightPercent":103.846160888672,"lineHeightPercentFontSize":135.0,"lineHeightUnit":"FONT_SIZE_%","paragraphSpacing":0,"paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecoration":"NONE","textDecorationSkipInk":false,"textDecorationStyle":"solid","textTruncation":"DISABLED"},"styleOverrideTable":{}},"2224:2912":{"type":"FRAME","id":"2224:2912","name":"Footer header","absoluteBoundingBox":{"x":-946.0,"y":2842.0,"width":1022.0,"height":126.0},"isolatedAbsoluteRenderBounds":{"x":-946.0,"y":2842.0,"width":1022.0,"height":126.0},"relativeTransform":[[1.0,0.0,-111.0],[0.0,1.0,80.0]],"size":{"x":1022.0,"y":126.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":1.0,"g":1.0,"b":1.0,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"INSIDE","strokes":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"layoutMode":"HORIZONTAL","itemSpacing":18.0,"counterAxisAlignItems":"CENTER","primaryAxisSizingMode":"FIXED","counterAxisSizingMode":"FIXED","children":["2224:2913","2224:2914"]},"2:721":{"key":"bf9b9a8259b7d40fe493a630c402da8dcdadf7b4","name":"Display/디스플레이 2","styleType":"TEXT","remote":false,"description":"","id":"2:721","assetId":"StyleId:2:721","type":"STYLE","style":{"fontFamily":"Noto Sans KR","fontPostScriptName":"NotoSansKR-Medium","fontStyle":"Medium","textAutoResize":"WIDTH_AND_HEIGHT","responsiveTextStyleVariants":[{"minWidth":1280.0,"name":"Desktop","style":{"fontSize":120.0,"letterSpacing":-3.6,"letterSpacingValue":-3.0,"letterSpacingUnit":"PERCENT","lineHeightPx":114.0,"lineHeightPercent":81.0666656494141,"lineHeightPercentFontSize":95.0,"lineHeightUnit":"FONT_SIZE_%"}},{"minWidth":800.0,"name":"Tablet","style":{"fontSize":84.0,"letterSpacing":-2.52,"letterSpacingValue":-3.0,"letterSpacingUnit":"PERCENT","lineHeightPx":79.7999954223633,"lineHeightPercent":81.0666656494141,"lineHeightPercentFontSize":95.0,"lineHeightUnit":"FONT_SIZE_%"}},{"minWidth":1.0,"name":"Mobile","style":{"fontSize":84.0,"letterSpacing":-2.52,"letterSpacingValue":-3.0,"letterSpacingUnit":"PERCENT","lineHeightPx":79.7999954223633,"lineHeightPercent":81.0666656494141,"lineHeightPercentFontSize":95.0,"lineHeightUnit":"FONT_SIZE_%"}}],"fontSize":33.0,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","letterSpacing":3.3,"letterSpacingValue":10.0,"letterSpacingUnit":"PERCENT","lineHeightPx":36.2999992370605,"lineHeightPercent":91.6666641235352,"lineHeightPercentFontSize":110.0,"lineHeightUnit":"FONT_SIZE_%"},"responsiveTextStyleVariants":[{"minWidth":1280.0,"name":"Desktop","style":{"fontSize":120.0,"letterSpacing":-3.6,"letterSpacingValue":-3.0,"letterSpacingUnit":"PERCENT","lineHeightPx":114.0,"lineHeightPercent":81.0666656494141,"lineHeightPercentFontSize":95.0,"lineHeightUnit":"FONT_SIZE_%"}},{"minWidth":800.0,"name":"Tablet","style":{"fontSize":84.0,"letterSpacing":-2.52,"letterSpacingValue":-3.0,"letterSpacingUnit":"PERCENT","lineHeightPx":79.7999954223633,"lineHeightPercent":81.0666656494141,"lineHeightPercentFontSize":95.0,"lineHeightUnit":"FONT_SIZE_%"}},{"minWidth":1.0,"name":"Mobile","style":{"fontSize":84.0,"letterSpacing":-2.52,"letterSpacingValue":-3.0,"letterSpacingUnit":"PERCENT","lineHeightPx":79.7999954223633,"lineHeightPercent":81.0666656494141,"lineHeightPercentFontSize":95.0,"lineHeightUnit":"FONT_SIZE_%"}}]},"2224:2916":{"type":"TEXT","id":"2224:2916","name":"Pioneer of the Wellness-tech Solution.","absoluteBoundingBox":{"x":-932.0,"y":3089.0,"width":994.0,"height":19.0},"isolatedAbsoluteRenderBounds":{"x":-930.572021484375,"y":3092.67407226562,"width":501.282806396484,"height":11.5078125},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,16.0]],"size":{"x":994.0,"y":19.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":0.0,"g":0.0,"b":0.0,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"OUTSIDE","layoutGrow":1.0,"strokes":[],"strokeWeight":3.21430063247681,"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"characterStyleOverrides":[],"characters":"Pioneer of the Wellness-tech Solution.","lineIndentations":[0],"lineTypes":["NONE"],"listStartOffsets":[],"lineStyleOverrides":[0],"lineTextDirections":null,"resolvedParagraphValues":{"0":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":0.0}},"textAutoResize":"HEIGHT","style":{"fontFamily":"Noto Sans KR","fontPostScriptName":"NotoSansKR-DemiLight","fontStyle":"DemiLight","textAutoResize":"HEIGHT","fontVariantPosition":"NORMAL","fontSize":14.0,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","letterSpacing":7.0,"letterSpacingValue":50.0,"letterSpacingUnit":"PERCENT","lineHeightPx":18.8999996185303,"lineHeightPercent":112.499992370605,"lineHeightPercentFontSize":135.0,"lineHeightUnit":"FONT_SIZE_%","paragraphSpacing":0,"paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecoration":"NONE","textDecorationSkipInk":false,"textDecorationStyle":"solid","textTruncation":"DISABLED"},"styleOverrideTable":{}},"8:2159":{"type":"TEXT","id":"8:2159","name":"지속적인 확장","absoluteBoundingBox":{"x":-815.0,"y":2196.0,"width":67.0,"height":14.0},"isolatedAbsoluteRenderBounds":{"x":-814.653503417969,"y":2198.12744140625,"width":65.9943237304688,"height":9.80712890625},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,38.0]],"size":{"x":67.0,"y":14.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":1.0,"g":1.0,"b":1.0,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"OUTSIDE","strokes":[],"strokeWeight":3.21430063247681,"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"characterStyleOverrides":[],"characters":"지속적인 확장","lineIndentations":[0],"lineTypes":["NONE"],"listStartOffsets":[],"lineStyleOverrides":[0],"lineTextDirections":null,"resolvedParagraphValues":{"0":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":0.0}},"textAutoResize":"WIDTH_AND_HEIGHT","style":{"fontFamily":"Noto Sans KR","fontPostScriptName":"NotoSansKR-Bold","fontStyle":"Bold","textAutoResize":"WIDTH_AND_HEIGHT","fontVariantPosition":"NORMAL","fontSize":10.5,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","letterSpacing":1.05,"letterSpacingValue":10.0,"letterSpacingUnit":"PERCENT","lineHeightPx":14.1750001907349,"lineHeightPercent":112.499992370605,"lineHeightPercentFontSize":135.0,"lineHeightUnit":"FONT_SIZE_%","paragraphSpacing":0,"paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecoration":"NONE","textDecorationSkipInk":false,"textDecorationStyle":"solid","textTruncation":"DISABLED"},"styleOverrideTable":{}},"2817:1136":{"type":"TEXT","id":"2817:1136","name":"Paragraph/Paragraph 2","absoluteBoundingBox":{"x":0.0,"y":0.0,"width":23.0,"height":24.0},"isolatedAbsoluteRenderBounds":{"x":0.0,"y":0.0,"width":23.0,"height":24.0},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,0.0]],"size":{"x":23.0,"y":24.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":0.0,"g":0.0,"b":0.0,"a":1.0},"visible":true,"opacity":1.0}],"visible":false,"strokeAlign":"INSIDE","strokes":[],"strokeWeight":0.0,"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"characterStyleOverrides":[],"characters":"Ag","lineIndentations":[0],"lineTypes":["NONE"],"listStartOffsets":[],"lineStyleOverrides":[0],"lineTextDirections":null,"resolvedParagraphValues":{"0":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":0.0}},"textAutoResize":"WIDTH_AND_HEIGHT","style":{"fontFamily":"Geist","fontPostScriptName":"Geist-Regular","fontStyle":"Regular","textAutoResize":"WIDTH_AND_HEIGHT","responsiveTextStyleVariants":[{"minWidth":1280.0,"name":"Desktop","style":{"fontSize":18.0,"letterSpacing":-0.36,"letterSpacingValue":-2.0,"letterSpacingUnit":"PERCENT","lineHeightPx":24.3000011444092,"lineHeightPercent":115.199996948242,"lineHeightPercentFontSize":135.0,"lineHeightUnit":"FONT_SIZE_%"}}],"fontVariantPosition":"NORMAL","fontSize":18.0,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","letterSpacing":-0.36,"letterSpacingValue":-2.0,"letterSpacingUnit":"PERCENT","lineHeightPx":24.3000011444092,"lineHeightPercent":103.846160888672,"lineHeightPercentFontSize":135.0,"lineHeightUnit":"FONT_SIZE_%","paragraphSpacing":0,"paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecoration":"NONE","textDecorationSkipInk":false,"textDecorationStyle":"solid","textTruncation":"DISABLED"},"styleOverrideTable":{}},"2108:1138":{"type":"TEXT","id":"2108:1138","name":"VISION","absoluteBoundingBox":{"x":-2040.0,"y":186.0,"width":1378.0,"height":123.0},"isolatedAbsoluteRenderBounds":{"x":-2040.30004882812,"y":226.759994506836,"width":230.091186523438,"height":46.0800018310547},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,0.0]],"size":{"x":1378.0,"y":123.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":1.0,"g":1.0,"b":1.0,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"OUTSIDE","strokes":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"behaviors":{"appear":{"otherLayer":{"sessionID":-1,"localID":-1},"trigger":"PAGE_LOAD","direction":"UP","enterTransition":{"easingType":"OUT_CUBIC","easingFunction":[0.215000003576279,0.610000014305115,0.354999989271164,1.0],"transitionDuration":0.600000023841858,"delay":0.0},"enterState":{"transform":{"m00":1.0,"m01":0.0,"m02":0.0,"m10":0.0,"m11":1.0,"m12":0.0},"opacity":0.0},"exitTransition":{"easingType":"OUT_CUBIC","easingFunction":[0.215000003576279,0.610000014305115,0.354999989271164,1.0],"transitionDuration":0.600000023841858,"delay":0.0},"exitState":{"transform":{"m00":1.0,"m01":0.0,"m02":0.0,"m10":0.0,"m11":1.0,"m12":0.0},"opacity":1.0},"playsOnce":false,"behaviorType":"appear"}},"characterStyleOverrides":[],"characters":"VISION","lineIndentations":[0],"lineTypes":["NONE"],"listStartOffsets":[],"lineStyleOverrides":[0],"lineTextDirections":null,"resolvedParagraphValues":{"0":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":0.0}},"textAlignVertical":"CENTER","style":{"fontFamily":"Noto Sans KR","fontPostScriptName":"NotoSansKR-Bold","fontStyle":"Bold","fontVariantPosition":"NORMAL","fontSize":60.0,"textAlignHorizontal":"LEFT","textAlignVertical":"CENTER","letterSpacing":6.0,"letterSpacingValue":10.0,"letterSpacingUnit":"PERCENT","lineHeightPx":57.0,"lineHeightPercent":79.1666641235352,"lineHeightPercentFontSize":95.0,"lineHeightUnit":"FONT_SIZE_%","paragraphSpacing":0,"paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecoration":"NONE","textDecorationSkipInk":false,"textDecorationStyle":"solid","textAutoResize":"NONE","textTruncation":"DISABLED"},"styleOverrideTable":{}},"2224:3007":{"type":"FRAME","id":"2224:3007","name":"Contact column 1","absoluteBoundingBox":{"x":-803.0,"y":3591.0,"width":148.0,"height":46.0},"isolatedAbsoluteRenderBounds":{"x":-803.0,"y":3591.0,"width":148.0,"height":46.0},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,0.0]],"size":{"x":148.0,"y":46.0},"fills":[],"strokeAlign":"INSIDE","strokes":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"layoutMode":"VERTICAL","itemSpacing":2.0,"primaryAxisAlignItems":"CENTER","primaryAxisSizingMode":"FIXED","counterAxisSizingMode":"FIXED","children":["2224:3008","2224:3009"]},"2224:2935":{"type":"RECTANGLE","id":"2224:2935","name":"brainable_logo_ver.001-03 1","absoluteBoundingBox":{"x":-1023.5,"y":2706.5,"width":142.800003051758,"height":119.0},"targetAspectRatio":{"x":142.800003051758,"y":119.0},"isolatedAbsoluteRenderBounds":{"x":-1023.5,"y":2706.5,"width":142.799987792969,"height":119.0},"relativeTransform":[[1.0,0.0,135.0],[0.0,1.0,3.5]],"size":{"x":142.800003051758,"y":119.0},"fills":[{"blendMode":"NORMAL","type":"IMAGE","scaleMode":"FILL","imageRef":"64270238d3de4edd07597c9179b36856b5a53af3","originalImageWidth":1400,"originalImageHeight":1167,"visible":true,"opacity":1.0,"rotation":0.0}],"strokeAlign":"INSIDE","strokes":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[]},"2224:3013":{"type":"FRAME","id":"2224:3013","name":"Footer copyright","absoluteBoundingBox":{"x":-803.0,"y":3694.0,"width":197.0,"height":26.0},"isolatedAbsoluteRenderBounds":{"x":-803.0,"y":3694.0,"width":197.0,"height":26.0},"relativeTransform":[[1.0,0.0,32.0],[0.0,1.0,360.0]],"size":{"x":197.0,"y":26.0},"fills":[],"strokeAlign":"INSIDE","strokes":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"layoutMode":"HORIZONTAL","itemSpacing":10.0,"counterAxisAlignItems":"CENTER","children":["2224:3014"]},"2715:1274":{"type":"TEXT","id":"2715:1274","name":"회사소개","absoluteBoundingBox":{"x":-2021.0,"y":-20.0,"width":59.0,"height":23.0},"isolatedAbsoluteRenderBounds":{"x":-2020.65844726562,"y":-14.0000009536743,"width":58.3231201171875,"height":15.2000017166138},"relativeTransform":[[1.0,0.0,6.0],[0.0,1.0,0.0]],"size":{"x":59.0,"y":23.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":0.443900465965271,"g":0.442026853561401,"b":0.442026853561401,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"OUTSIDE","strokes":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"characterStyleOverrides":[],"characters":"HOME","lineIndentations":[0],"lineTypes":["NONE"],"listStartOffsets":[],"lineStyleOverrides":[0],"lineTextDirections":null,"resolvedParagraphValues":{"0":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":16.0}},"textAutoResize":"WIDTH_AND_HEIGHT","textAlignHorizontal":"CENTER","textAlignVertical":"CENTER","paragraphSpacing":16.0,"style":{"styleIdForText":"StyleId:2608:2916","fontFamily":"Noto Sans KR","fontPostScriptName":"NotoSansKR-Medium","fontStyle":"Medium","hyperlink":{"type":"NODE","nodeID":"/"},"paragraphSpacing":16.0,"textAutoResize":"WIDTH_AND_HEIGHT","fontVariantPosition":"NORMAL","textDecoration":"UNDERLINE","textDecorationSkipInk":true,"fontSize":16.0,"textAlignHorizontal":"CENTER","textAlignVertical":"CENTER","letterSpacing":3.84,"letterSpacingValue":24.0,"letterSpacingUnit":"PERCENT","lineHeightPx":23.2000007629395,"lineHeightPercent":120.83332824707,"lineHeightPercentFontSize":145.0,"lineHeightUnit":"FONT_SIZE_%","paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecorationStyle":"solid","textTruncation":"DISABLED"},"styleOverrideTable":{}},"2577:671":{"type":"TEXT","id":"2577:671","name":"Text md / Semibold","absoluteBoundingBox":{"x":0.0,"y":0.0,"width":62.0,"height":24.0},"isolatedAbsoluteRenderBounds":{"x":0.0,"y":0.0,"width":62.0,"height":24.0},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,0.0]],"size":{"x":62.0,"y":24.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":0.0,"g":0.0,"b":0.0,"a":1.0},"visible":true,"opacity":1.0}],"visible":false,"strokeAlign":"INSIDE","strokes":[],"strokeWeight":0.0,"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"characterStyleOverrides":[],"characters":"Rag 123","lineIndentations":[0],"lineTypes":["NONE"],"listStartOffsets":[],"lineStyleOverrides":[0],"lineTextDirections":null,"resolvedParagraphValues":{"0":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":16.0}},"textAutoResize":"WIDTH_AND_HEIGHT","paragraphSpacing":16.0,"style":{"fontFamily":"Inter","fontPostScriptName":null,"fontStyle":"Semi Bold","paragraphSpacing":16.0,"textAutoResize":"WIDTH_AND_HEIGHT","fontVariantPosition":"NORMAL","fontSize":16.0,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","letterSpacing":0.0,"letterSpacingValue":0.0,"letterSpacingUnit":"PERCENT","lineHeightPx":24.0,"lineHeightPercent":123.943664550781,"lineHeightPercentFontSize":150.0,"lineHeightUnit":"PIXELS","paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecoration":"NONE","textDecorationSkipInk":false,"textDecorationStyle":"solid","textTruncation":"DISABLED"},"styleOverrideTable":{}},"8:1932":{"type":"TEXT","id":"8:1932","name":"20년 이상의 지속적인 연구개발","absoluteBoundingBox":{"x":-2018.5,"y":1256.0,"width":183.0,"height":46.0},"isolatedAbsoluteRenderBounds":{"x":-1993.39990234375,"y":1260.68798828125,"width":132.961059570312,"height":37.6400146484375},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,283.0]],"size":{"x":183.0,"y":46.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":1.0,"g":1.0,"b":1.0,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"OUTSIDE","layoutAlign":"STRETCH","strokes":[],"strokeWeight":3.21430063247681,"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"characterStyleOverrides":[],"characters":"20년 이상의 \n지속적인 연구개발","lineIndentations":[0,0],"lineTypes":["NONE","NONE"],"listStartOffsets":[],"lineStyleOverrides":[0,0],"lineTextDirections":null,"resolvedParagraphValues":{"0":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":0.0},"1":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":0.0}},"textAutoResize":"HEIGHT","textAlignHorizontal":"CENTER","textAlignVertical":"CENTER","style":{"fontFamily":"Noto Sans KR","fontPostScriptName":"NotoSansKR-Medium","fontStyle":"Medium","textAutoResize":"HEIGHT","fontVariantPosition":"NORMAL","fontSize":16.0,"textAlignHorizontal":"CENTER","textAlignVertical":"CENTER","letterSpacing":1.6,"letterSpacingValue":10.0,"letterSpacingUnit":"PERCENT","lineHeightPx":22.8799991607666,"lineHeightPercent":119.166664123535,"lineHeightPercentFontSize":143.0,"lineHeightUnit":"FONT_SIZE_%","paragraphSpacing":0,"paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecoration":"NONE","textDecorationSkipInk":false,"textDecorationStyle":"solid","textTruncation":"DISABLED"},"styleOverrideTable":{}},"8:2138":{"type":"TEXT","id":"8:2138","name":"현재 구파발, 광주, 청주, 창원 등 여러 지역에 센터가 운영되고 있습니다. 브레인에이블의 네트워크는 더 가까이 더 나은 삶의 공유를 위해 빠르게 확장중입니다.","absoluteBoundingBox":{"x":-378.0,"y":2023.0,"width":420.0,"height":108.0},"isolatedAbsoluteRenderBounds":{"x":-377.082000732422,"y":2029.0419921875,"width":412.007202148438,"height":97.380126953125},"relativeTransform":[[1.0,0.0,393.0],[0.0,1.0,20.0]],"size":{"x":420.0,"y":108.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":1.0,"g":1.0,"b":1.0,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"OUTSIDE","strokes":[],"strokeWeight":3.21430063247681,"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"characterStyleOverrides":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1],"characters":"현재 구파발, 광주, 청주, 창원 등 여러 지역에 센터가 운영되고 있습니다. 브레인에이블의 네트워크는 더 가까이 더 나은 삶의 공유를 위해 빠르게 확장중입니다.","lineIndentations":[0],"lineTypes":["NONE"],"listStartOffsets":[],"lineStyleOverrides":[0],"lineTextDirections":null,"resolvedParagraphValues":{"0":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":0.0}},"textAutoResize":"HEIGHT","style":{"fontFamily":"Noto Sans KR","fontPostScriptName":"NotoSansKR-Regular","fontStyle":"Regular","textAutoResize":"HEIGHT","fontVariantPosition":"NORMAL","fontSize":18.0,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","letterSpacing":1.8,"letterSpacingValue":10.0,"letterSpacingUnit":"PERCENT","lineHeightPx":27.0,"lineHeightPercent":124.999992370605,"lineHeightPercentFontSize":150.0,"lineHeightUnit":"FONT_SIZE_%","paragraphSpacing":0,"paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecoration":"NONE","textDecorationSkipInk":false,"textDecorationStyle":"solid","textTruncation":"DISABLED"},"styleOverrideTable":{"1":{"letterSpacing":0.9,"letterSpacingValue":5.0,"letterSpacingUnit":"PERCENT","paragraphSpacing":0,"paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecoration":"NONE","textDecorationSkipInk":false,"textDecorationStyle":"solid","textAutoResize":"NONE","textTruncation":"DISABLED","lineHeightPercent":100,"lineHeightPercentFontSize":100}}},"2608:2836":{"type":"TEXT","id":"2608:2836","name":"Text","absoluteBoundingBox":{"x":0.0,"y":0.0,"width":12.0,"height":12.0},"isolatedAbsoluteRenderBounds":{"x":0.0400000028312206,"y":2.66999959945679,"width":11.543984413147,"height":9.82999992370605},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,0.0]],"size":{"x":12.0,"y":12.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":0.0,"g":0.0,"b":0.0,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"INSIDE","strokes":[],"strokeWeight":0.0,"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"characterStyleOverrides":[],"characters":"Ag","lineIndentations":[0],"lineTypes":["NONE"],"listStartOffsets":[],"lineStyleOverrides":[0],"lineTextDirections":null,"resolvedParagraphValues":{"0":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":0.0}},"textAutoResize":"WIDTH_AND_HEIGHT","style":{"fontFamily":"Noto Sans KR","fontPostScriptName":"NotoSansKR-Regular","fontStyle":"Regular","textAutoResize":"WIDTH_AND_HEIGHT","fontVariantPosition":"NORMAL","fontSize":10.0,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","letterSpacing":0.0,"letterSpacingValue":0.0,"letterSpacingUnit":"PERCENT","lineHeightPx":12.0,"lineHeightPercent":100.0,"lineHeightUnit":"INTRINSIC_%","paragraphSpacing":0,"paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecoration":"NONE","textDecorationSkipInk":false,"textDecorationStyle":"solid","textTruncation":"DISABLED","lineHeightPercentFontSize":100},"styleOverrideTable":{}},"2224:2957":{"type":"GROUP","id":"2224:2957","name":"Footer subhead","absoluteBoundingBox":{"x":-803.0,"y":3048.0,"width":311.0,"height":14.0},"isolatedAbsoluteRenderBounds":{"x":-803.0,"y":3048.0,"width":311.0,"height":14.0},"relativeTransform":[[1.0,0.0,32.0],[0.0,1.0,186.0]],"size":{"x":311.0,"y":14.0},"fills":[],"strokeAlign":"INSIDE","layoutAlign":"STRETCH","strokes":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"children":["2224:2958"]},"2577:739":{"type":"TEXT","id":"2577:739","name":"Text lg / Semibold","absoluteBoundingBox":{"x":0.0,"y":0.0,"width":70.0,"height":28.0},"isolatedAbsoluteRenderBounds":{"x":0.0,"y":0.0,"width":70.0,"height":28.0},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,0.0]],"size":{"x":70.0,"y":28.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":0.0,"g":0.0,"b":0.0,"a":1.0},"visible":true,"opacity":1.0}],"visible":false,"strokeAlign":"INSIDE","strokes":[],"strokeWeight":0.0,"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"characterStyleOverrides":[],"characters":"Rag 123","lineIndentations":[0],"lineTypes":["NONE"],"listStartOffsets":[],"lineStyleOverrides":[0],"lineTextDirections":null,"resolvedParagraphValues":{"0":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":18.0}},"textAutoResize":"WIDTH_AND_HEIGHT","paragraphSpacing":18.0,"style":{"fontFamily":"Inter","fontPostScriptName":null,"fontStyle":"Semi Bold","paragraphSpacing":18.0,"textAutoResize":"WIDTH_AND_HEIGHT","fontVariantPosition":"NORMAL","fontSize":18.0,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","letterSpacing":0.0,"letterSpacingValue":0.0,"letterSpacingUnit":"PERCENT","lineHeightPx":28.0,"lineHeightPercent":128.5341796875,"lineHeightPercentFontSize":155.555557250977,"lineHeightUnit":"PIXELS","paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecoration":"NONE","textDecorationSkipInk":false,"textDecorationStyle":"solid","textTruncation":"DISABLED"},"styleOverrideTable":{}},"2608:2916":{"key":"9a61926ed9d973c2d9365bbe0a9dc3fb9ac3b365","name":"모바일_네비게이터","styleType":"TEXT","remote":false,"description":"세련\n","id":"2608:2916","assetId":"StyleId:2608:2916","type":"STYLE","style":{"fontFamily":"Noto Sans KR","fontPostScriptName":"NotoSansKR-Medium","fontStyle":"Medium","paragraphSpacing":16.0,"textAutoResize":"WIDTH_AND_HEIGHT","textDecoration":"UNDERLINE","fontSize":16.0,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","letterSpacing":3.84,"letterSpacingValue":24.0,"letterSpacingUnit":"PERCENT","lineHeightPx":23.2000007629395,"lineHeightPercent":120.83332824707,"lineHeightPercentFontSize":145.0,"lineHeightUnit":"FONT_SIZE_%"}},"2608:2832":{"type":"TEXT","id":"2608:2832","name":"Text","absoluteBoundingBox":{"x":0.0,"y":0.0,"width":12.0,"height":12.0},"isolatedAbsoluteRenderBounds":{"x":0.0500000044703484,"y":2.67999935150146,"width":11.4056253433228,"height":9.83000087738037},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,0.0]],"size":{"x":12.0,"y":12.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":0.0,"g":0.0,"b":0.0,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"INSIDE","strokes":[],"strokeWeight":0.0,"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"characterStyleOverrides":[],"characters":"Ag","lineIndentations":[0],"lineTypes":["NONE"],"listStartOffsets":[],"lineStyleOverrides":[0],"lineTextDirections":null,"resolvedParagraphValues":{"0":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":0.0}},"textAutoResize":"WIDTH_AND_HEIGHT","style":{"fontFamily":"Noto Sans KR","fontPostScriptName":"NotoSansKR-DemiLight","fontStyle":"DemiLight","textAutoResize":"WIDTH_AND_HEIGHT","fontVariantPosition":"NORMAL","fontSize":10.0,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","letterSpacing":0.0,"letterSpacingValue":0.0,"letterSpacingUnit":"PERCENT","lineHeightPx":12.0,"lineHeightPercent":100.0,"lineHeightUnit":"INTRINSIC_%","paragraphSpacing":0,"paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecoration":"NONE","textDecorationSkipInk":false,"textDecorationStyle":"solid","textTruncation":"DISABLED","lineHeightPercentFontSize":100},"styleOverrideTable":{}},"2224:2963":{"type":"FRAME","id":"2224:2963","name":"Contact column 2","absoluteBoundingBox":{"x":-655.0,"y":3119.0,"width":155.0,"height":77.0},"isolatedAbsoluteRenderBounds":{"x":-655.0,"y":3119.0,"width":155.0,"height":77.0},"relativeTransform":[[1.0,0.0,148.0],[0.0,1.0,0.0]],"size":{"x":155.0,"y":77.0},"fills":[],"strokeAlign":"INSIDE","strokes":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"layoutMode":"VERTICAL","itemSpacing":2.0,"primaryAxisAlignItems":"CENTER","primaryAxisSizingMode":"FIXED","counterAxisSizingMode":"FIXED","children":["2224:2964"]},"8:1937":{"type":"TEXT","id":"8:1937","name":"50 +","absoluteBoundingBox":{"x":-1250.5,"y":973.0,"width":247.0,"height":228.0},"isolatedAbsoluteRenderBounds":{"x":-1190.3974609375,"y":988.0,"width":124.357421875,"height":190.43994140625},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,0.0]],"size":{"x":247.0,"y":228.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":1.0,"g":1.0,"b":1.0,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"OUTSIDE","layoutAlign":"STRETCH","strokes":[],"strokeWeight":3.21430063247681,"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"characterStyleOverrides":[],"characters":"50\n+","lineIndentations":[0,0],"lineTypes":["NONE","NONE"],"listStartOffsets":[],"lineStyleOverrides":[0,0],"lineTextDirections":null,"resolvedParagraphValues":{"0":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":0.0},"1":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":0.0}},"textAutoResize":"HEIGHT","textAlignHorizontal":"CENTER","style":{"styleIdForText":"StyleId:2:721","fontFamily":"Noto Sans KR","fontPostScriptName":"NotoSansKR-Medium","fontStyle":"Medium","textAutoResize":"HEIGHT","responsiveTextStyleVariants":[{"minWidth":1280.0,"name":"Desktop","style":{"styleIdForText":"StyleId:2:721","fontSize":120.0,"letterSpacing":-3.6,"letterSpacingValue":-3.0,"letterSpacingUnit":"PERCENT","lineHeightPx":114.0,"lineHeightPercent":81.0666656494141,"lineHeightPercentFontSize":95.0,"lineHeightUnit":"FONT_SIZE_%"}},{"minWidth":800.0,"name":"Tablet","style":{"styleIdForText":"StyleId:2:721","fontSize":84.0,"letterSpacing":-2.52,"letterSpacingValue":-3.0,"letterSpacingUnit":"PERCENT","lineHeightPx":79.7999954223633,"lineHeightPercent":81.0666656494141,"lineHeightPercentFontSize":95.0,"lineHeightUnit":"FONT_SIZE_%"}},{"minWidth":1.0,"name":"Mobile","style":{"styleIdForText":"StyleId:2:721","fontSize":84.0,"letterSpacing":-2.52,"letterSpacingValue":-3.0,"letterSpacingUnit":"PERCENT","lineHeightPx":79.7999954223633,"lineHeightPercent":81.0666656494141,"lineHeightPercentFontSize":95.0,"lineHeightUnit":"FONT_SIZE_%"}}],"fontVariantPosition":"NORMAL","fontSize":120.0,"textAlignHorizontal":"CENTER","textAlignVertical":"TOP","letterSpacing":-3.6,"letterSpacingValue":-3.0,"letterSpacingUnit":"PERCENT","lineHeightPx":114.0,"lineHeightPercent":79.1666641235352,"lineHeightPercentFontSize":95.0,"lineHeightUnit":"FONT_SIZE_%","paragraphSpacing":0,"paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecoration":"NONE","textDecorationSkipInk":false,"textDecorationStyle":"solid","textTruncation":"DISABLED"},"styleOverrideTable":{}}},"assetIdToGuid":{"StyleId:6:1356":"6:1356","StyleId:4:749":"4:749","StyleId:6:1353":"6:1353","StyleId:4:748":"4:748","StyleId:2:721":"2:721","StyleId:2608:2916":"2608:2916"},"guidToUrl":{"2090:90":"/센터소개","2281:444":"/case-study","9:2725":"/laserable","0:3":"/","2244:1586":"/제품소개-2-Readingable","2281:127":"/커뮤니티Articles","6:1529":"/about_us","2527:12461":"/커뮤니티News","2570:3654":"/collection-2"},"fonts":{"Noto Sans KR:Thin":{"id":"NotoSansKR-VF_2","url":"/_woff/v2/NotoSansKR-VF_2/NotoSansKR-VF_2.woff2","source":1,"italic":false,"weight":100,"variationAxes":[{"tag":"wght","value":100.0,"name":"Weight"}],"subsets":{"baseUrl":"/_woff/v2/NotoSansKR-VF_2/","subsetMappings":[{"unicodeRange":"U+0000-00A0,U+00A2-00A9,U+00AC-00AE,U+00B0-00B7,U+00B9-00BA,U+00BC-00BE,U+00D7,U+00F7,U+2000-206F,U+2074,U+20AC,U+2122,U+2190-21BB,U+2212,U+2215,U+F8FF,U+FEFF,U+FFFD","file":"NotoSansKR-VF_2-english.woff2"},{"unicodeRange":"U+00A1,U+00AA-00AB,U+00AF,U+00B8,U+00BB,U+00BF-00D6,U+00D8-00F6,U+00F8-00FF,U+0131,U+0152-0153,U+02B0-02FF","file":"NotoSansKR-VF_2-rest-latin.woff2"},{"unicodeRange":"U+0100-0130,U+0132-0151,U+0154-017F","file":"NotoSansKR-VF_2-latin-extended-a.woff2"},{"unicodeRange":"U+0180-024F","file":"NotoSansKR-VF_2-latin-extended-b.woff2"},{"unicodeRange":"U+1E00-1EFF","file":"NotoSansKR-VF_2-latin-extended-additional.woff2"},{"unicodeRange":"U+0250-02AF,U+0300-1DFF,U+1F00-1FFF,U+2070-2073,U+2075-20AB,U+20AD-2121,U+2123-218F,U+21BC-2211,U+2213-2214,U+2216-F8FE,U+F900-FEFE,U+FF00-FFFC,U+FFFE-FFFF","file":"NotoSansKR-VF_2-rest.woff2"}]}},"Inter:Bold":{"id":"Inter_1","url":"/_woff/v2/Inter_1/Inter_1.woff2","source":1,"italic":false,"weight":700,"variationAxes":[{"tag":"wght","value":700.0,"name":"Weight"},{"tag":"slnt","value":0.0,"name":"Slant"}],"subsets":{"baseUrl":"/_woff/v2/Inter_1/","subsetMappings":[{"unicodeRange":"U+0000-00A0,U+00A2-00A9,U+00AC-00AE,U+00B0-00B7,U+00B9-00BA,U+00BC-00BE,U+00D7,U+00F7,U+2000-206F,U+2074,U+20AC,U+2122,U+2190-21BB,U+2212,U+2215,U+F8FF,U+FEFF,U+FFFD","file":"Inter_1-english.woff2"},{"unicodeRange":"U+00A1,U+00AA-00AB,U+00AF,U+00B8,U+00BB,U+00BF-00D6,U+00D8-00F6,U+00F8-00FF,U+0131,U+0152-0153,U+02B0-02FF","file":"Inter_1-rest-latin.woff2"},{"unicodeRange":"U+0100-0130,U+0132-0151,U+0154-017F","file":"Inter_1-latin-extended-a.woff2"},{"unicodeRange":"U+0180-024F","file":"Inter_1-latin-extended-b.woff2"},{"unicodeRange":"U+1E00-1EFF","file":"Inter_1-latin-extended-additional.woff2"},{"unicodeRange":"U+0250-02AF,U+0300-1DFF,U+1F00-1FFF,U+2070-2073,U+2075-20AB,U+20AD-2121,U+2123-218F,U+21BC-2211,U+2213-2214,U+2216-F8FE,U+F900-FEFE,U+FF00-FFFC,U+FFFE-FFFF","file":"Inter_1-rest.woff2"}]}},"Noto Sans KR:Medium":{"id":"NotoSansKR-VF_2","url":"/_woff/v2/NotoSansKR-VF_2/NotoSansKR-VF_2.woff2","source":1,"italic":false,"weight":500,"variationAxes":[{"tag":"wght","value":500.0,"name":"Weight"}],"subsets":{"baseUrl":"/_woff/v2/NotoSansKR-VF_2/","subsetMappings":[{"unicodeRange":"U+0000-00A0,U+00A2-00A9,U+00AC-00AE,U+00B0-00B7,U+00B9-00BA,U+00BC-00BE,U+00D7,U+00F7,U+2000-206F,U+2074,U+20AC,U+2122,U+2190-21BB,U+2212,U+2215,U+F8FF,U+FEFF,U+FFFD","file":"NotoSansKR-VF_2-english.woff2"},{"unicodeRange":"U+00A1,U+00AA-00AB,U+00AF,U+00B8,U+00BB,U+00BF-00D6,U+00D8-00F6,U+00F8-00FF,U+0131,U+0152-0153,U+02B0-02FF","file":"NotoSansKR-VF_2-rest-latin.woff2"},{"unicodeRange":"U+0100-0130,U+0132-0151,U+0154-017F","file":"NotoSansKR-VF_2-latin-extended-a.woff2"},{"unicodeRange":"U+0180-024F","file":"NotoSansKR-VF_2-latin-extended-b.woff2"},{"unicodeRange":"U+1E00-1EFF","file":"NotoSansKR-VF_2-latin-extended-additional.woff2"},{"unicodeRange":"U+0250-02AF,U+0300-1DFF,U+1F00-1FFF,U+2070-2073,U+2075-20AB,U+20AD-2121,U+2123-218F,U+21BC-2211,U+2213-2214,U+2216-F8FE,U+F900-FEFE,U+FF00-FFFC,U+FFFE-FFFF","file":"NotoSansKR-VF_2-rest.woff2"}]}},"Inter:Semi Bold":{"id":"Inter_1","url":"/_woff/v2/Inter_1/Inter_1.woff2","source":1,"italic":false,"weight":600,"variationAxes":[{"tag":"wght","value":600.0,"name":"Weight"},{"tag":"slnt","value":0.0,"name":"Slant"}],"subsets":{"baseUrl":"/_woff/v2/Inter_1/","subsetMappings":[{"unicodeRange":"U+0000-00A0,U+00A2-00A9,U+00AC-00AE,U+00B0-00B7,U+00B9-00BA,U+00BC-00BE,U+00D7,U+00F7,U+2000-206F,U+2074,U+20AC,U+2122,U+2190-21BB,U+2212,U+2215,U+F8FF,U+FEFF,U+FFFD","file":"Inter_1-english.woff2"},{"unicodeRange":"U+00A1,U+00AA-00AB,U+00AF,U+00B8,U+00BB,U+00BF-00D6,U+00D8-00F6,U+00F8-00FF,U+0131,U+0152-0153,U+02B0-02FF","file":"Inter_1-rest-latin.woff2"},{"unicodeRange":"U+0100-0130,U+0132-0151,U+0154-017F","file":"Inter_1-latin-extended-a.woff2"},{"unicodeRange":"U+0180-024F","file":"Inter_1-latin-extended-b.woff2"},{"unicodeRange":"U+1E00-1EFF","file":"Inter_1-latin-extended-additional.woff2"},{"unicodeRange":"U+0250-02AF,U+0300-1DFF,U+1F00-1FFF,U+2070-2073,U+2075-20AB,U+20AD-2121,U+2123-218F,U+21BC-2211,U+2213-2214,U+2216-F8FE,U+F900-FEFE,U+FF00-FFFC,U+FFFE-FFFF","file":"Inter_1-rest.woff2"}]}},"Noto Sans KR:Light":{"id":"NotoSansKR-VF_2","url":"/_woff/v2/NotoSansKR-VF_2/NotoSansKR-VF_2.woff2","source":1,"italic":false,"weight":300,"variationAxes":[{"tag":"wght","value":300.0,"name":"Weight"}],"subsets":{"baseUrl":"/_woff/v2/NotoSansKR-VF_2/","subsetMappings":[{"unicodeRange":"U+0000-00A0,U+00A2-00A9,U+00AC-00AE,U+00B0-00B7,U+00B9-00BA,U+00BC-00BE,U+00D7,U+00F7,U+2000-206F,U+2074,U+20AC,U+2122,U+2190-21BB,U+2212,U+2215,U+F8FF,U+FEFF,U+FFFD","file":"NotoSansKR-VF_2-english.woff2"},{"unicodeRange":"U+00A1,U+00AA-00AB,U+00AF,U+00B8,U+00BB,U+00BF-00D6,U+00D8-00F6,U+00F8-00FF,U+0131,U+0152-0153,U+02B0-02FF","file":"NotoSansKR-VF_2-rest-latin.woff2"},{"unicodeRange":"U+0100-0130,U+0132-0151,U+0154-017F","file":"NotoSansKR-VF_2-latin-extended-a.woff2"},{"unicodeRange":"U+0180-024F","file":"NotoSansKR-VF_2-latin-extended-b.woff2"},{"unicodeRange":"U+1E00-1EFF","file":"NotoSansKR-VF_2-latin-extended-additional.woff2"},{"unicodeRange":"U+0250-02AF,U+0300-1DFF,U+1F00-1FFF,U+2070-2073,U+2075-20AB,U+20AD-2121,U+2123-218F,U+21BC-2211,U+2213-2214,U+2216-F8FE,U+F900-FEFE,U+FF00-FFFC,U+FFFE-FFFF","file":"NotoSansKR-VF_2-rest.woff2"}]}},"Inter:Medium":{"id":"Inter_1","url":"/_woff/v2/Inter_1/Inter_1.woff2","source":1,"italic":false,"weight":500,"variationAxes":[{"tag":"wght","value":500.0,"name":"Weight"},{"tag":"slnt","value":0.0,"name":"Slant"}],"subsets":{"baseUrl":"/_woff/v2/Inter_1/","subsetMappings":[{"unicodeRange":"U+0000-00A0,U+00A2-00A9,U+00AC-00AE,U+00B0-00B7,U+00B9-00BA,U+00BC-00BE,U+00D7,U+00F7,U+2000-206F,U+2074,U+20AC,U+2122,U+2190-21BB,U+2212,U+2215,U+F8FF,U+FEFF,U+FFFD","file":"Inter_1-english.woff2"},{"unicodeRange":"U+00A1,U+00AA-00AB,U+00AF,U+00B8,U+00BB,U+00BF-00D6,U+00D8-00F6,U+00F8-00FF,U+0131,U+0152-0153,U+02B0-02FF","file":"Inter_1-rest-latin.woff2"},{"unicodeRange":"U+0100-0130,U+0132-0151,U+0154-017F","file":"Inter_1-latin-extended-a.woff2"},{"unicodeRange":"U+0180-024F","file":"Inter_1-latin-extended-b.woff2"},{"unicodeRange":"U+1E00-1EFF","file":"Inter_1-latin-extended-additional.woff2"},{"unicodeRange":"U+0250-02AF,U+0300-1DFF,U+1F00-1FFF,U+2070-2073,U+2075-20AB,U+20AD-2121,U+2123-218F,U+21BC-2211,U+2213-2214,U+2216-F8FE,U+F900-FEFE,U+FF00-FFFC,U+FFFE-FFFF","file":"Inter_1-rest.woff2"}]}},"Noto Sans KR:Bold":{"id":"NotoSansKR-VF_2","url":"/_woff/v2/NotoSansKR-VF_2/NotoSansKR-VF_2.woff2","source":1,"italic":false,"weight":700,"variationAxes":[{"tag":"wght","value":700.0,"name":"Weight"}],"subsets":{"baseUrl":"/_woff/v2/NotoSansKR-VF_2/","subsetMappings":[{"unicodeRange":"U+0000-00A0,U+00A2-00A9,U+00AC-00AE,U+00B0-00B7,U+00B9-00BA,U+00BC-00BE,U+00D7,U+00F7,U+2000-206F,U+2074,U+20AC,U+2122,U+2190-21BB,U+2212,U+2215,U+F8FF,U+FEFF,U+FFFD","file":"NotoSansKR-VF_2-english.woff2"},{"unicodeRange":"U+00A1,U+00AA-00AB,U+00AF,U+00B8,U+00BB,U+00BF-00D6,U+00D8-00F6,U+00F8-00FF,U+0131,U+0152-0153,U+02B0-02FF","file":"NotoSansKR-VF_2-rest-latin.woff2"},{"unicodeRange":"U+0100-0130,U+0132-0151,U+0154-017F","file":"NotoSansKR-VF_2-latin-extended-a.woff2"},{"unicodeRange":"U+0180-024F","file":"NotoSansKR-VF_2-latin-extended-b.woff2"},{"unicodeRange":"U+1E00-1EFF","file":"NotoSansKR-VF_2-latin-extended-additional.woff2"},{"unicodeRange":"U+0250-02AF,U+0300-1DFF,U+1F00-1FFF,U+2070-2073,U+2075-20AB,U+20AD-2121,U+2123-218F,U+21BC-2211,U+2213-2214,U+2216-F8FE,U+F900-FEFE,U+FF00-FFFC,U+FFFE-FFFF","file":"NotoSansKR-VF_2-rest.woff2"}]}},"Geist:Medium":{"id":"Geist_wght__1","url":"/_woff/v2/Geist_wght__1/Geist_wght__1.woff2","source":1,"italic":false,"weight":500,"variationAxes":[{"tag":"wght","value":500.0,"name":"Weight"}],"subsets":{"baseUrl":"/_woff/v2/Geist_wght__1/","subsetMappings":[{"unicodeRange":"U+0000-00A0,U+00A2-00A9,U+00AC-00AE,U+00B0-00B7,U+00B9-00BA,U+00BC-00BE,U+00D7,U+00F7,U+2000-206F,U+2074,U+20AC,U+2122,U+2190-21BB,U+2212,U+2215,U+F8FF,U+FEFF,U+FFFD","file":"Geist_wght__1-english.woff2"},{"unicodeRange":"U+00A1,U+00AA-00AB,U+00AF,U+00B8,U+00BB,U+00BF-00D6,U+00D8-00F6,U+00F8-00FF,U+0131,U+0152-0153,U+02B0-02FF","file":"Geist_wght__1-rest-latin.woff2"},{"unicodeRange":"U+0100-0130,U+0132-0151,U+0154-017F","file":"Geist_wght__1-latin-extended-a.woff2"},{"unicodeRange":"U+0180-024F","file":"Geist_wght__1-latin-extended-b.woff2"},{"unicodeRange":"U+1E00-1EFF","file":"Geist_wght__1-latin-extended-additional.woff2"},{"unicodeRange":"U+0250-02AF,U+0300-1DFF,U+1F00-1FFF,U+2070-2073,U+2075-20AB,U+20AD-2121,U+2123-218F,U+21BC-2211,U+2213-2214,U+2216-F8FE,U+F900-FEFE,U+FF00-FFFC,U+FFFE-FFFF","file":"Geist_wght__1-rest.woff2"}]}},"Noto Sans KR:DemiLight":{"id":"NotoSansKR-VF_2","url":"/_woff/v2/NotoSansKR-VF_2/NotoSansKR-VF_2.woff2","source":1,"italic":false,"weight":350,"variationAxes":[{"tag":"wght","value":350.0,"name":"Weight"}],"subsets":{"baseUrl":"/_woff/v2/NotoSansKR-VF_2/","subsetMappings":[{"unicodeRange":"U+0000-00A0,U+00A2-00A9,U+00AC-00AE,U+00B0-00B7,U+00B9-00BA,U+00BC-00BE,U+00D7,U+00F7,U+2000-206F,U+2074,U+20AC,U+2122,U+2190-21BB,U+2212,U+2215,U+F8FF,U+FEFF,U+FFFD","file":"NotoSansKR-VF_2-english.woff2"},{"unicodeRange":"U+00A1,U+00AA-00AB,U+00AF,U+00B8,U+00BB,U+00BF-00D6,U+00D8-00F6,U+00F8-00FF,U+0131,U+0152-0153,U+02B0-02FF","file":"NotoSansKR-VF_2-rest-latin.woff2"},{"unicodeRange":"U+0100-0130,U+0132-0151,U+0154-017F","file":"NotoSansKR-VF_2-latin-extended-a.woff2"},{"unicodeRange":"U+0180-024F","file":"NotoSansKR-VF_2-latin-extended-b.woff2"},{"unicodeRange":"U+1E00-1EFF","file":"NotoSansKR-VF_2-latin-extended-additional.woff2"},{"unicodeRange":"U+0250-02AF,U+0300-1DFF,U+1F00-1FFF,U+2070-2073,U+2075-20AB,U+20AD-2121,U+2123-218F,U+21BC-2211,U+2213-2214,U+2216-F8FE,U+F900-FEFE,U+FF00-FFFC,U+FFFE-FFFF","file":"NotoSansKR-VF_2-rest.woff2"}]}},"Noto Sans KR:Black":{"id":"NotoSansKR-VF_2","url":"/_woff/v2/NotoSansKR-VF_2/NotoSansKR-VF_2.woff2","source":1,"italic":false,"weight":900,"variationAxes":[{"tag":"wght","value":900.0,"name":"Weight"}],"subsets":{"baseUrl":"/_woff/v2/NotoSansKR-VF_2/","subsetMappings":[{"unicodeRange":"U+0000-00A0,U+00A2-00A9,U+00AC-00AE,U+00B0-00B7,U+00B9-00BA,U+00BC-00BE,U+00D7,U+00F7,U+2000-206F,U+2074,U+20AC,U+2122,U+2190-21BB,U+2212,U+2215,U+F8FF,U+FEFF,U+FFFD","file":"NotoSansKR-VF_2-english.woff2"},{"unicodeRange":"U+00A1,U+00AA-00AB,U+00AF,U+00B8,U+00BB,U+00BF-00D6,U+00D8-00F6,U+00F8-00FF,U+0131,U+0152-0153,U+02B0-02FF","file":"NotoSansKR-VF_2-rest-latin.woff2"},{"unicodeRange":"U+0100-0130,U+0132-0151,U+0154-017F","file":"NotoSansKR-VF_2-latin-extended-a.woff2"},{"unicodeRange":"U+0180-024F","file":"NotoSansKR-VF_2-latin-extended-b.woff2"},{"unicodeRange":"U+1E00-1EFF","file":"NotoSansKR-VF_2-latin-extended-additional.woff2"},{"unicodeRange":"U+0250-02AF,U+0300-1DFF,U+1F00-1FFF,U+2070-2073,U+2075-20AB,U+20AD-2121,U+2123-218F,U+21BC-2211,U+2213-2214,U+2216-F8FE,U+F900-FEFE,U+FF00-FFFC,U+FFFE-FFFF","file":"NotoSansKR-VF_2-rest.woff2"}]}},"Noto Sans KR:Regular":{"id":"NotoSansKR-VF_2","url":"/_woff/v2/NotoSansKR-VF_2/NotoSansKR-VF_2.woff2","source":1,"italic":false,"weight":400,"variationAxes":[{"tag":"wght","value":400.0,"name":"Weight"}],"subsets":{"baseUrl":"/_woff/v2/NotoSansKR-VF_2/","subsetMappings":[{"unicodeRange":"U+0000-00A0,U+00A2-00A9,U+00AC-00AE,U+00B0-00B7,U+00B9-00BA,U+00BC-00BE,U+00D7,U+00F7,U+2000-206F,U+2074,U+20AC,U+2122,U+2190-21BB,U+2212,U+2215,U+F8FF,U+FEFF,U+FFFD","file":"NotoSansKR-VF_2-english.woff2"},{"unicodeRange":"U+00A1,U+00AA-00AB,U+00AF,U+00B8,U+00BB,U+00BF-00D6,U+00D8-00F6,U+00F8-00FF,U+0131,U+0152-0153,U+02B0-02FF","file":"NotoSansKR-VF_2-rest-latin.woff2"},{"unicodeRange":"U+0100-0130,U+0132-0151,U+0154-017F","file":"NotoSansKR-VF_2-latin-extended-a.woff2"},{"unicodeRange":"U+0180-024F","file":"NotoSansKR-VF_2-latin-extended-b.woff2"},{"unicodeRange":"U+1E00-1EFF","file":"NotoSansKR-VF_2-latin-extended-additional.woff2"},{"unicodeRange":"U+0250-02AF,U+0300-1DFF,U+1F00-1FFF,U+2070-2073,U+2075-20AB,U+20AD-2121,U+2123-218F,U+21BC-2211,U+2213-2214,U+2216-F8FE,U+F900-FEFE,U+FF00-FFFC,U+FFFE-FFFF","file":"NotoSansKR-VF_2-rest.woff2"}]}},"Geist:Regular":{"id":"Geist_wght__1","url":"/_woff/v2/Geist_wght__1/Geist_wght__1.woff2","source":1,"italic":false,"weight":400,"variationAxes":[{"tag":"wght","value":400.0,"name":"Weight"}],"subsets":{"baseUrl":"/_woff/v2/Geist_wght__1/","subsetMappings":[{"unicodeRange":"U+0000-00A0,U+00A2-00A9,U+00AC-00AE,U+00B0-00B7,U+00B9-00BA,U+00BC-00BE,U+00D7,U+00F7,U+2000-206F,U+2074,U+20AC,U+2122,U+2190-21BB,U+2212,U+2215,U+F8FF,U+FEFF,U+FFFD","file":"Geist_wght__1-english.woff2"},{"unicodeRange":"U+00A1,U+00AA-00AB,U+00AF,U+00B8,U+00BB,U+00BF-00D6,U+00D8-00F6,U+00F8-00FF,U+0131,U+0152-0153,U+02B0-02FF","file":"Geist_wght__1-rest-latin.woff2"},{"unicodeRange":"U+0100-0130,U+0132-0151,U+0154-017F","file":"Geist_wght__1-latin-extended-a.woff2"},{"unicodeRange":"U+0180-024F","file":"Geist_wght__1-latin-extended-b.woff2"},{"unicodeRange":"U+1E00-1EFF","file":"Geist_wght__1-latin-extended-additional.woff2"},{"unicodeRange":"U+0250-02AF,U+0300-1DFF,U+1F00-1FFF,U+2070-2073,U+2075-20AB,U+20AD-2121,U+2123-218F,U+21BC-2211,U+2213-2214,U+2216-F8FE,U+F900-FEFE,U+FF00-FFFC,U+FFFE-FFFF","file":"Geist_wght__1-rest.woff2"}]}},"Inter:Regular":{"id":"Inter_1","url":"/_woff/v2/Inter_1/Inter_1.woff2","source":1,"italic":false,"weight":400,"variationAxes":[{"tag":"wght","value":400.0,"name":"Weight"},{"tag":"slnt","value":0.0,"name":"Slant"}],"subsets":{"baseUrl":"/_woff/v2/Inter_1/","subsetMappings":[{"unicodeRange":"U+0000-00A0,U+00A2-00A9,U+00AC-00AE,U+00B0-00B7,U+00B9-00BA,U+00BC-00BE,U+00D7,U+00F7,U+2000-206F,U+2074,U+20AC,U+2122,U+2190-21BB,U+2212,U+2215,U+F8FF,U+FEFF,U+FFFD","file":"Inter_1-english.woff2"},{"unicodeRange":"U+00A1,U+00AA-00AB,U+00AF,U+00B8,U+00BB,U+00BF-00D6,U+00D8-00F6,U+00F8-00FF,U+0131,U+0152-0153,U+02B0-02FF","file":"Inter_1-rest-latin.woff2"},{"unicodeRange":"U+0100-0130,U+0132-0151,U+0154-017F","file":"Inter_1-latin-extended-a.woff2"},{"unicodeRange":"U+0180-024F","file":"Inter_1-latin-extended-b.woff2"},{"unicodeRange":"U+1E00-1EFF","file":"Inter_1-latin-extended-additional.woff2"},{"unicodeRange":"U+0250-02AF,U+0300-1DFF,U+1F00-1FFF,U+2070-2073,U+2075-20AB,U+20AD-2121,U+2123-218F,U+21BC-2211,U+2213-2214,U+2216-F8FE,U+F900-FEFE,U+FF00-FFFC,U+FFFE-FFFF","file":"Inter_1-rest.woff2"}]}}},"assets":{"d4d046c9455db92c5289b9bb294e537cc7a4d0bc":{"type":"PAINT_ASSET","url":"d4d046c9455db92c5289b9bb294e537cc7a4d0bc.png","size":{"x":0.0,"y":0.0}},"c5f6c2ee78e1c1fae870476d7c33e9c4ef0e9218":{"type":"PAINT_ASSET","url":"c5f6c2ee78e1c1fae870476d7c33e9c4ef0e9218.png","size":{"x":0.0,"y":0.0}},"8d5569b4c3811a00f9e445ad3a9abc914f81c309":{"type":"PAINT_ASSET","url":"8d5569b4c3811a00f9e445ad3a9abc914f81c309.png","size":{"x":0.0,"y":0.0}},"b442be7a14cbc12484fdc22781ea80fc7b20b4fd":{"type":"PAINT_ASSET","url":"b442be7a14cbc12484fdc22781ea80fc7b20b4fd.png","size":{"x":0.0,"y":0.0}},"fde0244a54e45655f579546c98baaa88b4e2d8c7":{"type":"PAINT_ASSET","url":"fde0244a54e45655f579546c98baaa88b4e2d8c7.png","size":{"x":0.0,"y":0.0}},"174af3628ea050b6c5657205c30d58cc8dfdb336":{"type":"PAINT_ASSET","url":"174af3628ea050b6c5657205c30d58cc8dfdb336.png","size":{"x":0.0,"y":0.0}},"5254ebc44a873806e532a942d974e05bc220731e":{"type":"PAINT_ASSET","url":"5254ebc44a873806e532a942d974e05bc220731e.png","size":{"x":4096.0,"y":2731.0}},"c061b8052963d35db5cc58747021352e4affc360":{"type":"PAINT_ASSET","url":"c061b8052963d35db5cc58747021352e4affc360.png","size":{"x":4096.0,"y":2731.0}},"bce5b26506a58716a00e2309e004bf4a70c9b341":{"type":"VIDEO_ASSET","url":"bce5b26506a58716a00e2309e004bf4a70c9b341","size":{"x":1920.0,"y":1080.0}},"ba5368df267457e2415636e11f7a59324b623fed":{"type":"PAINT_ASSET","url":"ba5368df267457e2415636e11f7a59324b623fed.png","size":{"x":4096.0,"y":2731.0}},"cc318729f7d2f525731ddc2c91f842f8615c8d25":{"type":"PAINT_ASSET","url":"cc318729f7d2f525731ddc2c91f842f8615c8d25.png","size":{"x":4096.0,"y":2730.0}},"d5fa8c9a8fa609d8b7d06565c3a9a33ab9d65149":{"type":"PAINT_ASSET","url":"d5fa8c9a8fa609d8b7d06565c3a9a33ab9d65149.png","size":{"x":1400.0,"y":1167.0}},"74a54c3de77e8cfa940c1bbcf58dcd2aea219671":{"type":"VIDEO_ASSET","url":"74a54c3de77e8cfa940c1bbcf58dcd2aea219671","size":{"x":1920.0,"y":1080.0}},"d6f99e4abb9377224da98112aacc9c411d418965":{"type":"PAINT_ASSET","url":"d6f99e4abb9377224da98112aacc9c411d418965.png","size":{"x":0.0,"y":0.0}},"09cce53a42f5222f6e421ca528f4b9767507bc0c":{"type":"PAINT_ASSET","url":"09cce53a42f5222f6e421ca528f4b9767507bc0c.png","size":{"x":0.0,"y":0.0}},"b148c3ce7c808daad98db6f016d6f8fe9e8687ef":{"type":"PAINT_ASSET","url":"b148c3ce7c808daad98db6f016d6f8fe9e8687ef.png","size":{"x":4096.0,"y":2731.0}},"545cc40fdf2097a486a3ff3fe5554e67773e7e72":{"type":"PAINT_ASSET","url":"545cc40fdf2097a486a3ff3fe5554e67773e7e72.png","size":{"x":0.0,"y":0.0}},"64270238d3de4edd07597c9179b36856b5a53af3":{"type":"PAINT_ASSET","url":"64270238d3de4edd07597c9179b36856b5a53af3.png","size":{"x":1400.0,"y":1167.0}},"4f89b370cf29c22c8bfd83ffd6ad48b1dd2cd6af":{"type":"PAINT_ASSET","url":"4f89b370cf29c22c8bfd83ffd6ad48b1dd2cd6af.png","size":{"x":1400.0,"y":1167.0}},"44da5c3edea87192afa55819594c43cdfdac890b":{"type":"GENERATED_ASSET","url":"44da5c3edea87192afa55819594c43cdfdac890b.png","size":{"x":1200.0,"y":1000.0},"offsets":{"top":{"value":0,"unit":"PIXELS"},"right":{"value":0,"unit":"PIXELS"},"bottom":{"value":0,"unit":"PIXELS"},"left":{"value":0,"unit":"PIXELS"}},"format":"PNG"}},"stablePathToAssetInfo":{"2088:72":{"hash":"44da5c3edea87192afa55819594c43cdfdac890b"}},"animateRootIds":[],"siteSettings":{"title":"Brainable-about us","scalingMode":"REFLOW","lang":"ko","customCodeHeadStart":"<style data-brainable-nav-first-paint32>\n@media(max-width:1023px){\n#container header.css-1npqvn{width:100%!important;height:64px!important;min-height:64px!important;max-height:64px!important;padding:0!important;box-sizing:border-box!important}\n#container header.css-gs1j7q:not([data-brnav-header]),#container header.css-f62t5g:not([data-brnav-header]){height:64px!important;min-height:64px!important;max-height:64px!important;box-sizing:border-box!important;overflow:hidden!important;width:100%!important;position:relative!important;top:0!important;left:0!important;display:flex!important;align-items:center!important;justify-content:space-between!important;padding:0 24px!important}\n#container header.css-gs1j7q nav:not([data-brnav-menu]),#container header.css-f62t5g nav:not([data-brnav-menu]){display:none!important;visibility:hidden!important;pointer-events:none!important}\n#container header.css-gs1j7q:not([data-brnav-header])>a:first-child,#container header.css-f62t5g:not([data-brnav-header])>a:first-child{position:relative!important;flex:none!important;width:108px!important;height:32px!important;display:block!important}\n}\n\n</style>","customCodeBodyEnd":"<style data-brainable-mobile32>\n/* CSS-only first paint: no React-owned DOM is changed before hydration. */\n#container .css-gxicr1,#container .css-7ycw0n,[data-hm32-poster]{background-color:#000!important;background-image:url('data:image/webp;base64,UklGRnLtAABXRUJQVlA4WAoAAAAgAAAA8AQAMwMASUNDUMgBAAAAAAHIAAAAAAQwAABtbnRyUkdCIFhZWiAH4AABAAEAAAAAAABhY3NwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAA9tYAAQAAAADTLQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAlkZXNjAAAA8AAAACRyWFlaAAABFAAAABRnWFlaAAABKAAAABRiWFlaAAABPAAAABR3dHB0AAABUAAAABRyVFJDAAABZAAAAChnVFJDAAABZAAAAChiVFJDAAABZAAAAChjcHJ0AAABjAAAADxtbHVjAAAAAAAAAAEAAAAMZW5VUwAAAAgAAAAcAHMAUgBHAEJYWVogAAAAAAAAb6IAADj1AAADkFhZWiAAAAAAAABimQAAt4UAABjaWFlaIAAAAAAAACSgAAAPhAAAts9YWVogAAAAAAAA9tYAAQAAAADTLXBhcmEAAAAAAAQAAAACZmYAAPKnAAANWQAAE9AAAApbAAAAAAAAAABtbHVjAAAAAAAAAAEAAAAMZW5VUwAAACAAAAAcAEcAbwBvAGcAbABlACAASQBuAGMALgAgADIAMAAxADZWUDgghOsAALAlBJ0BKvEENAM+PR6MRSIhoSOkUJkQcAeJaW2hL39v6Hu99BL6LgZTr9f/5PoBfif9v8oTZnr//R9QH8W/x/7eei//L5cv0r/n+wB/H/8fyDvsf/g9QH8U/yX7Beufle/WP+p+0/cF/Jf8N+XPc7/ux////n8CP8A/fLQrOIE2Yqqrf8fy19gZ2hFD9L6MfHN+F9Qfj4/tG29Uhu8r+q//X1D/yf+z9a7uf1Ntj64/mCnvlPIZ523dee/7p3rvTL/SOkT6vOea9UH+V9MDqWv8l6l/nK+sd/lukA//+/wfNv9f/0/Ud80/qvAX8+967ch/28zfzPgt+N/7frW/1vBf89/tfQO/HP6p/yvTokO9L5R/3i9fb9j/xeuH8p5wv7x62eA9+R/6XsBfxz+1/+P/M+8r99f+6/K335fr//Q/+XuFfzP++f+T18v//7oP3e////d+C79hf/v+8o0TsPAgBT9NxZoowc6O7F3v6jAwtbeoHKonDN99wUxZJdtm5PumMTO3M0T6SFzBLbGmoISNSvTCWXmpwgLoWKzD+dI8AZcEyOoouzcp3V59sHUWX2l4S73MP+WrIbGzBkSigf/9AKzyazKSLv9cdUP/2Vr0fr4z8i89h5D6vyr/4iuAeH/l8Yr1qXDmUS8RYuHViehukIxSQRMpPCmhCrLJIhTMDNQNFCKha/0oPm5D4Ab7Efc8g9KUBY4YXbDNkjusdE4VOAp/Xi9wr1DQJtRv4C5IatLgwEkAvLiFyP52s82puSkngrhkqVw4qEQkgkp5aGBY967C8QozQX3mvyJKCrnWyDe8RN6F8g9N//2UMnMhXAn4Z0JjsZO1e/kAMGMieztxMsY+0RPaqvNu5JASuQI6bwsyizI4qHrGKZOwiLZARJOJyefdGF0RH4pGtstnVb8qpPNz+tvU0HM8H5SG1d/DgJaXKpQRJ9peDXKuSkJUtR73FcjGrrE2hO0sCFjK4OJbrWxJAL5mnf1wjj2BVtYysxNYRk7sWq3MHD+Yx+R2vXHGBVYDusb8cEhcbyyccp5TmnwNII4q+ki1kPgPgfd3v/YPGrglBl+gaehWrJLoOkQ4iqQ7Jp5ROagLmmnHP5QjjOqgoQz22l3L0ZMcqKYzZMdxHkuHvkKxuF60qieHlQEubxXZvapQ9KgkYzkeoaoZybVIr//h2v/7xRkIH/2peqYWgseVQddDigxwCzqcvpLyK5sMqXRx/k9vAGE/CaoSYMAU/u9sNMQz7raD9zLA1WWKMNLWWq7lknUlsgGrmYlK1SyJvBvb6GchcjsiiRS9tZUcXAJnPoxz4oRA9oueqWq7gwvZdLpOqp6FwXo0Q2BMOLXFVDNSq0fUXiBGN52w61D01s4T/p9gai+zPGJVOkgULIarStUXJQWLsw/IlWJFQyYNKveVh1urZEvEn6xxATfqQeAGGD9wAdAU86HYS9/Puf8TCynA5WWPuQL7rrEbT0CrOVZ+jW92WEpr6HUMKgHbI55PR2OrRES+fIPKa7PpDU3BipABJlHQq4utQv58niXOIr2XWqk1+I4Tb4qnN8pKBVhInY/g71Y76EAu5hoY1Am8HOtOnpR0gMgycH+NfZxE6mKZ8gngcAH+G+mLZDgMiCvSxvUs57vXoRc9mPxSkwdbB5HYh709u8C328jSmte/XWbghWLOqACxya8xC8qwo2C8kftSKPkRI/CEou/vDJcWEp6CGEUAf2wFCVB+V7/nQdWvl/AVo9GNS4IE2Xg4SP/2iJ3s+M+2d5V3EsmDbqFQh3ufc7U+gnaArsqE624IgvVKFXM5Od1UkMInhH7r/8tgPClmyF312ryMbmD8P8jQcXe5RrrM2FQWYyALO5OvPYHIB8u+fjoHnarXy/f86Dqb3mi+mMuPv180uMXsmJKHS95/5S2oeZ346KqA2WvfpCkWFpNQ4qejHvfhJG05e69uW/qx9PvFtLlVzfB6mnFPaLy3Gr8Phv1pu7xN3e74Zyu+6Lw9yiDOMFNrOCRnAcyPRzPXacK8WgyT/N3zoOrXy/f86DqwvrnKZngBHEbboUN4vL6quwsdXKqqwWdtqcAiz33NGK7SvYXZ8Q94FOVU17aOnJ+ObJrrfNfbK3p1Gvb1rk0X0GlGEvQJUoEaIjlgzkf9VMlu/FhkrR9OMhgbRLgLKRP7203rTkzouHVr5fv+cJuapDMaE/FLYR525ngqEjmAux6fCj8s7uZOFLA38skoOPAMY/tSPI3KAGbtkNJWFSRxqG23kz5H8NSIYLnTa+CEDBqIS1arwoMLck2+Qf0UiHgv3S34OODgyNoQJVsed46Y9utnF9QSCVOrXy/f86Dq18xNI2FuSmbzSGxypD468tzIEhrGcwE+xrkUyYBH3/OgNFWBCN0Og0qzp4QNsHwvRZxnRezMyy2kZYQPrpSPa6/KJS0WO7vJ5vPDzzOlwHkBxvE8aGDvsgBS865Fi4dWvl+/50HUMIMEzGqYkOjaVXBsa7UV4ffRlesgBuajq3XZ3jJGqGQj9Byu+d6xfPR3fD6pJHYckhzW21fsyQ5Z2fQLzSukeDf4zyRLB5Og7n5XQRjvtJ59Qb5FGMqbVMRvOPmOPdq954ZDbF+/50HVr5fv+g9O9SWWPwsdKlQJn1ibVE6m/8HmiTsgLRamp0+dvZMtR7f4+FQeBixCa0nI1aCxujiX5S0tjI4HUyOEqRGWG0TxVDOhFAzuFuwQ9tJKPABx/Etgmmoe/3cFApllidB1a+X7/nQdWtTyGMjcEf/V5FYp8+IwvRd/+PnSk+VEOJgCpyn3SkTsfv+ZsmUVhL5VBJGYUmS2wYVm3VonCr6aquL/ywuY8skZj634M7On+otKvqyVK025DQz0Jge29phWRUA5gaSzUvGER1a+X7/nQdWvl/2iJ1fByR/MM8zZkWy3dD/dHt5zBZu/fcA9Jq1qHAgLXhHNCjRJ02cBauSQMw2z1SsObIdj5PciaV34nokTg14IOgPnYEuiGOpyqIdr3dnBI5OIQh2oSn2nDRyLu/arXy/f86Dq18v5galM2xocJFJUUVpouhFjgdV5Mkhhs+RO1lSKtfBzi5BPGXDFyyh+geqd9cOpDYGIbJ5bMAGnOGzeBslxs2kzbQ22t6+E6yN0nWooZs4+4eHFHOIAvT2KcBPV4DrPnRDpc0FI6hH3/Og6tfL9/zhWYRTAUFhLPAPaobuTxvCj3IiSXC4/4bcBq04pMTW29lCyMN1wzwLp4smFA0h3sfhhdylgowaLqytqlowblPJX9Fi/fMbnmReMIZkvrbEdmqZ7aPeMY0rAimJSoQ70qkypoW8aWnvn6k4dj9/zoOrXy/f86Dq2KLi+d5RewVGSF5kIkAZqENTC+hKR5uncn0ie9c1L0/WkRgac9eu6XvyXBLYQxBo32OR1AU35IdA7dMLFCUiqUm9O+50Gp1pXYazQYdwlptdMG5f5ICDEWVcmbgA3Swxh+8DIK4crEZA2DiSGlaInY/f86Dq18zGF997ASFwiphyC1Xsx44AQTYABbLudDdVAB4Xbml4wlUxGrKampkXUBTGv9pbCpGfkthzDM1v2DQpa/DWILJKaXx5MEhTgBkNd0COg0XQNDW3QFWx8XhKWxIwaZBIFiRfIv5FX8jqmqfOyPeu9PIQs3amm+YsEROx+/50HWqoAeChcniTeu4z/x6gMPQJa2DDJKr+TReucI9Wqla+MmjKYUsUqMgm66aTZnEu5GI4jN+VydK5vweWOXmPrqTzufVvj2hHPzCx69BXBsEg+Tb8qkdt4fgRWZh1II3YEkZ8ltUlkuLjGKR5EzoDgjiR2a6O/xJ2ztnJgCBUxUVjNlig2O/L9/zoOthmxfaaV3gDiT8O4Pv4P/iGV2m0isvZ6CPE89UcSOfXUVit/ANtlX0fbcenePKblKHQSK3VpdbMgmqFFORgMIou8DnMxu9xqYgw221r0T8/OtbtSHFmFEppiR7zN5mCntdFivvicLbZV7IBKifwI51eo5NBCdMnrGIor33fI2+ZUbFm4Xxv/LANqzCIgWS01Q8PlUqtRxELNusKSfonVr5fyBhRaE6CsT9V5yieTf8HwR5jyZTTzV7PPt9hIH4CuPvvCNzQ8YSQh3YKbM+itPi4FmicCu64db8bctkWV/MVRz7fydd81MDEmDms1pSc2l3h7a9zaGKY8c1gx4GtOiZ3mle7ouYk1pJo4dWZFtuXfkeqYHCwhrxToSvTjxZtoRqIK7Do5Q6QEZr0GmQ8McVFws8xq/WyO7N/8f+6fAbGcTW2e7++GabMtqJ+U1QtZt//FfqolkFrhedgFdP4H+lzboGYg8yn/BKu2YwY+1VMJcEaKLYFL1gPJz4SEghiu3NON/9xL3pxq9IsYL47ZnnLe/L2LDVGg2lH6HvXQFNDbGXEq6BDasgJdvICdirKkUfseKcszrOl0aX5mi3X/QfEMEXsP1Ph9Y6H2iccm5vue1fZbhdIPWX/e6zHxEF7PTuPaHR33LR7uQqMbTv0jwjBUl8R3Is6wyWHFrE+anzZknMPX5kdVYvz4ORZOU1mT8bMVMfY8tLTYdPB69w5dqaDiILGzuVaTVp9WHvv2BQFe3mQrK4yQ/z3dvuIHtSxaDkwcs/y1BrmNek9Z+kzvaI9f/OKhAq9N5Mzbx5VOy8q5/EzhL9aZx0QpMcLTTEuil9UDIobYqgjdqIMuIsa0vXlRw+bKX9zyhSoIcUwyIeG6btY7uf/nH4zqlCipmh6pad/LE8SZgau6ekHCfI+xu1IX3yLpRycj5IAh2KsxfT77R77UtZ+FBbJcZ9il8PXFp7RkMoyVBHZt/5tkBnP2VnYn3wpO+BGWd/ZOM67X+7FKBBTHcS6ji3taShzvwgT0044Q6IuGXVgJ+driA3pnAD+h8bzqnRsfpz2IvF/eM4lVjnAfZCAHHXOhfsQOcoRLl0k6qSwznq1w7ZOOSPNbkowUb/r5Ghbz7vEVrHRQyjMgx82R6zM9Oda2pp23C3Abyhtt1+hw72P/1kuFw5P/fW8AX7YWKKcB1csX/+Mrr50B8kEoG3zh1bI0xMqxXQ7J+VZGrAlfwnj/iHYK5S9TZv63QcOcv79QNzXAHIgD6uXC5a8+8mpyh5uSAvdgIOfP/Vgnu9HGDPU9coXiOzqIsSBn3Yjx+/Fz7au0zuHBrbrmNfeJcT+jwWAhEwJCMsXjyuje3/dK5mUn1F3T38Q3+nVEFnma1USdRslTTfcgAQqDumGWgEaBdTFbUV/GHiqCC/KWTE4nE1SU9mKVevugIrekYdvv8LOlOU99n38JFIVrhi4jW7MhALjdrrfCgU5TVdlP4HfsP5bt5pbpC/m+P/azopIEpeNCIKOEt8gGrMmoyardg3jdA/EOxDfycUF28IxynBP+P5YEYL/8oyHkQ58fxPO+Jf9rfaeD7b+kwkDGm/ik6zO832Gv1s2oOdX+HItUVfuQjhT2GDXVjDY/9RtXIuX1YkJ/WZW1tvuSb56ARiQLWLRhSrx9wMlLKdGZqX8ZFVsv/pA29A+GlKC142rFK77qZCnT7x6ATgvbmz030Vhwg7b/+ksFqKZzLjq+D/ER9sBIXAci242aiwe/HV9perAYn9gRg4ZCrSJbfKlbdYGOYXfolToyScsrL90r+HuMcXVkw2/sgbH9gB78yBVKHLR7uSNjBYkvNTT/oJ6CNvQRUdPUVe5EnuiQp8gaJHIK/cIu7yOiXnCmK4rcDubm6gXQD0+kuucc5Mx9KbnxTwQCC3c05thM+7L5Y/E9/hq9wWPK/zZPraymf6q8RlLjnzhW50AYG84X205Pv0fvs7UB3WBsxHjmMb/rJXfgwCnUrEtKpxvgFeARVCzmAKCMlF+QShvEzt/ZE88atsfeL2A7kD89NwQ7sQVQJ1s2cBnjulykTT2egfv8rVI8p+2m+WoTYksdZub+b17FNGttCNYLFxr28rnDHefYg4yW9ju0elvj1fjqzfqqUTrn/yN2TXlLeChglqAm95YVF/z7R76vSKLKo3A06tYiKHZIQE/m7ygBPU/5RJ3im0/cT/VRGXwtrY/6d2zQj+J7WnHquvSRxjMlfskDLqwmfk0QiWXVRNj33z5vRN7JtlY7SqsxThzdzG9ggGK1f9rtf2fjKt7WzbjOojsMinjqsTYrLnfFAcPT3MqzdQoO0psZstxkmL9KPYIaP/UyYTLmKvlF2h/UnAFMwEIisevQ/YSGDwjkwOXwOmUSs6ZXSp6+fzG2qWxt4vDDMJfA2K98cywia26Srq+zhNeu1YM5lElQPggunwlSs1yJByeifXRz8ZWnmBJXgnBnhVDShfMT+oD+9LxowVg5qfRGaWdGz/3Lv1XYgIAgmch797zPUOUi4CuzdYIKNj7YNapMMq/MVgx+GSSAQIveHo9W/u+oC3ylqtSrYszNQ7dxWHb7qfO6s8C1NbBPm0E9H382JN0BwMb0vHMu60UVnszsfYgifMxyDbMx7vVFp36kCAO1KlAUdHRdtWYwMhkchqUW2MLtgvKILeDMw4OvD1pnwsWjUGWEy9MWV+OUa/ERE2+u4SEvuwbS0oSTnDfax9I/tAvV+bZt5z7LhALzfbJP20cK4obrQ1Ryp6FUdqod9vA7KjzeC/us8aMSAhfOfevjatomX2N1lBaUv7gOIv0nK/2wxb5nY1EMhjRuUavKgiJPQd1Qllbrr/bIzh/RejMOBWQWe5JSAhNvoiJcuQn9JgQqmVyGrVAvYDPa28n6rVM+olLDa9vLNAY+ao+rMBJWS9Tumsg6SutF/oZZzgC9JfvHdlZ8S8l1pp4cGo1ZnOhrThv/ndRWJeyvFqkN3BMmviTUy6fWfnN+9+DOuSZH5C8snsC0A+tuS59v7AQPY6z9vYB6aPfIRiyx+R/u13g4FuENKyG/MvsZB9EwbhVw1dbMTMbNh0e6cU0K/yDLdI0k+C7o+B1T6/VbRJbPwtGPAPvSbQ8MCPfOF+irD/BZvzcV0TLlmgAJx201sVruPM1QV7Lo+QXMfh6zSqa75sMh8cV9/Gn/r+EFLTdvGIiDZ0qX7BjsK5dWeC1h91VLRG0q7wNfz9mtNQylg+RbFG1CUEfAzlztdjlWPRJTzZ13qyA5QvEKsxHZkxaiEL+alTdYWLGhpOo60UmMeTGJqyDJBOrYcKN7SIgMb/QkfdSQ7SQZkUDG/xP1bF8Ywg9g1BjmH3fNdEEjP+3LcP7i09EFzCpJkzTa+3x4r7JxyNwbsw3k77BardbMUfGcu1FGxa6/gXn4zxULOQkf8HhEv9+NRuq70/Sv9ehlwdt8cwkHPyMbkVgIDOv+STMim3dHoWEpVABAqmv9DrcA/83Yls6sqAxmo867kefoiMqawWZI9Udm9hvNEQOhvO82dYIJ3J0LNez+CCRVyyLLXXAeh4taPrR7iLK9q0Z3tV5L8t5PxWgSfxDAjPOwT2/Dwrz33n5Gw3ES3sktOv6Tc69CA3fLOYMSbzCC1ICrr6VkFim1OEUUWdtxEIpYYv/1yJ10Hs06IL/8v5etvdAabzBG/9c6PVCjQbXvuYGjWbvDHdqFMmZH1na2MZHSVmJ8Fae7WCrOpBEq5U4ImDl7xfWltAsksGhjv9jrDyeWrZ1BMOlrUvl2hNQ+o6qe7f23Swlz3d411a37a1Jo7+tDYbEuqsbNe8+r8l/PaI0mQk8UBcRkfcaqJkGSStVLCs56rS4HOawJyj+FHj4eQN/XgpKvcVSWAGAYuboi9PRYrroRMh4lOOPVNvDZJgU7rziMw6C8OJYlaydAK5dLEKbRdVzq9DSvjR/YZkMjLmRx+6182WgC/xVwdFNJzo+pbsmTjpp3Q+xHm/7oUnsMgeTwerNkbzDqerHkgNm6Cbk6sLc+RaYSami9cuzsYseK2J1sInwRWQb36v/vH03nkScC4JNhbFOViRFTD+BLK7sapljoj5Li85i+3pVrFe32oth1kV+SGKpdUt8e5ZwOzbLNHNhpaJUutDMaJ7NGAWMVsSvvNrShvS9YEBmS2NlNiLIJVcvYK4piw/2jA9DBzaCU3TXdgFKzOaGTD1MOZM8ufnqz/Z/NiF/iNdN90a+qbYgpjTo39m92bz66yVtjYtHJZg9CFfMu8Kl5GiN4ze/6RszO2OMI5WIaA4jeAlebKDV4+LD1Y67lUNfmLdsylf3XuPGzwgfn4Ngob6/7uO6yc5pbuGGSnWIpSS/504xE0XvRHIDGo0ldnjappRniXeCiO6+Ev/aCPzuePUQfwzvL0BxXjohEtydhRbT0og+HfUG0zWhtOIdE/hFc3JzjBCef/9P0wPzeIloPnPdursv2BfFZQh/1vwQSUDMaiiVomfVM3/wVaPEVc/pMAJj6f3ZxspWnhbnuKbTzcJLF67Wb24w1Imj437ai2Y5kr/idB8TnzMFEtxqkOzV3oaLBMa9a+C3fi0BLwJpvcVElCZHKibDIY9Q8tTUB2D7ymtZdi2AcHNU9caTYWSowTUHCYi55G8lSoMfFM6aXZVRx0LEyj6tMdINc8Is7sXdTdZwjPVYNJrz/ez5wdppC99nCpMmv9U4PrzE1tb+CLGTJhTl+Xfj4fVQILoQ2093zGRxe32xRy75ADNtYmscsB8XCdjPPyiC8G8wjyB9SrUYxuN1xiwy814wHJUvYGhS8OI9KND9j3dMyN1pjGe6V2s914Dn40P9fDoRyA8wRkxgfG2UYVbxStHkivsFzfpRiZYmtp3DPvZ/7PqyEiAi4whJUofL55VUXzouJUFfRuG+ZunDDap3vH8neT4xISKI+zVUkoLcA3s1PhN5iXmxnY6ReOMfyW+0oTAPREYDA0YP9MgBFv5gIlsboS2Y+jspSBEORCeSW0X9cgP3jig7ly2AjamfECtLLk2PTqWFgasEjF6gfeAsLXXSrzyr9XOCABK0G1D7WmmAUl63EQ5RF4YPBP8LQY4Dmp/oWoiNTQu2BRyuHiHQjeSK9oEx95//3eYTl3XS0MM8WXkI0S9+7BGhsGYUmmILsiw3pMDyqz3jPNzw+mTiBasZXnr5+ukhVAAsGNxe8iFnwXHkC3GG7VtIWBnsJemPwrl5S/WO+wBxR//namZ2trgNVZvtgMXbym5adSyAHvVYMQhavAlCFIOAyodtSqx/IQ/QxkyLaTn47Rof5NQ3kPMX5hoIbiZg5cBDth00DuJhJat9/ggHqrdPzmlD4sxkKRSQD3HcbWQMWkLIZK2/jcSQzXCEaa5fn7aHJMD+xO2uxNIICX2gAfVohtEBdjlrsSDgGBO0BEo1x11jOq1rY1xxtdlDffsZ66tprgo9P+KRZDt8BF/V9RQYj4ZWr1/6huaHuxvMN0U+Ol69QCN5i2dCn00TCgLkHmKdlVwa1DffTei/o2MtEYdafYz4TRYj8C3CwY9yCuI3rWfpZshWycnE1/6W4Uk1QoXR8LlDX4BsWtcAZvK2t7MXDP6PxjBi3ei+k/Z4UZag5eb3NvDGKLPaPdV8/1gL/VUfjUlhKk60SGsSeiCvXLZIq0uv1fju4XWoRjHIBGQd51QJJHwY0ILE2Q7mNrqYlxYrIeCkgG9kzja7UwmpJKBpVDrbo8jepa5e1w+KvtMP9XqWL37yh8FH/Q/DSft9f1qYv4ApAX79thoryVTUn38L0VPn/rv4yByhKqdTaEUbOkFh/qhk9B1K8bWHv9Jw0pCg0p6OvOfVKmndaBMuZ+F2F/K6wRxSa3RqKlmdlLUOSQStXuJBMcHb6t23eg3T/JUnL/D3nMH2HQUEac8eJUknP4sruCmN9tC9/NeEpzx2upZP4DQzvERPA4QlIDbJ13DST9sjqaWrnrjPh7eYR+KK79lO/xX/AtVp/yP/fRK4f6D//a61+8W/uxOmyo0179JSbNTY1YBder2DR4ba+skQZlMQdQwp38dogfa4cFpsUA7tGF/wuCoSObHdxPOYiVFaBxOhnpbHoPwhv6D1lVJChmhYxY9IOkWTWx1vopb4eAHeFCU1y9kaChPRcrcdWtY9kiSNqEpf6pWu1LZYFGiqOPP9jCcLtkjZUmML20z8HFVaI9oPo5iL9QHHLPqnUnboT++aNC9iPbYjGmmC3/Bg1+Nthv3hwVKvhaG2dE1mZjsWRo7/mSAH5TtJNjPZ2WZGmp61ubPyNE8dqnyp5pTASg4wSuXBcPFjPAJoKl2Fa4cMDTm982EsYH3H2zIXEIUDD/zjRioBa8Lr1iDs2qNawPQbcxXHTSOWaJ4K22X0FVMo3TsYDgqUpgAYjucpnecX1zeXvlY4QVB/wCcebGIYmssAvnRAdg8Y7hfEsx6kPWvl783xvVdJ4CJiWTZ4KGOZgfycGamTYN1rKa9CFuc8uBeM5nJ3M6NncAA0d1zQOaImqRVvnn0epmFFIqrzAxk2r/C9mxc5QbpvjFe7NYTkNpyDbigekYVlRzKmvoQ31PVkW481MAmtHZAbiBt0ooQe94ABZ2iGxuHA/cfSKGgaOxk9ANLZEj00nFRrs4qFlDfzJrkIIeFOqDsnD/hXS4neDzEQemYH/aOoZ+BzDQbQucqEhX9koO3OK3tWI9sgUar4TB3df+5ge1qS33frdiphPzxm88o5YtRRH/cJdmpeEQPQuQCja7o6AYi8ysIgu7wFNttb/T2q18r42yWZ/JnRcODc1a5Zv+S1xtFOa982bw4nnQb2xxH3+bL/wwwka6KZA2fpvNEcZQZke3Vjw99HTDYsDHWN+LGahYLihafoMR2rJH/73gAQE5Ir/gLwh6cx5WHAA+KbFhWoyAyhd86GmxLKhmRlbkaz9If4nneBdX51jnfWRpWoY8fV+837UQ8m2ptI7WyyXEvb5rNMqYOQMcivnzI/covdsTzqpYZFhO8l35jQD3YYs55nYU8i/imsybbyZDbOLLySVfmSULp5Js8cgEBQJ2INmVULpyj5mr1eDIt+quS4RIc4fQNsX8G7nGGuNNaBHDoPCixcDZn4hH4ZmdW2X5Fw8GJZv7CUgwLYVo4RCfEgkjaXHV0UwzWl/R2iwHCsrmz42JR2VeRpy6kdKdEGmyfm9dg19eLi2X+K4xhE08m4+3k8MN0ORDyg9vqiaTOCBafnJs1wMv16TUmzpSixeyD3JYDbk6ENLFRDFvDzIK5LsKJkfsy4IJHwePUAR1nSLql0sdAv3SrLzSd9qNj7jPHC5HZk/SFPe/u2jY0YQysFZrei10d/K4vLNTXjdliVkkhNlGaDoaFWswVLlFhWoFPIUNJ4P7bqNB4/a/086aTl4FNHNNf5aoWbmGzaGJimMw4qHHh1a+q50L0rjw7VnOG11P1842LCymY1KZ93LDnE7tOkmXwT+LEQ7Xpvmbdj3QIBwQAD++DkNfEX4A3EohGSEeJBpvF64MrPXS+X06ZOoPL5ZLfK7ZFtj6KcOCDgylGSH0nS566p7SDfovf1bGOZCc26JDbbmHf8eDxDSi4CBJ7dzXCaX9wCpEm6kug60+3Vj9U3JiyA0BiAIBcWifGC6u4IUoKZVaFNYo92R1IADsYmPP7Czu5rQqp2rZvrJ1F8taIP6M7BlxJEF5SgorJFdGjkf0tKfwAYThYZkZ0PAMBSc6C7rNOfWilkVRM09wNWuOg/p8rBcEGZGLEfQpXpPyjNPqqLPSFmSaxP+ZQ7opYB/BegQJbvWGpffSVqaqSB5ST+/FYzDqWNHKi7xfEsLnz7P7I6QFi7lAF66oiuhm5IHxigQRhZ23DgniaXrvoKnS8piTj0WCMoMKS9oUhlhv1xk3YX50CYFL1lk9ySt6llihTaNVUtRCBzf8DJ0O+1FWkoYhpWUlSeug+6C2nT0FA1qsIPJ3E9rxaABF6EAFTYjOPfFcWE7WlqmxGtiGImEpZ+2FuluINyHVg3HlBlwNTNXpQHmm6at8hmhwfKI5KmUdqrZk2v0/84/76fB5GGGHhMLWpNKhVQqVpk+UvxoE5DETrkGUCQf+LSuJBWltzHT8IfBY4rjjHYzN0IlflsoVewGqwoEK2f3apb2ckqqP2FDIztrmJupQaCAvOFjHbievcS4dnAZOY/kFpGdftgmLi33JxJDuBSwcfzb4b3vSrkEby0UfLoG9FglrcL0Ir/jxIAmAasJoCAKFKmSfYxVq2bLGYbvQFsuEAXw8/luh9ovtTmcU3stNcLQXrHGY2rN4kysLfQeNR/14PnrrvbfQxdnd6aDA5d+lG58UBC+EfU6o7Mkrw/6puakYeuXCX/2diz6bce5OHFB8Vna4WXWmwPk3Ggunqee+6bSobvwgAH1x3KjwJ9cuZz3WpkPqCxGr/p+Ag1vbb0uis9Im/wywShwTmbMlwTFdeEN+v04Zu+D1DELRB6XtNSHp0cSrljRHiS4E1uKzsG11hMiE9xp/YWV0lJDq+WDiflkFTmVAD8Tl4kEviXN3NwEDXhTj5ur7tkePG7pGd1K26HJXy+TyUwWzUe+dsxI8xZoyRYrtieaVt80F6zKCnWMc3VOtJEkPcl14eL5RKJrdajNu+qXahAvpHpCUkXyBF1TRowAfRly0GA+EF9aA34GHohU4Q6FS00YVj/2qBvKNAAAAAAA5kNe3EitRb3peaWCnwxAa/sodpTYLTTtKZneSR1M+F2lnvhw1/v1FUjf/X23fdsMwVbcgV4hZlaImV8CcD7EWqyceRuVW5IPBY/onyCT+cyBnR50UfDTxKsnLBJ1TzIEbjLsIm9UsgOMlL16+yjhc74I7IkrhADtPx0t0U9ojQJjGK36XUURpR/rfYKjpGw/0UpJLBI/QKmzL8ecbO2V0T5z5t9fGEk1JdBeCe0N/dZtYuMb0tG/Iy8iI1rw4u2NYGfVA45+bggGkJGxiPyDKu8NgeAm+6vs2kq+Csuuv8X+b08jpDmmq7tZPwytyl7XI4QsEMINzfUJrjOgB9zexP+Jdsuwn1SjvLtRXi0faxfdb0UlZ7dPSMRSsRT1WrPFQu6fO6caFqo+ZTNwQcCkaqw6O0XI++wNGpkZ8uwnfl9jsPf/hmsXPm+fXbVeByRkidLOGR4EUIgvFAmNWRVapSUhbM6pynljLWdPM+/9V8YRIBsuzc66KWYNJnvJ98+aGbFtqe+Jo4FoSGdLD1NgX1iTZOuPdSfvUhSbVGni9Cm0/a54pio/abrQpIAGp6Ilix/AsFQ3pJ5xfmc/7GkFu3H20D7hBcZBF8KHFWZxxjWUlxyGJMXX4Z297JhPL6luypSTDD936LJD3+2nFnJti747ltlFLilh2aCrb7bPmNJXuOY8O7YJ/RWa+KEsCFqv+PxWyG+CCTiQmdDW5HcGnC6JjfnmuH9wmkMPndavf90VWU8j82yXBMvRIDHxc2p1XQItg//e1jXxh4fL6m8ZPgPOlbt/3s088BboH949+Uc9Ufn2S+7SKtNDsg7oaTGEASPEv0aD93ccgsy0uOC3DJbrkyiRATj+j6ddOY4Os5gOij0p28/wOIqPoYn+v42Lng5Iwx0AkyUwxXZKbSu4a5feb40IitBDdwCuZ3yEwK/kA7CRxRaJTGmLQReuReHJGtLSiIQCVR2OiEaauL8kXiuj2lGQWEmW3zfD9JHPe63/mmtifRNovwCXpEU8e/HL5cqCtcyYu3gFAUiQM6YLldvugzM6iHYLcIrHTBsaE6nRJP8umOtJY0RRLgZlijBf2ugX2myM498G76waxWtCPvHbqOuv/zYmx5WMuXWCZaPLl09hOUc9qE8CenkP3Rxi5d1obnDMCghBJu7uuVXEJvgVsGAH0cuIqWTrRnrUgavdI/MFEnTKJQqGaUOSijkFL1aQJT0Fet0Xz09reIfVmCStHYujN/kYDJsHVKAWiqycA6zFV+lFSiNZjJ+6IJI0V/Of43lbD/qU7c6DMwmm10w6FUdEwFetvlrGMzD3tvh0QkmW+2pRJ+zUaA6rlPvWtvOZFtHURcX2cSvlAkFVYwI+V8GxFdjA3bgDBjAwZDoIPRypWcRTPyeVuBgtHgLmT1kY1wGpleSOAxm+985OZyMali/i3BJEgE8yWiWK/wj9H2l4wqkucb3iUFMHQ9zuauXJguQe1WDlffloZ0eHzNVnMNXbGvNIA56X+bT40fDv1UL8ClC9kcwOPOYXMvqgFAKjjZA+shVqeS2l9fveeGF5iBtJSmyr0FYO/A1QPYSTVmf+xsvNARUTD8mLCvxqZyzDjoxS5qKE+28X142YRfEI9/1Zlu+53kdUBsP3B5EwTL9wmbFE96Qdjln9qjEyylt9sBgtm57awWD0DOEgLU0no1AbFa+j/eZJPV1xlh/vk6cWJUqviimFXX/sfSAKYxTv3uuMCkd/XnwfPr0rQz6S3EPrxni4RdkvthN/ctbra3F+PxLHD8Ar07Ua268ADP92bcr8Nz/DsXTKX5d4+wsIPboqVw7i8m2PgZsfJRZc841uubYNv7TkBMmCQH8MLRLBGevsiHHFEaOqdTR8jd509s2YA5enzZcsSgol3eW0v8xwoLRRhh1KqHGfAN2kWchzMx1kcRBCmpJ/txYj1DCHGhjxraQgsp2aVQ5eJ/+QHBcc6q91Dt+DxlDUEyQY1pHedpyCa+LW5UIICcEPtgHOef8lF6lYahjLkBA+2KUrbPiFMTwVlFKrcVrrRBqaiJt6AqdOSC14rQY13msBJGlPbCEK7+L1NlS/2/8kYUxy0yTf6g1W5k6sFzSvABNXb0XvIM2gZ5Pu6mXBSa2TU1hmgyDhVT8L+pNG9v60ZbHTv/DFd7yXgbjbs/gfxg4mZqSRYKNFX02CjtWFK8KTaB/vwqETvB15CstwTs2l5HksWTXp0UzEiDL0XZzx7iSeaQVIQbheXCiIVnzOKKluAFd14+os3w6KPn/Oc16+qmVUToNrfvsae9RZ8z9tel8DSi3gH/yr46128u7QHH0hUgT9uo9MfMawaMgCnSpoTf5FsE3OmTtHhGOxh0Ey75LLEaS8y3PPRtVz47q3TR5uuyQkmEIk0w6TXPumMI2HCWwpzIjaK+7rWw+ZkE2ebqS0/1485jK43mwHAVIga1iSrfGMGqZaHS8oj6PZu56R2BSJDSwtOfril31vSHy5sYIuUfcoK8AKoLSL5X6gnblKxDud+fbknRh/QWSd81lb9L/hvJ3UGdPSei6ifHvjJTfUJSozkxR8BcC0BUkXl6/VMdftwVDM48L2L3qi/qlsvYuX7dmGlTQ2anJ+c54ogm6PNsE+AJ8s+N66saPAkv/gfFwLqAfaQNZW4ADCpxKoRFlwxoYjKWGUrTSuRgxRsVFowo10LxhsaWRo53oiTVdgAeTvjY6Q2LMYfvIvW81SbH3toDAs4ZQpDjjC6/dYWU3IAQvJGodiFfkMdXGnbRHj7Fn+T01RwuB8c6GpdV426q/N8huIfvUV7U8/SzdGZICaqbt2gw562D68H9Rg/pT4YDSQXWpXqRe9psG0hvrHu9b8aK1h6CTsYgyuxL05gy8+YwC76Aw17YJUMrBT3aBCnsVm/YA05FaOSOf7bso1lSpbhaeU9k8NMLX6/+AAZjzwlloOP8/VLGaQ/u+h2gnmVexhz/kN0m1kfDZHjqwKAVaWYmoOYvtfiaQxyfaaB/5AI2r76e3sVIsxbCvnih+zKNvPkj5yGlmeMglD16FPISXYgFEilQtQ/ChpBq1EDk/c1s/vbTwlycu9DQ0k3hGTChvYoAFCCpygd+mAbYdcLSGmr0G1ELQGXon/KpfZ2Ghn05wMDtz1drtxQGYJK6ysTNZc0OcpSQW8PCgAxWlZoX2fegza5TdiR1p435o69dx6odW5y/ggW5LcdsWCZZNNqz99MtbsDo/cFjfWGzOEDaBvZvHfgshxlR4tDIkqEcRTIX3gIzNKY9Iq/GKu+RuAABwdgBFgZBdNG+0qfhKo8iA2acJGpQ7nCVYc0cuO5UxSZGM3T7nL4J5i12QUsX+f2y4zmayr8yMw6Q79B25xdT9k2i6SOqsmSkPYpdCbQIpeNZG3gUSuhQj2UYlyplJJas0NN1mZr29Ve/Qj64jpfRiE1hrAEHNbBWsqqXn3rYyr8GPrlByiR+a7uzSeIqETH6OFh4XSpql61JUWswkjLyyMM/8zT2Ibywh3Y+fXhzeZZNO4/q+w2Kwkro1KwEgJirn9OPRA0RryQ9zeaFYjYTSyITZxBDOYmNYibdw3PUVn//A+gQRFfnfdvWoQzuofQVdMnSmuha4anDKBYc+2SAr/bJ7Cewi+ggkkmCbt0PXLE5FUaKfwNgbyBCOQsHs86DSILyeFZ1MfYpx6vPYycYGhrGX3r5UJsd8M/xfrxMhufPvVXo2PErPlL8hZJ9Gp3nS3gBZ2aXOUr0iyEZ9DfvaMPN+vPLE9yiynxTIs/tP723gpdZH6u6ZzdZdf6FYY5DZ6xo88uZDp1JcFhqOjBlPK4YZNN20lvkDw07UalsPtZL484bZx+sRb9oKgXkywGHRguxY+k0tyyUc1dR3pC0nA/BHFo05qEgKmms0fiI/oR+/zv4/USEq90qht7x0lAcdbeO+33XPzad02jGGXsC+jkEeiYW/H3G5xalDTG/GQA48spIRnqZJlWmcxXrGip7ktUHpzL557F9geId27dgdrNmQVaLLRdgi1nuBN6bzz7Msg5j6IQqNl3Zdx3o46XPunT0TjX5RQ7xW46hUYhEgBAj2Y4kpynPk631j4WkIj5YCTGFmFc5h+xdnQMoZ+rinM+l/o0goybVf78WEHxM6ImOTwE6fcO1+s4+m9cx65WNOX7F9m9X6krbgyveYXhryR3LfPo7o7aYPQ/2bPxoYkgR14K+sk7bP9duCOJCc3fLtv7fu3OWTjP5DMhESK96Be1zEaGRwi5kyOBBvwH/EmQWRIsAMiNgrdGACxbfwNyLahxpZNC7RbAKgkZZi9xyUt1e+2wZ9wg6KAW5VJP33izirLUTOdGYjbXVht7HADcSjC4VO9r6pS3AIR/iOK1YdB4e8gSJ0sy6QEEWfud3J+T/6y4kYZbaeUm6q0w6X8UqLOPgjjcGEqs/QI0AhjhfGEGQvZzfZQ9LD+UBwPWnZgQi/Q/eluUg4AMqigtJH+ZfaCZnWGgk/jFU2lBRNuZSL6rBbL8nFoGpAa0WseUnka5tAeL01bR35lQz5TnYbUk5QSDOFzcGQEoDmRlZPF0UAPCCE6zqSjJlIdh0kIEeaZMoT0odp0TiBFgV1rj73eAWg8DElKgd4vY5tuSs4HDAhMnppKKFVu0+1+jtBvVMojSia97WRsIUyjW4XpUhkHNaXxwaXata1FLBTJBLu/vrSj+j0oLSzi3Xi625uoIFIGMb6tRbdl22Oc0dH5aU+/rMkhyPZqecp2sH2/uE0iEjDD3KWOX3FQmfOeUkppAFGxS68ev2Cpcmd7dO1B6XFNJZssBFq8YQIn3GJ24+GjB0c17RxZCei1HRCl2Ceiv8xuski/O5k3gKtQ95Ydg3z8U5C5GQWQsII6Hx/vFomoc7sK5o5ZKyMX4FZpqEAkkmgLs3lRzB1cDGPPdYLC9kBX+rp3HbGlLlL0Bk6HpJoa0rEtO/5ZZOrAEs47ON8EHDOzefxzgJQQFBMfxZaEz43cg0hWSt0zoSc7BmO85iY5KOY58Imh2RgBU/do/GajqcIB/pwXXd86Tfjb1w3A39IbrkYmh0QXybpZSNuYQxhd4wRO9aEeocRGSTJ4TsF+wCZjRroRanqbY1Rp+Zq/2nViwL6aSgpDrvJKzHPP7Pwj87T0aF3izGDUDW5txjv4zDS/Xl5UKBOVKd4qgW7NvCGSQzAn4BgtwEKwTTELS7Bi6037t96CkPtYfZxcaRoRRMuABAUICVunXr+3Y4iKBXzjrHdhsXuhKamQKS1K4DhrAHROaMYR/fmnNGzytUNnh9h2FimqA/Hlh5KsTO/dr95/fNqzpWVuG504NQoSfCzmFXotnIwYviWGKh9Xvnee1t4leNRY6syr8/jb49wTaIWjFDrRUter/rOjhkTX3MkuJZ9lhWUJHlo3Gaa+5WbCBygV4ZP22OnBwy3DhlKjdFldSTeIdM3pmBbv7QIU8vZqYIkNQ5N+RzWw8IZPRMP3jdWSaUta95+tZGXNhylP7Ao5WAFDI7fV7MOzbBN2lxmAtntKCSc8a8Y7StNcp0WwTd9/CKauTP9cVTOTTrYTZ46eC4+O4t3+Lj1U/2gbF2crfRqGz8hWD0SCAiRZZZhgfjOWNN5vpDpfTnlXkWVrMnocDba78j9qY2KB71mHrow3YKn7pxAazf/W+vT4UqnKmQlBw9ACu0AuOBE+XDis+WSgQ3ZanuOw5+zxyis/fIHowxdWitgMA5EIKRGSJTaLvzRMzN/rXxOpvqz3jeh+tEefkrag3tCQ/QUABOFN4yBkywqrBEnp+oBDD9628K0WH5VjLYZ3bwRhDBa1SIMp1L87YD9RCI2CQo40QpKlIqs/nRYKc5RibUgZM/kGMAZkwM/OVgi/diNwkigiHAniv5rw2BYALozC2fcILzPxI6TayMB0q+xk8aPJ1hinAQ4zA7lLMDlhLR7Ou9qOoRfNRJEC31iRH74L5zCsuP+ckZCGIBFnswxxX26k5VNqHTUmlbXDgmzoBFrlnhwmvXyT5v1XfHgoyNSZgirIU7FOLIn48XfuAHHZRWsTBNQLAgIJIopj3+PDf00kGmmtKXOJyDc911P95gK9DmEA5AexL3hc/cqbUDwil3xoIcNyXSOMX/gfp9BUT6mMy7+WJ3Kk9hqyvxNEkGDb2QwBmENZ4YVVerqUVp1+icE7zkjl3y0ENo92jAq8PqSfH5ajLk8/e2lRou04vj8BqdPTZ6v7Mi6GgiSuVvN9A8A7hbMEmHP2momXwfVfR1fXLKg2VuJsDRaN22hyoHj6aP/Cs/8WyopUP1bGjmqcxsWPdORZ5pA7uNzIzABGOY1wUJ6k0QN/OSDh09ljRx8VOz4TnW/oO+hHppbZL4XsOQgQba6kAAAAAAAAPnnXEOKhrv6NWyxLwUudVBHumNHkoAZOafW3gd5yRgDFiRpMn3sfMJO6aFPDxzhZTX6SkzN0HWacWIOXqMgDmTgJjSYQND/QYqbub5wXUGwnnf1QmnbHTxKhbGvWHUjyZRE2J47aOWoc6wXBWavDpk7ZOgAhacwnOa0ZVfjZ8m4ByBWD5RibuMl8hdimbHr9elncymlGlOKWV+jET7XYRZtuHny3+38iLApR388Ig6b9fa2r25UcEYLRkoUByL/V7GG51VbL0FiRwFWdai+39ednbeYXqwQ25ZIVg5uirKyiNhYiAGiiK9UF+ZgQmnwzN9WbrIwdVawoHav+QsGB4LNWIi/upeojmKprpajkAt2ghROx7pbk0SY+nUZD8UIGt1vwPhAggszaLdSeMC3VRFGBodEtj5+fzfgKMSqDqJwHnyrzeXvnr4Vkh31ORNVUU6LaAOZX2RMhNcPi8NmG0rY4g4JECiwJ446UBl1hBHQr679y8Q7nYJ6X112Eyy+nTrhlI/B+fJcIY6sD13n5Duz+i2OuMPvVHbL/5TW02OxfCH9IFrlO4YBa6SYaJgj01zuHcYzx2tAGw2I9IjllS/qYJrkDSMLTiVa1JnmWcvRE3/QLYtAAf9RJ7k+VvplbWeKVwMOVIYzrkWs9G6YVtLV7/vv/P0h0ABMfMdcZRVdXwrtw+cyXuVMMfsggCIQx2JzXA3vAjUv4A9QCTLQR7FlwsNYxlLrQV7AiCwAsHnbPOaOl+Jd0JpQ5mGuEMLfU6dvzeoTTmaEiZiJ913zUnHKrLz+tt3umxh0ehCnCtloSL9FuOLcc8jN1m+Id2cMfAnDtf2ruHmuaMMVv4GUKgS47K09j22lfRavi2TUO+YWDF3KLHk5A/d6lDBtED9v9lb0v7UrlyGluO/5qt7yAkJOferNyXJ5Cd2T9Fhel2RbHYDf6O9eRTAgQjkKjVHiWW3okjXD92HoXYzn1KCRMH7X6PlFQ2fthNwspdClpu+anxhfLT+q2i3oztzfSa/bW51sTk9r2ck/WQTAJ+i0OMke2U5JDP1yaQ9aQ8JNrPLpwTIrX9tdbbm7BTgEgX92XzDSALHkedn2mHAjvLMAAAAAAAAAAKc1B5zyiDY7LXe/kBgatXezfSAKhZ+gLNS8IswS0MgQfX3cQMcAvFoEIhwsNGAVy4DA+ANDbZGEQUplu031l3jIKUc3YGpdaWqsAGjtCA9rTrVdtwtg0tLHwNZQcXoo7LfW2GeGKXcKsHTtX1O7/9HCs6/JsyJsA39kX8bNDv+V5dYgBgmhQxUMnaStYRB+kipW3G7CpYRZWV00aiXEbSe5pUqtqHFwhiVUgUV9P48P3x0/AU52nQrxAPR8Q4TthYHyXWk2KHKwonjdwWTr2Cw6wIi1Llhv3DQ6y9bf1SCb9zL+Kol4i1KHPeL2nO2A4rPvXTykg634ihfo43edKawzu7s3RDRr3CzWpwTu+vdrd7fZlIjxYWQ3LmhxSdDI+5cFLTTEy0zXeAfhD5G+aRTWteWpEs8VBpMnSOU6ufkcHeLhhFgKVQxft8YWfvFsWflpXgNwwAHgvAClMoxb958KCeHx06xlXNxIvrAm5qlJUGEM9d8k5KYwbbK9RVR1tFmqRLD4fLXq/oG6hfwA72ZzWyIjAO9LxmHoaOpKZlYy8QFK7FQ6zLmCR8Qi7tkDZ4Cst3CuHmi+fKMlMqjHTlD7EvG76f9M9uwL4H5TgUZBQDnLVzMlZhMtR/9st7R5Ac3qa9uwElvhGhchZzHC53SXb2qAUa3fgsAqEKIgLZ5191NaBsyNGcA+YWsrixN9dTKwjA61Au+2OwJ5kKhWhG3a603abmWWidJpmwT/BimRlZg/civbKOHlWXjA7wbuCRjUdAOkwcW/lzugKfjFBhY4K7Xh2vVtefM4r65dB5Tuei4MHKFrUqQTN836stB/xkc0kNHKm9JIWyyz++RdUsMbD/xshr1NJlp033TRe69GIiEpXSTj7PYuAAAAAAAAAAABo1CNtfykQ1b79+SRGAh//cb/kfpKyQjO5lDmjonlLZqk+0Xwv8GUejvZVYX+iICSMADeoVQt9LavWjk3glomYapdYqNvaG3mNGMBbQQ0j81dAMoD0kPqTzN3K+BAOULFcR10zqlXdMfeSGIjBS7w3s+wADdsk9z8ZX9FfRueRKIAMd5u2A9W8UtfPZzGEDed+TaocuTLEThkeaxXVOCunXAZEKflp+DCJfHQmCr0siQ9UH2lFi/BFNEcXxowO41YY6wrUEVyERCq2e2ymqEQyfSdeykjug58VNZjqNHZcGAALpbUUV4OtT7nyhbI6UAMx6RmvBmRZz0JIBaboPABUTH4PpKMBrA0ZTRyP3Yc4gSWU4ti9Fg4y6TWZkW3m1XnFt0Mv+l2coPX3N+I/qbMk0g3WD168ARtN7S9+GA2GM/DCo3xS3XRvGeWPS2ZaVe/TGr7BXjYPRaJc8KegbyrPPKNVsUcDX2clzNZVI51BAQ8FCwIVQIbwcLQ5VKlAtLwm4NZQ1wd7vzmpqeIvVYfYNXAYr0+8siy7TfnVrDgJ50o2hufDeJNq2BczWQKvClll/+IxaRH0sZHWW/3r/T4LxPqZVj+TJ1ljS1I74gJjbLE51NXQa/lWZwvoKvUVLNM7Qs5FWAYFOXjmZeR/YCXLDFaEjPf24QSWVKR6d5NOvlAim80gZrECg3bq5BaX981ri9E836QvtBmcclLovWzrT8y4hDLxhRPBBo5Eru2hT7DXu0wAiS/sHpA9JBpdO7rlBZehlXe2JvdpPKqagbn1REMtUKuV+Eb3dHaiV6h2XFyTkvzDE2NBb2TVEipOOszxCODucj9vyzolhF0iKVw2nTm/cWPV40oicZ7b8pMfaazqoUF/5/iFEeEUkTHj7TVRJr9PwjR+GSE/SaIrDCq1b5tIuWNvoRkAhDd5kqscN3LguwR4s4GiThl0EFNwugHnrr0wm0VBU//KC+GkGe7+6rM32SI982vVyecVr8d0xJiIAAAAAAAAAAAABSyT+jgUPB87DCob8JRvq6eqzdDAd+OsHWVpX8nFYO6L3HdsI4hzLxcNJrSYFpiIrv989aOD74AkMX4Wb8tSZK0UwSiomF4IM8h9+rRcTUq4vVXrXU5/uq/2220MMDX2ztQ3aY9RB7nmaTSn+j4XktOkTAh7qUp0JGyShcveS03l1B35DZIfAQnWdmPfwkFxe8jTbMc1RzKpbL0IDcO0JdQ37dv672nXi9A2KsjpPRqD6aUiSxni8T1I22lbwVEP1/sAUCDXcGxDvtt94b9VWskf/Akntu0d/W+PrDrP8+IBXILHxL+OR5+kZAAdfaqAJgpocBr/RWdk+wANvbfZznI3inkGy5lV24QoTsEVIxuZOB0p/2ElwFRNIVn1gk6oTSsar1ex1ABybnG5ztU4YJE+8zhRBpDCXRCCIddHiwbTLqcqLfjviuq4cC0FzeH+9XCucrTi5p+rBLLUX8Ov2VB75ohq0YrOVMrGzH46i1ZRhdJVqJbxBPO19gL3MoqsCB57IZifKmle39zcNh70fvd8hrxL07oktGRT5QIi1vKXTlobs37vCXiE88LoIIp0+MkTLH5NI0WA1P/IOwLtALOKCxnavf+wvVJyQ38aX19t2+qnk4VJwU1pQ1+Kcai1leEfsMLR4rmLcZazZVzH0EyiT82SD7fPglcAF06RlUDIkk0hW042ObEgYO1xGBJ8PdHQzPT84ORqpmKWL/8RteuByH/GnRPTWgu8sY1ogzC4RbmfFHlFnJnqIYnd3yyEDDnYcy+NofMyQAn6+Tb9CITot+98AbDK9IubpjFd4Op0NrSZyfculC0SrFUnKtNQ+Y/KrAPGsfnvN5p0B4h+DF+fqPiQzyu2e5Kat2Cv+kzNFp72tz8u4pQB4E80b7dUsCXcv6SCXOu0c0WolzLD3mjezwOI3VcJkVX+A6GrO0345jVLOOGnKTBZtpztdUA7gIbVIRWDigAAAAAAAAAAAAPNfFRHrf9r9BCAb5FR6zMW9JESbrlqg1yW7+6VoIssodDFgUQUJQT11BkDtPz2NA7wT0Rtq1Hyv760Co+k2JubIW9sBOEAbtNFz1K4febsG5bUYrWsetiDhgrVXcLg4hHB6qUCO6Q5MA4eF3TuOPZDOJjGr56+CyRBrdxGclwgIBvfpaxZamnktL9kiReSmjBbMkFLP8xiutr+/EuFHcLeOlmGtOG+fNXe2uRaneBFYwaF/HBGSnuPPrc9ZJ+zR9D7wp8j7AIQ6sBybtm5V0MfcJ9tOLz6bglDz3j1zDn/qrTZy7m1y45l4cJG0kpwQ9tSCL/bMdnB/2WNx8hLHgWGYuxX4LHeVOORNxcvrGtCrAVbnP1tHMLLHh+8ytFWOwQ+RtokR77gckBuu+5GYBQEor+sLAGvSwkU6c4wfzW5AmazDddQzr//g1xjNnfv4hYrDPT/EUd2EuH1Rxh75pG92ElwZlMW8kWPi/F4M8HxtXwjw1WAibE6RMMcYGWzJ9yJOwY3ZQQ+464ZFQQGu79koU34VCHKrYa2MgKnDIJdV4aSmWSCiVypjlbowNbIm9QMsh0dHvQTnA+mbvYJ8skeSK72QjldgxF1zb5mAFWlKl+PdBVNklV2FfC5a4JfiI4tbQVpKDtG0v4pXn6DsCtsZ18wppH4NiYQgui8Gg8+BRLQi9BV5L05Eh7PmmLvppuAl1x0HRU6MReH6Wk3MKENqVO7hPPCYLIpdrmKZnF4dEPVWlZTJf2TIhRw5ZznrdsU9/9+jmRmJf8vH4//aOP4cf7cvQ0GgHMuzmIy05tqZVES9+qmYj23EhD29HD2slbg3CaM3KMHDo6W6d0fB0cL823LS8h7IILNm1X3DAAAAAAAAAAAAAC3qiLZGTHTqqdNmm0Kb4YGkwJ9iDqa5oZXSt2421PM19Pf2Ut3uswcZX7CbpOOCccaEzfkaF8V4RtYU+mfwW0f2hk0+St8NGkfOllVU+eAAoaKSki8h6eqiobnmk+jtQyF/5hZkiNRxfrxjJm1o5LycmxFs2twDYQ4iLKBbA2bOwH8MtadI6l6pkyfpkpR7G7DkiH9va7v9tXYtVPJEgy+YWl8+DAL1V08oqJZVgbx1UGwJPD4dp2moCYV2rJkBRfulXGr/xTefUBBLFMXx82uyGa6G2XO3rr82/Xexh0RKtWGIKZKcY4u1IcBEXCNAZex4epf74Q6yK8VZbmWtzQkFwPoiAzo+pMlst5FX7LdmqsMK4C0krdHCLsG1cb/AACYObYChEqfC3VVkNX7NYFlkmHXyIF6b/1fRdnvqD1eMmPPokpK4SzzlGs/XP51nUAw+B6arc+QR127QNfGXGKmvvXdj5s708Wr72K0N8yFpD6pxbCE5+FALnVG+fTWnu3EVlCuohvk9qlgcCwyIxylhj/7vNCu0u5wR5KJFwbkgscKuh5prZPoojM+4WHAi5UIjZm+LhIzMHE+Hz4ZzIOYdpIU/Nh2N9GX3TCvIKhzTAyGaNqPydboO5ZfAzPZKH3upIrrCA93Byu798joNt2bICypcGMZU28PCDl3CGholcNxCLPJzFaUBOROC0J/EztsIalccMVgTUVVgu1UXYJ2JdT3y61TUb/eP/taakPfCOT00ez9Ia4YHWybVf6RSHWfMhEZjW4USNHJKIqVZ9h2B11B0/PfMQXxcMYAAAAAAAAAAAABK3As46f/hTtG8+xvyXHQFTw0OPL1g82jayi1SFhByF8ILBoz6Aan5sgb+RICwd/MHJ7LUoi6F5dGHwhECoOXKSNvjBxhch5iVAJZzcp9z2olfXYIejibSHAWxjo4X6iRRQXNbJ3U12SprRPUojCAIfJea9UGSyPUfJ8H1K8S0jQz6Mp6ATzUCiMmcm6mHZ/w73zvUKqfJ2eq1S5w/6q7VJ/NbOiBZHmJCoaOhna4Ec7ZXSjo7my4Kt7pQzEptFMUMK5rv3Ek1kaV1aXqiwTqwd/QSZo4zaqq8c6mgiFg0/xtqMRyAKV91UKlVa3T95hecJtA81oIiMf/QAwvfkzsnpX0Wpfxw27rOIC4WLfmB+eU/CVl2MqgQvzB+1hVv6wfiaNBvM/LBHM3GLIpfxcgCkUpTuEV3EObuD3VzWarrfVvqtvjPtPPDAFAADXP4pkTM/Jo8TlQp/SOk6kKaUaU4lJ/GlG9nIFYAF9NpP0R9y+B+5eADMAiHNKfPJlITQC506lOMnGWJ+I7G+ft3Y+1X7r7uFWK43DOG/nJ3+y3Ij5tiXE7MLEglBkJqCWIUHb+WX0HJHNVlqJCi55BM8bZnl/bduPWFpMqD2WJFnlTVESPVZOkJCqlUgjJc5U+UyYjSsqcvIovAI4xLaGY+3YpBiFYOHx1pkPNISFDZggvmfKfpcQJlUD2+rhvruKmSKJJRvN1ld8OXZumOl/8bD8cy865//TjqDspf3bQLmbgf9H/2wN0M2cQw0Ezrxi9CKC0ebgmk3vvlU3ZoBqWmM1j1YuGe0/qPx4eppRJP6jwXsmPlr3NXX11lwuk4tv2s+o2UfmneEKzxDsKXySRXkUMkqRh6G5OLWw8Bxl9qLlDLwiqAAAAAAAAAAAAACjCM+gi97HUvYhe4gYUFUixLlKQk99hQruUVRMYm/cYzNsXCQRfQE7sJE8ovq3c09YSGtp9IQyRcgGEHFO7hF4cIvubRlP8fO/pBfVsWAd18NX/i+x33BGfYzY1Av78JCUx+luw9tAikW4vObFybzDw7Y0sWOuD4SMFdT+JUzQpMCvI1dNz68xM1KxH5BMMS6a+eZV6jtlMMHWvJeEQvxyEPX6HXy1vvGj3G/8bbKYG11MdltXTiHCj0lFbZ1B9zIyqIr2XKYj9vqvsq48MhJ8MJzP4+318L+1IFjabieDqZqqpWl2383bCAr71wMAXjgyIr8kd35s/bo1gxE9SOC0oCgPA+tJQKJMaE5ieycUZOPkQCaQcGm/J7zSWnzqfHj4HPWtdjPuWFVHHwNGNaN2S3B0BJTNwL1c67Fs99iByesdZID+fuG4ALy3tPZBd1va3MZuYtR4H0jeeQtBtJ+xaj4GuBBzUtPR4Jzy4KmxLinspW0sOwk8jpNhNJDuTlUcE7aVJjDg4rqFt0O/ENbs1nYB2yCTp8KY8Lb9ealuOCuu62SKvD/H2ndIdZwnw1PKG6reOhCqdY33J/rK/F9F1g2CoYFdydZ993Skyq8sg7Q8miHLDz/XP246xMN+Er/Np3OUicnNym/bUZgScbwiT3XzXEvjjym998pBoPHyBS4jnSA709Ub8dQYAf1enj09cK8xfSiRFXDbUD0mNSvy3M3KBELvlUp+mbJaQY0nkD2hc42wHjF+YAxcMODX0XyOwJqMKdWnnBbeDjC4PHVDx9WhDXIeEyIjeVrN58YEUTIXvXS/kqqeB4RxXXMAcCMyFN6xwu1zru2n9Mjab0TKzaPdTghv6nkgSx/UjHfrKf47oPeI3Uxwi/ZcUt14rmHCEjXCP53NVq9wQflIaAAAAAAAAAAAAADrNd4okuPQaIVVEgEjZDflt0ux8rLzA2IhUBVn00JGerpyPiV6C7jZMcUOxLg7QtI3Yr5DuyZUxNJoQfDRnERUrP2awWwf2ORSgNoMDTtXjNwqPRVjGWBx9eNrWT0pCF1Y7kLRW+4xMCO/xErs5U+4oxqMEW4gwi+bOW043XLunHpMWOA+cREToMAzdXGHKEdd+j9jGfioVidkKQ3YU0MthJOI71MRFofQFJLzFw0ASLkHuZJaDlIxr9MEyh7dttbdG2tEAHDiO7rG6uiMZCysRyUimA2ee/oyySkJxrNSFMM55NtnvLxZe/kea97M6OLf1KaBDo2Jyb2fdJLcWvsTpHn4DR+Wg3p2+NIAAAf5OXuS6tVIZifKdGUh7O2b5p9RouxYeEogQUvGn52hjAynly7MjKd+Jk8M1mlZ394zWn8VWflU1rEyGahagizDF2gQpp/dd54bwDbllCPbJ4FTNWD9Fugn/alNBR8XlllC2xv+Riq53ihzwiTqmhp8OtsJDQ71EK/CGhJevSnhVLjC7wMMA4m13kYbzE5iffQgenoAEi7epmpUWUpXSUwOr8RJu/6WqZ0684V1vJlSr0u0ziJYzxrvch6KW9cgVz45LBNn6M26WFnSpzPl4eGk5+BNOJ8I3b1DL0MSNAEUAPsqywUs0tAZLvzyIWXDFlisVFVxbrbEDhj4WnVnHYdg/RsMTmi4PtR2ZRVNqSTwabZVpQ5J96yGiXC6redQu88Uxbcg0ztQi88kccHULm+HL+8+M2Cgq4uX3mTQ+bOLN9P2CYbAat6+tpkWe/4XZVldPsmF5GVDTj/bWKGh/nHGnkS2kny0soL8t3dI1bbBmZBQsNg7WYAAAAAAAAAAAAAAEfynYKHRIaqyaA6+dGWac6pTgaI24YvqUIwJetgtoAYT4mCe0MZX2dpeBv9acN3tApHamS3HaF+WFJ7VsppecIGSuq/b8S7EnFXYDivH2Bg5E0F4tgwKGNyao/+UiqnXc73XNBCseYbqToZUAvvVa+u0F0RRmjgFlF1emvivjTgG8iOg+8JFCy9Y/KjVDP8J5FtSKSx+cSmcwap0U9X1g+oGV8cnXjDsylkVlCvlS2dKWntjIBRQzvQl0D1D/NagnbW4kBlsoFq3zCIk+4JZTyK7bOfZ8W8RBdMLdI+KsjuMMQHF7sbCAv6/lhIFLEfvm2OsiZ0EdKDGcfWABShe28tvKkLWgKE+KTSMkbxvjMc6EcEYpgZIU44BUD6Ff1Db4oOb+dyqRsHSU07me3ktOP9SAlPi0/+RXPdbheesoLduiuM8t7G1Y5Xe18VOV3IfXuOubKQUi922YZhQ+9G4XkhrVKbfNT92NEVZApH+AavR0AwEbEr3B5jFVsUicacez7mzKakZM1tDuR4NuuHTyBcT5LIsdKutC0fZDStMv8a52xydtTBeI/YokSpyp9NAhMz0A01TwXmcIFk/czgZcvsWfKRZDuCht1+cCf+yKRpc3KCAxxdxjE6kZYVn7yiMqEOBw/5vy8PI+1sRF3nkSYZ0F8Tb3SbPT9lFztOzKJehUhyKvsmkSn5oGlaXZEPDU5mBbRu2i/KL333QO3LD4TbAoP6RpFhOAB1RlFzSx/TeAnMlFHY4gSJ51/c6dAb+3R5yIv63wvqaMJiXsHh3l53kRZpKE8wMlDPW2xYOffjZQcIlYG8TTQ7DZfrAAAAAAAAAAAAAAAnSsZ68gF4TBQTS+15AalPkbb/902tL6Pp6NEY56e5XmEx10E8AJ9Q/lxW/Ejy5FJZCSmOprFffYbH7iILSsveP25s+UfpJ+5WgBD66t52nr2YYpv+5CG5RQ1npskcb+d0Ywnw2rzeP/Dj9XOLbOH81l7QahCXxCDMH3ZkMJ7ST3LtjBYcFvvnbt7m271Ei9N3o7D15SUjKv53uefZk8O7DmB9DthpbdC/1+xSBACK2kuH1OObwxe4Re7FUp9Qqh74VCXqP34nbLhuYnh9/hVCilULB2Asu3Rusunl72yNL63JTTVhcXuUeCjS1v3kyYnh3stjT/eL9UhBo7x+HOD5BfSHa637+O2g09Vdlf0idLezU4QOheuTfvCP6+b47GyfwAPc9URyx419gJ/n8d/yFy6PmlvDjrRUsSMhRH7s8PhgFLmGONi3lAD7azjgMrryHNpRlCTkJ8QNi0rPnx054XChpo/cCMe2LlF1vKzpzGw/2R8Mx/4efdsu4GkUuNEHBF0U75/+aKcpeo2Ow+gk7vE9lWA64k+JZgRXo7hGackbd8uBx3bJVNHQh8tmd42996K/R9bLRmA8mPHFnVpzzkRs4lbIo3alg+sEJ0ww88LfuGqM/8PQSK6HK74nvmX9E5ZRfvaCkt1uKNhA5/8G6/8oVYv3pddRGFLm0j1EQ0akFyXusDtfaNoDzF+j2rC5yEkANhOjx6+dtb+IoV/uKUz5m8kS9p35NfdXs3OXxEayUcm1eEI7Twpti9YG3/SLxNCmE9TFWI3xrKK8mpziM8VaSFWhIdrbstqob9FtwpXQ7Du7XQeC/+Zt7+yxSiwFDZHeUqaO3ias21kkpSiBviK7qYt/GOMw4ir4th2slPMjNAVTGxp3T6TQazdb/B5Vv2XcblPpLhMlwPdUAAAAAAAAAAAAAANyl61JUrl5dP3X6UpUT6Z6upRCG5jl7u+7KxL20Re7Y99Q+iW1Hihgl2mN7H2bsBMZCX+68TcjirdPKrY6/wacUzVbyTt7sDUuKIPkFIRMFKwhs+ymxZDQ2uMjaoUBYBZwSROQYD/7lQA+259T0A7+lTHZgtFeY6sAmg8f+Oa725uV5oTp+1vU3qikqEA13p+le37+W5eJMG4U4fd0swkbrvKPy+gqP2iPlzjCplNGWr6PrRMwTwuVXmDUrAmamWYaAY7KBiQgZXf1fQN40DnD8JA8QrniQ3GhrKFhJUf6Pr5NEZupbuc/+7GNNDv+fSMuatrgqV5UUkZlRu40tkHHYSJuqqn8mSh+8JyfNEDnFzjJI6CKJq4wtdOpwVXzgPWxxGVMPQDbgvu33zpv3hGXxJb0DF+3djOOuqdMyO0AjHP+daLEigYoASYAD7okHjz5Dt5m0gQZ55x0cc4y3Q3KaK2zmau6phv3ENgIvVtqYlYG4TI7ONT+MWhALa3FHH3G7TxwQ/25ibwHaZQXoA2AjxHPgtA8HSlcXLsisVYIMPhhci8n8no0uwesL0P7FC3JA0B6XpeKmB2c3fAp5gL1dpcvNuslRAM8xs+8Z275MMy5ro3bcSxRo2+lDwrsZq1hvVVkSD0igi0fqZMldDdJNELI4MvMkL0DUbqPm4VOVjPCxY255JcY1KQSRtrsK1pb/ij7PgfSYH+BMd5eo98DiybhB9DwVz3QTqxbD6kUlNlZ8OkNlagDr/stsU+nEkw+/Bb28VpJ4VTCzXxFpWgjIIYpJN2FixlBhcrjtsxTxHn/TIzbYoWTbD1pkjUWoCaAAAAAAAAAAAAAAGKaP3AXGTir1erdg4/mH3KD+BEcoiZw1en4kLqgFpvqNPy3K8HHcsFSwI1qKwQWRciwESml7x6don4wH/mri2X+Al92x39zBCOLkJOa4DPy2ZS36VLj9ilMZOCl4DF6QsW2MsuyKQvMdPtTB4ZWyDWRjXaSewPg4HrZqn7srr2VaylDCZNGU27mtHQ1GIlTnXnJHWkT4ITJb7VHIZHjUuxw8Mm6uDZINfHmTGdoEt0BN2wrbH5n2MEfHLY5H6M1NJFdtghLwo+umAGdUWhmuoYAdkiFm1/u536+C0DaCSGHs2UP43Bk/OJHE8IenwEKAggBgeIgVvIfHlxO7gyIl7oiYTyW0vteFrEwbAM1R/lCBlh/BJiZ4d+e37kx6CIdZMscDbEIcsrLgfxZqxm92ztFlcqQM8Hw2Z0CU9e3NIvg/55mqLwob0sUgzo8aAAtGGFMVZ+gqx6cDdmvf+pC54exDcRawog449oLyOejgaaXxvP9IACRLKfAuS+THqahASWYWG+JgQCVRtwDH+KD/M7ARUbuMl9V4UF+TVeekevPMs5LoQWQAXIQx1vYR5Snyauob2J37PpkDBGH59h0bBtjwPQNp980Iov6x9uXfcfFoFIjoA3HYiGOlLihtJ2jnxjhOTvhRgAirpWzSABgt4Tvh+hVs2NxmI/OlO+BU7S+5z++3QcqETVgSCFLItfEWAZjln8eOfx0v63G8Y83PIVcj8/sMVLlaRPMBAJZqZfVIlGvMXTTBnfPbh8QjYroOqaCvY3UiqijLCSmTZOszqAAAAAAAAAAACDI8bQOUWhYeETfEIWHOBRaBV/3nSwM4vVlFkSxVJ5spBLk7T7MvTbV4YzoW9oCg7zDAG29vRDimr2wA8EOXQVIJPMhErNwrZIwKX/Ne9qvmMAhXq+NW4fKuVtfL7G3ZUbYD3uyKNGewd1FBdZormnmfE7M0NPsCGY+ZFKwBJEQx0BBapRUXU81pLVOGdBQJn6c/YKTLox9rVpqeBXcfUaRcyY0DvGdzOwh4pyUmTUAH/4pTo7ufH3kHSYOTGkrOkY/Iwt7Z2oAhSTIUv7h937dJUeqqJJsYBybuoWznGM55AGTW7KnVdM77hQ4hddT3rdVRZiUWuxDWnY1sKbfAlssSIOAYzagJpccOezzdC9XHRNdjFUziFptoMutQY7k3ITOQvuOu+T/iQOvvQ6vJ0lgyWAhkWTBmEz8/0pebJrlWKuXyLMZVbS5+w0A192qtqxwTaw+/fiDs8L2N/OfBuNnW4rejgBIxb++hQW609whPL1f6gVAx+JDjvPAkQrbZsvVHOL45JxntP8jLhuSpK4XBJYnFe3zWoHMF6TiaIxGRhSNyP2MB0x37QFxpJW2UYKdR9IA7z4JpPxWWBqrwX751PS1j0P3wbaC/NbeftwPIR8M6HVFG3K59MoQqw21IPj1VK6CQFrylEtXNKd6oZL5id4cOYpGg3t2sfpjzgY9YCNT5gfzH+g4nQixto6JNIjpR69NYbV5G4VvnrcSFkdVyzAksLPBVsX4NLqeNBRTmCMlC1ayhn+/OkFWD0rWCaWPtySQCD6hPGJVVx29UMZ37M5/scbZXj7Z+7qYBPSCNOLFrCP90sAAB2M1tAc/SyZ4Ctwxx5nd/vI0j2f0lF7O10751gAAFTXp8OMT9Zoq4BaOkuYgH4Y2tupVL71ZFiG8JLvP7QPgBf+DEQS+5JrdpM8ZAAAAAAAAAAYtrjGArlhvlQEetdTTnWIoJBAujkzU0/P6pQtpDy0kBFlJO9ZIAOOTbrRIKkz8kbqLL9O9ulWyYrvBAR0RuFBghxKtHOVc+g/7t8AYeY6nVoQ8iuikYN3hSSe2tUfHRUfUvepR6rmJ4uNK+v11Rw20PbpJED7ieMUEGiOuCNitX3pBxJBSz+5o5F+b1t+JC52z5mW0IwvCMTkTVRFaOrdBEdYinLEMxklXQS3eYnCaNceOZ3RX4GiOW97bCxIJJj9rKjWTBjTInmDU1rVzsKUt69KQFOtm/QxMlffEh6o56OBJj+YarifEZUK4ghmcBrOEuY3rYL+wQrGFOehVM+zHCaxmbYkepuZA7BDaeLRe7pclGTKGkuaBjde6UKlwfIoRcYywG+Jl53NRq3Mlms1wNkEN8Tln4eGE4OTtr3cVO41s+L0A+8+f43FdcOWHQcP+C4e5noHV4JfHTecNKxktpddLQY56ENWL+c2ziNo2p0b7U4fp1DCjr4iVDP0g414z0PGH2uetlCxUk7qXvPPAJHnH4VkjILXcImBnh8PdFrVICIBUEgGwyzI1qqqKcSwyVQQyjNJX938wgASJwaVFnG/T0mp4mY0GhjC3yTPtKTk7Dz44yJYE05jbNf73TM5BAKDQUzy2XL14d7np3vFuzQ64CxGKBCQ8y+OO+Db9FW4/CeXnr4y1Ui8F8/Z/9havoALKX32Jzpb2qf6duF+oZHoRIAoSqvt/V3AT/6CbSwzFjkGF2MwzwZHi+sXOTkIFkViUGoEnGZwXqTdq21LxUikipMcZpo6Z1QlEUx/BHiq3bwIJYjoblE4Hn+CzZkBTA9yTuF2fOSnniDU3HeVv1538putj+43CQaMAMFJ21ehz9qlT+E03Z47bODqMmGFmU2pi1x13Dg2qKFS8JhdY9OfH+YfvUW2lnrMy5QDPOb0UqQgAS/DXyRbkpZZtJ1gACb3VP1zjuIiJXTyIHgwbP82Sj1nnQcdaoxKdh9J8uLYW30QphRO1sM7H45pi/S/MB+/m9AAAAAAAEnneRCWu16A3NG7TTjmwBBb4gXeqFrarG6CQPbemCIvPfPBGjeg5ylzOwsi8nxD4RxogzbcMGHfPNm0iHhG6vAlzudSoxThI3eaRHiPwS2q+qGv6+l7LJzfuTu4l5kA5+dkoDH2TEC0+Fhwv+EWZ+k+Hd4sy65ZvGpS/aW31IspfS5VLjsR1WeIJ+XxEFcJyTcnHsS/PgG83z/NzLx6UpD/OhAZwq58DH2ifhzvz2cyNxPwbxWIm1uDMyoBytoAnIxJIqytO3bbsUsJKKK9R7/UADjHAtSdizGpQYzoQdCRcVEnKk90OGNFHeoFMDz4grasDqKQAz+6p1FnPm/rwK4quKXdagz9KYCT37YnjdBc6nzsWa7VCMP5qwW1qi07pPAMO7FEs6bFOFtm3eV5r06NW3tWIjiPsejQef1m/BLXfYn535ENfeFXBHcOJOMNi5icQHna9caAcw3OgTlKRnoRInUM1q91X9r/qDtnICAPMzsPsr9oiO3OUS33dfr6pNV1FaQIAAFrXNrHJZsW5VxPtmxN7OCGaJ0F6UamjCaEDEta8Eghcm3tHGQXBCISzkyktXx7L8qxLhXV0waxj50rH3CjAy1eNfPZrAOoRp+6l1J2MPxUwg93BzG8uB+o1QFLPGigIlk9wJJRYZR9AWwTbeSm5iIj3R0nlVY+0FsuR3KTGWna2P6qPK4zoOWmlwYwZtiYWh+YySBQHhb22cLlqYUjbw4WDt6gA9wISrS3MQ7HHS2rw7sfVweqJylJJPmIx/w66g1v8r98oJqIfStMkbJo1mPWm+k44C+Dm8zqZ+UPQBycbF2rr5bhLdzYk3CX0wKh+vM/66D8LQdYwMF/l1faRZFkqvkTv0YToYLM1dB0g8rycLjMaYMGURfwfbKL6cl33vNmvjKzZqW3gOO/jEKoRvst/m4WmrE7LE18GT6Al9vJBZ/FS0+qeV4icPL5WgI9IHSHyIGntB4Cnryha9MxkDWwECCcuz3LlzMOhZjOyQbK9K+CyBFDGo63HNH3ive/Sc5vf2yJcCOgBU2vH7lU4SSU3z2ANot/RO98Eq213WZdW3mevKLn+LVzK7tEQ9dO8nAoh8G9d7HzI59xcb3vtpM4gX3DZxp+PfcOFCNmaq2X9hc5+eEHJMXvn3cm78PF3gVeB9bJCvZ85Yz44P8M8F4tWUMjP8uMeoFs+LItzT87bnB9o4gpheoEdqweyU7fqTaAAAAb12EDKpnCaYvPc/RHkteLS8TiXrcexvyj8XE6kgC8eMm7MoUso7FGhOOobOoEGbH0fay4y3mvy3PWnwI8E53gvicgseVYONH3Mkmk3NcUyMd+M3UCbwK3IhBn9NsIlTxkxhFJ+tTNgeNEUmRbXVDL5EeGw8/PZ2s43yJm7d+trllqu3ONnGEJcMeW7tsjBj0dc0L5xs6YPIAEo/2Upx/PnOCi/B4j65Lf+QQsTnroSmGggabF+2XXrmD3f63maVfeejnFUIGKQLDs78sVIX+EmOd58j6af7djGmT00dODrlDel9RLJN/dRDRE7JZR2mbAGgiv3AhQXFfjOSGXs2CZBJoszdAClYXZy8/TCmsWCebHeU3n/9wPYtFFmtUTbDSoaz7FK2LTHMGAfKA+9kkZOXuoa40Bh7z0fQ36tE08/PwqO+RWbCID5+modGKskLhAseh/irACyhhx0Oxw1UoeExeS0fK4+oWFTpu4t16n0hXCppWvLlT8Jqr6ta8maAlkik7qAy74GtLeDq7vrVhSxnpFg02j/uClxqLmr+fB2cCoSOWQwjpQIeNeanUjwYYrh7I75LkKz0sEhvEMwI/yI2+XdvoNQl2cKBMuZuDrv+hyAw9X7HUiTROP4AY3WQji8yYKt/1v/o6d7+gH/do7k0N6ViGCifR5GvJP+AQq9hwMjmOvris4nK0+RmqQyKFXqnrMIZIze5Z3uiPRtZoTuMk8QGB4JHtlktj9TflY3Caw0zUMthYVfnAliDoWHVOeHvP+X8J3Ud6WraUjtW2ueWwbG99JL1Vn7PEddP6sEGGOyvTiFrl5+cfp77mF22nwCsnc3idiZMTanilbSA6QNMx4uf4cw1GM2Wop4ub3a2Lsi3or/KZHgL98R+1eWWMWDUBpT5sifkPrmlE2D3+Bs/nLcGHTFggy8tfKnzsJVDbgYJOyg6ODakvHW68UnFldMm19oY1Ig9mw0i2+TYIpx5AQRzT3nRQTdEfBQd6fMwu6cpmLRjXQ6KrN4nL0AJ1pzd6+dgGivjQ0kJm1ReyHAThUPlWcfcd4TWzhHyn4DNmsR+4qYz+I4lIBlt1BF844V97zet5B/uc1b2RRmlpxwCt17acLwXuWEkJ+sdfHvCexPesCBCbuf26r04DY2I8LakmAG7NfYXBHrNrKVbhK9ltB3LRNGEDxtXKLr1AICpxi6RfqO4SJ9/3N0DHZyKbEqv18iTOkyyY5q3BKs4MBlHgDLsoZ3dgehU4+NMGPDCFpskBKAZV4Sfyph1cYiLDrOXzU/mQFTiPvflCcCWF0X0mwASaptxk3Xq7BIj/wI+XkNj+x6fKdLzzGrHsdO3GhyRLpIijz+8N4KIl4nrNFtk+UAc5vAPSEV/C7G0/WtZjtGoWwlMvetqTkqctKGy7Ixel3JmuRy1WlUbZujfBtd94fcTnYNwj/20cLbXacVjcbB//jGVhmSx6xOM40p38IZYgLKZOIVQa6ssgJujMEKk3CreJepv+4k4EtuJZvwCdP4GKv7GGY0BcKrSTXQBnwXiB5kUP7bro3pJhs2hwjYI8GuYziXihTqUiANmTJLJTzlVInZ2btVaJV7WiGjtWVGCo5S5qUGvSB6w29+YYarguaoHoE7szPudFZ67FjXg0nLcnzhaT5gMMq7/GLGR6CbGrzT1t9+B8LnuPUHqvPouul+UPcnUtIMIkYr2n8VjcRZfqvJxg50c9Vz5g/eJ9mdp2x8zi44gm5Wh8VUIn3YnugD9t+FkyByq3xh/+4VEAuHza7H/DUoiVX78qNskcVrbZAAMG30eI8Wmnrke2dUZ3uqbhCb0gd9AryjTTnU4h2tJPrmo1nU8FonJLEweGB+wUWevCzFrNCQLbAiugTTKJ/YL8j+QHyshWiqOGC+Zbl9CgcPndeqJqiEQ51wLFbF/eiVyEHAvfP3S8e8uCJmbzplQ4MTUHTMJlfKiHNZjHJ/gdH1B9ts0i+K6SVpgyuCuI1Suvsv1QnZNhdz4Siv/r4otQnn0QFcTiWJLpd76OLx9cPOvrwAKBQpFb+ZK9JZjZVLdWvAuFVuKO0qgEWg3ulgCP5Aty2eHbM3Bh3MVVdaA7ds6qAJGsmx5e+5SbMMcSbfmntUd1/i/2116LzuoRNv3uTsdE1424DBoeUKEHJZjMRJ8cS8arcKUSSb4v6Bz795T45UFpy6QNwKQo+Rcisek1h3JQKGD+0kDxK2hGBp/MP1UfwM0+EMl2LedPwHrZncre7vRWsEQeQQwfzZmW1NqZuPbBL+0eCLp7DYw6sFS0q2gIX4eUnMrvw//iaUyGK1mx9kTUAWtWiGOKOEMoVi4hOsfwZopBz/XMmpoFwo9YExfJo33vA3nc5wPhCFgVIeKt1boeN5Mq9Q/YqeZcq1tfHsbr6wWU4mQNesbVHH69vYWiD1RWi+dKnLWkh9/khYDpH+fDO86LGsHAx8qu+uNPH/FeDTjObZ/b9eISLH2KS7MHSi6fbsoY4FvEkco174/zwdTg5TBZQ5In1j7x0L9c4PdQzwclYDG/VEbUJHHMzb0UheSggDgE7Y3nh9MWfmWU3uMznbpqIs2kOfR5PmwCuBX48DRFYIGEg3WjEOn2DKb3xHh0lmN3cdLyfVTBv+g34BXl41pg7gUm+95TGNVSUW0X4G2URwqXrclZcNJWMHuuALTbAaDvXy0bg+k+WXsCyC0u7kyT4ytjrNH1VQcvjvEGDdhhbZAbBsL1Ri26O71mKK4k/iHJTaGQa/byQ9DfMtuDCx89r+wBjZDQlxpHt5EKxjHKxCgD9UmXJ8mzrKlYRS6XHwjBqANWt2XepTu5pTb3qo/Vvz5XxD5YKC054B/xLW9iwe0XmTZFnCgg/LJnXibDuwe5xmkWzpqL++TmLiObRiLK/r7G2KVfC6h9LgVQ6mgJuW47CPNTY1FVOVHlb+1VeL9Gtg1mo2WwHAk9BPv4RD9M1ZVzihfQYT1sqlsCl7k8lz/ouLXgYCgu+ubaY6mdYnBdgFQFB0YlS0m7wpnU4r8OLjOjQO1cz3l8xbhfs1gG7+KWZK/PHSwSIZqVFaorpztAZ5HDNYm5+FbyIE4L9p59eHClcqAsNcxDgHkzGKbD370vjSjegE58IIddh/+OsqE1/vBkDujZ7zyO5EfqVc1epGt97/9CbCfs7VMsOYapXcSfooiU5+avQGJDFWpzxq1ls8NMMjrHBTrjsFyFm+cI7gbQnnu/PAacXkToyL4CgudMpWO0UB5ux8BVFCU8AbwF76HNXyB/S5Dm5MVUJ6q48Nxq5ggX8kP97AFQthoJRmxCjrR1PT0rU2VhEMw5rKJzK/kEb85tqS/rEVTsT/AkUkSaAPd8vATZFcksE5GjXaBe5E/y0svUquxhnhJaaL0Ba3lCU4IdZqtz6Of4MOQmGagXxlowfEURDC+S/Ox2RztdZrOC/xc1R7+th0KERom4NzKmTHI8Pap3IZmsb5vPaBHul15dOleMFHXw6DnNJd9YDMWItPtOksn7QIwgIhT/SUka2tRBL1hEtLEXbm0/UEHJ6GuO6jnIyOGHQO8v/XhyZ90OfSs+1n3VmCZw7rT4VaQh58+9gEqVx6r7cYXiDctlsbwBvbcec63CCn354ttcneDSVwpK4Dp4od4xy+TK/mbUJ3+FmDvQtPZFDFNoeLzsXqBd53O9DrptUo6V3gOrNDcPeg+snLIBE+SZ28hRlXwxwbvuN7IwW8tP8HYi4qIUjRbZMbPQ/vnSFdvZKlEW1zIQDW+FOdtEaVwOIrcffQvgbh+HJmxeja/Q1nxjWV4vX9aCmKEdh2PyJHNPiiyBskKBrO76geB/FErnIW+Br0ohthTGNeR/20LNz1y084PE+7x0sFGSNz/iuaUpo8kHi/wqkPRyRvdP3rfHHo0mmHOydABHyvLk2ZPykY0c2OQtThyf5ZT+UVuhQG7WeuBTwiZUcRjSKiQmmifP0eMSoUP2BQfdPbOQtnelp6BSLumKr/H2PnwJ8x1nGohIH7I6evxO4HmvxclXYQbJ8RJLIwhNmlpHXxa6WTspPxHOXXqKSRh7vbyg7Ns3C3zQYEJY0WUe0iU5iF+ZNYE+MJHs5A8JpUsIbYELiQhxp2lAeK7gV0jxNd/55KgrI4V93FV7FbkY0tcrr3f6BghfWwIa0IU6PEF0ZJr8xtNgkq30l0/SbBO6o7Ywrd2rfd51NlHy4ePNdWMYGf9VcE9C9klDuypKH4q2u88cozDsT+wx7CssQpYYdklZnYjVQl+FtHMN1Fg0dcT/4ll+0dCqVm9vWR60rERXzaEjK+qQvGdw877lQN3oUzIDULrtSTGWdJoCit0xdq4noaMMkfmxtOkL0CIFNLlnBPYZLl5ajl5h72vYETbLaj6VH/VwjHgVFRNbqZt6m/aGpDbsQPxeUMnwiTgMkeRMxsmBg5ZAFWvSPHGbu72U7gOp+3TCqdCm4JhJo+GOtz7KZYxWNkYBDTvYN4B8PfoZEw42PZ6dD86SambZ9clDSdkpMfZg9A82c4VxTCs0rS8GPkb9BiW7v3VWVj62xqu6VJYvSf8/cWAR7pUr1+05B45dyxca39Ur76oEjX3zz0wrt5GrIHyTMSClrFj7C3pjdmhV9wps2zVhFkO0J8pWTd9AFR79SIec1wGjio+0/qo/QDJOK4iFLSEUnZq47i1QBGE2RjzW2RJWLiCykCtIIm5UlXrtdIrqquUvG+0j+qXBdtrHqW/RSoK36plgZmwOdA8OVxy7w4QCHTWCJXSiNPGfLv3djXSNnpLnUc3OFfSJq3l+rdeXddw9098F73G/Hrc2g7Cxge9Ybr6clG459LFuh/KeKU3zIxSYHhpq+oUoh6MdP9tWfMtJkSmlae+QAxpTNhLf5n8gs0oGjNmrJtU/2GZJVQ4uWmhiqv8cDlosTJ6vztyIaj0coskOIQfuYYaPpTmKkXCT+CYRB7vwSwidxNz3txKqzEysUVjEr2PpiGIaRpTp/YSY6Upnxd917wMeMgk4Ra2Dl6z5Mtkql/aVLCTPDFvR1V+/I0f0fyPr3Mzyk8Rov2e0ZucNVmniYZjdvhVxOvcPBD6kZh6NXgSv/HXA9FGEcJnQZtt4J/kHWH8AYo65qYVGvXtu3L3sW4O8u9+qoOyyJP/LfK7ceEzn/XWUMCzH1CYQK9hRwEOkUfflgJieFnCkQ22I/HOCVrJGib2VJMivd+ycF6qPBNW3T72OyfC9qT7qVGFbByJtJn3Vw2RmpZ9ACoIzA9WuYMTd+7IlaczYF3pzQbyL9Zr/jjOoHtc7aBMC67z2ONPo8KJv20ANjZpaHHyiHWKlz7IPjMnddOnk1OGUWLS99H+7KYm5GVrZRbWE1EOxp92UPIl9WbHzNU1LsCgtneK/ZrleEiLQl4m2zKmiJkH9T9+Eo50fZ55GW6HQse5+0jX4kmhgXSZ1nsNw0lrTQWtTb4TiXZaw/YNP+zubwIUMe+ynO2skw+5Zg1/Kp3C6vA+vPXi1fxeqLj++VFn8s7b96G7enwG0PhgXfZPcq2m+XUKjTDAjkVSJnkfYso2tGfPvuYFy3xztdd5tTtBvgUBQ9/vlcYMAPwX4J57pZF+Q/QsH6RB89AWyiToO53dXe+NYTM52jnnAt/WBqT9CwFdcjsdBR64SzUESLVKt75gJ6bnNW3IplsdCKilTNiICyOS42FTNvvP1cUnF9Qu482Vuob+b4+jmDBrMaq4fSznXHDqlU1NQiXyumAtC/C2sdRD1u55Gh69uWd0j9YlHaHYQiq2SSgkZ9SxPe7ts73CRcgK3jPT17v4id+1WP/wcvPZjRyhS0u6u6fqB9VRyMmaRE9ltk8WlUT2m5W5Un7VDKLKVOWdJiMbe3NI73G9kGcCZJdiFLAYVEMJzxMVgVbKgPu7I/5iYAqmuf6U/5OTBEan+dlSH6gBrtQEM7PPdaH/QS1oKvwB9Hk+dzmhSh71phw4iRx2WwfgZASXaHfp/2Zl/NWS7ISNzkIz/rNpO8Kfloy0oxzV6iqe623ioEmXB/bCQ38+rY/3bBFilL6rixNKp+rHHNukFhhaPCKOA4wcovKUW+Nd5TpHYGQrUAzo2e84nffVORdU5fFVgqvTNZnSSkFgyV5s6dfg3G1W5jjUotkMUWf8qrB/bMZA61dfCw4GhoPdxPFur076j2NdUG5drL4pt2ROEtA4+Hk8FfDVeP5PTVIuAeWjc+sH4ciOeQ0861hju7JEp5NtGTMbP1kiyWixVrIr3Fc3G9PrPoUU0fRqEe0q4WLTA3K1aYL6opW2hS413joTqs3os8c4lEMZz7IZn9sCSUlN8Y/iUr4G7JGKCRmwU4kcMltswdeYiO11mc52Kzg4hEowjmMLwY+pQd8YNVUX/czjCJk/JTkyjj60OzEbf/SWS+aS8nO9tTrUBIGWcjaiqkKh2iy4GpM4mfGZqOyUjZ8ZYm4qLawhYToHmIyEhJuzqeJpIGK8hnah4QIfpX/gKfhKL3gxTThPu4Kq/DwiolMt/ET5dmtw2VQgYQanEwmEW0PjJvISmVnZpIxHGXrpZQut7S8RukFUvIAUJJdSgwZAz7IWegz3NM9BcNyJdH+CTQ11zwS3G/tBkpqceMTx1M1gQyL+y6Y5HTVv7S8H4WWgJdNq6kJAoXV67bZ42c8jPHqokMf1YHMik7HXTVSuV68KIkh6JxTN+O0NSlYQ+YP/Pnzm273lYsid4pjU2Qw7C0Z+EavZdOqJfH3g3gnQMM75oOeSbrNjy0qi4K/frjrno7R3bm3+e9GdNJvt7ZvLjrjP8zoYc6aj0yoUFeTOuT4buCH+qLpfxgoFugotkIuKGgqvx5UoZriDWOzi8xtWJouwB59+jjaCSNY0F28iZ88OO6obSfpEaxMH2Kx8/yMgQ8RN5DulW+RE/m5yS1Orl+GY8kfhC2ob9R79jEUfkFhaWIQnnTAUmBJ9/BajsfymSDv/DLz5rEJ2o5PqykZFXuWrm72u+jnj/QDiH6p77AhURIIzCytGx73pfu/8Z96aNE1MBh2uokR9RQRXIVzKqDHrJ30caxx05+DUFHLJc0jACaDxgYeT25FxZR1TS2ZeEmPAcDcN7+4SDzNxwPA9puUQ50OkhgfQ1FpeUl4dD9/mmSY0+P2WygV99fPkSpFeRD41k+5gME57JhVmCO4z5yolAjq/Cogv1Hz4nK7i3x76obwsLtORvSrUboGgQ79YM9hUKisgSHSStBwW3ukYx/rWNpO/DnR6XMmyRSqfhEFn3iXGWQwbgg4vXLwnxemnbtRLlJpuaN1+ztfcMWVLGgiqXwDbmh2mXOM2a9d8XTOMHGSWkjsE+LbDb2CotfDQEAWLIs+UKJrfalSbab6gDtg8P0pPl1EP1BL7yRP7ivNxymEkSwWNXKUv2UqSGFkVLOYBYbucGo9CP80ZQwaqWWnxf6CeSR6lzB22eKOJ2HPNI5n+Tr1VvyJb4Qlc7Go+bbDWlQUIWkbdXfjrEbTtExG6cRObiIdkgb5Sz/i0HdMCRbDlicQr93Mkj3cJlLFKbuSY8rR8xUPHGxaraf9P6kWv7pNAWVx6q6uRMXSB//YUtbpGrNHttqeGb+zielrkKnq9SaPrJ18SCuRfxQ4uT8J4t7cdn/irrx/QAfyjQqs00ZM6WOMrAvBu72e9vzorgGUUy+aSVVnI+euLMr95HQccip134jqR6GntXp7v2GzqTvgGSvSqXGG1dpwz/5+236jL3afgCkrccJw7PXH1/vUyW8EvNvt5Dknz+ii1yLsEH9xUB0bevMgCp1FRU7N9ADpfIixFILogE6rgzhpVQPfV4s/Bi+/dBrK63N6xd8b9OVo8K9Z0Q2EsDQXUA/cg6D5kunMZxPiRm+OzqZPlWMboOpLCGHo7SM6cAp0Pbx3oo93iVjREKU8B25D5hW36CHOXGriWcRqVm+jSg2LEV85L9cn4B1NiBBvVDk64uz5A6ulojpU0AW3L5jWPXZb1B+wJI6LXWS99adB+fjuOPTfwxF14YFvSC6ovRdn63AY4dz9hZpWos274Cym7P8RmG1ZV3M10mZG9BpUPAfi7QvVr9BDUII+AUjk9WkWDuLXEIbvR5zbLuY/ANNi9bNHTicUQ44PZHXzCfn/4mL1Ak1pAzCVYtz8BUW7a5EJ/c4ZnJGi2hiFm/Ejyb5WFT1v5EamgUoz/tJlRpORqOlS3m8Y0ehS47gDfrrgr/bZnObGQJ2scZdc9gONbi3FcJUdRU6pEhStS7pQ1z//Nm+iLrd0/roxW+jvIKH4d6MrEO9HfChOVA/cokAi5bOhJZS4MDVsr0+SqtaOxjP4+Q5oqilbkyPwODAeqYKhEwdBCHtFNnXZqQ8DwaOavaWvv1cqS5KkBNxE+S5Hb11z1JqmOvWV2sd+Yr8mID6OcdatbqUhNRNUwfuzYH0krbO1jGiItRT7QYr0FX7ZpHk7CJEUB5Nwhkev/BSc2sYRPfBL3sQU2w8I6eV0dU48mUb8wvrAigsgV9QO/MQ0EowpTzvhcDojLUpBEh0hW1vzyCrBw/Cv/bpLhPlLcMVfCwxVA7oUcdhvxLRPHTWVOUPXuSVMLkV9uLA+9rg1bAn1NCS8F3LLpVmdylLdg+fM+SrNvHC7BJziBpWfC8TBTENC/r35vv/PCCvpkhLucocHSnEgTeCZxssvOL1BPti+fXHfECOgcNjL9zSBBs5gPXpYGSsNzW50mQdLuOCtzNUwqHR5Bakg5Xg0xEZ/t0PipYQ+zWXpBBCJcioWxCsw8OO278Yy1kjsbRCDLduo/oubtvsCXhj7eKEL7e3vPUJMR+zQSYSaFMJ9bX/YBjHjAIeKyGt7ArWIgpGHQeN7rEOFYDHXq4ykm0iBRTUwldabv9ODt0trY0yXJjrXh9sSWyc4HMxCJckPQa9x2VKBS3SQNIJQrbQT7Xxajc1g9vM59fbOSwPce84ED1xTqtV0NUbuonlhF7P+XFTre8VEsRmaLyUgwsvBUEmd2ENH1IelOH/h1JMceIbfQfrmV1bmDP6QDIAaKnKU6eQAay0G8yxisymaZS0qBVF7WgUWck9RZw7FkJCVjDX/UJZ119VNnTB6InzJS7TPzu3WtNq3h9NMtK0WwbkaDhyRn+gwe23hDusjQJwQeU7n4Z4rrxtIFj5b4H6CKp59VfXfAot28+PGnInrNIPFn9ZucNC6D20lAI+zpW7TWKCI+W8RxHnuXEyhSaNq817q0tpplEiVLsAea+JbMYca7T6Z+wuEL9jBjJ0NabFTTrF0suC+Bf2Op0MWvoX1iYoukPQMKi5D5GRYN3F7HqTjXoE4HHIYusPFj2QZvnyrUHFtPxsTuaMtMz4lUuNJA/4sQvfC8YzLHrzWUtubh1od2W/EROHuAKHDKx8Oeq02KuZhF+xq3QH7RFz2kpVdW4BEB8doRiNchpmtNS0aXvUe7chLo3gIsp7tIPlYbbju3DwgsdbXv8LOewRsYIER9aXl/dIcK+3aIuL8TSQY8Lklf71DAQs5DyCW9dlRq08Kum6S0RyHhFQGeUi5MUTUNe2eAeo5BwxynZgM3cnn2SYjV9ChfQv88kHq8fTR20dgMAHc0r4oiEQfv2M5lqeB6Y8v6WdWP4Ha6bnoCgoDnqZm9hVmawJpsS1bXNUy4bAnkh5jXrPvm6mfzXVq5B8qMXaM5Z7zQPgKdiJSBmVbj9BTQ3oE7reKrO0Q/ZVrNZ13Ie8FbpXC1DYBpcGuaYWwglqT6qCIGzbtMN+kVczuDDeQnEFn1l/PhdThjpPwXqOd5eZjzrdeXtbJSP53YdgY/sNbPJn5zqPdJ2oxv2tQTtW3xd5O8Khy0LNh6UjlU/Z9lAxn5NnKc5Zw9tSqMQIxgzPwVWKQh1p90gF/R54f5TPpQDv5JS1/TBHUUWiCI4AHDZCyF1Ef0cETOqAIii+S0l/eCfASeY1MZYkQXHlH0GwnPDzr6HtbSPtOrIXsJBiWcnnbmkmNEMMBqhxthKp8ighi92LnSv8UnuwH+uWIqYh8/liSabrk3Rkb+hXjU40vbaMMUDF5MBqzxfBajYhaOp3+Vdc+GO7tAGFpOjJQZyl6Jm5IT0CK+xPW0ME2/FucgryNBDdbRTZPEHF6UG9p2BeGNSyLd93guf8gfbfY/pM2DrTIKEe+5G3TDIzvoCfhWMazW6e8DalYyDVAa9uPRP55FAgh1XQvn6OnvaLgv8tSQD0nX6kxV7pM2vxkzHp8CH7ytwd5a5z1WcDhIEXpjoVUQhuR6sMdSGAtkCXXqPJ4E5gSaoWQSSa20Q2HjLUbIRp3UZqZ27uJcFg+vUhqs6qts2oPS/9mBQDVjzp1R0gFxm72Hh8ZpZw5qtMhX5Bu3Q521afP4IvcnQHqX5BSPkCCOI/hMy5fwgmW8V2tuTHMGWR7xdSEu5kL4woZAx3YREge0xerX/K1cLlQ72D3lCdCLhLWUohhqnlQBAXf8CEj6kNv5oM61vbaNrTYrtBHBDn+d4rm7suXeVOscXr/CXN2sy4ZEDbVLiRdyQ4YqJe7SeLDsImi2N4tdRYgf6prIV5UaUVFiZOIYq/FD3lHc4sTWWtszLII6yMMV6KNO/EgNFbX6WnwoLgRCdN1vgbF3jREBlyUDHPKUYk0KU19IAUM4syhFYBd3cv3RMeoEP/o2Pai7X/ERqfVdhfDGtkf1BAOSURY0+dyTGTTAcx72xDvBl+573B4tpv2VN1eRfFVllUA/88q8obZE7zvdlHf/21EBDxbsyL7hOrNClkQGz9V6JvgP0MXgaDcwcr5fBONx5RfKKeYifrjM/sR0uc5S1bxQuiw+EzZ03HdIWwmkFIGVeeee6yP8bcL8IE96brAZhFQimQ2EgSokR7lEJCDxD4bIrcq8hOIM1SZpeBtWsMS+iFdACXUXvQynosHlsfwmGBH4QmGA0wwOVarjFgBJcJri2stXxh5p3ps3qNKlhP8g6Bj61m5Yo7oo0+lc12T3MH4DZSrkdyWxZEu8CugELD8uxHfjWZsOeMckkW4Hnx1Oqpo+sfT2aDuLBdN4B6iYi/vz4MFWCNxRw6vUAMxMasHkLgq4lNjTDobdYV1W61azuVJN3kUJpmTb3WiXUwsjXchzYRDK2gUM3YPan6m7h7BuvngRjlceSA8fF1bfgtQ5bGFYLcvlgLK1ZatRPGvTn3J2vB3KWgG+xTPjcZg182f0A0qLpwHSinfGWZpsN0B5Yr//oWyMePjOg/mrOE9lIxQRjOqSaWM6uFUgyI9WCApRACHRoFKBD5H3+Fr9ZuMTI33t3qo2JsLT+ep1W3u1ifiwIgNzbNc/vHvna7yMO71schMCXQ2u0Up8d//CVby909yBtjml5Ck654zJIAODbyqjjaBD3ZPzo0JOiTT6lcCsLSc0aP4w1th/G8FcuxNAUSeIcdvcMA8CzxNoMG+gJTLkaL/JquutQFY+3QhSeoSRLl+FqclSV2xrIYx0F/OifMQP5ttSV1wEM2fnYKD2Ko5sYtzvC4Mb3l4l3xaAjAwrzrpr4E6hZoXRZ9Wdi9Tz00BWyEsfViSzLJ0XQe4pK5uWcDPHfJqV7ZoXbvar6t0HdjQH7YZtZ4JdF1b6rWJx48uwSaSEPjT+eqiGsgy1v9ksRVJDOmvPAph4qRTQHAp66bRVTwAhxRItX+wk8kVmYpFI8L8H0UOZNOscxfhZ1vHAAbgPuT/PPbflGNT+PyCM3e6KnM3TVzR6ifRX1R/W5VvFoRZpeY1hGGh5Gsm8C7miPMCzwuccx2fHlzPLeR+shUNTIebG933DGxCqNzU8F99/KDMdpipypGo+f9GYCWcpAUzHywfCnLsPvrvZLlbkJU/Jf5zSIPUd3je4PA7v/IbTnbV0h8wa0U6przWfePhyRJ7KeS695NMWXniLBLkVcsQVLWehQUtTJ3namamDK2hVSFLk4p2ZB+TjtWYU/NPHb2N8+zI/KlnuBKRN7LoPHLvuMtj2nkIOSZ4TWedKz9nZbUqa8wE981G0GsAoeTEGbGjXvcp4Fkx1hrEfpW6RL57mQU+RG32dFKPGuCHQDP/09sLzhZpl4oMDnz67YG1uZPu3fbGBKN4LsnAR8XjNM09fM/aSVNDXYZVslg4wzC8CYZ+uqMkgANSmwmmgJDxETqGqBaVz2aeRQKizRZzMtRzoB1GZl0k6cmz2UZDBE5t2f5JbbRpmk+YcwmE2AGQmtJEwbT8i4OGDXj6v29qp9R/UZK2PUt4L0d2eCUqdSjdU9f6Gs3JUuPNDWa/niZi11UFhaRPUxD4kFhtH4/tSwdV0pbxBu96y9dezf9TE4jpaan3pOourEc3datZWW2CNQjzc3QzeUIR3XnRZOizWhpO6ZIvDbRqPchs9Qb449iudtDD2OVJIsCCuYLy+8td0rYt4N9bVbf/gJTjjdovcS1zPPFexeWiTLO5akcqHCLFz9P7mSKiW/oLE1E+wKQkVcoYyCGsBnnrTDhJ6Z3SQTmcJMTahCgbJs6C8No7QnNJpRy9yPCy4+ltE5I8zFqOr1OQfvE1lRiF69/RYSwtUS/VOQKRdOMaM1KATpJmOeXhj2ySD3/eN2aYsgH9sOtAcREG+KzcXpRRgpcRnBH+UtVf+plnHT+OIkAdYkRvrqKbR2xti0LUPueWG62WeB2bvH+9zfXjcSFcu58W45SNEbQYWZ5E/ImJCB1cKL/3Kjr6g2Bgt7oNjPZY12LzoOEMN8Ld40ZJCobuyH3VGaoaEPWmoG44N5c2W/tZRGHhAssHBbyV5QafQHljfLg8UA6W80qfHwo1ND9XT6w5Ca3VoE7FYePB0ij0nM7pr/t6Fm9yQR0y2VFu52xwQDobQBmw1DIMVxtxKoBs5bCzvV/A9xQ5nTbtpdmZitrODk4Xkr7hgf35zNBY4aDS7q1g0z/vapLSZHq6JumqNi3MNwe+MWwCgvkzuFDqZSCqBk/ok/SMHlgSWbqDsj+wbqIWsulA31ZZrj7hVAKwRhD6u09uqIa3NRl018dl9ndbTKLyXVva5zTs/7VO3yJj1wT1hc2uJVkYv3WBijpmpqQ/6bgo5PlQkk8djwQszL/P7bx7kPxJpgS9Dl+iHaIm0dIISDXTm1nhzJNOeXUhFUKjvJBR6WSitMfu0wO+HEgIA0MUGepixEn1MtzkE+mt/CwMFUBar3qaaCn9vsMT+05RbdwDFg7NoDE+u+CuhN7edjLBrYfelzTmcl58dWBTemjq/ETheOERAIGxpz5SHFuOCSdv0SmSlH5N7H565FYbSkXEvNrGZapL1I8Q4DwUSVzCSqSZEjdEiS1VlSZ5ZhfVIhzn/7PlQMcMHNEa6euR5vpD+Jb4HxTSXpbHFx0hNu6iGnmnzJCuNpvGqexg349QJcoH5uwc+B3LrUPzm5gsxTGuA/h5AV988Uu+fTqJGuBkbcFPKTFZm80u/uhLNKbNUmP9Lw0fBXRlfYoRox+fX/37UD9vAkIvOgEFogDMaMjuep0I9itfLtlH2ghw3MOjiEyzRm2Oxd5u6kR3ZvYEDR11Y+AlM59JvYSwo+2Wi6BgUl1iE/rxEBG9Sb6cSPPkhXBV3khmItCRBw2pnOVPF/1bnl8/h6tnlhTgBkYcqw42yJMnShc6Y4lsOXyg69YvAFxG8cfgH5j34VzYlgV2+rt9RqBI+Vzt6+qaQ2DYi9kq7MFts614/QRWdHaDLDRCxBMhUjv804zfIokV2ORR73EER5U7hJlENZjfqvtz92wWIj1AiHFQtrvi868leq3hUZApCTV1cAen1YOhTdammOmpmMPNLl7dj8wbgSbMPgJAlOIOGOhup4qIsGG7M58I0anwmPUCF0VJTGvJr5+yBXe0h2uCYmKuh/QuFydaVakbYZlkr+KfhRzKffQSQ8iEBV/eQbtbY0Oqf3h99U2uISdlfzQ3+bHI/9BVzHo/q7HDBdaK8kViZHCDfn4z542t2wmqVFafNILCfU3bvhxcbhyPf9ArCcrftA5qIyoRs9Q95RygUGKPEj8QoYTagx9krO9RQehePGpSq6QlASZUFIB4YFnOuvWnqiLmBoGTG7LMd65vj4soqWI9iSXBeiVoqp4jdSF+7q5gcurgu85ZxBzOrjUCRWJN0x3FHEtQ4Iop6CBVex4K6fRIyzOfRyl4z0SWVEQtkBXhttvVTb5lDbeiaGXniR8Pa2ozfxHT6E23/teMtmfoAMdBJQHiDfcufgDGxUK2tdAqUuptduIrY6tS9/AAca8C7WWX3mqs4dtMvgAfugF0UoBhKjFzNIsrNbJ/pc0021d52yiq0ZyZ203p1U1BI1mVVEzrKv9prTYKXQT+NJqVvhNjPe01IfT4742pE8LHVMRJjCS9oY+maEnIPPe4sixTto257tW8CAzoN2oerI5N+qHmfAfo3f0U5o3TF7Le+EdT4oZy29bGpCej4H+WYENnrQCG2svNNlmgkPXlmNBDXq8YjfIPFZ4kqbyBDw4fvIdIURs/f4oSmyxwn5RY+3nqJ4ERBtuZil+ges7skSl5NHBeWM53iW6KAv1/96hIMIs961GPD5ogN2tpNPDUS6hqPAuqRKLqT/+PJkMAwqB5QV0i1Ua3dxMwiEjOgvjjPkhX3BqT94PqkAGg6IMIgs8czTUJDY84+Xr0S5lMtmeu0FJ0FpUcWPvZFE8nVOmxBU/S7crU7NPDrAzTtvy8COJybQnKTVfxGg1KVWtObudTLYcpLPknoNguhjg5v2upITSvI3EnBpT6jUbiw0pDnffMtmaGEbL59L8xdPLlLdnUj6RGeVRcTzrMAEsmg7QTQ1IEPUTb/h04qM7WrRpslhYfdgFaDYvYyJ8l9tupuV02Zn713cysZDxxPy/OQ7A8kc8HB2hTIQ70Hys7dGrZ3XNNiY6CBDsQahtm7LJBRu9cL0F4YicghH5LJ77Ygbj9jcroOHh0i4DMn3JNUQlK5e0fmjBMSARPkAyAhDyxu3PEN3hoLCtyMErmAcXNeEPRz3KctD084zLU3yNtLQf9psCtmgItmDf0nQeqGFjVsI/hqPo4gs3df+fx3ie239hXmqBstCwY8FU01yIiZeASXKQhQ2JGWN4cSWhK3m0Qxvt81yI2EJFLFlWQbN6SEwKgdTcrZX4znd9KrnOtSlUERtpRD2k+Z0SvDZZdyLEflzn82iKp9uBdxdWYuu+60auvYlCmw0Xj0f9bVEqN9VcZClGadCGR0lnwraVRLNFe+RdPdD5rWjx8/1k8btyYI62XPTHZrR+t5iN7OZ1GPkCvj4K7ZrtoGOqKgD0eDPJdzXslX6hLxMM/KKJ8erfSmj/WTvN4hoSd+E6c/jSwwbgxowN2bDY09jN2kq9i3eJCDUmJeq7IQxnJLoDGYvwfksN5UFw8lt/0p6I3bXemeKPUKzA/bdr88vkkvhAnNyYLRpTNvuivUQJ9Z0ag6WzixHrLIZn7hgzu9lplCKsePddIXOt5jO7YSuuaUHJiy0pWjZDXJvM4Kvw7XqtW2MoCdLIOIUbpOIdR8y5izVv9y4yi3/enOkIe9zuEW2e8P2sY3Wo7I1Uy0cUWfxBZdnB31vCYf6wDhmWJYR1lk1Z6KwMj+Ya+5QvW7gf42d5Osd6CRjJpTVkJXeGY4TbHbc85ke7miTV5Y1Z+UnDfTAIMX7mhPocvdVpCZJEbQswCHzr+lA/d4FD0KVqB8VQI6J656eJdesO6kVj9nlQ85gnf89L85LdYMWH/fV2BxOpFqfPcUXSyRo/VkWTwykpw48kXV43+ThRuQgG9Bcx83v6t8XwbeBpZH44kjgWr6LeoG6c5cuTaT9/g7wKV2l6Lab0+4BdNfx8urmaI7aDa1PRAAHyQioNH7xe+Qw+7kHJk/gynDZcwVXJtesVSoeg6TD8oIMDTzWFykP/7hQ3l+bXsUvDSeFEkheKDkEUeekxSiQn0dRuEwy8AuzzM9L8TH00MRNld6Bf+DFvd4Htx0BYr02j/RIJN+XyQSzuAIm8GSSU28JK3IePP9M5Y3KKHXjAEkBIj6huPlziww6sO3ygdtVYam1y6rWE0UCPgZGLhMqvL5OYF93fUvzSidg/UbAGtTmBbF1FIZJIdkV0f1AI2hZ+wzjZEtYMi67rrsvLkrE6w73vparrXUUAmRt6PuPsz8AdT5HbZ4PM6HvPLxS0hqpkOD1lgLPQhTrFHVeDnd5UFsCQjxgdER5x0LWTXfCLEVYiP43XVJwj/tC7sK8ImGy9J/uocuyx6OUDLxtMNZHkxSFDG2sazW8nblX7GLoNLYem7j9FuKdZkk/U9djXfd43Q0QrwMVipPoIXpVMnNepsvqKocTvEDdYKGzud+fJcQhxElZzskrwkyrwEXWlCFX9nvX6L1ShJSQGLB4B5MZW94177IVWc38dKBX0U0mA2zK7oCjk4dqthRxuajzGd8FuzikwZvyzODHJpQ2SHRapfTWIUurGKA7Qu6552M6A0Dud8/YYkE52voTHvzfSNtDNRI5o87ytYUooAl/2+w7oidFdRNru/pD8Qex0SdeTZtMiDvNUZBykN6DNHeHPnbBjMaeTJZoiK/ysNicCJ4qpgY7TSrwSxV6K5kRuLiDISehQmUbKvedOi6Lzpiih5pHpIUjLUpclmex3gzlSZup+7R1JWCrQIHhrU1cThwhy6YqV8ZDKVX5X1+RVcx3ZqDfuqd3l0/tTtoGJRozYcsKwe9TREB+NpCEzkPb2976LkoJww8rWKqz8Jbd8nXsgQ274V0hqw2EpNVmyCpmkI9wSmTwegAM0o+GZ7y+lODSppURt1/42hLhsuUyro45Meyn6AsFA4DSTg+pX/saMJpGP1EiYcmDZNYEK3HOPld/OwmlFoz/2jtvXNJJTbf7CS3/6nAZOCxqx6RAAOWBI85/Ff/rZuiP4UpKq3q/EQkNyz/xye1SQEKlW1i1Vv3clYj27+lPZ83c8Zs8aLkjUyYyvrYOfHxNqmuy4QIJA1/JfrLhHwPYBCgVc1iIG+nmUWiu1IuPU75xFx33BOnmS4IHrN9shDSmqfoGxDftzsc4KbPcflFRDS+7Gkjm7TZ+6elJWdx6bBsDrffDP71G2YWWDED478bf4Z5GmS+vbrI4imn0DJeUvTTwOZ3dC9zUR2CjgO9ulhEN9UFvDtdruEbyU+YgMvRLuPIAUGywOsiGx1zlugcWt4IUotGtpcnzCnh7Uv/ItnKoodFbBn0X9CtvZBBbARl2fZ7NLOi52u9ruDpa+AgGAQLPU9qQ7AMrbv5ybL08l3CTUCihZhEx7ilqzNppVMxIUyIp9f4imDtkdrvWhUjOnBrEQopyvbgjZ+TO0z5MyuLOUeI8BvX15Y1eJhfu+QIgUZweYGpof+DrCLPgqMgDdQpRhwBUbNw5yHtGE6KixsE1u6XEAjfSoB302Vb0F6IHMQOKvnQ4Lfq/TSALa6kROQQE+4s/J1rgnCBECqcPiOh8+t1k1iYqKRr6d0naLsChSvc9s63jx2YYpWVH7f1QOPLIGYIhgzzZHZyJ5MNTjYWRH2gcn646wL/AF7/qIa2oTbkX3sFB4STp57DZ6OzJq6El0l4NXiG6oyeeTgl40yhsleIvMyKe+SxdoBd4419afzoeEgZdJRxFyT6yVyp0EB4f2ZgvSnNaNzjLV0jXXV6UdR3LoZxVmBLYiRt7globP7L0zL3hHqaRO1YNk0vP5YAiey6RbODoPtYH2QkvuyfnklsZqM6phCu5+Y4j5xRmHaD5t6Qxp0WKk/QXoPHp+0FLdZcmtZV3OGMcWI1OHa+x9SweMZW/154ze1NVtePF3KUjc4KTiSrkzIXZuTuAAn04cxwcxHURNcy+Jy2aStbiPAwzAPmC4Evhpe2BJP2eThNkRhDxAEtd/aaCOCGe9xE4t7Qmec3Xgq6CKX2UAcvja8L1eFrxHAmXAyzFi3WHRVo4JsK8KDNMw7bRn9oiABT/AoJp0db4S8PC9R/wy+TO7El7m+3rZW9GytpMsrNgAQMDFLgN2Z0dFexBISWlt1ina+ap+HThkWld7PsyJfi3cc4DUwYOpAEHarSilsZmgwmzOtqU7KAX4Cq+RpCMhRWIfGf29bzknSxtW16vdDrMv32lwaUsb6nyscFOp7+VV36ac6FY6xxeH/lGKm/vo0MYyPOPLDPsAMKNNnKVhW9aocYpfOltgI7iaWhP1JLyOBwNC0LUEXacBRNaRD5Pfs57UuaDltI33+801J6QM7fKN62wlh/Vvnfmx6yAEKgSXvFFtSxjOKvQ1NiV68idsgpBlYcFjBJh3uzG0S7xsTkbPykAE0A+UadeebeiUxpH9kZMF4TGUlC5GTH3I9ZBR4U00DAiKSy1O/+H5E1O+0D95TUAiKckLYtVpm11N285ZC2VorpnEYFwgcApGdQYN0LZN6oQ6W55Tx9beRKCFM2QOilSu/1sh6BrgCEH5Dj6OGXHN7a2uB+MviaMwqkMuH2ppe1Wc4hilTs17S2G5QvXSG4qThA5SnnYOmcJUNMA6unWU9jfNnlUvOCMjqbxRf8dOgNEyYIM6ioBQQvEX97JsK+TShA3iTOywvYJIAjD5dsIIoqc3FvW/hciCY9yx/L+EO+1f3R3gk1ssEH05RqM8guIuWUahKcOvdVerv/zJ8Fygj2wFB6zDqfGEeXP4C6pKACCs4K0xt/VqDSnWYnhxoavoAzrHNyhyn+s4hGySBES2mbT1wu1hwFoZzkytU9Vgzu+umpSNqH3/pyxlFiue2jdbXb5qAgM55I2kt+L68E+xH1U3+fmR0WyYzv0XSg7KNtm4dbzdGBrRE5CD2m27TcDR4m7JXwZXS9gfEjFIF3a+h3YrOeNqaWB4AbC00Q7EdsrFuOVAO1pHSGF7VbK02QMjbSfVylnSpvTkaAHR/aoKlK+9EC84ZlOqqE/zgoJhIoolFN68HMGB52B3jjrYcKSZ5ygrNrMMS3DoeCqVulBiiBz4Iv7gE+M8iCa2ENzOjUMZaq9j0uqFv4+L3XeIDTN8KpmrMGALF9OSeHqXVxcbvnK+AIp/gBIzs999YABLM6Hk3O6xrEY3zGailEs4rrDhjoFBOL5eSSFA/l9keEeWdquf1K3GITeNoWUz558itxWRdZwGCXOSguRuuwKr86eGhaT4MOkp8G3LW/VlExMfTMx0E8nxBPQO+RlY9E7Lqrs75EXzw5+rdohNF7qVJB9H8FlmuVhgkg3J7gwQApTiuV+DiD+zJ2YLZIcI2afOiTMFTlMcRViGWLmGTUndnHJqqyrTMoGGpLBZ34EM34IqYXSI4hlP1w74xKDbr3N0YCnyhzockG2cQVQdmHV86YTM9M+Q18MgR1ctPeagfUxnUH9Jc47fuTMcNM4CzC710w1LhyWoB1w1DU6ud0vcaMQvLuhKxSKpkkff4B3nPfh0N2NLaf35DrwngYnS13Uj1xaAufMG/SzO/4Or9/urrp+7blbQE4S7MVWA9tnSD/x613ExaR2H7BEZZ4NjglV2b0OCE16wKCY3ra9l0FKGVEPhG5NJetG1E/ggQCI40wJbBARW+uU09U8iQUtGqgCcx4KDCE3LxQu8aHh2dbsgXteLXeeN9aDwruUsQ/lFxAuAyRlyL56lbQwV5V6zCXWH4RarkEw0O1zsREFWuOHeR72rr3+40nCp8fY6z/CiERYDG+4tZzrl3MiCMjhcJ2LtHV+B+XSVdMYAeeNo5dOR9kRlLUNRADgHMuFyt1aVcI2bYoE2S7IAcr5Cqrn2HKVpyBQVmkqLeAf7/PPO7yutJQ59T2QVC4NlwtJMS8pEMtP+In2TJdztQ0v7t51Dpud6dRR/EXWs+MCkIuf7lCF4ZlW3Wqh9NVOSsHGNgNvuzOPbiaDYC1nMDf7Dc1Gc1SHq9sDTGJcE483uHirVg8asEENtctoGhjfW7bwSgYH+Le2aetEycWpZG6tnEmYM/koHTdgv8m7jiFXuLZF24TIP5ucs2GcNj9sZ1gfyISOUq9+PJAIFjqDlcOap1UWNf+ANAOumZ0ylAz/UFzWTk0Dbl/LkyTLbp7HvKIV6N65kkJvs/MEMDOHT6TVTz+IdLe2GMQRbQYc4E9bfDNv5JKvt3EELLbIH2FouW7kc87qSSf7wTRG/0gWCXHFmhdWz+ZaWpgrkttTUrlXxypjB6JtDZZHVDbK7PKt3Uyov7ZeIdnSDHAb3ZwI4T7cVdh+IQBpkheIOdtG9r0tyPt0ZzVuPgJyVb6G/KTs+q+3Oyl0fC/Qi2CD2XjxQdiviEs2Ds6AEYVR//Js+ZBU3qCLua+HKlRTW76xe93dhmrXHkLAcWlgO771BUIMQUuRFpEHp0qvaeb4MErPwgX3G/x1E0AohZQ+TACRlPCnJ158//AhakEEDo5Y+K12oJhfQhGN+6fQR2PrqJe0R1SjAwDDVLKANPrAKzJSS6n4nAT+HanWtaZ+OezdZCJgbO5X7ckAXcfK6/fP2zdrqqPsUip4IABSoXMYBo4BiuL0PIvBjNV8hlK9N4LazNgyT0w5FkXsNZQ6u6jetodV1Nl0Z36/6cR2OuoOk90Pnzvx1BHIJnaJ5f0P9WhykSZbPzKcYLXqaVZto93poWnGopqlDWxIxlzreDWCeXNLQQ8dshSzkisiToR2SdKkrZTh3rRbIb1FTgWn2l7hbSoXmn+TGDt7XS7jvGaZ3CBGSahjHo8DDgOmhRohO7Zbhfw/vmIcp70kGyaVjdt1uk80ORISmC9igYnC8JoSGFHHQ3vZ9iH7e9PSckYfJjNu9SYOkxWgztCXrMKRxWckPmxY0QA47A2BgolTV3rjaeR379uRgK9mqdHnmpknBiyxlUY3sV0sf1mRvOaVgKMy9vt3s8pxwQJ5svV8ORt4DK95tLkLitWXmSLtucWl9IG58aiIaYVB3d+MaGQkCaRudC1wIRsMBjyzyhxGyH0Uy2EcvhRSx+WLJk5dS1CECvCZ3bIYtQe0Fl3YosqQvCmgUk6MGBUi+cSBQG61H1QoDKnSOb8NHD5Uy7CkyBTTPVTk6/I+telSY3IRmpxsWYL3G+LkClFuIA1GFd0VQyNWxQMsl15YV78stCqVsSEXUgCGQp9HP2RuMjiZguK+5yWPw3iD1MgawpMA7boJ4XqL6qXwQHDdmKztQFgzT2j6hJrsSsQvcSD4CbOgkDCPaw07C2z7GI+kW8haXeA3ux1sTfcCMz3mUwAMlUMet2/L/rwh/bniMAQ+2Izqolr2vUdd9Z3y3oxma8thKXiCKMerzuC0IfB1e2RU/32wKaOAe+h6JUwIBdJxMqNOtM59iskE2MxkWgFib0+XWSUf+PBe7OEgvUsCxHlZWXOk9q2yYpCtNvcVD1W247wyoN93FtSLG4imSe+Ab7F8PoQyNtcqhzz/VN0JHXkno3tdi+g4+1Y0/KKGNKGr5TKtUyj3qYXF47T/R3NXuVSfYYy8gQileFUmBSsYjaxcfW0xhS8qYi1upAIojWeUZAy4Xx4kVEO+rDnjghlnw8bPPYX1ak97HmaD6iscuDIBYdYk0pNOXAHelHeTt7Z6ugUtpPbdqMsAvpcmZQ6rSHc2hx3QMmbOWjDg/L7To8w+fnmtGw1BcRBiLmWGN2e16/9QsfERJczfbM0CbZSH8qgf3stcBt7gbL8XOmQ9+bKk74o3AwoQs78Y223fNQycIeBzpY7caXkxdeioidNvRhR2o5pwN5IMOnvkS4yj9I1wNLn9HMA2/9aHxquiCl4wt4/xpFzRK6cIw+5v8gAK1Bievr2bn+tq+TVZmgwGQOAztXoXE7LDMIIxR4EinG6edH+zp81Z6rRb2sfTCWQnghJZ6gCf934XLlSx5g81iJ5yQVcLQNBq9eXkltRBt0a15BnyeEM4WLbxuka4yb3gLia8prFXgnRZ3WNESm/UgJeOq/DLbaTH/Iclquv3Z5f6qEhabHLi91YPrkWwboiJdOYf544P5Flk3tfRPT4tw5aM708Ko3BhovP+mOYVd6501qM1fDgHHpYTqYYNEU53SGOZpOQfTPMMLTKkHbteO5PPE/OureRIV6CP50sjBrC7QZkH1n/BN95dp6jfy+Ic5ctowvXoEtfCi/l8CP64dvfmj6Upd5Ga6B9/TfK4O1B9+z9Gjd4f02sV4v83PoqucSl5sorLVnP/dNx3s+DFzU/wGNOcdqwmNGjApwasUfYt55E4i0lJs3El7nja/SfSo6QCL+jwc2m+00x/ycKYLaliyDlTR+kiSPZ193GlkorDLfCE/aG6ORM71n2OYcXmzdhlB1GD88JUA/zSBecYqiqiAAbsqd8zZA8Z881ABE9BQ2lAjonKnCNQXOO/x498CTTWQB7Idba9uDxA50+onin//Hrr8Vf+G9ynSNX9cgmXpNPsO2AJaEzepvp0xGSrHo7kEfhL6ok3pcvCeV7z4Cc4Brfq4l4gjEDwr58/8gzE/nrh6t1Thv26uLqnJg+/znena2umWKMIooc7kSaTa/hQE2Y36cxKWaoGXwJrIJWicwKoFNTcPK5KnXuQ9bL5pmFAFtR1P3j5ZJ7hST0pPMAVd3qrRDMrIwmvMRcZlGw3UIDc++qoxSJez8FgWQoyXB4Ka7Er1R0rwy2WnGgh7AdX4W3WtrugdLM554JGhBawpX/BC0A/vQpeh74/s9xYvDZ8dqSi6veVALlrdNNehsJwZPedwmf9nxygLZiYPGUtaMLRILHtYdXjf4XvE4nWiuYDfXp7eA0LdeQujs6oJD4QBveg3sR3qbAg+KNpYs3vuICJinkLALDHTzwdyxLJ3dmYbkB6yNtksKm9+6YVDpOqxL0w4yTj1gBxr1e1ZND7bGtXvCxDi/XMo5L/JBgVJ6lUHRv9Akx1KkfJ1QwCs2ZdqrGfGAFjhpsmo8fyc2+S3TxZloWD5bAXH7FpvZVoRjefGjaVrDMD0HWasF5PlWQG4H5h5YnHuax0PwnpELYURp1/tm6D6OyhIr+72a92cpTowSYWCuLWPZaDszsRy4qEaFnOyF0AuKgxs42q42kvlHfOqFzGaCXbqMmoi3KuHKFbNHR4asvP7ZqQnRgeJeVPaTBqPFyX/+JDg96GV5TOwC8TcDaH78DtqS+x7AE6AdQqoX9w19TAFK1mTgyvaT9OxRj+xXIe26Z6hmzVWD2jWUA6qVS4ESChsFdzBgnMI6o2ax03p3Qcp6wtaotZkY5ZEd0XU/k8uGAipsw9edvGKRmQcQ9FidFGwO9OYLhQUWjY2+Y0sNV+JdZmOl6/4uq+m1nPO+zT8CAXZZkRxPwm46cpUwdGZdUfwVrSf9qwLoKrtiQUcfgbFazg2ir/E8/3uBSlm1KnAGs1bOf1qW//E4FVWUvBRxgmkBl6gP/2ykd9vb8BaOZbyZzmtirMG0sglUc+IkzE8f6fp8JBgOrojobQ+yPhEw0Rr53Y+g53srPwOEgdal+Dd9emeGMXVXGxH/Nz2EyzHfbeQJvpNLCKU3k0KrEGka3RPVG/RhqFwpxsdBhFBF1w+sTCuHaGlut2BFARE4mzoJRBYP0KGnlINB708Ig1ZgggPUVV0hOSJd5tRmzGXc0ZCSTH4FbK216KISLmfEP8Yut538YguG39dvry71t4Dd3fnbQhZxHnCwXkD4c2stc7joLZrwz/iZsI86MmKSDm6lDFan3Cu9n8qIciBgD812ey90yHynDsCqgFJIsJUm5ny86Ws6yt1hWOi7vM3ZNa/FY4H2/4QHHfwlafmgWTGayGFmsp6kMEIxEMN0qIlH6eyNsKb5l62XRE/sYhvPoR1jHBk2bBM3EQyiAxIaZm6yXz2QyV9KiweKCO+Eur8F+XiV+DMdyFV5XBm7ZN91WpQ9cTwTwPvpBno2CBIOf3eXskLW1sTdZB1OWoDOfcSuk+hAkymU+BoYvMeUogswGweUqcFxGoqaK0MWWIUvb3AGytqbvKHL6gnBxWj2UmdDnvbBdYW5fRT97sVQuO5iZK713W1aU6CXn4C1m6yOKXQS1REJRRWO+uyldTx27zjpHHpCpB2nbdgVOaWx3i8R/emIrVhtc/vfrzeQAiqDfwdB42Doub9uHuyZ8gFsvCldABaZhoNBZ2351YQ0kXovjkEo4AIeRknxwkzfRZl5S5vjVuPm9udnmWtUL8IvutIbw66kcnnZaKZxWPHMaF2FDWWLyajFG0AyOAHUZIh4MTB3I8/QYlS4TWIUUYTRLSS9iuQx5xgIETYqgFMv3+mzui80IK5hmIJFAg36GFmcms56FeGxEDrpIUrySL5e9KM+fSi+4FCpXjTtM/IledfdDxoloTH4nOwK6gZ+XjCBbO+iNiEETtku+Egyi4rJpWKY/p17t0F3th4AaQUXtQfavAR7MahQN8D3vq41N811n5sEMElIcXVcGPReOdVomAYut/Fb2Bulh+j989A35DJRP8BmvHvp6QZmuLNGy4qIf4qOlLahE8g8m8x+Th/FVHEXSqeHBIJs5uEUgBt2AsjGWvgAlexNtGtJ+G5MLokXIyKKsMO+kPbsq4iJ2xE95BX4Vu0xn43+ebwUgWEWGiWA55FEM2242dpjxo+lgz5zDamkFxIOrbnVuoL8dFyhVsSrz+aTP0z92kHNe98c2i5YN0rvPc9vZQ0kp2+H0JQEEYNY6C+LBJ9xOM1Q8Hpa+pgDItvXweyW8ao1+HCmO66LDCm2nnw1XmiWHsY3RYqMZbJOFS0rXDEz6H5IUNvrO3bYonNz5g272EW/hpRTCdi8uLfO72s7/BOg8/RJ7PW1V9FxF86D7z9R7dL4a6P4rt1trUHhOlhOcayVjmjHJCRnSy23sM5F1an6KDM4DDgXOdR9VOtMnMjxgZJfGPvSL83bOkOCUyr4tF/NGcu3jMP5I4hN2xzLxw+msgnjvTbPhZM64WeLK6PDzk7d/zj7tImlMdQXkcah9y2K+sHcKZzNNcDjkTSew+34bGDJZiFs5r+OvzEgUmZ5t+xgX+0EsiOgwH/ApYqll1EoaNjAR0MFqITk+tzuI+ROxbb+fy+vI9ukffXBdjumWyR3EtSnu9GclHDwbskqTZ1vm+LSl8iMht+tb5oTrJZGUVCx+9j9tqLIrm1KM5qyd+nieXzkPp6Of9H2X+a2KuK58Q866F1So9RtGNzn6RzFzjHt+fbkvjd02xdnjA1GWtWOZ+9utJ5Dl7NskdxYQojpHux/PVRq6XCBPdQ3MJaO/RsK417b5+ayhx9Px0GXUgtiGh+HiMqp2a4gk0v9OTcSJYZvPo1T5NxzxfEQB6CXiquPDFb3GnM4WQaHvOJp1etJ3PbctpdvVZbCsJC+JI6TfoEgPE2OCJZqyH2yGfEqHl53dtIOsI7YDV9FExn+LjOiqgpLjSJazRBEAchV5CoHnWdSGoRtXeVn0dwD/5MiZJp+V1tZNHWkNMmcSLb4rYHv7AnE8f9kzClh/iiqqLT5fRRGyIWGc++6EdG78x68ngcOeDKNKrvYTF0jnAJqA0ud1gn+QMs5kH6whSdJNo/+/J8rX9mUhid5XNIDxs042PWbcZnvehXOUXQzm4iVemgMnbB0Ythgymk43fiSKHyXeaguoCewm0K1zaNbI1SQCSsogWxcf62CVbvq5a86Sk0HUM8tb4jJT7VuSadCGKdblpCzjPMCZw5tNSTwMGUwL3HQMtkcJeRrdqs9ve4Qzxl9KznlQ4I6b0FpOBssl1j1HjRi+BSXw0vguUUq4fvl+EY7yjlIexJpC+x2XIJ+wdJ9OkfZqUnMAET2uAX/E2XBbFddVG13poK9Vun8b31I4ozMce7sobWaCwtskLqK362E90SNZ+LMsL37EBMmFDsfQ/9YssPa+ME0FOx1Ukj//Us68RdlZfJTIS6cZ1WvzLKg90yfQlhuuT2+vfw+3cnAI3CTfEd8a9pG9om8/LbesPTFfmGESgCAyYvHA13HbjiZJ8bihnHPnVU0qpTzBXQO/IrQ5crm31ehbbro7tp30afvYUBvbGreyYVBh7uFzUmP9VHTNhNQKD30gPvb95EQ7pexlXYSeYTwwQRHtbeXuUKI6lr70dlkiMyNn06nnb1LnbVDwJ1526dCkQf5oSpr1SbgxgMvzZ/Xgz78SQC8ox9zgOUPX2EI5lqx9TStFBFpbt44dmWg2iQNS2i24a9e/G77GRZTIsIbRJkjpvo3hY1jfrkAKo75KqUbKAR6NdR1vbw+IK8UQ9SkOLLnY7BKr87Xar+4X6FzUTMJ8q06PmYzSWzCWE9/RmWJtKeT1tBJVEI0dedmS/UKdrvNg/ftjjiSq54dAuzp4f5PRqwxj+BW+qDpnvfSEDJWGkssXj58ZtEHf/rC8Iiq0ZmWb4phNEZQ+FacXIZ7ndbXXGIe0Sc2pJrCtmf3Q/AOfk9Pm4AHO9yktKmESnRe7G3nTCxnFPon7qq4tYN9jF5IxWJbNcWTC18b+r5wyjURO6P+GCMLYm2LmLiRiFQlzoX38qBusqHFF1BNYMBI1aFj8ySlBzBbHmTcmK/9mf00QHxcYxkfiUeX+d2sKN8zVxtWxmcns2uXeDFEAZyNlxha2LfLHY86eAevL98kNYlQRtwR9u1qI7nSmsww84iFVOon8rDSS6F/8ga6QQwj8kO3wqtPLRxR7DylAlfwSAjoUQKguKN5hcxZjuHEbfxPGhWE5dcvnlBVib0SsWMQXR7bOsR8/0iPqY5IviM8/yNlp1yG72xa7/UGGQf20hnFi4IZWADC8BA0UVj1ELJJVw+088erwEOtkgSpdje3cYmt1GWFPKol8yK4ZzaMegdOKKlDF5YTNPw8cVmSqI8J/COLVfPzlAA9T8Bouprx3M6eGC45Zd9Jf5lFkrsnV+1tpaawwHOT/JoxPRvOW8tIYMTj4+m1x75Mr7BBeVaBDEfZasm4T20LapWuLNp2Sez5xyuaqA0k9zko6GiSgTz/VD4J1Uk5KKBiwHjLDG34EnMlbz1Kgz/0WbG8jiO2q181Fiy1H7UcvHMTHMI6+tS9sFd4eKfCQc6tw0fdSTTelDzgdx86qiw0FyZtVbX7rYttZzZa4TRmyKBGAnfLYsbMgDmRReZEr/OhDdTN/rIvjre8JjUG8feWIFeIpTl53yQYLY+qov1879/quKI30S1dbdcwFKIL0iwCTeRnp0mft6meej1qRZLpH67Qx02aO5hPE7H3FQ93BZwiSkxxZEJJaAejrhTbJ78j+WiLb/SF0xNbE280WQ8lF0iLYF5Wyo/h6oZPREjNcjKlJ7HBtlFFQIhe6VV4RRsXUo2ysFh8gEyqqrO9I3Su7K7lxRg4/uh2lUrjvMeTjXITJdLT5n0f34W36IFACuAL1BqzHiGJ1WLbFT5F5db2mvzSvnydbNzUh/FYWQSh+JciaQPsVCDLmZo2BAoiwwkDK/d4J3iwyh7314NaVt9ZSDvxTRhJaqJx56zi1RQHa10/fg38REnAHkUWVCln/orjFC8nCwWeW5q+jtSZGsD0Zb6c7wyDvS4EgJ5fxglPj+upC8IHMBcXEb44Z2qdQnccFauFPmUc2UNxNS3FIwThYBcsxcnXJ8mfm5gzzMaPjU3BzN/+n6drvHbpnVQDyKf+odzgaIfSI19K7zuJUKrsEU9tpZLsBMpZYSbs5Ur5/EAmrrEiDT8AXKYUDPgWcrvwqPND+SHcu8kpT9lk3WtiPwlyzXqBDB1vC3TjJNv5CguY8bpOaRzu+xAmD/0xkmaR02WxgfuNT2s+l4aEMDBpepBhQJx3AMFvdBP7lIoYV65GvbRFu88Sbq5M0FiherTP6P+dfxZMDp4EBzTFW/Uy/Gtd63YGhWLSRCV1cJSXIF1IqKK1YnvhxGcWFFshQroNEHaMbpVmAsCDeFX31lB8Als2lpJ/2yQ/pGoj3npmkP17D+cq9LcNc2aWQlVmeO6zghrspF5BppUiyAu+6NM9OQOvHfzxMZ2jXepav0KT4HwjivlB0kVg/9Th9O0YWIMw8tmKBCwhEyK40xoE8LsCPZm15zFATfbPGCen8gxQ9Jaq1hmewp9Y6uhOunerKIeIu8Kp0ZBBae4MmWGMPWzsWIkRsAog/ZQasHyeOimu/oljKLSHTxrrAXSyPx+Ck72pusLqJ+HhDHRnADviLJG5upe2UTBQpjPilAp4VeoiCQ8j+v4dWOvbwfyG1/JPTpy8W3wmNUmnBOx48kcz7wLZ2WeVqfd9PovAugizkyA0v1DNNUyvDno1ZLu6FMslKW3S9p1podYdbtHdegq4NaduibWhqc0rm9c3tHRqJQThRgmhspK9SHLVlyu0WDQyLgLhSH20uCGHMu/Prh5hoPGv0APhfvF7tc11j1vxISWIpP9BHua3iCt3PBu+kAWRKWnumx8MPKVSjJgeZf/9adTJTbZ/ABCNJVG7iwVf/wSErXFiRF3pMqudGCykmfwNmS0x7jb0Onr+hhfUfLSW9szE9WuFZ3d80XTLz3OdDX5HmPJsgqF41TtEyEoV9SOhiPfD4KjLznGPdZ5m1wBMKgrkt2l+OSDnrga02Nk2l9MUIFe7BeuSKUkJJ3Rl1RFcQ18k529BcEqQA3NaenECuL72eglA9S92oNcgvXdLeCiCnzBaHj5fotP015Pbl8TnPehjyRmrVpe6ngekia0bND9dbiyrtLLy2dqB5utTWN6ewBw+s7A+xDpveYOWX4IqQBufVk2pLolblobiaJe8X2qHLF2sJdtmA9gg7Xm6ngTXICj8BxMpvDs+mTwPkycqBnvfD63kqebmpDPNiIypGbjiNDWoUXVpQjYmeaiQPkyhRwg1DnRh61a0SxtyXrxBV5mVcDL8ppbXh9YGw80DlvTaM0WMO5YzMCV7OlchDviGHLVnR8nCCiSGGqGY6joMKOferk9jvmYvgZjGv7sNAx00P7/F5OZQVhCFXR3fkHX6O1hl0vH7cqqaKCQGY7Ei38G0u7KAozT5cQps2qB4wr/IW5GQO3/qNcqrewCB/bQvjKOClQKdlKLIkunU99DogSJpcTDvdXa6Zb4LAeZVx2jDUam09I9tKAZQCTvy+DO7jW4hbhUytI+92FtyqwUAgjdwvGl9gdLHmT+VidfkjX0YxSRXAgt5fNDhd6mPxOO3yDAikVbIQq6WWdy0pL+0D0bgpaWJrbncO8lBrBkd8pq7tm9Rep8jTZ9XJH/MxQAAaage32KzBySIHObi8FoP2u5u8pS5YFES+syPW2LYffPu3Z0JCXF3BetUSR+yZtzpIzxQ/SpnFyF15azZKRcYMMA1/EHy3o/Ceegz59i52ji9YJXehuPav9Fmooks/hECNiX5R+Yz/co/NJ7CXoWy3uShOxshgYytRyHD/ZShwzdrHvskWgEPF/uAgm2ts2Ajwrxwzfwyur0UnCNcULxMwMyNCF5nWCFmwAN9SkQaKw2fntruE62lzeUpQYylvMuElqIcVjYSvdo3JN6pq1cYh7d+rRcsoSd/Ihxj7qcdMA4NN2E6QomMm6apSb908WiMzqWeT3p6DrV2v9YHe8nJdCsKOoOahaD7kLyopxrM3mQzq0lS+SQEjvsgWpohec+WwloWo/cGM4WJNfWYZ2f9oF9CN2YIsjKnsgyY8wgbv7MYW79rqLqxcEiq3sQgICbXxgM+T5AGgKi+twOcxLX4upULBmDevttMzzzE1+VqE6cmEKfkRV+1FJRu8nS8F1Uaak49EY3SVpsk3EugbGzEuWnaUXwwP/DDlmZLUCRNXuCohO7uHeoAZwp0lHI5cPhBndJ2wgcvZbjPi0FAu55NmDQgBdayUb6spRHbWAAL4X0sXUEoixq2S8+GjwhKNFsRWtQ/HLInQdSBs91bH6B8z8GSNNwUy/RbZKb3OVB+zuP6ywcaamTJLHJ+M3PBa6S4HEodFCLb2lPtCJFfOPV9ruN9SuMKIkQi+hNE2mvMSG0WGImz1UnLbRW9g3bio27OlPPdoyLXFcdcHwGA48TRzFws5ackfuJYshGx3ngzQeJpVrCqjZW2I1ZRwPkKNmyZ8qTMbgBCLVR0wXIbRd+IO84hbW9l32ioTLJptHGbXaLv+Lnnhj+ev8+Pb/aETzUQQkSSbniS4Gsbuhs151uwmst6cm8sGfe6N9wU+oD05PKbcAmA9ZdxkPMcRRBYvSCtC/qti/PdthZZqDd5hRUcbCQ5x7UGbVTLWvNyv3GTDt4pJDPRYWsJP/dfX/Z6iBVzRQlqwbPnMp83g3ivPj9nMic4U/SNpoP5fmmboPcGil7xmpSrWSivcsCBkC84nRv/zLrmK113nuvlfxoN4UF3QIVrYxW0XgZ4rMmTFTk1jncXQ9EII912sL1xXGEgONyFfGaZY6KZauuPpCp50Up43+E7POrkYVQo+44K2EWQa4AazxUOPRlwPARK+8tTpgJwUHLaEjAlUZiMyqbyCcC79YVDR9yH2ve7HU5fAlDj2fcZX1a8iR4wwHye+riMUCozEaoDEnbDDHZAMJwKJ+rsqGZPe9wbD7hZZfu38qX3fVYKq99YKSmJ+1j0gNU+oJbBtZSwHk3Iwo/cQB7iV+Qv44acTjvhHbLW+VovtVW4WvGlYYc3LYv8tMsYkj8I/tF7lhPLsm7ZLDAP4qpA/AQ0+n5XmzGKzLPOLt4PXpD1Kp5j07Y2JesaJPaPx7azmrkvp/7mLJ4t4B2mALApus3sv9zlsyySXcSpGgylyH0Hk7e2EVkDajgoyvskNYxOmECRpmKN2WoRftPlN3XHFRYLLdopChXZ4jIhCPx1pUXqWrO7Yn8ii3uguI59Wqgc0uR980LDAOp1XGSi72aADuQQE4Hr9t2Ig1dMZ9EdlIGW6RdGfCYoc/SYPoybVufvc+oAAtNX9htcDcUkeKqMMrW4F4RkOff663homII+uTtmiuZLD065WPHIFSwYbiWxGR0Rwmr4TjNjxd8tG3SKA2KY4ZUyUUp4kJ2SCeMTskbJFAuQcEMaBxmr7nQcKiLj9ZwdCk5xpBPILtNBm6zGp0CXaJuCuxzfMLPHZfi4XHIdxPH6FrsyCMW+rRyyL6ZyZfnn3BFeM1Qhwb9lsRTSEaSfbZZwOH5Vf/JBJk7kOCR0cs+m28ExAtgVjk8U8Rj2t9OCZdZv4RrVNMYoTqTGRe+r/m4fCxIRptuT73rL6Hgudd2PLp8Mv1uVssXJbGJFZuj6uy2jXwhXgAXNt8RKq3V7G5vuH07UsDLnIcokKOuNI1N6kTMcuZC58GwGiHcRa4NVDtsboHiZX4WHmfgyfqUPDDGOmgB1XMmYDW1TDO/zN/RkzX19E4Vxc20+JW2dMYPsFGC4huCIt9Cy09i5ZIaG1vt5mdh+v99y1JZf473MNUL8O6yz3MlVnSlC5/3gT9Zw4Rcc+H7ZcfgRprhrhpxwqiMsZwu5GKrVwnvDjaPM+U6Ed4Qn2x0YU/WAw5/L9MLHRjUV3dZ2p4T/ZaLejDJC79IhAhtt7/2nYrJMDlYA+2cTdnJrG6Up56a+FGj+w2xHwCiqReN20e9zEoblN+xBZblkeU3+u8FQIgQThqjMijXX7KbYvgsx5BvyFQ2O/lSBA2n4jZeLEp5oQWWH9bgpehH2ArLG/bXtuILdBQYSNzipiVI0un6j3z1MQAKG2eahu+cS4GMlTKXyO7UFHOQh3AFAyb5Y1O44JpIP6T8S+lahYX0SZUh69QAB+PCWx0A71xI5/sotgRb55y0awU8uXf45LHki4BRINHqTUkoVNbvnmYu1s3e5FokyQDbg9qZ9nn7Cdwbgw2dP7K/ngZikYG6RVVbh9eZGvmuRfJdVpsLtzXeWkpxvRJq8AFLVT/uMX9govbpClaEIAb0dPBhu4UpoDHBRjG2ES5wC7CF7Q4j8RvnvNxPQcVkt44hpFPBV6J3lsjbswLyq0/UOsLlIIf24YEnClRTcIPKApNW0OhdZr9SdomKzwUv5lZQEWIaabc0RVCcgp6WfvRz1ssQXyoO5DgHDDC2kFB6pFXeBTRPSBwWty2qEkTuIUD2ZOkVeAQhm4O680VHXUfl/bWfqsH4HL5gOviFiE7DeeYj9SBdbjC8ASF93Y6da5vGxIw4Kjmkq2w7HAlp5mgSjRwELrMCpB7yXTTC1aYQwpgkcfedmOeMtSGXNU5k4gk/m298p680iNNTA195vG5byxc6fMEZyhUhya93+m9tpLBSrMUzDGMQ2FM41WfjoshQhSJpJPuC3OL6nZXHsPwVF8rkqzQKsaT1JUyCdSlmjuqWi8P4KSq/Uzf/4zK6y2Jw6hK1xhqz5xUIEWYu0xqrAPembOSAxKiX7/BuN2VjKY7/z+BoYUmTk21dzjaE/tUa0IQq4Nk/ZRaVDmaRO/iismWOhCa6w6GZpYUgfyGIvyXxlEMutreDB54TwPG5SoTBLOYRx53mTXrPQMRcKKWLTOhl0U1e2TzPz0KUCH6Swxlz6ibgJTMAEpv8e+4cRsSgy21FX937JmEK/JyJkhF4spBWEMIpuNhDF76+gbq3B8O1ICRdQyAT1VhOulOXoSZtsHomMb0CQq42tQ58gGWgnBcLVFSvY9MdCyDnTRWFNf75Q/yvQ3mcGrI0NDQhKD8V86EsVXBT2ZwQJHDxnglpI1U0Yf0HvwAqwqOytpB/cYXrleWUW0XCX1p5keTqc4CN/O246z2TgUxC5L94ZCu369VX9xoLoo7eLu6Xk5YSOISB4YstLK0Oe1OpuR5WY9rSkUtWW8dywrEeLhqTxUed4ClM69S953P9xPsbOBIXr8i6d/kf1AItemIhdUFgBIdHlRM3nNhhtddlyrxfa3vvYa5U/pe3Q7Zlyv3y3cfvYwpD9ElVMV3at7HyiqKIQLwWh3MD8GSuWf8/tjRQBv3YBQ8MwwkCaLSSPDMHaJQYfs0uo+6msi/bRFGkHdcgRloiritzr5EhfnMYv5vyvGy+fuGqr2KjL81WhXjH+2yUTMwH8NPq63gW7kKuA6rjBviPfKYolr4jexoEmBfwbsNdt/fV2oNBZiPl/CTzhYh1/DLYL/W5X8EPSP+dvnYekS/nikNPza3w9XGFw0sC5j8F5jaA+HEXjjmkAiFefZxCMVI8txEsyLgXsDWLdbv2woTr9zyO3kmme6gN8WpmTB7e3hG2cMQQZYArrRL3zgVKBSVtZxSOWVm8e/iAm3c+BvQjX9yIsHQnzRFcJP7wdUvYYEps6lI9EO3yvQdJ60yebaikAOvIKvER2nrADWfSlZSP8BMvkDcCaN2DBzErunb7Vyeu/+4E/nkiCT2FqJZoTNf/qyb7FkFOmIpiEcujSiWXgqy8JPV0mOtCp3jwU3zexTQYmvWIjBl6gb6vetbpl/b7/bM4lNRn2L7TXFbcZmqY4ws5jpKb76SxD8FbJTIVOAluq4xauxmRJL1jl2Aq/2V0OPMrU7ZwwnLRyICXSt3N1nG5+GdHccPVzTUvNaCd1JFXTT4RZ5RDFffvGgjAcWzUuNSdu6VhKLJJxxjigyfJRAtdrBHSP8YZP1KHO13q6IEL92OchHeTNktUyHFQhJ144b5WRFG7C8wPXBoNkxVSsRnrFyxZxBInLc0RA0Plbs55gXX582usCjyS5kMnSMwMZo8BaKiE4p4EGL8yTx/xoTt5tuAVaumzywdLURJ4ekVrjiiw2WqOzMnc81FR6zJqJF4R5aVQE3/N2Cx3ProGSrtCWNKUXFzFpObUqHu4QtCNVS8LlmoMIR2J4owXKpuhm4WNZRpXp7Q8cyaXPSOLSANZU5YCuDvzxYLNGyolLnbzGCBlLdsgEVcRaWncIPPb13LBo4zgQJ+rbKn3I3gmtg/zwYKY4TnNGroOHi+xZJKAIKiJqn58f/sw9l4H0O18275Np5oZmdAAHEjUD2b2HAKMNr+0A+TI5/oQSIM++1j9iUl48sr5ecug8iPe4qVgjv7x7bYGDJwYz8f7GNe0z7vkRu5XCLwKJKq4Wgui0OKCInLZSsCLtVHPoTAeeDVbixQUEU10F1dq0p1sxShs4CQI98O7vE66YJC0tAoFtDyRKlwu4dzlJx6Ax2BRnWiyozdPbMgrxt5RKUAODYtHZ7wRsQHnjtFU4prstaD9n9ym1g8g5wkkdj0vC3nJG6L6i9atsFj+wWdzhQ6oB935CgVSt/r4nhO2gV3b2LW2I82UmB+6ACnT5bomrpDvLOm+Ux3iCmK41nb3KIB/EtVl+/nU98vAFaIpbRV5/Ya3BjtEM2XZ78si7lfl+Xr2rWzQvlu/fCCSAJJacAcwb6Mil1mIz/+dT3lZqVtQgTYTVLhYevrgcVg7MPwcLyGXklk51ZqsSO6JG8F9SgcSDGnT2y+Mh8am7P5BhEu1RFfVnQFF/QSrpPan+oiZX/t/9DfqEY+OYqbPN+iNaK3NyForMO9xyQbVVWLHtYAVtbi3bjtsvUAWHwAEwBkXUPVTuvemt1TgIF/RifIMMtFg2hIvBUfHpa+dsbEpT1Lkqo58fcpHBGeRY7RG9qFzPZYdJhYKbqeLsQyf9fd2Wir8XEEEzzpp3zwh3DyJ03S9ck0FTou2zmmDLE+RZ/+ymoq+BNx5yHViXSXY1KSw5pheRMoD4kDsyj/zwBTPbV7HHzMxEk9Zn0mUJ7p+d03i8f4yo6ZOfcjYTLHzseA5mccNZg4Umuw7QoIc5ma4ANofoxwNM79AQR+9Ff9XUU2QhahtE9VKSTl4XvWxV63FdSiQ8NN3fgcvWwqg+e+sybW1cU0Ba/awPapEevM3iBGXtBg2H/VBxcJCpmd8oFfgAdDvqfOxv0lbupQ3N/CRVMmWne4HGRMbhddZiTvmV7QmdSyrnY9JZsT2QuFqL8a9LOJKsD3M+lXzdZtejYJlDtEcGaf0zZR093MWTUrZKBkUiCiUlEaE9Ji9Ih1BLgN9fYmwWvsaVIRYlAFXUUWhtOfMA+XmDBOHGMOl8WI6egIodfJbhR8Os3gTsm83Qz7pPFA3skKiHLClLhwMS9EP+ydxmIkP8iiGSEtER/O25NDrHbAxARNeL0zifhgneQl4Aqz+Ue6STRt6TuhVy4qf2BDb2MR6CIQC8sSz7gLkXWam9/VHgW0hI/k3eH1z1fFnbAZPIiv+mhjsXULmlqnhPSuW3W8H0zjm6n4bRRFCl6GLGQvzi7RNuu1Y7LxVfWeBNRHJdO9P9isCrrlMahC150JXTOVKjys8R8OhsqixwdnvyvzNpJmwDmxbHtOQAE6cgf2lJiyjQzBcz4OB0UDRK6V6IOt4k/AfX/4YywIlslGY3DcfTBZx1uex1ZWeTkdHaNQwzNdCzDZIgysNb0o8eXQI7IpdtwdzahrU4L1CNnRZgf2TBYCQnrCEfggP/LmEd4XUKz1u4GpaQfNFBIWQT8W8aawzOIVqFQvR5/In9K+w3fNGChUIvHDIvWFrpu4DRpijvbR4/2ZWqOtJUJ0Ux+XEeChR3PTtTIltTU8jTsYXgp3YyISgWvCINpI6d/QzHCWDwIwXbF0YVnJ4HwlQHJoQcZHxz7y4y7Im8HASU868eabzhEkWLq8GHMc++zTCqObFTDWJx7fkPOjecs60Q2M5j5p2YuHrak+vKbY3icliZ3eVVAK2xklWuh2D5ufZAjWQ6iUb0kTg0SL+KmBRz1fkARPx2gKnZr4LR1bRp6sAGH9Q8Z8XEhSveo17ZW2vHFz9RIsbaUZrrxJXgztnnJNThDdlkj8j+rTQ8p9QrkuYiSOZBmJc/DqrXBNza9JZAr3BgNIXUhdbeS/Y0TsHuG5pvcHkR3/9qGhYknIOpdkabTvYhEWl2frFs2J0FIMi/3x/+hjk3OU5kmPBp8s4swR0RPF2YTkuMh2cNF0j0vtCww+kEporzuM4aiLCInAAYVMmjxJSdLWKEOEOineB3hfzrp0pqWZylUCNwghjIo7v8AYWh8h2qCDblA90CDNvgPNS/FY3MdMg9LFhAnzUlKPV7qQQJCHjSaYE6b+wk0yDXGsvnBBAP1SApFlsgJlAzxI5zDnCj6u0CeX+rT2LZMCdFTiPllRkjZJhFcvaLCVZSSj+yEIZb6zS8FpHqU48BZxS9mVLAFoy822MurT9JhpKdLoE8U2cnKf/rZkCynfHufpLylSzJ2SovZU9ZzyszfsDCHaWgvq2Jw1eDL6aedfMunLcFtLMoB7+himZwA2C+HAe2nMxjXHdurgHx911EuEVO/JcZwnK8OzNTElf4uwJnB5HDvTrD2fbiA+gJWmbWnokPx7q7CT6IqqBK5DzBr5akaqpmdY48kahD18mMeSDy78G3wvbi50YXHq4svIc8RCPM2GvBqUEAPGreYADsRxgRk1DQw/UP7PIHOzXsjmiQNj1XEA02JZztvkPPpXXif5nGWXmhVlADCd2lk/Dk78jo1pbhVMzrFmLMK+2VzcosIgmyeNkcsL53Uljh0xD1d5leWlde5x0CDRn8nRB3DEjN6Nq6YWns1rlboRwiVGbCCcQxVuWqic3iQVQ7Yqbjl4W/bd8fWVXomMPlFRqJU9+r5yODEPsP/wkoQSPK0ocFzM700StfBYu9fRzyv1miEA0mXpxvef0RR0I4SI/VkisYApt3CgwyBnh6mpuBKzchdc/I6WqQiql6lehZkiTmIYxyHdR4sMbvJiosj2RtYpnRKTOr8JC6wlF/9s/9ZWf4ikjOUbdEIaV5V3mBE8UhtFbJhIRFMvqkEShxBg65WduyAN77FdKrcb+54MIrq+oOW5OND3snM8ouBvIXm0C9j0fp614zx2NFFMtQQYM8EDUSPq+AxExtaoba4nsqRtH6deGTUjqvrTa/gYAHBHK8lNLzX2TvdDkdAY34ZNJHrRjmPAtr4CgmM7qb7bCX9AYFwLtQ5V9Px3j4lCAwfPYiDk+g8XJ42IbbmSurxy6tOoaUXEGPecCr9JReUuNiPRuTISmYUikSRK/7KCplfqcVC5jV88cqUamSvA+LXUiZZYqj1No36t04OvJLt5fUnRPS4DVi75C//NsA8ehnogMUfJBJv9QoFHdgivDjYUnbXdvtQfx60KWL/loX7jMXLwjctPUQmk4s5jJs71Dujh6C9OmY7GRvJfcl2UbIuXDr4d42/0drqyeMGqphGn0ztK3+l9ken/1GFkEwjwW2TRLYXJPl/8myvrp1rbdFXo5XS3acHxrmclOixcXNzOzYgYvLYiZ1ve//qh1/AQFQBvQye+nwc2B4jx40ViNTT0sY4dNnDQQvOiaU/N/iwWX/OCH9+a+Bi2f3z+Jqmpr5BnxgUPRQfmp3v6ebihBIZ4pIFPwHvFBeuo3NRzXUtajT39K7pLcZWbk4HnDYGCYp58sxWTmVZIbhrKyzkfFYnXKnZ60aGvmMnQ8usdejNSDm1fz2bcHeQRf5sIH+QPABua+RKzL8lp/1IiEG6mDBzrTbQGFaVyMcwGpXhrB8LkjJgWGZ6Rkq3jrzQABMflAhFoZyIArHQ8paIwgelRSrvPmwOaH7HbyhbdHaVIkMSGov5aeB2cf991f3YQoIMIaK1Fd/dNdNvY+G17Ao+ZRsy+mauo3zSxjOHok4FgNUSZEYq8MJbDG/GNqKSXPgq4vxO7oAlAg0St4p3HG/YdgX+if9TdwRk9HBVfwz/BKTOlasI3sE4z3AvBguKNmhljdZgYZqQuSf+vx5OFzXPrOz98oqkmUKbBN32lNx1N14qriKmOrtpEyqIbaMPyJpKrzF7/9fgaizr3pgBfeS5q2sKjDQMZORmCrjAfNnXqzw/JkP11NjQVP/ui+29PVbdsXi9VEo/RXrXD8gQ1EP/swxi4GXtiWnwi4L1c4wgVjVIEE3oGKlKnDRPzlTgTktNWWhpqbEVAel/0R0btbcBT7dweT7x0Epp2v6Gz7I8NmoVJPcaVEquEwpaEdCJo9myA/iUwXNPyYFCFfE9w12XOx+RaEJrw/PBzb1mHZNAhoudgYoIGfrd69AQxMfyCIxAe2r7sF7kyLub+Nr9DZ6eRTDyJ5XgOmSEJMhRIGEw5b57Zka2jI7OTkRqY5K0A8jeoqJ7aWg1dWgQjLIjrcQbTCXFrELSN2bFoU1ng6Anti9+RjwlW5qXwZHqZ2Oaujf4AOvXlt8gl4sTzvcSPZdwXMhr3y+4pfFmxPFtqZcIc7OeQEfHqFqH3eaIHubj721g7rG9eauTPbZzoQ4BaiBXIvrPa9O12syBeSGtPF/zNiTq2cFmobLB7Cvp67Gw2UR1XONYL9+/IPlJPMbQLig1hfQ4PEinW4D08PS7ejvDsWloUGiKiyUJlX8s4ZUsm7JDtNTzP64tLqhpE2j5jJuvhyCmgSqp40TNmymCwpWdb2c/PBokX+CVQ2VRNOvqsYwD/8yRSmOodX6qoreVIrzShsixHTPxvt6p4QWePKcvCmd79XwBqhEIDPbQ7Bb7vTKEbRIk29kvPNYHgsS/zYQwayP5M9/9+habz63KmX3Zs4ABxR/1bgCO01TnVFas9rPRvUyIhTALww7Yks79qKcfJ7r8MhlmnZnOBLHHbo80F8B8xPzeIyRnbCVjxVKBjoA5cAC/9p7G0Q08yKwRYd7l8bvNNAENq4fblmpvyxXkDXCkzaoj0KOq3zphlIG8vJqr1xxk76mJ5IQYPxQ5/GxijZlC+aZaEIo0M6Bp/2jRdUB9Q/gQu2/vy4i14L/Z6rPGT1/CX+Pxnn752jpGm+mI0f9ASKZAVeJYwcuAxyYn9OST38Fj4yooDtYB91JA/9cdj1Ver4QaXrVduo39DD86+ACLJioIQB2gFzz9vtHFEj8JovnbUaA/vfmh847wYB89wTZuZivOMziss/yYi6WHCeK+XGC24SdtWwGYUnEi2qavHlykGQN2jtRJFFXTdXNj9/S7ow05vZUpLAiSgmuwgUBjux350sOfRKGz+S67cfJ0dIqw5g8PFcONAjVd0AQ3AIQhuhAWP8yp9i+bUDpkJ+RfqCf+Dikv4ROgc/rjZjHi03IkI53V8MPJ+NT4J8btnnS/jpp4HJKpV0bEwg9oJlAERM//CMes71WQxMifzwJLx3NjpyYmSGYjdSOy0GNbAI8go3kESxM3o2Jg/SX/qyZsO0Roy1d5mCZJ1rhAht7DoV0QNnB21iW2xKv+L5+1DL2Agjy0BJBjArZccgHN33T1dvrPfxL6HdahBvAMji+xwDBzOdqSqVx8sOkvupcsJPR/hK2BuU74LPTMdoU0FjkTPlcTFNgCWedFZ+Qn6U9arNbU7oS5ns587htjMiozzcZKzK/0EzysRh3Dn8zAC81HAeHOJHcrBNPvUb2rwJCOuWzL8wP/hPZSneREq+RY176qArTrfUQ9k6WksrMP3xqlpUT0dYwuxZvPsnw9/HWJ4l2e50my1DfkNJ7zxc5qKwAnr6GrJl3N+OByoDKLfNYKX6Au1dOTcjpNfE04Sf01bsfOBx7v5PfsCKFpSVrI28isSG9e2rFih63vzG6DLqQob+W0BGPTuFL5QXFca0AwQDBEhBJtelzi3IpBT3Wj4CFtJbTVOJmsaXfG3Bnya3ErbJJdVdWt+8RYaHay7bF8QExcpaJMEU1ZQRES0NeXtzZlgUtFLjU9tsWPJJ3gqW2l262EVPCIBnxyRE2LhpqcR5gbiv5V26tV8u0SABOE46o8yjU35DENWI4FmK2qYXb5hjRiBysWumKlhFyrwpt8h4IZSJpe2rEQRGwR6nOWYalrSuBivOwsYu02SJFgtMb/aqdzYrys/xNH49frKi6283VsDIdGQa1kMtmYJb9t3WU8lx6N2x7EmCJrj9moBVy8CLxAFFybX1lLT/oHigREIZXvh4pF9Zu2exiFZyCRpO1CX2G9A5hAQY2i2SZSmlBGrkjE52DRwvOdb8MeBZZ7KXRlyOH2aZwMwM1vFqadRJxSQqbko+AwQM9YqKVOiO6kEEbojyveixdGUQ1TzfuxhDAO4NuzdgYOAaT4IZSAluLkqCGRn57c9JNrCTdLnXm5zgk1SQsOvoyHrKo01Q7X/fnqwa+ujGuuHxc5mcvJVvLkYTWfrEmWxthkE2ZwexhvZvdUFbOm4JqP5zu1BIJWtRf3kJ6nNzgXym4AyWY9ycBUPoAo4sIyBgEmA4TJhqPk5G0w2URrXhe70xAEZYE17I9m5+AGy0c5h4twre/G2EMxDAQ5Yi0CtjtzyY9yaiHnG07yKOuyM8fcRP0vW/PRu1XDxYKn43HDBQ+5bJwgzOqGJHYWAQ/WabFzt4JcprdzmwYZZbn7dyK/5SuBr7hett5E51JCM30Zc4pqKFZby0QS8J5DorslsADeRlEFV+eXy0mhdBaMhMslIl9n51SCvLFKHrH4EIMV+71yAYvlrFpllG800TSF4xJeY6q5RbcyDrmYTW1wYicb3MFa61JzhiWwTnXm6njLwpdPhNu/H2ycz8YbH3699b6ILLxxCO4zHWmdtwZe2fLsVARHBxCKMPnfIDcABHkNr8TCNEj+AcuUoqnYaxae0eUaDmSn5qX8w/bOtuXHAckuINI+essguYJ0Az9rF2RikPP1+4h0rKLCJBxvl0YeZ4TcUI8y4AmKBgi6tKk/MBWAjz/f0RTWI8vRiH/lLpr3MqlwxUtiK0QbHpdm/EUxQux9nvyQiAxKN2mQALwkqznP7BdfYpVgvX3BbzpLaLWfH0/6GV5e3Q5q+N2E1oNSgRs8eIhSuNHacQvnHPLEaGU8x8/pbXsuOd04iwgfHOQkfPtksYipyej0JmpNcgeqeGu3RLkgReN1Ine7ehfzMk84grgekqMzJJpjypBWMSy1By3cB7EEt/myPZgPDw9q+kx2OF9Py9VQ+jAt+pOH9L/sZtEvse4rEYOZsUS3EYLd+h8FzoWYWbNWLQ8zXU0cpvIRxrxPXDerfRGYy8mAT+KwvNjdObXI7nu6eXHdcKSpc0EVHBzhULj0nrdDxwgqIl9Yryc1T1YkFkI73J2gTzj4LZSJ/g9pvzIf7b+LyuKn5qFd4IRsWiRi/VBrjjzxl2eLSDADm+zctgwITgcRnlIMhmA6i5zUwxKWUR7X5sGfGLx0EQ+5Uym7QmtsxhYAm3twhtziQ6q8Fg6Rm2Auehwg8o1WeRQG4zZYVWcCgDYLn8koM2X7Z3QesR/9pCF8t/g/esxOrA7t7TkKv/m0fJ4osjYKOSP7o7NJRjOJWHrku5dxaY7UH6U/cVSaQXAByDq53qci6gaETDMqzOIxkwISfDCdtGp8M7YBHWJ5vt0bJVPC88U9KpDJEQ7c04fH0r1rkQAYvu0XsoMrAxRn6k5k1E1VvK+0RpVCIsXnHx1cykvqrqqYlXW6myMPv3oicWmRuS6/peN1FHyOypRpMPeYHFCvpraIlNBoGB4QUfuCfszTIjINEGSAfY+l97jKHZHIHRMrtUKtCSZWO+mU9FEGMGyr/13fZD1Jz8fpZX78cU8ArwSAgIrJosyw8MP62uYwYzgQ8kkeq5q+yTBLICM3QKOyjy8vvo3VVj6NPpAB/TUd2E6tyvSiZ1ctvC0JOAcOzZnU518DjaTU2zpA0SBHGCXi/zltE1yHbO//MBIDavwCsg7Dzf2JW7G03Q73UqrV7u16pbIZsxGwJxuZ8mxOzhqCuuLL1DUCe1U48iHCPihWWYk+CuCnx1YlCv3q0KgTb//Aa2fB+TRdvb6+37lhBis7B3R8/yCAWhqZg0CSY3gGPLdDfg3RxhRS6msCL7pXOET9TzPaOhbrpnaG5XYSCsel2tLObuoIdsOlBrc3pgewe8OAeoim7gLDsEqRKddLXMk4ZodkQTT97kFcDRyZWMqPVeKHX/08UjVavWTQv5iYwc/ILAfW1bjMdLXsuLM0J6e/z3DGWnbedMIg/XL1c+zvNN5o4ISCk4Mh4kinT1lVTgC/0lGaWABwaI1GhkOzqA1mp5hUCrzp7WfyVIJDQfCoCLL76gRbsxRA/0YRPs+LWkQiajg9Q6KHErYRoo/EhfBRb3SKRHLipEpzFM1ldfE+9gRHRE7Fd+C+y44+lOx9qWE1uutn1XhmHznSfugXP7nErs+Q7EDVcbQ9tXzdSELEcCkOyGWQ1KHATvfwtfbtfpOgH9aT8E1RPa3zTfOMaupw3+XE42AmUVWccMinj6jqA19tzzmUuTNdiHJpUce9qvcGSnciqtAyWSsd/j/2uOtvoLIPubzr/JYvmNdYytqC3ffbw39L+NfHVlF2J6vAN2jiPT4O+Np1AtU4+Tn9ch9INkh/M4MdzkLy//k+Agos+5EatObw/l/eguIa/ZaUXgy6kJIJHavjqxgmlQesPk0XGZNY9Ufcq8a202aSfgm3fV1eQghnZySY8MY67/gdpSe3pEtH7i06ikCEBaKngKVBzK/gAZFXaIJCJ/qUMtNldNiRnv+Wyp9hJUJPhBeMSd/pqBIGC7C/2Kr9cFya8fOqhBs/nGEaSRLqfPXGbvhI62ozO7znmlAZ5CnPKS2tF7aSXEZDc+c4W/h3p6IJ1KhPiKJzuZLfbNYLg4vlwO/LSf3oy/BWJ2+KN8dMqYWzfOoNRNw890qynCaaf7djGyvdZMOAfYynSesUqq7JuPiO0ZfdQJbw+Qot3Ihqc4j0BkP7z+vedATCy3QVg8nQGu73B8Nz1W/I6ChKl+ZSwjrjax2KdWDlHGr4pq4oESbZDFL71LNIbW3BuvUKkKulVcn/gvUPFh3XyzSdCRVrmy5NSqO93P0ys8pR6Us92h8bpme/gDJ7g5tfXdN/PoHj+8rN9SaHVik87TNVypI+7R4k8CQO/iNiCB0KlQpksBP+7p2h9eUb3eMO1+JmfCwQnzGdw4NPmmyf83wLi9QxF4EVfAaOebKndCTv/5rOgaDxoTf5kf/ZqvUl0poWWX6Ppe4PDvaUIQPT5lJMYdSoLOqoplgvKU9mIAMR/5NjUWI8/wri/9mTvulBfWsVgSwiA+C3pVGFzcUWlgwB8ajZHNFPgr4PYezjSmJlzm/Y8/6cTBiYD0SwD3sWVWa/FqbsPepc1QLmGNISzVHkFbU2kvhLbpLJTmRJNn1oIX+m51wKJVcZlhQD7p+qxPTSoF3m1KanRacGnzi1ryf9E0KunCGzaeKYZoHx1ZK4iBGcVaUYXIoPrrDB3YZt9M0hEQHyvFpNFgq2IdHGGPmuK8nRNLs+b5sS3WwgwSxGE+rIEq+SSGvLXzRh58W301WlcoXI5ED59kcE7q84Gr7z0Ot0riE/PigFXE+PrTPg40o8D1Y/bjNYYGhMtXYgX5ABvq8pFMrng+rCSOlf6xxFbmtx0OYEQP+54ieVvP8Gk1aHOWg2hv62sJ36dtxNrL+D4gULL7PD1iAW9fQG0ERxrs9aj3CYpxpZyWTJnnU11963k65CpivaW0/gGuHfua0buadYJszEgcDp7GCERw4C1FFeWiExyY0iP/WTjVdYJwl1jJW0DyqkH/Ul8cjqiJrHQPMz6WIOLomjAbGxtGP2TM519yKPiie9/v1DHg0TW7IK+Tdq4GrDXz9qyYKpKHaxzlO+ILGUKpfVWlLl8JESiO5Yojiq/LAg/sSuEdfdesKlnBbjdrVT5HFhgU1T9N9P3IVdxVZ48Juk4uQ2lHpfUz/ngKigMi8W0A/WLLV+9r4QbbbTAc22sgiEpl0hGUgM5TGLeNoqCI5hSsFHq6T7T3EXqZEFmrxnDpYwz8up83Z9j0GK3tJ4WZtkMtshjpB5zKMG2iWbqXSBns+urE8y16lwvDYH8Gdg0JlS2pE9ZiHyz4jIiVKkY+hZxayR95sD4NgvE8fXBDiCFobnkLxaT8zC03/nmBegV0I0K5qDRobzPgqVrt2kDUYC+Uv9QPurJFO1/TY2SbW6brjCja+Bcx7TpIp8/4TDe4AK35acGmGIIn8i2WvjGoECMzWLyWTiisfH1M3bdmVT4wDOV2fK8JIsYclkmAVPs/ennrhriXG2rLZallKuKfQkEJRv7efXvZaeHudEykzs2r3Uk90dr6SNlnNsNpUF2zUg99Gl2uQjNpz7lOiNW8oxvnIaWFn6tA95D6FRTvYYfj+imPn7FsmoJUy3WVB93FC2AZefLFyU7GhqqsJTYiL4h3cLJ30DYFwf3nh7BYm+BIFlzWapHrv8fem1nQN9EhwO/UzwuO0Q5pqaSxWyB3Pi2+mqRx6lRjJD6q9DPvx3wmuAO+KWUHfaQbicbFMsN7ojM9wDou9NJm230342VypxZCnv8Yb2jhILyUkTxKAGtnn89wgU3+ZH9+7+5mDCDtmSiiheB59jgp6NmPZRBTHzNLz6xsm4ISYQ6QsyU/dJdBX+KAwG31eJ+UUNhiXNPeNYyNPWnqwILXUEEdJN+H+2janSafbOCeV82vSzGJuyoDIIhgEjpI+pgluwlTt/Y684zX/QtnWZ6unci5vV+jyGOATt+gDJ0Gr6r6uM1r7exLumPuODkvi5zVWt9crl/FnT4FV6Fda/yUy6zcCIYeR0H19OEf0oPnSoYC0NfVD+OS3ONPCRCu7AfOB1VcPBg/6TohEOtBImlxrpQffpjQclSPZLMazhuPvOtAo7v/zJ7UoOgIIaMJox0zDFCs6NOd6j+IPtHAinUuzeqXIsBx1qVFnD5aLypkx+ROOtxYtDhNjt5WVYUP/Yxl8RputhZjxzKuYp8HfXq3wrL1mrUO71MoQIbfJ37WJpbhS/d5vrDfs9ZrhMDw7vYsSjv1iMgBHA1MrZyfCM4cJRzHcLeA57CuSJgz2KGOLPkonF+w47Xv5HhnEHtB7vgupd0bfQvN51CL94lxnB3hMQLzr7XzTC7pIlg59Pk22gQp15VUisiGgGlmB8g1VGxs4+0xsqq7E1sxg6mPJyEN9yGuQinqTS9DqJOWmNgXV4TI7kimKYCsMYIArGqFy95LHvdJHVLnkyHBqdFlp6JZAq75v5g3Q6P2/6rXnhwr9LmJ1cxHodvYpCIu+zvw1e7QmDMSdG6u7Fvq8m6sj6lRzD6mC/Y71CoMMGmjcVsgPZHQAbwNCmstTUccb2yeDGt5OlxxGQeSZyNgGmWL1ghD2CG79pWfPgJA8TWsAx87e9uGY8HfYHR+hHcfafNIU+xVVeV2bZwHk4dN8DwMmqVQj0wZwv2cNEJRA0VZtDMJs2D4Ogl7usR0vfT/jARYoi0XrNvVV0BiT39iDGDpdSz9LB7QbjceU+X5bUBDL2WbIokhVsSegV6RgtJd12k9P5mGU974vEuU7c/KfrGSXRx+hkSU0wMlqHCE3S48Io8Fq3WuGPLE64jXwZiWZqdmYAO+LZpKgMrLk4KSlnKT36Mi1JpbzpOA0YA5wI3N72SaU3AZM4n0kqLDBgCkSUI74Pt1mdB/KO468Qus+P51b9L0dEJB7GhBL3UXrD22am+LhEVWLHkscIqy+yTsW067P26k1WWR90NdEt5UHgZN4GmiLqRztA+aLc9474ldpOTkGV87WD2EGVE2gyBU6w49n8WfC9ol0/njH4oOi5rFeshcOoMJmdQYREfWO7DEXNoGNACtw1foWR/7I971dkCu57J803rGTbHQP/iOrlqGPQ5wJGgvxyCGv0CFs5vER+WJFyJQ2SZxhgYSYxo2kleNtFROQUAdfV8/7qYDxsoH1yGtNYCQ+HbWCmqb5oFwuLrospSO83Nw553YdBVRCo2P3+1/pj1SHmnqt4Df2rW6c86KBaMmABBdfC+mI5Vyd1kdrL32SoCw1qbmfZIUvGbaBz1hFkEpFx8AQHMkfx++Wd8FZrXokoaThZKd8mfoePvGQhKkazZTXJ8uTgqUeRgD9D9BKSRTCB9bdyc8Zgp5ancCn1/udJyRePG0G37we7rSWKkHE/HivlbH8keiWS+9Wl5AMUsYUNi8bzzVZyGMxPMJBHIAFMBbcwbTF63KeIa9qn6Hpjwc+R/2qpHJiE4DU9KaXiHppXMO4CVRL7VLbOjlC8uChr/YZV8S0hU6rANZA1+WIJPb19d9Pe136ROi/8BYlKLd9dpAoM99rwdJ+A0U/Phdk+31FUszCZABlqMs7+7gQC5z8+MagQI0XvbB7Jjz3gQpMGNIGX3YsZGBTEyzJE0BFEo5eZ5XR8VIfdIBH0PmkNgd1g8dpEagc03wxslrbN2n0xcKwBSB8uC3XCJh71/+bSFr4QXuGU3QWYy7wWA6PqrWZ5I6dq+9KA44FL2nUKe7ixe0Kt2511GpiveQTd7CkUh4plCxpQsaTW48cdRCr8XBSuZRtUQAAzWrRVZDRhNAP5UgiDYX3JX9NRgdEVtDVIuKrXZSqH5lpAXuRu45DB8Qxey4z9deP5JGRyMkbIcy2lX4FKdJdmdJVQkUAs4TBGRzTw5btHNHgJVYcs06/u3bWMRmuS7ineTLa9qPp/+1pau7o1RpgclNkYWvuFR7dY3b6wfZXUjgpbj53nLVmc5OVf/IT7wNsH1UBDWBo0pR7NWN8hIT7+msvhk6BFjieeVYa9cOnOrqF9niGgrtAAmcjIfcyejO+hAQCAgTcfPvZOZoL087vp7j7OneVlKbWAamdsESKVACDgus2Q75J9NHG1q+SMNoJl7T+ThFYZa67RoCrl2iAKbdfs1tEwlyRRKjix35y+qCnM3pzjltyrWWDQm5niDg5y6cmYDdcTaZoHLsXyWAAA=')!important;background-size:cover!important;background-position:center!important;background-repeat:no-repeat!important}\n#container .css-gxicr1>video,#container .css-7ycw0n>video,[data-bh30-native-hero]>video,[data-hf30-hero]>video{display:none!important;visibility:hidden!important;pointer-events:none!important}\n@media(max-width:767px){#container .css-gxicr1,#container .css-7ycw0n,[data-hm32-poster]{background-image:url('data:image/webp;base64,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')!important}}\n@media(max-width:1023px){\n#container header.css-1npqvn{width:100%!important;height:64px!important;min-height:64px!important;max-height:64px!important;padding:0!important;box-sizing:border-box!important}\n#container header.css-gs1j7q:not([data-brnav-header]),#container header.css-f62t5g:not([data-brnav-header]){height:64px!important;min-height:64px!important;max-height:64px!important;box-sizing:border-box!important;overflow:hidden!important;width:100%!important;position:relative!important;top:0!important;left:0!important;display:flex!important;align-items:center!important;justify-content:space-between!important;padding:0 24px!important}\n#container header.css-gs1j7q nav:not([data-brnav-menu]),#container header.css-f62t5g nav:not([data-brnav-menu]){display:none!important;visibility:hidden!important;pointer-events:none!important}\n#container header.css-gs1j7q:not([data-brnav-header])>a:first-child,#container header.css-f62t5g:not([data-brnav-header])>a:first-child{position:relative!important;flex:none!important;width:108px!important;height:32px!important;display:block!important}\n}\n@media(max-width:639px){\n[data-hlm-root] [data-hlm-heading],[data-hlm-root] [data-hlm-heading] *{-webkit-text-size-adjust:100%!important;text-size-adjust:100%!important}\n[data-hlm-root] [data-hlm-card] [data-hf30-name],[data-hlm-root] [data-hlm-card] [data-hf30-name] p,[data-hlm-root] [data-hlm-card] [data-hf30-name] span{white-space:nowrap!important;text-wrap:nowrap!important;word-break:normal!important;overflow-wrap:normal!important;width:100%!important;max-width:100%!important}\n[data-hlm-root] [data-hlm-card] [data-hf30-category]{white-space:normal!important;word-break:keep-all!important;overflow-wrap:normal!important;text-wrap:wrap!important}\n[data-hlm-root] [data-hm32-laserable] [data-hf30-category]{white-space:nowrap!important;text-wrap:nowrap!important}\n}\n\n</style>\n<script>\n/** Read-only startup gate for the currently published Figma Sites React runtime. */\n(function brainableAfterHydration(runEnhancements) {\n  'use strict';\n  const KEY = '__brainableHydrationGate31';\n  if (window[KEY]) return;\n  const startedAt = performance.now();\n  let phase = 'waiting', reason = 'document-parsing', frame = 0, timer = 0;\n  let readyChecks = 0, lastContainer = null, warned = false, stopped = false;\n  let rootsSeen = 0, suspensePending = 0;\n\n  function committedRoot(container) {\n    const keys = Object.getOwnPropertyNames(container).filter(name => name.startsWith('__reactContainer$'));\n    const handles = keys.map(name => container[name]);\n    if (container._reactRootContainer) handles.push(container._reactRootContainer);\n    rootsSeen = handles.length;\n    for (const handle of handles) {\n      const root = handle?.stateNode?.current ? handle.stateNode : handle?._internalRoot;\n      const current = root?.current;\n      if (!root || root.containerInfo !== container || current?.tag !== 3) continue;\n      if (current.memoizedState?.isDehydrated !== false || !current.child || current.memoizedState.element == null) continue;\n      return current;\n    }\n    return null;\n  }\n  function hasPendingHydration(root) {\n    const stack = [root], visited = new Set();\n    suspensePending = 0;\n    while (stack.length) {\n      const fiber = stack.pop();\n      if (!fiber || visited.has(fiber)) continue;\n      visited.add(fiber);\n      if (visited.size > 100000) { reason = 'unknown-large-react-tree'; return true; }\n      // React 18 in the observed Sites runtime: 13=Suspense, 18=DehydratedFragment.\n      if ((fiber.tag === 13 && fiber.memoizedState?.dehydrated != null) || fiber.tag === 18) suspensePending++;\n      if (fiber.child) stack.push(fiber.child);\n      if (fiber.sibling) stack.push(fiber.sibling);\n    }\n    return suspensePending > 0;\n  }\n  function isReady() {\n    if (document.readyState === 'loading') { reason = 'document-parsing'; return false; }\n    const container = document.getElementById('container');\n    if (!container?.isConnected) { reason = 'figma-container'; lastContainer = null; return false; }\n    if (container !== lastContainer) { lastContainer = container; readyChecks = 0; }\n    const root = committedRoot(container);\n    if (!root) { reason = rootsSeen ? 'react-root-not-committed' : 'react-root-not-attached'; return false; }\n    if (hasPendingHydration(root)) { if (reason !== 'unknown-large-react-tree') reason = 'suspense-hydration'; return false; }\n    reason = 'committed';\n    return true;\n  }\n  function cleanup() {\n    observer.disconnect();\n    window.removeEventListener('load', schedule);\n    document.removeEventListener('DOMContentLoaded', schedule);\n    document.removeEventListener('visibilitychange', schedule);\n    if (frame) cancelAnimationFrame(frame);\n    if (timer) clearTimeout(timer);\n    frame = timer = 0;\n  }\n  function check() {\n    frame = timer = 0;\n    if (stopped || phase !== 'waiting') return;\n    if (isReady()) readyChecks++;\n    else readyChecks = 0;\n    if (readyChecks >= 2) {\n      phase = 'starting';\n      cleanup();\n      try {\n        runEnhancements.call(window);\n        phase = 'active';\n      } catch (error) {\n        phase = 'failed';\n        reason = 'enhancement-exception';\n        console.error('[BRAINABLE] Enhancement startup failed after hydration.', error);\n      }\n      return;\n    }\n    if (!warned && performance.now() - startedAt >= 15000) {\n      warned = true;\n      console.warn('[BRAINABLE] Waiting for confirmed React hydration; the original page remains unchanged. Checks will continue.', reason);\n    }\n    schedule();\n  }\n  function schedule() {\n    if (stopped || phase !== 'waiting' || frame || timer) return;\n    // Delays throttle observation only. No elapsed timeout can authorize DOM mutation.\n    if (warned || document.visibilityState === 'hidden') timer = setTimeout(check, 250);\n    else frame = requestAnimationFrame(check);\n  }\n  const observer = new MutationObserver(schedule);\n  observer.observe(document.documentElement, {childList:true, subtree:true});\n  window.addEventListener('load', schedule, {once:true});\n  document.addEventListener('DOMContentLoaded', schedule, {once:true});\n  document.addEventListener('visibilitychange', schedule);\n  window[KEY] = {\n    inspect: () => ({phase, reason, rootsSeen, suspensePending, readyChecks, warned, elapsedMs:Math.round(performance.now()-startedAt)}),\n    stopWaiting() { if (phase !== 'waiting') return; stopped = true; phase = 'stopped'; cleanup(); }\n  };\n  schedule();\n})(function brainableApprovedFinal11() {\n/* BRAINABLE production global: navigation */\nvar BrainableNativeNavigation = (() => {\n  var __defProp = Object.defineProperty;\n  var __getOwnPropDesc = Object.getOwnPropertyDescriptor;\n  var __getOwnPropNames = Object.getOwnPropertyNames;\n  var __hasOwnProp = Object.prototype.hasOwnProperty;\n  var __export = (target, all) => {\n    for (var name in all)\n      __defProp(target, name, { get: all[name], enumerable: true });\n  };\n  var __copyProps = (to, from, except, desc) => {\n    if (from && typeof from === \"object\" || typeof from === \"function\") {\n      for (let key of __getOwnPropNames(from))\n        if (!__hasOwnProp.call(to, key) && key !== except)\n          __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });\n    }\n    return to;\n  };\n  var __toCommonJS = (mod) => __copyProps(__defProp({}, \"__esModule\", { value: true }), mod);\n\n  // navigation-global-entry.js\n  var navigation_global_entry_exports = {};\n  __export(navigation_global_entry_exports, {\n    installNavigationReference: () => installNavigationReference\n  });\n\n  // navigation-enhancer.js\n  var REGISTRY = Symbol.for(\"brainable.navigationEnhancer.registry.v1\");\n  var OWNED = \"data-brnav-header\";\n  var ATTRS = {\n    menu: \"data-brnav-menu\",\n    top: \"data-brnav-top-link\",\n    compact: \"data-brnav-compact\",\n    open: \"data-brnav-open\",\n    anchor: \"data-brnav-static-anchor\"\n  };\n  var NAV_ENHANCER_CSS = `\n[data-brnav-header] [data-brnav-top-link]{box-sizing:border-box;font-size:16px!important;line-height:24px!important;font-weight:400!important;padding:12px 32px!important;border-radius:4px!important;transition:background-color 150ms cubic-bezier(.4,0,.2,1),color 150ms cubic-bezier(.4,0,.2,1)!important}\n[data-brnav-header] [data-brnav-top-link]:hover{background-color:rgba(9,9,11,.1)!important}\n[data-brnav-header] [data-brnav-top-link]:focus-visible,[data-brnav-header] [data-brnav-toggle]:focus-visible{outline:2px solid #2055df!important;outline-offset:3px!important}\n[data-brnav-toggle]{display:none!important;box-sizing:border-box;appearance:none;border:0;border-radius:4px;background:transparent;color:inherit!important;padding:10px;width:44px;height:44px;cursor:pointer;align-items:center;justify-content:center}\n[data-brnav-toggle]:hover{background:rgba(9,9,11,.1)}\n[data-brnav-toggle] svg{display:block;width:24px;height:24px;pointer-events:none}\n[data-brnav-header][data-brnav-compact=\"true\"]{height:64px!important;min-height:64px!important;max-height:64px!important;overflow:visible!important;box-sizing:border-box!important}\n[data-brnav-header][data-brnav-compact=\"true\"][data-brnav-static-anchor=\"true\"]{position:relative!important}\n[data-brnav-header][data-brnav-compact=\"true\"] [data-brnav-toggle]{position:absolute;top:10px;right:16px;display:inline-flex!important;z-index:2}\n[data-brnav-header][data-brnav-compact=\"true\"] [data-brnav-menu]{box-sizing:border-box!important;position:absolute!important;inset:64px 0 auto 0!important;width:100%!important;min-width:0!important;max-width:100%!important;min-height:0!important;height:auto!important;max-height:calc(100vh - 64px)!important;max-height:calc(100dvh - 64px)!important;overflow:auto!important;overscroll-behavior:contain;display:flex!important;flex-direction:column!important;align-items:stretch!important;gap:0!important;padding:4px 20px 16px!important;background:#fff!important;color:#09090b!important;z-index:1}\n[data-brnav-header][data-brnav-compact=\"true\"] [data-brnav-menu][hidden]{display:none!important}\n[data-brnav-header][data-brnav-compact=\"true\"] [data-brnav-top-link]{width:100%!important;min-height:48px!important;padding:12px 16px!important;white-space:normal!important;justify-content:flex-start!important;text-align:left!important;color:inherit!important}\n@media(prefers-reduced-motion:reduce){[data-brnav-header],[data-brnav-header] *,[data-brnav-header] [data-brnav-top-link]{transition:none!important;scroll-behavior:auto!important}}\n`;\n  function registryFor(win) {\n    if (!win[REGISTRY]) win[REGISTRY] = { instances: /* @__PURE__ */ new WeakMap(), styles: /* @__PURE__ */ new WeakMap(), serial: 0 };\n    return win[REGISTRY];\n  }\n  function leaseStyles(doc, registry) {\n    let entry = registry.styles.get(doc);\n    if (!entry) {\n      const node = doc.createElement(\"style\");\n      node.setAttribute(\"data-brnav-enhancer-style\", \"v1\");\n      node.textContent = NAV_ENHANCER_CSS;\n      doc.head.append(node);\n      entry = { node, count: 0 };\n      registry.styles.set(doc, entry);\n    }\n    entry.count += 1;\n    return () => {\n      entry.count -= 1;\n      if (!entry.count) {\n        entry.node.remove();\n        registry.styles.delete(doc);\n      }\n    };\n  }\n  function attributeLedger() {\n    const entries = /* @__PURE__ */ new Map();\n    const originals = /* @__PURE__ */ new Map();\n    function record(element, name) {\n      if (!originals.has(element)) originals.set(element, /* @__PURE__ */ new Map());\n      const original = originals.get(element);\n      if (!original.has(name)) original.set(name, element.getAttribute(name));\n      return original.get(name);\n    }\n    function set(element, name, value) {\n      record(element, name);\n      if (!entries.has(element)) entries.set(element, /* @__PURE__ */ new Map());\n      entries.get(element).set(name, value);\n      if (element.getAttribute(name) !== value) {\n        if (value === null) element.removeAttribute(name);\n        else element.setAttribute(name, value);\n      }\n    }\n    function restore(element, name) {\n      const owned = entries.get(element);\n      if (!owned?.has(name)) return;\n      if (element.getAttribute(name) === owned.get(name)) {\n        const original = originals.get(element).get(name);\n        if (original === null) element.removeAttribute(name);\n        else element.setAttribute(name, original);\n      }\n      owned.delete(name);\n    }\n    return {\n      set,\n      restore,\n      destroy() {\n        entries.forEach((attributes, element) => [...attributes.keys()].forEach((name) => restore(element, name)));\n        entries.clear();\n        originals.clear();\n      }\n    };\n  }\n  function assertBindings(header, menuContainer, topLinkNodes) {\n    const win = header?.ownerDocument?.defaultView;\n    if (!win || !(header instanceof win.HTMLElement)) throw new TypeError(\"header must be a verified, existing HTMLElement.\");\n    if (!(menuContainer instanceof win.HTMLElement) || menuContainer === header || !header.contains(menuContainer)) throw new TypeError(\"menuContainer must be an existing descendant of header.\");\n    const nodes = Array.from(topLinkNodes || []);\n    if (!nodes.length || nodes.some((node) => !(node instanceof win.HTMLElement) || !menuContainer.contains(node))) throw new TypeError(\"topLinkNodes must be verified existing top-level item descendants of menuContainer (links, buttons, or a static current-page item).\");\n    if (new Set(nodes).size !== nodes.length) throw new TypeError(\"topLinkNodes must not contain duplicates.\");\n    return nodes;\n  }\n  function createEnhancer(header, menuContainer, topLinkNodes, options = {}) {\n    const links = assertBindings(header, menuContainer, topLinkNodes);\n    const doc = header.ownerDocument;\n    const win = doc.defaultView;\n    const registry = registryFor(win);\n    const existing = registry.instances.get(header);\n    if (existing) {\n      if (existing.menuContainer !== menuContainer || existing.topLinkNodes.length !== links.length || existing.topLinkNodes.some((node, index) => node !== links[index])) throw new Error(\"This header already has different bindings. Destroy its enhancer before rebinding.\");\n      return existing;\n    }\n    const breakpoint = options.breakpoint ?? 1023;\n    if (!Number.isFinite(breakpoint) || breakpoint < 320) throw new TypeError(\"breakpoint must be a finite width >= 320.\");\n    const toggleHost = options.toggleHost || menuContainer.parentElement;\n    const toggleBefore = options.toggleBefore === void 0 ? toggleHost === menuContainer.parentElement ? menuContainer : null : options.toggleBefore;\n    if (!toggleHost || !(toggleHost === header || header.contains(toggleHost)) || menuContainer.contains(toggleHost)) throw new TypeError(\"toggleHost must be inside header and outside the collapsing menu.\");\n    if (toggleBefore && toggleBefore.parentNode !== toggleHost) throw new TypeError(\"toggleBefore must be a current child of toggleHost.\");\n    const initialSnapshots = [header, menuContainer, ...links].map((element) => ({\n      element,\n      classAttribute: element.getAttribute(\"class\"),\n      styleAttribute: element.getAttribute(\"style\"),\n      attributes: Object.fromEntries([...element.attributes].map((attr) => [attr.name, attr.value]))\n    }));\n    const ledger = attributeLedger();\n    const releaseStyles = leaseStyles(doc, registry);\n    let id = `brnav-${++registry.serial}`;\n    while (doc.getElementById(`${id}-menu`)) id = `brnav-${++registry.serial}`;\n    const menuId = menuContainer.id || `${id}-menu`;\n    if (!menuContainer.id) ledger.set(menuContainer, \"id\", menuId);\n    ledger.set(header, OWNED, id);\n    ledger.set(menuContainer, ATTRS.menu, id);\n    links.forEach((node) => ledger.set(node, ATTRS.top, id));\n    const toggle = doc.createElement(\"button\");\n    toggle.type = \"button\";\n    toggle.setAttribute(\"data-brnav-toggle\", id);\n    toggle.setAttribute(\"aria-controls\", menuId);\n    const icon = doc.createElementNS(\"http://www.w3.org/2000/svg\", \"svg\");\n    icon.setAttribute(\"viewBox\", \"0 0 24 24\");\n    icon.setAttribute(\"fill\", \"none\");\n    icon.setAttribute(\"aria-hidden\", \"true\");\n    const path = doc.createElementNS(\"http://www.w3.org/2000/svg\", \"path\");\n    path.setAttribute(\"stroke\", \"currentColor\");\n    path.setAttribute(\"stroke-width\", \"1.5\");\n    path.setAttribute(\"stroke-linecap\", \"round\");\n    icon.append(path);\n    toggle.append(icon);\n    toggleHost.insertBefore(toggle, toggleBefore);\n    const media = win.matchMedia(`(max-width: ${breakpoint}px)`);\n    let compact = media.matches;\n    let open = false;\n    let disposed = false;\n    let focusTask = 0;\n    function render() {\n      if (disposed) return;\n      ledger.set(header, ATTRS.compact, String(compact));\n      ledger.set(header, ATTRS.open, String(compact && open));\n      ledger.set(header, ATTRS.anchor, String(win.getComputedStyle(header).position === \"static\" || header.getAttribute(ATTRS.anchor) === \"true\"));\n      if (compact && !open) {\n        ledger.set(menuContainer, \"hidden\", \"\");\n        ledger.set(menuContainer, \"inert\", \"\");\n        ledger.set(menuContainer, \"aria-hidden\", \"true\");\n      } else {\n        [\"hidden\", \"inert\", \"aria-hidden\"].forEach((name) => ledger.restore(menuContainer, name));\n      }\n      toggle.setAttribute(\"aria-label\", open ? \"\\uBA54\\uB274 \\uB2EB\\uAE30\" : \"\\uBA54\\uB274 \\uC5F4\\uAE30\");\n      toggle.setAttribute(\"aria-expanded\", String(compact && open));\n      path.setAttribute(\"d\", open ? \"m6 6 12 12M18 6 6 18\" : \"M4 7h16M4 12h16M4 17h16\");\n    }\n    function firstAvailableLink() {\n      return links.find((node) => node.tabIndex >= 0 && !node.matches(\":disabled\") && node.getAttribute(\"aria-disabled\") !== \"true\" && !node.closest('[hidden],[inert],[aria-hidden=\"true\"]') && ![\"hidden\", \"collapse\"].includes(win.getComputedStyle(node).visibility) && node.getClientRects().length > 0);\n    }\n    function openMenu({ focusFirst = options.focusFirstOnOpen ?? false } = {}) {\n      if (disposed || !compact) return;\n      open = true;\n      render();\n      if (focusFirst) firstAvailableLink()?.focus();\n    }\n    function closeMenu({ returnFocus = false } = {}) {\n      if (disposed) return;\n      const wasOpen = open;\n      open = false;\n      render();\n      if (returnFocus && compact && wasOpen) toggle.focus();\n    }\n    function onToggle(event) {\n      event.preventDefault();\n      event.stopPropagation();\n      if (open) closeMenu();\n      else openMenu({ focusFirst: event.detail === 0 });\n    }\n    function onToggleKeyDown(event) {\n      if ([\"Enter\", \" \", \"Spacebar\"].includes(event.key)) event.stopPropagation();\n    }\n    function onKeyDown(event) {\n      if (event.defaultPrevented || event.key !== \"Escape\" || !compact || !open || !header.contains(event.target)) return;\n      if (options.shouldHandleEscape && !options.shouldHandleEscape(event)) return;\n      win.queueMicrotask(() => {\n        if (disposed || event.defaultPrevented || !compact || !open) return;\n        closeMenu({ returnFocus: header.contains(doc.activeElement) });\n      });\n    }\n    function onOutside(event) {\n      if (!compact || !open) return;\n      const inside = event.composedPath ? event.composedPath().includes(header) : header.contains(event.target);\n      if (!inside) closeMenu();\n    }\n    function onFocusOut() {\n      win.clearTimeout(focusTask);\n      focusTask = win.setTimeout(() => {\n        if (!disposed && compact && open && !header.contains(doc.activeElement)) closeMenu();\n      }, 0);\n    }\n    function onModeChange() {\n      const focusWasInMenu = menuContainer.contains(doc.activeElement);\n      const focusWasToggle = doc.activeElement === toggle;\n      compact = media.matches;\n      open = false;\n      render();\n      if (compact && focusWasInMenu) toggle.focus();\n      else if (!compact && focusWasToggle) firstAvailableLink()?.focus();\n    }\n    toggle.addEventListener(\"click\", onToggle);\n    toggle.addEventListener(\"keydown\", onToggleKeyDown);\n    doc.addEventListener(\"keydown\", onKeyDown);\n    header.addEventListener(\"focusout\", onFocusOut);\n    doc.addEventListener(\"pointerdown\", onOutside);\n    media.addEventListener(\"change\", onModeChange);\n    render();\n    const api = {\n      header,\n      menuContainer,\n      topLinkNodes: links,\n      open: openMenu,\n      close: closeMenu,\n      refresh() {\n        if (!disposed) render();\n      },\n      inspect() {\n        return {\n          id,\n          compact,\n          open,\n          disposed,\n          breakpoint,\n          bindingsConnected: header.isConnected && menuContainer.isConnected && links.every((node) => node.isConnected),\n          originalSnapshots: initialSnapshots,\n          originalClassAndStyleUnchanged: initialSnapshots.every((item) => item.element.getAttribute(\"class\") === item.classAttribute && item.element.getAttribute(\"style\") === item.styleAttribute),\n          toggle,\n          menuId\n        };\n      },\n      destroy({ returnFocus = false } = {}) {\n        if (disposed) return;\n        disposed = true;\n        win.clearTimeout(focusTask);\n        toggle.removeEventListener(\"click\", onToggle);\n        toggle.removeEventListener(\"keydown\", onToggleKeyDown);\n        doc.removeEventListener(\"keydown\", onKeyDown);\n        header.removeEventListener(\"focusout\", onFocusOut);\n        doc.removeEventListener(\"pointerdown\", onOutside);\n        media.removeEventListener(\"change\", onModeChange);\n        const focusWasToggle = doc.activeElement === toggle;\n        toggle.remove();\n        ledger.destroy();\n        releaseStyles();\n        registry.instances.delete(header);\n        if (returnFocus && focusWasToggle) firstAvailableLink()?.focus();\n      }\n    };\n    registry.instances.set(header, api);\n    return api;\n  }\n\n  // navigation-authorized-dropdowns.js\n  var AUTHORIZED_DROPDOWNS = Object.freeze({\n    \"\\uC81C\\uD488\\uC18C\\uAC1C\": Object.freeze([{ label: \"LASERABLE\", href: \"/laserable\" }]),\n    \"\\uCEE4\\uBBA4\\uB2C8\\uD2F0\": Object.freeze([{ label: \"ARTIRCLES\", href: \"/\\uCEE4\\uBBA4\\uB2C8\\uD2F0Articles\" }, { label: \"NEWS\", href: \"/\\uCEE4\\uBBA4\\uB2C8\\uD2F0News\" }])\n  });\n  var AUTHORIZED_DROPDOWN_CSS = `\n[data-nav30-owned-dropdown]{box-sizing:border-box!important;list-style:none!important;margin:0!important;padding:0!important;border:0!important;flex:none!important;font:inherit!important;color:#09090b!important;z-index:1000}\n[data-nav30-owned-dropdown][data-compact=\"false\"]{position:fixed!important;display:block!important;width:256px!important;max-width:calc(100vw - 32px)!important;height:auto!important;padding-top:16px!important}\n[data-nav30-owned-dropdown][data-compact=\"false\"][data-open=\"false\"]{pointer-events:none!important}\n[data-nav30-owned-dropdown][data-compact=\"true\"]{position:relative!important;display:block!important;width:100%!important;min-height:0!important;height:auto!important}\n[data-nav30-child-panel]{box-sizing:border-box!important;width:100%!important;margin:0!important;padding:0!important;border:1px solid #e4e4e7!important;border-radius:8px!important;background:#fff!important;color:#09090b!important;box-shadow:none!important;overflow:hidden!important}\n[data-nav30-child-panel][hidden]{display:none!important}\n[data-nav30-owned-dropdown][data-compact=\"true\"][data-open=\"true\"]{padding:0 0 8px!important}\n[data-nav30-owned-dropdown] [data-nav30-child-link]{box-sizing:border-box!important;display:flex!important;align-items:center!important;width:100%!important;min-height:56px!important;margin:0!important;padding:16px!important;border:0!important;border-radius:0!important;background:transparent!important;color:#09090b!important;font:inherit!important;font-size:16px!important;line-height:24px!important;font-weight:400!important;text-decoration:none!important;white-space:normal!important;transition:background-color 150ms cubic-bezier(.4,0,.2,1)!important}\n[data-nav30-owned-dropdown] [data-nav30-child-link]:hover{background:rgba(9,9,11,.1)!important}\n[data-nav30-owned-dropdown] [data-nav30-child-link]:focus-visible,[data-nav30-child-toggle]:focus-visible{outline:2px solid #2055df!important;outline-offset:-3px!important}\n[data-nav30-child-toggle]{box-sizing:border-box!important;position:absolute!important;right:0!important;top:-48px!important;display:none!important;align-items:center!important;justify-content:center!important;width:44px!important;height:48px!important;min-height:48px!important;margin:0!important;padding:12px!important;border:0!important;border-radius:4px!important;background:transparent!important;color:#09090b!important;cursor:pointer!important}\n[data-nav30-owned-dropdown][data-compact=\"true\"]>[data-nav30-child-toggle]{display:flex!important}\n[data-nav30-owned-dropdown][data-compact=\"false\"]>[data-nav30-child-toggle]{display:flex!important;width:28px!important;min-height:0!important;padding:6px!important;pointer-events:auto!important}\n[data-nav30-child-toggle]:hover{background:rgba(9,9,11,.1)!important}\n[data-nav30-child-toggle] svg{width:16px!important;height:16px!important;pointer-events:none;transition:transform 150ms cubic-bezier(.4,0,.2,1)}\n[data-nav30-child-toggle][aria-expanded=\"true\"] svg{transform:rotate(180deg)}\n[data-nav30-dropdown-parent][data-nav30-dropdown-compact=\"true\"]{padding-right:56px!important}\n[data-nav30-kind=\"home\"] .products-panel a{text-transform:uppercase!important}\n@media(prefers-reduced-motion:reduce){[data-nav30-owned-dropdown] *{transition:none!important}}\n`;\n  function originalNavigationText(node) {\n    let text = \"\";\n    for (const child of node.childNodes) {\n      if (child.nodeType === 3) text += child.nodeValue;\n      else if (child.nodeType === 1 && !child.hasAttribute(\"data-nav30-owned-dropdown\")) text += originalNavigationText(child);\n    }\n    return text;\n  }\n  var serial = 0;\n  function createAuthorizedDropdowns({ header, items, breakpoint = 1023, skipLabels = [], beforeOpen = () => {\n  }, onStateChange = () => {\n  } }) {\n    const doc = header.ownerDocument, win = doc.defaultView;\n    const media = win.matchMedia(`(max-width:${breakpoint}px)`);\n    const entries = [], cleanups = [];\n    let disposed = false;\n    const positions = doc.createElement(\"style\");\n    positions.setAttribute(\"data-nav30-child-position\", \"true\");\n    doc.head.append(positions);\n    const restore = [];\n    function ownAttr(node, name, value) {\n      const old = node.getAttribute(name);\n      node.setAttribute(name, value);\n      restore.push(() => {\n        if (old === null) node.removeAttribute(name);\n        else node.setAttribute(name, old);\n      });\n    }\n    const keep = (node, event, handler, options) => {\n      node.addEventListener(event, handler, options);\n      cleanups.push(() => node.removeEventListener(event, handler, options));\n    };\n    function position() {\n      const rules = [];\n      for (const entry of entries) {\n        const rect = entry.parent.getBoundingClientRect();\n        const left = Math.max(16, Math.min(rect.left, doc.documentElement.clientWidth - 272));\n        rules.push(`[data-nav30-owned-dropdown=\"${entry.id}\"][data-compact=\"false\"]{left:${Math.round(left)}px!important;top:${Math.round(rect.bottom)}px!important}`);\n        rules.push(`[data-nav30-owned-dropdown=\"${entry.id}\"]>[data-nav30-child-toggle]{top:-${Math.round(rect.height || 48)}px!important;height:${Math.round(rect.height || 48)}px!important}`);\n        rules.push(`[data-nav30-owned-dropdown=\"${entry.id}\"][data-compact=\"false\"]>[data-nav30-child-toggle]{left:${Math.round(rect.right - left - 30)}px!important;right:auto!important}`);\n      }\n      const css = rules.join(\"\\n\");\n      if (positions.textContent !== css) positions.textContent = css;\n    }\n    function setOpen(entry, value) {\n      if (disposed) return;\n      if (value) {\n        beforeOpen();\n        for (const other of entries) if (other !== entry) setOpen(other, false);\n      }\n      if (entry.timer) {\n        win.clearTimeout(entry.timer);\n        entry.timer = null;\n      }\n      entry.open = value;\n      entry.row.setAttribute(\"data-open\", String(value));\n      entry.panel.hidden = !value;\n      entry.toggle.setAttribute(\"aria-expanded\", String(value));\n      entry.toggle.setAttribute(\"aria-label\", `${entry.label} \\uD558\\uC704 \\uBA54\\uB274 ${value ? \"\\uB2EB\\uAE30\" : \"\\uC5F4\\uAE30\"}`);\n      onStateChange(entries.some((item) => item.open));\n      position();\n    }\n    function delayedClose(entry) {\n      if (entry.timer) win.clearTimeout(entry.timer);\n      entry.timer = win.setTimeout(() => {\n        if (!entry.row.contains(doc.activeElement) && !entry.parent.contains(doc.activeElement)) setOpen(entry, false);\n      }, 130);\n    }\n    for (const parent of items) {\n      const label = originalNavigationText(parent).trim();\n      const links = AUTHORIZED_DROPDOWNS[label];\n      if (!links || skipLabels.includes(label)) continue;\n      const host = parent.parentElement;\n      const after = host?.matches(\"li\") ? host : parent;\n      if (!after.parentElement) continue;\n      const id = `nav30-child-${++serial}`;\n      const row = doc.createElement(after.parentElement.matches(\"ul,ol\") ? \"li\" : \"div\");\n      row.setAttribute(\"data-nav30-owned-dropdown\", id);\n      row.setAttribute(\"data-compact\", String(media.matches));\n      row.setAttribute(\"data-open\", \"false\");\n      const panel = doc.createElement(\"div\");\n      panel.setAttribute(\"data-nav30-child-panel\", \"true\");\n      panel.id = id;\n      panel.hidden = true;\n      const toggle = doc.createElement(\"button\");\n      toggle.type = \"button\";\n      toggle.setAttribute(\"data-nav30-child-toggle\", \"true\");\n      toggle.setAttribute(\"aria-controls\", id);\n      toggle.setAttribute(\"aria-expanded\", \"false\");\n      toggle.setAttribute(\"aria-label\", `${label} \\uD558\\uC704 \\uBA54\\uB274 \\uC5F4\\uAE30`);\n      const svg = doc.createElementNS(\"http://www.w3.org/2000/svg\", \"svg\");\n      svg.setAttribute(\"viewBox\", \"0 0 24 24\");\n      svg.setAttribute(\"fill\", \"none\");\n      svg.setAttribute(\"aria-hidden\", \"true\");\n      const path = doc.createElementNS(\"http://www.w3.org/2000/svg\", \"path\");\n      path.setAttribute(\"d\", \"m6 9 6 6 6-6\");\n      path.setAttribute(\"stroke\", \"currentColor\");\n      path.setAttribute(\"stroke-width\", \"1.5\");\n      path.setAttribute(\"stroke-linecap\", \"round\");\n      path.setAttribute(\"stroke-linejoin\", \"round\");\n      svg.append(path);\n      toggle.append(svg);\n      for (const link of links) {\n        const anchor = doc.createElement(\"a\");\n        anchor.setAttribute(\"data-nav30-child-link\", \"true\");\n        anchor.href = link.href;\n        anchor.textContent = link.label;\n        keep(anchor, \"click\", (event) => event.stopPropagation());\n        panel.append(anchor);\n        keep(anchor, \"keydown\", (event) => {\n          if (event.key === \"Enter\") event.stopPropagation();\n        });\n      }\n      row.append(toggle, panel);\n      after.after(row);\n      ownAttr(parent, \"data-nav30-dropdown-parent\", id);\n      ownAttr(parent, \"data-nav30-dropdown-compact\", String(media.matches));\n      const entry = { id, label, parent, row, panel, toggle, links, open: false, timer: null, focusTimer: null, suppressFocusOpen: false };\n      entries.push(entry);\n      keep(toggle, \"click\", (event) => {\n        event.preventDefault();\n        event.stopPropagation();\n        setOpen(entry, !entry.open);\n      });\n      keep(toggle, \"keydown\", (event) => {\n        if ([\"Enter\", \" \", \"Spacebar\"].includes(event.key)) event.stopPropagation();\n      });\n      keep(parent, \"pointerenter\", (event) => {\n        if (!media.matches && event.pointerType === \"mouse\") setOpen(entry, true);\n      });\n      keep(parent, \"pointerleave\", () => {\n        if (!media.matches) delayedClose(entry);\n      });\n      keep(row, \"pointerenter\", (event) => {\n        if (entry.timer) {\n          win.clearTimeout(entry.timer);\n          entry.timer = null;\n        }\n        if (!media.matches && event.pointerType === \"mouse\") setOpen(entry, true);\n      });\n      keep(row, \"pointerleave\", () => {\n        if (!media.matches) delayedClose(entry);\n      });\n      keep(parent, \"focusin\", () => {\n        if (!media.matches && !entry.suppressFocusOpen) setOpen(entry, true);\n      });\n      const focusout = (event) => {\n        if (entry.focusTimer) win.clearTimeout(entry.focusTimer);\n        if (event.relatedTarget && (row.contains(event.relatedTarget) || parent.contains(event.relatedTarget))) return;\n        entry.focusTimer = win.setTimeout(() => {\n          if (!disposed && !row.contains(doc.activeElement) && !parent.contains(doc.activeElement)) setOpen(entry, false);\n        }, 0);\n      };\n      keep(parent, \"focusout\", focusout);\n      keep(row, \"focusout\", focusout);\n    }\n    const closeAll = () => entries.forEach((entry) => setOpen(entry, false));\n    const mode = () => {\n      for (const entry of entries) {\n        entry.row.setAttribute(\"data-compact\", String(media.matches));\n        entry.parent.setAttribute(\"data-nav30-dropdown-compact\", String(media.matches));\n      }\n      closeAll();\n      position();\n    };\n    keep(media, \"change\", mode);\n    keep(win, \"resize\", position);\n    keep(win, \"scroll\", position, true);\n    keep(doc, \"pointerdown\", (event) => {\n      if (!entries.some((entry) => entry.parent.contains(event.target) || entry.row.contains(event.target))) closeAll();\n    });\n    keep(header, \"keydown\", (event) => {\n      if (event.key !== \"Escape\") return;\n      const entry = entries.find((item) => item.open);\n      if (!entry) return;\n      event.preventDefault();\n      if (entry.row.contains(event.target)) event.stopPropagation();\n      setOpen(entry, false);\n      win.queueMicrotask(() => {\n        if (disposed) return;\n        entry.suppressFocusOpen = true;\n        try {\n          (media.matches || entry.parent.tabIndex < 0 ? entry.toggle : entry.parent).focus();\n        } finally {\n          entry.suppressFocusOpen = false;\n        }\n      });\n    }, true);\n    const sizes = new win.ResizeObserver(position);\n    entries.forEach((entry) => sizes.observe(entry.parent));\n    sizes.observe(header);\n    position();\n    return {\n      hasOpen() {\n        return entries.some((entry) => entry.open);\n      },\n      close: closeAll,\n      inspect() {\n        return entries.map(({ label, links, open }) => ({ parent: label, links, open }));\n      },\n      destroy() {\n        if (disposed) return;\n        closeAll();\n        disposed = true;\n        cleanups.forEach((fn) => fn());\n        sizes.disconnect();\n        entries.forEach((entry) => {\n          if (entry.timer) win.clearTimeout(entry.timer);\n          if (entry.focusTimer) win.clearTimeout(entry.focusTimer);\n          entry.row.remove();\n        });\n        restore.reverse().forEach((fn) => fn());\n        positions.remove();\n      }\n    };\n  }\n\n  // navigation-global-entry.js\n  var KEY = \"__brainableNavigationReference30\";\n  var STYLE = `\n${NAV_ENHANCER_CSS}\n${AUTHORIZED_DROPDOWN_CSS}\n[data-nav30-kind=\"native\"]{position:relative!important;display:flex!important;flex-direction:row!important;align-items:center!important;justify-content:space-between!important;width:100%!important;min-width:0!important;max-width:none!important;height:80px!important;min-height:80px!important;padding:0 5%!important;gap:24px!important;background:#fff!important;color:#09090b!important;overflow:visible!important;box-sizing:border-box!important}\n[data-nav30-native-shell]{width:100%!important;min-width:0!important;max-width:none!important;height:auto!important;min-height:0!important;padding:0!important;margin:0!important;gap:0!important;align-self:stretch!important;box-sizing:border-box!important;overflow:visible!important}\n[data-nav30-menu-wrap]{display:contents!important}\n[data-nav30-kind=\"native\"] [data-brnav-menu]{display:flex!important;align-items:center!important;gap:0!important;width:auto!important;min-width:0!important;max-width:none!important;padding:0!important;overflow:visible!important}\n[data-nav30-kind=\"native\"] [data-brnav-top-link]{position:relative!important;display:flex!important;flex-direction:row!important;align-items:center!important;justify-content:center!important;width:auto!important;height:auto!important;min-width:0!important;min-height:48px!important;max-width:none!important;max-height:none!important;flex:none!important;color:inherit!important;text-decoration:none!important}\n[data-nav30-kind=\"native\"] [data-brnav-top-link] p,[data-nav30-kind=\"native\"] [data-brnav-top-link] span{font:inherit!important;line-height:inherit!important;color:inherit!important;text-align:inherit!important;letter-spacing:normal!important;text-decoration:none!important;white-space:nowrap!important;margin:0!important;width:auto!important;min-width:0!important;max-width:none!important}\n[data-nav30-logo]{display:flex!important;align-items:center!important;flex:none!important;min-width:0!important;min-height:0!important;max-height:none!important;overflow:hidden!important}\n[data-brnav-header][data-nav30-kind=\"native\"][data-brnav-compact=\"true\"]{height:64px!important;min-height:64px!important;padding:0 20px!important}\n[data-nav30-native-shell][data-nav30-compact=\"true\"]{height:64px!important;min-height:64px!important;max-height:64px!important}\n[data-brnav-header][data-nav30-kind=\"native\"][data-brnav-compact=\"true\"] [data-brnav-menu]{position:absolute!important;inset:64px 0 auto 0!important;width:100%!important;max-width:100%!important;max-height:calc(100dvh - 64px)!important;padding:4px 20px 16px!important;overflow:auto!important;align-items:stretch!important;flex-direction:column!important;background:#fff!important}\n[data-brnav-header][data-nav30-kind=\"native\"][data-brnav-compact=\"true\"] [data-brnav-menu][hidden]{display:none!important}\n[data-brnav-header][data-nav30-kind=\"native\"][data-brnav-compact=\"true\"] [data-brnav-top-link]{width:100%!important;justify-content:flex-start!important;padding:12px 16px!important}\n[data-brnav-header][data-nav30-kind=\"home\"][data-brnav-compact=\"false\"] .products-panel{top:100%!important;width:256px!important;padding:16px 0 0!important;background:transparent!important;color:#09090b!important;border:0!important;box-shadow:none!important;transition:visibility 150ms cubic-bezier(.4,0,.2,1)!important}\n[data-brnav-header][data-nav30-kind=\"home\"][data-brnav-compact=\"false\"] .products-panel>div{background:#fff!important;border:1px solid #e4e4e7!important;border-radius:8px!important;overflow:hidden!important;padding:0!important}\n[data-brnav-header][data-nav30-kind=\"home\"][data-brnav-compact=\"false\"] .products-panel a{display:block!important;width:100%!important;margin:0!important;padding:16px!important;font-size:16px!important;line-height:24px!important;font-weight:400!important;color:#09090b!important;min-height:56px!important}\n[data-brnav-header][data-nav30-kind=\"home\"] .products-panel a:hover{background:rgba(9,9,11,.1)!important}\n[data-brnav-header][data-nav30-kind=\"home\"][data-nav30-authorized-open=\"true\"] .products-panel{visibility:hidden!important;pointer-events:none!important}\n[data-nav30-products-toggle]{display:none!important}\n[data-brnav-header][data-nav30-kind=\"home\"][data-brnav-compact=\"true\"] [data-nav30-products-item]{display:grid!important;grid-template-columns:minmax(0,1fr) 44px!important;align-items:center!important}\n[data-brnav-header][data-nav30-kind=\"home\"][data-brnav-compact=\"true\"] [data-nav30-products-toggle]{display:flex!important;align-items:center!important;justify-content:center!important;width:44px!important;min-height:48px!important;padding:12px!important;border:0!important;border-radius:4px!important;background:transparent!important;color:inherit!important;cursor:pointer}\n[data-brnav-header][data-nav30-kind=\"home\"][data-brnav-compact=\"true\"] [data-nav30-products-toggle]:hover{background:rgba(9,9,11,.1)!important}\n[data-nav30-products-toggle] svg{display:block;width:16px;height:16px;transition:transform 150ms cubic-bezier(.4,0,.2,1)}\n[data-nav30-products-toggle][aria-expanded=\"true\"] svg{transform:rotate(180deg)}\n[data-brnav-header][data-nav30-kind=\"home\"] .nav-links{gap:0!important}\n[data-brnav-header][data-nav30-kind=\"home\"] .nav-links [data-brnav-top-link]{font-weight:400!important}\n[data-brnav-header][data-nav30-kind=\"home\"] [data-brnav-top-link]:hover,[data-brnav-header][data-nav30-kind=\"home\"] [data-brnav-top-link][aria-expanded=\"true\"]{color:inherit!important}\n[data-brnav-header][data-nav30-kind=\"home\"] .nav-inner{gap:24px!important}\n[data-brnav-header][data-nav30-kind=\"home\"][data-brnav-compact=\"true\"]{display:grid!important;grid-template-columns:minmax(0,1fr) auto!important;grid-template-rows:64px max-content max-content!important;align-items:stretch!important;padding:0!important;background:#fff!important;color:#09090b!important}\n[data-brnav-header][data-nav30-kind=\"home\"][data-brnav-compact=\"true\"] .nav-inner{display:contents!important}\n[data-brnav-header][data-nav30-kind=\"home\"][data-brnav-compact=\"true\"] .brand{grid-column:1!important;grid-row:1!important;width:158px!important;min-height:44px!important;align-self:center!important;margin:0 20px!important}\n[data-brnav-header][data-nav30-kind=\"home\"][data-brnav-compact=\"true\"] .brand img{filter:none!important}\n[data-brnav-header][data-nav30-kind=\"home\"][data-brnav-compact=\"true\"] [data-brnav-toggle]{position:static!important;grid-column:2!important;grid-row:1!important;align-self:center!important;margin:0 10px 0 0!important}\n[data-brnav-header][data-nav30-kind=\"home\"][data-brnav-compact=\"true\"] [data-brnav-menu]{position:static!important;inset:auto!important;grid-row:2!important;grid-column:1/-1!important;max-height:calc(100dvh - 64px)!important;padding:4px 20px 16px!important}\n[data-brnav-header][data-nav30-kind=\"home\"][data-brnav-compact=\"true\"][data-nav30-products=\"true\"] [data-brnav-menu]{max-height:calc(100dvh - 64px - 76px)!important}\n[data-brnav-header][data-nav30-kind=\"home\"][data-brnav-compact=\"true\"] .nav-links{display:flex!important;flex-direction:column!important;align-items:stretch!important;width:100%!important;gap:0!important}\n[data-brnav-header][data-nav30-kind=\"home\"][data-brnav-compact=\"true\"] .nav-item:not([data-nav30-products-item]){display:block!important;width:100%!important;min-height:48px!important}\n[data-brnav-header][data-nav30-kind=\"home\"][data-brnav-compact=\"true\"] .nav-links [data-brnav-top-link]{display:flex!important;width:100%!important;justify-content:flex-start!important;padding:12px 16px!important;color:inherit!important}\n[data-brnav-header][data-nav30-kind=\"home\"][data-brnav-compact=\"true\"] .products-panel{position:static!important;inset:auto!important;grid-column:1/-1!important;grid-row:3!important;width:100%!important;max-height:76px!important;overflow:auto!important;padding:0 20px 12px!important;border:0!important;transition:none!important}\n[data-brnav-header][data-nav30-kind=\"home\"][data-brnav-compact=\"true\"] .products-panel>div{overflow:visible!important}\n[data-brnav-header][data-nav30-kind=\"home\"][data-brnav-compact=\"true\"] .products-panel a{display:block!important;width:100%!important;margin:0!important;padding:12px 16px!important;border-radius:4px!important;font-size:16px!important;line-height:24px!important;font-weight:400!important;color:#52525b!important}\n[data-brnav-header][data-nav30-kind=\"home\"][data-brnav-compact=\"true\"] .products-panel[data-open=\"false\"],\n[data-brnav-header][data-nav30-kind=\"home\"][data-brnav-compact=\"true\"][data-brnav-open=\"false\"] .products-panel{display:none!important}\n[data-nav30-kind=\"renewal\"] .b-desk-nav{gap:0!important}\n[data-nav30-kind=\"renewal\"] .b-desk-nav a,[data-nav30-kind=\"renewal\"] .b-mob-nav a{display:block!important;font-size:16px!important;line-height:24px!important;font-weight:400!important;padding:12px 32px!important;border-radius:4px!important;transition:background-color 150ms cubic-bezier(.4,0,.2,1)!important}\n[data-nav30-kind=\"renewal\"] .b-desk-nav a:hover,[data-nav30-kind=\"renewal\"] .b-mob-nav a:hover{background:rgba(9,9,11,.1)!important}\n[data-nav30-kind=\"renewal\"] .b-menu-btn{font-size:16px!important;line-height:24px!important;font-weight:400!important;border:0!important;border-radius:4px!important;min-width:52px!important;height:44px!important;box-shadow:none!important}\n@media(max-width:959px){[data-nav30-kind=\"renewal\"] .b-header-inner{height:64px!important}[data-nav30-kind=\"renewal\"] .b-mob-nav{max-height:calc(100dvh - 64px)!important;overflow:auto!important;overscroll-behavior:contain;box-shadow:none!important;border:0!important;padding:4px 20px 16px!important}[data-nav30-kind=\"renewal\"] .b-mob-nav a{padding:12px 16px!important;border:0!important}}\n@media(prefers-reduced-motion:reduce){[data-nav30-kind],[data-nav30-kind] *,[data-brnav-header][data-nav30-kind][data-brnav-compact] [data-brnav-top-link],[data-brnav-header][data-nav30-kind][data-brnav-compact] .products-panel,[data-nav30-kind] [data-nav30-owned-dropdown] [data-nav30-child-link],[data-nav30-kind=\"renewal\"] .b-desk-nav a,[data-nav30-kind=\"renewal\"] .b-mob-nav a{transition:none!important;scroll-behavior:auto!important}}\n`;\n  function ownedAttributes() {\n    const entries = /* @__PURE__ */ new Map();\n    return {\n      set(node, name, value) {\n        if (!node) return;\n        if (!entries.has(node)) entries.set(node, /* @__PURE__ */ new Map());\n        const attrs = entries.get(node);\n        if (!attrs.has(name)) attrs.set(name, { old: node.getAttribute(name), last: value });\n        attrs.get(name).last = value;\n        if (node.getAttribute(name) !== value) node.setAttribute(name, value);\n      },\n      destroy() {\n        entries.forEach((attrs, node) => attrs.forEach(({ old, last }, name) => {\n          if (node.getAttribute(name) !== last) return;\n          if (old === null) node.removeAttribute(name);\n          else node.setAttribute(name, old);\n        }));\n        entries.clear();\n      }\n    };\n  }\n  function itemSignature(node) {\n    return { label: originalNavigationText(node), href: node.getAttribute(\"href\"), role: node.getAttribute(\"role\"), tabindex: node.getAttribute(\"tabindex\"), tag: node.tagName };\n  }\n  function captureBaseline(header, items) {\n    const nodes = [.../* @__PURE__ */ new Set([...items, ...header.querySelectorAll('a,[role=\"link\"],button')])];\n    return nodes.filter((node) => !node.hasAttribute(\"data-brnav-toggle\") && !node.closest(\"[data-nav30-owned-dropdown]\")).map((node) => ({\n      node,\n      signature: itemSignature(node),\n      nativeToggle: node.matches(\".b-menu-btn\"),\n      onclick: node.onclick,\n      classValue: node.getAttribute(\"class\"),\n      styleValue: node.getAttribute(\"style\")\n    }));\n  }\n  function compareBaseline(baseline) {\n    return baseline.map((entry) => ({\n      ...entry.signature,\n      connected: entry.node.isConnected,\n      exactLabel: entry.nativeToggle ? [\"\\uBA54\\uB274\", \"\\uB2EB\\uAE30\"].includes(entry.node.textContent) : originalNavigationText(entry.node) === entry.signature.label,\n      exactHref: entry.node.getAttribute(\"href\") === entry.signature.href,\n      exactRole: entry.node.getAttribute(\"role\") === entry.signature.role,\n      exactTabindex: entry.node.getAttribute(\"tabindex\") === entry.signature.tabindex,\n      sameOnclick: entry.node.onclick === entry.onclick,\n      exactClass: entry.node.getAttribute(\"class\") === entry.classValue,\n      exactInlineStyle: entry.node.getAttribute(\"style\") === entry.styleValue\n    }));\n  }\n  function nativeBindings(doc) {\n    const result = [];\n    for (const menu of doc.querySelectorAll(\"nav\")) {\n      if (menu.closest(\".brainable-home-nav-v2,.b-header,footer\")) continue;\n      const parent = menu.parentElement;\n      if (!parent) continue;\n      const wrapped = [\"A\", \"DIV\"].includes(parent.tagName) && parent.children.length === 1 && parent.firstElementChild === menu;\n      const wrap = wrapped ? parent : null;\n      const header = wrapped ? parent.parentElement : parent;\n      if (!header || ![\"DIV\", \"HEADER\"].includes(header.tagName)) continue;\n      const children = [...header.children].filter((node) => !node.hasAttribute(\"data-brnav-toggle\"));\n      const menuBranch = wrap || menu;\n      if (children.length !== 2 || !children.includes(menuBranch)) continue;\n      const logo = children.find((node) => node !== menuBranch);\n      if (!logo || !logo.querySelector('img[alt=\"Logomark\"]')) continue;\n      if (!header.getClientRects().length || header.closest('[hidden],[inert],[aria-hidden=\"true\"]') || [\"hidden\", \"collapse\"].includes(doc.defaultView.getComputedStyle(header).visibility)) continue;\n      const items = [...menu.children].filter((node) => !node.hasAttribute(\"data-nav30-owned-dropdown\"));\n      if (items.length < 2 || items.length > 12 || !items.every((node) => [\"DIV\", \"A\"].includes(node.tagName) && node.classList.contains(\"textContents\") && [...node.children].some((child) => child.tagName === \"P\"))) continue;\n      const shells = [];\n      let previous = header;\n      for (let level = 0; level < 4; level++) {\n        const shell = previous.parentElement;\n        if (!shell || ![\"DIV\", \"HEADER\", \"A\"].includes(shell.tagName) || shell.getAttribute(\"role\") === \"main\" || shell.children.length !== 1 || shell.firstElementChild !== previous) break;\n        shells.push(shell);\n        previous = shell;\n      }\n      result.push({ kind: \"native\", header, menu, items, wrap, logo, shells });\n    }\n    return result;\n  }\n  function codeBindings(doc) {\n    const result = [];\n    for (const header of doc.querySelectorAll(\".brainable-home-nav-v2\")) {\n      const inner = header.querySelector(\":scope > .nav-inner\");\n      const menu = inner?.querySelector(\":scope > nav\");\n      const list = menu?.querySelector(\":scope > .nav-links\");\n      if (!inner || !menu || !list || !inner.querySelector(\":scope > a.brand img\")) continue;\n      const items = [...list.children].filter((node) => !node.hasAttribute(\"data-nav30-owned-dropdown\")).flatMap((item) => [...item.children].filter((node) => node.matches(\"a,button\") && !node.hasAttribute(\"data-nav30-products-toggle\")));\n      const products = header.querySelector(\":scope > .products-panel\");\n      if (items.length && products) result.push({ kind: \"home\", header, menu, items, products });\n    }\n    for (const header of doc.querySelectorAll(\".b-header\")) {\n      const inner = header.querySelector(\":scope > .b-header-inner\");\n      const menu = inner?.querySelector(\":scope > .b-desk-nav\");\n      const toggle = inner?.querySelector(':scope > button.b-menu-btn[aria-controls=\"b-mob-menu\"]');\n      if (!inner || !menu || !toggle || !inner.querySelector(\":scope > a.b-brand img\")) continue;\n      const items = [...menu.children].filter((node) => !node.hasAttribute(\"data-nav30-owned-dropdown\"));\n      const mobileMenu = header.querySelector(\":scope > .b-mob-nav\");\n      const mobileItems = mobileMenu ? [...mobileMenu.children].filter((node) => node.tagName === \"A\" && !node.hasAttribute(\"data-nav30-child-link\")) : [];\n      if (items.length && items.every((item) => item.tagName === \"A\")) result.push({ kind: \"renewal\", header, menu, items, toggle, mobileMenu, mobileItems });\n    }\n    return result;\n  }\n  function sameBinding(a, b) {\n    const aShells = a.shells || [], bShells = b.shells || [];\n    const aMobile = a.mobileItems || [], bMobile = b.mobileItems || [];\n    return a.kind === b.kind && a.menu === b.menu && a.products === b.products && a.toggle === b.toggle && a.wrap === b.wrap && a.logo === b.logo && aShells.length === bShells.length && aShells.every((node, index) => node === bShells[index]) && a.mobileMenu === b.mobileMenu && aMobile.length === bMobile.length && aMobile.every((node, index) => node === bMobile[index]) && a.items.length === b.items.length && a.items.every((node, index) => node === b.items[index]);\n  }\n  function installNavigationReference(doc = document) {\n    const win = doc.defaultView;\n    win[KEY]?.destroy();\n    const style = doc.createElement(\"style\");\n    style.setAttribute(\"data-nav30-adapter-style\", \"v1\");\n    style.textContent = STYLE;\n    doc.head.append(style);\n    const active = /* @__PURE__ */ new Map();\n    const errors = [];\n    const history = [];\n    let disposed = false;\n    let scheduled = false;\n    let route = win.location.href;\n    function mount(binding) {\n      const { kind, header, menu, items } = binding;\n      const originalLogoRect = kind === \"native\" ? binding.logo.getBoundingClientRect() : null;\n      const originalLogoSize = originalLogoRect ? { width: originalLogoRect.width, height: originalLogoRect.height } : null;\n      const attrs = ownedAttributes();\n      const baseline = captureBaseline(header, items);\n      attrs.set(header, \"data-nav30-kind\", kind);\n      let enhancer = null;\n      let logoSizing = null;\n      let dropdowns = null;\n      let mountDisposed = false;\n      const cleaners = [];\n      if (kind === \"native\") {\n        attrs.set(binding.wrap, \"data-nav30-menu-wrap\", \"true\");\n        attrs.set(binding.logo, \"data-nav30-logo\", \"true\");\n        binding.shells.forEach((shell) => attrs.set(shell, \"data-nav30-native-shell\", \"true\"));\n      }\n      if (kind !== \"renewal\") enhancer = createEnhancer(header, menu, items, { toggleHost: header, toggleBefore: null, breakpoint: 1023, shouldHandleEscape: () => !dropdowns?.hasOpen() && (kind !== \"home\" || binding.products.getAttribute(\"data-open\") !== \"true\") });\n      if (kind === \"native\") {\n        if (originalLogoSize && originalLogoSize.width > 0 && originalLogoSize.height > 0) {\n          const ratio = originalLogoSize.width / originalLogoSize.height;\n          const fit = (maxWidth, maxHeight) => {\n            const scale = Math.min(maxWidth / originalLogoSize.width, maxHeight / originalLogoSize.height);\n            return { width: Math.round(originalLogoSize.width * scale * 1e3) / 1e3, height: Math.round(originalLogoSize.height * scale * 1e3) / 1e3 };\n          };\n          logoSizing = { original: originalLogoSize, ratio, desktop: fit(190, 48), mobile: fit(158, 44) };\n          const id = enhancer.inspect().id;\n          attrs.set(binding.logo, \"data-nav30-logo\", id);\n          const logoStyle = doc.createElement(\"style\");\n          logoStyle.setAttribute(\"data-nav30-logo-fit\", id);\n          logoStyle.textContent = [[\"false\", logoSizing.desktop], [\"true\", logoSizing.mobile]].map(([compact, size]) => `[data-brnav-header=\"${id}\"][data-nav30-kind=\"native\"][data-brnav-compact=\"${compact}\"] [data-nav30-logo=\"${id}\"]{width:${size.width}px!important;height:${size.height}px!important}`).join(\"\\n\");\n          doc.head.append(logoStyle);\n          cleaners.push(() => logoStyle.remove());\n        }\n        const media = win.matchMedia(\"(max-width:1023px)\");\n        const update = () => {\n          binding.shells.forEach((shell) => attrs.set(shell, \"data-nav30-compact\", String(media.matches)));\n        };\n        update();\n        media.addEventListener(\"change\", update);\n        cleaners.push(() => media.removeEventListener(\"change\", update));\n      }\n      if (kind === \"home\") {\n        const positioning = doc.createElement(\"style\");\n        positioning.setAttribute(\"data-nav30-dropdown-position\", \"true\");\n        doc.head.append(positioning);\n        const productTrigger = items.find((node) => node.getAttribute(\"aria-controls\") === binding.products.id);\n        let disclosure = null;\n        if (productTrigger) {\n          disclosure = doc.createElement(\"button\");\n          disclosure.type = \"button\";\n          disclosure.setAttribute(\"data-nav30-products-toggle\", \"true\");\n          disclosure.setAttribute(\"aria-controls\", binding.products.id);\n          const icon = doc.createElementNS(\"http://www.w3.org/2000/svg\", \"svg\");\n          icon.setAttribute(\"viewBox\", \"0 0 24 24\");\n          icon.setAttribute(\"fill\", \"none\");\n          icon.setAttribute(\"aria-hidden\", \"true\");\n          const arrow = doc.createElementNS(\"http://www.w3.org/2000/svg\", \"path\");\n          arrow.setAttribute(\"d\", \"m6 9 6 6 6-6\");\n          arrow.setAttribute(\"stroke\", \"currentColor\");\n          arrow.setAttribute(\"stroke-width\", \"1.5\");\n          arrow.setAttribute(\"stroke-linecap\", \"round\");\n          arrow.setAttribute(\"stroke-linejoin\", \"round\");\n          icon.append(arrow);\n          disclosure.append(icon);\n          attrs.set(productTrigger.parentElement, \"data-nav30-products-item\", \"true\");\n          productTrigger.parentElement.append(disclosure);\n          const activate = (event) => {\n            event.preventDefault();\n            event.stopPropagation();\n            if (binding.products.getAttribute(\"data-open\") === \"true\") {\n              productTrigger.focus();\n              productTrigger.dispatchEvent(new win.KeyboardEvent(\"keydown\", { key: \"Escape\", bubbles: true, cancelable: true }));\n            } else productTrigger.click();\n          };\n          disclosure.addEventListener(\"click\", activate);\n          cleaners.push(() => {\n            disclosure.removeEventListener(\"click\", activate);\n            disclosure.remove();\n          });\n        }\n        const position = () => {\n          if (!productTrigger) return;\n          const box = productTrigger.getBoundingClientRect();\n          const outer = header.getBoundingClientRect();\n          const left = Math.max(16, Math.min(box.left - outer.left, outer.width - 272));\n          const rule = `[data-brnav-header=\"${enhancer.inspect().id}\"][data-brnav-compact=\"false\"] .products-panel{left:${Math.round(left)}px!important}`;\n          if (positioning.textContent !== rule) positioning.textContent = rule;\n        };\n        const update = () => {\n          const expanded = binding.products.getAttribute(\"data-open\") === \"true\";\n          attrs.set(header, \"data-nav30-products\", String(expanded));\n          if (disclosure) {\n            disclosure.setAttribute(\"aria-expanded\", String(expanded));\n            disclosure.setAttribute(\"aria-label\", expanded ? \"\\uC81C\\uD488\\uC18C\\uAC1C \\uD558\\uC704 \\uBA54\\uB274 \\uB2EB\\uAE30\" : \"\\uC81C\\uD488\\uC18C\\uAC1C \\uD558\\uC704 \\uBA54\\uB274 \\uC5F4\\uAE30\");\n          }\n          position();\n        };\n        update();\n        const observer2 = new win.MutationObserver(update);\n        observer2.observe(binding.products, { attributes: true, attributeFilter: [\"data-open\"] });\n        const size = new win.ResizeObserver(position);\n        size.observe(header);\n        size.observe(menu);\n        win.addEventListener(\"resize\", position);\n        cleaners.push(() => {\n          observer2.disconnect();\n          size.disconnect();\n          win.removeEventListener(\"resize\", position);\n          positioning.remove();\n        });\n      }\n      let closeExisting = () => {\n      };\n      if (kind === \"renewal\") {\n        const toggle = binding.toggle;\n        closeExisting = () => {\n          if (toggle.getAttribute(\"aria-expanded\") === \"true\") toggle.click();\n        };\n        const outside = (event) => {\n          if (!header.contains(event.target)) closeExisting();\n        };\n        let focusTask = 0;\n        const focusout = (event) => {\n          win.clearTimeout(focusTask);\n          if (event.relatedTarget && header.contains(event.relatedTarget)) return;\n          focusTask = win.setTimeout(() => {\n            if (!disposed && !mountDisposed && !header.contains(doc.activeElement)) closeExisting();\n          }, 0);\n        };\n        const media = win.matchMedia(\"(max-width:959px)\");\n        const mode = () => {\n          if (!media.matches) closeExisting();\n        };\n        doc.addEventListener(\"pointerdown\", outside);\n        header.addEventListener(\"focusout\", focusout);\n        media.addEventListener(\"change\", mode);\n        cleaners.push(() => {\n          win.clearTimeout(focusTask);\n          doc.removeEventListener(\"pointerdown\", outside);\n          header.removeEventListener(\"focusout\", focusout);\n          media.removeEventListener(\"change\", mode);\n        });\n      }\n      dropdowns = createAuthorizedDropdowns({ header, items: [...items, ...binding.mobileItems || []], breakpoint: kind === \"renewal\" ? 959 : 1023, skipLabels: kind === \"home\" ? [\"\\uC81C\\uD488\\uC18C\\uAC1C\"] : [], onStateChange: (open) => attrs.set(header, \"data-nav30-authorized-open\", String(open)) });\n      const menuState = new win.MutationObserver(() => {\n        const open = enhancer ? header.getAttribute(\"data-brnav-open\") === \"true\" : binding.toggle.getAttribute(\"aria-expanded\") === \"true\";\n        const compact = win.matchMedia(`(max-width:${kind === \"renewal\" ? 959 : 1023}px)`).matches;\n        if (compact && !open) dropdowns.close();\n      });\n      menuState.observe(kind === \"renewal\" ? binding.toggle : header, { attributes: true, attributeFilter: [kind === \"renewal\" ? \"aria-expanded\" : \"data-brnav-open\"] });\n      cleaners.push(() => {\n        menuState.disconnect();\n        dropdowns.destroy();\n      });\n      return { binding, baseline, enhancer, logoSizing, dropdowns, close() {\n        dropdowns.close();\n        if (enhancer) enhancer.close();\n        else closeExisting();\n      }, destroy() {\n        mountDisposed = true;\n        cleaners.forEach((fn) => fn());\n        enhancer?.destroy();\n        attrs.destroy();\n      } };\n    }\n    function reconcile() {\n      scheduled = false;\n      if (disposed) return;\n      const bindings = [...nativeBindings(doc), ...codeBindings(doc)];\n      const desired = new Map(bindings.map((binding) => [binding.header, binding]));\n      for (const [header, entry] of active) {\n        const next = desired.get(header);\n        if (!next || !sameBinding(entry.binding, next)) {\n          history.push({ kind: entry.binding.kind, route, items: compareBaseline(entry.baseline) });\n          entry.destroy();\n          active.delete(header);\n        }\n      }\n      for (const [header, binding] of desired) {\n        if (active.has(header)) continue;\n        try {\n          active.set(header, mount(binding));\n        } catch (error) {\n          errors.push(String(error));\n        }\n      }\n      if (win.location.href !== route) {\n        route = win.location.href;\n        active.forEach((entry) => entry.close());\n      }\n    }\n    function schedule() {\n      if (disposed || scheduled) return;\n      scheduled = true;\n      win.queueMicrotask(reconcile);\n    }\n    const observer = new win.MutationObserver(schedule);\n    observer.observe(doc.body, { childList: true, subtree: true });\n    win.addEventListener(\"popstate\", schedule);\n    win.addEventListener(\"hashchange\", schedule);\n    win.addEventListener(\"resize\", schedule);\n    const routeTimer = win.setInterval(() => {\n      if (win.location.href !== route) schedule();\n    }, 350);\n    const api = {\n      inspect() {\n        return { route: win.location.href, viewport: { width: win.innerWidth, height: win.innerHeight }, horizontalOverflow: doc.documentElement.scrollWidth > win.innerWidth, errors: errors.slice(), headers: [...active.values()].map((entry) => ({ kind: entry.binding.kind, menuTag: entry.binding.menu.tagName, logoSizing: entry.logoSizing, itemCount: entry.binding.items.length, menuHeight: entry.binding.menu.getBoundingClientRect().height, menuMaxHeight: win.getComputedStyle(entry.binding.menu).maxHeight, rect: { width: entry.binding.header.getBoundingClientRect().width, height: entry.binding.header.getBoundingClientRect().height }, compact: entry.enhancer?.inspect().compact ?? win.matchMedia(\"(max-width:959px)\").matches, open: entry.enhancer?.inspect().open ?? entry.binding.toggle?.getAttribute(\"aria-expanded\") === \"true\", items: compareBaseline(entry.baseline), authorizedDropdowns: entry.dropdowns.inspect() })), history: history.slice() };\n      },\n      refresh: reconcile,\n      destroy() {\n        if (disposed) return;\n        disposed = true;\n        observer.disconnect();\n        win.clearInterval(routeTimer);\n        win.removeEventListener(\"popstate\", schedule);\n        win.removeEventListener(\"hashchange\", schedule);\n        win.removeEventListener(\"resize\", schedule);\n        active.forEach((entry) => entry.destroy());\n        active.clear();\n        style.remove();\n        if (win[KEY] === api) delete win[KEY];\n      }\n    };\n    win[KEY] = api;\n    win.brainableNavigationQA = () => win[KEY]?.inspect();\n    reconcile();\n    return api;\n  }\n  if (typeof document !== \"undefined\") {\n    if (document.readyState === \"loading\") document.addEventListener(\"DOMContentLoaded\", () => installNavigationReference(document), { once: true });\n    else installNavigationReference(document);\n  }\n  return __toCommonJS(navigation_global_entry_exports);\n})();\n\n;\n/* BRAINABLE production global: cms-pagination */\n(() => {\n  // cms-pagination-core.js\n  var PAGE_SIZE = 5;\n  function pageNumbers(current, total, compact = false) {\n    if (total < 1) return [];\n    const windowSize = compact ? 3 : 5;\n    if (total <= windowSize + 2) return Array.from({ length: total }, (_, i) => i + 1);\n    const start = Math.max(2, Math.min(current - Math.floor(windowSize / 2), total - windowSize));\n    const end = Math.min(total - 1, start + windowSize - 1);\n    const numbers = [1];\n    if (start > 2) numbers.push(\"start-gap\");\n    for (let page = start; page <= end; page++) numbers.push(page);\n    if (end < total - 1) numbers.push(\"end-gap\");\n    numbers.push(total);\n    return numbers;\n  }\n  var CSS = `\n[data-cms30-hidden=\"true\"] { display:none !important; }\n[data-cms30-list] { scroll-margin-top:96px; touch-action:pan-y; }\n[data-cms30-pagination] { box-sizing:border-box; width:100%; display:flex; flex-direction:row; flex-wrap:wrap; align-items:center; justify-content:center; gap:8px; margin:36px 0 0; padding:4px 0; color:#27272a; font-family:inherit; isolation:isolate; }\n[data-cms30-pagination] button { box-sizing:border-box; appearance:none; position:relative; flex:0 0 36px; width:36px; height:36px; min-width:0; min-height:0; display:inline-flex; align-items:center; justify-content:center; margin:0; padding:0; border:0; border-radius:6px; background:transparent; color:inherit; font-family:inherit; font-size:16px; font-weight:600; line-height:1; cursor:pointer; transition:background-color 150ms ease,color 150ms ease; }\n[data-cms30-pagination] button:hover:not(:disabled) { background:#f4f4f5; }\n[data-cms30-pagination] button:focus-visible { outline:2px solid #2563eb; outline-offset:3px; }\n[data-cms30-pagination] button[aria-current=\"page\"] { color:#111; font-weight:750; text-decoration:underline; text-underline-offset:7px; text-decoration-thickness:2px; }\n[data-cms30-pagination] button[data-cms30-arrow] { flex-basis:32px; width:32px; height:32px; border:1px solid #e4e4e7; border-radius:999px; background:#fff; }\n[data-cms30-pagination] button[data-cms30-arrow]:disabled { opacity:.35; cursor:default; }\n[data-cms30-pagination] svg { width:16px; height:16px; stroke:currentColor; fill:none; stroke-width:1.75; stroke-linecap:round; stroke-linejoin:round; pointer-events:none; }\n[data-cms30-pagination] [data-cms30-gap] { flex:0 0 18px; width:18px; font-family:inherit; font-size:14px; font-weight:500; line-height:1; text-align:center; }\n[data-cms30-sr] { position:absolute !important; width:1px !important; height:1px !important; padding:0 !important; margin:-1px !important; overflow:hidden !important; clip:rect(0,0,0,0) !important; white-space:nowrap !important; border:0 !important; }\n@media(max-width:600px) { [data-cms30-pagination] { gap:2px; margin-top:28px; } [data-cms30-pagination] button[data-cms30-arrow=\"first\"], [data-cms30-pagination] button[data-cms30-arrow=\"last\"] { display:none; } [data-cms30-pagination] button { flex-basis:32px; width:32px; height:36px; font-size:15px; } }\n@media(prefers-reduced-motion:reduce) { [data-cms30-pagination] button { transition:none; } }\n`;\n  var arrowPaths = {\n    prev: \"M19 12H5 M12 19l-7-7 7-7\",\n    next: \"M5 12h14 M12 5l7 7-7 7\",\n    first: \"M5 5v14 M19 5l-7 7 7 7 M12 5l-7 7 7 7\",\n    last: \"M19 5v14 M5 5l7 7-7 7 M12 5l7 7-7 7\"\n  };\n  function arrowButton(document2, kind, label) {\n    const button = document2.createElement(\"button\");\n    button.type = \"button\";\n    button.dataset.cms30Arrow = kind;\n    button.setAttribute(\"aria-label\", label);\n    const svg = document2.createElementNS(\"http://www.w3.org/2000/svg\", \"svg\");\n    svg.setAttribute(\"viewBox\", \"0 0 24 24\");\n    svg.setAttribute(\"aria-hidden\", \"true\");\n    const path = document2.createElementNS(\"http://www.w3.org/2000/svg\", \"path\");\n    path.setAttribute(\"d\", arrowPaths[kind]);\n    svg.append(path);\n    button.append(svg);\n    return button;\n  }\n  function preserveAttrs(node, names) {\n    const saved = Object.fromEntries(names.map((name) => [name, node.getAttribute(name)]));\n    return () => Object.entries(saved).forEach(([name, value]) => value === null ? node.removeAttribute(name) : node.setAttribute(name, value));\n  }\n  function enhanceCMSPagination({ list, cards, label, host = list.parentElement, insertBefore = list.nextSibling, initialPage = 1, pageSize = PAGE_SIZE, itemLabel = \"\\uAC8C\\uC2DC\\uAE00\" }) {\n    if (!list?.ownerDocument || !cards?.length || cards.some((card) => card.parentElement !== list)) throw new Error(\"CMS pagination requires verified direct card children\");\n    if (!Number.isInteger(pageSize) || pageSize < 1) throw new Error(\"Invalid page size\");\n    const document2 = list.ownerDocument, window2 = document2.defaultView;\n    if (list.hasAttribute(\"data-cms30-list\")) throw new Error(\"CMS list already enhanced\");\n    if (!document2.getElementById(\"cms30-pagination-styles\")) {\n      const style = document2.createElement(\"style\");\n      style.id = \"cms30-pagination-styles\";\n      style.textContent = CSS;\n      document2.head.append(style);\n    }\n    const restores = [preserveAttrs(list, [\"data-cms30-list\"])];\n    const originals = cards.map((card) => ({ node: card, text: card.textContent, html: card.innerHTML, href: card.getAttribute(\"href\"), onclick: card.onclick, ariaHidden: card.getAttribute(\"aria-hidden\"), inert: card.getAttribute(\"inert\"), links: [...card.querySelectorAll('a,[role=\"link\"],button,[role=\"button\"]')].map((link) => ({ node: link, href: link.getAttribute(\"href\"), onclick: link.onclick, text: link.textContent })) }));\n    cards.forEach((card) => restores.push(preserveAttrs(card, [\"data-cms30-hidden\", \"aria-hidden\", \"inert\"])));\n    list.dataset.cms30List = label;\n    const nav = document2.createElement(\"nav\");\n    nav.dataset.cms30Pagination = label;\n    nav.setAttribute(\"aria-label\", `${label} \\uD398\\uC774\\uC9C0`);\n    const status = document2.createElement(\"p\");\n    status.dataset.cms30Sr = \"\";\n    status.setAttribute(\"role\", \"status\");\n    status.setAttribute(\"aria-live\", \"polite\");\n    status.setAttribute(\"aria-atomic\", \"true\");\n    nav.append(status);\n    host.insertBefore(nav, insertBefore);\n    const media = window2.matchMedia(\"(max-width:600px)\"), reduced = window2.matchMedia(\"(prefers-reduced-motion:reduce)\");\n    let page = Math.max(1, Math.min(Math.ceil(cards.length / pageSize), initialPage)), destroyed = false, animations = [];\n    const total = Math.ceil(cards.length / pageSize);\n    let pointer = null, suppressClickUntil = 0;\n    function addPage(number) {\n      const button = document2.createElement(\"button\");\n      button.type = \"button\";\n      button.dataset.cms30Page = String(number);\n      button.textContent = String(number);\n      button.setAttribute(\"aria-label\", `${number}\\uD398\\uC774\\uC9C0`);\n      if (number === page) button.setAttribute(\"aria-current\", \"page\");\n      button.addEventListener(\"click\", () => setPage(number, { focus: \"page\" }));\n      nav.insertBefore(button, status);\n    }\n    function renderControls(focusKey) {\n      [...nav.children].filter((node) => node !== status).forEach((node) => node.remove());\n      const addArrow = (kind, label2, target, disabled) => {\n        const button = arrowButton(document2, kind, label2);\n        button.disabled = disabled;\n        button.addEventListener(\"click\", () => setPage(target, { focus: kind }));\n        nav.insertBefore(button, status);\n      };\n      addArrow(\"first\", \"\\uCCAB \\uD398\\uC774\\uC9C0\", 1, page === 1);\n      addArrow(\"prev\", \"\\uC774\\uC804 \\uD398\\uC774\\uC9C0\", page - 1, page === 1);\n      pageNumbers(page, total, media.matches).forEach((number) => {\n        if (typeof number === \"number\") addPage(number);\n        else {\n          const gap = document2.createElement(\"span\");\n          gap.dataset.cms30Gap = \"\";\n          gap.textContent = \"\\u2026\";\n          gap.setAttribute(\"aria-hidden\", \"true\");\n          nav.insertBefore(gap, status);\n        }\n      });\n      addArrow(\"next\", \"\\uB2E4\\uC74C \\uD398\\uC774\\uC9C0\", page + 1, page === total);\n      addArrow(\"last\", \"\\uB9C8\\uC9C0\\uB9C9 \\uD398\\uC774\\uC9C0\", total, page === total);\n      status.textContent = `${label}, ${total}\\uD398\\uC774\\uC9C0 \\uC911 ${page}\\uD398\\uC774\\uC9C0. \\uC804\\uCCB4 ${cards.length}\\uAC1C \\uC911 ${(page - 1) * pageSize + 1}\\u2013${Math.min(page * pageSize, cards.length)}\\uBC88\\uC9F8 ${itemLabel}`;\n      if (focusKey) {\n        const target = focusKey === \"page\" ? nav.querySelector('[aria-current=\"page\"]') : nav.querySelector(`[data-cms30-arrow=\"${focusKey}\"]`);\n        (target && !target.disabled ? target : nav.querySelector('[aria-current=\"page\"]'))?.focus({ preventScroll: true });\n      }\n    }\n    function setPage(next, { focus, scroll = true } = {}) {\n      if (destroyed) return;\n      next = Math.max(1, Math.min(total, next));\n      const direction = next > page ? 1 : -1, changed = next !== page;\n      page = next;\n      animations.forEach((animation) => animation.cancel());\n      animations = [];\n      cards.forEach((card, index) => {\n        const visible = index >= (page - 1) * pageSize && index < page * pageSize;\n        card.dataset.cms30Hidden = String(!visible);\n        if (!visible) {\n          card.setAttribute(\"aria-hidden\", \"true\");\n          card.setAttribute(\"inert\", \"\");\n        } else {\n          const saved = originals[index];\n          saved.ariaHidden === null ? card.removeAttribute(\"aria-hidden\") : card.setAttribute(\"aria-hidden\", saved.ariaHidden);\n          saved.inert === null ? card.removeAttribute(\"inert\") : card.setAttribute(\"inert\", saved.inert);\n          if (changed && !reduced.matches && typeof card.animate === \"function\") animations.push(card.animate([{ opacity: 0.35, transform: `translateX(${direction * 14}px)` }, { opacity: 1, transform: \"translateX(0)\" }], { duration: 180, easing: \"cubic-bezier(.2,.65,.3,1)\" }));\n        }\n      });\n      renderControls(focus);\n      if (changed && scroll) {\n        const rect = list.getBoundingClientRect();\n        if (rect.top < 72 || rect.top > window2.innerHeight * 0.7) list.scrollIntoView({ block: \"start\", behavior: reduced.matches ? \"auto\" : \"smooth\" });\n      }\n    }\n    function keydown(event) {\n      if (event.altKey || event.ctrlKey || event.metaKey) return;\n      const target = event.key === \"ArrowLeft\" ? page - 1 : event.key === \"ArrowRight\" ? page + 1 : event.key === \"Home\" ? 1 : event.key === \"End\" ? total : null;\n      if (target === null) return;\n      event.preventDefault();\n      event.stopPropagation();\n      setPage(target, { focus: \"page\" });\n    }\n    function pointerdown(event) {\n      if (event.pointerType !== \"touch\" || !event.isPrimary || !cards.some((card) => card.contains(event.target))) return;\n      pointer = { x: event.clientX, y: event.clientY, id: event.pointerId };\n    }\n    function pointerup(event) {\n      if (!pointer || event.pointerId !== pointer.id) return;\n      const dx = event.clientX - pointer.x, dy = event.clientY - pointer.y;\n      pointer = null;\n      if (Math.abs(dx) > 64 && Math.abs(dx) > Math.abs(dy) * 1.5) {\n        suppressClickUntil = Date.now() + 600;\n        setPage(page + (dx < 0 ? 1 : -1));\n      }\n    }\n    const mediaChange = () => renderControls();\n    const pointercancel = () => {\n      pointer = null;\n    };\n    const preventSwipeClick = (event) => {\n      if (Date.now() < suppressClickUntil) {\n        event.preventDefault();\n        event.stopPropagation();\n        suppressClickUntil = 0;\n      }\n    };\n    nav.addEventListener(\"keydown\", keydown);\n    nav.addEventListener(\"click\", (event) => {\n      if (event.target.closest(\"button\")) {\n        event.preventDefault();\n        event.stopPropagation();\n      }\n    });\n    list.addEventListener(\"pointerdown\", pointerdown, { passive: true });\n    list.addEventListener(\"pointerup\", pointerup, { passive: true });\n    list.addEventListener(\"pointercancel\", pointercancel, { passive: true });\n    list.addEventListener(\"click\", preventSwipeClick, true);\n    media.addEventListener(\"change\", mediaChange);\n    setPage(page, { scroll: false });\n    return {\n      list,\n      cards,\n      nav,\n      setPage,\n      inspect() {\n        return { label, count: cards.length, pageSize, page, total, visible: cards.map((node, index) => node.dataset.cms30Hidden === \"false\" ? index + 1 : null).filter(Boolean), sameNodes: originals.every((original, index) => original.node === cards[index] && original.node.parentElement === list), contentPreserved: originals.every((original) => original.text === original.node.textContent && original.href === original.node.getAttribute(\"href\") && original.onclick === original.node.onclick && original.links.every((link) => link.href === link.node.getAttribute(\"href\") && link.onclick === link.node.onclick && link.text === link.node.textContent)) };\n      },\n      destroy() {\n        if (destroyed) return;\n        destroyed = true;\n        animations.forEach((animation) => animation.cancel());\n        media.removeEventListener(\"change\", mediaChange);\n        nav.remove();\n        list.removeEventListener(\"pointerdown\", pointerdown);\n        list.removeEventListener(\"pointerup\", pointerup);\n        list.removeEventListener(\"pointercancel\", pointercancel);\n        list.removeEventListener(\"click\", preventSwipeClick, true);\n        restores.reverse().forEach((restore) => restore());\n      }\n    };\n  }\n\n  // centers-desktop-canonical.json\n  var centers_desktop_canonical_default = [\n    {\n      ctaRole: \"link\",\n      ctaText: \"\\uC624\\uC2DC\\uB294\\uAE38 \\u2192\",\n      headingParts: [\n        \"\\uBE0C\\uB808\\uC778\\uC5D0\\uC774\\uBE14\",\n        \"\\uB300\\uCE58 \\uD2B8\\uB808\\uC774\\uB2DD \\uC13C\\uD130\"\n      ],\n      lines: [\n        \"\\uC11C\\uC6B8\\uD2B9\\uBCC4\\uC2DC \\uAC15\\uB0A8\\uAD6C \\uC120\\uB989\\uB85C 317,\",\n        \"K7 \\uBE4C\\uB529, 3\\uCE35 301\\uD638\",\n        \"02-581-7856\",\n        \"010-8123-7857\"\n      ],\n      mapSrc: \"https://www.google.com/maps/embed?pb=!1m18!1m12!1m3!1d3165.429340295972!2d127.04699359130376!3d37.497790800006364!2m3!1f0!2f0!3f0!3m2!1i1024!2i768!4f13.1!3m3!1m2!1s0x357ca473c674ddcd%3A0x5b9d4f51809a7825!2z7Iqk7Lm07J2065GQ64eM7IS47JuA7YG066as64uJ!5e0!3m2!1sko!2skr!4v1762850474352!5m2!1sko!2skr\",\n      directionHref: \"https://www.google.com/maps/place/%EC%8A%A4%EC%B9%B4%EC%9D%B4%EB%91%90%EB%87%8C%EC%84%B8%EC%9B%80%ED%81%B4%EB%A6%AC%EB%8B%89/data=!3m1!4b1!4m4!3m3!1s0x357ca473c674ddcd:0x5b9d4f51809a7825!16s%2Fg%2F11c1wwfmsh!20s8Q99F3X2%2B4P9P4WF?entry=ttu&g_ep=EgoyMDI2MDkyMy4wIKXMDSoASAFQAw%3D%3D\"\n    },\n    {\n      ctaRole: \"button\",\n      ctaText: \"\\uC624\\uC2DC\\uB294\\uAE38 \\u2192\",\n      headingParts: [\n        \"\\uC8FC\\uC2DD\\uD68C\\uC0AC\",\n        \"\\uBE0C\\uB808\\uC778\\uC5D0\\uC774\\uBE14\"\n      ],\n      lines: [\n        \"\\uC11C\\uC6B8\\uD2B9\\uBCC4\\uC2DC \\uC11C\\uCD08\\uAD6C \\uB9C8\\uBC29\\uB85C 6\\uAE38 28, 5\\uCE35 502\\uD638\"\n      ],\n      mapSrc: \"https://www.google.com/maps/embed?pb=!1m18!1m12!1m3!1d50660.95589854867!2d126.99656882205589!3d37.47701639764579!2m3!1f0!2f0!3f0!3m2!1i1024!2i768!4f13.1!3m3!1m2!1s0x357ca13466bcacd1%3A0xb70bc7ff482af6ab!2z7ISc7Jq47Yq567OE7IucIOyEnOy0iOq1rA!5e0!3m2!1sko!2skr!4v1762850262140!5m2!1sko!2skr\"\n    },\n    {\n      ctaRole: \"button\",\n      ctaText: \"\\uC624\\uC2DC\\uB294\\uAE38 \\u2192\",\n      headingParts: [\n        \"\\uC11C\\uC6B8\\uC131\\uBAA8\\uCE58\\uC720\\uC13C\\uD130\"\n      ],\n      lines: [\n        \"\\uC11C\\uC6B8\\uC2DC \\uAC15\\uB0A8\\uAD6C \\uD559\\uB3D9\\uB85C 206, 4\\uCE35(\\uB17C\\uD604\\uB3D9)\",\n        \"0507-1416-8314\",\n        \"\\u200B\"\n      ],\n      mapSrc: \"https://www.google.com/maps/embed?pb=!1m18!1m12!1m3!1d3164.748520835366!2d127.0314899!3d37.513849!2m3!1f0!2f0!3f0!3m2!1i1024!2i768!4f13.1!3m3!1m2!1s0x357ca3f1997247e9%3A0x37a987f264ef7bb7!2z7ISc7Jq47Yq567OE7IucIOqwleuCqOq1rCDtlZnrj5nroZwgMjA2IDTsuLU!5e0!3m2!1sko!2skr!4v1766456157527!5m2!1sko!2skr\"\n    },\n    {\n      ctaRole: \"button\",\n      ctaText: \"\\uC624\\uC2DC\\uB294\\uAE38 \\u2192\",\n      headingParts: [\n        \"\\uB9C8\\uACE1\\uD2BC\\uD2BC\\uC18C\\uC544\\uCCAD\\uC18C\\uB144\\uACFC\\uBC1C\\uB2EC\\uC13C\\uD130\"\n      ],\n      lines: [\n        \"\\uC11C\\uC6B8\\uD2B9\\uBCC4\\uC2DC \\uB9C8\\uACE1\\uC911\\uC559\\uB85C\\xA0105-7\\xA0\\uCF00\\uC774\\uC2A4\\uD018\\uC5B4\\uD0C0\\uC6CC\\xA03, 2\\uCE35\",\n        \"02-6989-5300\",\n        \"\\u200B\"\n      ],\n      mapSrc: \"https://www.google.com/maps/embed?pb=!1m18!1m12!1m3!1d1581.3727172275198!2d126.82441933904094!3d37.561060993010024!2m3!1f0!2f0!3f0!3m2!1i1024!2i768!4f13.1!3m3!1m2!1s0x357c9d0007487a5b%3A0x81e1052f3c62fe1e!2z7LyA7J207Iqk7YCY7Ja0IOuniOqzoQ!5e0!3m2!1sen!2skr!4v1764652743432!5m2!1sen!2skr\"\n    },\n    {\n      ctaRole: \"button\",\n      ctaText: \"\\uC624\\uC2DC\\uB294\\uAE38 \\u2192\",\n      headingParts: [\n        \"\\uD2F0\\uC5D8\\uC528\\uBD84\\uB2F9\"\n      ],\n      lines: [\n        \"\\uACBD\\uAE30 \\uC131\\uB0A8\\uC2DC \\uBD84\\uB2F9\\uAD6C \\uC815\\uC790\\uC77C\\uB85C\\xA0197 2\\uCE35\\xA0202~203\\uD638\",\n        \"031-607-1001\"\n      ],\n      mapSrc: \"https://www.google.com/maps/embed?pb=!1m18!1m12!1m3!1d3170.921171208699!2d127.10295367681158!3d37.36804207209068!2m3!1f0!2f0!3f0!3m2!1i1024!2i768!4f13.1!3m3!1m2!1s0x357b58360dbb8ba1%3A0x9bfc1ebaff64bae6!2s%EC%B8%B5%20202~203%ED%98%B8%2C%20197%20Jeongjail-ro%2C%20Bundang-gu%2C%20Seongnam-si%2C%20Gyeonggi-do!5e0!3m2!1sen!2skr!4v1764653043432!5m2!1sen!2skr\"\n    },\n    {\n      ctaRole: \"button\",\n      ctaText: \"\\uC624\\uC2DC\\uB294\\uAE38 \\u2192\",\n      headingParts: [\n        \"\\uBA85\\uBB38\\uC5B8\\uC5B4\\uC2EC\\uB9AC\\uC13C\\uD130\"\n      ],\n      lines: [\n        \"\\uACBD\\uAE30\\uB3C4 \\uC548\\uC0B0\\uC2DC \\uB2E8\\uC6D0\\uAD6C \\uACE0\\uC794\\uB85C\\xA076\\xA0\\uACE0\\uC794\\uB3D9,\\xA0\\uC601\\uD48D\\uBE4C\\uB529\\xA0303-2, 303-3\",\n        \"031-411-7771\"\n      ],\n      mapSrc: \"https://www.google.com/maps/embed?pb=!1m18!1m12!1m3!1d3173.0009334359515!2d126.83228507680974!3d37.31880557210383!2m3!1f0!2f0!3f0!3m2!1i1024!2i768!4f13.1!3m3!1m2!1s0x357b6f04b8ebfa83%3A0xe6ef29fb183bbc59!2z66qF66y47Ja47Ja07Ius66as7IS87YSw!5e0!3m2!1sen!2skr!4v1764653196700!5m2!1sen!2skr\"\n    },\n    {\n      ctaRole: \"button\",\n      ctaText: \"\\uC624\\uC2DC\\uB294\\uAE38 \\u2192\",\n      headingParts: [\n        \"\\uC5C4\\uB9C8\\uC640\\uC544\\uAE30\\uB4E4\"\n      ],\n      lines: [\n        \"\\uC778\\uCC9C \\uC11C\\uAD6C \\uAC00\\uC815\\uB85C\\xA0388\\uC138\\uB780\\uBE4C\\uB529\\xA02\\uCE35\",\n        \"032-572-1771\"\n      ],\n      mapSrc: \"https://www.google.com/maps/embed?pb=!1m18!1m12!1m3!1d3164.514454384262!2d126.6707034768165!3d37.51936847205096!2m3!1f0!2f0!3f0!3m2!1i1024!2i768!4f13.1!3m3!1m2!1s0x357b7ef559038def%3A0x7d139aa3ba5d37c0!2z7JeE66eI7JmA7JWE6riw65Ok7IaM7JWE6rO87J2Y7JuQ!5e0!3m2!1sen!2skr!4v1764653343469!5m2!1sen!2skr\"\n    },\n    {\n      ctaRole: \"button\",\n      ctaText: \"\\uC624\\uC2DC\\uB294\\uAE38 \\u2192\",\n      headingParts: [\n        \"\\uCC38\\uC18C\\uC544\\uCCAD\\uC18C\\uB144\\uACFC\\uC758\\uC6D0\"\n      ],\n      lines: [\n        \"\\uACBD\\uAE30\\uB3C4 \\uC218\\uC6D0\\uC2DC \\uAD8C\\uC120\\uAD6C \\uAE08\\uD638\\uB85C 230\",\n        \"031-293-3392\"\n      ],\n      mapSrc: \"https://www.google.com/maps/embed?pb=!1m14!1m8!1m3!1d404351.30333337764!2d127.141232!3d37.649332!3m2!1i1024!2i768!4f13.1!3m3!1m2!1s0x357cb79c0f7aba0d%3A0xc32b2672e7fe30de!2z7LC47IaM7JWE7LKt7IaM64WE6rO87J2Y7JuQ!5e0!3m2!1sko!2skr!4v1766455850296!5m2!1sko!2skr\"\n    },\n    {\n      ctaRole: \"button\",\n      ctaText: \"\\uC624\\uC2DC\\uB294\\uAE38 \\u2192\",\n      headingParts: [\n        \"\\uB2E5\\uD130\\uC774\\uBBA8\\uCF00\\uC5B4\"\n      ],\n      lines: [\n        \"\\uCDA9\\uBD81 \\uCCAD\\uC8FC\\uC2DC \\uCCAD\\uC6D0\\uAD6C \\uC0AC\\uB738\\uB85C\\xA037\\xA0\\uC774\\uACBD\\uC740\\uC18C\\uC544\\uCCAD\\uC18C\\uB144\\uACFC\",\n        \"0507-1456-5962\"\n      ],\n      mapSrc: \"https://www.google.com/maps/embed?pb=!1m18!1m12!1m3!1d3200.372565170318!2d127.4792876767878!3d36.66554227228593!2m3!1f0!2f0!3f0!3m2!1i1024!2i768!4f13.1!3m3!1m2!1s0x356527f6e6b88037%3A0xcf32f35fe026d842!2z7J206rK97J2A7IaM7JWE6rO87J2Y7JuQ!5e0!3m2!1sen!2skr!4v1764653981818!5m2!1sen!2skr\"\n    },\n    {\n      ctaRole: \"button\",\n      ctaText: \"\\uC624\\uC2DC\\uB294\\uAE38 \\u2192\",\n      headingParts: [\n        \"\\uC11C\\uC6B8\\uD328\\uBC00\\uB9AC\\uBCD1\\uC6D0\\uBC1C\\uB2EC\\uC13C\\uD130\"\n      ],\n      lines: [\n        \"\\uACBD\\uB0A8 \\uCC3D\\uC6D0\\uC2DC \\uC131\\uC0B0\\uAD6C \\uB9C8\\uB514\\uBBF8\\uC11C\\uB85C\\xA054\\xA0\\uC11C\\uC6B8\\uD328\\uBC00\\uB9AC\\uBCD1\\uC6D0\\xA04\\uCE35\",\n        \"0507-1418-8511\"\n      ],\n      mapSrc: \"https://www.google.com/maps/embed?pb=!1m18!1m12!1m3!1d3259.4221797425307!2d128.67835877674048!3d35.220859172739466!2m3!1f0!2f0!3f0!3m2!1i1024!2i768!4f13.1!3m3!1m2!1s0x3568cd315a1db2af%3A0xe336c9915a3e6d13!2z7ISc7Jq47Yyo67CA66as67OR7JuQ!5e0!3m2!1sen!2skr!4v1764654236104!5m2!1sen!2skr\"\n    },\n    {\n      ctaRole: \"button\",\n      ctaText: \"\\uC624\\uC2DC\\uB294\\uAE38 \\u2192\",\n      headingParts: [\n        \"\\uC2A4\\uCE74\\uC774\\uB450\\uB1CC\\uC138\\uC6C0\\uC13C\\uD130\\uAD11\\uC8FC\\uC810\"\n      ],\n      lines: [\n        \"\\uAD11\\uC8FC\\uAD11\\uC5ED\\uC2DC \\uBD81\\uAD6C \\uC124\\uC8FD\\uB85C\\xA0346 B\\uB3D9\\xA01\\uCE35\",\n        \"062-262-7585\"\n      ],\n      mapSrc: \"https://www.google.com/maps/embed?pb=!1m18!1m12!1m3!1d1630.3245678708527!2d126.89729514973274!3d35.1902965756219!2m3!1f0!2f0!3f0!3m2!1i1024!2i768!4f13.1!3m3!1m2!1s0x35718db21cbf106d%3A0x978bfa16c42ccf16!2s346%20Seoljuk-ro%2C%20Buk-gu%2C%20Kwangju!5e0!3m2!1sen!2skr!4v1764653574475!5m2!1sen!2skr\"\n    },\n    {\n      ctaRole: \"button\",\n      ctaText: \"\\uC624\\uC2DC\\uB294\\uAE38 \\u2192\",\n      headingParts: [\n        \"\\uC775\\uC0B0\\uC628\\uB204\\uB9AC\\uC544\\uB3D9\\uBCD1\\uC6D0\\uBC1C\\uB2EC\\uC13C\\uD130\"\n      ],\n      lines: [\n        \"\\uC804\\uBD81\\uD2B9\\uBCC4\\uC790\\uCE58\\uB3C4 \\uC775\\uC0B0\\uC2DC \\uB3D9\\uC11C\\uB85C\\xA0491\",\n        \"063-839-5500\"\n      ],\n      mapSrc: \"https://www.google.com/maps/embed?pb=!1m18!1m12!1m3!1d3229.7695427809936!2d126.98461507676433!3d35.95260717250088!2m3!1f0!2f0!3f0!3m2!1i1024!2i768!4f13.1!3m3!1m2!1s0x3570157cd086d157%3A0xb93182dcb1aec5a1!2s491%20Dongseo-ro%2C%20Iksan%2C%20Jeonbuk%20State!5e0!3m2!1sen!2skr!4v1764654149334!5m2!1sen!2skr\"\n    },\n    {\n      ctaRole: \"button\",\n      ctaText: \"\\uC624\\uC2DC\\uB294\\uAE38 \\u2192\",\n      headingParts: [\n        \"\\uC778\\uC120\\uC18C\\uC544\\uACFC\\uC758\\uC6D0\"\n      ],\n      lines: [\n        \"\\uC11C\\uC6B8 \\uC131\\uBD81\\uAD6C \\uB3CC\\uACF6\\uC774\\uB85C 47 \\uC778\\uC120\\uC18C\\uC544\\uACFC\",\n        \"02-962-2955\"\n      ],\n      mapSrc: \"https://www.google.com/maps/embed?pb=!1m18!1m12!1m3!1d3160.7445740199037!2d127.05685767670883!3d37.60817007202797!2m3!1f0!2f0!3f0!3m2!1i1024!2i768!4f13.1!3m3!1m2!1s0x357cbb98f83d9a07%3A0x6c8c3f911255bf02!2z7J247ISg7IaM7JWE6rO87J2Y7JuQ!5e0!3m2!1sko!2skr!4v1772682636451!5m2!1sko!2skr\"\n    },\n    {\n      ctaRole: \"button\",\n      ctaText: \"\\uC624\\uC2DC\\uB294\\uAE38 \\u2192\",\n      headingParts: [\n        \"\\uACF0\\uB3CC\\uC774\\uC5B8\\uC5B4\\uC5F0\\uAD6C\\uC18C\"\n      ],\n      lines: [\n        \"\\uC11C\\uC6B8 \\uC11C\\uCD08\\uAD6C \\uBC29\\uBC30\\uB85C 36\\uAE38 3, 6\\uCE35\",\n        \"\",\n        \"\"\n      ],\n      mapSrc: \"https://www.google.com/maps/embed?pb=!1m18!1m12!1m3!1d3165.604477176718!2d126.98767227670474!3d37.49365897205771!2m3!1f0!2f0!3f0!3m2!1i1024!2i768!4f13.1!3m3!1m2!1s0x357ca1a394928ee3%3A0x3354f2669522edc3!2z7ISc7Jq47Yq567OE7IucIOyEnOy0iOq1rCDrsKnrsLDroZwzNuq4uCAzIDbsuLU!5e0!3m2!1sko!2skr!4v1772682828774!5m2!1sko!2skr\"\n    },\n    {\n      ctaRole: \"button\",\n      ctaText: \"\\uC624\\uC2DC\\uB294\\uAE38 \\u2192\",\n      headingParts: [\n        \"\\uC774\\uC9C4\\uC219\\uC18C\\uC544\\uACFC\"\n      ],\n      lines: [\n        \"\\uC778\\uCC9C \\uBBF8\\uCD94\\uD640\\uAD6C \\uC778\\uD558\\uB85C 273\",\n        \"032-866-5645\"\n      ],\n      mapSrc: \"https://www.google.com/maps/embed?pb=!1m18!1m12!1m3!1d3167.5262967989665!2d126.67595497670314!3d37.448293872069485!2m3!1f0!2f0!3f0!3m2!1i1024!2i768!4f13.1!3m3!1m2!1s0x357b7973f6809f9b%3A0x285e117ae07cb436!2z7J207KeE7IiZ7IaM7JWE6rO87J2Y7JuQ!5e0!3m2!1sko!2skr!4v1772682930074!5m2!1sko!2skr\"\n    },\n    {\n      ctaRole: \"button\",\n      ctaText: \"\\uC624\\uC2DC\\uB294\\uAE38 \\u2192\",\n      headingParts: [\n        \"\\uBD09\\uD0A4\\uBCD1\\uC6D0\\uBD80\\uC124 \\uAD7F\\uB2E5\\uD130\\uC2A4\\uD589\\uB3D9\\uBC1C\\uB2EC\\uC99D\\uC9C4\\uC13C\\uD130\"\n      ],\n      lines: [\n        \"\\uB300\\uC804 \\uC720\\uC131\\uAD6C \\uACC4\\uB8E1\\uB85C 120, 9\\uCE35\",\n        \"1522-6705\"\n      ],\n      mapSrc: \"https://www.google.com/maps/embed?pb=!1m18!1m12!1m3!1d3213.335645433878!2d127.34114327666485!3d36.35264807237813!2m3!1f0!2f0!3f0!3m2!1i1024!2i768!4f13.1!3m3!1m2!1s0x35654b83bc695ceb%3A0x59c5bf4594ab8497!2z64yA7KCE6rSR7Jet7IucIOycoOyEseq1rCDqs4Tro6HroZwgMTIwIDnsuLU!5e0!3m2!1sko!2skr!4v1772683106804!5m2!1sko!2skr\"\n    },\n    {\n      ctaRole: \"button\",\n      ctaText: \"\\uC624\\uC2DC\\uB294\\uAE38 \\u2192\",\n      headingParts: [\n        \"\\uC774\\uC815\\uD76C\\uC18C\\uC544\\uCCAD\\uC18C\\uB144\\uACFC\\uC758\\uC6D0\"\n      ],\n      lines: [\n        \"\\uC11C\\uC6B8 \\uAD00\\uC545\\uAD6C \\uC740\\uCC9C\\uB85C 38-1 2\\uCE35\",\n        \"02-877-3571\"\n      ],\n      mapSrc: \"https://www.google.com/maps/embed?pb=!1m18!1m12!1m3!1d12663.72306054562!2d126.92923137512804!3d37.4859601529508!2m3!1f0!2f0!3f0!3m2!1i1024!2i768!4f13.1!3m3!1m2!1s0x357c9f90e11843bd%3A0xde4cf77b3feb089d!2z7J207KCV7Z2s7IaM7JWE7LKt7IaM64WE6rO87J2Y7JuQ!5e0!3m2!1sko!2skr!4v1772683251263!5m2!1sko!2skr\"\n    },\n    {\n      ctaRole: \"button\",\n      ctaText: \"\\uC624\\uC2DC\\uB294\\uAE38 \\u2192\",\n      headingParts: [\n        \"\\uC6B0\\uB9AC\\uC18C\\uC544\\uCCAD\\uC18C\\uB144\\uBC1C\\uB2EC\\uC13C\\uD130\"\n      ],\n      lines: [\n        \"\\uACBD\\uAE30 \\uAE40\\uD3EC\\uC2DC \\uAE40\\uD3EC\\uD55C\\uAC154\\uB85C 507 \\uACC4\\uB9BC M\\uC2A4\\uD018\\uC5B4 7\\uCE35 706\\uD638\",\n        \"031-996-2342\"\n      ],\n      mapSrc: \"https://www.google.com/maps/embed?pb=!1m18!1m12!1m3!1d12636.525135387928!2d126.61724537521926!3d37.64611745228681!2m3!1f0!2f0!3f0!3m2!1i1024!2i768!4f13.1!3m3!1m2!1s0x357c80b4c45fbe19%3A0x42eeeec15cb051ec!2z6rOE66a8TeyKpO2AmOyWtA!5e0!3m2!1sko!2skr!4v1772683417512!5m2!1sko!2skr\"\n    },\n    {\n      ctaRole: \"button\",\n      ctaText: \"\\uC624\\uC2DC\\uB294\\uAE38 \\u2192\",\n      headingParts: [\n        \"\\uC13C\\uD2B8\\uB7F4\\uC2E0\\uACBD\\uACFC\\uC758\\uC6D0\"\n      ],\n      lines: [\n        \"\\uACBD\\uAE30 \\uC548\\uC0B0\\uC2DC \\uB2E8\\uC6D0\\uAD6C \\uACE0\\uC794\\uB85C 76 \\uC601\\uD48D\\uBE4C\\uB529 202-1\\uD638\",\n        \"0507-1477-6112\"\n      ],\n      mapSrc: \"https://naver.me/xfbrMRSu\"\n    },\n    {\n      ctaRole: \"button\",\n      ctaText: \"\\uC624\\uC2DC\\uB294\\uAE38 \\u2192\",\n      headingParts: [\n        \"\\uC3D8\\uC6B8\\uC18C\\uC544\\uCCAD\\uC18C\\uB144\\uACFC\"\n      ],\n      lines: [\n        \"\\uC11C\\uC6B8 \\uAC15\\uB0A8\\uAD6C \\uC120\\uB989\\uB85C129\\uAE38 22 \\uACE0\\uC601\\uBE4C\\uB529 2\\uCE35\",\n        \"0507-1330-5834\",\n        \"\\u200B\"\n      ],\n      mapSrc: \"https://naver.me/G9r521HZ\"\n    }\n  ];\n\n  // centers-responsive.js\n  var CSS2 = `\n[data-center30-superseded=\"true\"] { display:none !important; }\n[data-center30-list] { box-sizing:border-box; display:flex; flex-direction:column; gap:56px; width:100%; padding:48px 24px 12px; color:#18181b; font-family:inherit; }\n[data-center30-card] { box-sizing:border-box; width:100%; display:flex; flex-direction:column; gap:24px; }\n[data-center30-card] h3 { margin:0; font-family:inherit; font-size:clamp(26px,4.8vw,36px); line-height:1.3; font-weight:650; letter-spacing:-.035em; word-break:keep-all; overflow-wrap:anywhere; }\n[data-center30-card] [data-center30-details] { margin-top:20px; }\n[data-center30-card] p { margin:0; font-family:inherit; font-size:16px; line-height:1.7; font-weight:400; word-break:keep-all; overflow-wrap:anywhere; }\n[data-center30-card] [data-center30-cta] { display:inline-flex; align-items:center; margin-top:24px; padding:0; border:0; border-radius:0; background:transparent; color:inherit; text-decoration:none; font-family:inherit; font-size:16px; line-height:1.5; font-weight:500; cursor:pointer; }\n[data-center30-card] [data-center30-cta]:focus-visible { outline:2px solid #2563eb; outline-offset:5px; }\n[data-center30-card] iframe { box-sizing:border-box; display:block; width:100%; height:clamp(220px,60vw,360px); border:0; background:#f4f4f5; }\n@media(max-width:359px) { [data-center30-list] { padding-left:18px; padding-right:18px; } }\n`;\n  function reconcileNarrowCenters({ root, nativeCards }) {\n    const document2 = root.ownerDocument;\n    if (!nativeCards.length || !nativeCards.every((card) => card.parentElement === root)) throw new Error(\"Unverified center structure\");\n    const styles = document2.createElement(\"style\");\n    styles.dataset.center30Styles = \"\";\n    styles.textContent = CSS2;\n    document2.head.append(styles);\n    const previous = nativeCards.map((node) => ({ node, hidden: node.getAttribute(\"data-center30-superseded\"), aria: node.getAttribute(\"aria-hidden\"), inert: node.getAttribute(\"inert\") }));\n    const list = document2.createElement(\"div\");\n    list.dataset.center30List = \"desktop-canonical-20\";\n    const cards = centers_desktop_canonical_default.map((entry, index) => {\n      const card = document2.createElement(\"section\");\n      card.dataset.center30Card = String(index + 1);\n      const copy = document2.createElement(\"div\");\n      const heading = document2.createElement(\"h3\");\n      entry.headingParts.forEach((part, i) => {\n        if (i) heading.append(document2.createElement(\"br\"));\n        heading.append(document2.createTextNode(part));\n      });\n      copy.append(heading);\n      const details = document2.createElement(\"div\");\n      details.dataset.center30Details = \"\";\n      entry.lines.forEach((text) => {\n        const p = document2.createElement(\"p\");\n        p.textContent = text;\n        details.append(p);\n      });\n      copy.append(details);\n      const cta = document2.createElement(entry.directionHref ? \"a\" : \"button\");\n      cta.dataset.center30Cta = \"\";\n      cta.textContent = entry.ctaText;\n      if (entry.directionHref) {\n        cta.setAttribute(\"href\", entry.directionHref);\n        cta.setAttribute(\"target\", \"_self\");\n      } else cta.setAttribute(\"type\", \"button\");\n      copy.append(cta);\n      const map = document2.createElement(\"iframe\");\n      map.setAttribute(\"src\", entry.mapSrc);\n      map.setAttribute(\"title\", entry.headingParts.join(\" \") + \" \\uC9C0\\uB3C4\");\n      map.setAttribute(\"loading\", \"lazy\");\n      map.setAttribute(\"allowfullscreen\", \"\");\n      map.setAttribute(\"referrerpolicy\", \"no-referrer-when-downgrade\");\n      card.append(copy, map);\n      list.append(card);\n      return card;\n    });\n    root.insertBefore(list, nativeCards[0]);\n    nativeCards.forEach((card) => {\n      card.dataset.center30Superseded = \"true\";\n      card.setAttribute(\"aria-hidden\", \"true\");\n      card.setAttribute(\"inert\", \"\");\n    });\n    return {\n      root,\n      list,\n      cards,\n      inspect() {\n        return { source: \"live desktop 2026-09-30\", nativeCount: nativeCards.length, count: cards.length, exact: cards.every((card, i) => card.querySelector(\"h3\").textContent === centers_desktop_canonical_default[i].headingParts.join(\"\") && JSON.stringify([...card.querySelectorAll(\"[data-center30-details] p\")].map((p) => p.textContent)) === JSON.stringify(centers_desktop_canonical_default[i].lines) && card.querySelector(\"iframe\").getAttribute(\"src\") === centers_desktop_canonical_default[i].mapSrc && card.querySelector(\"[data-center30-cta]\").textContent === centers_desktop_canonical_default[i].ctaText) };\n      },\n      destroy() {\n        list.remove();\n        styles.remove();\n        previous.forEach(({ node, hidden, aria, inert }) => {\n          for (const [key, value] of [[\"data-center30-superseded\", hidden], [\"aria-hidden\", aria], [\"inert\", inert]]) value === null ? node.removeAttribute(key) : node.setAttribute(key, value);\n        });\n      }\n    };\n  }\n\n  // cms-pagination-entry.js\n  var ROUTES = {\n    CENTERS: { path: \"/\\uC13C\\uD130\\uC18C\\uAC1C\", pageSize: 10, label: \"\\uC13C\\uD130 \\uC18C\\uAC1C\", itemLabel: \"\\uC13C\\uD130\", previewTitle: /^브레인에이블\\s+센터\\s+소개$/ },\n    ARTICLES: { path: \"/\\uCEE4\\uBBA4\\uB2C8\\uD2F0Articles\", prefix: \"/case-study/\", previewTitle: /^브레인에이블\\s+ARTICLES$/i },\n    NEWS: { path: \"/\\uCEE4\\uBBA4\\uB2C8\\uD2F0News\", prefix: \"/collection-2/\", previewTitle: /^브레인에이블\\s*\\|\\s*Brainable\\s*-\\s*커뮤니티News$/i }\n  };\n  var FLOW_CSS = `\n[data-cms30-flow] { height:auto !important; min-height:0 !important; max-height:none !important; flex-basis:auto !important; }\n[data-cms30-flow]:not([data-breakpoint]) { overflow:visible !important; }\n[data-cms30-flow][data-breakpoint] { min-height:100svh !important; }\n`;\n  function pageKind(document2) {\n    let path = \"\";\n    try {\n      path = decodeURIComponent(document2.defaultView.location.pathname).replace(/\\/$/, \"\") || \"/\";\n    } catch {\n      return null;\n    }\n    const direct = Object.entries(ROUTES).find(([, route]) => route.path === path);\n    if (direct) return direct[0];\n    const preview = /figmaiframepreview\\.figma\\.site$/i.test(document2.defaultView.location.hostname);\n    if (path === \"/\" && preview) return Object.entries(ROUTES).find(([, route]) => route.previewTitle.test(document2.title.trim()))?.[0] || null;\n    return null;\n  }\n  function hrefMatches(node, prefix) {\n    const href = node.getAttribute(\"href\");\n    if (!href) return false;\n    try {\n      return new URL(href, node.ownerDocument.baseURI).pathname.startsWith(prefix);\n    } catch {\n      return false;\n    }\n  }\n  function discoverList(document2, kind) {\n    if (kind === \"CENTERS\") {\n      const roots = [...document2.querySelectorAll('[data-breakpoint=\"true\"]')].filter((root) => root.getBoundingClientRect().width > 0);\n      const matches = roots.map((list) => ({ list, cards: [...list.children].filter((card) => card.tagName === \"SECTION\" && card.querySelector(\"h3\") && card.querySelectorAll(\"iframe\").length === 1) })).filter(({ cards }) => cards.length > 0);\n      if (matches.length !== 1) return null;\n      const match2 = matches[0];\n      return { ...match2, host: match2.list, insertBefore: match2.cards[match2.cards.length - 1].nextSibling };\n    }\n    const prefix = ROUTES[kind].prefix;\n    const links = [...document2.querySelectorAll(\"a[href]\")].filter((node) => !node.closest(\"nav,header,footer,[data-nav30-kind],[data-cms30-pagination]\") && hrefMatches(node, prefix));\n    const outer = links.filter((node) => !links.some((parent) => parent !== node && parent.contains(node)));\n    const parents = [...new Set(outer.map((node) => node.parentElement))];\n    const candidates = parents.map((list) => ({ list, cards: [...list.children].filter((node) => hrefMatches(node, prefix)) })).filter(({ list, cards }) => cards.length > 0 && cards.length === list.children.length && getComputedStyle(list).display === \"flex\" && getComputedStyle(list).flexDirection === \"column\" && list.getBoundingClientRect().width > 0);\n    if (candidates.length === 1) return candidates[0];\n    if (candidates.length > 1) return null;\n    if (!/figmaiframepreview\\.figma\\.site$/i.test(document2.defaultView.location.hostname)) return null;\n    const match = (node) => node.matches('a,[role=\"link\"]') && !!node.querySelector(\"img\") && (kind === \"ARTICLES\" ? /Read more\\s*$/.test(node.textContent.trim()) : /^\\[(NEWS|SEMINAR)\\]/.test(node.textContent.trim()));\n    const fallback = [...document2.querySelectorAll(\"div\")].filter((list) => list.children.length > 0 && [...list.children].every(match) && getComputedStyle(list).display === \"flex\" && getComputedStyle(list).flexDirection === \"column\" && list.getBoundingClientRect().width > 0 && !list.closest(\"nav,header,footer,[data-nav30-kind]\"));\n    return fallback.length === 1 ? { list: fallback[0], cards: [...fallback[0].children] } : null;\n  }\n  function allowContentHeight(list) {\n    const root = list.closest('[data-breakpoint=\"true\"]');\n    if (!root) return () => {\n    };\n    const nodes = [];\n    for (let node = list; node && node !== root; node = node.parentElement) {\n      if (node.tagName !== \"DIV\") return () => {\n      };\n      nodes.push(node);\n    }\n    nodes.push(root);\n    const saved = nodes.map((node) => ({ node, value: node.getAttribute(\"data-cms30-flow\") }));\n    nodes.forEach((node) => node.setAttribute(\"data-cms30-flow\", \"\"));\n    return () => saved.forEach(({ node, value }) => value === null ? node.removeAttribute(\"data-cms30-flow\") : node.setAttribute(\"data-cms30-flow\", value));\n  }\n  function startCMSPagination(document2 = window.document) {\n    const window2 = document2.defaultView;\n    window2.__cms30Pagination?.destroy();\n    const style = document2.createElement(\"style\");\n    style.dataset.cms30FlowStyles = \"\";\n    style.textContent = FLOW_CSS;\n    document2.head.append(style);\n    const pages = /* @__PURE__ */ new Map();\n    let active = null, centerPatch = null, restoreFlow = () => {\n    }, frame = 0, destroyed = false, error = null;\n    function teardown() {\n      if (active) {\n        pages.set(active.kind, active.controller.inspect().page);\n        active.controller.destroy();\n        active = null;\n      }\n      restoreFlow();\n      restoreFlow = () => {\n      };\n    }\n    function scan() {\n      frame = 0;\n      if (destroyed) return;\n      const kind = pageKind(document2);\n      if (!kind) {\n        teardown();\n        centerPatch?.destroy();\n        centerPatch = null;\n        return;\n      }\n      let match = discoverList(document2, kind);\n      if (kind === \"CENTERS\" && match && (window2.innerWidth <= 1023 || match.list.getBoundingClientRect().width <= 1023)) {\n        if (centerPatch?.root !== match.list) {\n          teardown();\n          centerPatch?.destroy();\n          centerPatch = reconcileNarrowCenters({ root: match.list, nativeCards: match.cards });\n        }\n        match = { list: centerPatch.list, cards: centerPatch.cards };\n      } else if (centerPatch) {\n        teardown();\n        centerPatch.destroy();\n        centerPatch = null;\n      }\n      if (!match) {\n        if (active && !active.controller.list.isConnected) teardown();\n        return;\n      }\n      if (active?.kind === kind && active.controller.list === match.list && active.controller.cards.length === match.cards.length && active.controller.cards.every((node, i) => node === match.cards[i])) return;\n      teardown();\n      try {\n        restoreFlow = allowContentHeight(match.list);\n        const controller = enhanceCMSPagination({ ...match, label: ROUTES[kind].label || kind, pageSize: ROUTES[kind].pageSize || 5, itemLabel: ROUTES[kind].itemLabel || \"\\uAC8C\\uC2DC\\uAE00\", initialPage: pages.get(kind) || 1 });\n        active = { kind, controller };\n        error = null;\n      } catch (cause) {\n        restoreFlow();\n        restoreFlow = () => {\n        };\n        error = String(cause);\n      }\n    }\n    const schedule = () => {\n      if (!frame && !destroyed) frame = window2.requestAnimationFrame(scan);\n    };\n    const observer = new MutationObserver((records) => {\n      if (records.some((record) => record.type === \"childList\" && record.target.nodeType === 1 && !record.target.closest?.(\"[data-cms30-pagination],[data-cms30-probe],[data-nav30-qa-probe]\"))) schedule();\n    });\n    observer.observe(document2.body, { childList: true, subtree: true });\n    window2.addEventListener(\"popstate\", schedule);\n    window2.addEventListener(\"resize\", schedule);\n    const api = { inspect() {\n      return { route: pageKind(document2), error, pagination: active?.controller.inspect() || null, centerReconciliation: centerPatch?.inspect() || null };\n    }, destroy() {\n      destroyed = true;\n      observer.disconnect();\n      window2.removeEventListener(\"popstate\", schedule);\n      window2.removeEventListener(\"resize\", schedule);\n      if (frame) window2.cancelAnimationFrame(frame);\n      teardown();\n      centerPatch?.destroy();\n      centerPatch = null;\n      style.remove();\n      delete window2.__cms30Pagination;\n      delete window2.brainableCMSPaginationQA;\n    } };\n    window2.__cms30Pagination = api;\n    window2.brainableCMSPaginationQA = () => api.inspect();\n    scan();\n    return api;\n  }\n  if (document.readyState === \"loading\") document.addEventListener(\"DOMContentLoaded\", () => startCMSPagination(), { once: true });\n  else startCMSPagination();\n})();\n\n;\n/* BRAINABLE production global: vision-counting */\nvar BrainableVisionCountingAbout = (() => {\n  var __defProp = Object.defineProperty;\n  var __getOwnPropDesc = Object.getOwnPropertyDescriptor;\n  var __getOwnPropNames = Object.getOwnPropertyNames;\n  var __hasOwnProp = Object.prototype.hasOwnProperty;\n  var __export = (target, all) => {\n    for (var name in all)\n      __defProp(target, name, { get: all[name], enumerable: true });\n  };\n  var __copyProps = (to, from, except, desc) => {\n    if (from && typeof from === \"object\" || typeof from === \"function\") {\n      for (let key of __getOwnPropNames(from))\n        if (!__hasOwnProp.call(to, key) && key !== except)\n          __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });\n    }\n    return to;\n  };\n  var __toCommonJS = (mod) => __copyProps(__defProp({}, \"__esModule\", { value: true }), mod);\n\n  // vision-about-adapter.js\n  var vision_about_adapter_exports = {};\n  __export(vision_about_adapter_exports, {\n    installVisionCountingAboutUs: () => installVisionCountingAboutUs,\n    resolveNativeVision: () => resolveNativeVision\n  });\n\n  // vision-counting.js\n  var mounted = /* @__PURE__ */ new WeakMap();\n  var ALLOWED_TARGETS = /* @__PURE__ */ new Set([20, 50]);\n  function parseCounterText(text) {\n    const match = /^(\\s*)(20|50)(\\s*\\+?\\s*)$/.exec(text);\n    return match ? { target: Number(match[2]), prefix: match[1], suffix: match[3], original: text } : null;\n  }\n  function countAtProgress(target, progress) {\n    const t = Math.max(0, Math.min(1, progress));\n    return t >= 1 ? target : Math.min(target - 1, Math.floor(target * (1 - (1 - t) ** 2)));\n  }\n  function captureProperty(element, property) {\n    return { value: element.style.getPropertyValue(property), priority: element.style.getPropertyPriority(property) };\n  }\n  function setOwnedProperty(element, property, value, records) {\n    const before = captureProperty(element, property);\n    element.style.setProperty(property, value, \"important\");\n    records.push({ element, property, before, applied: captureProperty(element, property) });\n  }\n  function restoreOwnedProperties(records) {\n    for (const { element, property, before, applied } of records.reverse()) {\n      const current = captureProperty(element, property);\n      if (current.value !== applied.value || current.priority !== applied.priority) continue;\n      if (before.value) element.style.setProperty(property, before.value, before.priority);\n      else element.style.removeProperty(property);\n    }\n  }\n  function createVisionCounting(section, bindings, options = {}) {\n    if (mounted.has(section)) return mounted.get(section);\n    const doc = section?.ownerDocument;\n    const win = doc?.defaultView;\n    if (!win || !Array.isArray(bindings) || bindings.length !== 2) {\n      throw new TypeError(\"Pass one verified Vision section and exactly two original number bindings.\");\n    }\n    const seenTargets = /* @__PURE__ */ new Set();\n    const records = bindings.map(({ element, target }) => {\n      const parsed = parseCounterText(element?.textContent || \"\");\n      if (!section.contains(element) || element.childElementCount !== 0 || element.childNodes.length !== 1 || element.firstChild?.nodeType !== 3 || !parsed || parsed.target !== target || !ALLOWED_TARGETS.has(target) || seenTargets.has(target)) {\n        throw new TypeError(\"Each binding must be a unique, numeric-only original 20 or 50 leaf in this section.\");\n      }\n      seenTargets.add(target);\n      return { element, ...parsed, overlay: null, number: null, styles: [] };\n    });\n    const requestedDuration = Number(options.duration ?? 1e3);\n    const duration = Number.isFinite(requestedDuration) ? Math.max(800, Math.min(1200, requestedDuration)) : 1e3;\n    const threshold = Math.max(0.01, Math.min(1, Number(options.threshold) || 0.25));\n    const reducedMotion = win.matchMedia?.(\"(prefers-reduced-motion: reduce)\");\n    let status = \"waiting\";\n    let frame = 0;\n    let observer = null;\n    let completed = false;\n    let firstTime = null;\n    const removers = [];\n    function originalsUnchanged() {\n      return records.every(({ element, original, overlay }) => {\n        const originalText2 = [...element.childNodes].filter((node) => node !== overlay).map((node) => node.textContent).join(\"\");\n        return element.isConnected && section.contains(element) && originalText2 === original;\n      });\n    }\n    function cleanVisuals() {\n      for (const record of records) {\n        record.overlay?.remove();\n        record.overlay = null;\n        record.number = null;\n        restoreOwnedProperties(record.styles);\n        record.styles = [];\n      }\n    }\n    function finish(reason = \"complete\") {\n      if (status === \"destroyed\" || completed) return;\n      completed = true;\n      status = reason;\n      observer?.disconnect();\n      win.cancelAnimationFrame(frame);\n      cleanVisuals();\n      options.onComplete?.({ reason, targets: records.map(({ target }) => target), duration });\n    }\n    function makeOverlay(record) {\n      const { element, prefix, suffix } = record;\n      const computed = win.getComputedStyle(element);\n      const paint = {\n        color: computed.color,\n        fill: computed.getPropertyValue(\"-webkit-text-fill-color\") || computed.color,\n        shadow: computed.textShadow,\n        background: computed.backgroundImage,\n        clip: computed.backgroundClip,\n        backgroundSize: computed.backgroundSize,\n        backgroundPosition: computed.backgroundPosition\n      };\n      const overlay = doc.createElement(\"span\");\n      overlay.setAttribute(\"aria-hidden\", \"true\");\n      overlay.setAttribute(\"data-vision-counting-overlay\", \"\");\n      Object.assign(overlay.style, {\n        position: \"absolute\",\n        inset: \"0\",\n        display: \"block\",\n        boxSizing: \"border-box\",\n        padding: computed.padding,\n        margin: \"0\",\n        border: \"0\",\n        pointerEvents: \"none\",\n        userSelect: \"none\",\n        whiteSpace: computed.whiteSpace,\n        textAlign: computed.textAlign,\n        font: \"inherit\",\n        fontKerning: \"inherit\",\n        letterSpacing: \"inherit\",\n        lineHeight: \"inherit\",\n        fontVariantNumeric: \"inherit\",\n        textTransform: \"inherit\",\n        color: paint.color,\n        textShadow: paint.shadow,\n        webkitTextFillColor: paint.fill\n      });\n      if (paint.clip.includes(\"text\")) {\n        Object.assign(overlay.style, {\n          backgroundImage: paint.background,\n          backgroundClip: paint.clip,\n          webkitBackgroundClip: \"text\",\n          backgroundSize: paint.backgroundSize,\n          backgroundPosition: paint.backgroundPosition\n        });\n        setOwnedProperty(element, \"background-image\", \"none\", record.styles);\n      }\n      const textNode = element.firstChild;\n      const range = doc.createRange();\n      range.setStart(textNode, prefix.length);\n      range.setEnd(textNode, prefix.length + String(record.target).length);\n      const digitRect = range.getBoundingClientRect();\n      const elementRect = element.getBoundingClientRect();\n      const scale = element.offsetWidth > 0 ? elementRect.width / element.offsetWidth : 1;\n      const number = doc.createElement(\"span\");\n      number.textContent = \"0\";\n      Object.assign(number.style, {\n        display: \"inline-block\",\n        width: `${digitRect.width / (scale || 1)}px`,\n        textAlign: \"center\",\n        font: \"inherit\",\n        letterSpacing: \"inherit\",\n        lineHeight: \"inherit\",\n        verticalAlign: \"baseline\"\n      });\n      overlay.appendChild(doc.createTextNode(prefix));\n      overlay.appendChild(number);\n      overlay.appendChild(doc.createTextNode(suffix));\n      if (computed.position === \"static\") setOwnedProperty(element, \"position\", \"relative\", record.styles);\n      setOwnedProperty(element, \"color\", \"transparent\", record.styles);\n      setOwnedProperty(element, \"-webkit-text-fill-color\", \"transparent\", record.styles);\n      setOwnedProperty(element, \"text-shadow\", \"none\", record.styles);\n      record.overlay = overlay;\n      record.number = number;\n      element.appendChild(overlay);\n    }\n    function tick(time) {\n      if (status !== \"running\") return;\n      if (!originalsUnchanged()) {\n        finish(\"source-changed\");\n        return;\n      }\n      if (doc.hidden || reducedMotion?.matches) {\n        finish(\"motion-skipped\");\n        return;\n      }\n      if (firstTime === null) firstTime = time;\n      const progress = Math.min(1, (time - firstTime) / duration);\n      for (const record of records) {\n        const text = String(countAtProgress(record.target, progress));\n        if (record.number.textContent !== text) record.number.textContent = text;\n      }\n      if (progress >= 1) finish();\n      else frame = win.requestAnimationFrame(tick);\n    }\n    function start() {\n      if (status !== \"waiting\") return false;\n      if (reducedMotion?.matches || !originalsUnchanged()) {\n        finish(reducedMotion?.matches ? \"reduced-motion\" : \"source-changed\");\n        return false;\n      }\n      observer?.disconnect();\n      status = \"running\";\n      try {\n        records.forEach(makeOverlay);\n      } catch {\n        finish(\"render-unavailable\");\n        return false;\n      }\n      frame = win.requestAnimationFrame(tick);\n      return true;\n    }\n    function onMotionChange() {\n      if (reducedMotion?.matches) finish(\"reduced-motion\");\n    }\n    if (reducedMotion?.addEventListener) {\n      reducedMotion.addEventListener(\"change\", onMotionChange);\n      removers.push(() => reducedMotion.removeEventListener(\"change\", onMotionChange));\n    } else if (reducedMotion?.addListener) {\n      reducedMotion.addListener(onMotionChange);\n      removers.push(() => reducedMotion.removeListener(onMotionChange));\n    }\n    const onVisibility = () => {\n      if (doc.hidden && status === \"running\") finish(\"backgrounded\");\n    };\n    doc.addEventListener(\"visibilitychange\", onVisibility);\n    removers.push(() => doc.removeEventListener(\"visibilitychange\", onVisibility));\n    const controller = {\n      start,\n      inspect: () => ({\n        status,\n        duration,\n        targets: records.map(({ target }) => target),\n        finalTexts: records.map(({ original }) => original),\n        originalTextPreserved: originalsUnchanged(),\n        overlays: records.filter(({ overlay }) => overlay !== null).length\n      }),\n      destroy() {\n        observer?.disconnect();\n        win.cancelAnimationFrame(frame);\n        cleanVisuals();\n        removers.splice(0).forEach((remove) => remove());\n        status = \"destroyed\";\n        mounted.delete(section);\n      }\n    };\n    mounted.set(section, controller);\n    if (reducedMotion?.matches) finish(\"reduced-motion\");\n    else if (win.IntersectionObserver) {\n      observer = new win.IntersectionObserver((entries) => {\n        if (entries.some((entry) => entry.isIntersecting && entry.intersectionRatio >= threshold)) start();\n      }, { threshold: [0, threshold] });\n      records.forEach(({ element }) => observer.observe(element));\n    } else {\n      finish(\"observer-unavailable\");\n    }\n    return controller;\n  }\n\n  // vision-about-adapter.js\n  var OVERLAY = \"[data-vision-counting-overlay]\";\n  var HEADLINE = \"\\uBE0C\\uB808\\uC778\\uC5D0\\uC774\\uBE14\\uC740\\uC9C0\\uAE08\\uB3C4\\uD601\\uC2E0\\uD558\\uACE0\\uBC1C\\uC804\\uC911\\uC785\\uB2C8\\uB2E4.\";\n  var NATIVE_STATS = [\n    { label: \"Statistic 1 about Jones and Brown\", target: 20, text: \"20+20\\uB144\\uC774\\uC0C1\\uC758\\uC9C0\\uC18D\\uC801\\uC778\\uC5F0\\uAD6C\\uAC1C\\uBC1C\" },\n    { label: \"Statistic 3 about Jones and Brown\", target: 50, text: \"50+\\uD655\\uC7A5\\uC911\\uC778\\uBE0C\\uB808\\uC778\\uC5D0\\uC774\\uBE14\\uC804\\uAD6D\\uB124\\uD2B8\\uC6CC\\uD06C\" }\n  ];\n  var compact = (text) => text.replace(/\\s+/g, \"\");\n  function originalText(node) {\n    if (node.nodeType === 3) return node.textContent || \"\";\n    if (node.nodeType !== 1 || node.matches(OVERLAY)) return \"\";\n    return [...node.childNodes].map(originalText).join(\"\");\n  }\n  function resolveNativeVision(document2) {\n    const pair = NATIVE_STATS.map((spec) => {\n      const matches = [...document2.querySelectorAll(`main section[aria-label=\"${spec.label}\"]`)].filter((section3) => compact(originalText(section3)) === spec.text).filter((section3) => section3.getClientRects().length > 0 && document2.defaultView.getComputedStyle(section3).visibility === \"visible\");\n      if (matches.length !== 1) return null;\n      const section2 = matches[0];\n      const leaves = [...section2.querySelectorAll(\"p\")].filter((element) => {\n        if (element.closest(OVERLAY)) return false;\n        const originalNodes = [...element.childNodes].filter((node) => !node.matches?.(OVERLAY));\n        if (originalNodes.length !== 1 || originalNodes[0].nodeType !== 3) return false;\n        return parseCounterText(originalNodes[0].textContent)?.target === spec.target;\n      });\n      return leaves.length === 1 ? { ...spec, section: section2, element: leaves[0] } : null;\n    });\n    if (pair.some((item) => item === null)) return null;\n    const [first, second] = pair;\n    if (first.section.parentElement !== second.section.parentElement || first.section.closest(\"main\") !== second.section.closest(\"main\")) return null;\n    const section = first.section.parentElement.parentElement;\n    if (![...section.children].some((element) => compact(originalText(element)) === HEADLINE)) return null;\n    return { section, bindings: pair.map(({ element, target }) => ({ element, target })) };\n  }\n  function installVisionCountingAboutUs(document2 = window.document) {\n    const win = document2.defaultView;\n    const existing = win.__brainableVisionCountingAboutUs;\n    if (existing) return existing;\n    let mounted2 = null;\n    let frame = 0;\n    let destroyed = false;\n    let hasPlayed = false;\n    let error = null;\n    function reconcile() {\n      frame = 0;\n      if (destroyed) return;\n      if (document2.fonts?.status === \"loading\") return;\n      try {\n        const next = resolveNativeVision(document2);\n        if (mounted2 && next && mounted2.section === next.section && mounted2.bindings.every((binding, i) => binding.element === next.bindings[i].element)) return;\n        if (mounted2) {\n          const status = mounted2.controller?.inspect().status;\n          if (status && status !== \"waiting\") hasPlayed = true;\n          mounted2.controller?.destroy();\n          mounted2 = null;\n        }\n        if (!next) return;\n        const controller = hasPlayed ? null : createVisionCounting(next.section, next.bindings, {\n          duration: 1e3,\n          onComplete: () => {\n            hasPlayed = true;\n          }\n        });\n        mounted2 = { ...next, controller };\n        error = null;\n      } catch (caught) {\n        error = String(caught?.message || caught);\n        mounted2?.controller?.destroy();\n        mounted2 = null;\n      }\n    }\n    function schedule() {\n      if (!destroyed && !frame) frame = win.requestAnimationFrame(reconcile);\n    }\n    function owned(node) {\n      const element = node.nodeType === 1 ? node : node.parentElement;\n      return !!element?.closest(OVERLAY);\n    }\n    const observer = new win.MutationObserver((records) => {\n      if (records.every((record) => {\n        if (owned(record.target)) return true;\n        const changed = [...record.addedNodes, ...record.removedNodes];\n        return changed.length > 0 && changed.every(owned);\n      })) return;\n      schedule();\n    });\n    const install = {\n      inspect: () => ({\n        matched: mounted2 !== null,\n        targets: mounted2?.bindings.map(({ target }) => target) || [],\n        state: mounted2?.controller?.inspect() || (mounted2 ? { status: \"already-counted\", overlays: 0, originalTextPreserved: true } : null),\n        error\n      }),\n      destroy() {\n        destroyed = true;\n        observer.disconnect();\n        win.cancelAnimationFrame(frame);\n        mounted2?.controller?.destroy();\n        mounted2 = null;\n        win.removeEventListener(\"resize\", schedule);\n        win.removeEventListener(\"pageshow\", schedule);\n        delete win.__brainableVisionCountingAboutUs;\n      }\n    };\n    win.__brainableVisionCountingAboutUs = install;\n    observer.observe(document2.body, { childList: true, subtree: true, characterData: true });\n    win.addEventListener(\"resize\", schedule, { passive: true });\n    win.addEventListener(\"pageshow\", schedule);\n    if (document2.fonts?.status === \"loading\") document2.fonts.ready.then(schedule);\n    else reconcile();\n    return install;\n  }\n  if (typeof document !== \"undefined\") {\n    if (document.body) installVisionCountingAboutUs(document);\n    else document.addEventListener(\"DOMContentLoaded\", () => installVisionCountingAboutUs(document), { once: true });\n  }\n  return __toCommonJS(vision_about_adapter_exports);\n})();\n\n;\n/* BRAINABLE production global: home-black-hole */\nvar BrainableBlackHole=(function(C){\"use strict\";var _b=Object.defineProperty;var fs=C=>{throw TypeError(C)};var Sb=(C,F,L)=>F in C?_b(C,F,{enumerable:!0,configurable:!0,writable:!0,value:L}):C[F]=L;var m=(C,F,L)=>Sb(C,typeof F!=\"symbol\"?F+\"\":F,L),ds=(C,F,L)=>F.has(C)||fs(\"Cannot \"+L),qc=(C,F)=>Object(F)!==F?fs('Cannot use the \"in\" operator on this value'):C.has(F),l=(C,F,L)=>(ds(C,F,\"read from private field\"),L?L.call(C):F.get(C)),w=(C,F,L)=>F.has(C)?fs(\"Cannot add the same private member more than once\"):F instanceof WeakSet?F.add(C):F.set(C,L),x=(C,F,L,gr)=>(ds(C,F,\"write to private field\"),gr?gr.call(C,L):F.set(C,L),L),y=(C,F,L)=>(ds(C,F,\"access private method\"),L);/*! MIT License\n\nCopyright (c) 2025 Vercel, Inc.\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n */var It,dr,Dc,oe,ye,kt,Wn,$t,fn,Tt,Pt,At,dn,hn,Hn,Rt,nt,Kn,Uc,Mc,Xn,K,rt,Ct,Yn,mn,ae,jc,Wc,Hc,hs,ms,Qn,Ft,Lt,Me,pn,it,st,B,ps,Kc,Xc,gs,Ce,gn,U,Yc,Qc,hr,Zc,Jc,eu,tu,bs,ys,Dt,bn,Zn,Jn,Ut,ws,nu,yn,wn,ru,iu,Mt,W,Ge,ot,Oe,Ve,xn,D,mr,ri,xs,vs,_s,Ss,ii,vn,_n,er,Gt,ke,we,Sn,En,In,Z,si,su,Es,ou,au,cu,kn,$n,Gc,tr,Ot,at,nr,rr,Tn,ir,sr,ct,Pn,Vt,Nt,or,ce,uu,lu,fu,oi,du,An,Bt,Rn,zt,ue,Cn,ut,lt,qt,Ne,jt,Be,ar,cr,Wt,ft,Q,hu,mu,pu,Is,ks,ai,Ht,$e,xe,Te,gu,bu,yu,wu,dt,ht,Fn,mt,ur,Ln,lr,Pe,ze,qe,Ae,Kt,je,Xt,Re,le,xu,vu,$s,pr;const F={version:1,wgsl:\"struct _vgsl_ff499267__Bake{resolution:vec2f,yaw:f32,pitch:f32,orbitRadius:f32,diskOuter:f32,fov:f32,centerX:f32,centerY:f32,roll:f32,}@group(0) @binding(0) var<uniform> bake:_vgsl_ff499267__Bake;const _vgsl_ff499267__FLAG_HOLE:f32=1.0;const _vgsl_ff499267__FLAG_ESCAPED:f32=2.0;struct _vgsl_ff499267__GBuffer{@location(0) hit1:vec2f,@location(1) hit2:vec2f,@location(2) sky:vec4f,@location(3) view:vec4f,}@fragment fn fs_main(@location(0) f:vec2f)-> _vgsl_ff499267__GBuffer{let g=d(f,bake.resolution,bake.yaw,bake.pitch,bake.orbitRadius,bake.fov,bake.centerX,bake.centerY,bake.roll,);var h=e(g.position,g.velocity,bake.diskOuter,a(bake.orbitRadius));if(h.swallowed<0.5&&h.escaped<0.5){h.swallowed=1.0;}return _vgsl_ff499267__GBuffer(h.hit1Plane,h.hit2Plane,vec4f(h.finalVelocity,h.swallowed*_vgsl_ff499267__FLAG_HOLE+h.escaped*_vgsl_ff499267__FLAG_ESCAPED),vec4f(h.hit1Direction,h.hit2Direction),);}const _vgsl_5ff25d86__HORIZON:f32=1.0;const _vgsl_5ff25d86__ISCO:f32=3.0;const _vgsl_5ff25d86__MAX_STEPS:i32=768;struct _vgsl_5ff25d86__TraceResult{hit1Plane:vec2f,hit1Direction:vec2f,hit2Plane:vec2f,hit2Direction:vec2f,hitCount:i32,swallowed:f32,escaped:f32,finalVelocity:vec3f,}struct _vgsl_5ff25d86__CameraRay{position:vec3f,velocity:vec3f,}fn a(f:f32)-> f32{return max(120.0,f+8.0);}fn b(f:vec3f)-> vec2f{return vec2f(f.y,atan2(f.z,f.x));}fn c(f:vec3f,g:vec3f)-> vec3f{let h=max(dot(f,f),0.0001);let i=cross(f,g);let j=dot(i,i);return-1.5*j*f/(h*h*sqrt(h));}fn d(f:vec2f,g:vec2f,h:f32,i:f32,j:f32,k:f32,l:f32,m:f32,n:f32,)-> _vgsl_5ff25d86__CameraRay{let o=g.x/max(g.y,1.0);let p=vec2f(f.x*2.0-1.0,1.0-f.y*2.0);let q=(p-vec2f(l,m))*vec2f(o,1.0);let r=cos(n);let s=sin(n);let t=vec2f(q.x*r-q.y*s,q.x*s+q.y*r,);let u=clamp(i,-1.319,1.319);let v=vec3f(sin(h)*cos(u)*j,sin(u)*j,cos(h)*cos(u)*j,);let w=normalize(vec3f(0.0)-v);let z=normalize(cross(w,vec3f(0.0,1.0,0.0)));let A=cross(z,w);var B:_vgsl_5ff25d86__CameraRay;B.position=v;B.velocity=normalize(w*k+z*t.x+A*t.y);return B;}fn e(f:vec3f,g:vec3f,h:f32,i:f32)-> _vgsl_5ff25d86__TraceResult{var j=f;var k=g;var l:_vgsl_5ff25d86__TraceResult;l.hit1Plane=vec2f(0.0);l.hit1Direction=vec2f(0.0);l.hit2Plane=vec2f(0.0);l.hit2Direction=vec2f(0.0);l.hitCount=0;l.swallowed=0.0;l.escaped=0.0;for(var m=0;m<_vgsl_5ff25d86__MAX_STEPS;m++){let n=length(j);if(n<_vgsl_5ff25d86__HORIZON*1.004){l.swallowed=1.0;break;}if(n> i&&dot(j,k)>0.0){l.escaped=1.0;break;}let o=clamp((n-_vgsl_5ff25d86__HORIZON)*0.035,0.0045,0.075*max(1.0,n/6.0));let p=j;let q=k;let r=c(j,k);k+=r*(0.5*o);j+=k*o;let s=c(j,k);k+=s*(0.5*o);k=normalize(k);if(l.hitCount<2){let t=select(-1.0,1.0,p.y>=0.0);let u=select(-1.0,1.0,j.y>=0.0);if(t!=u){let v=clamp(p.y/(p.y-j.y),0.0,1.0);let w=mix(p,j,v);let x=length(w.xz);if(x>=_vgsl_5ff25d86__ISCO&&x<=h){let z=b(normalize(mix(q,k,v)));if(l.hitCount==0){l.hit1Plane=w.xz;l.hit1Direction=z;}else{l.hit2Plane=w.xz;l.hit2Direction=z;}l.hitCount+=1;}}}}l.finalVelocity=k;return l;}\",functionExports:[{name:\"escapeRadiusFor\",resolvedName:\"a\",parameterNames:[\"orbitRadius\"]},{name:\"encodeDirection\",resolvedName:\"b\",parameterNames:[\"direction\"]},{name:\"cameraRay\",resolvedName:\"d\",parameterNames:[\"uv\",\"resolution\",\"yaw\",\"pitch\",\"orbitRadius\",\"fov\",\"centerX\",\"centerY\",\"roll\"]},{name:\"traceRay\",resolvedName:\"e\",parameterNames:[\"cameraPosition\",\"initialVelocity\",\"diskOuter\",\"escapeRadius\"]}]},L={version:1,wgsl:\"struct Bloom{sourceSize:vec2f,direction:vec2f,params:vec4f,}@group(0) @binding(0) var<uniform> bloom:Bloom;@group(0) @binding(1) var source:texture_2d<f32>;@group(0) @binding(2) var linearSampler:sampler;fn softThreshold(a:vec3f)-> vec3f{let b=bloom.params.x;if(b<=0.0){return a;}let c=dot(a,vec3f(0.2126,0.7152,0.0722));let d=max(min(bloom.params.y,b),0.000001);let e=clamp(c-b+d,0.0,2.0*d);let f=e*e/(4.0*d+0.0001);let g=max(c-b,f)/max(c,0.0001);return a*g;}fn downsample(a:vec2f)-> vec3f{let b=1.0/bloom.sourceSize;let c=b*0.5;let d=(textureSample(source,linearSampler,a+vec2f(-c.x,-c.y)).rgb+textureSample(source,linearSampler,a+vec2f(c.x,-c.y)).rgb+textureSample(source,linearSampler,a+vec2f(-c.x,c.y)).rgb+textureSample(source,linearSampler,a+vec2f(c.x,c.y)).rgb)*0.25;return softThreshold(d);}fn gaussianBlur(a:vec2f)-> vec3f{let b=max(bloom.params.z,0.5);let c=0.5/(b*b);let d=1.0;let e=exp(-1.0*c);let f=exp(-4.0*c);let g=exp(-9.0*c);let h=exp(-16.0*c);let i=e+f;let j=g+h;let k=(e+2.0*f)/max(i,0.000001);let l=(3.0*g+4.0*h)/max(j,0.000001);let m=d+2.0*(i+j);let n=bloom.direction/bloom.sourceSize;var o=textureSample(source,linearSampler,a).rgb*d;o+=textureSample(source,linearSampler,a+n*k).rgb*i;o+=textureSample(source,linearSampler,a-n*k).rgb*i;o+=textureSample(source,linearSampler,a+n*l).rgb*j;o+=textureSample(source,linearSampler,a-n*l).rgb*j;return o/m;}@fragment fn fs_main(@location(0) a:vec2f)-> @location(0) vec4f{var b:vec3f;if(bloom.params.w>0.5){b=gaussianBlur(a);}else{b=downsample(a);}return vec4f(b,1.0);}\",functionExports:[]},gr={version:1,wgsl:\"struct Composite{params:vec4f,}@group(0) @binding(0) var<uniform> composite:Composite;@group(0) @binding(1) var scene:texture_2d<f32>;@group(0) @binding(2) var bloomNear:texture_2d<f32>;@group(0) @binding(3) var bloomMedium:texture_2d<f32>;@group(0) @binding(4) var bloomFar:texture_2d<f32>;@group(0) @binding(5) var linearSampler:sampler;const EXPOSURE:f32=1.15;const SATURATION:f32=0.0;fn aces(a:vec3f)-> vec3f{let b=2.51;let c=0.03;let d=2.43;let e=0.59;let f=0.14;return clamp((a*(b*a+vec3f(c)))/(a*(d*a+vec3f(e))+vec3f(f)),vec3f(0.0),vec3f(1.0));}fn tonemap(a:vec3f,b:vec2f)-> vec3f{var c=aces(a*EXPOSURE);let d=b-vec2f(0.5);let e=1.0-smoothstep(0.55,1.15,length(d)*1.6);c*=mix(0.72,1.0,e);c=pow(c,vec3f(1.0/2.2));let f=dot(c,vec3f(0.2126,0.7152,0.0722));let g=mix(vec3f(0.09,0.29,0.74),vec3f(0.68,0.86,1.0),pow(f,0.65));return g*f;}@fragment fn fs_main(@location(0) a:vec2f)-> @location(0) vec4f{let b=textureSample(scene,linearSampler,a).rgb;let c=textureSample(bloomNear,linearSampler,a).rgb*0.50+textureSample(bloomMedium,linearSampler,a).rgb*0.32+textureSample(bloomFar,linearSampler,a).rgb*0.18;let d=b+c*composite.params.x;return vec4f(tonemap(d,a),1.0);}\",functionExports:[]},Ts=64,_u=\"r8unorm\",Su=13,j=Math.fround,br=e=>j(e-Math.floor(e)),Eu=j(.1031),Iu=j(.103),ku=j(.0973),ci=j(33.33);function $u(e,t,n){let r=br(j(e*Eu)),i=br(j(t*Iu)),s=br(j(n*ku));const o=j(j(j(r*j(i+ci))+j(i*j(s+ci)))+j(s*j(r+ci)));return r=j(r+o),i=j(i+o),s=j(s+o),br(j(j(r+i)*s))}function ui(e,t){return e<t/2?e:e-t}function Tu(e,t){const n=new Uint8Array(e*e*e),r=t*1024;let i=0;for(let s=0;s<e;s++){const o=ui(s,e)+r;for(let a=0;a<e;a++){const c=ui(a,e);for(let u=0;u<e;u++)n[i++]=Math.min(255,Math.round($u(ui(u,e),c,o)*255))}}return n}const Ps=new Map;function Pu(e,t){const n=`${e}:${t}`;let r=Ps.get(n);return r||(r=Tu(e,t),Ps.set(n,r)),r}function Au(e,t=Ts,n=\"black-hole-noise\"){const r=e.device.createTexture({kind:\"3d\",size:[t,t,t],format:_u,usage:[\"texture_binding\",\"copy_dst\"],label:n});try{return e.gpu.queue.writeTexture({texture:r.gpu},Pu(t,Su),{offset:0,bytesPerRow:t,rowsPerImage:t},{width:t,height:t,depthOrArrayLayers:t}),r}catch(i){try{r.destroy()}catch{}throw i}}function Ru(e,t){return e.sampler(t,{addressModeU:\"repeat\",addressModeV:\"repeat\",addressModeW:\"repeat\",minFilter:\"linear\",magFilter:\"linear\"})}const Cu={version:1,wgsl:\"struct _vgsl_6930e6de__Refine{resolution:vec2f,yaw:f32,pitch:f32,orbitRadius:f32,diskOuter:f32,fov:f32,centerX:f32,centerY:f32,roll:f32,}@group(0) @binding(0) var<uniform> refine:_vgsl_6930e6de__Refine;@group(0) @binding(1) var gHit1:texture_2d<f32>;@group(0) @binding(2) var gSky:texture_2d<f32>;const _vgsl_6930e6de__SUB_STEPS:i32=4;const _vgsl_6930e6de__MASK_RADIUS:i32=2;const _vgsl_6930e6de__GRADIENT_LIMIT:f32=0.12;const _vgsl_6930e6de__B_CRIT:f32=2.59807621;const _vgsl_6930e6de__CRITICAL_BAND:f32=0.06;fn a(g:vec2f)-> bool{return length(g)> _vgsl_5ff25d86__ISCO*0.5;}struct _vgsl_6930e6de__RefineOut{@location(0) coverage:vec2f,@location(1) geometry:vec4f,}@fragment fn fs_main(@location(0) g:vec2f)-> _vgsl_6930e6de__RefineOut{let h=vec2i(textureDimensions(gHit1,0));let i=vec2i(clamp(g*refine.resolution,vec2f(0.0),refine.resolution-vec2f(1.0)));let j=max(refine.diskOuter-_vgsl_5ff25d86__ISCO,0.001);let k=textureLoad(gHit1,i,0).xy;let l=a(k);let m=(i32(textureLoad(gSky,i,0).w+0.5)&1)!=0;let n=clamp((length(k)-_vgsl_5ff25d86__ISCO)/j,0.0,1.0);let o=e(g,refine.resolution,refine.yaw,refine.pitch,refine.orbitRadius,refine.fov,refine.centerX,refine.centerY,refine.roll,);let p=length(cross(o.position,o.velocity));var q=abs(p-_vgsl_6930e6de__B_CRIT)<_vgsl_6930e6de__CRITICAL_BAND*_vgsl_5ff25d86__HORIZON;for(var r=-_vgsl_6930e6de__MASK_RADIUS;r<=_vgsl_6930e6de__MASK_RADIUS;r++){for(var s=-_vgsl_6930e6de__MASK_RADIUS;s<=_vgsl_6930e6de__MASK_RADIUS;s++){let t=clamp(i+vec2i(s,r),vec2i(0),h-vec2i(1));let u=textureLoad(gHit1,t,0).xy;let v=a(u);let x=(i32(textureLoad(gSky,t,0).w+0.5)&1)!=0;if(v!=l||x!=m){q=true;}if(v&&l){let y=clamp((length(u)-_vgsl_5ff25d86__ISCO)/j,0.0,1.0);if(abs(y-n)> _vgsl_6930e6de__GRADIENT_LIMIT){q=true;}}}}if(!q){return _vgsl_6930e6de__RefineOut(vec2f(select(0.0,1.0,l),0.0),vec4f(0.0));}let z=b(refine.orbitRadius);var A=0.0;var B=1e9;var C=-1e9;var D=vec2f(0.0);var E=vec2f(0.0);var F=0.0;var G=1e9;for(var H=0;H<_vgsl_6930e6de__SUB_STEPS;H++){for(var I=0;I<_vgsl_6930e6de__SUB_STEPS;I++){let J=(vec2f(f32(I),f32(H))+vec2f(0.5))/f32(_vgsl_6930e6de__SUB_STEPS);let K=(vec2f(i)+J)/refine.resolution;let L=e(K,refine.resolution,refine.yaw,refine.pitch,refine.orbitRadius,refine.fov,refine.centerX,refine.centerY,refine.roll,);let M=f(L.position,L.velocity,refine.diskOuter,z);if(M.hitCount>0){let N=length(M.hit1Plane);A+=1.0;B=min(B,N);C=max(C,N);let O=length(J-vec2f(0.5));if(O<G){G=O;D=M.hit1Plane;E=M.hit1Direction;F=N;}}}}let P=A/f32(_vgsl_6930e6de__SUB_STEPS*_vgsl_6930e6de__SUB_STEPS);if(A<0.5){return _vgsl_6930e6de__RefineOut(vec2f(0.0,0.0),vec4f(0.0));}var Q=length(k);var R=0.0;var S=vec4f(0.0);if(l){R=2.0*max(abs(C-Q),abs(Q-B));}else{Q=0.5*(B+C);R=C-B;S=vec4f(D*(Q/max(F,_vgsl_5ff25d86__ISCO)),E);}return _vgsl_6930e6de__RefineOut(vec2f(P,clamp(R/j,0.0,1.0)),S);}const _vgsl_5ff25d86__HORIZON:f32=1.0;const _vgsl_5ff25d86__ISCO:f32=3.0;const _vgsl_5ff25d86__MAX_STEPS:i32=768;struct _vgsl_5ff25d86__TraceResult{hit1Plane:vec2f,hit1Direction:vec2f,hit2Plane:vec2f,hit2Direction:vec2f,hitCount:i32,swallowed:f32,escaped:f32,finalVelocity:vec3f,}struct _vgsl_5ff25d86__CameraRay{position:vec3f,velocity:vec3f,}fn b(g:f32)-> f32{return max(120.0,g+8.0);}fn c(g:vec3f)-> vec2f{return vec2f(g.y,atan2(g.z,g.x));}fn d(g:vec3f,h:vec3f)-> vec3f{let i=max(dot(g,g),0.0001);let j=cross(g,h);let k=dot(j,j);return-1.5*k*g/(i*i*sqrt(i));}fn e(g:vec2f,h:vec2f,i:f32,j:f32,k:f32,l:f32,m:f32,n:f32,o:f32,)-> _vgsl_5ff25d86__CameraRay{let p=h.x/max(h.y,1.0);let q=vec2f(g.x*2.0-1.0,1.0-g.y*2.0);let r=(q-vec2f(m,n))*vec2f(p,1.0);let s=cos(o);let t=sin(o);let u=vec2f(r.x*s-r.y*t,r.x*t+r.y*s,);let v=clamp(j,-1.319,1.319);let w=vec3f(sin(i)*cos(v)*k,sin(v)*k,cos(i)*cos(v)*k,);let z=normalize(vec3f(0.0)-w);let A=normalize(cross(z,vec3f(0.0,1.0,0.0)));let B=cross(A,z);var C:_vgsl_5ff25d86__CameraRay;C.position=w;C.velocity=normalize(z*l+A*u.x+B*u.y);return C;}fn f(g:vec3f,h:vec3f,i:f32,j:f32)-> _vgsl_5ff25d86__TraceResult{var k=g;var l=h;var m:_vgsl_5ff25d86__TraceResult;m.hit1Plane=vec2f(0.0);m.hit1Direction=vec2f(0.0);m.hit2Plane=vec2f(0.0);m.hit2Direction=vec2f(0.0);m.hitCount=0;m.swallowed=0.0;m.escaped=0.0;for(var n=0;n<_vgsl_5ff25d86__MAX_STEPS;n++){let o=length(k);if(o<_vgsl_5ff25d86__HORIZON*1.004){m.swallowed=1.0;break;}if(o> j&&dot(k,l)>0.0){m.escaped=1.0;break;}let p=clamp((o-_vgsl_5ff25d86__HORIZON)*0.035,0.0045,0.075*max(1.0,o/6.0));let q=k;let r=l;let s=d(k,l);l+=s*(0.5*p);k+=l*p;let t=d(k,l);l+=t*(0.5*p);l=normalize(l);if(m.hitCount<2){let u=select(-1.0,1.0,q.y>=0.0);let v=select(-1.0,1.0,k.y>=0.0);if(u!=v){let w=clamp(q.y/(q.y-k.y),0.0,1.0);let x=mix(q,k,w);let z=length(x.xz);if(z>=_vgsl_5ff25d86__ISCO&&z<=i){let A=c(normalize(mix(r,l,w)));if(m.hitCount==0){m.hit1Plane=x.xz;m.hit1Direction=A;}else{m.hit2Plane=x.xz;m.hit2Direction=A;}m.hitCount+=1;}}}}m.finalVelocity=l;return m;}\",functionExports:[{name:\"escapeRadiusFor\",resolvedName:\"b\",parameterNames:[\"orbitRadius\"]},{name:\"encodeDirection\",resolvedName:\"c\",parameterNames:[\"direction\"]},{name:\"cameraRay\",resolvedName:\"e\",parameterNames:[\"uv\",\"resolution\",\"yaw\",\"pitch\",\"orbitRadius\",\"fov\",\"centerX\",\"centerY\",\"roll\"]},{name:\"traceRay\",resolvedName:\"f\",parameterNames:[\"cameraPosition\",\"initialVelocity\",\"diskOuter\",\"escapeRadius\"]}]},Fu={version:1,wgsl:\"struct _vgsl_fd676da8__Shade{resolution:vec2f,time:f32,diskOuter:f32,sceneYaw:f32,centerFade:f32,}const _vgsl_fd676da8__DISK_GAIN:f32=1.35;fn b(a:f32)-> f32{let c=abs(a-0.5);return pow(smoothstep(0.08,0.38,c),2.2);}@group(0) @binding(0) var<uniform> shade:_vgsl_fd676da8__Shade;@group(0) @binding(1) var gHit1:texture_2d<f32>;@group(0) @binding(2) var gHit2:texture_2d<f32>;@group(0) @binding(3) var gSky:texture_2d<f32>;@group(0) @binding(4) var gView:texture_2d<f32>;@group(0) @binding(5) var<uniform> disk:_vgsl_ac2eea1b__DiskLook;@group(0) @binding(6) var<uniform> stars:_vgsl_045b447d__StarLook;@group(0) @binding(7) var noiseVolume:texture_3d<f32>;@group(0) @binding(8) var noiseSampler:sampler;@group(0) @binding(9) var gAa:texture_2d<f32>;@group(0) @binding(10) var gAaGeom:texture_2d<f32>;fn e(a:_vgsl_6c5789c7__GBufferSample)-> vec2f{let c=max(disk.stretch,0.05);let d=a.diskPolar.y-min(shade.time,_vgsl_ac2eea1b__SHEAR_PERIOD*0.5)*(disk.speed*0.55/pow(a.diskPolar.x,1.5));let f=vec3f(cos(d)*c,sin(d)*c,a.diskPolar.x*disk.detail,);return vec2f(max(fwidth(f.x),fwidth(f.y)),fwidth(f.z),);}fn h(a:vec2f)-> f32{return min(max(a.x,a.y),4.0);}fn j(a:vec3f,c:f32)-> vec3f{let d=cos(c);let f=sin(c);return vec3f(d*a.x+f*a.z,a.y,-f*a.x+d*a.z);}fn k(a:f32)-> f32{return a-_vgsl_6c5789c7__TAU*floor((a+_vgsl_6c5789c7__PI_CONST)/_vgsl_6c5789c7__TAU);}fn l(a:_vgsl_6c5789c7__GBufferSample,c:f32)-> _vgsl_6c5789c7__GBufferSample{var d=a;d.position=j(a.position,c);d.viewDirection=j(a.viewDirection,c);d.rayDirection=j(a.rayDirection,c);let f=k(a.diskPolar.y-c);d.diskPolar=vec2f(a.diskPolar.x,f);d.diskUv=vec2f(a.diskUv.x,(f+_vgsl_6c5789c7__PI_CONST)/_vgsl_6c5789c7__TAU);return d;}fn m(a:_vgsl_6c5789c7__GBufferLayers,c:f32)-> _vgsl_6c5789c7__GBufferLayers{var d:_vgsl_6c5789c7__GBufferLayers;d.front=l(a.front,c);d.back=l(a.back,c);return d;}const _vgsl_fd676da8__AA_TAPS:i32=6;const _vgsl_fd676da8__AA_SPAN_MIN:f32=0.15;fn o(a:_vgsl_6c5789c7__GBufferSample,c:f32,d:f32)-> _vgsl_ac2eea1b__DiskSample{let f=max(shade.diskOuter-_vgsl_6c5789c7__ISCO,0.001);let g=a.span*f;if(a.span<=_vgsl_fd676da8__AA_SPAN_MIN){return I(a,disk,shade.time,c,noiseVolume,noiseSampler);}let i=min(max(d,max(disk.detail,0.05)*(g/f32(_vgsl_fd676da8__AA_TAPS))),4.0);let n=g/f32(_vgsl_fd676da8__AA_TAPS);let p=a.diskPolar.x-g*0.5;var r=vec3f(0.0);var s=0.0;var u=0.0;for(var v=0;v<_vgsl_fd676da8__AA_TAPS;v++){let w=p+(f32(v)+0.5)*n;if(w<_vgsl_6c5789c7__ISCO||w> shade.diskOuter){continue;}let y=I(D(a,w,shade.diskOuter),disk,shade.time,i,noiseVolume,noiseSampler,);r+=y.color*y.alpha;s+=y.alpha;u+=1.0;}if(u<0.5){return I(a,disk,shade.time,c,noiseVolume,noiseSampler);}var z:_vgsl_ac2eea1b__DiskSample;let T=s/u;z.alpha=T;z.color=select(vec3f(0.0),(r/u)/max(T,1e-6),T>1e-6);return z;}fn q()-> _vgsl_ac2eea1b__DiskSample{var a:_vgsl_ac2eea1b__DiskSample;a.color=vec3f(0.0);a.alpha=0.0;return a;}fn t(a:vec3f,c:_vgsl_ac2eea1b__DiskSample)-> vec3f{return c.color*c.alpha*_vgsl_fd676da8__DISK_GAIN+a*(1.0-c.alpha);}@fragment fn fs_main(@location(0) a:vec2f)-> @location(0) vec4f{let c=vec2f(textureDimensions(gHit1,0));let d=vec2i(clamp(a*c,vec2f(0.0),c-vec2f(1.0)));let f=textureLoad(gAa,d,0).xy;let g=textureLoad(gAaGeom,d,0);let i=C(textureLoad(gHit1,d,0).xy,textureLoad(gHit2,d,0).xy,textureLoad(gSky,d,0),textureLoad(gView,d,0),shade.diskOuter,f,g,);let n=e(i.front);let p=e(i.back);let r=h(n);let s=h(p);let u=i.front.rayDirection;let v=dpdx(u);let w=dpdy(u);let z=m(i,-shade.sceneYaw);let T=z.front;let U=j(v,-shade.sceneYaw);let V=j(w,-shade.sceneYaw);var W=vec3f(0.0);if(!T.isBlackHole&&T.escaped){W=Q(T.rayDirection,stars,shade.time,U,V);}var X=q();var Y=q();if(z.back.isHit){X=I(z.back,disk,shade.time,s,noiseVolume,noiseSampler);}if(z.front.isHit){Y=o(z.front,r,n.x);Y.alpha*=z.front.coverage;}var Z=W;Z=t(Z,X);Z=t(Z,Y);let aa=mix(1.0,b(a.y),clamp(shade.centerFade,0.0,1.0),);let ab=aa;Z*=ab;return vec4f(Z,1.0);}const _vgsl_6c5789c7__HORIZON:f32=1.0;const _vgsl_6c5789c7__ISCO:f32=3.0;const _vgsl_6c5789c7__TAU:f32=6.28318530718;const _vgsl_6c5789c7__PI_CONST:f32=3.14159265359;struct _vgsl_6c5789c7__GBufferSample{position:vec3f,normal:vec3f,diskUv:vec2f,diskPolar:vec2f,rayDirection:vec3f,viewDirection:vec3f,side:f32,coverage:f32,span:f32,isHit:bool,synthesized:bool,isBlackHole:bool,escaped:bool,}struct _vgsl_6c5789c7__GBufferLayers{front:_vgsl_6c5789c7__GBufferSample,back:_vgsl_6c5789c7__GBufferSample,}fn A(a:vec2f)-> vec3f{let c=sqrt(max(1.0-a.x*a.x,0.0));return vec3f(cos(a.y)*c,a.x,sin(a.y)*c);}fn B(a:vec2f,c:vec2f,d:vec4f,f:i32,g:f32,i:vec2f,synthesized:bool,)-> _vgsl_6c5789c7__GBufferSample{var n:_vgsl_6c5789c7__GBufferSample;let p=length(a);let isHit=p> _vgsl_6c5789c7__ISCO*0.5;let r=max(p,_vgsl_6c5789c7__ISCO);let s=atan2(a.y,a.x);let u=A(c);let side=select(1.0,-1.0,u.y>0.0);n.position=select(vec3f(0.0),vec3f(a.x,0.0,a.y),isHit);n.normal=select(vec3f(0.0),vec3f(0.0,side,0.0),isHit);n.diskUv=vec2f(clamp((r-_vgsl_6c5789c7__ISCO)/max(g-_vgsl_6c5789c7__ISCO,0.001),0.0,1.0),(s+_vgsl_6c5789c7__PI_CONST)/_vgsl_6c5789c7__TAU,);n.diskPolar=vec2f(r,s);n.rayDirection=d.xyz;n.viewDirection=u;n.side=select(0.0,side,isHit);n.coverage=clamp(i.x,0.0,1.0);n.span=clamp(i.y,0.0,1.0);n.isHit=isHit;n.synthesized=synthesized&&isHit;n.isBlackHole=(f&1)!=0;n.escaped=(f&2)!=0;return n;}fn C(a:vec2f,c:vec2f,d:vec4f,f:vec4f,g:f32,i:vec2f,n:vec4f,)-> _vgsl_6c5789c7__GBufferLayers{let p=i32(d.w+0.5);let r=length(a)<=_vgsl_6c5789c7__ISCO*0.5&&length(n.xy)> _vgsl_6c5789c7__ISCO*0.5;let s=select(a,n.xy,r);let u=select(f.xy,n.zw,r);var v:_vgsl_6c5789c7__GBufferLayers;v.front=B(s,u,d,p,g,i,r);v.back=B(c,f.zw,d,p,g,vec2f(1.0,0.0),false);if(!v.front.isHit){v.back.isHit=false;v.back.side=0.0;v.back.normal=vec3f(0.0);}return v;}fn D(a:_vgsl_6c5789c7__GBufferSample,c:f32,d:f32)-> _vgsl_6c5789c7__GBufferSample{var f=a;let g=clamp(c,_vgsl_6c5789c7__ISCO,max(d,_vgsl_6c5789c7__ISCO));let i=a.diskPolar.y;f.position=vec3f(cos(i)*g,0.0,sin(i)*g);f.diskPolar=vec2f(g,i);f.diskUv=vec2f(clamp((g-_vgsl_6c5789c7__ISCO)/max(d-_vgsl_6c5789c7__ISCO,0.001),0.0,1.0),a.diskUv.y,);return f;}struct _vgsl_ac2eea1b__DiskLook{brightness:f32,speed:f32,stretch:f32,detail:f32,turbulence:f32,density:f32,doppler:f32,cloudScale:f32,cloudSpeed:f32,cloudStrength:f32,spare0:f32,spare1:f32,spare2:f32,spare3:f32,}struct _vgsl_ac2eea1b__DiskSample{color:vec3f,alpha:f32,}struct _vgsl_ac2eea1b__NoiseLattice{invSize:f32,}fn E(a:texture_3d<f32>,c:sampler,d:_vgsl_ac2eea1b__NoiseLattice,f:vec3f)-> f32{let g=floor(f);let i=f-g;let n=i*i*(3.0-2.0*i);return textureSampleLevel(a,c,(g+n+vec3f(0.5))*d.invSize,0.0).r;}fn F(a:texture_3d<f32>,c:sampler,d:_vgsl_ac2eea1b__NoiseLattice,f:f32,g:f32,i:f32,n:f32,p:i32,r:f32,s:f32,u:f32,v:f32,w:f32,)-> f32{var x:f32=0.0;var y:f32=0.0;var z:f32=0.5;var T=i;var U=n;var V=w;for(var W=0;W<p;W++){let X=clamp(1.0-1.7*max(r*T,s*U),0.0,1.0);var Y:f32=0.5;if(X>0.004){Y=mix(0.5,E(a,c,d,vec3f(cos(f)*T,sin(f)*T,g*U+V)),X,);}x+=z*Y;y+=z;T*=u;U*=v;V+=23.7;z*=0.55;}return x/max(y,0.0001);}fn G(a:texture_3d<f32>,c:sampler,d:_vgsl_ac2eea1b__NoiseLattice,f:f32,g:f32,i:f32,n:f32,p:i32,r:f32,s:f32,u:f32,v:f32,w:f32,)-> f32{var x:f32=0.0;var y:f32=0.0;var z:f32=0.5;var T=i;var U=n;var V=w;for(var W=0;W<p;W++){let X=clamp(1.0-1.7*max(r*T,s*U),0.0,1.0);var Y:f32=0.42;if(X>0.004){let Z=E(a,c,d,vec3f(cos(f)*T,sin(f)*T,g*U+V));Y=mix(0.42,pow(1.0-abs(Z*2.0-1.0),1.35),X);}x+=z*Y;y+=z;T*=u;U*=v;V+=41.9;z*=0.62;}return x/max(y,0.0001);}struct _vgsl_ac2eea1b__FieldParams{angBase:f32,radBase:f32,flowRad:f32,chaos:f32,outward:f32,dAngle:f32,dRadius:f32,}fn H(a:texture_3d<f32>,c:sampler,d:_vgsl_ac2eea1b__NoiseLattice,f:f32,g:f32,i:_vgsl_ac2eea1b__FieldParams,)-> vec2f{let n=(F(a,c,d,f,g,i.angBase*0.55,i.flowRad*1.6,2,i.dAngle,i.dRadius,1.6,2.0,3.7,))-0.5;let p=(F(a,c,d,f+2.4,g*1.13,i.angBase*2.8,i.radBase*0.45,3,i.dAngle,i.dRadius,1.7,2.0,61.3,))-0.5;let r=g+(n*1.9+p*1.25*i.outward)*i.chaos;let s=f+(p*0.9-n*0.35)*i.chaos*0.55/max(g*0.22,0.35);let u=F(a,c,d,s,r,i.angBase,i.flowRad,3,i.dAngle,i.dRadius,2.0,1.12,131.7,);let v=G(a,c,d,s,r,i.angBase*0.85,i.radBase,5,i.dAngle,i.dRadius,1.26,2.05,0.0,);let w=clamp(1.0-1.7*max(i.dAngle*i.angBase*0.85,i.dRadius*i.radBase),0.0,1.0);let x=mix(u,u*0.22+v*1.05,w);let y=(n+p*0.5)*0.9;return vec2f(f32(x),y);}const _vgsl_ac2eea1b__FIELD_MEAN=0.52;const _vgsl_ac2eea1b__SHEAR_REF_RADIUS=6.5;const _vgsl_ac2eea1b__SHEAR_PERIOD:f32=10.0;const _vgsl_ac2eea1b__TWO_PI=6.283185307;fn I(a:_vgsl_6c5789c7__GBufferSample,c:_vgsl_ac2eea1b__DiskLook,d:f32,f:f32,g:texture_3d<f32>,i:sampler,)-> _vgsl_ac2eea1b__DiskSample{var n:_vgsl_ac2eea1b__NoiseLattice;n.invSize=1.0/f32(textureDimensions(g).x);let p=vec2f(a.position.x,a.position.z);let r=a.diskPolar.x;let s=a.diskPolar.y;let u=clamp(a.diskUv.x,0.0,1.0);let viewDirection=a.viewDirection;let v=max(abs(viewDirection.y),0.022);let w=min(1.0/v,34.0);let T=normalize(vec2f(viewDirection.x,viewDirection.z)+vec2f(1e-6,0.0));let U=normalize(p+vec2f(1e-6,0.0));let V=clamp(abs(dot(U,T)),0.0,1.0);let W=sqrt(max(1.0-V*V,0.0));let X=w*w-1.0;let Y=sqrt(1.0+X*V*V);let Z=sqrt(1.0+X*W*W);let aa=max(c.detail,0.05);let ab=max(c.stretch,0.05);let ac=f/max(aa*Y,ab*Z/max(r,_vgsl_6c5789c7__ISCO));let dRadius=ac*Y;let dAngle=ac*Z/max(r,_vgsl_6c5789c7__ISCO);let ad=c.speed*0.55/pow(r,1.5);let ae=c.speed*0.55/pow(_vgsl_ac2eea1b__SHEAR_REF_RADIUS,1.5);let af=ad-ae;let ag=fract(d*ae/_vgsl_ac2eea1b__TWO_PI)*_vgsl_ac2eea1b__TWO_PI;let ah=max(0.0,0.85+c.spare1);let ai=s-ag+ah*log(r/_vgsl_6c5789c7__ISCO);let aj=d/_vgsl_ac2eea1b__SHEAR_PERIOD;let ak=fract(aj);let al=fract(aj+0.5);let am=(ak-0.5)*_vgsl_ac2eea1b__SHEAR_PERIOD;let an=(al-0.5)*_vgsl_ac2eea1b__SHEAR_PERIOD;let ao=1.0-abs(2.0*ak-1.0);let ap=1.0-ao;let aq=ai-af*am;let ar=ai-af*an;let outward=smoothstep(0.0,0.92,u);let at=max(0.0,1.0+c.spare3);let chaos=c.turbulence*(0.08+2.10*outward*outward)*at;let angBase=max(c.stretch,0.05)*0.45*(0.80+1.45*outward*at);let radBase=max(c.detail,0.05)*2.35;let flowRad=max(c.detail,0.05)*0.105;var au:_vgsl_ac2eea1b__FieldParams;au.angBase=angBase;au.radBase=radBase;au.flowRad=flowRad;au.chaos=chaos;au.outward=outward;au.dAngle=dAngle;au.dRadius=dRadius;let av=abs(af)*_vgsl_ac2eea1b__SHEAR_PERIOD*0.5*angBase*0.85;let aw=1.0-smoothstep(0.12,1.1,av);var ax:vec2f;var ay=1.0;if(aw>0.98){let az=mix(ar,aq,ao);ax=H(g,i,n,az,r,au);}else{let aA=H(g,i,n,aq,r,au);let aB=H(g,i,n,ar,r,au);ax=mix(aB,aA,ao);ay=sqrt(max(ao*ao+ap*ap+2.0*aw*ao*ap,0.25));}var aC=_vgsl_ac2eea1b__FIELD_MEAN+(ax.x-_vgsl_ac2eea1b__FIELD_MEAN)/ay;let aD=ae*c.cloudSpeed;let aE=fract(d*aD/_vgsl_ac2eea1b__TWO_PI)*_vgsl_ac2eea1b__TWO_PI;let aF=s-aE+0.32*log(r/_vgsl_6c5789c7__ISCO);let cloudScale=max(c.cloudScale,0.05);let aG=F(g,i,n,aF,r,cloudScale,cloudScale*0.34,2,dAngle,dRadius,1.72,1.86,211.7,);let aH=smoothstep(0.28,0.72,aG);let cloudStrength=clamp(c.cloudStrength,0.0,0.95);let aI=mix(1.0-cloudStrength,1.0+cloudStrength,aH);aC*=aI;let aJ=ax.y;let aK=smoothstep(0.0,0.055,u);let aL=1.0-smoothstep(0.42+aJ*0.30*at,1.0,u);let aM=aK*aL*mix(1.0,0.62,outward);let aN=max(0.2,1.0+c.spare2);let aO=0.50-0.16/aN;let aP=0.50+0.21/aN;var aQ=clamp(pow(smoothstep(aO,aP,aC),1.0+0.9*aN)*aM,0.0,1.0);let aR=clamp((aC-(aO-0.10))/max(aP-aO+0.26,0.02),0.0,1.0);let aS=(mix(0.05,1.0,pow(aR,1.35))+2.2*pow(aR,5.0))*aM;let aT=pow(w,0.62);let aU=mix(0.30,0.85,u);let aV=aQ*aU*aT*c.density*0.95;let aW=1.0-exp(-aV);let aX=pow(1.0-u,1.25);var aY=mix(vec3f(0.52,0.14,0.03),vec3f(1.0,0.56,0.17),smoothstep(0.03,0.5,aX));aY=mix(aY,vec3f(1.0,0.94,0.83),pow(aX,2.2));let aZ=normalize(vec3f(-p.y,0.0,p.x));let a0=min(0.64,0.94/sqrt(max(r-_vgsl_6c5789c7__HORIZON,0.25)));let a1=dot(aZ,-normalize(viewDirection));let a2=pow(clamp(1.0/(1.0-a0*a1),0.72,1.55),1.5*c.doppler);let a3=sqrt(max(1.0-_vgsl_6c5789c7__HORIZON/r,0.025));let a4=mix(0.82,1.0,step(0.0,a.side));let a5=pow(clamp(_vgsl_6c5789c7__ISCO/r,0.0,1.0),1.7);let a6=1.0+2.6*pow(1.0-u,5.0);let a7=max(0.0,1.0+c.spare0);let a8=smoothstep(0.16,0.75,abs(viewDirection.y));let a9=1.0+1.55*a7*a8;let baa=1.0+0.55*smoothstep(6.0,26.0,w);let bab=aY*a2*a3*a4*a5*a9*baa*a6*aS;let bac=bab*c.brightness*1.35;var bad:_vgsl_ac2eea1b__DiskSample;bad.color=vec3f(bac);bad.alpha=aW;return bad;}const _vgsl_045b447d__STAR_INTENSITY:f32=1.9;const _vgsl_045b447d__ANCHOR_CELLS:f32=36.0;const _vgsl_045b447d__ANCHOR_FILL:f32=0.75;const _vgsl_045b447d__ANCHOR_RADIUS:f32=0.00110;const _vgsl_045b447d__ANCHOR_PEAK:f32=1.0;const _vgsl_045b447d__FIELD_CELLS:f32=93.0;const _vgsl_045b447d__FIELD_FILL:f32=0.75;const _vgsl_045b447d__FIELD_RADIUS:f32=0.00070;const _vgsl_045b447d__FIELD_PEAK:f32=0.45;const _vgsl_045b447d__DUST_CELLS:f32=151.0;const _vgsl_045b447d__DUST_FILL:f32=0.75;const _vgsl_045b447d__DUST_RADIUS:f32=0.00040;const _vgsl_045b447d__DUST_PEAK:f32=0.22;const _vgsl_045b447d__COUNT_SLOPE:f32=2.0;const _vgsl_045b447d__STAR_FLUX_AREA:f32=0.5385;const _vgsl_045b447d__MAX_PREFILTER_PIXELS:f32=4.0;const _vgsl_045b447d__STAR_WARM:vec3f=vec3f(1.1741,0.9745,0.7397);const _vgsl_045b447d__STAR_COOL:vec3f=vec3f(0.8954,1.0131,1.1781);struct _vgsl_045b447d__StarLook{brightness:f32,density:f32,contrast:f32,warmth:f32,twinkle:f32,}fn J(a:vec3f)-> vec3f{let c=abs(a);if(c.x>=c.y&&c.x>=c.z){return vec3f(a.yz/c.x,select(1.0,0.0,a.x>0.0));}if(c.y>=c.z){return vec3f(a.xz/c.y,select(3.0,2.0,a.y>0.0));}return vec3f(a.xy/c.z,select(5.0,4.0,a.z>0.0));}fn K(a:vec3f,c:i32)-> vec2f{if(c==0){return a.yz/abs(a.x);}if(c==1){return a.xz/abs(a.y);}return a.xy/abs(a.z);}struct _vgsl_045b447d__SkyFilter{inverseJacobian:mat2x2f,pixelsPerFace:f32,faceMajor:f32,}fn L(a:vec3f,c:i32,d:vec3f,f:vec3f)-> _vgsl_045b447d__SkyFilter{let g=K(a,c);let i=K(a+d,c)-g;let n=K(a+f,c)-g;let p=i.x*n.y-i.y*n.x;let r=select(p,1.0e-24,abs(p)<1.0e-24);let s=mat2x2f(vec2f(n.y,-i.y),vec2f(-n.x,i.x))*(1.0/r);var u:_vgsl_045b447d__SkyFilter;u.inverseJacobian=s;u.pixelsPerFace=1.0/sqrt(max(abs(p),1.0e-24));u.faceMajor=max(length(i),length(n));return u;}struct _vgsl_045b447d__SkyState{brightness:f32,rangePower:f32,meanFlux:f32,warmth:f32,twinkle:f32,time:f32,fillScale:f32,radiusScale:f32,}fn M(a:_vgsl_045b447d__StarLook,c:vec2f,time:f32)-> _vgsl_045b447d__SkyState{let d=clamp(a.contrast,1.0,512.0);let rangePower=d*d;let f=1.0+dot(c,c);let g=sqrt(f);var i:_vgsl_045b447d__SkyState;i.brightness=max(0.0,a.brightness)*_vgsl_045b447d__STAR_INTENSITY;i.rangePower=rangePower;i.meanFlux=_vgsl_045b447d__COUNT_SLOPE/(d+_vgsl_045b447d__COUNT_SLOPE-1.0);i.warmth=clamp(a.warmth,0.0,1.0);i.twinkle=clamp(a.twinkle,0.0,1.0);i.time=time;i.fillScale=max(0.0,a.density)/(f*g);i.radiusScale=sqrt(f*g);return i;}struct _vgsl_045b447d__Species{cells:f32,fill:f32,peak:f32,faceRadius:f32,radiusPixels:f32,gain:f32,}fn N(cells:f32,fill:f32,peak:f32,a:f32,c:_vgsl_045b447d__SkyState,d:_vgsl_045b447d__SkyFilter,)-> _vgsl_045b447d__Species{let faceRadius=a*c.radiusScale;let f=faceRadius*d.pixelsPerFace;var g:_vgsl_045b447d__Species;g.cells=cells;g.fill=clamp(fill*c.fillScale,0.0,1.0);g.peak=peak*c.brightness;g.faceRadius=faceRadius;g.radiusPixels=clamp(f,1.0,_vgsl_045b447d__MAX_PREFILTER_PIXELS);g.gain=min(1.0,f*f);return g;}fn O(a:vec2f,c:vec2f,d:i32,f:i32,g:_vgsl_045b447d__Species,i:_vgsl_045b447d__SkyState,n:_vgsl_045b447d__SkyFilter,)-> vec3f{let p=R(bitcast<vec3u>(vec3i(vec2i(a),d*131+f)));let r=S(p.x);if(r> g.fill){return vec3f(0.0);}let s=vec2f(S(p.y),S(p.z))-vec2f(0.5);let u=a+vec2f(0.5)+s*0.8;let v=n.inverseJacobian*((c-u)/g.cells);let w=1.0-smoothstep(0.0,g.radiusPixels,length(v));let T=r/max(g.fill,1.0e-6);let U=inverseSqrt(1.0+T*(i.rangePower-1.0));let V=mix(vec3f(1.0),mix(_vgsl_045b447d__STAR_WARM,_vgsl_045b447d__STAR_COOL,S(p.y^p.z)),i.warmth);let W=S(p.y)*6.2831853;let X=1.0+i.twinkle*0.06*sin(i.time*(0.35+S(p.z)*0.4)+W);return V*(w*w*g.peak*U*X*g.gain);}fn P(a:vec3f,c:i32,d:_vgsl_045b447d__Species,f:_vgsl_045b447d__SkyState,g:_vgsl_045b447d__SkyFilter,)-> vec3f{let i=i32(a.z);let n=a.xy*d.cells;let p=O(floor(n),n,i,c,d,f,g);let r=d.faceRadius*d.cells;let s=d.peak*f.meanFlux*d.fill*_vgsl_045b447d__STAR_FLUX_AREA*r*r;let u=mix(vec3f(1.0),0.5*(_vgsl_045b447d__STAR_WARM+_vgsl_045b447d__STAR_COOL),f.warmth);let v=d.cells*g.faceMajor;return mix(p,u*s,smoothstep(1.0,3.0,v));}fn Q(a:vec3f,c:_vgsl_045b447d__StarLook,d:f32,f:vec3f,g:vec3f)-> vec3f{let i=normalize(a);let n=J(i);let p=L(i,i32(n.z)/2,f,g);let r=M(c,n.xy,d);return P(n,17,N(_vgsl_045b447d__ANCHOR_CELLS,_vgsl_045b447d__ANCHOR_FILL,_vgsl_045b447d__ANCHOR_PEAK,_vgsl_045b447d__ANCHOR_RADIUS,r,p),r,p,)+P(n,71,N(_vgsl_045b447d__FIELD_CELLS,_vgsl_045b447d__FIELD_FILL,_vgsl_045b447d__FIELD_PEAK,_vgsl_045b447d__FIELD_RADIUS,r,p),r,p,)+P(n,149,N(_vgsl_045b447d__DUST_CELLS,_vgsl_045b447d__DUST_FILL,_vgsl_045b447d__DUST_PEAK,_vgsl_045b447d__DUST_RADIUS,r,p),r,p,);}fn R(a:vec3u)-> vec3u{var c=a*1664525u+1013904223u;c.x=c.x+c.y*c.z;c.y=c.y+c.z*c.x;c.z=c.z+c.x*c.y;c=c^(c>> vec3u(16u));c.x=c.x+c.y*c.z;c.y=c.y+c.z*c.x;c.z=c.z+c.x*c.y;c=c^(c>> vec3u(16u));return c;}fn S(a:u32)-> f32{return f32(a>>8u)*(1.0/16777216.0);}\",functionExports:[{name:\"decodeGBuffer\",resolvedName:\"C\",parameterNames:[\"hit1\",\"hit2\",\"sky\",\"view\",\"diskOuter\",\"aa\",\"aaGeom\"]},{name:\"sampleAtRadius\",resolvedName:\"D\",parameterNames:[\"g\",\"radius\",\"diskOuter\"]},{name:\"shadeDisk\",resolvedName:\"I\",parameterNames:[\"g\",\"look\",\"time\",\"footprint\",\"noiseTex\",\"noiseSampler\"]},{name:\"shadeStars\",resolvedName:\"Q\",parameterNames:[\"direction\",\"look\",\"time\",\"ddx\",\"ddy\"]},{name:\"pcg3d\",resolvedName:\"R\",parameterNames:[\"value\"]},{name:\"unitFloat\",resolvedName:\"S\",parameterNames:[\"hash\"]}]},Lu=[\"rg32float\",\"rg32float\",\"rgba16float\",\"rgba16float\"],Du=[\"rg8unorm\",\"rgba16float\"],de=[0,0,0,1];function Uu(e,t){const n=e.sampler(t,{minFilter:\"linear\",magFilter:\"linear\"}),r=Ru(e,t);return{bake:e.effect(t,F,{label:\"optimized-black-hole-bake\"}),refine:e.effect(t,Cu,{label:\"optimized-black-hole-refine\"}),shade:e.effect(t,Fu,{label:\"optimized-black-hole-shade\"}),bloomExtract:e.effect(t,L),bloomBlurH0:e.effect(t,L),bloomBlurV0:e.effect(t,L),bloomDown1:e.effect(t,L),bloomBlurH1:e.effect(t,L),bloomBlurV1:e.effect(t,L),bloomDown2:e.effect(t,L),bloomBlurH2:e.effect(t,L),bloomBlurV2:e.effect(t,L),composite:e.effect(t,gr),postSampler:n,noiseSampler:r,noiseVolume:Au(t,Ts)}}function As(e,t,n){const r=Vu(n),i=li(r,2),s=li(r,4),o=li(r,8),a=f=>e.target(t,{size:f,colors:[{format:\"rgba16float\"}]}),c=[],u=f=>(c.push(f),f);try{return{gbuffer:u(e.target(t,{size:r,colors:Lu.map(f=>({format:f}))})),aa:u(e.target(t,{size:r,colors:Du.map(f=>({format:f}))})),scene:u(a(r)),bloom0:u(a(i)),bloomPing0:u(a(i)),bloom1:u(a(s)),bloomPing1:u(a(s)),bloom2:u(a(o)),bloomPing2:u(a(o))}}catch(f){try{Cs(c.reverse())}catch{}throw f}}function Rs(e){Cs([e.gbuffer,e.aa,e.scene,e.bloom0,e.bloomPing0,e.bloom1,e.bloomPing1,e.bloom2,e.bloomPing2])}function Cs(e){let t=!1,n;for(const r of e)try{Mu(r)}catch(i){t||(n=i),t=!0}if(t)throw n}function Mu(e){var t;(t=e==null?void 0:e.destroy)==null||t.call(e)}function Fs(e,t){const[n,r,i,s]=t.gbuffer.colors,[o,a]=t.aa.colors;e.bake.set({bake:{resolution:t.gbuffer.size}}),e.refine.set({gHit1:n,gSky:i,refine:{resolution:t.gbuffer.size}}),e.shade.set({gHit1:n,gHit2:r,gSky:i,gView:s,gAa:o,gAaGeom:a,noiseVolume:e.noiseVolume,noiseSampler:e.noiseSampler,shade:{resolution:t.gbuffer.size}});const c=t.scene.colors[0],u=t.bloom0.colors[0],f=t.bloomPing0.colors[0],d=t.bloom1.colors[0],h=t.bloomPing1.colors[0],g=t.bloom2.colors[0],b=t.bloomPing2.colors[0];e.bloomExtract.set({source:c,linearSampler:e.postSampler}),e.bloomBlurH0.set({source:u,linearSampler:e.postSampler}),e.bloomBlurV0.set({source:f,linearSampler:e.postSampler}),e.bloomDown1.set({source:u,linearSampler:e.postSampler}),e.bloomBlurH1.set({source:d,linearSampler:e.postSampler}),e.bloomBlurV1.set({source:h,linearSampler:e.postSampler}),e.bloomDown2.set({source:d,linearSampler:e.postSampler}),e.bloomBlurH2.set({source:g,linearSampler:e.postSampler}),e.bloomBlurV2.set({source:b,linearSampler:e.postSampler}),e.composite.set({scene:c,bloomNear:u,bloomMedium:d,bloomFar:g,linearSampler:e.postSampler})}function Ls(e,t,n){const r={resolution:t.gbuffer.size,yaw:0,pitch:n.cameraY,orbitRadius:n.distance,diskOuter:n.diskRadius,fov:n.fov,centerX:n.centerX,centerY:n.centerY,roll:n.cameraRoll};e.bake.set({bake:r}),e.refine.set({refine:r})}function Ds(e,t,n,r,i){e.shade.set({shade:{resolution:t.gbuffer.size,time:r,diskOuter:n.diskRadius,sceneYaw:i,centerFade:n.centerFade},disk:n.disk,stars:n.stars})}function Us(e,t,n){const r=Math.max(0,n.bloom.threshold),i=Math.max(1e-4,n.bloom.knee),s=Math.max(.1,n.bloom.radius),o=(c,u)=>({sourceSize:c,direction:[0,0],params:[u?r:-1,i,s,0]}),a=(c,u,f)=>({sourceSize:c,direction:[u,f],params:[-1,i,s,1]});e.bloomExtract.set({bloom:o(t.scene.size,!0)}),e.bloomBlurH0.set({bloom:a(t.bloom0.size,1,0)}),e.bloomBlurV0.set({bloom:a(t.bloomPing0.size,0,1)}),e.bloomDown1.set({bloom:o(t.bloom0.size,!1)}),e.bloomBlurH1.set({bloom:a(t.bloom1.size,1,0)}),e.bloomBlurV1.set({bloom:a(t.bloomPing1.size,0,1)}),e.bloomDown2.set({bloom:o(t.bloom1.size,!1)}),e.bloomBlurH2.set({bloom:a(t.bloom2.size,1,0)}),e.bloomBlurV2.set({bloom:a(t.bloomPing2.size,0,1)}),e.composite.set({composite:{params:[Math.max(0,n.bloom.strength),0,0,0]}})}async function Gu(e,t,n){const r={colors:[t.bloom0.format]};await Promise.all([e.bake.compile(t.gbuffer),e.refine.compile(t.aa),e.shade.compile(t.scene),e.bloomExtract.compile(r),e.bloomBlurH0.compile(r),e.bloomBlurV0.compile(r),e.bloomDown1.compile(r),e.bloomBlurH1.compile(r),e.bloomBlurV1.compile(r),e.bloomDown2.compile(r),e.bloomBlurH2.compile(r),e.bloomBlurV2.compile(r),e.composite.compile({colors:[n.format]})])}function Ou(e,t,n,r,i){i&&(e.pass({target:n.gbuffer,clear:de},s=>s.draw(t.bake)),e.pass({target:n.aa,clear:de},s=>s.draw(t.refine))),e.pass({target:n.scene,clear:de},s=>s.draw(t.shade)),e.pass({target:n.bloom0,clear:de},s=>s.draw(t.bloomExtract)),e.pass({target:n.bloomPing0,clear:de},s=>s.draw(t.bloomBlurH0)),e.pass({target:n.bloom0,clear:de},s=>s.draw(t.bloomBlurV0)),e.pass({target:n.bloom1,clear:de},s=>s.draw(t.bloomDown1)),e.pass({target:n.bloomPing1,clear:de},s=>s.draw(t.bloomBlurH1)),e.pass({target:n.bloom1,clear:de},s=>s.draw(t.bloomBlurV1)),e.pass({target:n.bloom2,clear:de},s=>s.draw(t.bloomDown2)),e.pass({target:n.bloomPing2,clear:de},s=>s.draw(t.bloomBlurH2)),e.pass({target:n.bloom2,clear:de},s=>s.draw(t.bloomBlurV2)),e.pass({target:r,clear:de},s=>s.draw(t.composite))}function Vu(e){return[Math.max(1,Math.floor(e[0])),Math.max(1,Math.floor(e[1]))]}function li(e,t){return[Math.max(1,Math.floor(e[0]/t)),Math.max(1,Math.floor(e[1]/t))]}function Nu(){return{cameraY:.16,distance:13.5,diskRadius:9,fov:3,centerX:.8,centerY:.3,cameraRoll:-.27,mouseYaw:.15,centerFade:0,bloom:{strength:1,threshold:0,knee:.18,radius:1.5},disk:{brightness:.75,speed:.75,stretch:5.75,detail:3.44,turbulence:4.46,density:1.38,doppler:1.21,cloudScale:20,cloudSpeed:.3,cloudStrength:.2,spare0:.43,spare1:-.25,spare2:-.67,spare3:.69},stars:{brightness:1,density:1,contrast:13,warmth:.5,twinkle:0}}}const Bu=.325,zu=.1,qu=1e3/60-2,ju=\"(max-width: 767px)\";function Wu({canvas:e,onError:t}){const n=Nu(),r={centerX:n.centerX,centerY:n.centerY,cameraRoll:n.cameraRoll,mouseYaw:n.mouseYaw,centerFade:n.centerFade},i=window.matchMedia(ju),s=window.matchMedia(\"(prefers-reduced-motion: reduce)\"),o=()=>{Object.assign(n,i.matches?{centerX:0,centerY:0,cameraRoll:0,mouseYaw:0,centerFade:1}:r)};o();const a=Math.min(Math.max(window.devicePixelRatio,1),2)/2;n.bloom.radius*=a,n.bloom.strength*=a;let c=!1,u,f,d,h,g,b,v,E,k=typeof document>\"u\"?!0:!document.hidden,I=!0,R=!1,H=0,te,X=0,z,ve=!0,pt=0,_e=0,p;const S=()=>{o(),ve=!0,We()};i.addEventListener(\"change\",S);const $=()=>{V(),ie(),We()};s.addEventListener(\"change\",$);const P=A=>{if(A.pointerType!==\"mouse\")return;const fe=Math.max(window.innerWidth,1);pt=Math.min(1,Math.max(-1,A.clientX/fe*2-1))},V=()=>{pt=0},ne=A=>{A.relatedTarget===null&&V()},q=()=>{document.hidden&&V(),k=!document.hidden,ie()};function ie(){if(!R||!f||!u)return;const A=!c&&k&&I&&!s.matches;A!==!!b&&(A?(te=void 0,p=void 0,b=pb(u,f)):(b==null||b.stop(),b=void 0))}function We(){if(!c&&R&&f&&u&&s.matches)try{u.frame(f,Oc)}catch(A){ni(A)}}function pb(A,fe){let re=!1,gt;const fr=zc=>{if(!re){if(gt===void 0||zc-gt>=qu){gt=zc;try{A.frame(fe,Oc)}catch(vb){ni(vb)}}re||(Bc=requestAnimationFrame(fr))}};let Bc=requestAnimationFrame(fr);return{stop(){re=!0,cancelAnimationFrame(Bc)}}}const gb=A=>(H+=te===void 0?0:Math.max(0,(A-te)/1e3),te=A,H),Oc=A=>{if(c||!h||!g||!d)return;const fe=Hu(),re=ve;ve=!1,re&&Ls(h,g,n),Ds(h,g,n,gb(fe),bb(fe)),Ou(A,h,g,d,re)},bb=A=>{if(n.mouseYaw<=0)return _e=0,p=A,0;const fe=p===void 0?0:Math.min(Math.max((A-p)/1e3,0),zu);p=A;const re=pt*Math.max(0,n.mouseYaw);return _e+=(re-_e)*(1-Math.exp(-fe/Bu)),_e},yb=()=>{X=0;const A=z;if(z=void 0,!(c||!A||!f||!u||!h||!g||!d))try{const fe=g,re=As(u,f,[Math.max(1,Math.round(A.width)),Math.max(1,Math.round(A.height))]);try{Fs(h,re),Us(h,re,n)}catch(gt){throw Rs(re),gt}g=re,Rs(fe),ve=!0,We()}catch(fe){ni(fe)}},wb=A=>{c||A.width<=0||A.height<=0||(z=A,X||(X=requestAnimationFrame(yb)))},Vc=()=>{wb({width:e.clientWidth,height:e.clientHeight})},Nc=()=>{c||(c=!0,b==null||b.stop(),X&&cancelAnimationFrame(X),v==null||v.disconnect(),E==null||E.disconnect(),typeof window<\"u\"&&(i.removeEventListener(\"change\",S),s.removeEventListener(\"change\",$),window.removeEventListener(\"pointermove\",P),window.removeEventListener(\"pointerout\",ne),window.removeEventListener(\"blur\",V),document.removeEventListener(\"visibilitychange\",q)),f==null||f.dispose())},xb=async()=>{const A=await Promise.resolve().then(()=>mb),{init:fe}=A;if(c)return;const re=await fe();if(c){re.dispose();return}f=re,u=A,d=A.surface(f,e,{dpr:1}),h=Uu(A,f),g=As(A,f,d.size),Ls(h,g,n),Ds(h,g,n,H,_e),Fs(h,g),Us(h,g,n),await Gu(h,g,d),!c&&(v=typeof ResizeObserver>\"u\"?void 0:new ResizeObserver(Vc),v==null||v.observe(e),window.addEventListener(\"pointermove\",P,{passive:!0}),window.addEventListener(\"pointerout\",ne,{passive:!0}),window.addEventListener(\"blur\",V),document.addEventListener(\"visibilitychange\",q),typeof IntersectionObserver<\"u\"&&(E=new IntersectionObserver(gt=>{var fr;I=((fr=gt[gt.length-1])==null?void 0:fr.isIntersecting)??I,ie()},{threshold:0}),E.observe(e)),Vc(),R=!0,k=!document.hidden,ie(),We())};function ni(A){Nc(),t==null||t(A)}return{ready:xb().catch(A=>{if(!c)throw ni(A),A}),dispose:Nc}}function Hu(){return typeof performance>\"u\"?Date.now():performance.now()}const Ku='.bh30-background{position:absolute;inset:0;overflow:hidden;pointer-events:none;background:#000;opacity:0;transition:opacity .5s ease;isolation:isolate}.bh30-background[data-ready=\"true\"]{opacity:1}.bh30-background canvas{display:block;width:100%;height:100%;pointer-events:none}.bh30-background:after{content:\"\";position:absolute;inset:0;pointer-events:none;background:linear-gradient(90deg,rgba(0,6,18,.30),rgba(0,6,18,.07) 55%,transparent 80%)}@media(prefers-reduced-motion:reduce){.bh30-background{transition:none}}';function Ms(e,t={}){const n=document.createElement(\"style\");n.setAttribute(\"data-bh30-style\",\"\"),n.textContent=Ku;const r=document.createElement(\"div\");r.className=\"bh30-background\",r.setAttribute(\"aria-hidden\",\"true\"),r.dataset.ready=\"false\";const i=document.createElement(\"canvas\");r.append(i),e.append(n,r);let s=!1,o=!1;const a=f=>{var d;o=!0,r.dataset.ready=\"false\",r.dataset.state=\"fallback\",(d=t.onError)==null||d.call(t,f)},c=Wu({canvas:i,onError:a});return{ready:c.ready.then(()=>{var f;return s||o?!1:(r.dataset.ready=\"true\",r.dataset.state=\"ready\",(f=t.onReady)==null||f.call(t),!0)}).catch(f=>(o||a(f),!1)),element:r,dispose(){s||(s=!0,c.dispose(),r.remove(),n.remove())}}}const Xu=`\n[data-bh30-native-hero]{isolation:isolate!important}\n[data-bh30-native-hero]>.bh30-background{z-index:-1}\n[data-bh30-native-position]{position:relative!important}\n[data-bh30-native-hero][data-bh30-native-ready=\"true\"]>video[data-bh30-original-video]{visibility:hidden!important}\n`,Gs=e=>String(e||\"\").replace(/\\s+/g,\" \").trim();function Yu(e){const t=new Set;for(const n of e.querySelectorAll(\"h1\")){if(Gs(n.textContent)!==\"잠재력을 깨우는 기술,\")continue;let r=n.parentElement;for(let i=0;r&&i<9;i++,r=r.parentElement)if(Array.from(r.children).some(s=>s.tagName===\"VIDEO\")){if(!Array.from(r.querySelectorAll(\"h1\")).some(s=>Gs(s.textContent).includes(\"이 함께합니다.\")))break;r.getClientRects().length&&r.getBoundingClientRect().width>0&&t.add(r);break}}return t}function Os(e=document){const t=e.createElement(\"style\");t.dataset.bh30NativeStyle=\"\",t.textContent=Xu,e.head.append(t);const n=new Map;let r=!1,i=0;const s=u=>{const f=Array.from(u.children).filter(I=>I.tagName===\"VIDEO\"),d=[],h=(I,R,H)=>{d.push([I,R,I.getAttribute(R)]),I.setAttribute(R,H)};h(u,\"data-bh30-native-hero\",\"\"),h(u,\"data-bh30-native-ready\",\"false\"),getComputedStyle(u).position===\"static\"&&h(u,\"data-bh30-native-position\",\"\"),f.forEach(I=>h(I,\"data-bh30-original-video\",\"\"));const g=f.map(I=>({video:I,wasPaused:I.paused}));let b=!1,v=!1;const E=()=>{b&&(b=!1,g.forEach(({video:I,wasPaused:R})=>{!R&&I.isConnected&&I.play().catch(()=>{})}))},k=Ms(u,{onReady(){v||(u.setAttribute(\"data-bh30-native-ready\",\"true\"),b=!0,f.forEach(I=>I.pause()))},onError(){v||(u.setAttribute(\"data-bh30-native-ready\",\"false\"),E())}});return()=>{v||(v=!0,k.dispose(),E(),d.reverse().forEach(([I,R,H])=>H===null?I.removeAttribute(R):I.setAttribute(R,H)))}},o=()=>{if(i=0,r)return;const u=Yu(e);for(const[f,d]of n)u.has(f)||(d(),n.delete(f));for(const f of u)n.has(f)||n.set(f,s(f))},a=()=>{!r&&!i&&(i=requestAnimationFrame(o))},c=new MutationObserver(a);return c.observe(e.body,{childList:!0,subtree:!0}),window.addEventListener(\"resize\",a,{passive:!0}),o(),{dispose(){if(!r){r=!0,c.disconnect(),cancelAnimationFrame(i),window.removeEventListener(\"resize\",a);for(const u of n.values())u();n.clear(),t.remove()}}}}/*! VGPU optimized black hole — Copyright (c) 2025 Vercel, Inc. MIT license. */const Vs=()=>{var t;const e=window;(t=e.__brainableBlackHole30)==null||t.dispose(),e.__brainableBlackHole30=Os(document)};document.readyState===\"loading\"?document.addEventListener(\"DOMContentLoaded\",Vs,{once:!0}):Vs();let fi=class extends Error{constructor(n){super(n.message,{cause:n.cause});m(this,\"code\");m(this,\"severity\");m(this,\"fix\");m(this,\"where\");m(this,\"cause\");m(this,\"detail\");this.name=\"VGPUError\",this.code=n.code,this.severity=n.severity??\"error\",this.fix=n.fix,this.where=n.where,this.cause=n.cause,this.detail=n.detail}};class J extends fi{constructor(t){super({...t,severity:\"error\"}),this.name=\"ValidationError\"}}function Qu(e){return new fi({code:\"VGPU-FEATURE-UNSUPPORTED\",message:`Adapter does not support requested feature(s): ${e.map(t=>`\"${t}\"`).join(\", \")}.`,fix:\"Remove the unsupported name(s) from init({ requiredFeatures: [...] }) or run on an adapter that supports them; gate optional code paths on device.features after init.\",where:\"init\"})}function Zu(e,t){if(!e)return;const n=(t??[]).filter(r=>!e.has(r));if(n.length)throw Qu(n)}const Ju={map_read:1,map_write:2,copy_src:4,copy_dst:8,index:16,vertex:32,uniform:64,storage:128,indirect:256,query_resolve:512};function Dn(e){const t=globalThis.GPUBufferUsage;return e.reduce((n,r)=>n|el(r,t),0)}function el(e,t){const n=e.toUpperCase();return(t==null?void 0:t[n])??Ju[e]}function Ns(){var e;return((e=globalThis.GPUMapMode)==null?void 0:e.READ)??1}const tl={copy_src:1,copy_dst:2,texture_binding:4,storage_binding:8,render_attachment:16};function Bs(e){const t=globalThis.GPUTextureUsage;return e.reduce((n,r)=>n|nl(r,t),0)}function nl(e,t){const n=e.toUpperCase();return(t==null?void 0:t[n])??tl[e]}function zs(e){return\"__vgpuMockBytes\"in e}function qs(e){return\"__vgpuMockBytes\"in e}let rl=1;function yr(e){return Object.freeze({kind:e,id:rl++})}class wr{constructor(){m(this,\"callbacks\",new Set);m(this,\"destroyed\",!1)}onDestroy(t,n){return this.destroyed?(n(t),()=>{}):(this.callbacks.add(n),()=>{this.callbacks.delete(n)})}emit(t){if(this.destroyed)return!1;this.destroyed=!0;const n=[...this.callbacks];this.callbacks.clear();const r=[];for(const i of n)try{i(t)}catch(s){r.push(s)}if(r.length)throw r[0];return!0}}class Se{constructor(t,n,r,i=\"owned\"){w(this,It);m(this,\"device\");m(this,\"gpu\");m(this,\"options\");m(this,\"ownership\");m(this,\"destroySignal\",new wr);m(this,\"identity\",yr(\"buffer\"));m(this,\"destroyed\",!1);this.device=t,this.gpu=n,this.options=r,this.ownership=i,Object.defineProperty(this,\"assertUsable\",{value:s=>y(this,It,dr).call(this,s)})}get resourceIdentity(){return this.identity}onDestroy(t){return this.destroySignal.onDestroy(this,t)}write(t,n=0){y(this,It,dr).call(this,\"Buffer.write\"),this.ownership===\"external\"&&this.validateExternalOperation(\"write\",n,t.byteLength,\"copy_dst\");try{this.device.queue.writeBuffer(this.gpu,n,t)}catch(r){throw this.ownership!==\"external\"?r:xr(\"Buffer.write\",\"The external GPUBuffer rejected the write operation.\",r)}}async read(t,n=0){y(this,It,dr).call(this,\"Buffer.read\"),this.ownership===\"external\"&&this.validateExternalOperation(\"read\",n,t,\"copy_src\");try{const r=await this.device.readback.read(this.gpu,t,n);return y(this,It,dr).call(this,\"Buffer.read\"),r}catch(r){throw r instanceof J||this.ownership!==\"external\"?r:xr(\"Buffer.read\",\"The external GPUBuffer rejected the read operation.\",r)}}destroy(){this.destroyed||(this.destroyed=!0,this.destroySignal.emit(this),this.ownership===\"owned\"&&!zs(this.gpu)&&this.gpu.destroy())}dispose(){this.destroy()}validateExternalOperation(t,n,r,i){if(!(Number.isSafeInteger(n)&&n>=0&&n%4===0&&Number.isSafeInteger(r)&&r>=0&&r%4===0&&n<=this.options.size&&r<=this.options.size-n))throw xr(`Buffer.${t}`,\"External buffer offsets and lengths must be non-negative, 4-byte aligned, and within the buffer size.\");if((this.gpu.usage&Dn([i]))===0)throw xr(`Buffer.${t}`,`External buffer is missing ${i.toUpperCase()} usage.`)}}It=new WeakSet,dr=function(t=\"Buffer\"){if(this.destroyed)throw new J({code:\"VGPU-BUFFER-DISPOSED\",message:\"Buffer is destroyed.\",where:t,fix:\"Wrap or create a live GPUBuffer before using it.\"});this.device.assertUsable(t)};function xr(e,t,n){return new J({code:\"VGPU-EXTERNAL-BUFFER-VALIDATION\",message:t,where:e,cause:n,fix:\"Use a buffer with the required usage flags and an aligned in-range operation.\"})}function il(e){if(al(e))throw cl();const t={version:1,mappings:[]},n={version:1,modules:[{path:\"<runtime>\",text:e}],diagnostics:[],sourceMap:t,cacheKey:sl(e)};return{kind:\"wgsl\",wgsl:e,source:{text:e,path:\"<runtime>\",imports:[]},ast:n,sourceMap:t,diagnostics:[],cacheKey:n.cacheKey,entryPoints:ol(e),stats:{lines:e.split(/\\r?\\n/).length,bytes:new TextEncoder().encode(e).byteLength,bindGroups:0}}}function sl(e){let t=2166136261;for(let n=0;n<e.length;n++)t=Math.imul(t^e.charCodeAt(n),16777619);return{default:`vgpu-wgsl-1:${(t>>>0).toString(16).padStart(8,\"0\")}`}}function ol(e){const t=[],n=/@(vertex|fragment|compute)\\s+fn\\s+([A-Za-z_][A-Za-z0-9_]*)/g;for(const r of e.matchAll(n))t.push(r[2]);return t}function al(e){const t=e.replace(/\\/\\*[\\s\\S]*?\\*\\//g,\"\").replace(/\\/\\/.*$/gm,\"\").trimStart();return t.startsWith(\"import \")||t.startsWith(\"import{\")}function cl(){const e=new Error(\"Runtime WGSL strings cannot contain import statements. Use a build-time loader or @vgpu/wgsl/runtime.\");return e.name=\"VGPUWGSLRuntimeImportError\",e.code=\"VGPU-WGSL-RUNTIME-IMPORT\",e.severity=\"error\",e.source=\"wgsl\",e}const ul=new Set([\"alias\",\"break\",\"case\",\"const\",\"const_assert\",\"continue\",\"continuing\",\"default\",\"diagnostic\",\"discard\",\"else\",\"enable\",\"false\",\"fn\",\"for\",\"if\",\"let\",\"loop\",\"override\",\"requires\",\"return\",\"struct\",\"switch\",\"true\",\"var\",\"while\"]),ll=new Set([\"import\",\"export\",\"from\",\"as\"]),js=new Set([...ul,...ll]),fl=new Set([\"NULL\",\"Self\",\"abstract\",\"active\",\"alignas\",\"alignof\",\"as\",\"asm\",\"asm_fragment\",\"async\",\"attribute\",\"auto\",\"await\",\"become\",\"cast\",\"catch\",\"class\",\"co_await\",\"co_return\",\"co_yield\",\"coherent\",\"column_major\",\"common\",\"compile\",\"compile_fragment\",\"concept\",\"const_cast\",\"consteval\",\"constexpr\",\"constinit\",\"crate\",\"debugger\",\"decltype\",\"delete\",\"demote\",\"demote_to_helper\",\"do\",\"dynamic_cast\",\"enum\",\"explicit\",\"export\",\"extends\",\"extern\",\"external\",\"fallthrough\",\"filter\",\"final\",\"finally\",\"friend\",\"from\",\"fxgroup\",\"get\",\"goto\",\"groupshared\",\"highp\",\"impl\",\"implements\",\"import\",\"inline\",\"instanceof\",\"interface\",\"layout\",\"lowp\",\"macro\",\"macro_rules\",\"match\",\"mediump\",\"meta\",\"mod\",\"module\",\"move\",\"mut\",\"mutable\",\"namespace\",\"new\",\"nil\",\"noexcept\",\"noinline\",\"nointerpolation\",\"non_coherent\",\"noncoherent\",\"noperspective\",\"null\",\"nullptr\",\"of\",\"operator\",\"package\",\"packoffset\",\"partition\",\"pass\",\"patch\",\"pixelfragment\",\"precise\",\"precision\",\"premerge\",\"priv\",\"protected\",\"pub\",\"public\",\"readonly\",\"ref\",\"regardless\",\"register\",\"reinterpret_cast\",\"require\",\"resource\",\"restrict\",\"self\",\"set\",\"shared\",\"sizeof\",\"smooth\",\"snorm\",\"static\",\"static_assert\",\"static_cast\",\"std\",\"subroutine\",\"super\",\"target\",\"template\",\"this\",\"thread_local\",\"throw\",\"trait\",\"try\",\"type\",\"typedef\",\"typeid\",\"typename\",\"typeof\",\"union\",\"unless\",\"unorm\",\"unsafe\",\"unsized\",\"use\",\"using\",\"varying\",\"virtual\",\"volatile\",\"wgsl\",\"where\",\"with\",\"writeonly\",\"yield\"]),dl=new Set([\"binding_array\"]);function hl(e){return/^[A-Za-z_][A-Za-z0-9_]*$/u.test(e)&&e!==\"_\"&&!e.startsWith(\"__\")&&!js.has(e)&&!fl.has(e)&&!dl.has(e)}function ml(e){if(typeof e!=\"object\"||e===null)return!1;try{const{name:t,resolvedName:n,parameterNames:r}=e;return di(t)&&di(n)&&pl(r)}catch{return!1}}function di(e){return typeof e==\"string\"&&hl(e)}function pl(e){if(!Array.isArray(e))return!1;const t=new Set;for(let n=0;n<e.length;n++){const r=e[n];if(!di(r)||t.has(r))return!1;t.add(r)}return!0}function gl(e,t){const n=2**t;return[Math.max(1,Math.floor(e.width/n)),Math.max(1,Math.floor(e.height/n)),e.dimension===\"3d\"?Math.max(1,Math.floor(e.depthOrArrayLayers/n)):e.depthOrArrayLayers]}function Ws(e,t,n){var a,c;const r=u=>{throw new J({code:\"VGPU-CORE-TEXTURE-READ-INVALID\",where:n,message:u,fix:'Select an allocated mip and an in-bounds region on a single-sample texture with usage \"copy_src\".'})};(!t||!Number.isSafeInteger(t.mipLevel)||t.mipLevel<0||t.mipLevel>=e.mipLevelCount)&&r(\"mipLevel must select an allocated mip using a nonnegative safe integer.\"),e.sampleCount!==1&&r(\"Texture readback requires sampleCount 1; resolve multisampled textures explicitly before reading.\"),e.usage&Bs([\"copy_src\"])||r('Texture readback requires explicit \"copy_src\" usage.');const i=gl(e,t.mipLevel),s=t.region===\"all\"?[0,0,0]:(a=t.region)==null?void 0:a.origin,o=t.region===\"all\"?i:(c=t.region)==null?void 0:c.size;(!Array.isArray(s)||s.length!==3||!Array.isArray(o)||o.length!==3)&&r('region must be \"all\" or contain origin and size triples.');for(let u=0;u<3;u++){const f=s[u],d=o[u];(!Number.isSafeInteger(f)||f<0||!Number.isSafeInteger(d)||d<=0||f>i[u]||d>i[u]-f)&&r(`Read region axis ${u} is outside mip ${t.mipLevel} extent [${i}].`)}return{mipLevel:t.mipLevel,origin:[...s],size:[...o],extent:i}}function Hs(e,t,n){const r=Math.min(t??4294967295,4294967295);if(!Number.isSafeInteger(e)||e<=0||e>r)throw new J({code:\"VGPU-CORE-TEXTURE-READ-INVALID\",where:n,message:`Readback allocation of ${e} bytes exceeds the supported limit (${r}).`,fix:\"Read a smaller region or a higher mip level.\"})}const Ks=Dn([\"copy_dst\",\"map_read\"]);class bl{constructor(t){m(this,\"device\");this.device=t}async read(t,n,r){if(zs(t))return t.__vgpuMockBytes.slice(r,r+n).buffer;const i=this.device.createBuffer({size:n,usage:Ks});try{const s=this.device.createCommandEncoder();s.copyBufferToBuffer(t,r,i,0,n),this.device.queue.submit([s.finish()]),await i.mapAsync(Ns());const o=i.getMappedRange().slice(0);return Xs(i),o}finally{Ys(i)}}async readTexture(t,n){var g,b;const r=hi(t.format,\"Readback.readTexture\"),i=Ws(t,n,\"Readback.readTexture\"),[s,o,a]=i.size,c=r.bytesPerPixel,u=yl(s*c,256),f=u*o*a;if(Hs(f,(g=this.device.limits)==null?void 0:g.maxBufferSize,\"Readback.readTexture\"),qs(t)){const v=((b=t.__vgpuMockMips)==null?void 0:b[i.mipLevel])??(i.mipLevel===0?t.__vgpuMockBytes:void 0);if(!v)throw new Error(\"Mock texture has no storage for the selected mip.\");return vl(v,i,r)}const d=this.device.createBuffer({size:f,usage:Ks});let h;try{const v=this.device.createCommandEncoder();v.copyTextureToBuffer({texture:t,mipLevel:i.mipLevel,origin:i.origin},{buffer:d,bytesPerRow:u,rowsPerImage:o},{width:s,height:o,depthOrArrayLayers:a}),this.device.queue.submit([v.finish()]),await d.mapAsync(Ns());const E=new Uint8Array(d.getMappedRange());h=new Uint8Array(s*o*a*c);for(let k=0;k<o*a;k++){const I=k*u,R=k*s*c;h.set(E.subarray(I,I+s*c),R)}Xs(d)}finally{Ys(d)}return r.swizzle===\"bgra-to-rgba\"&&Zs(h),h}destroy(){}}function Xs(e){try{e.unmap()}catch{}}function Ys(e){try{e.destroy()}catch{}}function yl(e,t){return Math.ceil(e/t)*t}const Qs={r8unorm:{bytesPerPixel:1,components:1,componentType:\"unorm8\"},rg8unorm:{bytesPerPixel:2,components:2,componentType:\"unorm8\"},rgba8unorm:{bytesPerPixel:4,components:4,componentType:\"unorm8\"},\"rgba8unorm-srgb\":{bytesPerPixel:4,components:4,componentType:\"unorm8\"},bgra8unorm:{bytesPerPixel:4,components:4,componentType:\"unorm8\",swizzle:\"bgra-to-rgba\"},\"bgra8unorm-srgb\":{bytesPerPixel:4,components:4,componentType:\"unorm8\",swizzle:\"bgra-to-rgba\"},r16float:{bytesPerPixel:2,components:1,componentType:\"float16\"},rg16float:{bytesPerPixel:4,components:2,componentType:\"float16\"},rgba16float:{bytesPerPixel:8,components:4,componentType:\"float16\"},r32float:{bytesPerPixel:4,components:1,componentType:\"float32\"},rg32float:{bytesPerPixel:8,components:2,componentType:\"float32\"},rgba32float:{bytesPerPixel:16,components:4,componentType:\"float32\"}};function hi(e,t){const n=Qs[e];if(n)return n;throw new J({code:\"VGPU-CORE-UNSUPPORTED-FORMAT\",message:`Texture.read does not support format ${e}. Supported formats: ${Object.keys(Qs).join(\", \")}.`,where:t})}function wl(e,t,n=\"Texture.readFloats\"){const r=hi(t,n),i=r.bytesPerPixel/r.components,s=Math.floor(e.byteLength/i),o=new Float32Array(s),a=new DataView(e.buffer,e.byteOffset,e.byteLength);for(let c=0;c<s;c++)r.componentType===\"unorm8\"?o[c]=a.getUint8(c)/255:r.componentType===\"float16\"?o[c]=xl(a.getUint16(c*2,!0)):o[c]=a.getFloat32(c*4,!0);return o}function xl(e){const t=e&32768?-1:1,n=e>>10&31,r=e&1023;return n===0?t*r*5960464477539063e-23:n===31?r===0?t*Number.POSITIVE_INFINITY:Number.NaN:t*(r+1024)*2**(n-25)}function vl(e,t,n){const{size:[r,i,s],origin:[o,a,c],extent:u}=t,f=r*n.bytesPerPixel,d=new Uint8Array(f*i*s);for(let h=0;h<s;h++)for(let g=0;g<i;g++){const b=(((c+h)*u[1]+a+g)*u[0]+o)*n.bytesPerPixel;d.set(e.subarray(b,b+f),(h*i+g)*f)}return n.swizzle===\"bgra-to-rgba\"&&Zs(d),d}function Zs(e){for(let t=0;t<e.length;t+=4){const n=e[t];e[t]=e[t+2],e[t+2]=n}}function _l(e){return{size:e,usage:Dn([\"copy_src\",\"copy_dst\"])}}class Sl{constructor(t,n=()=>{}){m(this,\"gpu\");m(this,\"guard\");this.gpu=t,this.guard=n}writeBuffer(t,n,r){this.guard(\"Queue.writeBuffer\"),this.gpu.writeBuffer(t,n,r)}async flush(){var t,n;this.guard(\"Queue.flush\"),await((n=(t=this.gpu).onSubmittedWorkDone)==null?void 0:n.call(t)),this.guard(\"Queue.flush\")}}class El{constructor(t,n){m(this,\"gpu\");m(this,\"resolved\");this.gpu=t,this.resolved=n}dispose(){}get kind(){return this.resolved.kind}get source(){return this.resolved.source}get code(){return this.resolved.wgsl}get entryPoints(){return this.resolved.entryPoints}get stats(){return this.resolved.stats}}const Il=new Set([\"copy_src\",\"copy_dst\",\"texture_binding\",\"storage_binding\",\"render_attachment\"]),kl=new Set([\"rgba8unorm\",\"rgba8snorm\",\"rgba8uint\",\"rgba8sint\",\"rgba16float\",\"rgba16uint\",\"rgba16sint\",\"rgba32float\",\"rgba32uint\",\"rgba32sint\",\"r32float\",\"r32uint\",\"r32sint\",\"rg32float\",\"rg32uint\",\"rg32sint\"]),$l=new Set([\"r8unorm\",\"r8snorm\",\"r8uint\",\"r8sint\",\"rg8unorm\",\"rg8snorm\",\"rg8uint\",\"rg8sint\",\"r16uint\",\"r16sint\",\"r16float\",\"rg16uint\",\"rg16sint\",\"rg16float\",\"rgb10a2uint\",\"rgb10a2unorm\",\"rg11b10ufloat\",\"r16unorm\",\"r16snorm\",\"rg16unorm\",\"rg16snorm\",\"rgba16unorm\",\"rgba16snorm\"]);function Js(e){return Object.freeze({...e,size:Object.freeze([...e.size]),usage:Object.freeze([...e.usage]),...e.viewFormats===void 0?{}:{viewFormats:Object.freeze([...e.viewFormats])}})}function eo(e){return[e.size[0],e.kind===\"1d\"?1:e.size[1],e.kind===\"2d-array\"?e.layers:e.kind===\"3d\"?e.size[2]:1]}function Tl(e,t){var d,h;const n=(g,b,v)=>{throw new J({code:g,message:b,fix:v,where:\"Device.createTexture\"})};(!e||![\"1d\",\"2d\",\"3d\",\"2d-array\"].includes(e.kind))&&n(\"VGPU-TEXTURE-KIND-REQUIRED\",\"Texture kind must be explicit.\",'Pass kind: \"1d\", \"2d\", \"3d\", or \"2d-array\".'),\"dimension\"in e&&n(\"VGPU-TEXTURE-KIND-REQUIRED\",\"Texture dimension has been replaced by kind.\",'Use kind and, for \"2d-array\", a separate layers count.');const r=e.kind===\"1d\"?1:e.kind===\"3d\"?3:2;(!Array.isArray(e.size)||e.size.length!==r||!Array.from(e.size).every(mi))&&n(\"VGPU-TEXTURE-SIZE-REQUIRED\",`Texture ${e.kind} needs ${r} positive integer spatial dimensions.`,\"Pass size with exactly the spatial dimensions of kind; put array layers in layers.\"),(e.kind===\"2d-array\"?!mi(e.layers):e.layers!==void 0)&&n(\"VGPU-TEXTURE-LAYERS-INVALID\",\"Only 2d-array textures take a positive integer layers count.\",'Use kind: \"2d-array\", size: [width, height], layers: count.'),(!Array.isArray(e.usage)||e.usage.length===0||!Array.from(e.usage).every(g=>Il.has(g)))&&n(\"VGPU-TEXTURE-USAGE-REQUIRED\",\"Texture usage must be a nonempty list of known capabilities.\",'Pass explicit usage, such as [\"texture_binding\", \"copy_dst\"]. No capabilities are added automatically.'),(typeof e.format!=\"string\"||!e.format)&&n(\"VGPU-TEXTURE-FORMAT-REQUIRED\",\"Texture format is required.\",'Pass an explicit GPUTextureFormat, such as \"rgba16float\".');const i=e.mipLevelCount??1,s=e.kind===\"1d\"?1:Math.floor(Math.log2(Math.max(...e.size)))+1;(!mi(i)||i>s)&&n(\"VGPU-TEXTURE-MIPS-INVALID\",`mipLevelCount must be between 1 and ${s}.`,\"Omit mipLevelCount for the base level, or request a valid allocation count. Contents are not generated automatically.\");const o=e.sampleCount??1;o!==1&&o!==4&&n(\"VGPU-TEXTURE-SAMPLES-INVALID\",\"sampleCount must be 1 or 4.\",\"Omit sampleCount for single-sample storage.\"),o===4&&(e.kind!==\"2d\"||i!==1||!e.usage.includes(\"render_attachment\")||e.usage.includes(\"storage_binding\"))&&n(\"VGPU-TEXTURE-SAMPLES-INVALID\",\"MSAA requires a 2d render attachment with one mip and no storage_binding.\",\"Use a single-sample texture for storage, arrays or volumes; resolve MSAA into a separate texture.\"),e.kind===\"1d\"&&(e.usage.includes(\"render_attachment\")||/^(depth|stencil|bc|etc2|eac|astc)/.test(e.format))&&n(\"VGPU-TEXTURE-KIND-INVALID\",\"1d textures cannot be render attachments or use depth/stencil/compressed formats.\",\"Use a 2d texture or a plain color format with non-attachment usage.\");const a=eo(e),c=e.kind===\"1d\"?\"maxTextureDimension1D\":e.kind===\"3d\"?\"maxTextureDimension3D\":\"maxTextureDimension2D\",u=(d=t.limits)==null?void 0:d[c];(u!==void 0&&e.size.some(g=>g>u)||e.kind===\"2d-array\"&&((h=t.limits)==null?void 0:h.maxTextureArrayLayers)!==void 0&&a[2]>t.limits.maxTextureArrayLayers)&&n(\"VGPU-TEXTURE-LIMIT\",\"Texture dimensions or layers exceed enabled device limits.\",\"Reduce the allocation or request sufficient limits when initializing the device.\");const f=g=>{var b;return((b=t.features)==null?void 0:b.has(g))??!1};e.usage.includes(\"storage_binding\")&&!kl.has(e.format)&&!(e.format===\"bgra8unorm\"&&f(\"bgra8unorm-storage\"))&&!($l.has(e.format)&&f(\"texture-formats-tier1\"))&&n(\"VGPU-TEXTURE-STORAGE-FORMAT\",`Format ${e.format} does not support storage_binding with the enabled features.`,\"Choose a supported storage format, enable the required format feature, or explicitly omit storage_binding from usage.\"),e.viewFormats!==void 0&&(!Array.isArray(e.viewFormats)||!Array.from(e.viewFormats).every(g=>typeof g==\"string\"&&g.replace(/-srgb$/,\"\")===e.format.replace(/-srgb$/,\"\")))&&n(\"VGPU-TEXTURE-VIEW-FORMAT\",\"viewFormats must list formats compatible with the texture format.\",\"Only the same format or its compatible linear/sRGB counterpart is allowed; native device restrictions also apply.\")}function mi(e){return typeof e==\"number\"&&Number.isSafeInteger(e)&&e>0}Dc=Symbol.for(\"vgpu/Texture\");class Fe{constructor(t,n,r,i=\"owned\"){m(this,\"device\");m(this,\"ownership\");m(this,Dc,!0);m(this,\"destroySignal\",new wr);m(this,\"identity\",yr(\"texture\"));m(this,\"currentGpu\");m(this,\"currentOptions\");m(this,\"defaultView\",null);m(this,\"destroyed\",!1);this.device=t,this.ownership=i,this.currentGpu=n,this.currentOptions=Js(r)}get gpu(){return this.currentGpu}get options(){return this.currentOptions}get size(){return this.options.size}get format(){return this.options.format}get usage(){return this.options.usage}get mipLevelCount(){return this.options.mipLevelCount??1}get sampleCount(){return this.options.sampleCount??1}get kind(){return this.options.kind}get layers(){return this.options.kind===\"2d-array\"?this.options.layers:1}get dimension(){return this.options.kind===\"2d-array\"?\"2d\":this.options.kind}get viewFormats(){return this.options.viewFormats??[]}get label(){return this.options.label}get resourceIdentity(){return this.identity}onDestroy(t){return this.destroySignal.onDestroy(this,t)}get view(){return this.assertAlive(),this.defaultView??(this.defaultView=this.createView()),this.defaultView}createView(t){return this.assertAlive(\"Texture.createView\"),this.gpu.createView(this.kind===\"2d-array\"?{...t,dimension:(t==null?void 0:t.dimension)??\"2d-array\"}:t)}async read(t){this.assertAlive(\"Texture.read\");const n=await this.device.readback.readTexture(this.gpu,t);return this.assertAlive(\"Texture.read\"),n}async readFloats(t){var i;this.assertAlive(\"Texture.readFloats\");const n=hi(this.options.format,\"Texture.readFloats\"),{size:r}=Ws(this.gpu,t,\"Texture.readFloats\");return Hs(r[0]*r[1]*r[2]*n.components*4,(i=this.device.gpu.limits)==null?void 0:i.maxBufferSize,\"Texture.readFloats\"),wl(await this.read(t),this.options.format)}destroy(){if(!this.destroyed){this.destroyed=!0,this.defaultView=null;try{this.destroySignal.emit(this)}finally{this.ownership!==\"external\"&&!qs(this.gpu)&&this.gpu.destroy()}}}dispose(){this.destroy()}assertAlive(t=\"Texture\"){var n,r;if(this.destroyed)throw new J({code:\"VGPU-CORE-TEXTURE-DESTROYED\",message:\"Texture is destroyed\",where:t});(r=(n=this.device).assertUsable)==null||r.call(n,t)}}function Pl(e){const[t,n,r]=eo(e),i={label:e.label,size:{width:t,height:n,depthOrArrayLayers:r},dimension:e.kind===\"2d-array\"?\"2d\":e.kind,format:e.format,usage:Bs(e.usage)};return e.mipLevelCount!==void 0&&(i.mipLevelCount=e.mipLevelCount),e.sampleCount!==void 0&&(i.sampleCount=e.sampleCount),e.viewFormats!==void 0&&(i.viewFormats=[...e.viewFormats]),e.kind===\"2d-array\"&&(i.textureBindingViewDimension=\"2d-array\"),i}class pi{constructor(t,n=null,r=\"owned\",i={}){w(this,oe);m(this,\"gpu\");m(this,\"adapterInfo\");m(this,\"queue\");m(this,\"readback\");m(this,\"isCompatibilityMode\");m(this,\"scopes\",[]);m(this,\"ownership\");m(this,\"state\",\"alive\");m(this,\"lossInfo\");m(this,\"observeLoss\",!0);this.gpu=t,this.adapterInfo=n,Object.defineProperty(this,\"assertUsable\",{value:a=>y(this,oe,ye).call(this,a)}),this.ownership=typeof r==\"string\"?r:\"owned\";const s=typeof r==\"string\"?i:r;this.isCompatibilityMode=s.isCompatibilityMode??!1,this.queue=new Sl(t.queue,a=>y(this,oe,ye).call(this,a)),this.readback=new bl(t);const o=t.lost;o&&typeof o.then==\"function\"&&Promise.resolve(o).then(a=>{!this.observeLoss||this.state!==\"alive\"||(this.lossInfo=a,this.state=\"lost\")},()=>{})}get limits(){return y(this,oe,ye).call(this,\"Device.limits\"),this.gpu.limits}get features(){return y(this,oe,ye).call(this,\"Device.features\"),this.gpu.features}createShader(t){y(this,oe,ye).call(this,\"Device.createShader\");const n=typeof t==\"string\"?il(t):t;return new El(this.gpu.createShaderModule({code:n.wgsl}),n)}createTexture(t){y(this,oe,ye).call(this,\"Device.createTexture\"),Tl(t,this.gpu);const n=Js(t);return new Fe(this,this.gpu.createTexture(Pl(n)),n)}createBuffer(t){y(this,oe,ye).call(this,\"Device.createBuffer\");const n=Al(t);n&&this.captureError(n);const r=n?_l(Math.max(4,t.size||4)):Rl(t);return new Se(this,this.gpu.createBuffer(r),t)}wrapBuffer(t){if(y(this,oe,ye).call(this,\"Device.wrapBuffer\"),!Fl(t))throw new J({code:\"VGPU-EXTERNAL-BUFFER-INVALID\",message:\"Device.wrapBuffer requires a GPUBuffer with finite size and usage properties.\",where:\"Device.wrapBuffer\",fix:\"Pass a live GPUBuffer created for this GPUDevice.\"});const n={size:t.size,usage:Dl(t.usage),...t.label?{label:t.label}:{}};return new Se(this,t,n,\"external\")}pushErrorScope(t){var n,r;y(this,oe,ye).call(this,\"Device.pushErrorScope\"),this.scopes.push([]),(r=(n=this.gpu).pushErrorScope)==null||r.call(n,t)}async popErrorScope(){var r,i;y(this,oe,ye).call(this,\"Device.popErrorScope\");const t=this.scopes.pop(),n=await((i=(r=this.gpu).popErrorScope)==null?void 0:i.call(r));return y(this,oe,ye).call(this,\"Device.popErrorScope\"),(t==null?void 0:t[0])??Cl(n)??null}destroy(){if(this.state===\"disposed\")return;const t=this.state===\"lost\";this.state=\"disposed\",this.observeLoss=!1,this.scopes.length=0,this.readback.destroy(),this.ownership===\"owned\"&&!t&&this.gpu.destroy()}dispose(){this.destroy()}captureError(t){const n=this.scopes.at(-1);if(n)n.push(t);else throw t}}oe=new WeakSet,ye=function(t){var i,s;if(this.state===\"alive\")return;if(this.state===\"disposed\")throw new J({code:\"VGPU-DEVICE-DISPOSED\",message:\"The GPU device wrapper has been disposed.\",where:t,fix:\"Create a new Gpu instance before performing more work.\"});const n=(i=this.lossInfo)==null?void 0:i.reason,r=(s=this.lossInfo)==null?void 0:s.message;throw new J({code:\"VGPU-DEVICE-LOST\",message:`The GPU device was lost${n?` (${n})`:\"\"}${r?`: ${r}`:\".\"}`,where:t,cause:this.lossInfo})};function Al(e){return!Number.isFinite(e.size)||e.size<=0?to(\"Buffer size must be greater than zero.\"):e.usage.length===0?to(\"Buffer usage must not be empty.\"):null}function to(e){return new J({code:\"VGPU-CORE-INVALID-USAGE\",message:e,where:\"Device.createBuffer\"})}function Rl(e){return{label:e.label,size:e.size,usage:Dn(e.usage)}}function Cl(e){return e?new J({code:\"VGPU-CORE-VALIDATION\",message:e.message,where:\"GPUDevice.popErrorScope\",cause:e}):null}function Fl(e){if(typeof e!=\"object\"&&typeof e!=\"function\"||e===null)return!1;const t=e;return Number.isSafeInteger(t.size)&&(t.size??-1)>=0&&Number.isSafeInteger(t.usage)&&(t.usage??-1)>=0&&typeof t.destroy==\"function\"}const Ll=[\"map_read\",\"map_write\",\"copy_src\",\"copy_dst\",\"index\",\"vertex\",\"uniform\",\"storage\",\"indirect\",\"query_resolve\"];function Dl(e){return Ll.filter(t=>(e&Dn([t]))!==0)}const no=new WeakMap,ro=new WeakMap;function io(e,t){return no.set(e,Ml(t)),e}function Yt(e){return no.get(e)}function Ul(e,t){const n=Yt(t);return n&&ro.set(e,{layout:n}),e}function so(e){return ro.get(e)}function Ml(e){return{entries:e.entries.map(t=>({...t}))}}function Gl(e,t){const n=ao(e).createBindGroupLayout({label:t.label,entries:[...t.entries]});return io(n,{entries:t.entries})}function Ol(e,t){if(!t.layout)throw new J({code:\"VGPU-CORE-BIND-GROUP-LAYOUT-REQUIRED\",message:'createBindGroup requires an explicit layout. vgpu does not use layout: \"auto\" for bind groups.',where:\"createBindGroup\"});const n=ao(e).createBindGroup({label:t.label,layout:t.layout,entries:[...t.entries]});return Ul(n,t.layout)}const oo={uniform:Vl,storage:Nl,readonlyStorage:Bl,texture:zl,storageTexture:ql,sampler:jl,resource:Wl};function Vl(e,t,n={}){return{binding:bt(e),visibility:Qt(t),buffer:{...n,type:\"uniform\"}}}function Nl(e,t,n={}){return{binding:bt(e),visibility:Qt(t),buffer:{...n,type:\"storage\"}}}function Bl(e,t,n={}){return{binding:bt(e),visibility:Qt(t),buffer:{...n,type:\"read-only-storage\"}}}function zl(e,t,n={}){return{binding:bt(e),visibility:Qt(t),texture:n}}function ql(e,t,n){return{binding:bt(e),visibility:Qt(t),storageTexture:n}}function jl(e,t,n={}){return{binding:bt(e),visibility:Qt(t),sampler:n}}function Wl(e,t){return{binding:bt(e),resource:Hl(t)}}function ao(e){return e instanceof pi||\"gpu\"in e?e.gpu:e}function Hl(e){return e instanceof Se?{buffer:e.gpu}:e instanceof Fe||Yl(e)?e.createView():Xl(e)?{buffer:e.gpu}:Kl(e)?e:co(e)?{buffer:e}:e}function Kl(e){return vr(e)&&\"buffer\"in e}function co(e){return vr(e)&&\"size\"in e&&\"usage\"in e&&typeof e.destroy==\"function\"}function Xl(e){return vr(e)&&co(e.gpu)}function Yl(e){return vr(e)&&typeof e.createView==\"function\"&&\"gpu\"in e}function bt(e){if(!Number.isInteger(e)||e<0)throw new J({code:\"VGPU-CORE-BINDING-INVALID\",message:\"Binding entries require an explicit non-negative integer binding number.\",where:\"bind\"});return e}function Qt(e){return typeof e==\"number\"?e:(typeof e==\"string\"?e.split(/[|,\\s]+/):e).reduce((n,r)=>n|Ql(r),0)}function Ql(e){const t=e.trim().toLowerCase(),n=globalThis.GPUShaderStage,i={vertex:(n==null?void 0:n.VERTEX)??1,fragment:(n==null?void 0:n.FRAGMENT)??2,compute:(n==null?void 0:n.COMPUTE)??4}[t];if(!i)throw new J({code:\"VGPU-CORE-VISIBILITY-INVALID\",message:`Unknown shader stage visibility '${e}'.`,where:\"bind\"});return i}function vr(e){return typeof e==\"object\"&&e!==null}let _=class extends fi{};function uo(e,t,n=\"resource\"){return new _({code:\"VGPU-R1-BINDING-DESTROYED\",message:`Binding '${t.name}' (@group(${t.group}) @binding(${t.binding})) in '${e}' refers to destroyed resource '${n}'.`,where:`${e}.${t.name}`,fix:`Create a live resource and call set({ ${t.name}: replacement }). Direct attachment references do not follow target.resize(); bind the Target itself to follow replacements. Re-record bundles that captured the old resource.`,detail:{binding:t.binding,bindingName:t.name,resourceName:n}})}function Zl(e,t,n,r,i,s){const o=t===\"vertex\"?\"Vertex\":\"Fragment\",a=t===\"vertex\"?\"VERTEX\":\"FRAGMENT\",c=`maxStorageBuffersIn${o}Stage`;return new _({code:`VGPU-LIMIT-STORAGE-${a}`,message:`${o} entry '${n}' in '${e}' uses ${r} storage buffer(s), but device limit ${c} is ${i}.`,fix:t===\"vertex\"?`Request init({ requiredLimits: { ${c}: ${r} } }) if the adapter supports it, or move vertex data to geometry(gpu, ...) vertex streams.`:`Request init({ requiredLimits: { ${c}: ${r} } }) if the adapter supports it, or reduce fragment storage buffers.`,where:`${e}.pipelineLayout`,detail:{stage:t,entryPoint:n,count:r,limit:i,bindings:s.map(({name:u,group:f,binding:d})=>({name:u,group:f,binding:d}))}})}function Jl(e,t,n,r,i){return new _({code:\"VGPU-SET-TEXTURE-FILTERABILITY\",message:`${r} (${n}) cannot satisfy filtering texture '${t.name}' @group(${t.group}) @binding(${t.binding}).`,fix:\"Use a filterable format; request float32-filterable for rgba32float when supported; or use textureLoad without a sampler.\",where:`${e}.set`,detail:{format:n,group:t.group,binding:t.binding,bindingName:t.name,resourceName:r,samplerName:i==null?void 0:i.name,samplerGroup:i==null?void 0:i.group,samplerBinding:i==null?void 0:i.binding}})}function ef(e,t){const n=Bf(e,t);return new _({code:\"VGPU-R1-BINDING-NEVER-SET\",message:`Unset \\`${t.name}\\` @group(${t.group}) @binding(${t.binding}) in '${e}'. Fix: ${n}; or ${e}.group(${t.group}, bindGroup).`,where:`${e}.draw`})}function lo(e,t){const n=t===\"lib\"?\"lib-owned by its first JS set()\":\"user-owned by its first resource set()\",r=t===\"lib\"?`Fix: pass a resource from the start: wave.set({ ${e}: new Uniform(gpu.device, { size: 4 }) }).`:`Fix: pass JS values from the first set(): wave.set({ ${e}: jsValue }).`;return new _({code:\"VGPU-R1-OWNERSHIP-FLIP\",message:`\\`${e}\\` is ${n}; ownership cannot change. ${r}`,where:\"set\"})}function tf(e,t){return new _({code:\"VGPU-R4-GROUP-CLAIMED\",message:`group ${t} of '${e}' is claimed; set() cannot update it.`,fix:`Call set() first, or build from ${e}.layout(${t}); pass dynamic offsets to p.draw().`,where:`${e}.set`})}function nf(e,t,n,r){return new _({code:\"VGPU-R4-GROUP-INCOMPATIBLE\",message:`claimed group ${t} in '${e}' is incompatible: ${n}.`,fix:`Build from ${e}.layout(${t}, { dynamicOffsets? }) then call ${e}.group(${t}, bindGroup).`,where:`${e}.group`,cause:r})}function Zt(e,t,n){return new _({code:\"VGPU-R4-GROUP-VALIDATION\",message:`WebGPU rejected claimed group ${t} in '${e}'.`,fix:`Build from ${e}.layout(${t}); pass offsets via p.draw(draw, { offsets: { ${t}: [...] } }).`,where:`${e}.draw`,cause:n,detail:{drawLabel:e,group:t}})}function fo(e,t){return new _({code:\"VGPU-BLEND-INVALID\",message:`Invalid blend '${String(t)}' in '${e}'.`,fix:'Use \"alpha\", \"additive\", \"premultiplied\", or { color, alpha? } components.',where:\"draw\"})}function ho(e,t){return new _({code:\"VGPU-BLEND-CONSTANT-INVALID\",message:`Invalid blendConstant in '${e}': ${t}`,fix:'Use [r, g, b, a] finite numbers with a blend whose color or alpha uses \"constant\"/\"one-minus-constant\"; omit it to keep the pass default (0, 0, 0, 0).',where:\"draw\"})}function rf(e,t){return new _({code:\"VGPU-BUNDLE-BLEND-CONSTANT\",message:`bundle '${e}' cannot record draw '${t}': blendConstant is render-pass state and render bundle encoders cannot set it.`,fix:\"Encode the draw with p.draw(...) in a frame pass, or drop blendConstant from the draw.\",where:\"bundle\"})}function mo(e,t){return new _({code:\"VGPU-WRITEMASK-INVALID\",message:`Invalid writeMask ${t} in '${e}'.`,fix:\"Use an array of r/g/b/a; omit it for all channels.\",where:\"draw\"})}function gi(e,t,n=\"draw\"){return new _({code:\"VGPU-COLORS-INVALID\",message:`Invalid colors in '${e}': ${t}`,fix:\"Use one { blend?, writeMask? } or null entry per color attachment of the target, aligned by index; omit colors to apply the top-level blend/writeMask to every attachment.\",where:n})}function sf(e,t){return new _({code:\"VGPU-CULL-INVALID\",message:`Invalid cull '${String(t)}' in '${e}'.`,fix:'Use \"none\", \"front\", or \"back\"; omit it for no culling.',where:\"draw\"})}function of(e,t){return new _({code:\"VGPU-FRONTFACE-INVALID\",message:`Invalid frontFace '${String(t)}' in '${e}'.`,fix:'Use \"ccw\" or \"cw\"; omit it for counter-clockwise.',where:\"draw\"})}function po(e,t){return new _({code:\"VGPU-UNCLIPPED-DEPTH-INVALID\",message:`Invalid unclippedDepth in '${e}': ${t}`,fix:'Use a boolean. unclippedDepth: true needs the \"depth-clip-control\" device feature — request it with init({ requiredFeatures: [\"depth-clip-control\"] }) on an adapter that supports it. Omit the option to keep depth clipping.',where:\"draw\"})}function Le(e,t){return new _({code:\"VGPU-DEPTH-INVALID\",message:`Invalid depth in '${e}': ${t}`,fix:'Use false or { write?, compare?, bias?, biasSlopeScale?, biasClamp? }; omit it for { write: true, compare: \"less-equal\" }.',where:\"draw\"})}function Jt(e,t,n=\"draw\"){return new _({code:\"VGPU-STENCIL-INVALID\",message:`Invalid stencil in '${e}': ${t}`,fix:`Use { front?, back?, readMask?, writeMask?, ref? } with GPUCompareFunction/GPUStencilOperation faces and u32 masks, against a target whose depth format has a stencil aspect (depth: \"depth24plus-stencil8\"); omit it for WebGPU's pass-through defaults.`,where:n})}function af(e,t){return new _({code:\"VGPU-BUNDLE-STENCIL-REF\",message:`bundle '${e}' cannot record draw '${t}': stencil.ref is render-pass state and render bundle encoders cannot set it.`,fix:\"Encode the draw with p.draw(...) in a frame pass, or drop ref from the draw's stencil.\",where:\"bundle\"})}function _r(e,t,n=\"draw\"){return new _({code:\"VGPU-MULTISAMPLE-INVALID\",message:`Invalid multisample in '${e}': ${t}`,fix:\"Use { alphaToCoverage?, mask? }: alphaToCoverage needs a target created with msaa: true, and mask must be an integer in [0, 0xFFFFFFFF] (bits above the target's sampleCount are ignored). Omit multisample for full-coverage defaults.\",where:n})}function Sr(e,t,n=\"draw\"){return new _({code:\"VGPU-CONSTANTS-INVALID\",message:`Invalid constants in '${e}': ${t}`,fix:\"Key WGSL `override` constants by name, or by the decimal string of N when the declaration has @id(N); values are finite numbers or booleans, converted to the override's WGSL type (bool/i32/u32/f32/f16). Every override without a default value must be provided. Omit constants to keep the WGSL defaults.\",where:n})}function Er(e,t,n=\"draw\"){return new _({code:\"VGPU-ENTRY-INVALID\",message:`Invalid entry in '${e}': ${t}`,fix:\"Name an entry point declared in the shader with the matching stage — { vertex?, fragment? } strings for draw, one @compute name string for compute. Omit entry (or a field) to use the first entry point of that stage.\",where:n})}function yt(e,t,n){return new _({code:\"VGPU-INDIRECT-INVALID\",message:`Invalid indirect in '${e}': ${t}`,fix:\"Pass a storage buffer created with storage(gpu, bytes, { indirect: true }) — bare, or as { buffer, offset? } with a 4-aligned byte offset — sized so the GPU-read arguments fit: 16 bytes for drawIndirect, 20 for drawIndexedIndirect, 12 for dispatchWorkgroupsIndirect. Omit indirect to use CPU-side counts.\",where:n})}function cf(){return new _({code:\"VGPU-PASS-PRESERVE-MSAA\",message:\"clear:false cannot preserve MSAA; use a non-MSAA target.\",fix:\"Use non-MSAA for accumulation.\",where:\"Frame.pass\"})}function go(e,t=\"expected a number in [0, 1].\",n='Use 1 (default), or 0 with depth: { compare: \"greater\" } for reversed-Z.'){return new _({code:\"VGPU-PASS-CLEARDEPTH-INVALID\",message:`clearDepth received ${String(e)}; ${t}`,fix:n,where:\"Frame.pass\"})}function De(e){return new _({code:\"VGPU-PASS-VIEWPORT-INVALID\",message:`Invalid viewport: ${e}`,fix:\"Use { x?, y?, width, height, minDepth?, maxDepth? } finite numbers within device limits; omit it for the full target.\",where:\"Frame.pass\"})}function bi(e){return new _({code:\"VGPU-PASS-SCISSOR-INVALID\",message:`Invalid scissor: ${e}`,fix:\"Use [x, y, width, height] non-negative integers with x + width and y + height within the target's current pixel size; omit it for the full target.\",where:\"Frame.pass\"})}function uf(){return new _({code:\"VGPU-PASS-PRESERVE-CLEARDEPTH\",message:\"clear:false preserves depth; clearDepth cannot apply.\",fix:\"Remove clearDepth, or let the pass clear.\",where:\"Frame.pass\"})}function bo(e){return new _({code:\"VGPU-PASS-CLEARSTENCIL-INVALID\",message:`clearStencil ${e}`,fix:`Use an integer in [0, 0xFFFFFFFF] on a target whose depth format has a stencil aspect, e.g. depth: \"depth24plus-stencil8\"; the value is masked to the stencil aspect's bit width.`,where:\"Frame.pass\"})}function lf(){return new _({code:\"VGPU-PASS-PRESERVE-CLEARSTENCIL\",message:\"clear:false preserves stencil; clearStencil cannot apply.\",fix:\"Remove clearStencil, or let the pass clear.\",where:\"Frame.pass\"})}function wt(e,t,n=\"Frame.pass\"){return new _({code:\"VGPU-PASS-DEPTH-READONLY\",message:`depthReadOnly ${e}`,fix:t,where:n})}function ff(){return new _({code:\"VGPU-PASS-DEPTH-READONLY-MSAA\",message:`depthReadOnly cannot read an MSAA target's depth: multisampled depth is stored with storeOp \"discard\", so a read-only pass tests against discarded contents.`,fix:\"Use a non-MSAA target for read-only depth, or drop depthReadOnly and let the pass own its depth.\",where:\"Frame.pass\"})}function en(e,t,n=\"timer\"){return new _({code:\"VGPU-TIMER-INVALID\",message:`Invalid timer use: ${e}`,fix:t,where:n})}function df(e,t){return new _({code:\"VGPU-TIMER-CAPACITY\",message:`frame exceeds ${e} timed spans; a timer holds one timestamp query set and WebGPU createQuerySet requires count <= ${t} (2 queries per span).`,fix:\"Time fewer passes per frame, or spread timing across frames.\",where:\"Frame.pass\"})}function tn(e,t,n=\"visibility\"){return new _({code:\"VGPU-VIS-INVALID\",message:`Invalid visibility use: ${e}`,fix:t,where:n})}function hf(e,t){return new _({code:\"VGPU-VIS-CAPACITY-LIMIT\",message:`capacity received ${String(e)}; expected an integer in [1, ${t}] — a visibility instance holds one occlusion query set and WebGPU createQuerySet requires count <= ${t}.`,fix:`Use visibility(gpu, { capacity }) with an integer capacity of at most ${t} (default 64), or create several visibility instances.`,where:\"visibility\"})}function mf(e){return new _({code:\"VGPU-VIS-CAPACITY\",message:`frame uses more than the declared ${e} occlusion query slot(s); the query set is bound to this frame's pass descriptors and cannot grow mid-frame.`,fix:\"Raise visibility(gpu, { capacity }) (max 4096), or dispose() unused query handles so fewer slots are needed per frame.\",where:\"FramePass.occlusion\"})}function pf(e){return new _({code:\"VGPU-VIS-LABEL-DUPLICATE\",message:`query label '${e}' is already live on this visibility instance.`,fix:\"Reuse the existing handle — vis.query(label) handles are stable, created once outside the loop — or dispose() the old handle first, or pick a distinct label.\",where:\"Visibility.query\"})}function yi(e,t){return new _({code:\"VGPU-VIS-DISPOSED\",message:`the ${e} is disposed.`,fix:e===\"visibility\"?\"Create a new instance with visibility(gpu).\":\"Create a new handle with vis.query(label).\",where:t})}function gf(){return new _({code:\"VGPU-VIS-NO-DEPTH\",message:'visibility is set, but the pass target has no depth attachment; without depth testing an occlusion query passes for anything rasterized, so it always reports \"visible\" and is useless for culling.',fix:\"Create the target with depth: true (or a depth format), or drop visibility from this pass.\",where:\"Frame.pass\"})}function bf(){return new _({code:\"VGPU-QUERY-NO-VISIBILITY\",message:\"occlusion() needs the pass to be opened with a visibility instance; the render pass has no occlusionQuerySet to write into.\",fix:\"Open the pass with f.pass({ target, visibility: vis }, ...) using the visibility(gpu) instance that created the query handle.\",where:\"FramePass.occlusion\"})}function yf(){return new _({code:\"VGPU-QUERY-NESTED\",message:\"occlusion() cannot nest inside an active occlusion() body; WebGPU allows one active occlusion query per pass at a time.\",fix:\"Encode each occlusion scope sequentially: p.occlusion(a, ...); p.occlusion(b, ...).\",where:\"FramePass.occlusion\"})}function wf(e){return new _({code:\"VGPU-QUERY-DUPLICATE\",message:`query '${e}' was already used this frame; a slot holds one result per frame, so reuse would silently overwrite it.`,fix:`Use one handle per measured object per frame, e.g. vis.query(\"${e}-2\") for a second scope.`,where:\"FramePass.occlusion\"})}function wi(e=\"Frame.pass\"){return new _({code:\"VGPU-TARGET-REQUIRED\",message:\"Target required. Fix: pass surface(gpu, canvas) or target(gpu, { size }) as { target }.\",where:e})}function Ee(e,t,n,r){return new _({code:e,message:`${e}: ${n}`,fix:r,where:t})}function ee(e,t){return Ee(\"VGPU-MESH-LAYOUT-INVALID\",e,t,\"Fix attributes/formats/offsets; use non-numeric names and 4-aligned stride <= 2048.\")}function yo(e,t){return Ee(\"VGPU-MESH-LIMIT-EXCEEDED\",e,t,\"Use <= 8 buffers and <= 16 attributes (or the device limits).\")}function wo(e,t){return Ee(\"VGPU-MESH-LOCATION-CONFLICT\",e,`Duplicate geometry @location(${t}).`,\"Use unique locations, or omit them for name matching.\")}function xo(e,t){return Ee(\"VGPU-MESH-DATA-MISALIGNED\",e,t,\"Fix: repack data, set matching stride, or give raw buffers an explicit count.\")}function nn(e,t){return Ee(\"VGPU-MESH-RANGE-INVALID\",e,t,\"Use index ranges for indexed geometries, vertex ranges otherwise, within geometry counts.\")}function rn(e,t){return Ee(\"VGPU-MESH-WRITE-RANGE\",e,t,\"Write within the buffer byteLength, or create a larger geometry.\")}function xf(e,t,n=[]){return Ee(\"VGPU-MESH-ATTRIBUTE-UNMATCHED\",e,`Geometry attribute '${t}' has no shader input.`,`Use shader name${n.length?` (${n.join(\",\")})`:\"\"} or { location:n }.`)}function vf(e,t,n){return Ee(\"VGPU-MESH-ATTRIBUTE-UNMATCHED\",e,`Geometry attribute '${t}' matches locations ${n.join(\",\")}.`,\"Rename inputs or set { location:n }.\")}function _f(e,t,n=[]){return Ee(\"VGPU-MESH-INPUT-MISSING\",e,`Geometry lacks shader input '${t}'.`,`Add/remove it. Geometry attributes: ${n.join(\",\")||\"none\"}.`)}function Sf(e,t,n,r){return Ee(\"VGPU-MESH-FORMAT-MISMATCH\",e,`Attribute '${t}' ${n} != shader ${r}.`,\"Match the float/sint/uint shader base type; widths may differ.\")}function Ef(e){return new _({code:\"VGPU-PIPELINE-LAYOUT-GAP\",message:`Pipeline bind group ${e} is missing.`,fix:\"Use consecutive @group() indices starting at 0.\",where:\"pipeline layout\"})}function Un(e,t,n){return new _({code:\"VGPU-COMPILE-FAILED\",message:\"WebGPU pipeline compilation failed.\",fix:\"Check WGSL, vertex layouts, and target signature.\",where:e,cause:t,detail:n?{signature:n}:void 0})}function vo(e){return new _({code:\"VGPU-COMPILE-DISPOSED\",message:\"GPU disposed during pipeline compilation.\",where:e})}function Ir(e,t){return new _({code:\"VGPU-COMPILE-SIGNATURE-INVALID\",message:`Invalid TargetSignature: ${t}`,fix:\"Pass { colors, depth?, sampleCount?:1|4 } or a Target.\",where:e})}function If(e){return new _({code:\"VGPU-TARGET-DEPTH-STENCIL-ONLY\",message:`depth received '${e}'; stencil-only depth targets are not supported yet.`,fix:'Use a format with a depth aspect such as \"depth24plus\" or \"depth24plus-stencil8\".',where:\"target\"})}function _o(){return new _({code:\"VGPU-TARGET-SIZE-REQUIRED\",message:\"Target size required. Fix: target(gpu, { size: [w,h] }); update surface-derived targets in onResize.\",where:\"target\"})}function xi(e){return new _({code:\"VGPU-SURFACE-NOT-IN-FRAME\",message:\"Surface targets are only available inside frame(gpu).\",fix:\"surface passes must run inside frame(gpu, ...); precompile against an offscreen target(gpu, ...) instead\",where:e})}function kf(){return new _({code:\"VGPU-SURFACE-CONTEXT\",message:\"Canvas WebGPU context failed. Fix: check navigator.gpu and remove any existing 2d/webgl context.\",where:\"surface\"})}function $f(e){return new _({code:\"VGPU-SURFACE-DUPLICATE\",message:`Canvas already has surface${e?` '${e}'`:\"\"}. Fix: reuse or dispose it.`,where:\"surface\"})}function Tf(e){return new _({code:\"VGPU-SURFACE-DISPOSED\",message:`Surface '${e??\"surface\"}' is disposed. Fix: call surface(gpu, canvas).`,where:\"surface\"})}function Pf(){return new _({code:\"VGPU-SURFACE-AUTORESIZE-UNSUPPORTED\",message:\"autoResize needs clientWidth. Fix: call surface.resize([w,h]) for OffscreenCanvas; onResize still fires.\",where:\"surface\"})}function Af(e){return new _({code:\"VGPU-SURFACE-RESIZE-REENTRANT\",message:`Cannot resize this surface${e?` '${e}'`:\"\"} in onResize. Fix: resize derived targets only.`,where:\"surface.resize\"})}function Rf(e){return new _({code:\"VGPU-CLEAR-COLOR-INVALID\",message:`Invalid ${e}: expected four finite numbers.`,fix:\"Assign [r, g, b, a] or a GPUColor object ({ r, g, b, a }).\",where:e})}function Cf(e){return new _({code:\"VGPU-CLOCK-DELTA-INVALID\",message:`clock.advance() received ${String(e)}; expected a finite, non-negative number of seconds.`,fix:\"Pass the elapsed seconds, e.g. clock(gpu).advance(1 / 60); use frame(gpu) alone to advance with wall-clock time.\",where:\"clock.advance\"})}function So(){return new _({code:\"VGPU-FRAME-REENTRANT\",message:\"Nested frame(gpu) is invalid. Fix: queue work for the next frame.\",where:\"frame\"})}function Ff(e,t){return new _({code:\"VGPU-QUERY-READBACK\",message:`${e} dropped a query readback: ${Of(t)}`,fix:\"Usually a lost or destroyed device: recreate the gpu (and the timer/visibility instance) before reading queries again. Results resume on the next successful readback; the frame itself is unaffected.\",where:\"QueryRing.onSubmitted\",cause:t})}function Eo(e){return new _({code:\"VGPU-FRAME-CANCELED\",message:\"the frame was canceled; its command encoder was dropped and nothing more can be encoded or submitted on it.\",fix:\"Open a new frame(gpu) for further work; cancel() is the last operation on a frame.\",where:e})}function Lf(e){return new _({code:\"VGPU-FRAME-PASS-ACTIVE\",message:\"the frame cannot be canceled while a pass callback is active.\",fix:\"Return from the frame.pass(...) callback first, then call frame.cancel(); this keeps pass descriptor resources alive until the pass is closed.\",where:e})}function Df(e){return new _({code:\"VGPU-FRAME-SUBMITTED\",message:\"the frame was already submitted; submitted GPU work cannot be canceled.\",fix:\"Call cancel() only on a frame you decided not to submit; the frame you did submit needs no cleanup.\",where:e})}function se(e,t,n){return new _({code:\"VGPU-R1-BINDING-INCOMPATIBLE-RESOURCE\",message:`binding \\`${e.name}\\` @group(${e.group}) @binding(${e.binding}) needs ${t}.`,fix:n,where:\"set\"})}function G(e,t,n){return new _({code:\"VGPU-RING1-UNSUPPORTED\",message:t,fix:n,where:e})}function Uf(e,t){return new _({code:\"VGPU-SET-VALUE-INVALID\",message:`Invalid WGSL value at '${e.path}': ${t}.`,fix:\"Pass the exact reflected structure, vector, matrix, and array shapes; use integral in-range values for i32/u32.\",where:\"set\",detail:e})}function kr(e){return Vf(e)&&e.version!==1?new _({code:\"VGPU-SHADER-SOURCE-INVALID\",message:`VGPU-SHADER-SOURCE-INVALID: unsupported ShaderSource v${String(e.version)}; expected v1. Fix: update vgpu or regenerate it.`,where:\"shader source\"}):new _({code:\"VGPU-SHADER-SOURCE-INVALID\",message:`VGPU-SHADER-SOURCE-INVALID: expected WGSL or { version, wgsl }, got ${Nf(e)}. Fix: configure @vgpu/wgsl loader-vite or loader-webpack.`,where:\"shader source\"})}function Mf(e){return new _({code:\"VGPU-R1-STORAGE-ALIASING\",message:\"`src` and writable `dst` alias. Fix: alternate them with pingPongStorage(gpu).\",where:e})}function Gf(e){return new _({code:\"VGPU-R1-SHARED-UNIFORMS-LAYOUT-MISMATCH\",message:`Uniform '${e.bindingName}' layout ${e.adoptedLayout} from ${e.adoptedSource} != ${e.incomingLayout} from ${e.incomingSource}. Fix: align structs or split uniforms.`,where:\"uniforms\"})}function Of(e){return e instanceof Error?`${e.name}: ${e.message}`:String(e)}function Vf(e){return typeof e==\"object\"&&e!==null&&\"version\"in e}function Nf(e){if(typeof e!=\"object\"||e===null)return typeof e;try{const t=JSON.stringify(e);return t.length>80?`${t.slice(0,77)}...`:t}catch{return\"object\"}}function Bf(e,t){switch(t.kind){case\"sampler\":return`${e}.set({${t.name}:sampler(gpu)})`;case\"texture\":return`${e}.set({${t.name}:scene.color})`;case\"buffer\":return t.addressSpace===\"uniform\"?`${e}.set({${t.name}:{ /* values */ }})`:`${e}.set({${t.name}:buffer})`;default:return`${e}.set({${t.name}:resource})`}}const Io=[\"scheduler\",\"resource\",\"service\"];function Mn(e){return{name:e}}const ko=new WeakMap;function zf(e){const t=ko.get(e);if(!t)throw new _({code:\"VGPU-GPU-FOREIGN\",message:\"This object was not created by init(); it has no vgpu kernel.\",fix:\"Pass the gpu returned by init() from vgpu, vgpu/node or vgpu/mock.\",where:\"gpu\"});return t}class qf{constructor(t){m(this,\"device\");w(this,kt,new Map);w(this,Wn,new Map(Io.map(t=>[t,new Set])));w(this,$t,new Set);w(this,fn,new Set);w(this,Tt,new Set);w(this,Pt,!1);this.device=t}get disposed(){return l(this,Pt)}service(t,n){const r=l(this,kt).get(t);if(r!==void 0)return r;const i=n(this);return l(this,kt).set(t,i),i}peekService(t){return l(this,kt).get(t)}own(t,n){const r=l(this,Wn).get(t);return r.add(n),()=>{r.delete(n)}}addErrorListener(t){return l(this,$t).add(t),()=>{l(this,$t).delete(t)}}reportError(t){if(l(this,Pt))return Promise.resolve();const n=Promise.resolve().then(()=>{const r=[...l(this,$t)];if(!r.length){console.error(t);return}for(const i of r)try{i(t)}catch(s){console.error(s)}});return this.trackDelivery(n)}trackDelivery(t){const n=Promise.resolve(t).then(()=>{},r=>{console.error(r)});return l(this,fn).add(n),n.finally(()=>l(this,fn).delete(n)),n}registerSettledSource(t){return l(this,Tt).add(t),()=>{l(this,Tt).delete(t)}}async settled(){const t=[...l(this,fn),...[...l(this,Tt)].flatMap(n=>n())];await Promise.allSettled(t)}dispose(){if(!l(this,Pt)){x(this,Pt,!0);for(const t of Io){const n=l(this,Wn).get(t);for(const r of[...n])r();n.clear()}l(this,kt).clear(),l(this,Tt).clear(),l(this,$t).clear(),this.device.dispose()}}}kt=new WeakMap,Wn=new WeakMap,$t=new WeakMap,fn=new WeakMap,Tt=new WeakMap,Pt=new WeakMap;function $o(e){const t=new qf(e),n={device:e,gpu:e.gpu,get disposed(){return t.disposed},onError:r=>t.addErrorListener(r),settled:()=>t.settled(),dispose:()=>{t.dispose()}};return ko.set(n,t),n}async function jf(e,t={},n){return $o(await Wf(e,t,n))}async function Wf(e,t,n){return t.adapter||n?(t.adapter??n()).requestDevice(t):Hf(t)}async function Hf(e){var i;const n=await((i=globalThis.navigator.gpu)==null?void 0:i.requestAdapter({powerPreference:e.powerPreference}));if(!n)throw G(\"init\",\"navigator.gpu.requestAdapter() returned null.\");Zu(n.features,e.requiredFeatures);const r=await n.requestDevice({requiredFeatures:e.requiredFeatures,requiredLimits:e.requiredLimits});return new pi(r,n.info??null)}function M(e,t){e.assertUsable(t)}function vi(e,t){e.assertUsable(t)}async function Kf(e){if(!Xf(e))throw Yf(\"VGPU-INIT-DEVICE-INVALID\",\"Invalid external GPUDevice shape.\");const t=new pi(e,null,\"external\");await Promise.resolve();try{return M(t,\"initFromDevice\"),$o(t)}catch(n){throw t.dispose(),n}}function Xf(e){if(typeof e!=\"object\"&&typeof e!=\"function\"||e===null)return!1;try{const t=e;return(typeof t.queue==\"object\"||typeof t.queue==\"function\")&&t.queue!==null&&typeof t.createBuffer==\"function\"&&typeof t.createCommandEncoder==\"function\"&&!!t.lost&&typeof t.lost.then==\"function\"}catch{return!1}}function Yf(e,t){return new _({code:e,message:t,where:\"initFromDevice\"})}const _i=Symbol(\"vgpu.bindingResource\");function Qf(e){return typeof(typeof e==\"object\"&&e!==null?e[_i]:void 0)==\"function\"?e:void 0}const sn=Symbol(\"vgpu.geometry.layoutResolver\");function Y(e,t){const n=zf(e);if(n.disposed)throw To(t);return n}function To(e){return new _({code:\"VGPU-GPU-DISPOSED\",message:`${e}() ran after gpu.dispose(); the device and everything it owned are gone.`,fix:\"Create resources before disposing the gpu, or init() a new one.\",where:e})}function Po(e,t){let n=()=>{};const r=t({trackSettled:i=>{e.trackDelivery(i)},errorSink:i=>e.reportError(i),onDispose:()=>{n()}});return n=e.own(\"resource\",()=>r.dispose()),r}function on(e,t,n,r){const i=e.own(\"resource\",()=>n(t));return r==null||r(i),t}class Ao{constructor(t,n){m(this,\"vertexCount\");m(this,\"indexCount\");m(this,\"instanceCount\");m(this,\"vertexBuffers\");m(this,\"indexBuffer\");m(this,\"indexFormat\");m(this,\"vertexBufferLayouts\");m(this,\"topology\");m(this,\"stripIndexFormat\");m(this,\"buffers\");w(this,At);w(this,dn);w(this,hn);w(this,Hn,new Map);w(this,Rt,new Set);w(this,nt,!1);const r=\"geometry\";if(n.buffers.length>8)throw yo(r,`${n.buffers.length} vertex buffers exceed limit 8.`);let i=0;const s=new Set,o=n.buffers.map((h,g)=>{const b=rd(t,h,`${r}.buffers[${g}]`);i+=b.attributes.length;for(const v of b.attributes)if(v.location!==void 0){if(s.has(v.location))throw wo(`${r}.buffers[${g}]`,v.location);s.add(v.location)}return b}),a=t.gpu.limits.maxVertexAttributes;if(i>a)throw yo(r,`${i} attributes exceed device limit ${a}.`);const c=n.topology??\"triangle-list\";if(!od.has(c))throw ee(r,`Invalid topology: ${String(c)}.`);const u=id(t,n,r),f=Co(o,\"vertex\"),d=Co(o,\"instance\");Fo(o,\"vertex\",n.vertexCount??f,r),Fo(o,\"instance\",n.instanceCount??d,r),Si(r,\"vertexCount\",n.vertexCount,f),Si(r,\"instanceCount\",n.instanceCount,d),Si(r,\"indexCount\",n.indexCount,u.count),this.topology=c,this.stripIndexFormat=c.endsWith(\"strip\")?u.format:void 0,x(this,hn,o),this.vertexBufferLayouts=Object.freeze(o.map(h=>h.layout)),this.vertexBuffers=Object.freeze(o.map(h=>h.gpu)),this.buffers=Object.freeze(o.map((h,g)=>new Zf(`${r}.buffers[${g}]`,h))),this.vertexCount=n.vertexCount??f,this.instanceCount=n.instanceCount??d,this.indexBuffer=u.gpu,this.indexFormat=u.format,this.indexCount=n.indexCount??u.count,x(this,At,u.owned),x(this,dn,u.byteLength),sd(this)}[sn](t,n){if(l(this,nt))throw ee(n,\"Geometry is destroyed; create a live geometry.\");const r=t.map(u=>`${u.name}:${u.location}:${$r(u.type)}`).join(\"|\"),i=l(this,Hn).get(r);if(i)return i;const s=new Set,o=l(this,hn).flatMap(u=>u.attributes.map(f=>f.name)),a=l(this,hn).map(u=>{const f=[...u.layout.attributes],d=u.attributes.map((h,g)=>{const b=h.location===void 0?t.filter(k=>k.name===h.name):[];if(h.location===void 0&&b.length===0)throw xf(n,h.name,t.map(k=>k.name));if(b.length>1)throw vf(n,h.name,b.map(k=>k.location));const v=h.location??b[0].location;if(s.has(v))throw wo(n,v);s.add(v);const E=t.find(k=>k.location===v);if(E&&ud(h.format)!==$r(E.type))throw Sf(n,h.name,h.format,$r(E.type));return Object.freeze({...f[g],shaderLocation:v})});return Object.freeze({arrayStride:u.layout.arrayStride,...u.layout.stepMode?{stepMode:u.layout.stepMode}:{},attributes:Object.freeze(d)})});for(const u of t)if(!s.has(u.location))throw _f(n,u.name,o);const c=Object.freeze(a);return l(this,Hn).set(r,c),c}slice(t={}){return new Jf(this,t)}write(t,n=0){const r=this.buffers[0];if(!r)throw rn(\"geometry.write\",\"No vertex buffer 0; add one before writing.\");r.write(t,n)}writeIndices(t,n=0){if(l(this,nt))throw rn(\"geometry.writeIndices\",\"Geometry is destroyed; create a new geometry before writing.\");if(!l(this,At)||l(this,dn)===void 0)throw rn(\"geometry.writeIndices\",\"No owned index buffer; write caller-owned buffers directly.\");Do(\"geometry.writeIndices\",l(this,dn),t.byteLength,n),l(this,At).write(t,n)}destroy(){var t;if(!l(this,nt)){x(this,nt,!0);for(const n of this.buffers)n.destroyOwned();(t=l(this,At))==null||t.destroy();for(const n of[...l(this,Rt)])n();l(this,Rt).clear()}}onDestroy(t){return l(this,nt)?(t(),()=>{}):(l(this,Rt).add(t),()=>{l(this,Rt).delete(t)})}}At=new WeakMap,dn=new WeakMap,hn=new WeakMap,Hn=new WeakMap,Rt=new WeakMap,nt=new WeakMap;class Zf{constructor(t,n){m(this,\"where\");m(this,\"inner\");m(this,\"gpu\");m(this,\"stride\");m(this,\"stepMode\");w(this,Kn,{destroyed:!1});this.where=t,this.inner=n,this.gpu=n.gpu,this.stride=n.stride,this.stepMode=n.stepMode,Object.freeze(this)}write(t,n=0){if(l(this,Kn).destroyed)throw rn(this.where,\"Geometry is destroyed; create a new geometry before writing.\");if(!this.inner.owned||this.inner.byteLength===void 0)throw rn(this.where,\"Caller-owned buffer; write it directly.\");Do(this.where,this.inner.byteLength,Lo(t),n),this.inner.owned.write(t,n)}destroyOwned(){var t;l(this,Kn).destroyed=!0,(t=this.inner.owned)==null||t.destroy()}}Kn=new WeakMap;class Jf{constructor(t,n){m(this,\"geometry\");m(this,\"vertexCount\");m(this,\"indexCount\");m(this,\"instanceCount\");m(this,\"vertexBuffers\");m(this,\"indexBuffer\");m(this,\"indexFormat\");m(this,\"vertexBufferLayouts\");m(this,\"topology\");m(this,\"stripIndexFormat\");m(this,\"firstIndex\");m(this,\"baseVertex\");m(this,\"firstVertex\");if(this.geometry=t,this.vertexBuffers=t.vertexBuffers,this.indexBuffer=t.indexBuffer,this.indexFormat=t.indexFormat,this.vertexBufferLayouts=t.vertexBufferLayouts,this.topology=t.topology,this.stripIndexFormat=t.stripIndexFormat,t.indexBuffer){if(n.firstVertex!==void 0||n.vertexCount!==void 0)throw nn(\"geometry.slice\",\"Indexed slice needs firstIndex/indexCount/baseVertex; omit vertex range fields.\");const r=n.firstIndex??0,i=t.indexCount??0,s=n.indexCount??i-r;He(\"geometry.slice\",\"firstIndex\",r,i),He(\"geometry.slice\",\"indexCount\",s,i-r),He(\"geometry.slice\",\"baseVertex\",n.baseVertex??0,Number.MAX_SAFE_INTEGER),this.firstIndex=r,this.indexCount=s,this.baseVertex=n.baseVertex??0,this.vertexCount=t.vertexCount}else{if(n.firstIndex!==void 0||n.indexCount!==void 0||n.baseVertex!==void 0)throw nn(\"geometry.slice\",\"Non-indexed slice needs firstVertex/vertexCount; omit index range fields.\");const r=n.firstVertex??0,i=t.vertexCount??0,s=n.vertexCount??i-r;He(\"geometry.slice\",\"firstVertex\",r,i),He(\"geometry.slice\",\"vertexCount\",s,i-r),this.firstVertex=r,this.vertexCount=s,this.indexCount=t.indexCount}He(\"geometry.slice\",\"instanceCount\",n.instanceCount??t.instanceCount??0,Number.MAX_SAFE_INTEGER),this.instanceCount=n.instanceCount??t.instanceCount,Object.freeze(this)}[sn](t,n){return this.geometry[sn](t,n)}}function ed(e,t){const n=Y(e,\"geometry\"),r=td(t)?t.build(n.device):t;return nd(n,new Ao(n.device,r))}function td(e){return\"build\"in e&&typeof e.build==\"function\"}function nd(e,t){return on(e,t,n=>n.destroy(),n=>{t.onDestroy(n)})}function Ro(e){if(e===\"unorm10-10-10-2\"||e===\"unorm8x4-bgra\")return 4;const t=/^(float|uint|sint|unorm|snorm)(8|16|32)(?:x([234]))?$/.exec(e);if(!t)return 0;const[,n,r,i]=t;return(r===\"32\"?/norm/.test(n):!i||i===\"3\"||r===\"8\"&&n===\"float\")?0:Number(r)/8*Number(i??1)}function rd(e,t,n){var d;if(t.data!==void 0&&t.buffer!==void 0)throw ee(n,\"Choose data or buffer, not both.\");const r=t.stepMode??\"vertex\";if(r!==\"vertex\"&&r!==\"instance\")throw ee(n,`Invalid stepMode: ${String(r)}.`);const i=[],s=[];let o=0;for(const[h,g]of Object.entries(t.attributes)){if(/^\\d+$/.test(h))throw ee(n,`Attribute '${h}' is numeric; use a non-numeric name.`);const b=typeof g==\"string\"?{format:g}:g,v=Ro(b.format);if(!v)throw ee(n,`Unknown GPUVertexFormat '${b.format}'.`);const E=b.offset??o,k=Math.min(4,v);if(!Number.isInteger(E)||E<0||E%k!==0)throw ee(n,`Attribute '${h}' offset ${String(E)} needs ${k}-byte alignment.`);if(b.location!==void 0&&(!Number.isInteger(b.location)||b.location<0||b.location>=e.gpu.limits.maxVertexAttributes))throw ee(n,`Location ${String(b.location)} for '${h}' is outside limit ${e.gpu.limits.maxVertexAttributes}.`);i.push({shaderLocation:b.location??i.length,offset:E,format:b.format}),s.push({name:h,format:b.format,location:b.location}),o+=v}const a=t.stride??cd(o);if(!Number.isInteger(a)||a<=0||a>2048||a%4!==0)throw ee(n,`Stride ${String(a)} must be 4-aligned in [4,2048].`);for(const[h,g]of i.entries()){const b=Ro(g.format);if(g.offset+b>a)throw ee(n,`Attribute '${(d=s[h])==null?void 0:d.name}' (${g.offset}+${b}) exceeds stride ${a}.`)}const c=t.data?Lo(t.data):void 0;if(c!==void 0&&c%a!==0)throw xo(n,`Data byteLength ${c} is not divisible by stride ${a}.`);const u=t.data!==void 0?e.createBuffer({label:t.label,size:Math.max(4,c??0),usage:[\"vertex\",\"copy_dst\"]}):void 0;return u&&t.data&&u.write(t.data),{layout:Object.freeze({arrayStride:a,...t.stepMode?{stepMode:r}:{},attributes:Object.freeze(i)}),attributes:Object.freeze(s),stride:a,stepMode:r,byteLength:c,gpu:(u==null?void 0:u.gpu)??ad(t.buffer,n),owned:u}}function id(e,t,n){if(t.indices!==void 0&&t.indexBuffer!==void 0)throw ee(n,\"Choose indices or indexBuffer, not both.\");if(t.indices===void 0){const c=[t.indexBuffer,t.indexFormat,t.indexCount].filter(u=>u!==void 0).length;if(c!==0&&c!==3)throw ee(n,\"Provide indexBuffer, indexFormat, and indexCount together.\");if(t.indexFormat!==void 0&&t.indexFormat!==\"uint16\"&&t.indexFormat!==\"uint32\")throw ee(n,`Unknown index format '${String(t.indexFormat)}'.`);return t.indexCount!==void 0&&He(n,\"indexCount\",t.indexCount,Number.MAX_SAFE_INTEGER),{gpu:t.indexBuffer,format:t.indexFormat,count:t.indexCount}}if(t.indexFormat!==void 0)throw ee(n,\"indices infer format; omit indexFormat.\");const r=Array.isArray(t.indices)?new Uint32Array(t.indices):t.indices,i=r instanceof Uint16Array?\"uint16\":\"uint32\",s=r.byteLength;if(s%(i===\"uint16\"?2:4)!==0)throw xo(n,`Index byteLength ${s} is invalid for ${i}.`);const o=e.createBuffer({label:t.label?`${t.label}.indices`:void 0,size:Math.max(4,s),usage:[\"index\",\"copy_dst\"]});return o.write(r),{gpu:o.gpu,owned:o,format:i,count:r.length,byteLength:s}}function Co(e,t){let n;for(const r of e)r.stepMode===t&&r.byteLength!==void 0&&(n=Math.min(n??1/0,Math.floor(r.byteLength/r.stride)));return n}function Fo(e,t,n,r){if(n===void 0&&e.some(i=>i.stepMode===t&&i.byteLength===void 0))throw ee(r,`Raw ${t} buffer needs ${t}Count.`)}function Si(e,t,n,r){n!==void 0&&He(e,t,n,r??Number.MAX_SAFE_INTEGER)}function sd(e){for(const t of Object.keys(e))t!==\"destroyed\"&&Object.defineProperty(e,t,{writable:!1,configurable:!1})}const od=new Set([\"point-list\",\"line-list\",\"line-strip\",\"triangle-list\",\"triangle-strip\"]);function ad(e,t){if(!e)throw ee(t,\"Provide geometry buffer data or buffer.\");return e}function Lo(e){return e.byteLength}function cd(e){return e+3&-4}function Do(e,t,n,r){if(!Number.isInteger(r)||r<0||r%4!==0||n%4!==0||r+n>t)throw rn(e,`Write size ${n}/offset ${String(r)} must be 4-aligned within ${t} bytes.`)}function He(e,t,n,r){if(!Number.isInteger(n)||n<0||n>r)throw nn(e,`${t}=${String(n)} must be an integer in [0,${r}].`)}function ud(e){return e.startsWith(\"sint\")?\"i32\":e.startsWith(\"uint\")?\"u32\":\"f32\"}function $r(e){return e.kind===\"scalar\"?e.name:e.kind===\"vector\"||e.kind===\"matrix\"||e.kind===\"atomic\"?$r(e.element):e.kind}const ld=(((Uc=globalThis.GPUShaderStage)==null?void 0:Uc.VERTEX)??1)|(((Mc=globalThis.GPUShaderStage)==null?void 0:Mc.FRAGMENT)??2);class fd{constructor(t,n){m(this,\"device\");m(this,\"size\");m(this,\"buffer\");m(this,\"bindGroupLayout\");m(this,\"bindGroup\");w(this,Xn,!1);this.device=t,this.size=n.size,this.buffer=t.createBuffer({size:n.size,usage:[\"uniform\",\"copy_dst\"],label:n.label}),this.bindGroupLayout=n.bindGroupLayout??Gl(t,{label:n.label?`${n.label}.bgl`:void 0,entries:[oo.uniform(0,n.visibility??ld,{minBindingSize:n.size})]}),this.bindGroup=Ol(t,{label:n.label?`${n.label}.bg`:void 0,layout:this.bindGroupLayout,entries:[oo.resource(0,this.buffer)]})}get gpu(){return this.buffer.gpu}write(t,n=0){this.buffer.write(t,n)}destroy(){l(this,Xn)||(x(this,Xn,!0),this.buffer.destroy())}dispose(){this.destroy()}}Xn=new WeakMap;class dd{constructor(t){m(this,\"gpu\");this.gpu=t}setPipeline(t){this.gpu.setPipeline(t)}setBindGroup(t,n,r){this.gpu.setBindGroup(t,n,r)}setVertexBuffer(t,n,r=0,i){this.gpu.setVertexBuffer(t,md(n),r,i)}draw(t,n=1,r=0,i=0){if(typeof t==\"number\"){this.gpu.draw(t,n,r,i);return}this.gpu.draw(t.vertexCount,t.instanceCount??1,t.firstVertex??0,t.firstInstance??0)}}function hd(e,t){const n=e.gpu.createRenderBundleEncoder({label:t.label,colorFormats:t.colorFormats,depthStencilFormat:t.depthStencilFormat,sampleCount:t.sampleCount,depthReadOnly:t.depthReadOnly,stencilReadOnly:t.stencilReadOnly});return t.record(new dd(n)),n.finish({label:t.label})}function md(e){return e instanceof Se?e.gpu:e}class Uo extends Error{constructor(n,r,i=1,s=1,o=\"error\"){super(r);m(this,\"code\");m(this,\"line\");m(this,\"column\");m(this,\"severity\");m(this,\"metadata\");m(this,\"relatedDiagnostics\");m(this,\"fix\");m(this,\"where\");m(this,\"cause\");this.name=\"VGPUError\",this.code=n,this.line=i,this.column=s,this.severity=o}}function pd(e,t,n={}){const r=new Uo(e,t,n.line??1,n.column??1,n.severity??\"error\");return n.fix!==void 0&&(r.fix=n.fix),n.where!==void 0&&(r.where=n.where),n.cause!==void 0&&(r.cause=n.cause),n.metadata!==void 0&&(r.metadata=n.metadata),r}function N(e,t,n=1,r=1){return new Uo(e,t,n,r)}const gd=new Set([\"fn\",\"struct\",\"const\",\"alias\",\"var\",\"override\"]);function bd(e){var a,c,u,f;const t=[],n=[],r=[];let i=0,s=!1,o=0;for(;i<e.length;){const d=e[i];if(d.text===\"{\"){o++,i++;continue}if(d.text===\"}\"){o=Math.max(0,o-1),i++;continue}if(ki(d)){i++;continue}if(o>0){i++;continue}if(d.text===\"import\"){if(s)throw N(\"VGPU-WGSL-IMP-ORDER\",\"Imports must precede declarations\",d.line,d.column);const[v,E]=yd(e,i);t.push(v),i=E;continue}if(d.text===\"export\"&&((a=e[i+1])==null?void 0:a.text)===\"{\")throw N(\"VGPU-WGSL-EXP-REEXPORT-CYCLE\",\"Re-export cycles are not supported\",d.line,d.column);if(d.text===\"@\"&&((c=e[i+2])==null?void 0:c.text)===\"export\"&&((u=e[i+3])==null?void 0:u.text)===\"@\")throw N(\"VGPU-WGSL-EXP-NOTDECL\",\"Repeated export attributes\",d.line,d.column);const h=d.text===\"export\"||d.text===\"@\"&&((f=e[i+2])==null?void 0:f.text)===\"export\",g=h?wd(e,d.text===\"export\"?i+1:i+3):i,b=e[g];if(b&&gd.has(b.text)){const v=xd(e,g);n.push({name:v,localName:v,kind:b.text}),h&&r.push({name:v,localName:v,kind:b.text}),s=!0,i=g+1;continue}i++}return{imports:t,exports:r,locals:n}}function yd(e,t){var o,a,c,u,f,d,h,g;let n=t+1;const r=[];if(((o=e[n])==null?void 0:o.text)===\"{\"){for(n++;e[n]&&e[n].text!==\"}\";){if(ki(e[n])){n++;continue}const b=Ii(e[n]);let v=b;n++,((a=e[n])==null?void 0:a.text)===\"as\"&&(v=Ii(e[n+1]),n+=2),r.push({imported:b,local:v}),((c=e[n])==null?void 0:c.text)===\",\"&&n++}n++,Ei(e[n],\"from\"),n++}else if(((u=e[n])==null?void 0:u.text)===\"*\")Ei(e[n+1],\"as\"),r.push({imported:\"*\",local:Ii(e[n+2]),namespace:!0}),n+=3,Ei(e[n],\"from\"),n++;else throw((f=e[n])==null?void 0:f.kind)===\"string\"?N(\"VGPU-WGSL-IMP-SIDEEFFECT\",\"Side-effect imports are not supported\",e[n].line,e[n].column):N(\"VGPU-WGSL-IMP-DEFAULT\",\"Default imports are not supported\",(d=e[n])==null?void 0:d.line,(h=e[n])==null?void 0:h.column);const i=e[n];if((i==null?void 0:i.kind)!==\"string\")throw N(\"VGPU-WGSL-RES-NOTFOUND\",\"Import path must be a string\",i==null?void 0:i.line,i==null?void 0:i.column);const s=i.text.slice(1,-1);return n++,((g=e[n])==null?void 0:g.text)===\";\"&&n++,[{from:s,bindings:r,start:e[t].start,end:e[n-1].end},n]}function wd(e,t){var n,r,i,s;for(t=Tr(e,t);((n=e[t])==null?void 0:n.text)===\"@\";){const o=Tr(e,t+1);if(t=Tr(e,o+1),((r=e[t])==null?void 0:r.text)===\"(\"){let a=0;do((i=e[t])==null?void 0:i.text)===\"(\"?a++:((s=e[t])==null?void 0:s.text)===\")\"&&a--,t++;while(e[t]&&a>0);t=Tr(e,t)}}return t}function Tr(e,t){for(;e[t]&&ki(e[t]);)t++;return t}function xd(e,t){var r,i,s,o;let n=t+1;if(((r=e[t])==null?void 0:r.text)===\"var\"&&((i=e[n])==null?void 0:i.text)===\"<\")for(;e[n]&&e[n].text!==\">\";)n++;for(;n<e.length;n++)if(e[n].kind===\"ident\")return e[n].text;throw N(\"VGPU-WGSL-EXP-NOTDECL\",\"Exported declaration has no name\",(s=e[t])==null?void 0:s.line,(o=e[t])==null?void 0:o.column)}function Ei(e,t){if((e==null?void 0:e.text)!==t)throw N(\"VGPU-WGSL-IMP-DEFAULT\",`Expected ${t}`,e==null?void 0:e.line,e==null?void 0:e.column)}function Ii(e){if((e==null?void 0:e.kind)!==\"ident\")throw N(\"VGPU-WGSL-IMP-DEFAULT\",\"Expected identifier\",e==null?void 0:e.line,e==null?void 0:e.column);return e.text}function ki(e){return e.kind===\"lineComment\"||e.kind===\"blockComment\"}function vd(e,t){return t===\"uniform\"||t===\"storage\"?\"buffer\":e.kind===\"sampler\"?\"sampler\":e.kind===\"texture\"?e.textureKind===\"texture_external\"?\"externalTexture\":\"texture\":\"unknown\"}function _d(e,t,n,r,i){if(e===\"buffer\")return Sd(t,n,i);if(r.kind===\"sampler\")return Ed(r);if(r.kind===\"texture\")return r.textureKind===\"texture_external\"?{kind:\"externalTexture\",externalTexture:{}}:r.textureKind.startsWith(\"texture_storage_\")?Id(r):kd(r)}function Sd(e,t,n){return{kind:\"buffer\",buffer:{type:e===\"uniform\"?\"uniform\":t===\"read\"?\"read-only-storage\":\"storage\",hasDynamicOffset:!1,minBindingSize:n==null?void 0:n.size}}}function Ed(e){return{kind:\"sampler\",sampler:{type:e.comparison?\"comparison\":\"filtering\"}}}function Id(e){return{kind:\"storageTexture\",storageTexture:{access:Td(e.access),format:e.texelFormat??\"rgba8unorm\",viewDimension:Mo(e.dimension)}}}function kd(e){return{kind:\"texture\",texture:{sampleType:$d(e),viewDimension:Mo(e.dimension),multisampled:e.dimension===\"multisampled_2d\"||e.dimension===\"depth_multisampled_2d\"}}}function $d(e){if(e.textureKind.startsWith(\"texture_depth_\"))return\"depth\";const t=e.sampleType;return(t==null?void 0:t.kind)===\"scalar\"&&t.name===\"i32\"?\"sint\":(t==null?void 0:t.kind)===\"scalar\"&&t.name===\"u32\"?\"uint\":\"unfilterable-float\"}function Mo(e){switch(e){case\"1d\":return\"1d\";case\"2d_array\":case\"depth_2d_array\":return\"2d-array\";case\"cube\":case\"depth_cube\":return\"cube\";case\"cube_array\":case\"depth_cube_array\":return\"cube-array\";case\"3d\":return\"3d\";default:return\"2d\"}}function Td(e){return e===\"read\"?\"read-only\":e===\"read_write\"?\"read-write\":\"write-only\"}const Pd=\"VGPU-WGSL-IDENT-NONASCII\",Ad=\"https://github.com/vercel-labs/vgpu/issues/294\";function Rd(e,t){const n=[];let r=0,i=1,s=1;const o=(c,u,f,d,h)=>n.push({kind:c,text:e.slice(u,f),start:u,end:f,line:d,column:h}),a=()=>{e[r]===`\n`?(i++,s=1):s++,r++};for(;r<e.length;){const c=e[r];if(/\\s/.test(c)){a();continue}const u=r,f=i,d=s;if(c===\"/\"&&e[r+1]===\"/\"){for(;r<e.length&&e[r]!==`\n`;)a();o(\"lineComment\",u,r,f,d);continue}if(c===\"/\"&&e[r+1]===\"*\"){let h=0;for(;r<e.length;){if(e[r]===\"/\"&&e[r+1]===\"*\"){h++,a(),a();continue}if(e[r]===\"*\"&&e[r+1]===\"/\"){if(h--,a(),a(),h===0){o(\"blockComment\",u,r,f,d);break}continue}a()}if(h!==0)throw N(\"VGPU-WGSL-LEX-UNTERM-COMMENT\",\"Unterminated block comment\",f,d);continue}if(c==='\"'||c===\"'\"){const h=c;for(a();r<e.length&&e[r]!==h;){if(e[r]===`\n`)throw N(\"VGPU-WGSL-LEX-UNTERM-STRING\",\"Unterminated string\",f,d);e[r]===\"\\\\\"&&a(),a()}if(r>=e.length)throw N(\"VGPU-WGSL-LEX-UNTERM-STRING\",\"Unterminated string\",f,d);a(),o(\"string\",u,r,f,d);continue}if(/[A-Za-z_]/.test(c)){for(;r<e.length&&/[A-Za-z0-9_]/.test(e[r]);)a();const h=e.slice(u,r);o(js.has(h)?\"keyword\":\"ident\",u,r,f,d);continue}if(/[0-9]/.test(c)||c===\".\"&&/[0-9]/.test(e[r+1]??\"\")){for(c===\".\"&&a();r<e.length;){const h=e[r];if(/[A-Za-z0-9_.]/.test(h)){a();continue}if((h===\"+\"||h===\"-\")&&Fd(e[r-1])&&/[0-9]/.test(e[r+1]??\"\")){a();continue}break}o(\"number\",u,r,f,d);continue}if(c.charCodeAt(0)>127)throw Cd(e,r,i,s,t);a(),o(\"punct\",u,r,f,d)}return n}function Cd(e,t,n,r,i){let s=t;for(;s>0&&Go(e[s-1]);)s--;let o=t+1;for(;o<e.length&&Go(e[o]);)o++;const a=e.slice(s,o),c=r-(t-s),u=i===void 0?\"\":` in ${i}`,f=pd(Pd,`Non-ASCII identifier '${a}'${u} at line ${n} column ${c}; vgpu's WGSL pipeline supports ASCII identifiers only`,{fix:`Rename '${a}' using ASCII letters, digits and '_'. Unicode (XID) identifiers are tracked in ${Ad}`,line:n,column:c});return f.range={file:i,start:{line:n,column:c}},f}function Go(e){return e.charCodeAt(0)>127||/[A-Za-z0-9_]/.test(e)}function Fd(e){return e===\"e\"||e===\"E\"||e===\"p\"||e===\"P\"}const ge=(1n<<64n)-1n,xt=11400714785074694791n,Gn=14029467366897019727n,Oo=1609587929392839161n,Vo=9650029242287828579n,No=2870177450012600261n;function Ld(e,t=0n){const n=new TextEncoder().encode(e);let r=0,i;if(n.length>=32){let s=t+xt+Gn,o=t+Gn,a=t,c=t-xt;const u=n.length-32;do s=an(s,On(n,r)),r+=8,o=an(o,On(n,r)),r+=8,a=an(a,On(n,r)),r+=8,c=an(c,On(n,r)),r+=8;while(r<=u);i=Ke(s,1n)+Ke(o,7n)+Ke(a,12n)+Ke(c,18n),i=Pr(i,s),i=Pr(i,o),i=Pr(i,a),i=Pr(i,c)}else i=t+No;for(i=i+BigInt(n.length)&ge;r+8<=n.length;)i^=an(0n,On(n,r)),i=Ke(i,27n)*xt+Vo&ge,r+=8;for(r+4<=n.length&&(i^=Dd(n,r)*xt&ge,i=Ke(i,23n)*Gn+Oo&ge,r+=4);r<n.length;)i^=BigInt(n[r])*No&ge,i=Ke(i,11n)*xt&ge,r++;return i^=i>>33n,i=i*Gn&ge,i^=i>>29n,i=i*Oo&ge,i^=i>>32n,i.toString(16).padStart(16,\"0\")}function an(e,t){return Ke(e+t*Gn&ge,31n)*xt&ge}function Pr(e,t){return e^=an(0n,t),e*xt+Vo&ge}function Ke(e,t){return(e<<t|e>>64n-t)&ge}function On(e,t){let n=0n;for(let r=7;r>=0;r--)n=(n<<8n)+BigInt(e[t+r]);return n}function Dd(e,t){return BigInt(e[t])|BigInt(e[t+1])<<8n|BigInt(e[t+2])<<16n|BigInt(e[t+3])<<24n}function Ud(e){return Ld(e)}function Md(e){return Ud(e).slice(0,8)}function Gd(e,t){return`_vgsl_${Md(e)}__${t}`}function he(e,t){const n=e.find(s=>s.name===t);if(!n)return;const r=n.args.map(s=>s.text).join(\"\"),i=Number(r.replace(/[ui]$/,\"\"));return Number.isFinite(i)?i:void 0}function $i(e){const t=[[]];let n=0,r=0;for(const i of e){if(i.text===\"<\"?n++:i.text===\">\"?n=Math.max(0,n-1):i.text===\"(\"?r++:i.text===\")\"&&(r=Math.max(0,r-1)),i.text===\",\"&&n===0&&r===0){t.push([]);continue}t[t.length-1].push(i)}return t.map(Bo).filter(i=>i.length>0)}function Bo(e){let t=0,n=e.length;for(;t<n&&e[t].text===\",\";)t++;for(;n>t&&e[n-1].text===\",\";)n--;return e.slice(t,n)}function Od(e){if(e!==void 0&&zo(e))return Number(e.replace(/[ui]$/,\"\"))}function zo(e){return/^(0|[1-9][0-9]*)([ui])?$/.test(e)}function qo(e){if(e===\"read\"||e===\"write\"||e===\"read_write\")return e}function Vd(e){return[\"f32\",\"f16\",\"i32\",\"u32\",\"bool\"].find(t=>t===e)}function Nd(e){return{kind:\"scalar\",name:e===\"f\"?\"f32\":e===\"h\"?\"f16\":e===\"i\"?\"i32\":\"u32\"}}function jo(e){return e===\"f16\"?2:4}function Ar(e,t){return Math.ceil(t/e)*e}function Ie(e){var s;const t=Bo(e);if(t.length===0)throw N(\"VGPU-WGSL-REFLECT-TYPE\",\"Expected WGSL type\");const n=t.map(o=>o.text).join(\"\"),r=Bd(n);if(r)return r;if(((s=t[1])==null?void 0:s.text)===\"<\"){const o=t[0].text,a=$i(t.slice(2,-1)),c=zd(o,a);if(c)return c}const i=qd(n);return i||jd(n)}function Bd(e){const t=Vd(e);if(t)return{kind:\"scalar\",name:t};const n=e.match(/^vec([234])([fiuh])$/);if(n)return{kind:\"vector\",width:Number(n[1]),element:Nd(n[2])};const r=e.match(/^mat([234])x([234])([fh])$/);if(r){const i=r[3]===\"h\"?{kind:\"scalar\",name:\"f16\"}:{kind:\"scalar\",name:\"f32\"};return{kind:\"matrix\",columns:Number(r[1]),rows:Number(r[2]),element:i}}}function zd(e,t){var n,r,i,s,o;if(e===\"array\"){const a=(n=t[1])==null?void 0:n.map(u=>u.text).join(\"\"),c=a===void 0?void 0:Od(a);return{kind:\"array\",element:Ie(t[0]??[]),count:c,countExpression:a}}if(e===\"atomic\")return{kind:\"atomic\",element:Ie(t[0]??[])};if(e===\"vec2\"||e===\"vec3\"||e===\"vec4\")return{kind:\"vector\",width:Number(e.slice(3)),element:Ie(t[0]??[])};if(/^mat[234]x[234]$/.test(e))return{kind:\"matrix\",columns:Number(e[3]),rows:Number(e[5]),element:Ie(t[0]??[])};if(e===\"ptr\")return{kind:\"ptr\",addressSpace:((r=t[0])==null?void 0:r.map(a=>a.text).join(\"\"))??\"\",element:Ie(t[1]??[]),access:(i=t[2])==null?void 0:i.map(a=>a.text).join(\"\")};if(e===\"sampler\")return{kind:\"sampler\",comparison:!1};if(e.startsWith(\"texture_storage_\"))return{kind:\"texture\",textureKind:e,dimension:e.slice(16),texelFormat:(s=t[0])==null?void 0:s.map(a=>a.text).join(\"\"),access:qo((o=t[1])==null?void 0:o.map(a=>a.text).join(\"\"))};if(e.startsWith(\"texture_\"))return{kind:\"texture\",textureKind:e,dimension:e.slice(8),sampleType:t[0]?Ie(t[0]):void 0}}function qd(e){if(e===\"sampler\"||e===\"sampler_comparison\")return{kind:\"sampler\",comparison:e===\"sampler_comparison\"};if(e===\"texture_external\")return{kind:\"texture\",textureKind:e};if(e.startsWith(\"texture_depth_\"))return{kind:\"texture\",textureKind:e,dimension:e.slice(8)};if(e.startsWith(\"texture_\"))return{kind:\"texture\",textureKind:e,dimension:e.slice(8)}}function jd(e){return{kind:\"identifier\",name:e}}function Xe(e){if((e==null?void 0:e.kind)!==\"ident\"&&(e==null?void 0:e.kind)!==\"keyword\")throw N(\"VGPU-WGSL-REFLECT-PARSE\",\"Expected identifier\",e==null?void 0:e.line,e==null?void 0:e.column);return e.text}function Ye(e,t,n){var r,i;for(let s=t;s<e.length;s++)if(e[s].text===n)return s;throw N(\"VGPU-WGSL-REFLECT-PARSE\",`Expected ${n}`,(r=e[t])==null?void 0:r.line,(i=e[t])==null?void 0:i.column)}function Wd(e,t,n,r){for(let i=t;i<n;i++)if(e[i].text===r)return i}function Rr(e,t,n){let r=0;for(let i=t;i<e.length;i++)if((e[i].text===\"{\"||e[i].text===\"(\")&&r++,(e[i].text===\"}\"||e[i].text===\")\")&&(r=Math.max(0,r-1)),r===0&&e[i].text===n)return i;return e.length}function Cr(e,t){var s,o;const n=e[t].text,r=n===\"(\"?\")\":n===\"{\"?\"}\":\">\";let i=0;for(let a=t;a<e.length;a++)if(e[a].text===n&&i++,e[a].text===r&&(i--,i===0))return a;throw N(\"VGPU-WGSL-REFLECT-PARSE\",`Unclosed ${n}`,(s=e[t])==null?void 0:s.line,(o=e[t])==null?void 0:o.column)}function Fr(e,t){var i,s;const n=[];let r=t;for(;((i=e[r])==null?void 0:i.text)===\"@\";){const o=e[r],a=Xe(e[r+1]);r+=2;let c=[];if(((s=e[r])==null?void 0:s.text)===\"(\"){const u=Cr(e,r);c=e.slice(r+1,u),r=u+1}n.push({name:a,args:c,token:o})}return[n,r]}function cn(e){switch(e.kind){case\"scalar\":return e.name;case\"identifier\":return e.name;case\"vector\":return`vec${e.width}<${cn(e.element)}>`;case\"matrix\":return`mat${e.columns}x${e.rows}<${cn(e.element)}>`;case\"array\":return`array<${cn(e.element)}${e.count===void 0?\"\":`,${e.count}`}>`;default:return e.kind}}function Hd(e){const t=e.find(r=>r.name===\"workgroup_size\");if(!t)return;const n=$i(t.args).map(r=>Number(r.map(i=>i.text).join(\"\")));return[n[0]??1,n[1]??1,n[2]??1]}function Kd(e,t){var i;if(((i=e[t])==null?void 0:i.text)!==\"<\")return{after:t};const n=Ye(e,t,\">\"),r=$i(e.slice(t+1,n)).map(s=>s.map(o=>o.text).join(\"\"));return{addressSpace:r[0],access:qo(r[1]),after:n+1}}function Xd(e){var f,d,h,g;const t=[],n=[],r=[],i=[],s=[],o=[],a=e.tokens.filter(b=>b.kind!==\"lineComment\"&&b.kind!==\"blockComment\");let c=0,u=0;for(;c<a.length;){const b=a[c];if(b.text===\"{\"){u++,c++;continue}if(b.text===\"}\"){u=Math.max(0,u-1),c++;continue}if(u>0){c++;continue}const v=c;let E;((f=a[c])==null?void 0:f.text)===\"export\"?(c++,[E,c]=Fr(a,c)):([E,c]=Fr(a,c),((d=a[c])==null?void 0:d.text)===\"export\"&&c++);const k=(h=a[c])==null?void 0:h.text;if(k===\"enable\"){((g=a[c+1])==null?void 0:g.kind)===\"ident\"&&o.push(a[c+1].text),c=Rr(a,c,\";\")+1;continue}if(k===\"struct\"){const I=Yd(e,a,c);I.item&&t.push(I.item),c=I.next;continue}if(k===\"alias\"){const I=Qd(e,a,c);I.item&&n.push(I.item),c=I.next;continue}if(k===\"var\"){const I=Zd(e,a,c,E);I.item&&r.push(I.item),c=I.next;continue}if(k===\"fn\"){const I=Jd(e,a,c,E,v);I.item&&i.push(I.item),c=I.next;continue}if(k===\"override\"){const I=th(a,c,E);I.item&&s.push(I.item),c=I.next;continue}c=Math.max(v+1,c+1)}return{structs:t,aliases:n,vars:r,entries:i,overrides:s,features:o}}function Yd(e,t,n,r){const i=Xe(t[n+1]),s=Ye(t,n+2,\"{\"),o=Cr(t,s);return{item:{name:i,originalName:i,mangledName:Ti(e,i,\"struct\"),members:nh(t.slice(s+1,o)),path:e.path},next:o+1}}function Qd(e,t,n,r){const i=Xe(t[n+1]),s=Ye(t,n+2,\"=\"),o=Rr(t,s+1,\";\");return{item:{name:i,originalName:i,mangledName:Ti(e,i,\"alias\"),target:Ie(t.slice(s+1,o)),path:e.path},next:o+1}}function Zd(e,t,n,r){const{addressSpace:i,access:s,after:o}=Kd(t,n+1),a=Xe(t[o]),c=Ye(t,o+1,\":\"),u=Rr(t,c+1,\";\");return{item:{path:e.path,name:a,mangledName:rh(r)?a:Ti(e,a,\"var\"),attrs:r,addressSpace:i,access:s,type:Ie(t.slice(c+1,u))},next:u+1}}function Jd(e,t,n,r,i=n){var d;const s=Xe(t[n+1]),o=(d=r.find(h=>h.name===\"vertex\"||h.name===\"fragment\"||h.name===\"compute\"))==null?void 0:d.name;if(!o)return{item:void 0,next:n+1};const a=Ye(t,n+2,\"(\"),c=Cr(t,a),u=Ye(t,c+1,\"{\"),f=Cr(t,u);return{item:{name:s,mangledName:s,stage:o,workgroupSize:Hd(r),path:e.path,params:eh(t.slice(a+1,c)),declarationStartToken:t[i],declarationEndToken:t[f]},next:f+1}}function eh(e){const t=[];let n=0;for(;n<e.length;){const[r,i]=Fr(e,n);if(n=i,!e[n]||e[n].text===\",\"){n++;continue}const s=Xe(e[n]),o=Ye(e,n+1,\":\");let a=o+1,c=0;for(;a<e.length&&(e[a].text===\"<\"&&c++,e[a].text===\">\"&&(c=Math.max(0,c-1)),!(c===0&&e[a].text===\",\"));)a++;t.push({name:s,attrs:r,type:Ie(e.slice(o+1,a))}),n=a+1}return t}function th(e,t,n){const r=Xe(e[t+1]),i=Rr(e,t+1,\";\"),s=Wd(e,t+2,i,\"=\");return{item:{name:r,mangledName:r,id:he(n,\"id\"),defaultValue:s===void 0?void 0:e.slice(s+1,i).map(o=>o.text).join(\"\")},next:i+1}}function nh(e){const t=[];let n=0;for(;n<e.length;){const[r,i]=Fr(e,n);if(n=i,!e[n]||e[n].text===\",\"||e[n].text===\";\"){n++;continue}const s=Xe(e[n]),o=Ye(e,n+1,\":\");let a=o+1,c=0;for(;a<e.length&&(e[a].text===\"<\"&&c++,e[a].text===\">\"&&(c=Math.max(0,c-1)),!(c===0&&(e[a].text===\",\"||e[a].text===\";\")));)a++;t.push({name:s,attrs:r,type:Ie(e.slice(o+1,a)),align:he(r,\"align\"),size:he(r,\"size\")}),n=a+1}return t}function Ti(e,t,n){return n===\"override\"?t:Gd(e.path,t)}function rh(e){return he(e,\"group\")!==void 0||he(e,\"binding\")!==void 0}const ih=\"literal length required for auto layout; use draw.group(n, bg) manual binding\",sh=\"VGPUError: `bool` is not host-shareable in uniform/storage. Fix: use `u32` (0 | 1) → struct Params { enabled: u32 }\",Wo=\"use a manual group claim (`draw.group(n, bg)`)\";function oh(e=1,t=1){return N(\"VGPU-WGSL-REFLECT-ARRAY-LENGTH\",ih,e,t)}function Ho(e=1,t=1){return N(\"VGPU-WGSL-REFLECT-BOOL-HOST-SHAREABLE\",sh,e,t)}function Lr(e,t,n=1,r=1){return N(\"VGPU-WGSL-REFLECT-UNKNOWN-TYPE\",`type '${e}' is unknown in ${t}; ${Wo}`,n,r)}function Ko(e,t,n=1,r=1){return N(\"VGPU-WGSL-REFLECT-NS-TYPE\",`type '${e}' is a namespace-member import; use a named import or manual @group(1+) binding`,n,r)}function Xo(e,t=1,n=1){return N(\"VGPU-WGSL-REFLECT-NON-HOST-SHAREABLE\",`Type ${e} is not host-shareable; ${Wo}`,t,n)}const un=\"wgsl-host-shareable-v1\";function ah(e,t,n){var o,a,c;const r=new Map;for(const u of t){const f=new Map;for(const d of[...u.structs,...u.aliases])f.set(d.originalName,{path:d.path,name:d.originalName,mangledName:d.mangledName,kind:\"members\"in d?\"struct\":\"alias\"});r.set(((o=u.structs[0])==null?void 0:o.path)??((a=u.aliases[0])==null?void 0:a.path)??((c=u.vars[0])==null?void 0:c.path)??\"\",f)}const i=new Map(e.map(u=>[u.path,r.get(u.path)??new Map])),s=new Map;for(const u of e){const f=new Map(i.get(u.path));for(const d of u.parsed.imports)ch(u,d,f,e,i);s.set(u.path,f)}return s}function ch(e,t,n,r,i,s){const o=lh(t,e.path,r),a=i.get(o);for(const c of t.bindings){if(c.namespace){n.set(c.local,{path:o,name:c.local,mangledName:c.local,kind:\"namespace\"});continue}const u=a==null?void 0:a.get(c.imported);u&&n.set(c.local,u)}}function uh(e,t){const n=new Map,r=new Map,i=new Map;for(const s of e){for(const o of s.structs){const a={name:o.name,mangledName:o.mangledName,members:o.members.map(c=>({name:c.name,type:vt(c.type,o.path,t),align:c.align,size:c.size}))};n.set(o.mangledName,a),i.set(o.mangledName,a)}for(const o of s.aliases){const a={name:o.name,mangledName:o.mangledName,target:vt(o.target,o.path,t)};r.set(o.mangledName,a),i.set(o.mangledName,a)}}return{structs:n,aliases:r,byMangled:i}}function vt(e,t,n,r){var i,s;switch(e.kind){case\"identifier\":{const o=e.name.indexOf(\".\");if(o>0){const c=e.name.slice(0,o),u=(i=n.get(t))==null?void 0:i.get(c);if((u==null?void 0:u.kind)===\"namespace\")throw Ko(e.name)}const a=(s=n.get(t))==null?void 0:s.get(e.name);if((a==null?void 0:a.kind)===\"namespace\")throw Ko(e.name);if(!a)throw Lr(e.name,t);return{kind:\"identifier\",name:a.name,mangledName:a.mangledName}}case\"array\":case\"atomic\":case\"vector\":case\"matrix\":case\"ptr\":return{...e,element:vt(e.element,t,n)};case\"texture\":return{...e,sampleType:e.sampleType?vt(e.sampleType,t,n):void 0};default:return e}}function Pi(e,t){if(!t||e.kind!==\"identifier\")return e;const n=t.aliases.get(e.mangledName??e.name);return n?Pi(n.target,t):e}function Dr(e,t){const n=Pi(e,t);switch(n.kind){case\"array\":case\"atomic\":case\"vector\":case\"matrix\":case\"ptr\":return{...n,element:Dr(n.element,t)};case\"texture\":return{...n,sampleType:n.sampleType?Dr(n.sampleType,t):void 0};default:return n}}function lh(e,t,n,r){const i=void 0;if(i!==void 0&&n.some(u=>u.path===i))return i;const s=e.from,o=t.slice(0,t.lastIndexOf(\"/\")+1),a=s.startsWith(\"/\")?s:fh(`${o}${s}`);return[s,a].find(u=>n.some(f=>f.path===u))??i??a}function $b(e,t,n){}function fh(e){const t=e.startsWith(\"/\"),n=[];for(const r of e.split(\"/\"))!r||r===\".\"||(r===\"..\"?n.pop():n.push(r));return`${t?\"/\":\"\"}${n.join(\"/\")}`}function Vn(e,t=cn(e),n=t,r){const i=r?Dr(e,r):e;return dh(i,t,n,r)}function dh(e,t,n,r){switch(e.kind){case\"scalar\":return hh(e,t,n);case\"atomic\":return mh(e,t,n);case\"vector\":return ph(e,t,n,r);case\"matrix\":return gh(e,t,n,r);case\"array\":return bh(e,t,n,r);case\"identifier\":return wh(e,t,n,r);default:throw Xo(cn(e))}}function hh(e,t,n){const r=jo(e.name);if(e.name===\"bool\")throw Ho();return{name:t,mangledName:n,layoutMode:un,type:e,align:r,size:r}}function mh(e,t,n){return{name:t,mangledName:n,layoutMode:un,type:e,align:4,size:4}}function ph(e,t,n,r){const s=Vn(e.element,t,n,r).size??4,o=e.width===2?s*2:s*4;return{name:t,mangledName:n,layoutMode:un,type:e,align:o,size:s*e.width}}function gh(e,t,n,r){const i={kind:\"vector\",width:e.rows,element:e.element},s=Vn(i,`${t}[]`,`${n}[]`,r),o=Ar(s.align,s.size??0);return{name:t,mangledName:n,layoutMode:un,type:e,align:s.align,size:o*e.columns,stride:o,element:s}}function bh(e,t,n,r){yh(e.countExpression);const i=Vn(e.element,`${t}[]`,`${n}[]`,r),s=Ar(Qe(e.element,r),i.size??0);return{name:t,mangledName:n,layoutMode:un,type:e,align:Qe(e,r),size:e.count===void 0?void 0:s*e.count,stride:s,element:i,runtimeSized:e.count===void 0}}function yh(e){if(e!==void 0&&!zo(e))throw oh()}function wh(e,t,n,r){if(!r)throw Lr(e.name,\"<unknown>\");const i=r.structs.get(e.mangledName??e.name);if(!i)throw Lr(e.name,\"<unknown>\");const s=[];let o=0,a=1;for(const c of i.members){const u=xh(c,o,r);s.push(u.member),o=u.offset+(u.member.size??0),a=Math.max(a,u.member.align)}return{name:t,mangledName:n,layoutMode:un,type:e,align:a,size:Ar(a,o),members:s}}function xh(e,t,n){const r=Vn(e.type,e.name,e.name,n),i=Math.max(Qe(e.type,n),e.align??1),s=Math.max(r.size??0,e.size??0),o=Ar(i,t);return{member:{name:e.name,offset:o,align:i,size:s,type:e.type,layout:r,explicitAlign:e.align,explicitSize:e.size},offset:o}}function Qe(e,t){const n=t?Dr(e,t):e;switch(n.kind){case\"scalar\":return vh(n.name);case\"atomic\":return 4;case\"vector\":return n.width===2?Qe(n.element,t)*2:Qe(n.element,t)*4;case\"matrix\":return Qe({kind:\"vector\",width:n.rows,element:n.element},t);case\"array\":return Qe(n.element,t);case\"identifier\":return _h(n,t);default:throw Xo(cn(n))}}function vh(e){if(e===\"bool\")throw Ho();return jo(e)}function _h(e,t){const n=t==null?void 0:t.structs.get(e.mangledName??e.name);if(!n)throw Lr(e.name,\"<unknown>\");return Math.max(1,...n.members.map(r=>Math.max(Qe(r.type,t),r.align??1)))}const Sh=/^_vgsl_[0-9a-f]{8,16}__[A-Za-z_][A-Za-z0-9_]*$/,Eh=new Set([\"fn\",\"struct\",\"const\",\"alias\",\"var\",\"override\"]);function Yo(e){return new Ih(e).analyze()}class Ih{constructor(t){m(this,\"tokens\");m(this,\"scopes\",[]);m(this,\"declarations\",[]);m(this,\"references\",[]);m(this,\"functions\",[]);m(this,\"preserved\",new Map);m(this,\"symbolsByScope\",new Map);m(this,\"moduleFallbackReasons\",[]);m(this,\"pendingSymbols\",[]);m(this,\"moduleScopeId\");this.tokens=t,this.moduleScopeId=this.createScope(\"module\",void 0,void 0,0)}analyze(){this.collectTopLevel();for(const t of this.functions)this.walkFunction(t);return{tokens:this.tokens,scopes:this.scopes,declarations:this.declarations,references:this.references,functions:this.functions,preservedTokens:[...this.preserved.entries()].map(([t,n])=>({tokenIndex:t,reason:n})),fallback:{wholeModule:this.moduleFallbackReasons.length>0,reasons:this.moduleFallbackReasons}}}collectTopLevel(){let t=0;for(let n=0;n<this.tokens.length;n++){const r=this.tokens[n];if(!Ue(r)){if(r.text===\"{\"){t++;continue}if(r.text===\"}\"){t--,t<0&&(this.moduleFallback(\"unmatched top-level closing brace\",n),t=0);continue}if(t===0){if(r.text===\"@\"){n=this.preserveAttribute(n);continue}if(r.text===\"enable\"||r.text===\"requires\"||r.text===\"diagnostic\"||r.text===\"const_assert\"){n=this.preserveStatement(n,\"directive\");continue}if(r.text!==\"export\"){if(r.text===\"struct\"){n=this.collectStruct(n);continue}if(r.text===\"fn\"){n=this.collectFunction(n);continue}if(r.text===\"const\"||r.text===\"alias\"||r.text===\"var\"||r.text===\"override\"){n=this.preserveGlobalDeclaration(n);continue}r.kind===\"keyword\"&&!Eh.has(r.text)&&this.moduleFallback(`unexpected top-level keyword '${r.text}'`,n)}}}}t!==0&&this.moduleFallback(\"unclosed top-level brace\",this.tokens.length-1),this.scopes[this.moduleScopeId].endToken=Math.max(0,this.tokens.length-1)}collectStruct(t){var s,o,a;const n=this.nextSig(t);if(n===void 0||((s=this.tokens[n])==null?void 0:s.kind)!==\"ident\")return this.moduleFallback(\"struct without name\",t),t;this.preserveToken(n,\"global\");const r=this.nextSig(n);if(r===void 0||((o=this.tokens[r])==null?void 0:o.text)!==\"{\")return this.moduleFallback(\"struct without body\",t),n;const i=this.findMatching(r,\"{\",\"}\");if(i===void 0)return this.moduleFallback(\"unclosed struct body\",r),r;for(let c=r;c<=i;c++)((a=this.tokens[c])==null?void 0:a.kind)===\"ident\"&&this.preserveToken(c,\"struct\");return i}collectFunction(t){var f,d;const n=this.nextSig(t);if(n===void 0||((f=this.tokens[n])==null?void 0:f.kind)!==\"ident\")return this.moduleFallback(\"function without name\",t),t;const r=this.tokens[n].text,i=Sh.test(r)&&!this.hasEntryAttributeBefore(t);this.addDeclaration(r,\"function\",n,this.moduleScopeId,void 0,i),i||this.preserveToken(n,\"global\");const s=this.nextSig(n);if(s===void 0||((d=this.tokens[s])==null?void 0:d.text)!==\"(\")return this.moduleFallback(\"function without parameter list\",n),n;const o=this.findMatching(s,\"(\",\")\");if(o===void 0)return this.moduleFallback(\"unclosed function parameter list\",s),s;const a=this.findNextText(o+1,\"{\");if(a===void 0)return this.moduleFallback(\"function without body\",o),o;this.preserveFunctionSignatureTail(o+1,a);const c=this.findMatching(a,\"{\",\"}\");if(c===void 0)return this.moduleFallback(\"unclosed function body\",a),a;const u=this.createScope(\"function\",this.moduleScopeId,this.functions.length,s);return this.functions.push({id:this.functions.length,name:r,nameTokenIndex:n,scopeId:u,bodyStartToken:a,bodyEndToken:c,skipped:!1,fallbackReasons:[]}),this.collectParams(s,o,u,this.functions.length-1),this.scopes[u].endToken=c,c}collectParams(t,n,r,i){var s;for(let o=t+1;o<n;o++){const a=this.tokens[o];if(!Ue(a)){if(a.text===\"@\"){o=this.preserveAttribute(o);continue}if(a.kind===\"ident\"&&this.nextSig(o)!==void 0&&((s=this.tokens[this.nextSig(o)])==null?void 0:s.text)===\":\"){this.addDeclaration(a.text,\"param\",o,r,i,!0);const c=this.nextSig(o);o=this.preserveTypeFrom(c+1,[\",\",\")\"],n)}}}}preserveFunctionSignatureTail(t,n){for(let r=t;r<n;r++){const i=this.tokens[r];if(!Ue(i)){if(i.text===\"@\"){r=this.preserveAttribute(r);continue}i.kind===\"ident\"&&this.preserveToken(r,\"type\")}}}preserveGlobalDeclaration(t){var s,o,a;let n=t+1;if(((s=this.tokens[t])==null?void 0:s.text)===\"var\"){const c=this.nextSig(t);if(c!==void 0&&((o=this.tokens[c])==null?void 0:o.text)===\"<\"){const u=this.findMatching(c,\"<\",\">\");if(u===void 0)return this.moduleFallback(\"unparseable top-level var template\",c),c;this.preserveRange(c,u,\"type\"),n=u+1}}const r=this.findNextIdent(n);r!==void 0&&(this.preserveToken(r,\"global\"),this.addDeclaration(this.tokens[r].text,\"global\",r,this.moduleScopeId,void 0,!1));const i=this.findStatementEnd(t);for(let c=t;c<=i;c++)((a=this.tokens[c])==null?void 0:a.kind)===\"ident\"&&this.preserveToken(c,\"global\");return i}walkFunction(t){var a,c,u;const n=[this.moduleScopeId,t.scopeId],r=[],i=(f,d)=>{const h=this.createScope(f,n[n.length-1],t.id,d);return n.push(h),h},s=f=>{if(n.length<=2){this.functionFallback(t,\"scope frame underflow\",f);return}const d=n.pop();return this.scopes[d].endToken=f,d};i(\"block\",t.bodyStartToken);let o=1;for(let f=t.bodyStartToken+1;f<t.bodyEndToken;f++){this.activatePendingSymbols(f);const d=this.tokens[f];if(Ue(d))continue;if(d.text===\"@\"){f=this.preserveAttribute(f);continue}if(d.text===\".\"){const g=this.nextSig(f);g!==void 0&&((a=this.tokens[g])==null?void 0:a.kind)===\"ident\"&&this.preserveToken(g,\"member\");continue}if(d.text===\"enable\"||d.text===\"requires\"||d.text===\"diagnostic\"){f=this.preserveStatement(f,\"directive\");continue}if(d.text===\"for\"){const g=i(\"for-init\",f),b=this.nextSig(f);(b===void 0||((c=this.tokens[b])==null?void 0:c.text)!==\"(\")&&this.functionFallback(t,\"for without parenthesized header\",f),r.push({scopeId:g,headerDepth:0,awaitingBody:!1});continue}const h=r[r.length-1];if(h&&h.bodyDepth===void 0&&(d.text===\"(\"&&h.headerDepth++,d.text===\")\"&&(h.headerDepth--,h.headerDepth<=0&&(h.awaitingBody=!0))),d.text===\"{\"){o++;const g=kh(r,b=>b.awaitingBody&&b.bodyDepth===void 0);g&&(g.bodyDepth=o),i(\"block\",f);continue}if(d.text===\"}\"){const g=o;for(s(f),o--;r.length>0&&r[r.length-1].bodyDepth===g;)s(f),r.pop();o<0&&this.functionFallback(t,\"unmatched closing brace\",f);continue}if(d.text===\":\"){f=this.preserveTypeFrom(f+1,[\"=\",\";\",\",\",\")\",\"{\"],t.bodyEndToken);continue}if(d.text===\"-\"&&((u=this.tokens[this.nextSig(f)??-1])==null?void 0:u.text)===\">\"){f=this.preserveTypeFrom((this.nextSig(f)??f)+1,[\"{\"],t.bodyEndToken);continue}if(d.text===\"let\"||d.text===\"const\"||d.text===\"var\"){f=this.collectLocalDeclaration(f,n[n.length-1],t);continue}if(d.kind===\"ident\"&&!this.preserved.has(f)){const g=this.resolve(d.text,n);g!==void 0?this.references.push({name:d.text,tokenIndex:f,declarationId:g,scopeId:n[n.length-1],functionId:t.id}):this.preserveToken(f,\"unknown\")}}for(;n.length>2;)s(t.bodyEndToken)}collectLocalDeclaration(t,n,r){var c,u;const i=this.tokens[t].text;let s=t+1;if(i===\"var\"){const f=this.nextSig(t);if(f!==void 0&&((c=this.tokens[f])==null?void 0:c.text)===\"<\"){const d=this.findMatching(f,\"<\",\">\");if(d===void 0)return this.functionFallback(r,\"unparseable var template\",f),f;this.preserveRange(f,d,\"type\"),s=d+1}}const o=this.findNextIdent(s);if(o===void 0||o>=r.bodyEndToken)return this.functionFallback(r,`${i} without identifier`,t),t;this.addDeclaration(this.tokens[o].text,i,o,n,r.id,!0,this.findStatementEnd(t));const a=this.nextSig(o);return a!==void 0&&((u=this.tokens[a])==null?void 0:u.text)===\":\"?this.preserveTypeFrom(a+1,[\"=\",\";\",\",\",\")\"],r.bodyEndToken):o}addDeclaration(t,n,r,i,s,o,a){const c=this.declarations.length;return this.declarations.push({id:c,name:t,kind:n,tokenIndex:r,scopeId:i,functionId:s,safeToRename:o}),a!==void 0?this.pendingSymbols.push({name:t,id:c,scopeId:i,activateAfter:a}):this.activateSymbol(t,c,i),c}activatePendingSymbols(t){for(let n=this.pendingSymbols.length-1;n>=0;n--){const r=this.pendingSymbols[n];r.activateAfter>=t||(this.activateSymbol(r.name,r.id,r.scopeId),this.pendingSymbols.splice(n,1))}}activateSymbol(t,n,r){let i=this.symbolsByScope.get(r);i||(i=new Map,this.symbolsByScope.set(r,i)),i.has(t)||i.set(t,n)}resolve(t,n){var r;for(let i=n.length-1;i>=0;i--){const s=(r=this.symbolsByScope.get(n[i]))==null?void 0:r.get(t);if(s!==void 0)return s}}preserveAttribute(t){var s;this.preserveToken(t,\"attribute\");const n=this.nextSig(t);if(n===void 0)return t;this.preserveToken(n,\"attribute\");const r=this.nextSig(n);if(r===void 0||((s=this.tokens[r])==null?void 0:s.text)!==\"(\")return n;const i=this.findMatching(r,\"(\",\")\");return i===void 0?(this.preserveRange(r,r,\"attribute\"),r):(this.preserveRange(r,i,\"attribute\"),i)}preserveTypeFrom(t,n,r){let i=0,s=0,o=0,a=t-1;for(let c=t;c<r;c++){const u=this.tokens[c];if(!Ue(u)){if(i===0&&s===0&&o===0&&n.includes(u.text))return Math.max(t-1,c-1);if(u.text===\"<\")i++;else if(u.text===\">\")i=Math.max(0,i-1);else if(u.text===\"(\")s++;else if(u.text===\")\"){if(s===0&&n.includes(\")\"))return Math.max(t-1,c-1);s=Math.max(0,s-1)}else u.text===\"[\"?o++:u.text===\"]\"&&(o=Math.max(0,o-1));u.kind===\"ident\"&&this.preserveToken(c,\"type\"),a=c}}return a}preserveStatement(t,n){const r=this.findStatementEnd(t);return this.preserveRange(t,r,n),r}preserveRange(t,n,r){for(let i=t;i<=n;i++)this.tokens[i]&&this.tokens[i].kind!==\"lineComment\"&&this.tokens[i].kind!==\"blockComment\"&&this.preserveToken(i,r)}preserveToken(t,n){this.preserved.has(t)||this.preserved.set(t,n)}createScope(t,n,r,i){const s=this.scopes.length;return this.scopes.push({id:s,kind:t,parentId:n,functionId:r,startToken:i}),s}nextSig(t){for(let n=t+1;n<this.tokens.length;n++)if(!Ue(this.tokens[n]))return n}findNextIdent(t){for(let n=t;n<this.tokens.length;n++){const r=this.tokens[n];if(!Ue(r)){if(r.kind===\"ident\")return n;if(r.text!==\"@\")return}}}findNextText(t,n){for(let r=t;r<this.tokens.length;r++)if(!Ue(this.tokens[r])&&this.tokens[r].text===n)return r}findStatementEnd(t){let n=0;for(let r=t;r<this.tokens.length;r++){const i=this.tokens[r].text;if(i===\"(\")n++;else if(i===\")\")n=Math.max(0,n-1);else if(n===0&&(i===\";\"||i===\"{\"||i===\"}\"))return r}return this.tokens.length-1}findMatching(t,n,r){let i=0;for(let s=t;s<this.tokens.length;s++){const o=this.tokens[s].text;if(o===n&&i++,o===r&&(i--,i===0))return s}}hasEntryAttributeBefore(t){for(let n=t-1;n>=0;n--){const r=this.tokens[n];if(!Ue(r)){if(r.text===\")\"||r.kind===\"ident\"||r.text===\"@\"){const i=r.text;if(i===\"compute\"||i===\"vertex\"||i===\"fragment\")return!0;continue}break}}return!1}moduleFallback(t,n){this.moduleFallbackReasons.push(`${t} at token ${n}`)}functionFallback(t,n,r){t.skipped=!0,t.fallbackReasons.push(`${n} at token ${r}`)}}function kh(e,t){for(let n=e.length-1;n>=0;n--)if(t(e[n]))return e[n]}function Ue(e){return e.kind===\"lineComment\"||e.kind===\"blockComment\"}const $h=new Set([\"textureSample\",\"textureSampleBias\",\"textureSampleLevel\",\"textureSampleGrad\",\"textureGather\",\"textureSampleBaseClampToEdge\"]),Th=new Set([\"textureSampleCompare\",\"textureSampleCompareLevel\",\"textureGatherCompare\"]);function Ph(e,t,n){const r=new Map;for(let i=0;i<e.length;i++){const s=e[i],o=t[i],a=Yo(s.tokens),c=new Map;for(const f of o.vars){const d=he(f.attrs,\"group\"),h=he(f.attrs,\"binding\"),g=a.declarations.find(b=>b.kind===\"global\"&&b.name===f.name);d!==void 0&&h!==void 0&&g&&c.set(g.id,{group:d,binding:h})}const u=new Map;for(const f of a.declarations){if(f.kind!==\"function\")continue;const d=a.functions.find(h=>h.nameTokenIndex===f.tokenIndex);d&&u.set(f.id,d.id)}for(const f of o.entries){const d=a.functions.find(v=>v.name===f.name),h=[];let g=a.fallback.wholeModule||!d;!g&&d&&(g=!Qo(d.id,new Map,new Set,a,c,u,h));const b=d?Lh(d.id,a,c,u):n.map(Ai);r.set(f,g?Dh(n,b):Uh(h))}}return r}function Qo(e,t,n,r,i,s,o){var d,h;const a=r.functions[e];if(!a||a.skipped)return!1;const c=`${e}|${[...t].map(([g,b])=>`${g}:${b.group}:${b.binding}`).join(\",\")}`;if(n.has(c))return!0;n.add(c);const u=r.references.filter(g=>g.functionId===e),f=new Map(u.map(g=>[g.tokenIndex,g]));for(let g=a.bodyStartToken+1;g<a.bodyEndToken;g++){const b=(d=r.tokens[g])==null?void 0:d.text,v=$h.has(b??\"\")?\"filtering\":Th.has(b??\"\")?\"comparison\":void 0,E=f.get(g),k=E&&s.get(E.declarationId);if(!v&&k===void 0)continue;const I=Fh(r,g);if(I===void 0||((h=r.tokens[I])==null?void 0:h.text)!==\"(\")continue;const R=Ch(r,I);if(!R)return!1;const H=R.map(([te,X])=>Ah(te,X,r,i,t));if(v){const te=b===\"textureGather\"&&!Rh(R[0],r,i,t)?1:0,X=H[te],z=H[te+1];if(!X||!z)return!1;o.push({texture:X,sampler:z,mode:v})}else{const te=r.declarations.filter(z=>z.kind===\"param\"&&z.functionId===k).sort((z,ve)=>z.tokenIndex-ve.tokenIndex),X=new Map;for(let z=0;z<te.length;z++)H[z]&&X.set(te[z].id,H[z]);if(!Qo(k,X,n,r,i,s,o))return!1}}return!0}function Ah(e,t,n,r,i){for(const s of n.references){if(s.tokenIndex<e||s.tokenIndex>t)continue;const o=r.get(s.declarationId)??i.get(s.declarationId);if(o)return o}}function Rh(e,t,n,r){const i=t.references.find(s=>s.tokenIndex>=e[0]&&s.tokenIndex<=e[1]);return(i==null?void 0:i.tokenIndex)===e[0]?n.get(i.declarationId)??r.get(i.declarationId):void 0}function Ch(e,t){const n=[];let r=1,i=0,s=0,o=0,a=t+1;for(let c=t+1;c<e.tokens.length;c++){const u=e.tokens[c].text;if(u===\"(\")r++;else if(u===\")\"){if(r--,r===0)return n.push([a,c-1]),n}else u===\"[\"?i++:u===\"]\"?i--:u===\"{\"?s++:u===\"}\"?s--:u===\"<\"?o++:u===\">\"?o--:u===\",\"&&r===1&&i===0&&s===0&&o===0&&(n.push([a,c-1]),a=c+1)}}function Fh(e,t){for(let n=t+1;n<e.tokens.length;n++)if(e.tokens[n].kind!==\"lineComment\"&&e.tokens[n].kind!==\"blockComment\")return n}function Lh(e,t,n,r){const i=[e],s=new Set,o=new Map;for(;i.length;){const a=i.pop();if(!s.has(a)){s.add(a);for(const c of t.references){if(c.functionId!==a)continue;const u=n.get(c.declarationId);u&&o.set(`${u.group}:${u.binding}`,u);const f=r.get(c.declarationId);f!==void 0&&i.push(f)}}}return[...o.values()]}function Dh(e,t){const n=new Set(t.map(o=>`${o.group}:${o.binding}`)),r=e.filter(o=>n.has(`${o.group}:${o.binding}`)),i=r.filter(o=>{var a;return((a=o.bindingLayout)==null?void 0:a.kind)===\"texture\"&&o.bindingLayout.texture.sampleType===\"unfilterable-float\"&&!o.bindingLayout.texture.multisampled}),s=r.filter(o=>{var a;return((a=o.bindingLayout)==null?void 0:a.kind)===\"sampler\"&&o.bindingLayout.sampler.type===\"filtering\"});return i.flatMap(o=>s.map(a=>({texture:Ai(o),sampler:Ai(a),mode:\"filtering\"})))}function Ai(e){return{group:e.group,binding:e.binding}}function Uh(e){const t=new Set;return e.filter(n=>{const r=`${n.texture.group}:${n.texture.binding}:${n.sampler.group}:${n.sampler.binding}:${n.mode}`;return t.has(r)?!1:(t.add(r),!0)})}function Mh(e,t){const n=e.map(Xd),r=ah(e,n),i=uh(n,r),s=[],o=[];for(const u of n)for(const f of u.vars){const d=he(f.attrs,\"group\"),h=he(f.attrs,\"binding\");if(d===void 0||h===void 0)continue;const g=vt(f.type,f.path,r),b=vd(g,f.addressSpace),v=f.addressSpace===\"uniform\"||f.addressSpace===\"storage\"?Vn(g,f.name,f.mangledName,i):void 0;v&&o.push(v),s.push({group:d,binding:h,name:f.name,mangledName:f.mangledName,type:g,kind:b,addressSpace:f.addressSpace,access:f.access,struct:g.kind===\"identifier\"?i.structs.get(g.mangledName??g.name):void 0,layout:v,bindingLayout:_d(b,f.addressSpace,f.access,g,v)})}s.sort((u,f)=>u.group-f.group||u.binding-f.binding);const a=Gh(e,n,s),c=Ph(e,n,s);return{bindings:s,entryPoints:n.flatMap(u=>u.entries.map(f=>Oh(f,n.flatMap(d=>d.structs),r,i,a.get(f)??s,c.get(f)??[]))),overrides:n.flatMap(u=>u.overrides),featuresRequired:[...new Set(n.flatMap(u=>u.features))],aliases:[...i.aliases.values()],structs:[...i.structs.values()],hostShareableLayouts:o}}function Gh(e,t,n){const r=new Map;for(let i=0;i<e.length;i++){const s=e[i],o=t[i],a=Yo(s.tokens),c=a.fallback.wholeModule,u=new Map;for(const d of a.declarations){if(d.kind!==\"function\")continue;const h=a.functions.find(g=>g.nameTokenIndex===d.tokenIndex);h&&u.set(d.id,h.id)}const f=new Map;for(const d of o.vars){const h=he(d.attrs,\"group\"),g=he(d.attrs,\"binding\");if(h===void 0||g===void 0)continue;const b=a.declarations.find(v=>v.kind===\"global\"&&v.name===d.name);b&&f.set(b.id,{group:h,binding:g})}for(const d of o.entries){const h=a.functions.find(E=>E.name===d.name);if(c||!h){r.set(d,n);continue}const g=[h.id],b=new Set,v=new Map;for(;g.length;){const E=g.pop();if(!b.has(E)&&(b.add(E),!!a.functions[E]))for(const k of a.references){if(k.functionId!==E)continue;const I=f.get(k.declarationId);I&&v.set(`${I.group}:${I.binding}`,I);const R=u.get(k.declarationId);R!==void 0&&g.push(R)}}r.set(d,[...v.values()].sort((E,k)=>E.group-k.group||E.binding-k.binding))}}return r}function Oh(e,t,n,r,i,s){return{name:e.name,mangledName:e.mangledName,stage:e.stage,...e.workgroupSize?{workgroupSize:e.workgroupSize}:{},bindings:i.map(({group:o,binding:a})=>({group:o,binding:a})),samplingPairs:s,...e.stage===\"vertex\"?{inputs:Vh(e,t,n,r)}:{}}}function Vh(e,t,n,r){var s;const i=[];for(const o of e.params){if(Zo(o.attrs,\"builtin\"))continue;const a=vt(o.type,e.path,n),c=he(o.attrs,\"location\");if(c!==void 0){i.push({name:o.name,location:c,type:a});continue}const u=Pi(a,r);if(u.kind!==\"identifier\")continue;const f=t.find(h=>h.mangledName===(u.mangledName??u.name)),d=r.structs.get(u.mangledName??u.name);if(f)for(let h=0;h<f.members.length;h++){const g=f.members[h];if(Zo(g.attrs,\"builtin\"))continue;const b=he(g.attrs,\"location\");b!==void 0&&i.push({name:g.name,location:b,type:((s=d==null?void 0:d.members[h])==null?void 0:s.type)??vt(g.type,f.path,n)})}}return i}function Zo(e,t){return e.some(n=>n.name===t)}function Ri(e,t=\"<runtime>\"){const n=Rd(e,t),r=bd(n);if(r.imports.length>0)throw N(\"VGPU-WGSL-REFLECT-SOURCE-IMPORT\",\"reflectSource() accepts a single raw WGSL string; use resolveShader() for WGSL import graphs.\");return Mh([{path:t,source:e,tokens:n,parsed:r}])}function Ci(){const e=new Map;return{getOrCreate(t,n,r,i){const s=r.map(Ur),o=`${t}:${n}:${s.join(\"|\")}`,a=e.get(o);if(a)return a.bindGroup;const c=i();return e.set(o,{identities:s,bindGroup:c}),c},evictIdentity(t){const n=Ur(t);for(const[r,i]of e)i.identities.includes(n)&&e.delete(r)},clearDraw(t){const n=`${t}:`;for(const r of e.keys())r.startsWith(n)&&e.delete(r)},dispose(){e.clear()}}}function Ur(e){return typeof e==\"string\"||typeof e==\"number\"?String(e):`${e.kind}:${e.id}`}function Nn(e,t,n){const r=e[t];if(!r)throw new _({code:\"VGPU-REFLECT-ENTRY-METADATA-MISSING\",message:`Entry point '${e.name}' has no reflected ${t}.`,fix:\"Pass the reflection from reflectSource()/resolveShader().\",where:n});return r}const Mr=new WeakMap;function Bn(e,t){if(!e.gpu.pushErrorScope||!e.gpu.popErrorScope)return;e.gpu.pushErrorScope(\"validation\");const n=Mr.get(e.gpu);n?n.push(t):Mr.set(e.gpu,[t])}function be(e){const t=Mr.get(e.gpu);if(!(t!=null&&t.length)||!e.gpu.popErrorScope)return;const n=t.pop();return t.length||Mr.delete(e.gpu),{context:n,error:e.gpu.popErrorScope()}}function Jo(e){const t=[];let n=be(e);for(;n;)t.push(n),n=be(e);return t}function Nh(e){const t=be(e);t&&Li(t)}function ea(e){for(const t of Jo(e))Li(t)}function me(e){for(const t of e)Li(t)}function Fi(e){var t,n;return((n=(t=e.gpu.queue).onSubmittedWorkDone)==null?void 0:n.call(t))??Promise.resolve()}function ta(e,t=[],n={}){return zh(e,t,n.errorSink??qh)}function Gr(e,t){return{context:e.context,error:Bh(e.error,t.error)}}async function Bh(e,t){const n=await Promise.allSettled([e,t]);for(const i of n)if(i.status===\"fulfilled\"&&i.value)return i.value;const r=n.find(i=>i.status===\"rejected\");if((r==null?void 0:r.status)===\"rejected\")throw r.reason;return null}async function zh(e,t,n){await Fi(e);for(const r of t)try{const i=await r.error;i&&await n(Zt(r.context.label,r.context.group,i))}catch(i){await n(Zt(r.context.label,r.context.group,i))}}function Li(e){e.error.catch(()=>{})}function qh(e){console.error(e)}function na(e,t,n,r){var i;try{t.end()}catch(s){const o=Jo(e);me(n),me(o),n.length=0;const a=((i=o[0])==null?void 0:i.context)??r;throw a?Zt(a.label,a.group,s):s}}let jh=1;const ra=new WeakMap;function Wh(e){return e===null||typeof e!=\"object\"||ArrayBuffer.isView(e)||e instanceof ArrayBuffer||Array.isArray(e)?!0:e instanceof Se||e instanceof Fe?!1:!aa(e)}function Di(e){return typeof e!=\"object\"||e===null||Array.isArray(e)||ArrayBuffer.isView(e)||e instanceof ArrayBuffer||e instanceof Se||e instanceof Fe?!1:!aa(e)}function Hh(e,t,n){var r;try{return Kh(e,t,n)}catch(i){if((i==null?void 0:i.code)===\"VGPU-CORE-TEXTURE-DESTROYED\"){const s=t instanceof Fe?t.label:(r=Or(t))==null?void 0:r.color.label;throw uo(n.sourceHint,e,s)}throw i}}function Kh(e,t,n){var r;switch((r=e.bindingLayout)==null?void 0:r.kind){case\"buffer\":return Xh(e,t,n);case\"texture\":return Yh(e,t,n);case\"sampler\":return em(e,t);case\"storageTexture\":return Qh(e,t);case\"externalTexture\":throw se(e,\"external texture\",\"Pass a compatible GPUExternalTexture.\");default:throw se(e,\"reflected resource\",\"Fix shader reflection bindingLayout.\")}}function Xh(e,t,n){const r=Qf(t);if(r)return r[_i](e,n.sourceHint);if(t instanceof Se)return vi(t,`${n.sourceHint}.set`),nm(e,t.options.usage),{resource:{buffer:t.gpu},identity:t.resourceIdentity,unsubscribe:i=>t.onDestroy(i)};if(im(t))return vi(t.buffer,`${n.sourceHint}.set`),{resource:{buffer:t.gpu,offset:0,size:t.size},identity:t.buffer.resourceIdentity,unsubscribe:i=>t.buffer.onDestroy(i)};if(ca(t))return{resource:t,identity:_t(t.buffer)};if(Mi(t))return{resource:{buffer:t},identity:_t(t)};throw se(e,\"buffer\",`Pass a compatible Buffer/Uniform: ${e.name}.set({ ${e.name}: gpu.device.createBuffer(...) }).`)}function Yh(e,t,n){var s,o;const r=((s=e.bindingLayout)==null?void 0:s.kind)===\"texture\"&&e.bindingLayout.texture.sampleType===\"depth\",i=Or(t);if(i){if(r&&!i.depth)throw se(e,\"a target with a depth attachment\",`Create it with target(gpu, { size, depth: true }) or bind a Texture: set({ ${e.name}: scene.depth }).`);const a=r?i.depth:i.color;sa(e,a,n);const c=(o=i.onTexturesRecreated)==null?void 0:o.bind(i);return{resourceLabel:a.label,resource:a.createView(oa(a)),identity:a.resourceIdentity,unsubscribe:u=>{const f=i.onDestroy(u),d=a.onDestroy(u);return()=>{f(),d()}},onRecreate:c?u=>c(u):void 0}}if(t instanceof Fe)return rm(e,t.usage),sa(e,t,n),{resourceLabel:t.label,resource:t.createView(oa(t)),identity:t.resourceIdentity,unsubscribe:a=>t.onDestroy(a)};if(Ui(t))return{resource:t.createView(),identity:t.resourceIdentity??_t(t)};if(typeof t==\"object\"&&t!==null)return{resource:t,identity:_t(t)};throw se(e,\"texture/target\",`Pass a Texture or Target: ${e.name}.set({ ${e.name}: scene.color }) or set({ ${e.name}: scene }).`)}function Qh(e,t){var s;const n=((s=e.bindingLayout)==null?void 0:s.kind)===\"storageTexture\"?e.bindingLayout.storageTexture:void 0,r={format:n==null?void 0:n.format,viewDimension:(n==null?void 0:n.viewDimension)??\"2d\"},i=`texture(gpu, { kind: \"${r.viewDimension}\", size${r.viewDimension===\"2d-array\"?\", layers\":\"\"}, format: \"${r.format??\"rgba8unorm\"}\", usage: [\"storage_binding\"] })`;if(Or(t))throw se(e,\"a storage texture, not a Target\",`Render targets are not storage textures. Create one with ${i} and set({ ${e.name}: texture }).`);if(t instanceof Fe)return Zh(e,t,r,i),{resourceLabel:t.label,resource:t.createView(ia(r.viewDimension)),identity:t.resourceIdentity,unsubscribe:o=>t.onDestroy(o)};if(Ui(t))return{resource:t.createView(ia(r.viewDimension)),identity:t.resourceIdentity??_t(t)};if(typeof t==\"object\"&&t!==null)return{resource:t,identity:_t(t)};throw se(e,\"a storage texture\",`Pass a Texture from ${i}: set({ ${e.name}: texture }).`)}function Zh(e,t,n,r){const i=t.label??\"texture\";if(!t.usage.includes(\"storage_binding\"))throw se(e,\"a texture with storage_binding usage\",`Create it with ${r}; include texture_binding too if you also sample it.`);if(n.format&&t.format!==n.format)throw se(e,`format ${n.format}`,`Texture '${i}' is ${t.format}. Create it with ${r} or declare texture_storage_${n.viewDimension.replace(\"-\",\"_\")}<${t.format}, ...> in WGSL.`);const s=Jh(n.viewDimension);if(s&&t.dimension!==s)throw se(e,`dimension \"${s}\"`,`Texture '${i}' has kind \"${t.kind}\". Create it with ${r}.`)}function ia(e){return{dimension:e,baseMipLevel:0,mipLevelCount:1}}function Jh(e){switch(e){case\"1d\":return\"1d\";case\"2d\":case\"2d-array\":return\"2d\";case\"3d\":return\"3d\";default:return}}function em(e,t){if(tm(t))return{resource:t,identity:_t(t)};throw se(e,\"sampler\",`Use the cached sampler: set({ ${e.name}: sampler(gpu) }).`)}function tm(e){return typeof e!=\"object\"||e===null||e instanceof Se||e instanceof Fe?!1:!Mi(e)&&!ca(e)&&!Ui(e)&&!Or(e)}function nm(e,t){var r;const n=((r=e.bindingLayout)==null?void 0:r.kind)===\"buffer\"?e.bindingLayout.buffer.type:void 0;if(n===\"uniform\"&&!t.includes(\"uniform\"))throw se(e,\"uniform buffer\",\"Create with usage: ['uniform','copy_dst'].\");if((n===\"storage\"||n===\"read-only-storage\")&&!t.includes(\"storage\"))throw se(e,\"storage buffer\",\"Create with usage: ['storage','copy_dst'].\")}function rm(e,t){if(!t.includes(\"texture_binding\")&&!t.includes(\"render_attachment\"))throw se(e,\"sampled texture\",\"Use texture_binding usage or a sampleable Target.\")}function sa(e,t,n){if(!(!n.filterableTexture||n.float32Filterable)&&(t.format===\"r32float\"||t.format===\"rg32float\"||t.format===\"rgba32float\"))throw Jl(n.sourceHint,e,t.format,t.label??\"texture\",n.pairedSampler)}function oa(e){return e.format.includes(\"stencil\")?{aspect:\"depth-only\"}:void 0}function Or(e){if(typeof e!=\"object\"||e===null)return;const t=e;if(!(!t.resourceIdentity||!t.color||typeof t.onDestroy!=\"function\"))return t}function aa(e){const t=e;return\"gpu\"in t||\"bindGroup\"in t||\"createView\"in t||\"resourceIdentity\"in t}function _t(e){if(typeof e!=\"object\"||e===null)return`value:${String(e)}`;let t=ra.get(e);return t||(t={kind:\"external\",id:jh++},ra.set(e,t)),t}function im(e){return typeof e==\"object\"&&e!==null&&\"gpu\"in e&&\"size\"in e&&\"buffer\"in e&&e.buffer instanceof Se}function Ui(e){return typeof e==\"object\"&&e!==null&&typeof e.createView==\"function\"}function ca(e){return typeof e==\"object\"&&e!==null&&\"buffer\"in e&&Mi(e.buffer)}function Mi(e){return typeof e==\"object\"&&e!==null&&\"size\"in e&&\"usage\"in e&&typeof e.destroy==\"function\"}function Gi(e,t){sm(e),Vi(e,t,\"$\",0,e.size);const n=new ArrayBuffer(e.size);return Oi(new DataView(n),e,0,t),n}function sm(e){if(e.size===void 0)throw G(\"set\",`No se puede inferir byteLength para layout runtime-sized '${e.name}'.`)}function Oi(e,t,n,r){if(t.members)return om(e,t.members,n,r);am(e,t,n,r)}function om(e,t,n,r){const i=r;for(const s of t)Oi(e,s.layout,n+s.offset,i==null?void 0:i[s.name])}function am(e,t,n,r){switch(t.type.kind){case\"scalar\":return Vr(e,n,t.type.name,r);case\"atomic\":return cm(e,n,t.type,r);case\"vector\":return um(e,n,t.type,r);case\"matrix\":return lm(e,t,n,r);case\"array\":return fm(e,t,n,r);default:throw G(\"set\",`No hay writer para layout ${t.type.kind}.`)}}function Vr(e,t,n,r){n===\"f32\"?e.setFloat32(t,r,!0):n===\"i32\"?e.setInt32(t,r,!0):n===\"u32\"||n===\"bool\"?e.setUint32(t,n===\"bool\"?r?1:0:r,!0):e.setUint16(t,ym(r),!0)}function cm(e,t,n,r){Vr(e,t,St(n.element),r)}function um(e,t,n,r){const i=r,s=zn(n.element);for(let o=0;o<n.width;o++)Vr(e,t+o*s,St(n.element),(i==null?void 0:i[o])??0)}function lm(e,t,n,r){const i=t.type,s=r,o=zn(i.element),a=t.stride??16;for(let c=0;c<i.columns;c++)for(let u=0;u<i.rows;u++)Vr(e,n+c*a+u*o,St(i.element),(s==null?void 0:s[c*i.rows+u])??0)}function fm(e,t,n,r){var o;const i=r,s=t.stride??((o=t.element)==null?void 0:o.size)??0;if(!t.element)throw G(\"set\",\"Array layout sin element layout.\");for(let a=0;a<i.length;a++)Oi(e,t.element,n+a*s,i[a])}function Vi(e,t,n,r,i){if(e.members){dm(e.members,t,n,r,i);return}switch(e.type.kind){case\"scalar\":Nr(e.type.name,t,n),Br(n,r,zn(e.type),i);return;case\"atomic\":Nr(St(e.type.element),t,n),Br(n,r,4,i);return;case\"vector\":hm(e.type,t,n,r,i);return;case\"matrix\":mm(e,t,n,r,i);return;case\"array\":pm(e,t,n,r,i);return;default:throw G(\"set\",`No hay validator para layout ${e.type.kind}.`)}}function dm(e,t,n,r,i){bm(t)||pe(\"type\",n,\"an object\",zr(t));const s=new Set(e.map(a=>a.name)),o=Object.keys(t).find(a=>!s.has(a));o!==void 0&&pe(\"unknown-field\",`${n}.${o}`,\"a declared field\",o);for(const a of e){const c=`${n}.${a.name}`;Object.hasOwn(t,a.name)||pe(\"missing-field\",c,\"a required field\",\"missing\"),Vi(a.layout,t[a.name],c,r+a.offset,i)}}function hm(e,t,n,r,i){const s=ua(t,n,e.width),o=St(e.element),a=zn(e.element);for(let c=0;c<e.width;c++)Nr(o,s[c],`${n}[${c}]`),Br(`${n}[${c}]`,r+c*a,a,i)}function mm(e,t,n,r,i){const s=e.type,o=s.columns*s.rows,a=ua(t,n,o),c=St(s.element),u=zn(s.element),f=e.stride;if(f===void 0)throw G(\"set\",`Matrix layout '${e.name}' sin stride.`);for(let d=0;d<s.columns;d++)for(let h=0;h<s.rows;h++){const g=d*s.rows+h,b=`${n}[${d}][${h}]`;Nr(c,a[g],b),Br(b,r+d*f+h*u,u,i)}}function pm(e,t,n,r,i){const s=la(t,n),o=e.type;o.count!==void 0&&s.length!==o.count&&pe(\"shape\",n,o.count,s.length);const a=e.stride;if(a===void 0||!e.element)throw G(\"set\",`Array layout '${e.name}' sin stride o element layout.`);if(e.runtimeSized){const c=gm(a,s.length,n),u=e.size??i-r;u!==c&&pe(\"extent\",n,c,u)}for(let c=0;c<s.length;c++)Vi(e.element,s[c],`${n}[${c}]`,r+c*a,i)}function Nr(e,t,n){if(e===\"bool\"){typeof t!=\"boolean\"&&pe(\"type\",n,\"bool\",zr(t),e);return}typeof t!=\"number\"&&pe(\"type\",n,e,zr(t),e),e===\"i32\"&&(!Number.isInteger(t)||t<-2147483648||t>2147483647)&&pe(\"integer-range\",n,\"an integer in [-2147483648, 2147483647]\",String(t),e),e===\"u32\"&&(!Number.isInteger(t)||t<0||t>4294967295)&&pe(\"integer-range\",n,\"an integer in [0, 4294967295]\",String(t),e)}function ua(e,t,n){const r=la(e,t);return r.length!==n&&pe(\"shape\",t,n,r.length),r}function la(e,t){if(Array.isArray(e)||ArrayBuffer.isView(e)&&!(e instanceof DataView)&&\"length\"in e)return e;pe(\"type\",t,\"an array or typed array\",zr(e))}function Br(e,t,n,r){(!Number.isSafeInteger(t)||!Number.isSafeInteger(n)||t<0||n<0||t>r-n)&&pe(\"buffer-range\",e,`${n} bytes inside ${r}`,t)}function gm(e,t,n){const r=e*t;return(!Number.isSafeInteger(e)||e<0||!Number.isSafeInteger(r))&&pe(\"extent\",n,\"a safe byte extent\",String(r)),r}function pe(e,t,n,r,i){const s=e===\"shape\"?`expected exactly ${n} values, received ${r}`:e===\"missing-field\"?\"required field is missing\":e===\"unknown-field\"?`field '${r}' is not declared by the layout`:e===\"integer-range\"?`${r} is outside the exact ${i} range`:e===\"extent\"?`runtime extent requires ${n} bytes, received ${r}`:e===\"buffer-range\"?`write at byte ${r} exceeds ${n}`:`expected ${n}, received ${r}`;throw Uf(i===void 0?{reason:e,path:t,expected:n,actual:r}:{reason:e,path:t,expected:n,actual:r,type:i},s)}function bm(e){if(typeof e!=\"object\"||e===null||Array.isArray(e)||ArrayBuffer.isView(e))return!1;const t=Object.getPrototypeOf(e);return t===Object.prototype||t===null}function zr(e){return e===null?\"null\":Array.isArray(e)?\"array\":ArrayBuffer.isView(e)?e.constructor.name:typeof e}function zn(e){return St(e)===\"f16\"?2:4}function St(e){if(e.kind!==\"scalar\")throw G(\"set\",`Expected scalar, got ${e.kind}`);return e.name}function ym(e){const t=new Float32Array(1),n=new Uint32Array(t.buffer);t[0]=e;const r=n[0],i=r>>16&32768,s=r&8388607,o=r>>23&255;if(o===255)return i|(s?32256:31744);const a=o-127+15;if(a>=31)return i|31744;if(a<=0)return a<-10?i:i|fa(s|8388608,14-a);const c=fa(s,13);if(c===1024){const u=a+1;return u>=31?i|31744:i|u<<10}return i|a<<10|c}function fa(e,t){const n=e>>>t,r=(1<<t)-1,i=e&r,s=1<<t-1;return i>s||i===s&&(n&1)===1?n+1:n}const da=new WeakMap;function ha(e,t){const n=new Map,r=new Set,i=new Set,s=new Set(e.filter(a=>{var c;return((c=a.bindingLayout)==null?void 0:c.kind)===\"texture\"&&a.bindingLayout.texture.sampleType===\"depth\"}).map(a=>`${a.group}:${a.binding}`));for(const a of t){const c=a.stage===\"vertex\"?1:a.stage===\"fragment\"?2:4;for(const u of Nn(a,\"bindings\",\"visibility\")){const f=`${u.group}:${u.binding}`;n.set(f,(n.get(f)??0)|c)}for(const u of Nn(a,\"samplingPairs\",\"visibility\")){if(u.mode!==\"filtering\")continue;const f=`${u.texture.group}:${u.texture.binding}`;s.has(f)?i.add(`${u.sampler.group}:${u.sampler.binding}`):r.add(f)}}const o=a=>n.get(`${a.group}:${a.binding}`)??0;return Object.defineProperty(o,\"filterable\",{value:r}),Object.defineProperty(o,\"nonFilteringSamplers\",{value:i}),o}function ma(e,t,n=Ni){return e.flatMap(r=>{var o,a;if(r.group!==t)return[];const i=n(r),s=`${r.group}:${r.binding}`;return i===0?[]:[{binding:r.binding,visibility:i,...Sm(r,((o=n.filterable)==null?void 0:o.has(s))??!1,((a=n.nonFilteringSamplers)==null?void 0:a.has(s))??!1)}]})}function pa(e,t,n,r=Ni){const i=new Map,s=n.bindings.filter(a=>r(a)!==0).map(a=>a.group),o=Math.max(-1,...s);for(let a=0;a<=o;a++)i.set(a,xm(e,t,n,a,r));return i}function wm(e,t){return e.gpu.createPipelineLayout({bindGroupLayouts:vm(t)})}function xm(e,t,n,r,i=Ni){return ga(e,`${t}.group${r}.bgl`,ma(n.bindings,r,i))}function ga(e,t,n){let r=da.get(e.gpu);r||(r=new Map,da.set(e.gpu,r));const i=JSON.stringify(n),s=r.get(i);if(s)return s;const o=io(e.gpu.createBindGroupLayout({label:t,entries:n}),{entries:n});return r.set(i,o),o}function vm(e){const t=Math.max(-1,...e.keys()),n=[];for(let r=0;r<=t;r++)n.push(_m(e,r));return n}function _m(e,t){const n=e.get(t);if(!n)throw G(\"pipelineLayout\",`Bind groups must be contiguous for pipeline layout; missing group(${t}).`);return n}function Sm(e,t,n){const r=e.bindingLayout;if(!r)throw G(\"bindGroupLayout\",`Binding '${e.name}' does not have a reflected bindingLayout.`);return t&&r.kind===\"texture\"&&r.texture.sampleType===\"unfilterable-float\"&&!r.texture.multisampled?{texture:{...r.texture,sampleType:\"float\"}}:n&&r.kind===\"sampler\"&&r.sampler.type===\"filtering\"?{sampler:{type:\"non-filtering\"}}:Em(r)}function Em(e){switch(e.kind){case\"buffer\":return{buffer:{...e.buffer}};case\"sampler\":return{sampler:{...e.sampler}};case\"texture\":return{texture:{...e.texture}};case\"storageTexture\":return{storageTexture:{...e.storageTexture}};case\"externalTexture\":return{externalTexture:{}}}}function Ni(e){const t=globalThis.GPUShaderStage,n=(t==null?void 0:t.VERTEX)??1,r=(t==null?void 0:t.FRAGMENT)??2,i=(t==null?void 0:t.COMPUTE)??4;return e.kind===\"buffer\"?n|r|i:r|i}function ba(e){const t=Im(e.reflection),n=[...e.bindGroupLayouts.keys()].sort((p,S)=>p-S),r=new Map;function i(p){const S=[];for(const[$,P]of Object.entries(p))S.push(...o($,P));return S}function s(p){var $;const S=e.bindGroupLayouts.get(p.info.group);return!!S&&!!(($=Yt(S))!=null&&$.entries.some(P=>P.binding===p.info.binding))}function o(p,S){const $=t.get(p);if($)return a($,p,S);const P=km(p,t,e.label);if(!P)throw G(`${e.label}.set`,`Binding '${p}' does not exist in '${e.label}'.`);return c(P,p,S)}function a(p,S,$){ve(p.info.group);const P=ya(p.info,$);wa(p,S,P);const V=Et(p.identity);return P===\"lib\"?u(p,Am(p.libValue,$)):d(p,$),p.ownership??(p.ownership=P),s(p)?Bi(p,V):[]}function c(p,S,$){ve(p.info.group);const P=ya(p.info,$);if(wa(p,S,P),$m(p,S,P),P!==\"lib\")throw G(`${e.label}.set`,`Member '${S}' needs a JS value; set resource '${p.info.name}' instead.`);const V=Et(p.identity),ne=p.libValue??zi(_e(p));return u(p,{...Rm(ne),[S]:$}),p.ownership??(p.ownership=P),p.memberOwnership.set(S,P),s(p)?Bi(p,V):[]}function u(p,S){const $=_e(p),P=Gi($,S);p.libValue=S,p.buffer||pt(p,$.size),p.bytes=P,p.buffer.write(P,0)}function f(p){var V,ne;const S=(V=Yt(e.bindGroupLayouts.get(p.group)))==null?void 0:V.entries.find(q=>q.binding===p.binding),$=e.reflection.entryPoints.flatMap(q=>Nn(q,\"samplingPairs\",e.label)).find(q=>q.mode===\"filtering\"&&q.texture.group===p.group&&q.texture.binding===p.binding),P=$&&e.reflection.bindings.find(q=>q.group===$.sampler.group&&q.binding===$.sampler.binding);return{sourceHint:e.label,filterableTexture:((ne=S==null?void 0:S.texture)==null?void 0:ne.sampleType)===\"float\",float32Filterable:e.device.features.has(\"float32-filterable\"),pairedSampler:P}}function d(p,S){var P,V,ne,q;const $=Hh(p.info,S,f(p.info));(P=p.unsubscribe)==null||P.call(p),(V=p.unsubscribeRecreate)==null||V.call(p),p.resource=$.resource,p.identity=$.identity,p.destroyed=!1,p.resourceLabel=$.resourceLabel,p.subscribeDestroy=$.unsubscribe,p.unsubscribe=(ne=$.unsubscribe)==null?void 0:ne.call($,()=>b(p)),p.unsubscribeRecreate=(q=$.onRecreate)==null?void 0:q.call($,()=>h(p,S))}function h(p,S){var P;const $=Et(p.identity);if(p.identity&&e.cache.evictIdentity(p.identity),d(p,S),s(p))for(const V of Bi(p,$))(P=e.onIdentityChange)==null||P.call(e,V)}function g(p,S,$){k(p),Tm(e.label,p,S,$);const P=r.has(p)?`claimed-group:${p}`:void 0;return r.set(p,S),P}function b(p){var S;p.destroyed||(p.destroyed=!0,p.identity&&e.cache.evictIdentity(p.identity),s(p)&&!r.has(p.info.group)&&((S=e.onIdentityChange)==null||S.call(e,{group:p.info.group,binding:p.info.binding,bindingName:p.info.name,bindingKind:p.info.kind,previousIdentity:Et(p.identity),newIdentity:`destroyed:${Et(p.identity)}`})))}function v(){for(const p of t.values())if(p.destroyed&&s(p)&&!r.has(p.info.group))throw uo(e.label,p.info,p.resourceLabel)}function E(p){v();const S=[];for(const $ of t.values()){if(!s($)||r.has($.info.group)||!$.subscribeDestroy)continue;const P=Et($.identity),{group:V,binding:ne,name:q,kind:ie}=$.info;S.push($.subscribeDestroy(()=>p({group:V,binding:ne,bindingName:q,bindingKind:ie,previousIdentity:P,newIdentity:`destroyed:${P}`})))}return()=>{for(const $ of S.splice(0))$()}}function k(p){const S=e.bindGroupLayouts.get(p);if(!S)throw G(`${e.label}.layout`,`@group(${p}) does not exist in '${e.label}'.`);return S}function I(){return v(),n.map(R)}function R(p){var ie;const S=r.get(p);if(S)return{group:p,bindGroup:S,offsets:[],claimValidation:H(S,p)};const $=new Set((ie=Yt(k(p)))==null?void 0:ie.entries.map(We=>We.binding)),P=e.reflection.bindings.filter(We=>We.group===p&&$.has(We.binding)),V=te(P),ne=X(P),q=e.cache.getOrCreate(e.drawId,p,ne,()=>e.device.gpu.createBindGroup({label:`${e.label}.group${p}`,layout:k(p),entries:V}));return{group:p,bindGroup:q,offsets:[]}}function H(p,S){return so(p)?void 0:{label:e.label,group:S}}function te(p){return p.map(S=>{const $=z(S);return{binding:S.binding,resource:$.resource}})}function X(p){return p.map(S=>z(S).identity)}function z(p){const S=t.get(p.name);if(!(S!=null&&S.resource)||!S.identity)throw ef(e.label,p);return S}function ve(p){if(r.has(p))throw tf(e.label,p)}function pt(p,S){p.buffer=e.device.createBuffer({size:S,usage:[\"uniform\",\"copy_dst\"],label:`${e.label}.${p.info.name}`}),p.resource={buffer:p.buffer.gpu,offset:0,size:S},p.identity=p.buffer.resourceIdentity,p.unsubscribe=p.buffer.onDestroy(()=>e.cache.evictIdentity(p.buffer.resourceIdentity))}function _e(p){var S;if(p.info.kind!==\"buffer\"||!((S=p.info.layout)!=null&&S.size))throw G(`${e.label}.set`,`Binding '${p.info.name}' needs a compatible resource, not JS.`);return p.info.layout}return{assertUsable:v,watchResources:E,get groups(){return n},set:i,claimGroup:g,layout:k,bindGroups:I,bindingState(p){const S=t.get(p);if(!(!(S!=null&&S.ownership)||!S.resource||!S.identity))return{info:S.info,ownership:S.ownership,resource:S.resource,identity:S.identity}}}}function Im(e){return new Map(e.bindings.map(t=>[t.name,{info:t,memberOwnership:new Map}]))}function km(e,t,n){var i,s;let r;for(const o of t.values())if((s=(i=o.info.layout)==null?void 0:i.members)!=null&&s.some(a=>a.name===e)){if(r)throw G(`${n}.set`,`Binding member '${e}' is ambiguous in '${n}'; set the complete binding.`);r=o}return r}function ya(e,t){var n;return((n=e.bindingLayout)==null?void 0:n.kind)===\"buffer\"&&Wh(t)?\"lib\":\"user\"}function wa(e,t,n){if(e.ownership&&e.ownership!==n)throw lo(t,e.ownership)}function $m(e,t,n){const r=e.memberOwnership.get(t);if(r&&r!==n)throw lo(t,r)}function Tm(e,t,n,r){const i=so(n);if(!i)return;const s=Yt(r);if(!s)return;const o=Pm(s.entries,i.layout.entries);if(o)throw nf(e,t,o)}function Pm(e,t){if(e.length!==t.length)return`expected ${e.length} bindings and received ${t.length}`;const n=xa(e),r=xa(t);for(const[i,s]of n){const o=r.get(i);if(!o)return`missing @binding(${i})`;if(va(s)!==va(o))return`@binding(${i}) does not match the reflected layout`}}function xa(e){return new Map(e.map(t=>[t.binding,t]))}function va(e){return JSON.stringify({binding:e.binding,visibility:e.visibility,buffer:e.buffer,sampler:e.sampler,texture:e.texture,storageTexture:e.storageTexture,externalTexture:e.externalTexture?{}:void 0})}function Bi(e,t){const n=Et(e.identity);return!n||t===n?[]:[{group:e.info.group,binding:e.info.binding,bindingName:e.info.name,bindingKind:e.info.kind,previousIdentity:t,newIdentity:n}]}function Et(e){return e===void 0?void 0:Ur(e)}function Am(e,t){return Di(e)&&Di(t)?{...e,...t}:t}function Rm(e){return Di(e)?e:{}}function zi(e){if(e.members)return Object.fromEntries(e.members.map(t=>[t.name,zi(t.layout)]));switch(e.type.kind){case\"scalar\":case\"atomic\":return 0;case\"vector\":return Array.from({length:e.type.width},()=>0);case\"matrix\":return Array.from({length:e.type.columns*e.type.rows},()=>0);case\"array\":{const t=e.element;return e.type.count===void 0||!t?[]:Array.from({length:e.type.count},()=>zi(t))}default:return}}const Cm=\"rgba8unorm\",qi=Object.freeze([0,0,0,1]);function qr(e,t){const n=e,r=Array.isArray(e)?e:[n==null?void 0:n.r,n==null?void 0:n.g,n==null?void 0:n.b,n==null?void 0:n.a];if(r.length!==4||!r.every(i=>typeof i==\"number\"&&Number.isFinite(i)))throw Rf(t);return ji(e)}function ji(e){const t=e;return Array.isArray(e)?[e[0],e[1],e[2],e[3]]:{r:t.r,g:t.g,b:t.b,a:t.a}}function jr(e){return e.colors??[{format:e.format??Cm}]}function _a(e){return e.depth===!0?\"depth24plus\":e.depth||void 0}function Sa(e){const t=e.msaa;if(t===!0||t===4)return 4;if(t===void 0||t===!1)return 1;const n=_o();throw n.code=\"VGPU-TARGET-MSAA-INVALID\",n.message=`msaa received ${t}; WebGPU 1|4; use true`,n}function Ea(e,t){if(!Array.isArray(e==null?void 0:e.size)||e.size.length!==2||!Array.from(e.size).every(r=>Number.isSafeInteger(r)&&r>0))throw _o();const n=_a(e);if(n===\"stencil8\")throw If(n);if(Sa(e)===4)for(const r of jr(e))Fm(r.format,t)}function Fm(e,t){if(t.isCompatibilityMode&&e===\"rgba16float\")throw G(\"target\",\"Dawn compatibility mode does not support rgba16float+msaa.\",\"Use rgba8unorm for MSAA here, or disable msaa.\")}function Lm(e,t,n,r){const i={view:(t??e).createView(),resolveTarget:t?e.createView():void 0,loadOp:r?\"load\":\"clear\",storeOp:t?\"discard\":\"store\"};return r||(i.clearValue=Ia(n)),i}function Dm(e,t,n,r,i){if(i){const o={view:e.createView(),depthReadOnly:!0};return qn(e.format)&&(o.stencilReadOnly=!0),o}const s={view:e.createView(),depthLoadOp:t?\"load\":\"clear\",depthStoreOp:e.sampleCount>1?\"discard\":\"store\"};return t||(s.depthClearValue=n??1),e.format&&qn(e.format)&&(s.stencilLoadOp=t?\"load\":\"clear\",s.stencilStoreOp=e.sampleCount>1?\"discard\":\"store\",t||(s.stencilClearValue=r??0)),s}function qn(e){return!!e&&e.includes(\"stencil\")}function Ia(e){return Array.isArray(e)?{r:e[0],g:e[1],b:e[2],a:e[3]}:e}function ka(e,t){return e[0]===t[0]&&e[1]===t[1]}function Wr(e){return typeof e==\"object\"&&e!==null&&typeof e.renderPassDescriptor==\"function\"}let Um=1,Mm=1;const Gm=new WeakMap,Om=new WeakMap;function $a(e){var t;return Wr(e)?{colors:e.colors.map(n=>n.format),depth:(t=e.depth)==null?void 0:t.format,sampleCount:e.sampleCount}:typeof e!=\"object\"||e===null?{colors:[]}:{colors:Array.isArray(e.colors)?[...e.colors]:e.colors??[],depth:e.depth,sampleCount:e.sampleCount??1}}function Hr(e){return`${e.colors.join(\",\")}:${e.depth??\"none\"}:${e.sampleCount??1}`}function Ta(e,t){if(!Array.isArray(e.colors)||e.colors.length===0)throw Ir(t,\"colors must be a non-empty array.\");const n=e.colors.find(i=>typeof i!=\"string\"||i.length===0);if(n!==void 0)throw Ir(t,`colors must contain only GPUTextureFormat strings; received ${String(n)}.`);if(e.depth!==void 0&&(typeof e.depth!=\"string\"||e.depth.length===0))throw Ir(t,\"depth must be a GPUTextureFormat string.\");const r=e.sampleCount??1;if(r!==1&&r!==4)throw Ir(t,`sampleCount must be 1 or 4; received ${String(r)}.`)}function Vm(e){const t=`${Da(Gm,e.module,()=>Um++)}|${Da(Om,e.pipelineLayout,()=>Mm++)}|${jm(e.vertexBufferLayouts??[])}|${Hr(e.signature)}`,n=e.topology||e.stripIndexFormat?`${t}|${e.topology??\"triangle-list\"}|${e.stripIndexFormat??\"none\"}`:t,r=e.cullMode||e.frontFace?`${n}|${e.cullMode??\"none\"}|${e.frontFace??\"ccw\"}`:n,i=e.unclippedDepth?`${r}|unclipped`:r,s=e.depthKey?`${i}|${e.depthKey}`:i,o=e.stencilKey?`${s}|${e.stencilKey}`:s,a=e.multisampleKey?`${o}|${e.multisampleKey}`:o,c=e.constantsKey?`${a}|${e.constantsKey}`:a,u=e.entryKey?`${c}|${e.entryKey}`:c;return e.fragmentKey?`${u}|${e.fragmentKey}`:u}function Wi(e,t,n,r,i){if(r===void 0)return t.find(o=>o.stage===n);if(typeof r!=\"string\")throw Er(e,`${n} received ${Hi(r)}; expected an entry point name string.`,i);const s=t.find(o=>o.name===r);if(!s)throw Er(e,`\"${r}\" matches no entry point in the shader; available entry points: ${Pa(t)}.`,i);if(s.stage!==n)throw Er(e,`\"${r}\" is a @${s.stage} entry point, not @${n}; available entry points: ${Pa(t)}.`,i);return s}function Pa(e){return e.length?e.map(t=>`\"${t.name}\" (@${t.stage})`).join(\", \"):\"none\"}function Aa(e,t,n,r){if(t!==void 0&&(typeof t!=\"object\"||t===null||Array.isArray(t)))throw Sr(e,`received ${Hi(t)}; expected { overrideNameOrId: number | boolean }.`,r);const i=new Map(n.map(o=>[Ra(o),o])),s={};for(const[o,a]of Object.entries(t??{})){if(!i.has(o))throw Sr(e,`\"${o}\" matches no override in the shader; available overrides: ${Nm(n)}.`,r);if(typeof a==\"boolean\"){s[o]=a?1:0;continue}if(typeof a!=\"number\"||!Number.isFinite(a))throw Sr(e,`\"${o}\" received ${Hi(a)}; use a finite number or a boolean (WebGPU converts the value to the override's WGSL type, and NaN/Infinity fail that conversion).`,r);s[o]=a}for(const o of n){const a=Ra(o);if(o.defaultValue===void 0&&!(a in s))throw Sr(e,`override '${o.name}' has no default value and must be provided; add constants: { \"${a}\": value }.`,r)}return Object.keys(s).length===0?{}:{constants:s,constantsKey:Bm(s)}}function Ra(e){return e.id!==void 0?String(e.id):e.name}function Nm(e){return e.length?e.map(t=>t.id!==void 0?`\"${t.id}\" (@id of ${t.name})`:`\"${t.name}\"`).join(\", \"):\"none\"}function Bm(e){return`cn~${Object.entries(e).sort(([t],[n])=>t<n?-1:t>n?1:0).map(([t,n])=>`${t}=${n}`).join(\"~\")}`}function Hi(e){if(typeof e==\"string\")return`\"${e}\"`;try{return JSON.stringify(e)??String(e)}catch{return String(e)}}function Ca(e){const t=new Map;return{get(n,r){let i=t.get(n);return i||(i=e.gpu.createShaderModule({label:r,code:n}),t.set(n,i)),i},dispose(){t.clear()}}}function Fa(e){const t=new Map;return{get(n){const r=Wm(n);let i=t.get(r);return i||(i=e.gpu.createPipelineLayout({bindGroupLayouts:Hm(n)}),t.set(r,i)),i},dispose(){t.clear()}}}function La(e,t={}){return new zm(e,t)}class zm{constructor(t,n){w(this,ae);m(this,\"device\");w(this,K,new Map);w(this,rt,new Set);w(this,Ct);w(this,Yn);w(this,mn,!1);var r;this.device=t,x(this,Ct,n.errorSink??(()=>{})),x(this,Yn,(r=n.registerSettledSource)==null?void 0:r.call(n,()=>[...l(this,rt)]))}getReady(t){var n;return(n=l(this,K).get(t))==null?void 0:n.pipeline}getSync(t,n,r){var a;y(this,ae,hs).call(this,r.where);const i=l(this,K).get(t);if(i!=null&&i.pipeline)return i.pipeline;const s=i??{};i||l(this,K).set(t,s);const o=y(this,ae,jc).call(this,t,s,n,r);if(!o){s.pending||l(this,K).delete(t);return}return s.pipeline=o,(a=s.pending)==null||a.resolve(o),s.pending=void 0,o}getAsync(t,n,r){y(this,ae,hs).call(this,r.where);const i=l(this,K).get(t);if(i!=null&&i.pipeline)return Promise.resolve(i.pipeline);if(i!=null&&i.pending)return i.pending.promise;const s={},o=qm();s.pending=o,l(this,K).set(t,s);let a;try{a=n()}catch(c){const u=Un(r.where,c,r.signature);return o.reject(u),l(this,K).delete(t),o.promise}return y(this,ae,ms).call(this,a),a.then(c=>{l(this,K).get(t)!==s||s.pipeline||s.pending!==o||(s.pipeline=c,s.pending=void 0,o.resolve(c))},c=>{l(this,K).get(t)!==s||s.pipeline||s.pending!==o||(s.pending=void 0,l(this,K).delete(t),o.reject(Un(r.where,c,r.signature)))}),o.promise}dispose(){var n,r;if(l(this,mn))return;x(this,mn,!0);const t=vo(\"gpu.dispose\");for(const i of l(this,K).values())(n=i.pending)==null||n.reject(t);l(this,K).clear(),l(this,rt).clear(),(r=l(this,Yn))==null||r.call(this)}}K=new WeakMap,rt=new WeakMap,Ct=new WeakMap,Yn=new WeakMap,mn=new WeakMap,ae=new WeakSet,jc=function(t,n,r,i){const s=this.device.gpu,o=typeof s.pushErrorScope==\"function\"&&typeof s.popErrorScope==\"function\";o&&s.pushErrorScope(\"validation\");try{const a=r();return o&&y(this,ae,Wc).call(this,t,n,i),a}catch(a){o&&y(this,ae,Hc).call(this);const c=Un(i.where,a,i.signature);l(this,Ct).call(this,c);return}},Wc=function(t,n,r){const i=this.device.gpu.popErrorScope().then(s=>{if(!s)return;const o=Un(r.where,s,r.signature);return l(this,K).get(t)===n&&l(this,K).delete(t),l(this,Ct).call(this,o)},s=>{const o=Un(r.where,s,r.signature);return l(this,K).get(t)===n&&l(this,K).delete(t),l(this,Ct).call(this,o)});y(this,ae,ms).call(this,i)},Hc=function(){var n,r;const t=(r=(n=this.device.gpu).popErrorScope)==null?void 0:r.call(n);t&&t.catch(()=>{})},hs=function(t){if(l(this,mn))throw vo(t)},ms=function(t){l(this,rt).add(t),t.catch(()=>{}).then(()=>l(this,rt).delete(t),()=>l(this,rt).delete(t))};function qm(){let e,t;const n=new Promise((r,i)=>{e=r,t=i});return n.catch(()=>{}),{promise:n,resolve:e,reject:t}}function Da(e,t,n){let r=e.get(t);return r||(r=n(),e.set(t,r)),r}function jm(e){return JSON.stringify(e.map(t=>({arrayStride:t.arrayStride,stepMode:t.stepMode??\"vertex\",attributes:[...t.attributes].map(n=>({shaderLocation:n.shaderLocation,offset:n.offset,format:n.format}))})))}function Wm(e){return JSON.stringify([...e.entries()].map(([t,n])=>({group:t,entries:Xm(n)})))}function Hm(e){const t=Math.max(-1,...e.keys()),n=[];for(let r=0;r<=t;r++)n.push(Km(e,r));return n}function Km(e,t){const n=e.get(t);if(!n)throw Ef(t);return n}function Xm(e){var t;return(((t=Yt(e))==null?void 0:t.entries)??[]).map(n=>({binding:n.binding,visibility:n.visibility,buffer:n.buffer?{...n.buffer}:void 0,sampler:n.sampler?{...n.sampler}:void 0,texture:n.texture?{...n.texture}:void 0,storageTexture:n.storageTexture?{...n.storageTexture}:void 0,externalTexture:n.externalTexture?{...n.externalTexture}:void 0}))}const Ym=Mn(\"frame-state\");function Kr(e){return e.service(Ym,Qm)}function Qm(){const e=new Set;let t=Ua(),n=!1,r=!1;const i={time:0,deltaTime:0,frameCount:0,advanceBy(s){i.deltaTime=s,i.time+=s,r=!0},tick(){if(n)throw So();n=!0;try{const s=Ua();r?r=!1:(i.deltaTime=Math.max(0,(s-t)/1e3),i.time+=i.deltaTime),t=s,i.frameCount+=1;for(const o of[...e])o()}finally{n=!1}},onAdvance(s){return e.add(s),()=>{e.delete(s)}}};return i}function Ua(){var e,t;return((t=(e=globalThis.performance)==null?void 0:e.now)==null?void 0:t.call(e))??Date.now()}function Zm(e,t,n={}){const r=Y(e,\"surface\"),i=ep(r),s=i.get(t);if(s&&!s.disposed)throw $f(s.label);const o=new Ga(r.device,t,n,u=>{i.get(u.canvas)===u&&i.delete(u.canvas),a(),c()}),a=Kr(r).onAdvance(()=>o.applyAutoResize()),c=r.own(\"resource\",()=>o.dispose());return i.set(t,o),o}const Jm=Mn(\"surfaces\");function ep(e){return e.service(Jm,()=>new Map)}let jn=0,Ki=0;function tp(){return jn>0}function Ma(){return Ki>0}function np(){Ki+=1}function rp(){Ki-=1}function Xi(e){return e instanceof Ga}class Ga{constructor(t,n,r,i){w(this,B);m(this,\"device\");m(this,\"canvas\");m(this,\"options\");m(this,\"unregister\");m(this,\"resourceIdentity\",yr(\"render-target\"));m(this,\"label\");m(this,\"context\");m(this,\"autoResize\");m(this,\"layoutBacked\");m(this,\"format\");w(this,Qn,new wr);w(this,Ft,new Set);w(this,Lt,new Set);w(this,Me);w(this,pn);w(this,it,!1);w(this,st,!1);this.device=t,this.canvas=n,this.options=r,this.unregister=i,this.label=r.label,x(this,pn,r.clearColor===void 0?qi:qr(r.clearColor,\"surface.clearColor\"));const s=n.getContext(\"webgpu\");if(!s)throw kf();if(this.context=s,this.layoutBacked=ip(n),r.autoResize===!0&&!this.layoutBacked)throw Pf();this.autoResize=r.autoResize??(r.size?!1:this.layoutBacked),x(this,Me,Na(r.dpr)),this.format=r.format??op();const o=sp(n,r,this.layoutBacked,l(this,Me));(r.size||this.layoutBacked)&&Va(n,o),s.configure({device:t.gpu,format:this.format,alphaMode:r.alphaMode??\"premultiplied\",colorSpace:r.colorSpace??\"srgb\",usage:ap()})}get gpu(){return this.context}get size(){return y(this,B,Ce).call(this),Xr(this.canvas)}get texelSize(){const t=this.size;return[1/t[0],1/t[1]]}get color(){return y(this,B,Ce).call(this),new Fe(this.device,this.context.getCurrentTexture(),{kind:\"2d\",size:this.size,format:this.format,usage:[\"render_attachment\",\"texture_binding\",\"copy_src\"],label:this.options.label?`${this.options.label}.color`:\"surface.color\"},\"external\")}get colors(){return[this.color]}get depth(){y(this,B,Ce).call(this)}get sampleCount(){return y(this,B,Ce).call(this),1}get dpr(){return l(this,Me)}get clearColor(){return ji(l(this,pn))}set clearColor(t){x(this,pn,qr(t,\"surface.clearColor\"))}get disposed(){return l(this,it)}resize(t){if(y(this,B,Ce).call(this),l(this,st))throw Af(this.options.label);y(this,B,ps).call(this,Yr(t),l(this,Me),!0)}applyAutoResize(){if(l(this,it)||!this.autoResize||!this.layoutBacked)return;const t=Na(this.options.dpr),n=Oa(this.canvas,t);y(this,B,ps).call(this,n,t,!0)}onResize(t){y(this,B,Ce).call(this),l(this,Ft).add(t),x(this,st,!0),jn+=1;try{t(y(this,B,gs).call(this))}finally{jn-=1,x(this,st,!1)}return()=>{l(this,Ft).delete(t)}}onDestroy(t){return y(this,B,Ce).call(this),l(this,Qn).onDestroy(this,t)}onTexturesRecreated(t){return y(this,B,Ce).call(this),l(this,Lt).add(t),()=>{l(this,Lt).delete(t)}}renderPassDescriptor(t={}){const{clear:n=[0,0,0,1],preserve:r}=t;y(this,B,Ce).call(this);const i={view:this.context.getCurrentTexture().createView(),loadOp:r?\"load\":\"clear\",storeOp:\"store\"};return r||(i.clearValue=Ia(n)),{colorAttachments:[i]}}dispose(){var t,n;if(!l(this,it)){x(this,it,!0);try{(n=(t=this.context).unconfigure)==null||n.call(t)}catch{}this.unregister(this),l(this,Ft).clear(),l(this,Lt).clear(),l(this,Qn).emit(this)}}}Qn=new WeakMap,Ft=new WeakMap,Lt=new WeakMap,Me=new WeakMap,pn=new WeakMap,it=new WeakMap,st=new WeakMap,B=new WeakSet,ps=function(t,n,r){const i=!ka(Xr(this.canvas),t);x(this,Me,n),i&&(Va(this.canvas,t),y(this,B,Kc).call(this),r&&y(this,B,Xc).call(this))},Kc=function(){for(const t of[...l(this,Lt)])t()},Xc=function(){x(this,st,!0),jn+=1;try{const t=y(this,B,gs).call(this);for(const n of[...l(this,Ft)])n(t)}finally{jn-=1,x(this,st,!1)}},gs=function(){const t=Xr(this.canvas);return{width:t[0],height:t[1],dpr:l(this,Me),surface:this}},Ce=function(){if(l(this,it))throw Tf(this.options.label)};function ip(e){return typeof e.clientWidth==\"number\"}function sp(e,t,n,r){return t.size?Yr(t.size):n?Oa(e,r):Yr(Xr(e))}function Oa(e,t){const n=e;return Yr([Math.round(n.clientWidth*t),Math.round(n.clientHeight*t)])}function Xr(e){const t=e;return[t.width,t.height]}function Va(e,t){const n=e;n.width=t[0],n.height=t[1]}function Yr(e){return[Math.max(1,Math.floor(e[0])),Math.max(1,Math.floor(e[1]))]}function Na(e){const t=globalThis.devicePixelRatio??1;return Array.isArray(e)?Math.min(e[1],Math.max(e[0],t)):typeof e==\"number\"?e:t}function op(){var e,t,n;return((n=(t=(e=globalThis.navigator)==null?void 0:e.gpu)==null?void 0:t.getPreferredCanvasFormat)==null?void 0:n.call(t))??\"bgra8unorm\"}function ap(){const e=globalThis.GPUTextureUsage;return e?e.RENDER_ATTACHMENT|e.TEXTURE_BINDING|e.COPY_SRC:void 0}const cp={drawIndirect:{bytes:16,args:\"4 u32 values: vertexCount, instanceCount, firstVertex, firstInstance\"},drawIndexedIndirect:{bytes:20,args:\"5 32-bit values: indexCount, instanceCount, firstIndex, baseVertex (signed), firstInstance\"},dispatchWorkgroupsIndirect:{bytes:12,args:\"3 u32 values: workgroupCountX, workgroupCountY, workgroupCountZ\"}};function Ba(e,t,n,r){const i=typeof n==\"object\"&&n!==null?n.buffer:void 0,s=za(n)?n:za(i)?i:void 0;if(!s)throw yt(e,`received ${qa(n)}; expected a StorageBuffer or { buffer, offset? }.`,t);const o=s===n?0:n.offset??0;if(typeof o!=\"number\"||!Number.isInteger(o)||o<0)throw yt(e,`offset must be an integer >= 0; received ${qa(o)}.`,t);if(o%4!==0)throw yt(e,`offset must be a multiple of 4 (WebGPU requires \"indirectOffset is a multiple of 4\"); received ${o}.`,t);if(!s.buffer.options.usage.includes(\"indirect\"))throw yt(e,`the buffer lacks the \"indirect\" usage (WebGPU requires \"indirectBuffer.usage contains INDIRECT\"); create it with storage(gpu, ${s.size}, { indirect: true }).`,t);const{bytes:a,args:c}=cp[r];if(o+a>s.size)throw yt(e,`${r} reads ${a} bytes (${c}) at offset ${o}, but offset + ${a} = ${o+a} exceeds the buffer size ${s.size}.`,t);return{buffer:s.gpu,offset:o}}function za(e){return typeof e==\"object\"&&e!==null&&\"gpu\"in e&&\"size\"in e&&e.buffer instanceof Se}function qa(e){if(typeof e==\"string\")return`\"${e}\"`;try{return JSON.stringify(e)??String(e)}catch{return String(e)}}const Qr=Symbol(\"vgpu.frame.drawable\");function up(e){return e==null?void 0:e[Qr]}const ja=Symbol(\"vgpu.frame.bundle\");function lp(e){return e==null?void 0:e[ja]}const Zr=Symbol(\"vgpu.frame.passAttachment\");function fp(e){return typeof(e==null?void 0:e[Zr])==\"function\"?e:void 0}function dp(e,t){return Jr(Y(e,\"sampler\")).sampler(t)}let Wa=1;function hp(e){const t=new Map,n=new WeakMap;return{sampler(r={}){const i=Yi(r);let s=t.get(i);return s||(s=e.gpu.createSampler(r),t.set(i,s),n.set(s,{kind:\"sampler\",id:Wa++})),s},identity(r){let i=n.get(r);return i||(i={kind:\"sampler\",id:Wa++},n.set(r,i)),i}}}function Yi(e){if(e===null||typeof e!=\"object\")return JSON.stringify(e);if(Array.isArray(e))return`[${e.map(Yi).join(\",\")}]`;const t=e;return`{${Object.keys(t).sort().map(n=>`${JSON.stringify(n)}:${Yi(t[n])}`).join(\",\")}}`}const mp=Mn(\"render-service\");function Jr(e){return e.service(mp,pp)}function pp(e){const t=e.device,n=Ci(),r=La(t,{errorSink:a=>e.reportError(a),registerSettledSource:a=>e.registerSettledSource(a)}),i=Ca(t),s=Fa(t),o=hp(t);return e.own(\"service\",()=>{r.dispose(),i.dispose(),s.dispose(),n.dispose()}),{binds:n,pipelines:r,shaderModules:i,pipelineLayouts:s,sampler:a=>o.sampler(a)}}function Qi(e){if(typeof e==\"string\")return e;if(!gp(e)||!(\"version\"in e)||e.version!==1)throw kr(e);const n=e.wgsl;if(typeof n!=\"string\")throw kr(e);return n}function gp(e){return typeof e==\"object\"&&e!==null}function bp(e,t){const n=Y(e,\"draw\"),r=Jr(n),i=Qi(t.shader);return new Ka(n.device,i,{...t,shader:i},r.binds,void 0,r.pipelines,r.shaderModules,r.pipelineLayouts,s=>n.reportError(s),s=>{n.trackDelivery(s)})}let yp=1;const Ha=new WeakMap;class Ka{constructor(t,n,r,i=Ci(),s,o=La(t),a=Ca(t),c=Fa(t),u,f){w(this,U);m(this,\"source\");m(this,\"label\");w(this,gn,new Map);this.source=n,M(t,\"Draw.constructor\"),this.label=r.label??\"draw\";const d=yp++,h=Ri(n,`${this.label}.wgsl`),g=$p(this.label,r.entry),b=Wi(this.label,h.entryPoints,\"vertex\",g.vertex,\"draw\"),v=Wi(this.label,h.entryPoints,\"fragment\",g.fragment,\"draw\"),E=Tp(h,b,v),k=[b,v].filter(ie=>!!ie),I=ha(h.bindings,k);wp(t,this.label,h.bindings,k,I);const R=r.geometry,H=b?Nn(b,\"inputs\",this.label):[],te=R&&sn in R?R[sn](H,`${this.label}.geometry`):R==null?void 0:R.vertexBufferLayouts,X=new Map(pa(t,this.label,h,I)),z=c.get(X),ve=a.get(n,`${this.label}.shader`),pt=Kp(),_e=_p(this.label,r),p=Ep(this.label,r,_e),S=Pp(t,this.label,r),$=Fp(t,this.label,r),P=Mp(this.label,r),V=Op(this.label,r),ne=Aa(this.label,r.constants,h.overrides,\"draw\"),q=ba({device:t,label:this.label,drawId:d,reflection:h,bindGroupLayouts:X,cache:i,onIdentityChange:ie=>pt.markStale({kind:\"binding-identity\",drawLabel:this.label,...ie})});Ha.set(this,{id:d,device:t,opts:r,vertexBufferLayouts:te,cache:i,defaultTarget:s,reflection:h,visibility:I,vertexEntry:(b==null?void 0:b.name)??\"vs_main\",fragmentEntry:(v==null?void 0:v.name)??\"fs_main\",entryKey:E,setCore:q,bindGroupLayouts:X,pipelineLayout:z,shaderModule:ve,pipelineStore:o,pipelineLayouts:c,errorSink:u,trackSettled:f,resolvedPipelineKeys:new Set,recordedIn:pt,..._e,...p,...S,...$,...P,...V,...ne}),r.set&&this.set(r.set);for(const ie of r.targets??[])this.compileSync(ie)}get gpu(){const t=T(this);for(const n of t.resolvedPipelineKeys){const r=t.pipelineStore.getReady(n);if(r)return r}}get targets(){return T(this).opts.targets}get[Qr](){return this}writesDepth(){return Wp(this)}stencilWritingOps(){return Hp(this)}set(t){const n=T(this);M(n.device,`${this.label}.set`);for(const r of n.setCore.set(t))n.recordedIn.markStale({kind:\"binding-identity\",drawLabel:this.label,...r});return this}group(t,n){const r=T(this);M(r.device,`${this.label}.group`);const i=l(this,gn).get(t)??this.layout(t),s=r.setCore.claimGroup(t,n,i);return r.recordedIn.markStale({kind:\"group-claim\",drawLabel:this.label,group:t,previousIdentity:s,newIdentity:`claimed-group:${t}`}),this}layout(t,n={}){return M(T(this).device,`${this.label}.layout`),n.dynamicOffsets?y(this,U,Yc).call(this,t):T(this).setCore.layout(t)}draw(t={}){var d,h,g,b;M(T(this).device,`${this.label}.draw`);const n=Wr(t)?{target:t}:t,r=T(this),i=n.target??r.defaultTarget;if(!i)throw wi(`${this.label}.draw`);pc(i,`${this.label}.draw`);const s=r.device.gpu.createCommandEncoder(),o=s.beginRenderPass(i.renderPassDescriptor()),a=[];try{this.encode(o,i,n,v=>a.push(v))}catch(v){me(a),ea(r.device);try{o.end()}catch{}throw v}na(r.device,o,a,(d=a[0])==null?void 0:d.context);let c;const u=(h=a[0])==null?void 0:h.context;u&&Bn(r.device,u);try{c=s.finish()}catch(v){const E=u?be(r.device):void 0;me(a),E&&me([E]);const k=(E==null?void 0:E.context)??u;if(k){mc(r,k.label,k.group,v);return}throw v}if(u){const v=be(r.device);v&&(a[0]=a[0]?Gr(v,a[0]):v)}const f=(g=a[0])==null?void 0:g.context;f&&Bn(r.device,f);try{r.device.gpu.queue.submit([c])}catch(v){const E=f?be(r.device):void 0;me(a),E&&me([E]);const k=(E==null?void 0:E.context)??f;if(k){mc(r,k.label,k.group,v);return}throw v}if(f){const v=be(r.device);v&&(a[0]=a[0]?Gr(v,a[0]):v)}if(a.length){const v=ta(r.device,a,{errorSink:r.errorSink});(b=r.trackSettled)==null||b.call(r,v)}}encode(t,n,r={},i){M(T(this).device,`${this.label}.encode`),T(this).setCore.assertUsable();const s=this.pipelineFor(n,!0);if(!s)return;t.setPipeline(s);const o=T(this);o.blendConstant&&t.setBlendConstant(o.blendConstant),o.stencilRef!==void 0&&t.setStencilReference(o.stencilRef);for(const a of o.setCore.bindGroups())y(this,U,Qc).call(this,t,a,r,i);y(this,U,eu).call(this,t,r)}compile(t){M(T(this).device,`${this.label}.compile`);const{key:n,signature:r,signatureKey:i}=y(this,U,hr).call(this,t,`${this.label}.compile`);return T(this).pipelineStore.getAsync(n,()=>y(this,U,ys).call(this,r),{where:`${this.label}.compile`,signature:i}).then(()=>(M(T(this).device,`${this.label}.compile`),T(this).resolvedPipelineKeys.add(n),this))}compileSync(t){M(T(this).device,`${this.label}.compileSync`);const{key:n,signature:r,signatureKey:i}=y(this,U,hr).call(this,t,`${this.label}.compileSync`);return T(this).pipelineStore.getSync(n,()=>y(this,U,bs).call(this,r),{where:`${this.label}.compileSync`,signature:i})&&T(this).resolvedPipelineKeys.add(n),this}pipelineFor(t,n=!1){M(T(this).device,`${this.label}.pipelineFor`);const{key:r,signature:i,signatureKey:s}=y(this,U,hr).call(this,t,`${this.label}.pipelineFor`,n),o=T(this).pipelineStore.getSync(r,()=>y(this,U,bs).call(this,i),{where:`${this.label}.pipelineFor`,signature:s});return o&&T(this).resolvedPipelineKeys.add(r),o}pipelineForAsync(t){M(T(this).device,`${this.label}.pipelineForAsync`);const{key:n,signature:r,signatureKey:i}=y(this,U,hr).call(this,t,`${this.label}.pipelineForAsync`);return T(this).pipelineStore.getAsync(n,()=>y(this,U,ys).call(this,r),{where:`${this.label}.pipelineForAsync`,signature:i}).then(o=>(M(T(this).device,`${this.label}.pipelineForAsync`),T(this).resolvedPipelineKeys.add(n),o))}}gn=new WeakMap,U=new WeakSet,Yc=function(t){const n=T(this);n.setCore.layout(t);const r=l(this,gn).get(t);if(r)return r;const i=Yp(this,t),s=ga(n.device,`${this.label}.group${t}.dynamic.bgl`,i);return l(this,gn).set(t,s),n.bindGroupLayouts.set(t,s),n.pipelineLayout=n.pipelineLayouts.get(n.bindGroupLayouts),s},Qc=function(t,n,r,i){const s=Xp(r.offsets,n.group,n.offsets);if(!n.claimValidation||!i){t.setBindGroup(n.group,n.bindGroup,s);return}Bn(T(this).device,n.claimValidation);try{t.setBindGroup(n.group,n.bindGroup,s)}catch(a){throw Nh(T(this).device),Zt(n.claimValidation.label,n.claimValidation.group,a)}const o=be(T(this).device);o&&i(o)},hr=function(t,n,r=!1){const i=y(this,U,Zc).call(this,t,n,r),s=Hr(i);return{signature:i,signatureKey:s,key:y(this,U,Jc).call(this,i)}},Zc=function(t,n,r=!1){var a;const i=T(this),s=t??i.defaultTarget;if(!s)throw wi(n);r||pc(s,n);const o=$a(s);if(Ta(o,n),i.colorStates&&i.colorStates.length!==o.colors.length)throw gi(this.label,`expected one entry per color attachment; colors has ${i.colorStates.length}, but the target signature has ${o.colors.length}.`,n);if((a=i.multisampleState)!=null&&a.alphaToCoverageEnabled&&(o.sampleCount??1)<=1)throw _r(this.label,`alphaToCoverage requires a multisampled target, but the target signature has sampleCount ${o.sampleCount??1}; create the target with msaa: true.`,n);if((i.stencilState||i.stencilRef!==void 0)&&!qn(o.depth))throw Jt(this.label,`stencil requires a depth format with a stencil aspect, but the target signature has ${o.depth?`\"${o.depth}\"`:\"no depth\"}; create the target with depth: \"depth24plus-stencil8\".`,n);return o},Jc=function(t){const n=T(this),r=n.opts.geometry;return Vm({module:n.shaderModule,pipelineLayout:n.pipelineLayout,vertexBufferLayouts:n.vertexBufferLayouts,signature:t,fragmentKey:n.fragmentKey,topology:r==null?void 0:r.topology,stripIndexFormat:Ya(r),cullMode:n.cullMode,frontFace:n.frontFace,unclippedDepth:n.unclippedDepth,depthKey:n.depthKey,stencilKey:n.stencilKey,multisampleKey:n.multisampleKey,constantsKey:n.constantsKey,entryKey:n.entryKey})},eu=function(t,n={}){const r=T(this).opts.geometry;if(r!=null&&r.vertexBuffers&&r.vertexBuffers.forEach((s,o)=>t.setVertexBuffer(o,s)),n.indirect!==void 0)return y(this,U,tu).call(this,t,r,n);const i=vp(this.label,r,T(this).opts,n);if(!(r!=null&&r.indexBuffer))return t.draw(i.vertexCount,i.instanceCount,i.firstVertex,i.firstInstance);t.setIndexBuffer(r.indexBuffer,r.indexFormat??\"uint32\"),t.drawIndexed(i.indexCount,i.instanceCount,i.firstIndex,i.baseVertex,i.firstInstance)},tu=function(t,n,r){const i=`${this.label}.draw`,s=xp.find(u=>r[u]!==void 0);if(s!==void 0)throw yt(this.label,`indirect cannot be combined with ${s} in the same call; the GPU reads the draw arguments from the buffer, so the CPU-side value would be ignored.`,i);const o=!!(n!=null&&n.indexBuffer),{buffer:a,offset:c}=Ba(this.label,i,r.indirect,o?\"drawIndexedIndirect\":\"drawIndirect\");if(!o)return t.drawIndirect(a,c);t.setIndexBuffer(n.indexBuffer,n.indexFormat??\"uint32\"),t.drawIndexedIndirect(a,c)},bs=function(t){const n=T(this);return n.device.gpu.createRenderPipeline({label:`${this.label}.pipeline`,layout:n.pipelineLayout,vertex:{module:n.shaderModule,entryPoint:n.vertexEntry,buffers:[...n.vertexBufferLayouts??[]],...n.constants?{constants:n.constants}:{}},fragment:{module:n.shaderModule,entryPoint:n.fragmentEntry,targets:Xa(t,n),...n.constants?{constants:n.constants}:{}},primitive:Qa(n.opts.geometry,n.cullMode,n.frontFace,n.unclippedDepth),depthStencil:oc(t,n),multisample:uc(t,n)})},ys=function(t){const n=T(this);return n.device.gpu.createRenderPipelineAsync({label:`${this.label}.pipeline`,layout:n.pipelineLayout,vertex:{module:n.shaderModule,entryPoint:n.vertexEntry,buffers:[...n.vertexBufferLayouts??[]],...n.constants?{constants:n.constants}:{}},fragment:{module:n.shaderModule,entryPoint:n.fragmentEntry,targets:Xa(t,n),...n.constants?{constants:n.constants}:{}},primitive:Qa(n.opts.geometry,n.cullMode,n.frontFace,n.unclippedDepth),depthStencil:oc(t,n),multisample:uc(t,n)})};function wp(e,t,n,r,i){const s=e.limits;for(const[o,a,c]of[[\"vertex\",1,\"maxStorageBuffersInVertexStage\"],[\"fragment\",2,\"maxStorageBuffersInFragmentStage\"]]){const u=r.find(h=>h.stage===o);if(!u)continue;const f=n.filter(h=>{var g;return((g=h.bindingLayout)==null?void 0:g.kind)===\"buffer\"&&h.bindingLayout.buffer.type!==\"uniform\"&&i(h)&a}),d=s[c]??s.maxStorageBuffersPerShaderStage;if(d!==void 0&&f.length>d)throw Zl(t,o,u.name,f.length,d,f)}}const xp=[\"vertices\",\"indices\",\"instances\",\"firstVertex\",\"firstIndex\",\"baseVertex\",\"firstInstance\"];function Xa(e,t){return e.colors.map((n,r)=>{var c;const i=(c=t.colorStates)==null?void 0:c[r],s=(i==null?void 0:i.blendState)??t.blendState,o=(i==null?void 0:i.writeMask)??t.writeMask,a={format:n};return s&&(a.blend=s),o!==void 0&&(a.writeMask=o),a})}function vp(e,t,n,r){Je(e,\"DrawOptions.instances\",n.instances),Je(e,\"DrawOptions.vertices\",n.vertices),Je(e,\"DrawOptions.firstInstance\",n.firstInstance),Je(e,\"DrawCallOptions.instances\",r.instances),Ze(e,\"DrawCallOptions.vertices\",r.vertices),Ze(e,\"DrawCallOptions.indices\",r.indices),Ze(e,\"DrawCallOptions.firstVertex\",r.firstVertex),Ze(e,\"DrawCallOptions.firstIndex\",r.firstIndex),Ze(e,\"DrawCallOptions.baseVertex\",r.baseVertex),Je(e,\"DrawCallOptions.firstInstance\",r.firstInstance),Je(e,\"GeometryLike.vertexCount\",t==null?void 0:t.vertexCount),Je(e,\"GeometryLike.indexCount\",t==null?void 0:t.indexCount),Je(e,\"GeometryLike.instanceCount\",t==null?void 0:t.instanceCount),Ze(e,\"GeometryLike.firstVertex\",t==null?void 0:t.firstVertex),Ze(e,\"GeometryLike.firstIndex\",t==null?void 0:t.firstIndex),Ze(e,\"GeometryLike.baseVertex\",t==null?void 0:t.baseVertex);const i=!!(t!=null&&t.indexBuffer),o=(t==null?void 0:t.geometry)??(t&&sn in t?t:void 0),a=r.firstVertex??(t==null?void 0:t.firstVertex)??0,c=r.vertices??(t==null?void 0:t.vertexCount)??n.vertices??3,u=r.firstIndex??(t==null?void 0:t.firstIndex)??0,f=r.indices??(t==null?void 0:t.indexCount)??0,d=r.baseVertex??(t==null?void 0:t.baseVertex)??0;if(i)Za(e,\"index\",u,f,o==null?void 0:o.indexCount);else if(r.indices!==void 0||r.firstIndex!==void 0||r.baseVertex!==void 0)throw nn(`${e}.draw`,\"Index range needs an indexed geometry.\");return i||Za(e,\"vertex\",a,c,o==null?void 0:o.vertexCount),{instanceCount:r.instances??n.instances??(t==null?void 0:t.instanceCount)??1,firstInstance:r.firstInstance??n.firstInstance??0,vertexCount:c,firstVertex:a,indexCount:f,firstIndex:u,baseVertex:d}}function Ya(e){const t=(e==null?void 0:e.topology)??\"triangle-list\";return(e==null?void 0:e.stripIndexFormat)??(t.endsWith(\"strip\")?e==null?void 0:e.indexFormat:void 0)}function Qa(e,t,n,r){const i=(e==null?void 0:e.topology)??\"triangle-list\",s=Ya(e),o=s?{topology:i,stripIndexFormat:s}:{topology:i};return t!==void 0&&(o.cullMode=t),n!==void 0&&(o.frontFace=n),r&&(o.unclippedDepth=!0),o}function Za(e,t,n,r,i){if(!(i===void 0||n+r<=i))throw nn(`${e}.draw`,`${t} range [${n}, ${n+r}) exceeds parent geometry ${t} count ${i}.`)}function Ze(e,t,n){if(!(n===void 0||Number.isInteger(n)&&n>=0))throw nn(`${e}.draw`,`${t} must be an integer >= 0; received ${String(n)}.`)}function Je(e,t,n){if(n!==void 0&&!(Number.isInteger(n)&&n>=0))throw new _({code:\"VGPU-R1-DRAW-COUNT\",message:`${t} of '${e}' must be an integer >= 0; received ${String(n)}. Use 0 only when you want to issue a valid draw with no vertices/instances.`,where:`${e}.draw`})}function _p(e,t){const n=t.blend===void 0?void 0:Ja(e,t.blend),r=t.writeMask===void 0?void 0:lc(e,t.writeMask),i=t.colors===void 0?void 0:Sp(e,t.colors),s=i?`${fc(n,r)}@${i.map(Np).join(\"@\")}`:n||r!==void 0?fc(n,r):void 0;return{blendState:n,writeMask:r,colorStates:i,fragmentKey:s}}function Sp(e,t){if(!Array.isArray(t))throw gi(e,`colors must be an array; received ${O(t)}.`);return t.map((n,r)=>{if(n==null)return null;if(typeof n!=\"object\"||Array.isArray(n))throw gi(e,`colors[${r}] must be null or { blend?, writeMask? }; received ${O(n)}.`);const i=n.blend===void 0?void 0:Ja(`${e}.colors[${r}]`,n.blend),s=n.writeMask===void 0?void 0:lc(`${e}.colors[${r}]`,n.writeMask);return!i&&s===void 0?null:{blendState:i,writeMask:s}})}function Ja(e,t){if(t===\"alpha\")return ei({src:\"src-alpha\",dst:\"one-minus-src-alpha\"},{src:\"one\",dst:\"one-minus-src-alpha\"});if(t===\"premultiplied\")return ei({src:\"one\",dst:\"one-minus-src-alpha\"},{src:\"one\",dst:\"one-minus-src-alpha\"});if(t===\"additive\")return ei({src:\"one\",dst:\"one\"},{src:\"one\",dst:\"one\"});if(typeof t!=\"object\"||t===null||!ec(t.color))throw fo(e,t);const n=t.color,r=t.alpha;if(r!==void 0&&!ec(r))throw fo(e,t);return ei(n,r??n)}function ec(e){return typeof e==\"object\"&&e!==null&&typeof e.src==\"string\"&&typeof e.dst==\"string\"}function ei(e,t){return{color:tc(e),alpha:tc(t)}}function tc(e){return{srcFactor:e.src,dstFactor:e.dst,operation:e.op??\"add\"}}function Ep(e,t,n){if(t.blendConstant===void 0)return{};const r=t.blendConstant;if(!Array.isArray(r)||r.length!==4||r.some(i=>typeof i!=\"number\"||!Number.isFinite(i)))throw ho(e,`received ${O(r)}; expected [r, g, b, a] finite numbers.`);if(!Ip(n).some(i=>i&&kp(i)))throw ho(e,`no color target's effective blend uses a \"constant\"/\"one-minus-constant\" factor (colors[i].blend replaces the top-level blend for that target), so blendConstant would have no effect.`);return{blendConstant:{r:r[0],g:r[1],b:r[2],a:r[3]}}}function Ip(e){return e.colorStates?e.colorStates.map(t=>(t==null?void 0:t.blendState)??e.blendState):[e.blendState]}function kp(e){return[e.color.srcFactor,e.color.dstFactor,e.alpha.srcFactor,e.alpha.dstFactor].some(t=>t===\"constant\"||t===\"one-minus-constant\")}function $p(e,t){if(t===void 0)return{};if(typeof t!=\"object\"||t===null||Array.isArray(t))throw Er(e,`received ${O(t)}; expected { vertex?, fragment? } entry point names.`);return t}function Tp(e,t,n){const r=e.entryPoints.find(s=>s.stage===\"vertex\"),i=e.entryPoints.find(s=>s.stage===\"fragment\");if(!(t===r&&n===i))return`en~${(t==null?void 0:t.name)??\"\"}~${(n==null?void 0:n.name)??\"\"}`}function Pp(e,t,n){const r=n.cull===void 0?void 0:Rp(t,n.cull),i=n.frontFace===void 0?void 0:Cp(t,n.frontFace),s=n.unclippedDepth===void 0?void 0:Ap(e,t,n.unclippedDepth);return{cullMode:r,frontFace:i,unclippedDepth:s}}function Ap(e,t,n){if(typeof n!=\"boolean\")throw po(t,`received ${O(n)}; expected a boolean.`);if(n){if(!e.features.has(\"depth-clip-control\"))throw po(t,'the device lacks the \"depth-clip-control\" feature; request it at init: init({ requiredFeatures: [\"depth-clip-control\"] }) on an adapter that supports it.');return!0}}function Rp(e,t){if(t===\"none\"||t===\"front\"||t===\"back\")return t;throw sf(e,t)}function Cp(e,t){if(t===\"ccw\"||t===\"cw\")return t;throw of(e,t)}const nc={depthWriteEnabled:!0,depthCompare:\"less-equal\"},rc=[\"never\",\"less\",\"equal\",\"less-equal\",\"greater\",\"not-equal\",\"greater-equal\",\"always\"],ic=-2147483648,sc=2147483647;function oc(e,t){if(e.depth)return{format:e.depth,...t.depthState??nc,...t.stencilState??{}}}function Fp(e,t,n){var i;if(n.depth===void 0)return{};const r=Lp(e,t,n.depth,((i=n.geometry)==null?void 0:i.topology)??\"triangle-list\");return{depthState:r,depthKey:Dp(r)}}function Lp(e,t,n,r){if(n===!1)return{depthWriteEnabled:!1,depthCompare:\"always\"};if(typeof n!=\"object\"||n===null)throw Le(t,`received ${O(n)}.`);if(n.write!==void 0&&typeof n.write!=\"boolean\")throw Le(t,`write must be a boolean; received ${O(n.write)}.`);if(n.compare!==void 0&&!rc.includes(n.compare))throw Le(t,`compare must be a GPUCompareFunction; received ${O(n.compare)}.`);if(n.bias!==void 0&&!Number.isInteger(n.bias))throw Le(t,`bias must be an integer (WebGPU depthBias is i32); received ${O(n.bias)}.`);if(n.bias!==void 0&&(n.bias<ic||n.bias>sc))throw Le(t,`bias must fit in the i32 range [${ic}, ${sc}] (WebGPU depthBias is i32); received ${O(n.bias)}.`);if(n.biasSlopeScale!==void 0&&!Number.isFinite(n.biasSlopeScale))throw Le(t,`biasSlopeScale must be a finite number; received ${O(n.biasSlopeScale)}.`);if(n.biasClamp!==void 0&&!Number.isFinite(n.biasClamp))throw Le(t,`biasClamp must be a finite number; received ${O(n.biasClamp)}.`);const i=n.bias??0,s=n.biasSlopeScale??0,o=n.biasClamp??0;if((i!==0||s!==0||o!==0)&&!r.startsWith(\"triangle\"))throw Le(t,`bias, biasSlopeScale, and biasClamp must be 0 for \"${r}\" topology.`);if(o!==0&&e.isCompatibilityMode)throw Le(t,`biasClamp must be 0 on a compatibility-mode device; received ${O(n.biasClamp)}.`);return{depthWriteEnabled:n.write??!0,depthCompare:n.compare??\"less-equal\",...i!==0?{depthBias:i}:{},...s!==0?{depthBiasSlopeScale:s}:{},...o!==0?{depthBiasClamp:o}:{}}}function Dp(e){return`${e.depthWriteEnabled?1:0}~${e.depthCompare}~${e.depthBias??0}~${e.depthBiasSlopeScale??0}~${e.depthBiasClamp??0}`}const Up=[\"keep\",\"zero\",\"replace\",\"invert\",\"increment-clamp\",\"decrement-clamp\",\"increment-wrap\",\"decrement-wrap\"];function Mp(e,t){if(t.stencil===void 0)return{};const n=t.stencil;if(typeof n!=\"object\"||n===null||Array.isArray(n))throw Jt(e,`received ${O(n)}; expected { front?, back?, readMask?, writeMask?, ref? }.`);const r=n.front===void 0?void 0:ac(e,\"front\",n.front),i=n.back===void 0?void 0:ac(e,\"back\",n.back);Zi(e,\"readMask\",n.readMask),Zi(e,\"writeMask\",n.writeMask),Zi(e,\"ref\",n.ref);const s={...r?{stencilFront:r}:{},...i??r?{stencilBack:i??{...r}}:{},...n.readMask!==void 0?{stencilReadMask:n.readMask}:{},...n.writeMask!==void 0?{stencilWriteMask:n.writeMask}:{}},o=s.stencilFront!==void 0||s.stencilBack!==void 0||s.stencilReadMask!==void 0||s.stencilWriteMask!==void 0;return!o&&n.ref===void 0?{}:{...o?{stencilState:s,stencilKey:Gp(s)}:{},...n.ref!==void 0?{stencilRef:n.ref}:{}}}function ac(e,t,n){if(typeof n!=\"object\"||n===null||Array.isArray(n))throw Jt(e,`${t} must be a { compare?, fail?, depthFail?, pass? } object; received ${O(n)}.`);if(n.compare!==void 0&&!rc.includes(n.compare))throw Jt(e,`${t}.compare must be a GPUCompareFunction; received ${O(n.compare)}.`);for(const[r,i]of[[\"fail\",n.fail],[\"depthFail\",n.depthFail],[\"pass\",n.pass]])if(i!==void 0&&!Up.includes(i))throw Jt(e,`${t}.${r} must be a GPUStencilOperation; received ${O(i)}.`);return{compare:n.compare??\"always\",failOp:n.fail??\"keep\",depthFailOp:n.depthFail??\"keep\",passOp:n.pass??\"keep\"}}function Zi(e,t,n){if(n!==void 0&&(typeof n!=\"number\"||!Number.isInteger(n)||n<0||n>4294967295))throw Jt(e,`${t} must be an integer in [0, 0xFFFFFFFF] (WebGPU GPUStencilValue is u32); received ${O(n)}.`)}function Gp(e){return`st~${cc(e.stencilFront)}~${cc(e.stencilBack)}~${e.stencilReadMask??4294967295}~${e.stencilWriteMask??4294967295}`}function cc(e){return e?`${e.compare},${e.failOp},${e.depthFailOp},${e.passOp}`:\"default\"}function uc(e,t){return{count:e.sampleCount??1,...t.multisampleState??{}}}function Op(e,t){if(t.multisample===void 0)return{};const n=t.multisample;if(typeof n!=\"object\"||n===null||Array.isArray(n))throw _r(e,`received ${O(n)}; expected { alphaToCoverage?, mask? }.`);if(n.alphaToCoverage!==void 0&&typeof n.alphaToCoverage!=\"boolean\")throw _r(e,`alphaToCoverage must be a boolean; received ${O(n.alphaToCoverage)}.`);if(n.mask!==void 0&&(typeof n.mask!=\"number\"||!Number.isInteger(n.mask)||n.mask<0||n.mask>4294967295))throw _r(e,`mask must be an integer in [0, 0xFFFFFFFF] (WebGPU GPUSampleMask is u32); received ${O(n.mask)}.`);const r={...n.alphaToCoverage!==void 0?{alphaToCoverageEnabled:n.alphaToCoverage}:{},...n.mask!==void 0?{mask:n.mask}:{}};return r.alphaToCoverageEnabled===void 0&&r.mask===void 0?{}:{multisampleState:r,multisampleKey:Vp(r)}}function Vp(e){return`ms~${e.alphaToCoverageEnabled?1:0}~${e.mask??4294967295}`}function lc(e,t){if(!Array.isArray(t))throw mo(e,O(t));let n=0;for(const r of t)if(r===\"r\")n|=1;else if(r===\"g\")n|=2;else if(r===\"b\")n|=4;else if(r===\"a\")n|=8;else throw mo(e,O(r));return n}function fc(e,t){return`${dc(e)};${t??15}`}function dc(e){if(!e)return\"none;none\";const t=e.color,n=e.alpha;return`${t.srcFactor},${t.dstFactor},${t.operation};${n.srcFactor},${n.dstFactor},${n.operation}`}function Np(e){return e?`${e.blendState?dc(e.blendState):\"inherit\"};${e.writeMask??\"inherit\"}`:\"inherit\"}function O(e){if(typeof e==\"string\")return`\"${e}\"`;try{return JSON.stringify(e)??String(e)}catch{return String(e)}}function Bp(e,t){return T(e).setCore.watchResources(n=>t({kind:\"binding-identity\",drawLabel:e.label,...n}))}function zp(e,t){T(e).recordedIn.add(t)}function qp(e){return T(e).blendConstant!==void 0}function jp(e){return T(e).stencilRef!==void 0}function Wp(e){return(T(e).depthState??nc).depthWriteEnabled}function Hp(e){const t=T(e),n=t.stencilState;if(!n||n.stencilWriteMask===0)return[];const r=t.cullMode??\"none\",i=[],s=(o,a)=>{if(a)for(const[c,u]of[[\"fail\",a.failOp],[\"depthFail\",a.depthFailOp],[\"pass\",a.passOp]])u!==void 0&&u!==\"keep\"&&i.push(`${o}.${c}: \"${u}\"`)};return r!==\"front\"&&s(\"front\",n.stencilFront),r!==\"back\"&&s(\"back\",n.stencilBack),i}function hc(e,t,n,r={},i){e.encode(t,n,r,i)}function T(e){const t=Ha.get(e);if(!t)throw new TypeError(\"Invalid Draw instance\");return t}function mc(e,t,n,r){var s;const i=(async()=>{await Fi(e.device),M(e.device,`${t}.validation`);const o=Zt(t,n,r);e.errorSink?await e.errorSink(o):console.error(o)})();return(s=e.trackSettled)==null||s.call(e,i),i}function Kp(){const e=new Set;return{add(t){e.add(t)},delete(t){e.delete(t)},list(){return[...e]},markStale(t){for(const n of e)n.markStale(t)}}}function Xp(e,t,n){return e?Array.isArray(e)?e:e[t]??n:n}function Yp(e,t){const n=T(e);return ma(n.reflection.bindings,t,n.visibility).map(Qp)}function Qp(e){return e.buffer?{...e,buffer:{...e.buffer,hasDynamicOffset:!0}}:e}function pc(e,t){if(Xi(e)&&!Ma())throw xi(t)}function Zp(e,t,n={}){if(\"geometry\"in n)throw G(\"effect\",\"effect() never accepts vertex buffers; use draw(gpu, { shader, geometry: geometry(gpu, descriptor) }).\");const r=Y(e,\"effect\"),i=Jr(r);return new bc(r.device,Qi(t),n,i.binds,void 0,i.pipelines,i.shaderModules,i.pipelineLayouts,s=>r.reportError(s),s=>{r.trackDelivery(s)})}const gc=new WeakMap;class bc{get gpu(){return et(this).gpu}constructor(t,n,r={},i,s,o,a,c,u,f){const d=eg(n),h=new Ka(t,d,{shader:d,set:r.set,label:r.label??\"effect\",blend:r.blend,writeMask:r.writeMask},i,s,o,a,c,u,f);gc.set(this,h)}set(t){return et(this).set(t),this}draw(t={}){et(this).draw(Wr(t)?{target:t}:t)}compile(t){return et(this).compile(t).then(()=>this)}compileSync(t){return et(this).compileSync(t),this}encode(t,n,r={},i){hc(et(this),t,n,r,i)}get[Qr](){return et(this)[Qr]}}function Jp(e){return et(e)}function et(e){const t=gc.get(e);if(!t)throw new TypeError(\"Invalid Effect instance\");return t}function eg(e){return tg(e)?e:`\nstruct VgpuFullscreenVertexOut {\n  @builtin(position) position: vec4f,\n  @location(0) uv: vec2f,\n};\n@vertex fn vgpu_fullscreen_vs(@builtin(vertex_index) vi: u32) -> VgpuFullscreenVertexOut {\n  var pos = array<vec2f, 3>(vec2f(-1.0, -1.0), vec2f(3.0, -1.0), vec2f(-1.0, 3.0));\n  var uv = array<vec2f, 3>(vec2f(0.0, 1.0), vec2f(2.0, 1.0), vec2f(0.0, -1.0));\n  var out: VgpuFullscreenVertexOut;\n  out.position = vec4f(pos[vi], 0.0, 1.0);\n  out.uv = uv[vi];\n  return out;\n}\n${e}`}function tg(e){return Ri(e,\"effect.wgsl\").entryPoints.some(t=>t.stage===\"vertex\")}function ng(e,t,n){return ig(Y(e,\"bundle\").device,t,n)}let rg=1,Ji=0;function ig(e,t,n){const r=t.label??`bundle${rg++}`;if(Xi(t.target)&&!Ma())throw xi(\"bundle\");const i=yc(t.target),s=new sg(e,r,i);return s.record(n),s}class sg{constructor(t,n,r){w(this,Ut);m(this,\"device\");m(this,\"id\");m(this,\"signature\");m(this,\"gpu\");w(this,Dt);w(this,bn);w(this,Zn,new Set);w(this,Jn,[]);this.device=t,this.id=n,this.signature=r,x(this,bn,Hr(r))}record(t){try{this.gpu=hd(this.device,{label:this.id,colorFormats:this.signature.colors,depthStencilFormat:this.signature.depth,sampleCount:this.signature.sampleCount??1,record:n=>y(this,Ut,nu).call(this,t,n.gpu)})}catch(n){throw y(this,Ut,ws).call(this),n}for(const n of l(this,Zn))zp(n,this)}get[ja](){return this}markStale(t){Ji>0&&!(t.kind===\"binding-identity\"&&t.newIdentity.startsWith(\"destroyed:\"))||(l(this,Dt)??x(this,Dt,t),y(this,Ut,ws).call(this))}assertReplayable(t){const n=yc(t),r=Hr(n);if(l(this,bn)!==r)throw wc(this.id,ag(this.id,l(this,bn),r));if(l(this,Dt))throw wc(this.id,cg(this.id,l(this,Dt)))}remember(t){l(this,Zn).add(t),l(this,Dt)||l(this,Jn).push(Bp(t,n=>this.markStale(n)))}}Dt=new WeakMap,bn=new WeakMap,Zn=new WeakMap,Jn=new WeakMap,Ut=new WeakSet,ws=function(){for(const t of l(this,Jn).splice(0))t()},nu=function(t,n){Ji+=1;try{t(new og(this,n))}finally{Ji-=1}};class og{constructor(t,n){m(this,\"bundle\");m(this,\"encoder\");this.bundle=t,this.encoder=n}draw(t,n={}){const r=t instanceof bc?Jp(t):t;if(qp(r))throw rf(this.bundle.id,r.label);if(jp(r))throw af(this.bundle.id,r.label);this.bundle.remember(r),hc(r,this.encoder,this.bundle.signature,n)}}function yc(e){const t=$a(e);return Ta(t,\"bundle\"),t}function ag(e,t,n){return`bundle '${e}' is stale: the replay target signature does not match the recorded signature. Bundles freeze format/depth/sampleCount and bind groups.\n  Recorded signature: ${t}\n  Actual signature: ${n}\n  Fix: re-record the bundle for this target → ${e} = bundle(gpu, { target: scene }, ...)\n  (re-recording is always your responsibility; the library only detects this).`}function cg(e,t){return t.kind===\"group-claim\"?`bundle '${e}' is stale: group ${t.group} of draw\n  '${t.drawLabel}' changed bind group after recording. Bundles freeze commands and bind groups.\n  Fix: re-record it → ${e} = bundle(gpu, { target: scene }, ...)\n  (re-recording is always your responsibility; the library only detects this).`:`bundle '${e}' is stale: binding \\`${t.bindingName}\\` (@group(${t.group}) @binding(${t.binding})) of draw\n  '${t.drawLabel}' changed resource after recording. Bundles freeze commands and bind groups.\n  Fix: re-record it → ${e} = bundle(gpu, { target: scene }, ...)\n  (re-recording is always your responsibility; the library only detects this).`}function wc(e,t){return new _({code:\"VGPU-R3-BUNDLE-STALE\",message:t,where:`bundle '${e}' replay`})}const ug=Mn(\"clock\");function lg(e){return fg(Y(e,\"clock\"))}function fg(e){return e.service(ug,t=>{const n=Kr(t),r=i=>{if(t.disposed)throw To(i);M(t.device,i)};return{get time(){return r(\"clock.time\"),n.time},get deltaTime(){return r(\"clock.deltaTime\"),n.deltaTime},get frameCount(){return r(\"clock.frameCount\"),n.frameCount},advance(i){if(r(\"clock.advance\"),typeof i!=\"number\"||!Number.isFinite(i)||i<0)throw Cf(i);n.advanceBy(i)}}})}function dg(e,t,n={}){const r=Y(e,\"compute\");return new mg(r.device,Qi(t),n,Jr(r).binds)}let hg=1;class mg{constructor(t,n,r={},i=Ci()){w(this,wn);m(this,\"device\");m(this,\"source\");m(this,\"opts\");m(this,\"cache\");m(this,\"id\",hg++);m(this,\"label\");m(this,\"reflection\");m(this,\"entryPoint\");m(this,\"setCore\");m(this,\"bindGroupLayouts\");m(this,\"pipelineLayout\");m(this,\"shaderModule\");m(this,\"pipeline\");w(this,yn);this.device=t,this.source=n,this.opts=r,this.cache=i,M(t,\"Compute.constructor\"),this.label=r.label??\"compute\",this.reflection=Ri(n,`${this.label}.wgsl`);const s=pg(this.reflection,this.label,r.entry);this.entryPoint=s.name;const{constants:o}=Aa(this.label,r.constants,this.reflection.overrides,\"compute\");this.bindGroupLayouts=pa(t,this.label,this.reflection,ha(this.reflection.bindings,[s])),this.pipelineLayout=wm(t,this.bindGroupLayouts),this.shaderModule=t.gpu.createShaderModule({label:`${this.label}.shader`,code:n}),this.pipeline=t.gpu.createComputePipeline({label:`${this.label}.pipeline`,layout:this.pipelineLayout,compute:{module:this.shaderModule,entryPoint:this.entryPoint,...o?{constants:o}:{}}}),this.setCore=ba({device:t,label:this.label,drawId:`compute:${this.id}`,reflection:this.reflection,bindGroupLayouts:this.bindGroupLayouts,cache:this.cache});const a=new Set(Nn(s,\"bindings\",this.label).map(c=>`${c.group}:${c.binding}`));x(this,yn,this.reflection.bindings.filter(c=>c.kind===\"buffer\"&&c.addressSpace===\"storage\"&&a.has(`${c.group}:${c.binding}`))),r.set&&this.set(r.set)}set(t){return M(this.device,`${this.label}.set`),this.setCore.set(t),this}dispatch(t,n,r){M(this.device,`${this.label}.dispatch`);const i=typeof t==\"object\"&&t!==null?y(this,wn,ru).call(this,t,n,r):void 0;y(this,wn,iu).call(this);const s=this.setCore.bindGroups(),o=this.device.gpu.createCommandEncoder({label:`${this.label}.encoder`}),a=o.beginComputePass({label:`${this.label}.pass`});a.setPipeline(this.pipeline);for(const c of s)a.setBindGroup(c.group,c.bindGroup,c.offsets);i?a.dispatchWorkgroupsIndirect(i.buffer,i.offset):a.dispatchWorkgroups(t,n??1,r??1),a.end(),this.device.gpu.queue.submit([o.finish()])}}yn=new WeakMap,wn=new WeakSet,ru=function(t,n,r){const i=`${this.label}.dispatch`;if(n!==void 0||r!==void 0)throw yt(this.label,\"indirect cannot be combined with explicit workgroup counts in the same call; the GPU reads the counts from the buffer, so the CPU-side values would be ignored.\",i);return Ba(this.label,i,t.indirect,\"dispatchWorkgroupsIndirect\")},iu=function(){if(!l(this,yn).length)return;const t=new Map;for(const n of l(this,yn)){const r=this.setCore.bindingState(n.name);if(!r)continue;const i=Ur(r.identity);t.has(i)||t.set(i,[]),t.get(i).push({identity:r.identity,writable:n.access!==\"read\"})}for(const n of t.values())if(!(n.length<2)&&n.some(r=>r.writable))throw Mf(`${this.label}.dispatch`)};function pg(e,t,n){const r=Wi(t,e.entryPoints,\"compute\",n,\"compute\");if(!r)throw G(`${t}.compute`,\"The compute shader requires a @compute entry point.\");return r}function gg(e,t){return vc(Y(e,\"frame\")).frame(t)}function bg(e,t,n={}){return vc(Y(e,\"frameLoop\")).loop(t,n)}let xc;const yg=Mn(\"frame-runner\");function vc(e){return e.service(yg,t=>{const n=Kr(t);return new Pg(()=>{let r=()=>{};const i=new wg(t.device,void 0,s=>t.reportError(s),s=>{t.trackDelivery(s)},()=>r());return r=t.own(\"scheduler\",()=>i.cancel()),i},()=>n.tick(),r=>t.own(\"scheduler\",()=>r.stop()))})}class wg{constructor(t,n,r,i,s){w(this,D);m(this,\"device\");m(this,\"defaultTarget\");m(this,\"errorSink\");m(this,\"trackSettled\");m(this,\"releaseLifecycle\");m(this,\"done\",Promise.resolve());w(this,Mt);w(this,W,[]);w(this,Ge,new Set);w(this,ot,new Set);w(this,Oe,!1);w(this,Ve,!1);w(this,xn,!1);this.device=t,this.defaultTarget=n,this.errorSink=r,this.trackSettled=i,this.releaseLifecycle=s,M(t,\"Frame.constructor\"),x(this,Mt,t.gpu.createCommandEncoder({label:\"vgpu.frame\"}))}pass(t,n){var v;if(l(this,Ve))throw Eo(\"Frame.pass\");M(this.device,\"Frame.pass\");const r=Wr(t),i=typeof n==\"function\"?n:E=>E.draw(n),s=r?t:t.target??this.defaultTarget;if(!s)throw wi(\"Frame.pass\");if(Xi(s)&&l(this,Oe))throw xi(\"Frame.pass\");const o=r?void 0:t.clear,a=o===!1;if(a&&s.sampleCount===4)throw cf();const c=r?void 0:t.clearDepth;if(c!==void 0){if(typeof c!=\"number\"||!(c>=0&&c<=1))throw go(c);if(a)throw uf();if(!s.depth)throw go(c,\"but the target has no depth attachment, so clearDepth would have no effect.\",\"Create the target with depth: true (or a depth format), or drop clearDepth.\")}const u=r?void 0:t.clearStencil;if(u!==void 0){if(typeof u!=\"number\"||!Number.isInteger(u)||u<0||u>4294967295)throw bo(`received ${String(u)}; expected an integer in [0, 0xFFFFFFFF] (WebGPU GPUStencilValue).`);if(a)throw lf();const E=(v=s.depth)==null?void 0:v.format;if(!qn(E))throw bo(`received ${String(u)}, but the target's depth format ${E?`\"${E}\"`:\"(none)\"} has no stencil aspect, so clearStencil would have no effect.`)}const f=r?void 0:t.depthReadOnly;if(f!==void 0&&typeof f!=\"boolean\")throw wt(`received ${tt(f)}; expected a boolean.`,\"Pass depthReadOnly: true to open the pass with a read-only depth attachment, or omit it.\");if(f){if(!s.depth)throw wt(\"is set, but the target has no depth attachment, so there is nothing to make read-only.\",\"Create the target with depth: true (or a depth format), or drop depthReadOnly.\");if(s.sampleCount===4)throw ff();if(c!==void 0)throw wt(\"cannot be combined with clearDepth; a read-only depth aspect omits its load/store ops and is never cleared.\",\"Remove clearDepth, or drop depthReadOnly.\");if(u!==void 0)throw wt(\"cannot be combined with clearStencil; a read-only stencil aspect omits its load/store ops and is never cleared.\",\"Remove clearStencil, or drop depthReadOnly.\")}const d=r?void 0:kg(t.viewport,this.device.gpu.limits,s.size),h=r?void 0:$g(t.scissor,s.size),g=[];let b;try{const E=r||t.timer===void 0?void 0:y(this,D,_s).call(this,t.timer,s,g,Eg),k=r||t.visibility===void 0?void 0:y(this,D,_s).call(this,t.visibility,s,g,Ig),I=k==null?void 0:k.occlusion;let R=s.renderPassDescriptor({clear:o===void 0||o===!0||o===!1?s.clearColor??qi:o,preserve:a,clearDepth:c,clearStencil:u,depthReadOnly:f});E!=null&&E.timestampWrites&&(R={...R,timestampWrites:E.timestampWrites}),I&&(R={...R,occlusionQuerySet:I.querySet}),b=l(this,Mt).beginRenderPass(R),d&&b.setViewport(d.x,d.y,d.width,d.height,d.minDepth,d.maxDepth),h&&b.setScissorRect(h[0],h[1],h[2],h[3]),x(this,xn,!0);try{i(new xg(b,s,l(this,W),f===!0,I,this,H=>{if(M(this.device,H),l(this,Ve))throw Eo(H)}))}finally{x(this,xn,!1)}}catch(E){y(this,D,xs).call(this,g),me(l(this,W)),l(this,W).length=0,ea(this.device);try{b==null||b.end()}catch{}throw E}na(this.device,b,l(this,W))}submit(){var i,s,o;if(l(this,Oe)||l(this,Ve))return;M(this.device,\"Frame.submit\"),x(this,Oe,!0),(i=this.releaseLifecycle)==null||i.call(this);for(const a of y(this,D,vs).call(this))a.finalizeFrame(this,l(this,Mt));let t;const n=(s=l(this,W)[0])==null?void 0:s.context;n&&Bn(this.device,n);try{t=l(this,Mt).finish()}catch(a){y(this,D,mr).call(this,y(this,D,ri).call(this));const c=n?be(this.device):void 0;me(l(this,W)),c&&me([c]);const u=(c==null?void 0:c.context)??n;if(!u)throw a;this.done=y(this,D,ii).call(this,y(this,D,Ss).call(this,u.label,u.group,a));return}if(n){const a=be(this.device);a&&(l(this,W)[0]=l(this,W)[0]?Gr(a,l(this,W)[0]):a)}const r=(o=l(this,W)[0])==null?void 0:o.context;r&&Bn(this.device,r);try{this.device.gpu.queue.submit([t])}catch(a){y(this,D,mr).call(this,y(this,D,ri).call(this));const c=r?be(this.device):void 0;me(l(this,W)),c&&me([c]);const u=(c==null?void 0:c.context)??r;if(!u)throw a;this.done=y(this,D,ii).call(this,y(this,D,Ss).call(this,u.label,u.group,a));return}if(r){const a=be(this.device);a&&(l(this,W)[0]=l(this,W)[0]?Gr(a,l(this,W)[0]):a)}for(const a of y(this,D,vs).call(this))a.frameSubmitted(this);y(this,D,mr).call(this,l(this,ot)),this.done=y(this,D,ii).call(this,ta(this.device,l(this,W),{errorSink:this.errorSink}))}cancel(){var t;if(!l(this,Ve)){if(l(this,Oe))throw Df(\"Frame.cancel\");if(l(this,xn))throw Lf(\"Frame.cancel\");x(this,Ve,!0),(t=this.releaseLifecycle)==null||t.call(this),y(this,D,mr).call(this,y(this,D,ri).call(this)),l(this,Ge).clear(),l(this,ot).clear(),me(l(this,W)),l(this,W).length=0}}}Mt=new WeakMap,W=new WeakMap,Ge=new WeakMap,ot=new WeakMap,Oe=new WeakMap,Ve=new WeakMap,xn=new WeakMap,D=new WeakSet,mr=function(t){for(const n of[...t])n.frameAbandoned(this)},ri=function(){return[...l(this,Ge),...l(this,ot)]},xs=function(t){for(const n of[...t])l(this,Ge).delete(n),l(this,ot).add(n)},vs=function(){return[...l(this,Ge)].filter(t=>!l(this,ot).has(t))},_s=function(t,n,r,i){const s=fp(t);if(!s)throw i(t);let o;try{o=s[Zr]({frame:this,device:this.device,target:n})}catch(a){throw y(this,D,xs).call(this,l(this,Ge)),a}return l(this,Ge).add(o.owner),r.push(o.owner),o},Ss=async function(t,n,r){await Fi(this.device),M(this.device,\"Frame.validation\");const i=Zt(t,n,r);this.errorSink?await this.errorSink(i):console.error(i)},ii=function(t){var n;return(n=this.trackSettled)==null||n.call(this,t),t},xc=t=>!qc(Oe,t)||!l(t,Oe)&&!l(t,Ve);class xg{constructor(t,n,r,i=!1,s,o,a){m(this,\"encoder\");m(this,\"target\");m(this,\"validations\");m(this,\"depthReadOnly\");m(this,\"occlusionSource\");m(this,\"frame\");m(this,\"assertFrameOpen\");w(this,vn,!1);this.encoder=t,this.target=n,this.validations=r,this.depthReadOnly=i,this.occlusionSource=s,this.frame=o,this.assertFrameOpen=a}draw(t,n={}){var i;(i=this.assertFrameOpen)==null||i.call(this,\"FramePass.draw\");const r=_g(t);this.depthReadOnly&&vg(r,this.target),r.encode(this.encoder,this.target,n,s=>this.validations.push(s))}occlusion(t,n){var i;if((i=this.assertFrameOpen)==null||i.call(this,\"FramePass.occlusion\"),!this.occlusionSource)throw bf();if(l(this,vn))throw yf();const r=this.occlusionSource.beginQuery(t,this.frame);this.encoder.beginOcclusionQuery(r),x(this,vn,!0);try{typeof n==\"function\"?n():this.draw(n)}finally{x(this,vn,!1),this.encoder.endOcclusionQuery()}}bundles(...t){var r;if((r=this.assertFrameOpen)==null||r.call(this,\"FramePass.bundles\"),this.depthReadOnly)throw wt(\"pass cannot replay bundles: bundle records bundles with writable depth/stencil, and WebGPU only executes read-only-recorded bundles in a read-only pass.\",\"Encode the draws directly with pass.draw(...) inside the depthReadOnly pass.\",\"FramePass.bundles\");const n=t.map(i=>lp(i)??Sg());for(const i of n)i.assertReplayable(this.target);this.encoder.executeBundles(n.map(i=>i.gpu))}}vn=new WeakMap;function vg(e,t){var n;if(e.writesDepth())throw wt(`pass cannot encode draw '${e.label}': its depth state writes depth (the default is write: true). Give the draw depth: { write: false } (or depth: false to disable depth testing).`,\"Use depth: { write: false } on the draw, or open the pass without depthReadOnly.\",\"FramePass.draw\");if(qn((n=t.depth)==null?void 0:n.format)){const r=e.stencilWritingOps();if(r.length)throw wt(`pass cannot encode draw '${e.label}': its stencil ops can write (${r.join(\", \")}), and the pass's stencil aspect is read-only too.`,'Use \"keep\" for those ops or stencil writeMask: 0, or open the pass without depthReadOnly.',\"FramePass.draw\")}}function _g(e){const t=up(e);if(!t)throw new TypeError(\"Invalid Effect instance: pass.draw() expects a Draw or an Effect created by this library.\");return t}function Sg(){throw new _({code:\"VGPU-R3-BUNDLE-INVALID\",message:\"p.bundles() expected bundles created by bundle(gpu, { target }, cb).\",where:\"FramePass.bundles\"})}function Eg(e){return en(`FramePassOptions.timer received ${tt(e)}; expected a TimerSpan from timer.span(name).`,'Create const passTimer = timer(gpu) once, then pass passTimer.span(\"name\") per pass.',\"Frame.pass\")}function Ig(e){return tn(`FramePassOptions.visibility received ${tt(e)}; expected a Visibility from visibility(gpu).`,\"Create const vis = visibility(gpu) once, then pass { target, visibility: vis } per pass.\",\"Frame.pass\")}function kg(e,t,n){if(e===void 0)return;if(typeof e!=\"object\"||e===null||Array.isArray(e))throw De(`received ${tt(e)}; expected { x?, y?, width, height, minDepth?, maxDepth? }.`);const{x:r=0,y:i=0,width:s,height:o,minDepth:a=0,maxDepth:c=1}=e;for(const[h,g]of[[\"x\",r],[\"y\",i],[\"width\",s],[\"height\",o],[\"minDepth\",a],[\"maxDepth\",c]])if(typeof g!=\"number\"||!Number.isFinite(g))throw De(`${h} received ${tt(g)}; expected a finite number.`);const u=t.maxTextureDimension2D,f=u*2,d=`target is ${n[0]}x${n[1]}px, device maxTextureDimension2D is ${u}`;if(!(s>=0&&s<=u))throw De(`width ${s} is outside [0, ${u}] (${d}).`);if(!(o>=0&&o<=u))throw De(`height ${o} is outside [0, ${u}] (${d}).`);if(!(r>=-f&&r+s<=f-1))throw De(`x ${r} with width ${s} is outside [${-f}, ${f-1}] (${d}).`);if(!(i>=-f&&i+o<=f-1))throw De(`y ${i} with height ${o} is outside [${-f}, ${f-1}] (${d}).`);if(!(a>=0&&a<=1))throw De(`minDepth ${a} is outside [0, 1].`);if(!(c>=0&&c<=1))throw De(`maxDepth ${c} is outside [0, 1].`);if(!(a<=c))throw De(`minDepth ${a} exceeds maxDepth ${c}.`);return{x:r,y:i,width:s,height:o,minDepth:a,maxDepth:c}}function $g(e,t){if(e===void 0)return;if(!Array.isArray(e)||e.length!==4)throw bi(`received ${tt(e)}; expected [x, y, width, height].`);const[n,r,i,s]=e;for(const[c,u]of[[\"x\",n],[\"y\",r],[\"width\",i],[\"height\",s]])if(typeof u!=\"number\"||!Number.isInteger(u)||u<0)throw bi(`${c} received ${tt(u)}; expected a non-negative integer.`);const[o,a]=t;if(n+i>o||r+s>a)throw bi(`[${n}, ${r}, ${i}, ${s}] exceeds the target's current size ${o}x${a}px (x + width <= ${o}, y + height <= ${a}).`);return[n,r,i,s]}function tt(e){return typeof e==\"string\"?`'${e}'`:Array.isArray(e)?`[${e.map(t=>tt(t)).join(\", \")}]`:typeof e==\"object\"&&e!==null?\"an object\":String(e)}function Tg(e){const t=e==null?void 0:e.code;return t===\"VGPU-DEVICE-DISPOSED\"||t===\"VGPU-DEVICE-LOST\"}class Pg{constructor(t,n,r){m(this,\"createFrame\");m(this,\"advance\");m(this,\"trackLoop\");w(this,_n,!1);this.createFrame=t,this.advance=n,this.trackLoop=r}frame(t){if(l(this,_n)||tp())throw So();x(this,_n,!0),np();try{this.advance();const n=this.createFrame();if(t){try{t(n)}catch(r){if(xc(n))try{n.cancel()}catch{}throw r}try{n.submit()}catch(r){if(!Tg(r))throw r}}return n}finally{rp(),x(this,_n,!1)}}loop(t,n={}){var g;let r=!1;const i=globalThis.requestAnimationFrame??(b=>setTimeout(()=>b(performance.now()),16)),s=globalThis.cancelAnimationFrame??(b=>clearTimeout(b)),o=n.fps&&n.fps>0?1e3/n.fps:0;let a,c=0,u;const f=()=>{r=!0,s(c),u==null||u(),u=void 0},d=b=>{if(!r){if(Rg(b,a,o)){a=b;try{this.frame(t)}catch(v){throw f(),v}}r||(c=i(d))}};c=i(d);const h={stop:f};return u=(g=this.trackLoop)==null?void 0:g.call(this,h),h}}_n=new WeakMap;const Ag=1;function Rg(e,t,n){return t===void 0||n<=0?!0:e-t>=n-Ag}function es(e){const t=[];for(const n of e)try{n.destroy()}catch(r){t.push(r)}if(t.length)throw t[0]}function Cg(e,t){return new ts(Y(e,\"target\").device,t)}class ts{constructor(t,n){w(this,Z);m(this,\"device\");m(this,\"resourceIdentity\",yr(\"render-target\"));w(this,er,new wr);w(this,Gt,new Set);w(this,ke);w(this,we);w(this,Sn);w(this,En,!1);w(this,In,!1);m(this,\"options\");this.device=t,Ea(n,t),this.options=Object.freeze({...n,size:Object.freeze([...n.size]),...n.colors?{colors:Object.freeze(n.colors.map(r=>Object.freeze({...r})))}:{}}),x(this,Sn,n.clearColor===void 0?qi:qr(n.clearColor,\"target.clearColor\")),x(this,ke,this.options.size),x(this,we,y(this,Z,Es).call(this,l(this,ke)))}get gpu(){return this.color.gpu}get size(){return l(this,ke)}get texelSize(){return[1/l(this,ke)[0],1/l(this,ke)[1]]}get color(){return l(this,we).colors[0]}get colors(){return l(this,we).colors}get depth(){return l(this,we).depth}get format(){var t;return((t=jr(this.options)[0])==null?void 0:t.format)??\"rgba8unorm\"}get clearColor(){return ji(l(this,Sn))}set clearColor(t){x(this,Sn,qr(t,\"target.clearColor\"))}get sampleCount(){return Sa(this.options)}resize(t){if(y(this,Z,si).call(this,\"Target.resize\"),l(this,In))throw new _({code:\"VGPU-TARGET-RESIZE-REENTRANT\",message:\"Cannot resize a target from its replacement callbacks.\",where:\"Target.resize\"});if(Ea({...this.options,size:t},this.device),!ka(l(this,ke),t)){x(this,In,!0);try{const n=Object.freeze([...t]),r=y(this,Z,Es).call(this,n),i=l(this,we);x(this,ke,n),x(this,we,r);try{y(this,Z,su).call(this)}finally{es(i.all)}}finally{x(this,In,!1)}}}onDestroy(t){return l(this,er).onDestroy(this,t)}onTexturesRecreated(t){return y(this,Z,si).call(this,\"Target.onTexturesRecreated\"),l(this,Gt).add(t),()=>{l(this,Gt).delete(t)}}destroy(){if(!l(this,En)){x(this,En,!0);try{l(this,er).emit(this)}finally{l(this,Gt).clear(),es(l(this,we).all)}}}renderPassDescriptor(t={}){y(this,Z,si).call(this,\"Target.renderPassDescriptor\");const{clear:n=[0,0,0,1],preserve:r,clearDepth:i,clearStencil:s,depthReadOnly:o}=t;return{colorAttachments:this.colors.map((a,c)=>{var u;return Lm(a,(u=l(this,we).msaaColors)==null?void 0:u[c],n,r)}),depthStencilAttachment:this.depth?Dm(this.depth,r,i,s,o):void 0}}}er=new WeakMap,Gt=new WeakMap,ke=new WeakMap,we=new WeakMap,Sn=new WeakMap,En=new WeakMap,In=new WeakMap,Z=new WeakSet,si=function(t){if(l(this,En))throw new _({code:\"VGPU-TARGET-DESTROYED\",message:`Target '${this.options.label??\"target\"}' is destroyed.`,where:t,fix:\"Create a new target; destroyed targets cannot be resized or rendered.\"});M(this.device,t)},su=function(){const t=[];for(const n of[...l(this,Gt)])try{n()}catch(r){t.push(r)}if(t.length)throw t[0]},Es=function(t){const n=[],r=i=>{const s=this.device.createTexture(i);return n.push(s),s};try{const i=y(this,Z,ou).call(this,t,r),s=this.sampleCount===4?y(this,Z,au).call(this,t,r):void 0,o=y(this,Z,cu).call(this,t,r);return{colors:Object.freeze(i),msaaColors:s&&Object.freeze(s),depth:o,all:n}}catch(i){try{es(n)}catch{}throw i}},ou=function(t,n){return jr(this.options).map((r,i)=>n({kind:\"2d\",size:t,format:r.format,usage:[\"render_attachment\",\"texture_binding\",\"copy_src\"],sampleCount:1,label:this.options.label?`${this.options.label}.color${i}.resolve`:void 0}))},au=function(t,n){return jr(this.options).map((r,i)=>n({kind:\"2d\",size:t,format:r.format,usage:[\"render_attachment\"],sampleCount:4,label:this.options.label?`${this.options.label}.color${i}`:void 0}))},cu=function(t,n){const r=_a(this.options);return r?n({kind:\"2d\",size:t,format:r,usage:[\"render_attachment\",\"texture_binding\"],sampleCount:this.sampleCount,label:this.options.label?`${this.options.label}.depth`:void 0}):void 0};function Fg(e,t,n=\"read-write\"){const r=Y(e,\"storage\"),i=typeof n==\"string\"?{access:n}:n,s=rs(r.device,t,i.access??\"read-write\",void 0,i.indirect??!1);return on(r,s,o=>o.destroy(),o=>{s.onDestroy(o)})}class ns{constructor(t,n){m(this,\"size\");m(this,\"access\");m(this,\"buffer\");this.buffer=t,this.access=n,this.size=t.options.size}static create(t,n,r,i,s=!1){const o=s?[\"storage\",\"copy_dst\",\"copy_src\",\"indirect\"]:[\"storage\",\"copy_dst\",\"copy_src\"],a=t.createBuffer({size:n,usage:o,label:i});return new ns(a,r)}read(){return this.buffer.read(this.size)}write(t,n=0){this.buffer.write(Lg(t),n)}get gpu(){return this.buffer.gpu}get resourceIdentity(){return this.buffer.resourceIdentity}onDestroy(t){return this.buffer.onDestroy(t)}destroy(){this.buffer.destroy()}}function rs(e,t,n,r,i=!1){return ns.create(e,t,n,r,i)}function Lg(e){if(e instanceof ArrayBuffer||ArrayBuffer.isView(e))return e;throw new TypeError(\"StorageBuffer.write() requires ArrayBuffer or ArrayBufferView.\")}function Dg(e,t,n,r={}){const i=Y(e,\"pingPong\");return Og(i.device,t,n,r,s=>Mg(i,s))}function Ug(e,t){const n=Y(e,\"pingPongStorage\");return Vg(n.device,t,\"read-write\",r=>Gg(n,r))}function Mg(e,t){return on(e,t,n=>n.destroy(),n=>{t.onDestroy(n)})}function Gg(e,t){return on(e,t,n=>n.destroy(),n=>{t.onDestroy(n)})}function Og(e,t,n,r={},i=_c){const s=[Sc(t),Sc(n)],o={...r,size:s},a=i(new ts(e,Ec(o,r.label,\"ping\")));try{const c=i(new ts(e,Ec(o,r.label,\"pong\")));return new Ng([a,c])}catch(c){try{a.destroy()}catch{}throw c}}function Vg(e,t,n=\"read-write\",r=_c){const i=r(rs(e,t,n,void 0)),s=r(rs(e,t,n,void 0));return new Bg([i,s])}function _c(e){return e}class Ng{constructor(t){m(this,\"halves\");w(this,kn,0);this.halves=t}get read(){return this.halves[l(this,kn)]}get write(){return this.halves[l(this,kn)^1]}swap(){x(this,kn,l(this,kn)^1)}}kn=new WeakMap;class Bg{constructor(t){m(this,\"halves\");w(this,$n,0);this.halves=t}get read(){return this.halves[l(this,$n)]}get write(){return this.halves[l(this,$n)^1]}swap(){x(this,$n,l(this,$n)^1)}}$n=new WeakMap;function Sc(e){return Math.max(1,Math.floor(e))}function Ec(e,t,n){return t?{...e,label:`${t}.${n}`}:e}function zg(e,t){const n=Y(e,\"texture\"),r=n.device.createTexture(t);return on(n,r,i=>i.destroy(),i=>{r.onDestroy(i)})}const is=8,qg=((Gc=globalThis.GPUMapMode)==null?void 0:Gc.READ)??1;function Ic(e,t){return new jg(e,t)}class jg{constructor(t,n){w(this,ce);m(this,\"querySet\");m(this,\"capacity\");w(this,tr);w(this,Ot);w(this,at);w(this,nr);w(this,rr);w(this,Tn,0);w(this,ir,0);w(this,sr,-1);w(this,ct);w(this,Pn,0);w(this,Vt,0);w(this,Nt,!1);w(this,or,!1);this.capacity=n.capacity;const r=n.label??\"vgpu.query-ring\";x(this,tr,r);const i=n.capacity*is;this.querySet=t.gpu.createQuerySet({type:n.type,count:n.capacity,label:r}),x(this,Ot,t.createBuffer({size:i,usage:[\"query_resolve\",\"copy_src\"],label:`${r}.resolve`})),x(this,at,Array.from({length:n.depth??3},(s,o)=>({buffer:t.createBuffer({size:i,usage:[\"map_read\",\"copy_dst\"],label:`${r}.staging${o}`}),mapPending:!1,retired:!1}))),x(this,nr,n.trackSettled),x(this,rr,n.errorSink)}encodeResolve(t,n){if(x(this,ct,void 0),l(this,Nt)||n<=0)return!1;const r=y(this,ce,uu).call(this);if(!r)return!1;const i=Math.min(n,this.capacity);return t.resolveQuerySet(this.querySet,0,i,l(this,Ot).gpu,0),t.copyBufferToBuffer(l(this,Ot).gpu,0,r.buffer.gpu,0,i*is),x(this,ct,{staging:r,usedCount:i,seq:l(this,ir)}),x(this,ir,l(this,ir)+1),x(this,Tn,l(this,Tn)+1),!0}onSubmitted(t){var i;const n=l(this,ct);if(x(this,ct,void 0),!n)return;n.staging.mapPending=!0,x(this,Pn,l(this,Pn)+1);const r=n.staging.buffer.gpu.mapAsync(qg).then(()=>{const s=y(this,ce,lu).call(this,n);n.seq<=l(this,sr)||(x(this,sr,n.seq),t(s))}).catch(s=>{y(this,ce,du).call(this,s)}).finally(()=>{n.staging.mapPending=!1,x(this,Pn,l(this,Pn)-1),y(this,ce,oi).call(this)});(i=l(this,nr))==null||i.call(this,r)}retain(){x(this,Vt,l(this,Vt)+1)}release(){l(this,Vt)>0&&x(this,Vt,l(this,Vt)-1),y(this,ce,oi).call(this)}dispose(){l(this,Nt)||(x(this,Nt,!0),x(this,ct,void 0),y(this,ce,oi).call(this))}}tr=new WeakMap,Ot=new WeakMap,at=new WeakMap,nr=new WeakMap,rr=new WeakMap,Tn=new WeakMap,ir=new WeakMap,sr=new WeakMap,ct=new WeakMap,Pn=new WeakMap,Vt=new WeakMap,Nt=new WeakMap,or=new WeakMap,ce=new WeakSet,uu=function(){for(let t=0;t<l(this,at).length;t+=1){const n=l(this,at)[l(this,Tn)%l(this,at).length];if(!n.retired)return n.mapPending?void 0:n;x(this,Tn,l(this,Tn)+1)}},lu=function(t){let n;try{n=new BigUint64Array(t.staging.buffer.gpu.getMappedRange().slice(0,t.usedCount*is))}catch(r){throw y(this,ce,fu).call(this,t.staging),r}try{t.staging.buffer.gpu.unmap()}catch(r){throw t.staging.retired=!0,r}return n},fu=function(t){try{t.buffer.gpu.unmap()}catch{t.retired=!0}},oi=function(){if(!(!l(this,Nt)||l(this,or)||l(this,Pn)>0||l(this,Vt)>0)){x(this,or,!0),this.querySet.destroy(),l(this,Ot).dispose();for(const t of l(this,at))t.buffer.dispose()}},du=function(t){const n=Ff(l(this,tr),t),r=l(this,rr);if(!r){console.error(n);return}try{Promise.resolve(r(n)).catch(i=>{console.error(i)})}catch(i){console.error(i)}};const kc=32,ss=4096,$c=ss/2,Wg=1/1e6;class Hg{constructor(t,n){m(this,\"name\");m(this,\"owner\");this.name=t,this.owner=n}[Zr](t){return{owner:this.owner,timestampWrites:this.owner.attachSpan(this,t.frame,t.device)}}}function Kg(e){const t=Y(e,\"timer\");return Po(t,n=>new Xg(t.device,n))}class Xg{constructor(t,n={}){w(this,Q);w(this,An);w(this,Bt);w(this,Rn,new Map);w(this,zt,new Set);w(this,ue);w(this,Cn,kc*2);w(this,ut,kc*2);w(this,lt);w(this,qt,[]);w(this,Ne,new Set);w(this,jt,0);w(this,Be);w(this,ar,0);w(this,cr,-1);w(this,Wt,new Map);w(this,ft,!1);if(!t.features.has(\"timestamp-query\"))throw en('timer(gpu) needs the \"timestamp-query\" device feature — request it at init: init({ requiredFeatures: [\"timestamp-query\"] }).','Pass init({ requiredFeatures: [\"timestamp-query\"] }) on an adapter that supports it; gate optional timing on gpu.device.features.has(\"timestamp-query\").');x(this,An,t),x(this,Bt,n),x(this,ue,y(this,Q,ks).call(this))}span(t){if(y(this,Q,ai).call(this,\"Timer.span\"),typeof t!=\"string\"||t.length===0)throw en(`span name received ${Qg(t)}; expected a non-empty string.`,'Name each timed pass, e.g. timer.span(\"shadows\").',\"Timer.span\");let n=l(this,Rn).get(t);return n||(n=new Hg(t,this),l(this,Rn).set(t,n)),n}onResults(t){return y(this,Q,ai).call(this,\"Timer.onResults\"),l(this,zt).add(t),()=>{l(this,zt).delete(t)}}dispose(){var t,n;l(this,ft)||(x(this,ft,!0),l(this,zt).clear(),l(this,Rn).clear(),l(this,Ne).clear(),x(this,qt,[]),x(this,Be,void 0),l(this,ue).dispose(),(n=(t=l(this,Bt)).onDispose)==null||n.call(t))}attachSpan(t,n,r){if(y(this,Q,ai).call(this,\"Frame.pass\"),r!==l(this,An))throw en(`span '${t.name}' belongs to a timer created on a different gpu; timestamp queries cannot cross devices.`,\"Create one timer(gpu) per gpu and use its spans only with that gpu's frames.\",\"Frame.pass\");if(n!==l(this,lt)&&y(this,Q,hu).call(this,n),l(this,Ne).has(t.name))throw en(`duplicate span '${t.name}' in one frame; each result key holds a single begin/end pair per frame.`,`Use one timer.span(name) per pass per frame, e.g. timer.span(\"${t.name}-2\") for the second pass.`,\"Frame.pass\");if(l(this,Ne).size>=$c)throw df($c,ss);l(this,Ne).add(t.name);const i=l(this,Ne).size*2-2;if(l(this,ut)<i+2&&x(this,ut,i+2),!(i+2>l(this,ue).capacity))return x(this,jt,i+2),l(this,qt).push({name:t.name,begin:i}),y(this,Q,pu).call(this,n),{querySet:l(this,ue).querySet,beginningOfPassWriteIndex:i,endOfPassWriteIndex:i+1}}finalizeFrame(t,n){x(this,Be,void 0),!(l(this,ft)||t!==l(this,lt)||l(this,jt)===0)&&l(this,ue).encodeResolve(n,l(this,jt))&&x(this,Be,[...l(this,qt)])}frameSubmitted(t){if(y(this,Q,Is).call(this,t),t!==l(this,lt)||l(this,ft))return;const n=l(this,Be);if(x(this,Be,void 0),!n||n.length===0)return;const r=l(this,ar);x(this,ar,l(this,ar)+1),l(this,ue).onSubmitted(i=>{r<=l(this,cr)||(x(this,cr,r),y(this,Q,mu).call(this,n,i))})}frameAbandoned(t){t===l(this,lt)&&x(this,Be,void 0),y(this,Q,Is).call(this,t)}}An=new WeakMap,Bt=new WeakMap,Rn=new WeakMap,zt=new WeakMap,ue=new WeakMap,Cn=new WeakMap,ut=new WeakMap,lt=new WeakMap,qt=new WeakMap,Ne=new WeakMap,jt=new WeakMap,Be=new WeakMap,ar=new WeakMap,cr=new WeakMap,Wt=new WeakMap,ft=new WeakMap,Q=new WeakSet,hu=function(t){l(this,ut)>l(this,ue).capacity&&(l(this,ue).dispose(),x(this,Cn,Math.min(ss,Yg(l(this,ut)))),x(this,ue,y(this,Q,ks).call(this))),x(this,ut,l(this,Cn)),x(this,lt,t),x(this,qt,[]),l(this,Ne).clear(),x(this,jt,0)},mu=function(t,n){const r={};for(const{name:s,begin:o}of t){const a=n[o]??0n,c=n[o+1]??0n;r[s]=c>a?Number(c-a)*Wg:0}const i=Object.freeze(r);for(const s of[...l(this,zt)])try{s(i)}catch(o){console.error(o)}},pu=function(t){l(this,Wt).has(t)||(l(this,Wt).set(t,l(this,ue)),l(this,ue).retain())},Is=function(t){const n=l(this,Wt).get(t);n&&(l(this,Wt).delete(t),n.release())},ks=function(){return Ic(l(this,An),{type:\"timestamp\",capacity:l(this,Cn),label:\"vgpu.timer\",trackSettled:l(this,Bt).trackSettled,errorSink:l(this,Bt).errorSink})},ai=function(t){if(l(this,ft))throw en(\"the timer is disposed.\",\"Create a new timer with timer(gpu).\",t)};function Yg(e){let t=1;for(;t<e;)t*=2;return t}function Qg(e){return typeof e==\"string\"?`'${e}'`:String(e)}function Tc(e){return JSON.stringify(os(e))}function ti(e,t={}){var n;return(n=e.members)!=null&&n.length?Jg(e.members,t.abbreviated===!0):e.element?eb(e):as(e.type)}function os(e){var t;return{type:ln(e.type),align:e.align,size:e.size,stride:e.stride,members:(t=e.members)==null?void 0:t.map(Zg),element:e.element?os(e.element):void 0}}function Zg(e){return{name:e.name,offset:e.offset,align:e.align,size:e.size,explicitAlign:e.explicitAlign,explicitSize:e.explicitSize,type:ln(e.type),layout:os(e.layout)}}function ln(e){switch(e.kind){case\"scalar\":return{scalar:e.name};case\"vector\":return{vector:e.width,element:ln(e.element)};case\"matrix\":return{matrix:[e.columns,e.rows],element:ln(e.element)};case\"array\":return{array:ln(e.element),count:e.count??e.countExpression};case\"atomic\":return{atomic:ln(e.element)};default:return e.kind}}function Jg(e,t){const n=t?e.slice(0,1):e,r=t&&e.length>1?\", ...\":\"\";return`{ ${n.map(tb).join(\", \")}${r} }`}function eb(e){const t=rb(e.type),n=t===void 0?\"\":`, ${t}`;return`array<${ti(e.element)}${n}>`}function tb(e){return`${e.name}: ${ti(e.layout)}`}function as(e){switch(e.kind){case\"scalar\":return e.name;case\"vector\":return`vec${e.width}${Pc(e.element)}`;case\"matrix\":return`mat${e.columns}x${e.rows}${Pc(e.element)}`;case\"array\":return nb(e);case\"identifier\":return e.name;case\"atomic\":return`atomic<${as(e.element)}>`;default:return e.kind}}function nb(e){const t=e.count??e.countExpression,n=t===void 0?\"\":`, ${t}`;return`array<${as(e.element)}${n}>`}function Pc(e){return e.kind!==\"scalar\"?\"\":e.name===\"bool\"?\"b\":e.name.slice(0,1)}function rb(e){return e.kind===\"array\"?e.count??e.countExpression:void 0}class ib{constructor(t,n){w(this,Te);m(this,\"device\");w(this,Ht);w(this,$e);w(this,xe);this.device=t,x(this,Ht,cs(n))}get buffer(){return l(this,xe)}get gpu(){var t;return(t=l(this,xe))==null?void 0:t.gpu}get size(){var t;return(t=l(this,$e))==null?void 0:t.layout.size}set(t){const n=cs(l(this,Ht));if(Ac(n,t),l(this,$e)&&l(this,xe)){const r=Gi(l(this,$e).layout,n);l(this,xe).write(r,0)}x(this,Ht,n)}[_i](t,n){ob(t);const r=y(this,Te,gu).call(this,t,n),i=y(this,Te,wu).call(this);return vi(i,`${n}.set`),{resource:{buffer:i.gpu,offset:0,size:r.layout.size},identity:i.resourceIdentity,unsubscribe:s=>i.onDestroy(s)}}destroy(){var t;(t=l(this,xe))==null||t.destroy()}}Ht=new WeakMap,$e=new WeakMap,xe=new WeakMap,Te=new WeakSet,gu=function(t,n){const r=ab(t),i=ub(t.addressSpace);return l(this,$e)?(y(this,Te,yu).call(this,t,r,i,n),l(this,$e)):y(this,Te,bu).call(this,t,r,i,n)},bu=function(t,n,r,i){const s=Gi(n,l(this,Ht)),o={layout:n,layoutSignature:Tc(n),layoutText:ti(n),sourceHint:i,bindingName:t.name,addressSpace:r},a=this.device.createBuffer({size:n.size,usage:r===\"storage\"?[\"storage\",\"copy_dst\"]:[\"uniform\",\"copy_dst\"],label:`${t.name}.sharedUniform`});try{a.write(s,0)}catch(c){throw a.destroy(),c}return x(this,$e,o),x(this,xe,a),o},yu=function(t,n,r,i){const s=l(this,$e);if(s.addressSpace!==r)throw G(\"uniforms\",`shared uniforms '${s.bindingName}' already adopted address space ${s.addressSpace}; '${t.name}' uses ${r}.`);if(Tc(n)!==s.layoutSignature)throw Gf({bindingName:s.bindingName,adoptedLayout:s.layoutText,adoptedSource:s.sourceHint,incomingLayout:ti(n,{abbreviated:!0}),incomingSource:i})},wu=function(){if(!l(this,xe))throw G(\"uniforms\",\"shared uniforms have not adopted a layout yet.\");return l(this,xe)};function sb(e,t){const n=Y(e,\"uniforms\");return on(n,new ib(n.device,t),r=>r.destroy())}function ob(e){var t,n;if(((t=e.bindingLayout)==null?void 0:t.kind)!==\"buffer\")throw G(\"uniforms\",`Binding '${e.name}' does not accept shared uniforms; the shader reflected ${((n=e.bindingLayout)==null?void 0:n.kind)??\"none\"}.`)}function ab(e){if(!e.layout)throw G(\"uniforms\",`Binding '${e.name}' does not expose a host-shareable layout.`);if(e.layout.size===void 0)throw G(\"uniforms\",`Binding '${e.name}' has a runtime-sized layout; it cannot be shared.`);return e.layout}function Ac(e,t){for(const[n,r]of Object.entries(t))Rc(n)||(ls(r)&&ls(e[n])?Ac(e[n],r):e[n]=us(r))}function cs(e){const t={};for(const[n,r]of Object.entries(e))Rc(n)||(t[n]=us(r));return t}function Rc(e){return e===\"__proto__\"||e===\"constructor\"||e===\"prototype\"}function us(e){return Array.isArray(e)?e.map(us):ArrayBuffer.isView(e)?cb(e):ls(e)?cs(e):e}function cb(e){return e instanceof Float32Array||e instanceof Uint32Array||e instanceof Int32Array?e.slice():e}function ls(e){return typeof e==\"object\"&&e!==null&&!Array.isArray(e)&&!ArrayBuffer.isView(e)}function ub(e){return e===\"storage\"?\"storage\":\"uniform\"}const Cc=4096,lb=64;function fb(e,t={}){const n=Y(e,\"visibility\");return Po(n,r=>new db(n.device,t,()=>Kr(n).frameCount,r))}class Fc{constructor(t,n){m(this,\"label\");m(this,\"owner\");w(this,dt,\"unknown\");w(this,ht);w(this,Fn,0);w(this,mt,!1);this.label=t,this.owner=n}get hidden(){return l(this,dt)===\"hidden\"}get state(){return l(this,dt)}get age(){return l(this,ht)===void 0?1/0:this.owner.currentFrame()-l(this,ht)}reset(){if(l(this,mt))throw yi(\"query handle\",\"VisibilityQuery.reset\");x(this,dt,\"unknown\"),x(this,ht,void 0),x(this,Fn,l(this,Fn)+1)}dispose(){l(this,mt)||(x(this,mt,!0),x(this,dt,\"unknown\"),x(this,ht,void 0),this.owner.releaseLabel(this))}get disposed(){return l(this,mt)}get generation(){return l(this,Fn)}applyResult(t,n,r){l(this,mt)||n!==l(this,Fn)||(x(this,dt,t!==0n?\"visible\":\"hidden\"),x(this,ht,r))}}dt=new WeakMap,ht=new WeakMap,Fn=new WeakMap,mt=new WeakMap;class db{constructor(t,n,r,i={}){w(this,le);w(this,ur);w(this,Ln);w(this,lr);w(this,Pe);m(this,\"capacity\");w(this,ze,new Map);w(this,qe);w(this,Ae,[]);w(this,Kt,new Set);w(this,je);w(this,Xt,new Map);w(this,Re,!1);const s=n.capacity??lb;if(typeof s!=\"number\"||!Number.isInteger(s)||s<1||s>Cc)throw hf(s,Cc);x(this,ur,t),x(this,Ln,r),x(this,lr,i),this.capacity=s,x(this,Pe,Ic(t,{type:\"occlusion\",capacity:s,label:\"vgpu.visibility\",trackSettled:i.trackSettled,errorSink:i.errorSink}))}query(t){if(y(this,le,pr).call(this,\"Visibility.query\"),typeof t!=\"string\"||t.length===0)throw tn(`query label received ${Lc(t)}; expected a non-empty string.`,'Label each queried object, e.g. vis.query(\"statue\").',\"Visibility.query\");if(l(this,ze).has(t))throw pf(t);const n=new Fc(t,this);return l(this,ze).set(t,n),n}reset(){y(this,le,pr).call(this,\"Visibility.reset\");for(const t of l(this,ze).values())t.reset()}dispose(){var t,n;l(this,Re)||(x(this,Re,!0),l(this,ze).clear(),x(this,Ae,[]),l(this,Kt).clear(),x(this,je,void 0),l(this,Pe).dispose(),(n=(t=l(this,lr)).onDispose)==null||n.call(t))}get disposed(){return l(this,Re)}currentFrame(){return l(this,Ln).call(this)}releaseLabel(t){l(this,ze).get(t.label)===t&&l(this,ze).delete(t.label)}get querySet(){return l(this,Pe).querySet}[Zr](t){if(!t.target.depth)throw gf();return this.attachFrame(t.frame,t.device),{owner:this,occlusion:{querySet:this.querySet,beginQuery:(n,r)=>this.beginQuery(n,r)}}}attachFrame(t,n){if(y(this,le,pr).call(this,\"Frame.pass\"),n!==l(this,ur))throw tn(\"the visibility instance belongs to a different gpu; occlusion queries cannot cross devices.\",\"Create one visibility(gpu) per gpu and use it only with that gpu's frames.\",\"Frame.pass\");t!==l(this,qe)&&y(this,le,xu).call(this,t),y(this,le,vu).call(this,t)}beginQuery(t,n){if(y(this,le,pr).call(this,\"FramePass.occlusion\"),!(t instanceof Fc))throw tn(`occlusion() received ${Lc(t)}; expected a VisibilityQuery from vis.query(label).`,`Create const q = vis.query(\"label\") once from the pass's visibility instance, then p.occlusion(q, body).`,\"FramePass.occlusion\");if(t.owner!==this)throw tn(`query '${t.label}' belongs to a different visibility instance than the one this pass was opened with.`,\"Use handles from the same visibility(gpu) instance passed as the pass's visibility option.\",\"FramePass.occlusion\");if(t.disposed)throw yi(\"query handle\",\"FramePass.occlusion\");if(n!==l(this,qe))throw tn(\"the pass is not part of the current frame; occlusion() must run inside the frame that opened the pass.\",\"Encode occlusion scopes inside the pass callback of the current frame(gpu).\",\"FramePass.occlusion\");if(l(this,Kt).has(t))throw wf(t.label);const r=l(this,Ae).length;if(r>=this.capacity)throw mf(this.capacity);return l(this,Kt).add(t),l(this,Ae).push({query:t,generation:t.generation}),r}finalizeFrame(t,n){x(this,je,void 0),!(l(this,Re)||t!==l(this,qe)||l(this,Ae).length===0)&&l(this,Pe).encodeResolve(n,l(this,Ae).length)&&x(this,je,[...l(this,Ae)])}frameSubmitted(t){if(y(this,le,$s).call(this,t),t!==l(this,qe)||l(this,Re))return;const n=l(this,je);x(this,je,void 0),!(!n||n.length===0)&&l(this,Pe).onSubmitted(r=>{if(l(this,Re))return;const i=l(this,Ln).call(this);for(let s=0;s<n.length;s++){const o=n[s],a=r[s];a!==void 0&&o.query.applyResult(a,o.generation,i)}})}frameAbandoned(t){t===l(this,qe)&&x(this,je,void 0),y(this,le,$s).call(this,t)}}ur=new WeakMap,Ln=new WeakMap,lr=new WeakMap,Pe=new WeakMap,ze=new WeakMap,qe=new WeakMap,Ae=new WeakMap,Kt=new WeakMap,je=new WeakMap,Xt=new WeakMap,Re=new WeakMap,le=new WeakSet,xu=function(t){x(this,qe,t),x(this,Ae,[]),l(this,Kt).clear()},vu=function(t){l(this,Xt).has(t)||(l(this,Xt).set(t,l(this,Pe)),l(this,Pe).retain())},$s=function(t){const n=l(this,Xt).get(t);n&&(l(this,Xt).delete(t),n.release())},pr=function(t){if(l(this,Re))throw yi(\"visibility\",t)};function Lc(e){return typeof e==\"string\"?`'${e}'`:String(e)}function hb(e){return jf(\"browser\",e)}const mb=Object.freeze(Object.defineProperty({__proto__:null,Geometry:Ao,Uniform:fd,VGPUError:_,bundle:ng,clock:lg,compute:dg,draw:bp,effect:Zp,frame:gg,frameLoop:bg,geometry:ed,init:hb,initFromDevice:Kf,isShaderFunctionExport:ml,pingPong:Dg,pingPongStorage:Ug,sampler:dp,storage:Fg,surface:Zm,target:Cg,texture:zg,timer:Kg,uniforms:sb,visibility:fb},Symbol.toStringTag,{value:\"Module\"}));return C.installNativeHomeBlackHole=Os,C.mountBlueBlackHole=Ms,Object.defineProperty(C,Symbol.toStringTag,{value:\"Module\"}),C})({});\n\n;\n/* BRAINABLE production global: home-responsive */\n/** Scoped, reversible HOME reflow for the observed native Figma DOM. No text/action/media replacement. */\n(()=>{\n const KEY='__brainableHomeResponsive30';window[KEY]?.dispose();\n const CSS=`\n@media(max-width:1279px){\n[data-hf30-page]{width:100%!important;min-width:0!important;max-width:100%!important;height:auto!important;min-height:100svh!important;gap:0!important;align-items:stretch!important}\n[data-hf30-main]{box-sizing:border-box!important;width:100%!important;max-width:100%!important;min-width:0!important;height:auto!important;padding:0!important;align-items:stretch!important;justify-content:flex-start!important}\n[data-hf30-main]>[data-hf30-section]{box-sizing:border-box!important;width:100%!important;max-width:100%!important;min-width:0!important;height:auto!important;min-height:0!important;flex-shrink:0!important;inset:auto!important;transform:none!important}\n[data-hf30-flow]{box-sizing:border-box!important;width:100%!important;max-width:100%!important;min-width:0!important;height:auto!important;min-height:0!important;max-height:none!important;position:relative!important;inset:auto!important;transform:none!important;opacity:1!important;overflow:visible!important;display:flex!important;flex-direction:column!important;flex-wrap:nowrap!important;align-items:stretch!important;justify-content:flex-start!important;gap:16px!important;flex-shrink:0!important;margin:0!important;padding:0!important;grid-template-columns:minmax(0,1fr)!important;grid-template-rows:none!important}\n[data-hf30-main] p,[data-hf30-footer] p{box-sizing:border-box!important;max-width:100%!important;min-width:0!important;width:auto!important;height:auto!important;min-height:0!important;margin:0!important;white-space:normal!important;word-break:keep-all!important;overflow-wrap:anywhere!important;font-size:14px!important;line-height:1.65!important}\n[data-hf30-main] h2{letter-spacing:-.02em!important;max-width:100%!important;width:auto!important;height:auto!important;min-height:0!important;margin:0!important;font-size:clamp(20px,4vw,30px)!important;line-height:1.35!important;white-space:normal!important;overflow-wrap:anywhere!important}\n[data-hf30-flow].textContents{display:block!important}\n[data-hf30-prose] p{display:inline!important}\n[data-hf30-prose] p:after{content:\" \"}\n[data-hf30-blank]{height:0!important;min-height:0!important;line-height:0!important;margin:0!important;padding:0!important;display:none!important}\n[data-hf30-intro]{padding:clamp(32px,6vw,64px) clamp(20px,5vw,56px)!important}\n[data-hf30-intro]>div,[data-hf30-intro]>div>div{width:100%!important;height:auto!important;min-height:0!important;overflow:visible!important;padding:0!important}\n[data-hf30-main]>[data-hf30-banner]{height:clamp(200px,36vw,300px)!important;min-height:200px!important}\n[data-hf30-banner] [data-hf30-flow]{height:100%!important;justify-content:center!important;padding:0 24px!important;text-align:center!important}\n[data-hf30-banner]>div:first-child{width:100%!important;height:100%!important}\n[data-hf30-banner] [data-hf30-flow].textContents{display:flex!important;justify-content:center!important;gap:0!important}\n[data-hf30-banner] img{width:100%!important;height:100%!important;object-fit:cover!important}\n[data-hf30-products]{background:#000!important;padding:48px clamp(20px,5vw,56px)!important;isolation:isolate}\n[data-hf30-products]>video{width:100%!important;height:100%!important;object-fit:cover!important;inset:0!important;z-index:-1;opacity:.4!important}\n[data-hf30-products]>[data-hf30-flow]{gap:28px!important}\n[data-hf30-products] [data-hf30-product-grid]{gap:36px!important}\n[data-hf30-products] [data-hf30-card]{gap:12px!important}\n[data-hf30-category]{order:0!important;width:auto!important;height:auto!important;min-height:0!important;font-size:13px!important;line-height:1.5!important;letter-spacing:.12em!important}\n[data-hf30-name]{order:1!important;gap:0!important}\n[data-hf30-name] p,[data-hf30-name] span{font-size:20px!important;line-height:1.35!important;letter-spacing:.14em!important}\n[data-hf30-description]{order:2!important;gap:0!important}\n[data-hf30-description] p{display:block!important}\n[data-hf30-description] [data-hf30-blank]{display:none!important}\n[data-hf30-review]{padding:48px clamp(20px,5vw,56px)!important}\n[data-hf30-review]>[data-hf30-flow]{gap:28px!important}\n[data-hf30-review] [data-hf30-flow]{text-align:center!important}\n[data-hf30-review] [data-hf30-quote]{padding:16px 0!important;gap:24px!important}\n[data-hf30-controls]{width:auto!important;max-width:100%!important;height:44px!important;min-height:44px!important;display:flex!important;flex-direction:row!important;align-items:center!important;justify-content:center!important;gap:14px!important;margin:0 auto!important}\n[data-hf30-controls]>button{width:32px!important;height:32px!important;min-width:32px!important;min-height:32px!important;flex-shrink:0!important}\n[data-hf30-action]{box-sizing:border-box!important;padding:10px 16px!important;display:inline-flex!important;align-items:center!important;justify-content:center!important;width:max-content!important;max-width:100%!important;min-height:40px!important;margin:8px auto 0!important;flex-shrink:0!important}\n[data-hf30-action-inner]{position:relative!important;inset:auto!important;transform:none!important;width:auto!important;height:auto!important;min-height:0!important;padding:0!important;margin:0!important;display:flex!important;align-items:center!important;justify-content:center!important}\n[data-hf30-main] [data-hf30-action] p{font-size:13px!important;letter-spacing:0!important;padding:0 2px!important;white-space:nowrap!important}\n[data-hf30-footer]{box-sizing:border-box!important;width:100%!important;max-width:100%!important;min-width:0!important;height:auto!important;min-height:0!important;padding:40px clamp(20px,5vw,56px)!important;flex-shrink:0!important}\n[data-hf30-footer]>div{width:100%!important;min-width:0!important;height:auto!important;min-height:0!important;padding:0!important}\n[data-hf30-footer] [data-hf30-flow]{gap:12px!important;text-align:left!important}\n[data-hf30-hero]{box-sizing:border-box!important;width:100%!important;min-width:0!important;max-width:100%!important;height:calc(100svh - 64px)!important;min-height:280px!important;flex-shrink:0!important;position:relative!important;overflow:hidden!important;--hf30-pad:clamp(20px,5vw,56px);--hf30-type:clamp(19px,4.3vw,32px);--hf30-logo:clamp(104px,24vw,168px)}\n[data-hf30-hero]>video{width:100%!important;height:100%!important;object-fit:cover!important;inset:0!important}\n[data-hf30-hero-wrap]{display:contents!important;transform:none!important;opacity:1!important}\n[data-hf30-headline]{box-sizing:border-box!important;position:absolute!important;left:var(--hf30-pad)!important;right:var(--hf30-pad)!important;top:auto!important;bottom:56px!important;width:auto!important;height:auto!important;min-width:0!important;min-height:0!important;transform:none!important;opacity:1!important;display:flex!important;flex-direction:column!important;justify-content:flex-start!important;align-items:stretch!important;gap:6px!important}\n[data-hf30-headline] h1,[data-hf30-headline] span{font-size:var(--hf30-type)!important;line-height:1.4!important;letter-spacing:0!important}\n[data-hf30-headline] h1{width:100%!important;height:auto!important;min-height:0!important;margin:0!important;white-space:normal!important}\n[data-hf30-spacer]{display:inline-block!important;width:calc(var(--hf30-logo) + 8px)!important;font-size:0!important}\n[data-hf30-wordmark]{position:absolute!important;left:var(--hf30-pad)!important;right:auto!important;top:auto!important;bottom:calc(56px + var(--hf30-type)*.15)!important;width:var(--hf30-logo)!important;height:calc(var(--hf30-logo)*.14552)!important;transform:none!important;opacity:1!important}\n[data-hf30-wordmark] img{width:100%!important;height:100%!important;object-fit:contain!important}\n[data-hf30-tagline]{position:absolute!important;left:var(--hf30-pad)!important;right:var(--hf30-pad)!important;top:auto!important;bottom:calc(88px + var(--hf30-type)*2.8)!important;width:auto!important;height:auto!important;min-height:0!important;transform:none!important;opacity:1!important;display:block!important}\n[data-hf30-tagline] p{font-size:12px!important;line-height:1.5!important;letter-spacing:.04em!important;width:auto!important;height:auto!important;margin:0!important}\n[data-hf30-meta]{position:absolute!important;left:var(--hf30-pad)!important;right:var(--hf30-pad)!important;top:auto!important;bottom:20px!important;width:auto!important;height:auto!important;transform:none!important;opacity:1!important;display:block!important}\n[data-hf30-meta] h3{width:auto!important;height:auto!important;margin:0!important;font-size:10px!important;line-height:1.4!important}\n}\n@media(min-width:680px) and (max-width:1279px){\n[data-hf30-products] [data-hf30-product-grid]{display:grid!important;grid-template-columns:repeat(3,minmax(0,1fr))!important;gap:24px!important;align-items:start!important}\n[data-hf30-products] [data-hf30-card]{display:flex!important;grid-area:auto!important}\n[data-hf30-main] p{font-size:15px!important}\n[data-hf30-intro]>div>div>[data-hf30-flow],[data-hf30-review]>[data-hf30-flow]{max-width:820px!important;margin:0 auto!important}\n}\n@media(min-width:1024px) and (max-width:1279px){[data-hf30-hero]{height:calc(100svh - 80px)!important}}\n@media(max-width:359px){[data-hf30-main] p{font-size:13px!important}[data-hf30-products]{padding-top:32px!important;padding-bottom:32px!important}[data-hf30-products] [data-hf30-product-grid]{gap:28px!important}[data-hf30-name] p,[data-hf30-name] span{font-size:18px!important}}\n`;\n const style=document.createElement('style');style.dataset.hf30Style='';style.textContent=CSS;document.head.append(style);\n const originals=new Map();let raf=0,disposed=false;\n const mark=(e,key)=>{if(!e)return;const attr='data-hf30-'+key;let m=originals.get(e);if(!m){m=new Map();originals.set(e,m)}if(!m.has(attr))m.set(attr,e.getAttribute(attr));e.setAttribute(attr,'')};\n const clean=s=>String(s||'').replace(/[\\s\\u200b-\\u200d]/g,'');\n function release(e,attrs){for(const[k,v]of attrs)v===null?e.removeAttribute(k):e.setAttribute(k,v);originals.delete(e)}\n function reflow(){raf=0;if(disposed)return;for(const[e,attrs]of originals)if(!e.isConnected)release(e,attrs);const main=[...document.querySelectorAll('main')].find(e=>e.textContent.includes('BrainAble, 두뇌의 가능성을 깨우다')&&e.textContent.includes('Hear From Our Clients'));if(!main){for(const[e,attrs]of originals)release(e,attrs);return;}\n  mark(main,'main');mark(main.parentElement,'page');const sections=[...main.children];sections.forEach(e=>mark(e,'section'));mark(sections[0],'intro');mark(sections[1],'banner');mark(sections[2],'products');mark(sections[3],'review');\n  for(const e of main.querySelectorAll('div'))if(['회사소개','CONTACTS'].includes(clean(e.textContent))&&clean(e.parentElement?.textContent)!==clean(e.textContent)&&getComputedStyle(e).cursor==='pointer'){mark(e,'action');for(const child of e.querySelectorAll('div'))if(clean(child.textContent))mark(child,'action-inner')};\n  const footer=main.parentElement.querySelector(':scope>footer');mark(footer,'footer');\n  for(const root of [main,footer].filter(Boolean))for(const e of root.querySelectorAll('div'))if(clean(e.textContent)&&!e.closest('[data-hf30-action]')&&!e.closest('button'))mark(e,'flow');\n  for(const p of main.querySelectorAll('p'))if(!clean(p.textContent))mark(p,'blank');\n  for(const e of sections[0].querySelectorAll('.textContents'))if(e.querySelectorAll(':scope>p').length>2)mark(e,'prose');\n  const products=sections[2];const cards=[...products.querySelectorAll('div')].filter(e=>e.children.length===3&&[...e.children].some(c=>c.tagName==='P')&&[...e.children].some(c=>/^(LASERABLE|READINGABLE|LISTENINGABLE)$/.test(clean(c.textContent))));\n  for(const card of cards){mark(card,'card');mark(card.parentElement,'product-grid');for(const c of card.children){if(c.tagName==='P')mark(c,'category');else if(/^(LASERABLE|READINGABLE|LISTENINGABLE)$/.test(clean(c.textContent)))mark(c,'name');else mark(c,'description')}}\n  const review=sections[3];const previous=review.querySelector('button');if(previous){const controls=previous.parentElement;mark(controls,'controls');mark(controls.parentElement,'quote');for(const e of controls.parentElement.querySelectorAll('.textContents'))if(e.querySelectorAll(':scope>p').length>1)mark(e,'prose');}\n  const h=[...document.querySelectorAll('h1')].find(e=>clean(e.textContent)==='잠재력을깨우는기술,');if(!h)return;let hero=h;while(hero&&!([...hero.children].some(c=>c.tagName==='VIDEO')))hero=hero.parentElement;if(!hero)return;mark(hero,'hero');\n  for(const e of hero.querySelectorAll('div'))if(e.contains(h)&&e!==h.parentElement)mark(e,'hero-wrap');\n  mark(h.parentElement,'headline');const second=[...h.parentElement.querySelectorAll('h1')][1];const spacer=second&&[...second.children].find(e=>!clean(e.textContent));mark(spacer,'spacer');\n  const wordmark=hero.querySelector('img');mark(wordmark?.parentElement,'wordmark');const tagline=[...hero.querySelectorAll('p')].find(e=>e.textContent.includes('Pioneer'));mark(tagline?.parentElement,'tagline');mark(hero.querySelector('h3')?.parentElement,'meta');\n }\n const schedule=()=>{if(!disposed&&!raf)raf=requestAnimationFrame(reflow)};const observer=new MutationObserver(schedule);observer.observe(document.body,{childList:true,subtree:true});window.addEventListener('resize',schedule,{passive:true});reflow();\n window[KEY]={dispose(){if(disposed)return;disposed=true;observer.disconnect();cancelAnimationFrame(raf);window.removeEventListener('resize',schedule);style.remove();for(const[e,attrs]of originals)release(e,attrs);originals.clear()}};\n})();\n\n;\n/* BRAINABLE production global: laserable-native-responsive */\n/** Local candidate: native wrapper correction only; approved code contents remain untouched. */\n(()=>{\n const KEY='__brainableLaserableNative31';window[KEY]?.dispose();\n const style=document.createElement('style');style.textContent=`\n@media(max-width:1279px){\n[data-lp31-width]{box-sizing:border-box!important;width:100%!important;min-width:0!important;max-width:100%!important;padding-left:0!important;padding-right:0!important}\n[data-lp31-natural]{height:auto!important;min-height:0!important;max-height:none!important;flex-shrink:0!important;padding-top:0!important;padding-bottom:0!important;gap:0!important}\n[data-lp31-intro]{display:block!important;box-sizing:border-box!important;width:100%!important;min-width:0!important;max-width:100%!important;height:auto!important;min-height:0!important;max-height:none!important;position:relative!important;inset:auto!important;transform:none!important;flex-shrink:0!important;padding:28px clamp(20px,5vw,48px)!important;margin:0!important}\n[data-lp31-intro-flow]{box-sizing:border-box!important;width:100%!important;min-width:0!important;max-width:100%!important;height:auto!important;min-height:0!important;max-height:none!important;position:relative!important;inset:auto!important;transform:none!important;display:flex!important;flex-direction:column!important;align-items:stretch!important;justify-content:flex-start!important;gap:20px!important;padding:0!important;margin:0!important;flex-shrink:0!important;grid-area:auto!important}\n[data-lp31-intro] .textContents{display:block!important;line-height:1.65!important}\n[data-lp31-intro] p,[data-lp31-intro] h1,[data-lp31-intro] h2,[data-lp31-intro] h3{box-sizing:border-box!important;width:auto!important;max-width:100%!important;min-width:0!important;height:auto!important;min-height:0!important;position:relative!important;inset:auto!important;transform:none!important;margin:0!important;font-size:16px!important;line-height:1.65!important;white-space:normal!important;word-break:keep-all!important;overflow-wrap:anywhere!important}\n[data-lp31-intro] span{font-size:inherit!important;line-height:inherit!important}\n[data-lp31-intro-image]{box-sizing:border-box!important;position:relative!important;inset:auto!important;transform:none!important;width:auto!important;min-width:0!important;max-width:min(100%,720px)!important;height:auto!important;min-height:0!important;max-height:72svh!important;object-fit:contain!important;display:block!important;margin:0 auto!important}\n[data-lp31-map]{order:2!important}\n[data-lp31-caption]{order:3!important;padding-top:0!important;padding-bottom:28px!important}\n[data-lp31-caption] p{font-size:12px!important}\n[data-lp31-host]{order:4!important}\n[data-lp31-logo]{position:relative!important;inset:auto!important;transform:none!important;order:-1!important;width:clamp(180px,60vw,320px)!important;max-width:calc(100% - 40px)!important;min-width:0!important;height:auto!important;min-height:0!important;margin:32px auto 20px!important;flex-shrink:0!important}\n[data-lp31-logo] img{position:relative!important;inset:auto!important;width:100%!important;height:auto!important;max-width:100%!important;object-fit:contain!important;display:block!important;transform:none!important}\n[data-lp31-cta]{box-sizing:border-box!important;width:100%!important;min-width:0!important;max-width:100%!important;height:auto!important;min-height:0!important;gap:24px!important;padding:48px 20px!important;flex-shrink:0!important}\n[data-lp31-cta-copy]{width:100%!important;max-width:100%!important;min-width:0!important;height:auto!important;min-height:0!important;white-space:normal!important}\n[data-lp31-cta-copy] p{width:auto!important;height:auto!important;margin:0!important;font-size:clamp(20px,5vw,26px)!important;line-height:1.45!important;word-break:keep-all!important;white-space:normal!important}\n[data-lp31-blank]{display:none!important}\n}\n`;style.dataset.lp31Style='';document.head.append(style);\n const owned=new Map();let raf=0,dead=false;const clean=s=>String(s||'').replace(/[\\s\\u200b-\\u200d]/g,'');\n const mark=(e,key)=>{const k='data-lp31-'+key;if(!owned.has(e))owned.set(e,new Map());const attrs=owned.get(e);if(!attrs.has(k))attrs.set(k,e.getAttribute(k));e.setAttribute(k,'')};\n const restore=(e,attrs)=>{for(const[k,v]of attrs)v===null?e.removeAttribute(k):e.setAttribute(k,v);owned.delete(e)};\n const inFlow=e=>{const s=getComputedStyle(e);return s.display!=='none'&&s.position!=='absolute'&&s.position!=='fixed'};\n function sync(){raf=0;if(dead)return;for(const[e,a]of owned)if(!e.isConnected)restore(e,a);\n  const root=document.querySelector('.laserable-renewal.le29-spatial');if(!root){for(const[e,a]of owned)restore(e,a);return;}\n  let chain=[];for(let e=root.parentElement,i=0;e&&e!==document.body&&e!==document.documentElement&&i<12;e=e.parentElement,i++){chain.push(e);if(e.id==='container')break;}\n  // Only the observed code-to-container host path is eligible, never app internals.\n  chain.forEach(e=>mark(e,'width'));\n  const intro=[...document.querySelectorAll('p')].find(e=>!root.contains(e)&&e.textContent.includes('브레인에이블이 개발한 레이저에이블'));\n  const common=intro&&chain.find(e=>e.contains(intro));if(!common)return;\n  // Measured production shape: code host -> intro group -> padded body ->\n  // inner frame -> MAIN. None includes the preceding everyday hero/header.\n  const nativeMain=root.closest('main');const mainIndex=chain.indexOf(nativeMain);\n  if(mainIndex<0)return;for(let i=0;i<=mainIndex;i++)mark(chain[i],'natural');\n  mark(root.parentElement,'host');\n  for(const wrapper of chain.slice(1,mainIndex+1))for(const child of wrapper.children){\n   if(child.contains(root))continue;\n   const image=child.querySelector('img');\n   if(!clean(child.textContent)&&image&&image.naturalWidth/image.naturalHeight>3&&getComputedStyle(child).position==='absolute')mark(child,'logo');\n   if(clean(child.textContent).startsWith('지금바로브레인에이블과상담해보세요.')){mark(child,'cta');for(const item of child.children)if(clean(item.textContent)==='지금바로브레인에이블과상담해보세요.')mark(item,'cta-copy');}\n  }\n  for(const branch of common.children){if(branch.contains(root))continue;const hasCopy=!!clean(branch.textContent),map=getComputedStyle(branch).display==='contents'&&!!branch.querySelector('img');if(!hasCopy&&!map)continue;mark(branch,'intro');if(map)mark(branch,'map');if(branch.textContent.includes('*Transcranial Photo-Bio-Modulation'))mark(branch,'caption');\n   for(const e of branch.querySelectorAll('div'))if(clean(e.textContent)||e.querySelector('img'))mark(e,'intro-flow');\n   for(const image of branch.querySelectorAll('img')){mark(image,'intro-image');for(let p=image.parentElement;p&&p!==branch;p=p.parentElement)mark(p,'intro-flow');}\n   for(const p of branch.querySelectorAll('p'))if(!clean(p.textContent))mark(p,'blank');\n  }\n }\n const schedule=()=>{if(!dead&&!raf)raf=requestAnimationFrame(sync)};const observer=new MutationObserver(schedule);observer.observe(document.body,{childList:true,subtree:true});window.addEventListener('resize',schedule,{passive:true});document.addEventListener('load',schedule,true);sync();\n window[KEY]={dispose(){if(dead)return;dead=true;observer.disconnect();window.removeEventListener('resize',schedule);document.removeEventListener('load',schedule,true);cancelAnimationFrame(raf);style.remove();for(const[e,a]of owned)restore(e,a)},status(){return{marked:owned.size,codeRoot:!!document.querySelector('.laserable-renewal.le29-spatial')}}};\n})();\n\n;\n/* BRAINABLE production global: laserable-first-scene-fit */\n/** Local candidate: preserve approved sizing/logo handling; bind every rendered Everyday instance. */\n(() => {\n  const KEY = '__brainableFirstScene31';\n  window[KEY]?.dispose();\n  const style = document.createElement('style');\n  style.textContent = `\n[data-lp31-first-scene]{--lp31-first-nav:64px;scroll-margin-top:var(--lp31-first-nav)!important;height:calc(100svh - var(--lp31-first-nav))!important;min-height:calc(100svh - var(--lp31-first-nav))!important}\n[data-lp31-first-host]{--lp31-first-nav:64px;flex-shrink:0!important;height:calc(100svh - var(--lp31-first-nav))!important;min-height:calc(100svh - var(--lp31-first-nav))!important;max-height:none!important}\n@media(min-width:1024px){[data-lp31-first-scene],[data-lp31-first-host]{--lp31-first-nav:80px}}\n[data-lp31-hero-logo-flow]{box-sizing:border-box!important;position:relative!important;inset:auto!important;transform:none!important;flex-shrink:0!important;width:clamp(180px,60vw,320px)!important;max-width:calc(100% - 40px)!important;height:auto!important;min-height:0!important;max-height:none!important;margin:24px auto!important;padding:0!important;order:0!important}\n[data-lp31-hero-logo-flow] img{display:block!important;position:relative!important;inset:auto!important;transform:none!important;width:100%!important;max-width:100%!important;height:auto!important;min-height:0!important;max-height:none!important;object-fit:contain!important;object-position:center!important}\n[data-lp31-hero-logo-duplicate]{display:none!important}\n`;\n  document.head.append(style);\n  const exactLogo = /(?:^|[^a-f0-9])a99b21091db44b74702c6452c8847c11eba1f575\\.png(?:[?#&]|$)/i;\n  const ownsLogoAsset = image => exactLogo.test(image?.getAttribute('src') || '');\n  const active = new Map();\n  let frame = 0, dead = false;\n  function rendered(element) {\n    // Off-screen is still rendered: scrolling must not remove height ownership.\n    if (!element.isConnected || !element.getClientRects().length) return false;\n    const rect = element.getBoundingClientRect();\n    if (!(rect.width > 0 && rect.height > 0)) return false;\n    for (let node = element; node && node !== document.body; node = node.parentElement) {\n      const css = getComputedStyle(node);\n      if (css.display === 'none' || css.visibility === 'hidden' || css.visibility === 'collapse') return false;\n    }\n    return true;\n  }\n  const exactHeroMedia = /(?:^|[^a-f0-9])(?:5825f5c24257920bc2ed005b92017332dce7f54d|ae8e9d361a42018efe03cf28d63ebb21fbf3379e)(?=$|[^a-f0-9])/i;\n  function restoredNativeHero(page, host) {\n    return [...page.children].some(header => {\n      if (header.tagName !== 'HEADER' || !rendered(header) ||\n          !(header.compareDocumentPosition(host) & Node.DOCUMENT_POSITION_FOLLOWING) ||\n          header.querySelector('nav,a,button,[role=\"navigation\"]')) return false;\n      const media = [header, ...header.querySelectorAll('video,source,img,[style]')];\n      return media.some(node => [\n        node.currentSrc, node.getAttribute('src'), node.getAttribute('srcset'),\n        node.getAttribute('poster'), node.getAttribute('style'),\n        getComputedStyle(node).backgroundImage,\n      ].some(value => value && exactHeroMedia.test(value)));\n    });\n  }\n  function createBinding(target, host) {\n    const attrs = new Map();\n    let logo = null, homeParent = null, homeNext = null;\n    let moved = false;\n    const mark = (element, name, value = '') => {\n      let saved = attrs.get(element);\n      if (!saved) attrs.set(element, saved = new Map());\n      if (!saved.has(name)) saved.set(name, element.getAttribute(name));\n      if (element.getAttribute(name) !== value) element.setAttribute(name, value);\n    };\n    const unmark = (element, name) => {\n      const saved = attrs.get(element);\n      if (!saved?.has(name)) return;\n      const value = saved.get(name);\n      value === null ? element.removeAttribute(name) : element.setAttribute(name, value);\n      saved.delete(name);\n      if (!saved.size) attrs.delete(element);\n    };\n    function restore(element) {\n      for (const name of [...(attrs.get(element)?.keys() || [])]) unmark(element, name);\n    }\n    function releaseLogo() {\n      if (logo) {\n        restore(logo);\n        if (moved && homeParent) {\n          if (homeNext?.parentElement === homeParent) homeParent.insertBefore(logo, homeNext);\n          else homeParent.append(logo);\n        }\n      }\n      logo = homeParent = homeNext = null;\n      moved = false;\n    }\n    function release() {\n      releaseLogo();\n      if (target) restore(target);\n      if (host) restore(host);\n  \n    }\n    function syncLogo() {\n      const page = host?.parentElement;\n      if (!page) { releaseLogo(); return; }\n      // The restored original video hero owns this wordmark, not Everyday.\n      if (restoredNativeHero(page, host)) { releaseLogo(); return; }\n      const nextMain = [...page.children].find(node => node.tagName === 'MAIN' && (host.compareDocumentPosition(node) & Node.DOCUMENT_POSITION_FOLLOWING));\n      if (!nextMain) { releaseLogo(); return; }\n      const nextLogo = [...page.children].find(node => {\n        if (node.tagName !== 'DIV' || node.textContent.trim() || node === host) return false;\n        const images = node.querySelectorAll('img');\n        return images.length === 1 && ownsLogoAsset(images[0]) &&\n          (node === logo || getComputedStyle(node).position === 'absolute');\n      });\n      if (nextLogo !== logo) {\n        releaseLogo();\n        if (nextLogo) { logo = nextLogo; homeParent = logo.parentElement; homeNext = logo.nextSibling; }\n      }\n      if (!logo) return;\n      const duplicate = [...nextMain.querySelectorAll('img')].some(image => ownsLogoAsset(image) && rendered(image));\n      if (duplicate) {\n        unmark(logo, 'data-lp31-hero-logo-flow');\n        mark(logo, 'data-lp31-hero-logo-duplicate');\n        mark(logo, 'aria-hidden', 'true');\n      } else {\n        unmark(logo, 'data-lp31-hero-logo-duplicate');\n        unmark(logo, 'aria-hidden');\n        mark(logo, 'data-lp31-hero-logo-flow');\n        if (host.nextSibling !== logo) { host.after(logo); moved = true; }\n      }\n    }\n    mark(target, 'data-lp31-first-scene');\n    if (host) mark(host, 'data-lp31-first-host');\n    return { host, syncLogo, release };\n  }\n  function sync() {\n    frame = 0;\n    if (dead) return;\n    const next = new Map();\n    for (const target of document.querySelectorAll('.le28-everyday')) {\n      if (!rendered(target)) continue;\n      const parent = target.parentElement;\n      const host = parent?.classList.contains('tailwind') && parent.parentElement &&\n        getComputedStyle(parent.parentElement).display.includes('flex') ? parent : null;\n      next.set(target, host);\n    }\n    // Release hidden/unmounted breakpoint ownership before activating its replacement.\n    for (const [target, binding] of active) {\n      if (!next.has(target) || next.get(target) !== binding.host) {\n        binding.release();\n        active.delete(target);\n      }\n    }\n    for (const [target, host] of next) {\n      if (!active.has(target)) active.set(target, createBinding(target, host));\n      active.get(target).syncLogo();\n    }\n  }\n  const schedule = () => { if (!dead && !frame) frame = requestAnimationFrame(sync); };\n  const observer = new MutationObserver(schedule);\n  observer.observe(document.body, {childList:true, subtree:true});\n  window.addEventListener('resize', schedule, {passive:true});\n  document.addEventListener('load', schedule, true);\n  sync();\n  window[KEY] = {\n    dispose() {\n      if (dead) return;\n      dead = true; observer.disconnect(); cancelAnimationFrame(frame);\n      window.removeEventListener('resize', schedule);\n      document.removeEventListener('load', schedule, true);\n      for (const binding of active.values()) binding.release();\n      active.clear(); style.remove();\n    }\n  };\n})();\n\n;\n/* BRAINABLE production global: laserable-native-hero-fit */\n/* Restored native LASERABLE opening hero: keep its original video, crop and logo node. */\n(() => {\n  const KEY = '__brainableNativeHero31';\n  window[KEY]?.dispose();\n  const exactMedia = /(?:^|[^a-f0-9])(?:5825f5c24257920bc2ed005b92017332dce7f54d|ae8e9d361a42018efe03cf28d63ebb21fbf3379e)(?=$|[^a-f0-9])/i;\n  const exactLogo = /(?:^|[^a-f0-9])a99b21091db44b74702c6452c8847c11eba1f575\\.png(?:[?#&]|$)/i;\n  const style = document.createElement('style');\n  style.dataset.lh31Styles = '';\n  style.textContent = `\n[data-lh31-native-hero]{--lh31-nav:64px;--lh31-height:calc(100svh - var(--lh31-nav));box-sizing:border-box!important;position:relative!important;width:100%!important;min-width:0!important;max-width:none!important;height:var(--lh31-height)!important;min-height:var(--lh31-height)!important;max-height:var(--lh31-height)!important;flex-grow:0!important;flex-shrink:0!important;align-self:stretch!important;padding:0!important;scroll-snap-align:start;scroll-margin-top:var(--lh31-nav)}\n[data-lh31-hero-wordmark]{box-sizing:border-box!important;position:absolute!important;inset:auto!important;left:var(--lh31-logo-left)!important;top:var(--lh31-logo-top)!important;transform:none!important;width:var(--lh31-logo-width)!important;height:var(--lh31-logo-height)!important;min-width:0!important;max-width:none!important;min-height:0!important;max-height:none!important;margin:0!important;padding:0!important;flex:none!important;z-index:2;pointer-events:none}\n[data-lh31-hero-wordmark] img{box-sizing:border-box!important;position:absolute!important;inset:0!important;transform:none!important;width:100%!important;height:100%!important;min-width:0!important;min-height:0!important;max-width:100%!important;max-height:100%!important;object-fit:contain!important;object-position:center!important}\n[data-lh31-native-hero][data-lh31-wide]{background-color:#02060e!important;overflow:hidden!important}\n[data-lh31-native-hero][data-lh31-wide] [data-lh31-video-layer]{box-sizing:border-box!important;position:absolute!important;inset:0!important;width:100%!important;height:100%!important;min-width:0!important;min-height:0!important;max-width:none!important;max-height:none!important;margin:0!important;padding:0!important;transform:none!important;overflow:hidden!important;background-color:#02060e!important}\n[data-lh31-native-hero][data-lh31-wide] video[data-lh31-video]{box-sizing:border-box!important;position:absolute!important;inset:0!important;width:100%!important;height:100%!important;min-width:0!important;min-height:0!important;max-width:100%!important;max-height:100%!important;margin:0!important;transform:none!important;object-fit:contain!important;object-position:center!important;background-color:#02060e!important}\n[data-lh31-native-hero][data-lh31-wide][data-lh31-portrait-fill] video[data-lh31-video]{object-fit:cover!important;object-position:75% center!important}\n@media(min-width:1024px){[data-lh31-native-hero]{--lh31-nav:80px}}\n`;\n  document.head.append(style);\n  const active = new Map();\n  let frame = 0, dead = false;\n  function rendered(node) {\n    if (!node?.isConnected || !node.getClientRects().length) return false;\n    const rect = node.getBoundingClientRect();\n    if (!(rect.width > 0 && rect.height > 0)) return false;\n    for (let element = node; element && element !== document.body; element = element.parentElement) {\n      const css = getComputedStyle(element);\n      if (css.display === 'none' || css.visibility === 'hidden' || css.visibility === 'collapse') return false;\n    }\n    return true;\n  }\n  function isExactHero(header, host) {\n    if (header.tagName !== 'HEADER' || !rendered(header) ||\n        !(header.compareDocumentPosition(host) & Node.DOCUMENT_POSITION_FOLLOWING) ||\n        header.querySelector('nav,a,button,[role=\"navigation\"]')) return false;\n    return [header, ...header.querySelectorAll('video,source,img,[style]')].some(node => [\n      node.currentSrc, node.getAttribute('src'), node.getAttribute('srcset'),\n      node.getAttribute('poster'), node.getAttribute('style'), getComputedStyle(node).backgroundImage,\n    ].some(value => value && exactMedia.test(value)));\n  }\n  function findWordmark(page, hero) {\n    const owned = active.get(hero)?.logo;\n    if (owned?.isConnected && owned.parentElement === page && rendered(owned)) return owned;\n    const candidates = [...page.children].filter(node => {\n      if (node.tagName !== 'DIV' || node.textContent.trim() || !rendered(node)) return false;\n      const images = node.querySelectorAll('img');\n      return images.length === 1 && exactLogo.test(images[0].getAttribute('src') || '') &&\n        getComputedStyle(node).position === 'absolute';\n    });\n    return candidates.length === 1 ? candidates[0] : null;\n  }\n  function bind(hero, logo) {\n    const heroAttr = hero.getAttribute('data-lh31-native-hero');\n    const logoAttr = logo.getAttribute('data-lh31-hero-wordmark');\n    const wideAttr = hero.getAttribute('data-lh31-wide');\n    const portraitFillAttr = hero.getAttribute('data-lh31-portrait-fill');\n    const mediaMarks = new Map();\n    function releaseMedia() {\n      for (const [node, saved] of mediaMarks) {\n        saved.value === null ? node.removeAttribute(saved.name) : node.setAttribute(saved.name, saved.value);\n      }\n      mediaMarks.clear();\n      wideAttr === null ? hero.removeAttribute('data-lh31-wide') : hero.setAttribute('data-lh31-wide', wideAttr);\n      portraitFillAttr === null ? hero.removeAttribute('data-lh31-portrait-fill') : hero.setAttribute('data-lh31-portrait-fill', portraitFillAttr);\n    }\n    function fitWideMedia(wide) {\n      if (!wide) { releaseMedia(); return; }\n      const videos = [...hero.querySelectorAll('video')].filter(video =>\n        [video, ...video.querySelectorAll('source')].some(node =>\n          [node.currentSrc, node.getAttribute('src'), node.getAttribute('poster')]\n            .some(value => value && exactMedia.test(value))));\n      if (videos.length !== 1) { releaseMedia(); return; }\n      const video = videos[0], next = new Map([[video, 'data-lh31-video']]);\n      for (let node = video.parentElement; node && node !== hero; node = node.parentElement) {\n        if (node.tagName !== 'DIV' || node.textContent.trim() ||\n            node.querySelector('nav,a,button,[data-lh31-hero-wordmark]')) break;\n        next.set(node, 'data-lh31-video-layer');\n      }\n      for (const [node, saved] of mediaMarks) if (!next.has(node)) {\n        saved.value === null ? node.removeAttribute(saved.name) : node.setAttribute(saved.name, saved.value);\n        mediaMarks.delete(node);\n      }\n      for (const [node, name] of next) if (!mediaMarks.has(node)) {\n        mediaMarks.set(node, {name, value:node.getAttribute(name)});\n        node.setAttribute(name, '');\n      }\n      if (!hero.hasAttribute('data-lh31-wide')) hero.setAttribute('data-lh31-wide', '');\n      return video;\n    }\n\n    const hadStyle = logo.hasAttribute('style');\n    // Figma may choose its authored mobile frame above a usual CSS breakpoint.\n    // The unchanged wordmark widths identify those three original compositions.\n    const authoredWidth = Number.parseFloat(getComputedStyle(logo).width);\n    const authored = Math.abs(authoredWidth - 321) < 2 ? 'mobile' :\n      Math.abs(authoredWidth - 567) < 2 ? 'tablet' :\n      Math.abs(authoredWidth - 778.666626) < 2 ? 'desktop' : null;\n\n    const names = ['--lh31-logo-left','--lh31-logo-top','--lh31-logo-width','--lh31-logo-height'];\n    const original = names.map(name => [name, logo.style.getPropertyValue(name), logo.style.getPropertyPriority(name)]);\n    hero.setAttribute('data-lh31-native-hero', '');\n    logo.setAttribute('data-lh31-hero-wordmark', '');\n    return {logo, syncPosition() {\n      const rect = hero.getBoundingClientRect();\n      const parent = logo.offsetParent || logo.parentElement;\n      if (!parent || !rect.width || !rect.height) return;\n      const base = parent.getBoundingClientRect();\n      const viewport = document.documentElement.clientWidth || window.innerWidth;\n      const viewportHeight = document.documentElement.clientHeight || window.innerHeight;\n      const nativeMobile = authored === 'mobile' || (!authored && viewport < 800);\n      const aspect = rect.width / rect.height;\n      const trulyWide = aspect > 1.2 || viewport > viewportHeight;\n      const portraitFill = !trulyWide && nativeMobile && aspect > .72;\n      const adjustedVideo = fitWideMedia(trulyWide || portraitFill);\n      if (portraitFill && adjustedVideo) hero.setAttribute('data-lh31-portrait-fill', '');\n      else portraitFillAttr === null ? hero.removeAttribute('data-lh31-portrait-fill') : hero.setAttribute('data-lh31-portrait-fill', portraitFillAttr);\n      const wideVideo = trulyWide ? adjustedVideo : null;\n      const ratio = wideVideo?.videoWidth > 0 && wideVideo?.videoHeight > 0 ? wideVideo.videoWidth / wideVideo.videoHeight : 16 / 9;\n      const imageWidth = wideVideo ? Math.min(rect.width, rect.height * ratio) : rect.width;\n      const imageHeight = wideVideo ? imageWidth / ratio : rect.height;\n      const imageLeft = (rect.width - imageWidth) / 2, imageTop = (rect.height - imageHeight) / 2;\n      const mobile = authored ? authored === 'mobile' : viewport < 800;\n      const tablet = authored ? authored === 'tablet' : viewport < 1280 && !mobile;\n      // Retain the measured original composition at each authored breakpoint.\n      const anchorY = wideVideo ? .82 : mobile ? .54 : tablet ? .662 : .821;\n      const widthFraction = wideVideo ? .6 : mobile ? .856 : tablet ? .70875 : .60833333;\n      const width = portraitFill && adjustedVideo ? rect.width * .856 : Math.min(imageWidth * widthFraction, imageHeight * .73);\n      const left = imageLeft + (mobile ? (imageWidth - width) / 2 : imageWidth * (wideVideo ? .1 : tablet ? .0625 : .1));\n      const values = [\n        rect.left - base.left - (parent.clientLeft || 0) + (parent.scrollLeft || 0) + left,\n        rect.top - base.top - (parent.clientTop || 0) + (parent.scrollTop || 0) + imageTop + imageHeight * anchorY,\n        width, width * 144 / 876,\n      ];\n      names.forEach((name, index) => {\n        const value = `${Math.round(values[index] * 1000) / 1000}px`;\n        if (logo.style.getPropertyValue(name) !== value) logo.style.setProperty(name, value);\n      });\n    }, release() {\n      releaseMedia();\n      heroAttr === null ? hero.removeAttribute('data-lh31-native-hero') : hero.setAttribute('data-lh31-native-hero', heroAttr);\n      logoAttr === null ? logo.removeAttribute('data-lh31-hero-wordmark') : logo.setAttribute('data-lh31-hero-wordmark', logoAttr);\n      for (const [name, value, priority] of original) value ? logo.style.setProperty(name, value, priority) : logo.style.removeProperty(name);\n      if (!hadStyle && !logo.getAttribute('style')) logo.removeAttribute('style');\n    }};\n  }\n  function sync() {\n    frame = 0;\n    if (dead) return;\n    const next = new Map();\n    for (const scene of document.querySelectorAll('.le28-everyday')) {\n      if (!rendered(scene)) continue;\n      const host = scene.parentElement, page = host?.parentElement;\n      if (!host?.classList.contains('tailwind') || !page || !getComputedStyle(page).display.includes('flex')) continue;\n      const heroes = [...page.children].filter(header => isExactHero(header, host));\n      if (heroes.length !== 1) continue;\n      const hero = heroes[0], logo = findWordmark(page, hero);\n      if (logo) next.set(hero, logo);\n    }\n    for (const [hero, binding] of active) {\n      if (next.get(hero) !== binding.logo) {binding.release(); active.delete(hero);}\n    }\n    for (const [hero, logo] of next) {\n      if (!active.has(hero)) active.set(hero, bind(hero, logo));\n      active.get(hero).syncPosition();\n    }\n  }\n  const schedule = () => {if (!dead && !frame) frame = requestAnimationFrame(sync);};\n  const observer = new MutationObserver(schedule);\n  observer.observe(document.body, {childList:true, subtree:true, attributes:true, attributeFilter:['src','poster','class','style']});\n  window.addEventListener('resize', schedule, {passive:true});\n  document.addEventListener('load', schedule, true);\n  sync();\n  window[KEY] = {dispose() {\n    if (dead) return;\n    dead = true; observer.disconnect(); cancelAnimationFrame(frame);\n    window.removeEventListener('resize', schedule);\n    document.removeEventListener('load', schedule, true);\n    for (const binding of active.values()) binding.release();\n    active.clear(); style.remove();\n  }};\n})();\n\n;\n/* BRAINABLE production global: laserable-desktop-clip */\n/** LOCAL CANDIDATE ONLY. Waits for the existing final12 hydration gate. */\n(() => {\n  const KEY='__brainableDesktopClip31';\n  window[KEY]?.dispose();\n  const CSS=\"/* LOCAL CANDIDATE. Scope: visible product code → closest native MAIN only. */\\n@media (min-width:1280px) {\\n  [data-dc31-native-width] {\\n    box-sizing:border-box!important;\\n    width:100%!important;\\n    min-width:0!important;\\n    max-width:none!important;\\n    padding-left:0!important;\\n    padding-right:0!important;\\n    align-self:stretch!important;\\n  }\\n  .laserable-renewal.le29-spatial[data-dc31-root] {\\n    width:100%!important;\\n    min-width:0!important;\\n    max-width:none!important;\\n  }\\n}\\n\\n/* Keep the white canvas full-width; bound content with padding, not the canvas. */\\n@media (min-width:921px) {\\n  .laserable-renewal.le29-spatial[data-dc31-root] > .te30-scene[data-dc31-scene][data-layout=\\\"a\\\"] {\\n    --dc31-fit:1;\\n    --dc31-available-height:calc(100svh - var(--te30-header-height,0px));\\n    --dc31-pad-y:max(14px,calc(clamp(28px,5svh,56px) * var(--dc31-fit)));\\n    box-sizing:border-box;\\n    width:100%;\\n    max-width:none;\\n    min-width:0;\\n    margin-inline:0;\\n    height:var(--dc31-available-height);\\n    min-height:0;\\n    max-height:none;\\n    padding-block:var(--dc31-pad-y);\\n    padding-inline:max(clamp(28px,4.5vw,72px),calc((100% - 1600px) / 2));\\n    column-gap:clamp(24px,3vw,48px);\\n    row-gap:max(10px,calc(clamp(18px,2.3svh,26px) * var(--dc31-fit)));\\n    grid-template-columns:minmax(0,44fr) minmax(0,56fr);\\n    grid-template-rows:auto auto auto;\\n    align-content:center;\\n    overflow:visible;\\n    scroll-snap-align:start;\\n  }\\n  .laserable-renewal.le29-spatial[data-dc31-root] > .te30-scene[data-dc31-scene] > .brand {\\n    width:max(220px,calc(clamp(260px,24vw,350px) * var(--dc31-fit)));\\n    max-width:100%;\\n  }\\n  .laserable-renewal.le29-spatial[data-dc31-root] > .te30-scene[data-dc31-scene] .headline {\\n    font-size:max(24px,calc(clamp(29px,2.65vw,38px) * var(--dc31-fit)));\\n    line-height:1.27;\\n    overflow-wrap:normal;\\n    word-break:keep-all;\\n  }\\n  .laserable-renewal.le29-spatial[data-dc31-root] > .te30-scene[data-dc31-scene] .expertise {\\n    font-size:max(13px,calc(clamp(16px,1.27vw,18px) * var(--dc31-fit)));\\n    line-height:1.6;\\n    margin-top:max(10px,calc(clamp(16px,2svh,24px) * var(--dc31-fit)));\\n  }\\n  .laserable-renewal.le29-spatial[data-dc31-root] > .te30-scene[data-dc31-scene] > .engines {\\n    gap:max(8px,calc(clamp(16px,2svh,22px) * var(--dc31-fit)));\\n  }\\n  .laserable-renewal.le29-spatial[data-dc31-root] > .te30-scene[data-dc31-scene] .engine h2 {\\n    font-size:max(14px,calc(clamp(16px,1.28vw,18px) * var(--dc31-fit)));\\n    margin-bottom:max(4px,calc(7px * var(--dc31-fit)));\\n    line-height:1.35;\\n  }\\n  .laserable-renewal.le29-spatial[data-dc31-root] > .te30-scene[data-dc31-scene] .engine p {\\n    font-size:max(13px,calc(clamp(14px,1.12vw,16px) * var(--dc31-fit)));\\n    line-height:1.55;\\n  }\\n  .laserable-renewal.le29-spatial[data-dc31-root] > .te30-scene[data-dc31-scene] > .visual {\\n    min-height:0;\\n    max-height:100%;\\n    align-self:stretch;\\n  }\\n  .laserable-renewal.le29-spatial[data-dc31-root] > .te30-scene[data-dc31-scene] .art-composite {\\n    width:min(100%,calc((var(--dc31-available-height) - 2 * var(--dc31-pad-y)) * 4 / 3));\\n    max-width:100%;\\n    aspect-ratio:4 / 3;\\n  }\\n  .laserable-renewal.le29-spatial[data-dc31-root] > .te30-scene[data-dc31-scene] .approved-art {\\n    width:100%;\\n    height:100%;\\n    max-height:100%;\\n    object-fit:contain;\\n    object-position:center;\\n  }\\n  .laserable-renewal.le29-spatial[data-dc31-root] > .monitor-dark.md30-scene {\\n    scroll-snap-align:start;\\n  }\\n  /* Readable fallback for exceptionally short windows: flow instead of hiding copy. */\\n  .laserable-renewal.le29-spatial[data-dc31-root] > .te30-scene[data-dc31-scene][data-dc31-fit-state=\\\"flow\\\"] {\\n    height:auto;\\n    min-height:var(--dc31-available-height);\\n    align-content:start;\\n    scroll-snap-align:none;\\n  }\\n}\\n\\n/* Figma uses a column NAV below1280px; enhancer desktop starts at1024px.\\n * Normalize only the explicit noncompact native state. Compact rules are untouched. */\\n[data-brnav-header][data-nav30-kind=\\\"native\\\"][data-brnav-compact=\\\"false\\\"] [data-brnav-menu] {\\n  flex-direction:row!important;\\n  flex-wrap:nowrap!important;\\n  height:auto!important;\\n  max-height:none!important;\\n}\\n\";\n  const owned=new Map(), scenes=new Map();\n  let style=null, observer=null, resize=null, frame=0, retry=0, dead=false, phase='waiting-for-final12';\n  const attr=(node,key,value='')=>{\n    let record=owned.get(node); if(!record)owned.set(node,record=new Map());\n    if(!record.has(key))record.set(key,node.getAttribute(key));\n    if(node.getAttribute(key)!==value)node.setAttribute(key,value);\n  };\n  function restore(node){\n    const record=owned.get(node); if(!record)return;\n    for(const[key,value]of record)value===null?node.removeAttribute(key):node.setAttribute(key,value);\n    owned.delete(node);\n  }\n  function isRendered(node){\n    if(!node?.isConnected||!node.getClientRects().length)return false;\n    const rect=node.getBoundingClientRect();if(!(rect.width>0&&rect.height>0))return false;\n    for(let current=node;current&&current!==document.body;current=current.parentElement){\n      const css=getComputedStyle(current);if(css.display==='none'||css.visibility==='hidden')return false;\n    }\n    return true;\n  }\n  const px=value=>Number.parseFloat(value)||0;\n  function restoreFit(scene,record){\n    if(scene.style.getPropertyValue('--dc31-fit')===record.written){\n      if(record.fit)scene.style.setProperty('--dc31-fit',record.fit,record.priority);\n      else scene.style.removeProperty('--dc31-fit');\n    }\n    resize?.unobserve(scene);\n    record.parts.forEach(node=>resize?.unobserve(node));\n    scenes.delete(scene);\n  }\n  function setFit(scene,record,value){\n    const next=String(Math.round(value*1000)/1000);\n    if(scene.style.getPropertyValue('--dc31-fit')!==next)scene.style.setProperty('--dc31-fit',next);\n    record.written=next;\n  }\n  function fitScene(scene){\n    let record=scenes.get(scene);\n    if(!record){\n      const parts=['brand','intro','engines'].map(name=>[...scene.children].find(node=>node.classList.contains(name)));\n      if(parts.some(node=>!node))return;\n      record={fit:scene.style.getPropertyValue('--dc31-fit'),priority:scene.style.getPropertyPriority('--dc31-fit'),written:'',parts,last:null};\n      scenes.set(scene,record);resize?.observe(scene);parts.forEach(node=>resize?.observe(node));\n    }\n    if(window.innerWidth<921){\n      if(record.written&&scene.style.getPropertyValue('--dc31-fit')===record.written){\n        if(record.fit)scene.style.setProperty('--dc31-fit',record.fit,record.priority);else scene.style.removeProperty('--dc31-fit');\n      }\n      record.written='';attr(scene,'data-dc31-fit-state','original');return;\n    }\n    attr(scene,'data-dc31-fit-state','fit');\n    setFit(scene,record,1);\n    const viewport=document.documentElement.clientHeight||window.innerHeight;\n    const required=()=>{\n      const css=getComputedStyle(scene);\n      return record.parts.reduce((sum,node)=>sum+node.offsetHeight,0)+2*px(css.rowGap)+px(css.paddingTop)+px(css.paddingBottom);\n    };\n    const available=Math.max(1,viewport-px(getComputedStyle(scene).getPropertyValue('--te30-header-height')));\n    let needed=required(), fit=1;\n    // At most three bounded measurement passes; no source/bitmap transform scaling.\n    for(let pass=0;pass<3&&needed>available-2&&fit>.82;pass++){\n      fit=Math.max(.82,Math.min(fit-.01,fit*(available-2)/needed));\n      setFit(scene,record,fit);needed=required();\n    }\n    const state=needed>available+1?'flow':'fit';\n    attr(scene,'data-dc31-fit-state',state);\n    record.last={available,required:Math.round(needed*100)/100,fit:Number(record.written),state};\n  }\n  function scan(){\n    frame=0;if(dead||phase!=='active')return;\n    const eligible=new Set();\n    const roots=[...document.querySelectorAll('.laserable-renewal.le29-spatial')].filter(isRendered);\n    for(const root of roots){\n      const host=root.parentElement,main=host?.closest('main');\n      // Refuse an unknown host shape and never walk above the native MAIN.\n      if(!main||main===root||!host?.classList.contains('tailwind'))continue;\n      let reached=false;const path=[];\n      for(let node=host,depth=0;node&&depth<10;node=node.parentElement,depth++){\n        path.push(node);if(node===main){reached=true;break;}\n      }\n      if(!reached)continue;\n      attr(root,'data-dc31-root');eligible.add(root);\n      for(const node of path){attr(node,'data-dc31-native-width');eligible.add(node);}\n      for(const scene of root.querySelectorAll(':scope > .te30-scene[data-layout=\"a\"]')){\n        attr(scene,'data-dc31-scene');eligible.add(scene);fitScene(scene);\n      }\n    }\n    for(const[scene,record]of scenes)if(!eligible.has(scene))restoreFit(scene,record);\n    for(const node of [...owned.keys()])if(!eligible.has(node)||!node.isConnected)restore(node);\n  }\n  function schedule(){if(!dead&&phase==='active'&&!frame)frame=requestAnimationFrame(scan);}\n  function start(){\n    retry=0;if(dead)return;\n    const gatePhase=window.__brainableHydrationGate31?.inspect?.().phase;\n    if(gatePhase!=='active'&&gatePhase!=='starting'){\n      phase='waiting-for-final12';retry=setTimeout(start,250);return;\n    }\n    phase='active';style=document.createElement('style');style.dataset.dc31Style='';style.textContent=CSS;document.head.append(style);\n    resize=typeof ResizeObserver==='undefined'?null:new ResizeObserver(schedule);\n    observer=new MutationObserver(schedule);observer.observe(document.body,{childList:true,subtree:true});\n    window.addEventListener('resize',schedule,{passive:true});window.addEventListener('popstate',schedule);\n    document.fonts?.ready.then(schedule);document.addEventListener('load',schedule,true);\n    scan();\n  }\n  window[KEY]={\n    inspect:()=>({phase,owned:owned.size,scenes:[...scenes.entries()].map(([scene,record])=>({connected:scene.isConnected,...record.last}))}),\n    dispose(){\n      if(dead)return;dead=true;phase='disposed';clearTimeout(retry);cancelAnimationFrame(frame);\n      observer?.disconnect();resize?.disconnect();window.removeEventListener('resize',schedule);window.removeEventListener('popstate',schedule);document.removeEventListener('load',schedule,true);\n      for(const[scene,record]of [...scenes])restoreFit(scene,record);\n      for(const node of [...owned.keys()])restore(node);\n      style?.remove();delete window[KEY];\n    }\n  };\n  start();\n})();\n\n;\n/* BRAINABLE production global: laserable-tpbm-native-layout */\n/** Narrow native tPBM intro reflow. Approved text, media and code nodes stay in place. */\n(() => {\n  const KEY='__brainableTPBMNative20';\n  window[KEY]?.dispose();\n  const CSS=`\n/* This group is identified by exact native copy, mechanism art and product code host. */\n[data-tp20-group] {\n  --tp20-gutter:clamp(24px,5vw,88px);\n  box-sizing:border-box!important;position:relative!important;inset:auto!important;\n  transform:none!important;width:100%!important;min-width:0!important;max-width:none!important;\n  height:auto!important;min-height:0!important;max-height:none!important;\n  display:grid!important;grid-template-columns:minmax(var(--tp20-gutter),1fr) minmax(0,520px) clamp(32px,5vw,88px) minmax(0,560px) minmax(var(--tp20-gutter),1fr)!important;\n  grid-template-rows:auto auto auto auto!important;gap:0!important;\n  align-items:center!important;justify-content:stretch!important;padding:0!important;margin:0!important;\n  flex-shrink:0!important;overflow:visible!important;\n}\n[data-tp20-group] > [data-tp20-lead],\n[data-tp20-group] > [data-tp20-copy],\n[data-tp20-group] > [data-tp20-diagram],\n[data-tp20-group] > [data-tp20-caption] {\n  box-sizing:border-box!important;position:relative!important;inset:auto!important;transform:none!important;\n  width:100%!important;min-width:0!important;max-width:none!important;height:auto!important;\n  min-height:0!important;max-height:none!important;display:block!important;flex-shrink:0!important;\n  margin:0!important;padding:0!important;order:0!important;overflow:visible!important;\n}\n[data-tp20-group] > [data-tp20-lead] {grid-column:2 / 5!important;grid-row:1!important;text-align:center!important;padding-bottom:clamp(40px,5vw,72px)!important;font-size:clamp(18px,1.5vw,22px)!important;line-height:1.6!important;letter-spacing:.035em!important;}\n[data-tp20-group] > [data-tp20-copy] {grid-column:2!important;grid-row:2!important;text-align:left!important;font-size:16px!important;line-height:1.8!important;letter-spacing:.02em!important;}\n[data-tp20-group] > [data-tp20-diagram] {grid-column:4!important;grid-row:2!important;align-self:center!important;}\n[data-tp20-group] > [data-tp20-caption] {grid-column:4!important;grid-row:3!important;padding-top:16px!important;font-size:12px!important;line-height:1.5!important;text-align:left!important;letter-spacing:.01em!important;}\n[data-tp20-group] > [data-tp20-host] {grid-column:1 / -1!important;grid-row:4!important;width:100%!important;min-width:0!important;max-width:none!important;height:auto!important;min-height:0!important;max-height:none!important;position:relative!important;inset:auto!important;transform:none!important;margin-top:clamp(56px,7vw,100px)!important;order:0!important;}\n[data-tp20-group] [data-tp20-lead] p,\n[data-tp20-group] [data-tp20-copy] p,\n[data-tp20-group] [data-tp20-caption] p {\n  position:relative!important;inset:auto!important;transform:none!important;box-sizing:border-box!important;\n  width:auto!important;min-width:0!important;max-width:100%!important;height:auto!important;min-height:0!important;\n  margin:0!important;font-size:inherit!important;line-height:inherit!important;letter-spacing:inherit!important;\n  white-space:normal!important;word-break:keep-all!important;overflow-wrap:break-word!important;\n}\n[data-tp20-group] [data-tp20-copy] p:first-child {font-size:clamp(22px,1.8vw,28px)!important;line-height:1.5!important;letter-spacing:.025em!important;}\n[data-tp20-group] [data-tp20-copy] p:nth-child(2) {font-size:24px!important;line-height:1.5!important;margin-top:6px!important;}\n[data-tp20-group] [data-tp20-copy] p:nth-child(3) {font-size:14px!important;line-height:1.6!important;margin:2px 0 24px!important;}\n[data-tp20-group] [data-tp20-copy] span,\n[data-tp20-group] [data-tp20-lead] span,\n[data-tp20-group] [data-tp20-caption] span {font-size:inherit!important;line-height:inherit!important;letter-spacing:inherit!important;white-space:normal!important;word-break:keep-all!important;overflow-wrap:break-word!important;}\n[data-tp20-group] [data-tp20-copy] [data-tp20-empty] {display:none!important;}\n[data-tp20-group] [data-tp20-image-layer] {box-sizing:border-box!important;display:block!important;position:relative!important;inset:auto!important;transform:none!important;width:100%!important;min-width:0!important;max-width:none!important;height:auto!important;min-height:0!important;max-height:none!important;padding:0!important;margin:0!important;}\n[data-tp20-group] [data-tp20-image-frame] {aspect-ratio:663 / 581!important;}\n[data-tp20-group] [data-tp20-diagram] img[data-tp20-image] {box-sizing:border-box!important;display:block!important;position:absolute!important;inset:0!important;transform:none!important;width:100%!important;min-width:0!important;max-width:100%!important;height:100%!important;min-height:0!important;max-height:none!important;object-fit:contain!important;margin:0!important;}\n@media(max-width:799px) {\n  [data-tp20-group] {grid-template-columns:var(--tp20-gutter) minmax(0,1fr) var(--tp20-gutter)!important;grid-template-rows:auto auto auto auto auto!important;}\n  [data-tp20-group] > [data-tp20-lead] {grid-column:2!important;grid-row:1!important;text-align:left!important;padding-bottom:32px!important;}\n  [data-tp20-group] > [data-tp20-copy] {grid-column:2!important;grid-row:2!important;}\n  [data-tp20-group] > [data-tp20-diagram] {grid-column:2!important;grid-row:3!important;margin-top:32px!important;max-width:560px!important;justify-self:center!important;}\n  [data-tp20-group] > [data-tp20-caption] {grid-column:2!important;grid-row:4!important;max-width:560px!important;justify-self:center!important;}\n  [data-tp20-group] > [data-tp20-host] {grid-row:5!important;}\n}\n`;\n  const owned=new Map();let style=null,observer=null,raf=0,dead=false;\n  const normalize=value=>String(value||'').replace(/[\\s\\u200b-\\u200d]/g,'');\n  const exactImage=image=>[image.getAttribute('src'),image.getAttribute('srcset'),image.currentSrc].some(value=>/(?:^|[^a-f0-9])77031a29c81d3a07cd0fcea7245b5c692922a786(?:[^a-f0-9]|$)/i.test(value||''));\n  const visible=node=>{\n    if(!node?.isConnected||!node.getClientRects().length)return false;\n    for(let current=node;current&&current!==document.body;current=current.parentElement){\n      const css=getComputedStyle(current);if(css.display==='none'||css.visibility==='hidden')return false;\n    }\n    return true;\n  };\n  const mark=(node,key,eligible)=>{\n    const attribute='data-tp20-'+key;\n    if(!owned.has(node))owned.set(node,new Map());\n    const record=owned.get(node);if(!record.has(attribute))record.set(attribute,node.getAttribute(attribute));\n    if(!node.hasAttribute(attribute))node.setAttribute(attribute,'');eligible.add(node);\n  };\n  const restore=node=>{\n    const record=owned.get(node);if(!record)return;\n    for(const[key,value]of record)value===null?node.removeAttribute(key):node.setAttribute(key,value);\n    owned.delete(node);\n  };\n  function scan(){\n    raf=0;if(dead)return;const eligible=new Set();\n    for(const root of document.querySelectorAll('.laserable-renewal.le29-spatial')){\n      if(!visible(root))continue;\n      const nativeMain=root.parentElement?.closest('main');if(!nativeMain||nativeMain===root)continue;\n      for(let group=root.parentElement,depth=0;group&&group!==nativeMain&&depth<8;group=group.parentElement,depth++){\n        const children=[...group.children],host=children.find(child=>child.contains(root));\n        const copy=children.find(child=>!child.contains(root)&&normalize(child.textContent).startsWith('비침습적경두개근적외선광조사tPBM')&&normalize(child.textContent).includes('(Transcranial-Photo-Bio-Modulation)'));\n        const lead=children.find(child=>!child.contains(root)&&normalize(child.textContent).startsWith('브레인에이블이개발한레이저에이블은'));\n        const diagram=children.find(child=>!child.contains(root)&&[...child.querySelectorAll('img')].some(exactImage));\n        const caption=children.find(child=>!child.contains(root)&&normalize(child.textContent)==='*TranscranialPhoto-Bio-Modulation(t-PBM)Mechanism');\n        if(!copy||!lead||!diagram||!caption||!host||!host.classList.contains('tailwind'))continue;\n        mark(group,'group',eligible);mark(lead,'lead',eligible);mark(copy,'copy',eligible);\n        mark(diagram,'diagram',eligible);mark(caption,'caption',eligible);mark(host,'host',eligible);\n        for(const paragraph of copy.querySelectorAll('p'))if(!normalize(paragraph.textContent))mark(paragraph,'empty',eligible);\n        for(const image of diagram.querySelectorAll('img'))if(exactImage(image)){\n          mark(image,'image',eligible);mark(image.parentElement,'image-frame',eligible);\n          for(let layer=image.parentElement;layer&&layer!==diagram;layer=layer.parentElement)mark(layer,'image-layer',eligible);\n        }\n        break;\n      }\n    }\n    for(const node of [...owned.keys()])if(!eligible.has(node)||!node.isConnected)restore(node);\n  }\n  const schedule=()=>{if(!dead&&!raf)raf=requestAnimationFrame(scan);};\n  style=document.createElement('style');style.dataset.tp20Style='';style.textContent=CSS;document.head.append(style);\n  observer=new MutationObserver(schedule);observer.observe(document.body,{childList:true,subtree:true});\n  window.addEventListener('resize',schedule,{passive:true});window.addEventListener('popstate',schedule);\n  document.addEventListener('load',schedule,true);document.fonts?.ready.then(schedule);scan();\n  window[KEY]={\n    inspect:()=>({groups:document.querySelectorAll('[data-tp20-group]').length,owned:owned.size}),\n    dispose(){if(dead)return;dead=true;observer.disconnect();cancelAnimationFrame(raf);window.removeEventListener('resize',schedule);window.removeEventListener('popstate',schedule);document.removeEventListener('load',schedule,true);style.remove();for(const node of [...owned.keys()])restore(node);delete window[KEY];}\n  };\n})();\n\n;\n/* BRAINABLE production global: laserable-ending-cta-recovery */\n/* Final20 v4: center the native ending CTA, double its original visual interval, and remove only its preceding native bottom divider.\n * Restore only the copied native LASERABLE ending CTA when its link was lost.\n * Original public Figma nodes: Desktop 10:3445, Mobile 2148:3571.\n * Both navigate to /센터소개; original Mobile (<1280px) opens a new tab.\n * Existing semantic links/buttons and all code-component CTAs are untouched.\n */\n(function () {\n  'use strict';\n  if (window.__brainableEndingCTA31) return;\n  const HEADING = '지금 바로 브레인에이블과 상담해 보세요.';\n  const LABEL = '상담문의';\n  const DESTINATION = '/센터소개';\n  const EXCLUDE = 'nav,header,footer,.laserable-renewal,.le28-everyday,[data-nav30-kind],[data-cms30-pagination],[data-center30-card]';\n  const ACTION = 'a[href],button,[role=\"link\"],[role=\"button\"]';\n  const records = new Map();\n  const normalize = value => (value || '').replace(/\\s+/g, ' ').trim();\n  let observer, frame = 0, stopped = false;\n\n  const style = document.createElement('style');\n  style.setAttribute('data-cr31-style', '');\n  style.textContent = `\n    [data-cr31-anchor] {\n      position:relative!important;display:inline-flex!important;align-items:center!important;justify-content:center!important;\n      flex:0 0 auto!important;box-sizing:border-box!important;width:max-content!important;max-width:100%!important;\n      height:auto!important;min-width:114px!important;min-height:48px!important;max-height:none!important;\n      inset:auto!important;transform:none!important;translate:none!important;scale:none!important;rotate:none!important;\n      padding:12px 24px!important;margin:0!important;opacity:1!important;visibility:visible!important;\n      font-size:16px!important;font-weight:500!important;line-height:1.4!important;white-space:nowrap!important;\n      text-decoration:none!important;color:#fff!important;-webkit-text-fill-color:#fff!important;\n      background:#000;border-radius:999px;box-shadow:inset 0 0 0 1px #4c4c55;cursor:pointer!important;\n    }\n    [data-cr31-zone] {\n      display:flex!important;flex-direction:column!important;align-items:center!important;justify-content:center!important;\n      height:auto!important;min-height:var(--cr31-zone-height,0px)!important;max-height:none!important;flex-shrink:0!important;gap:24px!important;overflow:visible!important;align-self:center!important;text-align:center!important;\n    }\n    [data-cr31-heading], [data-cr31-heading] :is(p,h1,h2,h3,span) {\n      box-sizing:border-box!important;width:100%!important;min-width:0!important;max-width:100%!important;\n      height:auto!important;min-height:0!important;max-height:none!important;\n      white-space:normal!important;word-break:keep-all!important;overflow-wrap:normal!important;word-wrap:normal!important;text-wrap:balance!important;text-align:center!important;margin-inline:auto!important;\n    }\n    [data-cr31-anchor] [data-cr31-path] {\n      display:contents!important;position:static!important;inset:auto!important;\n      width:auto!important;height:auto!important;min-width:0!important;min-height:0!important;max-height:none!important;\n      margin:0!important;padding:0!important;transform:none!important;translate:none!important;scale:none!important;rotate:none!important;\n      opacity:1!important;visibility:visible!important;overflow:visible!important;\n      font-size:16px!important;font-weight:500!important;line-height:1.4!important;white-space:nowrap!important;\n      color:#fff!important;-webkit-text-fill-color:#fff!important;\n    }\n    [data-cr31-anchor] [data-cr31-fill] {display:none!important;background:transparent!important;}\n    [data-cr31-native-divider] {border-bottom-width:0!important;}\n    [data-cr31-flow], [data-cr31-page] {height:auto!important;min-height:0!important;max-height:none!important;flex-shrink:0!important;}\n    [data-cr31-anchor]:focus-visible {outline:2px solid #aebaff;outline-offset:4px;}\n  `;\n\n  function isProduct() {\n    let path;\n    try { path = decodeURIComponent(location.pathname).replace(/\\/+$/, '') || '/'; } catch (_) { return false; }\n    if (path === '/laserable') return true;\n    // Native Figma preview uses '/' for all pages; require the approved product body.\n    return path === '/' && !!document.querySelector('.laserable-renewal.le29-spatial');\n  }\n  function updateTarget(record) {\n    const mobile = window.matchMedia('(width < 1280px)').matches;\n    const target = mobile ? '_blank' : '_self';\n    if (record.anchor.getAttribute('target') !== target) record.anchor.setAttribute('target', target);\n    if (mobile) record.anchor.setAttribute('rel', 'noopener');\n    else record.anchor.removeAttribute('rel');\n  }\n  function mark(record, node, name) {\n    if (!record.attributes.some(item => item.node === node && item.name === name)) {\n      record.attributes.push({node, name, previous:node.getAttribute(name)});\n    }\n    node.setAttribute(name, '');\n  }\n\n  function isRendered(node, allowZeroHeight = false) {\n    if (!node?.isConnected || !node.getClientRects?.().length) return false;\n    const rect = node.getBoundingClientRect();\n    if (!(rect.width > 0 && (allowZeroHeight || rect.height > 0))) return false;\n    for (let current = node; current && current !== document.body; current = current.parentElement) {\n      const css = getComputedStyle(current);\n      if (css.display === 'none' || css.visibility === 'hidden' || css.visibility === 'collapse') return false;\n    }\n    return true;\n  }\n  const px = value => Number.parseFloat(value) || 0;\n  function updateLayout(record) {\n    if (typeof getComputedStyle !== 'function' || !isRendered(record.zone, true)) return;\n    const zone = record.zone, parent = zone.parentElement, nativeMain = zone.closest('main');\n    if (!parent || !nativeMain) return;\n    const branch = [...parent.children].find(node => node !== zone && node.querySelector('.laserable-renewal.le29-spatial'));\n    if (!branch) return;\n    const divider = [...branch.children].find(node => node.getAttribute('aria-hidden') === 'true' && !node.children.length && !normalize(node.textContent) &&\n      (node.hasAttribute('data-cr31-native-divider') || px(getComputedStyle(node).borderBottomWidth) > 0));\n    if (!divider || !isRendered(divider)) return;\n    const page = nativeMain.closest('[data-breakpoint-id]') || nativeMain.parentElement;\n    const footers = [...page.querySelectorAll('footer,[role=\"contentinfo\"]')]\n      .filter(node => !nativeMain.contains(node) && isRendered(node) && (zone.compareDocumentPosition(node) & Node.DOCUMENT_POSITION_FOLLOWING));\n    const footer = footers.sort((a,b) => a.getBoundingClientRect().top - b.getBoundingClientRect().top)[0];\n    if (!footer) return;\n    mark(record, divider, 'data-cr31-native-divider');\n    if (!record.zoneHeightStyle) record.zoneHeightStyle = {\n      value:zone.style.getPropertyValue('--cr31-zone-height'), priority:zone.style.getPropertyPriority('--cr31-zone-height'), hadStyle:zone.hasAttribute('style')\n    };\n    const beforeMeasure = zone.style.getPropertyValue('--cr31-zone-height');\n    const beforePriority = zone.style.getPropertyPriority('--cr31-zone-height');\n    const hadStyle = zone.hasAttribute('style');\n    const restoreMeasure = () => {\n      if (beforeMeasure) zone.style.setProperty('--cr31-zone-height', beforeMeasure, beforePriority);\n      else zone.style.removeProperty('--cr31-zone-height');\n      if (!hadStyle && !zone.style.length) zone.removeAttribute('style');\n    };\n    zone.style.setProperty('--cr31-zone-height', '0px');\n    // Unlock only this native CTA-to-MAIN chain before reading geometry. A taller\n    // code host can otherwise leave the fixed-height footer above the divider.\n    const path = [];\n    for (let node = parent, depth = 0; node && depth < 6; node = node.parentElement, depth++) {\n      path.push(node);\n      if (node === nativeMain) break;\n    }\n    if (path[path.length - 1] !== nativeMain) { restoreMeasure(); return; }\n    for (const node of path) mark(record, node, 'data-cr31-flow');\n    // The native product breakpoint root also has a fixed inline height plus\n    // overflow:clip. Let its relative children establish document scroll height;\n    // preserve its width, overflow, navigation, hero and absolute wordmark.\n    if (page.hasAttribute('data-breakpoint-id')) mark(record, page, 'data-cr31-page');\n    const natural = zone.getBoundingClientRect().height;\n    const parentStyle = getComputedStyle(parent);\n    const gap = px(parentStyle.rowGap || parentStyle.gap), padding = px(parentStyle.paddingBottom);\n    if (!(natural > 0)) { restoreMeasure(); return; }\n    // Public1772x1000 evidence establishes a minimum desktop baseline of418px.\n    // Never derive slack from footer geometry: breakpoint remounts can inherit an\n    // already-expanded footer, creating cumulative growth. Recompute solely from\n    // the current natural CTA height and authored surrounding gap/padding.\n    const desktopMinimum = window.matchMedia('(width >= 1280px)').matches ? 418 : 0;\n    const baseline = Math.max(natural + gap + padding, desktopMinimum);\n    const height = baseline * 2 - gap - padding;\n    record.writtenHeight = `${Math.round(height * 1000) / 1000}px`;\n    zone.style.setProperty('--cr31-zone-height', record.writtenHeight);\n    record.layout = {naturalHeight:natural, gap, paddingBottom:padding, desktopMinimum,\n      baselineInterval:baseline, requestedInterval:baseline * 2, zoneMinHeight:height};\n  }\n\n  function release(record) {\n    // Keep every original node (and any native listeners) when restoring structure.\n    if (record.anchor.parentNode && record.button.parentNode === record.anchor) {\n      record.anchor.replaceWith(record.button);\n    } else record.anchor.remove();\n    for (const item of record.attributes) {\n      if (item.previous === null) item.node.removeAttribute(item.name);\n      else item.node.setAttribute(item.name, item.previous);\n    }\n    for (const node of record.hidden) node.setAttribute('hidden', '');\n    if (record.zoneHeightStyle && record.zone.style.getPropertyValue('--cr31-zone-height') === record.writtenHeight) {\n      const saved = record.zoneHeightStyle;\n      if (saved.value) record.zone.style.setProperty('--cr31-zone-height', saved.value, saved.priority);\n      else record.zone.style.removeProperty('--cr31-zone-height');\n      if (!saved.hadStyle && !record.zone.style.length) record.zone.removeAttribute('style');\n    }\n    records.delete(record.button);\n  }\n  function candidates() {\n    const result = [];\n    // Find a minimal native section with exactly the original heading and CTA.\n    const headings = [...document.querySelectorAll('main p,main h1,main h2,main h3,main .textContents')]\n      .filter(node => normalize(node.textContent) === HEADING && !node.closest(EXCLUDE));\n    for (const heading of headings) {\n      let zone = heading.parentElement;\n      for (let depth = 0; zone && depth < 5; depth++, zone = zone.parentElement) {\n        if (zone.tagName === 'MAIN' || zone.closest(EXCLUDE)) break;\n        if (normalize(zone.textContent).replace(/\\s/g, '') !== (HEADING + LABEL).replace(/\\s/g, '')) continue;\n        const label = [...zone.querySelectorAll('p,span,.textContents')]\n          .find(node => normalize(node.textContent) === LABEL && !node.closest(EXCLUDE));\n        if (!label) break;\n        let button = label;\n        while (button.parentElement && button.parentElement !== zone && normalize(button.parentElement.textContent) === LABEL) button = button.parentElement;\n        // Any existing native semantic action is authoritative and never replaced.\n        if (!button.matches(ACTION) && !button.querySelector(ACTION) && !button.closest(ACTION) && !records.has(button)) {\n          result.push({zone, button, label, heading});\n        }\n        break;\n      }\n    }\n    return result.filter((item, index) => result.findIndex(other => other.button === item.button) === index);\n  }\n  function scan() {\n    frame = 0;\n    if (stopped) return;\n    const product = isProduct();\n    for (const record of [...records.values()]) {\n      if (!product || !record.anchor.isConnected || !record.button.isConnected || normalize(record.button.textContent) !== LABEL) release(record);\n      else updateTarget(record);\n    }\n    if (!product) return;\n    for (const candidate of candidates()) {\n      const {button, label, zone, heading} = candidate;\n      if (!button.parentNode) continue;\n      const anchor = document.createElement('a');\n      anchor.setAttribute('href', DESTINATION);\n      anchor.setAttribute('data-cr31-anchor', '');\n      const record = {button, label, zone, anchor, attributes:[], hidden:[]};\n      records.set(button, record);\n      updateTarget(record);\n      mark(record, zone, 'data-cr31-zone');\n      mark(record, heading, 'data-cr31-heading');\n      // Wrapper keeps original contents, styling, events, and layout classes intact.\n      button.before(anchor);\n      anchor.append(button);\n      const path = [button, ...button.querySelectorAll('*')].filter(node => normalize(node.textContent) === LABEL && node.getAttribute('aria-hidden') !== 'true');\n      for (const node of path) {\n        mark(record, node, 'data-cr31-path');\n        if (node.hasAttribute('hidden')) {record.hidden.push(node);node.removeAttribute('hidden');}\n      }\n      for (const node of button.querySelectorAll('[aria-hidden=\"true\"]')) {\n        if (!node.children.length) mark(record, node, 'data-cr31-fill');\n      }\n    }\n    for (const record of records.values()) updateLayout(record);\n  }\n  function schedule() {if (!stopped && !frame) frame = window.requestAnimationFrame(scan);}\n  function start() {\n    if (stopped) return;\n    document.head.append(style);\n    observer = new MutationObserver(changes => {\n      if (changes.some(change => change.type === 'childList' || change.type === 'characterData')) schedule();\n    });\n    observer.observe(document.body, {childList:true, characterData:true, subtree:true});\n    window.addEventListener('resize', schedule);\n    window.addEventListener('popstate', schedule);\n    document.addEventListener('load', schedule, true);\n    document.fonts?.ready.then(schedule);\n    scan();\n  }\n  window.__brainableEndingCTA31 = {\n    inspect: () => [...records.values()].map(record => ({\n      label:normalize(record.button.textContent), href:record.anchor.getAttribute('href'), target:record.anchor.getAttribute('target'),\n      connected:record.anchor.isConnected, originalNodePreserved:record.button.parentNode === record.anchor, layout:record.layout || null\n    })),\n    scan,\n    destroy() {\n      stopped = true;\n      observer?.disconnect();\n      if (frame) window.cancelAnimationFrame(frame);\n      document.removeEventListener('DOMContentLoaded', start);\n      window.removeEventListener('resize', schedule);\n      window.removeEventListener('popstate', schedule);\n      document.removeEventListener('load', schedule, true);\n      [...records.values()].forEach(release);\n      style.remove();\n      delete window.__brainableEndingCTA31;\n    }\n  };\n  if (document.readyState === 'loading') document.addEventListener('DOMContentLoaded', start, {once:true}); else start();\n})();\n\n;\n/* BRAINABLE production global: consultation-cta */\n(() => {\n  // cta-shiny-paint.css\n  var cta_shiny_paint_default = '/* The approved ShinyButton paint, adapted to leave native layout and border widths intact. */\\n@property --cta30-angle { syntax:\"<angle>\"; initial-value:0deg; inherits:false; }\\n@property --cta30-offset { syntax:\"<angle>\"; initial-value:0deg; inherits:true; }\\n@property --cta30-percent { syntax:\"<percentage>\"; initial-value:5%; inherits:true; }\\n@property --cta30-shine { syntax:\"<color>\"; initial-value:white; inherits:true; }\\n\\n[data-cta30-shiny] {\\n  isolation:isolate;\\n  overflow:hidden;\\n  border-radius:999px !important;\\n  background:#000 !important;\\n  color:#fff !important;\\n  box-shadow:inset 0 0 0 1px #1a1818 !important;\\n  outline-offset:4px;\\n  transition:--cta30-offset 800ms cubic-bezier(.25,1,.5,1),--cta30-percent 800ms cubic-bezier(.25,1,.5,1),--cta30-shine 800ms cubic-bezier(.25,1,.5,1);\\n}\\n[data-cta30-shiny] :where(p,span,a,[role=\"link\"]) {\\n  color:#fff !important;\\n  -webkit-text-fill-color:#fff !important;\\n}\\n[data-cta30-paint=\"fill\"] { background:transparent !important; }\\n\\n[data-cta30-shiny]::before,\\n[data-cta30-shiny]::after {\\n  content:\"\";\\n  position:absolute;\\n  pointer-events:none;\\n  z-index:-1;\\n}\\n[data-cta30-shiny]::before {\\n  inset:0;\\n  padding:1px;\\n  border-radius:inherit;\\n  background:conic-gradient(from calc(var(--cta30-angle) - var(--cta30-offset)),transparent,#0000ff var(--cta30-percent),var(--cta30-shine) calc(var(--cta30-percent) * 2),#0000ff calc(var(--cta30-percent) * 3),transparent calc(var(--cta30-percent) * 4));\\n  -webkit-mask:linear-gradient(#000 0 0) content-box,linear-gradient(#000 0 0);\\n  -webkit-mask-composite:xor;\\n  mask:linear-gradient(#000 0 0) content-box,linear-gradient(#000 0 0);\\n  mask-composite:exclude;\\n  animation:cta30-edge 3s linear infinite;\\n}\\n[data-cta30-shiny]::after {\\n  inset-inline-start:50%;\\n  inset-block-start:50%;\\n  width:100%;\\n  aspect-ratio:1;\\n  translate:-50% -50%;\\n  background:radial-gradient(circle at 2px 2px,#fff .5px,transparent 0) 0 0 / 4px 4px,linear-gradient(-50deg,transparent,#0000ff,transparent);\\n  -webkit-mask-image:radial-gradient(circle at bottom,transparent 40%,#000);\\n  mask-image:radial-gradient(circle at bottom,transparent 40%,#000);\\n  opacity:.6;\\n  animation:cta30-shimmer 3s linear infinite;\\n}\\n[data-cta30-shiny]:is(:hover,:focus-visible) {\\n  --cta30-percent:20%;\\n  --cta30-offset:95deg;\\n  --cta30-shine:#8484ff;\\n}\\n[data-cta30-shiny]:focus-visible { outline:2px solid #aebaff; }\\n@keyframes cta30-edge { to { --cta30-angle:360deg; } }\\n@keyframes cta30-shimmer { to { rotate:360deg; } }\\n@media(prefers-reduced-motion:reduce) {\\n  [data-cta30-shiny],[data-cta30-shiny]::before,[data-cta30-shiny]::after { animation:none !important; transition:none !important; }\\n  [data-cta30-shiny]::before { --cta30-angle:35deg; }\\n}\\n';\n\n  // cta-global-entry.js\n  var LABELS = /* @__PURE__ */ new Set([\"\\uC0C1\\uB2F4\\uBB38\\uC758\", \"CONTACTS\", \"\\uC81C\\uD488\\xB7\\uB3C4\\uC785 \\uC0C1\\uB2F4\"]);\n  var CONTROL = 'a,button,[role=\"link\"],[role=\"button\"]';\n  var EXCLUDE = \"nav,header,footer,[data-nav30-kind],[data-cms30-pagination],[data-center30-card]\";\n  var normalize = (text) => text.replace(/\\s+/g, \" \").trim();\n  var geometryKeys = [\"display\", \"position\", \"boxSizing\", \"width\", \"height\", \"padding\", \"margin\", \"borderTopWidth\", \"borderRightWidth\", \"borderBottomWidth\", \"borderLeftWidth\", \"fontSize\", \"fontWeight\", \"lineHeight\", \"letterSpacing\", \"transform\"];\n  function layout(node) {\n    const style = getComputedStyle(node);\n    return Object.fromEntries(geometryKeys.map((key) => [key, style[key]]));\n  }\n  function existingShiny(node) {\n    const paints = [getComputedStyle(node), getComputedStyle(node, \"::before\"), getComputedStyle(node, \"::after\")];\n    return !!node.closest(\".brainable-consult-cta,[data-shiny-button],[data-cta30-shiny]\") || /shiny/i.test(node.className) || paints.some((paint) => /brainable-cta|shiny/i.test(paint.animationName) || paint.backgroundImage.includes(\"conic-gradient\"));\n  }\n  function startConsultCTA(document2 = window.document) {\n    const window2 = document2.defaultView;\n    window2.__brainableCTA30?.destroy();\n    const style = document2.createElement(\"style\");\n    style.dataset.cta30Styles = \"\";\n    style.textContent = cta_shiny_paint_default;\n    document2.head.append(style);\n    const records = /* @__PURE__ */ new Map();\n    let frame = 0, destroyed = false;\n    function release(record) {\n      record.node.removeAttribute(\"data-cta30-shiny\");\n      record.fills.forEach((node) => node.removeAttribute(\"data-cta30-paint\"));\n      records.delete(record.node);\n    }\n    function scan() {\n      frame = 0;\n      if (destroyed) return;\n      for (const record of records.values()) if (!record.node.isConnected || !LABELS.has(normalize(record.node.textContent)) || record.node.closest(EXCLUDE)) release(record);\n      const matches = [...document2.querySelectorAll(CONTROL)].filter((node) => LABELS.has(normalize(node.textContent)) && !node.closest(EXCLUDE));\n      const outer = matches.filter((node) => !matches.some((parent) => parent !== node && parent.contains(node)));\n      for (const node of outer) {\n        if (records.has(node) || existingShiny(node)) continue;\n        const rect = node.getBoundingClientRect(), computed = getComputedStyle(node);\n        if (rect.width < 44 || rect.height < 28 || rect.width > 560 || rect.height > 180 || computed.position === \"static\") continue;\n        if ([\"::before\", \"::after\"].some((pseudo) => ![\"none\", \"normal\", '\"\"'].includes(getComputedStyle(node, pseudo).content))) continue;\n        const nodes = [node, ...node.querySelectorAll(\"*\")];\n        const snapshot = nodes.map((child) => ({ node: child, layout: layout(child), href: child.getAttribute(\"href\"), target: child.getAttribute(\"target\"), rel: child.getAttribute(\"rel\"), role: child.getAttribute(\"role\"), text: child.textContent, onclick: child.onclick }));\n        const children = [...node.childNodes];\n        const fills = [...node.children].filter((child) => child.getAttribute(\"aria-hidden\") === \"true\" && child.children.length === 0 && getComputedStyle(child).position === \"absolute\");\n        const record = { node, label: normalize(node.textContent), snapshot, children, fills };\n        records.set(node, record);\n        fills.forEach((fill) => fill.dataset.cta30Paint = \"fill\");\n        node.dataset.cta30Shiny = \"\";\n      }\n    }\n    const schedule = () => {\n      if (!frame && !destroyed) frame = window2.requestAnimationFrame(scan);\n    };\n    const observer = new MutationObserver((records2) => {\n      if (records2.some((record) => record.type === \"childList\")) schedule();\n    });\n    observer.observe(document2.body, { childList: true, subtree: true });\n    window2.addEventListener(\"resize\", schedule);\n    window2.addEventListener(\"popstate\", schedule);\n    const api = { inspect() {\n      return [...records.values()].map((record) => ({ label: record.label, connected: record.node.isConnected, descendantsUnchanged: record.children.length === record.node.childNodes.length && record.children.every((node, i) => node === record.node.childNodes[i]), contentAndActionsPreserved: record.snapshot.every((s) => s.node.textContent === s.text && s.node.getAttribute(\"href\") === s.href && s.node.getAttribute(\"target\") === s.target && s.node.getAttribute(\"rel\") === s.rel && s.node.getAttribute(\"role\") === s.role && s.node.onclick === s.onclick), geometryPreserved: record.snapshot.every((s) => JSON.stringify(layout(s.node)) === JSON.stringify(s.layout)) }));\n    }, destroy() {\n      destroyed = true;\n      observer.disconnect();\n      window2.removeEventListener(\"resize\", schedule);\n      window2.removeEventListener(\"popstate\", schedule);\n      if (frame) window2.cancelAnimationFrame(frame);\n      [...records.values()].forEach(release);\n      style.remove();\n      delete window2.__brainableCTA30;\n    } };\n    window2.__brainableCTA30 = api;\n    scan();\n    return api;\n  }\n  if (document.readyState === \"loading\") document.addEventListener(\"DOMContentLoaded\", () => startConsultCTA(), { once: true });\n  else startConsultCTA();\n})();\n\n/* BRAINABLE production global: vision-spiral */\n/*\nHextaUI Gradient Tracing adaptation.\nMIT License\n\nCopyright (c) 2025 Preet Suthar\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n*/\n/* Gradient Tracing adaptation from HextaUI, Copyright (c) 2025 Preet Suthar.\n * MIT license and pinned upstream source: ./reference/LICENSE.upstream.txt.\n * Only the /about_us VISION header is changed. Native text nodes are retained.\n */\n(function brainableVisionSpiral() {\n  'use strict';\n  const KEY = '__brainableVisionSpiral';\n  if (window[KEY]) return;\n  const statements = [\n    '우리는 모든 사람이 자신의 뇌를 최대한 활용할 수 있는 세상을 만들어갑니다.',\n    '브레인에이블은 단순한 뇌기능 개선을 넘어, 건강한 뇌를 기반으로 행복한 삶을 실현하는 것을 목표로 합니다.',\n    '유아부터 성인 그리고 노인에 이르기까지 각 생애주기에 따른 맞춤형 두뇌 기능 향상 솔루션을 제공하여 더 나은 삶으로 안내합니다.'\n  ];\n  const compact = s => s.replace(/\\s+/g, '');\n  const PATH = 'M100,100 m0,-75 a75,75 0 1,1 -0.1,0 z';\n  let current = null, raf = 0, started = 0, elapsed = 0, scanFrame = 0, dead = false;\n  let visible = true;\n  const motion = matchMedia('(prefers-reduced-motion: reduce)');\n  const style = document.createElement('style');\n  style.id = 'brainable-vision-spiral-style';\n  style.textContent = `\n    [data-bvs=\"hero\"]{box-sizing:border-box!important;position:relative!important;isolation:isolate;\n      width:100%!important;max-width:100%!important;height:auto!important;min-height:calc(100svh - var(--bvs-nav,80px))!important;\n      display:flex!important;align-items:center!important;background:#000000!important;overflow:clip!important;\n      padding:clamp(40px,7svh,100px) clamp(24px,7.5vw,140px)!important;}\n    [data-bvs=\"old-background\"]{display:none!important;}\n    [data-bvs=\"wrap\"]{box-sizing:border-box!important;position:relative!important;inset:auto!important;\n      width:100%!important;max-width:100%!important;min-width:0!important;height:auto!important;min-height:0!important;\n      padding:0!important;margin:0!important;display:block!important;flex:none!important;transform:none!important;}\n    [data-bvs=\"content\"]{position:relative!important;z-index:1!important;display:flex!important;flex-direction:column!important;\n      gap:clamp(30px,5.5svh,72px)!important;width:100%!important;max-width:1450px!important;min-width:0!important;\n      height:auto!important;min-height:0!important;margin:0 auto!important;padding:0!important;}\n    [data-bvs=\"title-wrap\"],[data-bvs=\"copy-wrap\"]{display:block!important;position:relative!important;\n      width:100%!important;max-width:100%!important;min-width:0!important;height:auto!important;min-height:0!important;\n      padding:0!important;margin:0!important;opacity:1!important;transform:none!important;flex:none!important;}\n    [data-bvs=\"title-wrap\"] p{margin:0!important;white-space:normal!important;font-size:clamp(36px,4.3vw,60px)!important;\n      line-height:1.15!important;letter-spacing:.1em!important;color:#fff!important;}\n    [data-bvs=\"copy-wrap\"] h1{box-sizing:border-box!important;display:block!important;width:auto!important;max-width:100%!important;\n      margin:0!important;white-space:normal!important;word-break:keep-all!important;overflow-wrap:break-word!important;\n      font-size:clamp(15px,1.25vw,20px)!important;line-height:1.75!important;letter-spacing:.035em!important;\n      color:#f2f3f8!important;text-wrap:pretty;text-shadow:0 1px 10px #000000;}\n    [data-bvs=\"copy-wrap\"] h1+h1{margin-top:.3em!important;}\n    [data-bvs=\"background\"]{position:absolute;inset:0;z-index:0;pointer-events:none;overflow:hidden;}\n    [data-bvs=\"background\"] svg{position:absolute;right:1%;top:50%;width:min(82svh,72vw);height:auto;aspect-ratio:1;\n      transform:translateY(-50%);opacity:.78;overflow:visible;}\n    @media(max-width:900px){\n      [data-bvs=\"hero\"]{padding:40px clamp(24px,6vw,64px)!important;}\n      [data-bvs=\"background\"] svg{right:0;width:min(100%,80svh);opacity:.54;}\n      [data-bvs=\"copy-wrap\"] h1{font-size:16px!important;line-height:1.75!important;}\n      [data-bvs=\"copy-wrap\"] h1+h1{margin-top:.6em!important;}\n    }\n    @media(max-width:480px){\n      [data-bvs=\"hero\"]{padding:32px 24px!important;}\n      [data-bvs=\"content\"]{gap:30px!important;}\n      [data-bvs=\"copy-wrap\"] h1{font-size:14px!important;line-height:1.7!important;letter-spacing:.015em!important;}\n      [data-bvs=\"background\"] svg{width:100%;opacity:.42;}\n    }\n    @media(max-height:500px) and (min-width:600px){\n      [data-bvs=\"hero\"]{padding:24px clamp(28px,6vw,80px)!important;}\n      [data-bvs=\"content\"]{gap:20px!important;}\n      [data-bvs=\"title-wrap\"] p{font-size:32px!important;}\n      [data-bvs=\"copy-wrap\"] h1{font-size:13.5px!important;line-height:1.55!important;letter-spacing:.02em!important;}\n      [data-bvs=\"copy-wrap\"] h1+h1{margin-top:.25em!important;}\n      [data-bvs=\"background\"] svg{width:min(75svh,50vw);opacity:.6;}\n    }\n  `;\n  document.head.appendChild(style);\n  function gradientAt(ms) {\n    if (!current) return;\n    const phase = (ms % 2000) / 2000;\n    current.gradient.setAttribute('x1', String(phase * 400));\n    current.gradient.setAttribute('x2', String(phase * 200));\n  }\n  function stop() {\n    if (raf) { cancelAnimationFrame(raf); raf = 0; elapsed += performance.now() - started; }\n  }\n  function tick(now) {\n    gradientAt(elapsed + now - started);\n    raf = requestAnimationFrame(tick);\n  }\n  function sync() {\n    if (!current || motion.matches || document.hidden || !visible) {\n      stop();\n      if (motion.matches) gradientAt(760);\n      return;\n    }\n    if (!raf) { started = performance.now(); raf = requestAnimationFrame(tick); }\n  }\n  const intersection = new IntersectionObserver(entries => {\n    const e = entries.find(e => e.target === current?.hero);\n    if (e) { visible = e.isIntersecting && e.intersectionRatio > .01; sync(); }\n  }, { threshold: [0, .01] });\n  function mark(el, value, records) {\n    records.push([el, el.getAttribute('data-bvs')]); el.setAttribute('data-bvs', value);\n  }\n  function clear() {\n    stop();\n    if (!current) return;\n    intersection.unobserve(current.hero);\n    current.background.remove();\n    if (current.oldNav) current.hero.style.setProperty('--bvs-nav', current.oldNav);\n    else current.hero.style.removeProperty('--bvs-nav');\n    current.records.forEach(([el, old]) => old === null ? el.removeAttribute('data-bvs') : el.setAttribute('data-bvs', old));\n    current = null;\n  }\n  function measureNav() {\n    if (!current) return;\n    const height = current.hero.getBoundingClientRect().top + window.scrollY;\n    current.hero.style.setProperty('--bvs-nav', `${height && height < 150 ? height : 80}px`);\n  }\n  function scan() {\n    scanFrame = 0;\n    if (dead) return;\n    if (!/^\\/about_us\\/?$/.test(location.pathname)) { clear(); return; }\n    const candidates = Array.from(document.querySelectorAll('header')).filter(h => {\n      const title = Array.from(h.querySelectorAll('p')).find(p => p.textContent.trim() === 'VISION');\n      const copy = Array.from(h.querySelectorAll('h1'));\n      return title && copy.length === 3 && copy.every((p,i) => compact(p.textContent) === compact(statements[i]));\n    });\n    if (candidates.length !== 1) { if (current && !candidates.includes(current.hero)) clear(); return; }\n    const hero = candidates[0];\n    if (current?.hero === hero) { measureNav(); return; }\n    clear();\n    const title = Array.from(hero.querySelectorAll('p')).find(p => p.textContent.trim() === 'VISION');\n    const titleWrap = title.parentElement;\n    const content = titleWrap.parentElement;\n    const copyWrap = hero.querySelector('h1').parentElement;\n    const oldBackground = hero.querySelector(':scope > [aria-hidden=\"true\"]');\n    if (!oldBackground || !content.contains(copyWrap)) return;\n    const records = [];\n    mark(hero,'hero',records); mark(oldBackground,'old-background',records);\n    mark(titleWrap,'title-wrap',records); mark(copyWrap,'copy-wrap',records); mark(content,'content',records);\n    for(let n=content.parentElement;n&&n!==hero;n=n.parentElement) mark(n,'wrap',records);\n    const background = document.createElement('div');\n    background.setAttribute('data-bvs','background'); background.setAttribute('aria-hidden','true');\n    background.innerHTML = `<svg viewBox=\"0 0 200 200\" fill=\"none\" preserveAspectRatio=\"xMidYMid meet\" focusable=\"false\">\n      <path d=\"${PATH}\" stroke=\"#7B68EE\" stroke-opacity=\".12\" stroke-width=\"1\"/>\n      <path d=\"${PATH}\" stroke=\"url(#brainable-vision-spiral-gradient)\" stroke-linecap=\"round\" stroke-width=\"2\"/>\n      <defs><linearGradient id=\"brainable-vision-spiral-gradient\" gradientUnits=\"userSpaceOnUse\" x1=\"152\" x2=\"76\">\n        <stop stop-color=\"#7B68EE\" stop-opacity=\"0\"/><stop stop-color=\"#7B68EE\"/>\n        <stop offset=\"1\" stop-color=\"#3498DB\" stop-opacity=\"0\"/>\n      </linearGradient></defs></svg>`;\n    hero.prepend(background);\n    current = { hero, records, background, oldNav:hero.style.getPropertyValue('--bvs-nav'), gradient:background.querySelector('linearGradient') };\n    elapsed = 760; visible = true;\n    measureNav(); intersection.observe(hero); sync();\n  }\n  function schedule() { if (!scanFrame && !dead) scanFrame = requestAnimationFrame(scan); }\n  const observer = new MutationObserver(records => {\n    if (records.some(r => !r.target.closest?.('[data-bvs=\"background\"]'))) schedule();\n  });\n  observer.observe(document.body,{ childList:true,subtree:true });\n  window.addEventListener('resize',schedule,{passive:true});\n  window.addEventListener('pageshow',schedule); window.addEventListener('popstate',schedule);\n  document.addEventListener('visibilitychange',sync); motion.addEventListener('change',sync);\n  window[KEY] = {\n    version:'vision-spiral-1',\n    inspect:()=>({matched:!!current,running:!!raf,reducedMotion:motion.matches,inViewport:visible,\n      originalTextRetained:current ? Array.from(current.hero.querySelectorAll('h1')).every((h,i)=>compact(h.textContent)===compact(statements[i])) : null,\n      path:PATH,duration:2000,colors:['#7B68EE','#7B68EE','#3498DB']}),\n    destroy(){dead=true;observer.disconnect();intersection.disconnect();if(scanFrame)cancelAnimationFrame(scanFrame);\n      window.removeEventListener('resize',schedule);window.removeEventListener('pageshow',schedule);window.removeEventListener('popstate',schedule);\n      document.removeEventListener('visibilitychange',sync);motion.removeEventListener('change',sync);clear();style.remove();delete window[KEY];}\n  };\n  scan();\n})();\n\n\n/* BRAINABLE production global: vision-wave */\n/* BRAINABLE statistics Blue Halftone, 2026-09-30.\n * Independent recreation of Gabriel Hochart's public Blue Halftone preview.\n * Public component implementation is access-controlled; no locked source used.\n * Palette and cursor swirl follow the public component description.\n * Native copy, counters and existing responsive Wave layout remain identical.\n */\n(function () {\n  'use strict';\n  if (window.__brainableVisionWave) window.__brainableVisionWave.destroy();\n  const CONFIG = Object.freeze({ effect: 'blue-halftone', palette: ['#3B82F6','#2563EB','#1D4ED8','#1E40AF','#1E3A8A'], backgroundColor: '#000000', maxFPS: 30, maxDPR: 1.5, cellSize: 12, speed: 0.22 });\n  const owned = 'data-brainable-vision-wave';\n  const compact = value => (value || '').replace(/\\s+/g, '');\n  const expected = {\n    first: '20+20년이상의지속적인연구개발',\n    second: '50+확장중인브레인에이블전국네트워크',\n    headline: '브레인에이블은지금도혁신하고발전중입니다.'\n  };\n  let current = null, dead = false, pending = false;\n  const mq = window.matchMedia('(prefers-reduced-motion: reduce)');\n  const stats = { frames: 0, drawTimeLast: 0, drawTimeMax: 0, totalDrawTime: 0, error: null };\n  function visible(el) { return !!el && el.isConnected && el.getClientRects().length > 0 && getComputedStyle(el).display !== 'none'; }\n  function originalText(el) {\n    if (!el) return '';\n    const clone = el.cloneNode(true);\n    clone.querySelectorAll('[data-brainable-counting-owned], [data-brainable-vision-counting-overlay], [aria-hidden=\"true\"]').forEach(n => n.remove());\n    return compact(clone.textContent);\n  }\n  function match() {\n    if (location.pathname.replace(/\\/+$/, '') !== '/about_us') return null;\n    const first = [...document.querySelectorAll('main section[aria-label=\"Statistic 1 about Jones and Brown\"]')].find(visible);\n    const second = [...document.querySelectorAll('main section[aria-label=\"Statistic 3 about Jones and Brown\"]')].find(visible);\n    if (!first || !second) return null;\n    // Counting overlays can temporarily alter the numeric text; lock on approved captions.\n    if (!compact(first.textContent).includes('20년이상의지속적인연구개발') || !compact(second.textContent).includes('확장중인브레인에이블전국네트워크')) return null;\n    let hero = first.parentElement;\n    while (hero && hero !== document.body) {\n      if (hero.tagName === 'SECTION' && hero.contains(second) && [...hero.querySelectorAll('video')].some(v => v.getAttribute('aria-label') === 'Statistics about John and Brown Legal')) break;\n      hero = hero.parentElement;\n    }\n    if (!hero || hero === document.body) return null;\n    const video = hero.querySelector('video[aria-label=\"Statistics about John and Brown Legal\"]');\n    const headline = [...hero.querySelectorAll('h1,h2,h3,p,div')].find(n => compact(n.textContent) === expected.headline);\n    if (!video || !headline) return null;\n    let content = first.parentElement;\n    while (content && content !== hero && !content.contains(headline)) content = content.parentElement;\n    if (!content || content === hero) return null;\n    return { hero, video, content, first, second, headline };\n  }\n  function makeHalftoneRenderer(canvas, state) {\n    let gl=null, program=null, buffer=null, uniforms=null, disposed=false, lost=false, fallback=null, ctx=null, w=1,h=1,dpr=1;\n    const mouse = [.5,.5];\n    const vertex = 'attribute vec2 aPosition;void main(){gl_Position=vec4(aPosition,0.0,1.0);}';\n    // Original implementation from the observed public preview appearance, not source extraction.\n    const fragment = `precision highp float;\n      uniform vec2 uResolution; uniform vec2 uMouse; uniform float uTime; uniform float uDpr;\n      float hash(vec2 p){return fract(sin(dot(p,vec2(127.1,311.7)))*43758.5453);}\n      vec3 palette(float a){\n        vec3 c0=vec3(59.,130.,246.)/255.;vec3 c1=vec3(37.,99.,235.)/255.;\n        vec3 c2=vec3(29.,78.,216.)/255.;vec3 c3=vec3(30.,64.,175.)/255.;vec3 c4=vec3(30.,58.,138.)/255.;\n        float k=clamp(a,0.,.999)*4.;\n        if(k<1.)return mix(c4,c3,k);if(k<2.)return mix(c3,c2,k-1.);if(k<3.)return mix(c2,c1,k-2.);return mix(c1,c0,k-3.);\n      }\n      void main(){\n        vec2 pixel=gl_FragCoord.xy/uDpr;\n        vec2 uv=pixel/uResolution;uv.y=1.-uv.y;\n        vec2 p=(uv-.5)*vec2(uResolution.x/uResolution.y,1.);\n        vec2 cursor=(uMouse-.5)*vec2(uResolution.x/uResolution.y,1.);\n        float dist=length(p-cursor);float swirl=exp(-dist*3.)*.26;\n        float angle=.11+sin(uTime*.16)*.025+swirl;\n        mat2 turn=mat2(cos(angle),-sin(angle),sin(angle),cos(angle));\n        vec2 q=turn*p;\n        q+=vec2(sin(q.y*3.2+uTime*.55),cos(q.x*2.6-uTime*.43))*.028;\n        float field=.5+.20*sin(q.x*4.6+uTime*.52)+.17*cos(q.y*5.1-uTime*.41)+.12*sin((q.x+q.y)*3.5+uTime*.30);\n        field=clamp(field,0.,1.);\n        vec2 cell=q*uResolution.y/12.;vec2 center=floor(cell)+.5;\n        float radius=.18+field*.15;\n        float dotShape=1.-smoothstep(radius-.045,radius+.035,length(fract(cell)-.5));\n        float vignette=1.-smoothstep(.30,1.05,length(p*vec2(.65,1.)));\n        float blueField=pow(field,1.65)*.17;\n        vec3 color=palette(field)*(blueField+dotShape*(.035+field*.075))*vignette;\n        float grain=(hash(pixel+floor(uTime*20.))-.5)*.026;\n        color=max(vec3(0.),color+grain*vec3(.42,.52,.70));\n        // A black edge joins the adjacent black sections without a rectangular seam.\n        float edge=smoothstep(0.,.07,uv.y)*smoothstep(0.,.07,1.-uv.y);\n        gl_FragColor=vec4(color*edge,1.);\n      }`;\n    function init(){\n      try {\n        gl=canvas.getContext('webgl',{alpha:false,antialias:false,depth:false,stencil:false,powerPreference:'low-power',preserveDrawingBuffer:false});\n        if(!gl) throw new Error('WebGL unavailable');\n        const compile=(type,source)=>{const s=gl.createShader(type);gl.shaderSource(s,source);gl.compileShader(s);if(!gl.getShaderParameter(s,gl.COMPILE_STATUS)){gl.deleteShader(s);throw new Error('Shader compile failed');}return s;};\n        const vs=compile(gl.VERTEX_SHADER,vertex),fs=compile(gl.FRAGMENT_SHADER,fragment);\n        program=gl.createProgram();gl.attachShader(program,vs);gl.attachShader(program,fs);gl.linkProgram(program);gl.deleteShader(vs);gl.deleteShader(fs);\n        if(!gl.getProgramParameter(program,gl.LINK_STATUS))throw new Error('Shader link failed');\n        buffer=gl.createBuffer();gl.bindBuffer(gl.ARRAY_BUFFER,buffer);gl.bufferData(gl.ARRAY_BUFFER,new Float32Array([-1,-1,1,-1,-1,1,-1,1,1,-1,1,1]),gl.STATIC_DRAW);\n        gl.useProgram(program);const pos=gl.getAttribLocation(program,'aPosition');gl.enableVertexAttribArray(pos);gl.vertexAttribPointer(pos,2,gl.FLOAT,false,0,0);\n        uniforms={resolution:gl.getUniformLocation(program,'uResolution'),mouse:gl.getUniformLocation(program,'uMouse'),time:gl.getUniformLocation(program,'uTime'),dpr:gl.getUniformLocation(program,'uDpr')};\n      }catch(error){showFallback();}\n    }\n    function showFallback(){\n      lost=true;canvas.style.visibility='hidden';\n      if(!fallback){fallback=document.createElement('canvas');fallback.setAttribute('aria-hidden','true');fallback.setAttribute('data-brainable-blue-halftone','static-fallback');fallback.style.cssText=canvas.style.cssText;fallback.style.visibility='visible';canvas.parentElement.insertBefore(fallback,canvas.nextSibling);ctx=fallback.getContext('2d',{alpha:false});}\n      staticFrame();\n    }\n    function staticFrame(){\n      if(!fallback||!ctx)return;\n      fallback.width=Math.round(w*dpr);fallback.height=Math.round(h*dpr);ctx.setTransform(dpr,0,0,dpr,0,0);ctx.fillStyle='#000';ctx.fillRect(0,0,w,h);\n      const g=ctx.createRadialGradient(w*.5,h*.5,0,w*.5,h*.5,Math.max(w,h)*.7);g.addColorStop(0,'#07142d');g.addColorStop(.65,'#020713');g.addColorStop(1,'#000');ctx.fillStyle=g;ctx.fillRect(0,0,w,h);\n      ctx.save();ctx.translate(w*.5,h*.5);ctx.rotate(.11);ctx.fillStyle='#123174';\n      for(let y=-h*.8;y<h*.8;y+=12)for(let x=-w*.8;x<w*.8;x+=12){const f=.5+.2*Math.sin(x/Math.max(h,1)*4.6)+.17*Math.cos(y/Math.max(h,1)*5.1);ctx.globalAlpha=Math.max(0,.1+.18*f);ctx.beginPath();ctx.arc(x,y,2.16+f*1.8,0,Math.PI*2);ctx.fill();}ctx.restore();ctx.globalAlpha=1;\n      const edge=ctx.createLinearGradient(0,0,0,h);edge.addColorStop(0,'#000');edge.addColorStop(.07,'#0000');edge.addColorStop(.93,'#0000');edge.addColorStop(1,'#000');ctx.fillStyle=edge;ctx.fillRect(0,0,w,h);\n    }\n    function onLost(event){event.preventDefault();if(disposed)return;showFallback();}\n    canvas.addEventListener('webglcontextlost',onLost);\n    init();\n    return {\n      kind:()=>lost?'static-fallback':'webgl',\n      pointer:(x,y)=>{mouse[0]=Math.max(0,Math.min(1,x));mouse[1]=Math.max(0,Math.min(1,y));},\n      resize:(width,height,ratio)=>{w=width;h=height;dpr=ratio;if(lost){staticFrame();return;}gl.viewport(0,0,canvas.width,canvas.height);},\n      draw:time=>{if(disposed)return;if(lost)return;gl.useProgram(program);gl.uniform2f(uniforms.resolution,w,h);gl.uniform2f(uniforms.mouse,mouse[0],mouse[1]);gl.uniform1f(uniforms.time,time);gl.uniform1f(uniforms.dpr,dpr);gl.drawArrays(gl.TRIANGLES,0,6);},\n      dispose:()=>{disposed=true;canvas.removeEventListener('webglcontextlost',onLost);if(fallback)fallback.remove();if(gl&&!lost){if(buffer)gl.deleteBuffer(buffer);if(program)gl.deleteProgram(program);const lose=gl.getExtension('WEBGL_lose_context');if(lose)lose.loseContext();}}\n    };\n  }\n\n  function create(target) {\n    const state = { ...target, canvas: document.createElement('canvas'), inView: false, w: 0, h: 0, dpr: 1,\n      points: [], raf: 0, lastDraw: 0, lastTick: 0, elapsed: 0, wasPlaying: !target.video.paused,\n      videoTime: target.video.currentTime, attributes: [], priorPosition: target.hero.style.position,\n      positionChanged: false, framePoints: 0, stopped: false };\n    const mark = (el, name) => {\n      state.attributes.push([el, owned, el.getAttribute(owned)]);\n      el.setAttribute(owned, name);\n    };\n    mark(state.hero, 'section'); mark(state.video, 'original-video'); mark(state.content, 'content');\n    mark(state.first.parentElement,'stat-row');\n    mark(state.first,'first'); mark(state.second,'second');\n    let headlineWrap=state.headline;\n    while(headlineWrap.parentElement!==state.content) headlineWrap=headlineWrap.parentElement;\n    mark(headlineWrap,'headline');\n    for(let n=state.content.parentElement;n&&n!==state.hero;n=n.parentElement) mark(n,'wrap');\n    [state.first,state.second].forEach(stat=>{\n      mark(stat.children[0],'number'); mark(stat.children[1],'caption');\n    });\n    if (getComputedStyle(state.hero).position === 'static') { state.hero.style.position = 'relative'; state.positionChanged = true; }\n    const canvas = state.canvas;\n    canvas.setAttribute(owned, 'canvas'); canvas.setAttribute('aria-hidden', 'true');\n    canvas.style.cssText = 'position:absolute;inset:0;width:100%;height:100%;display:block;pointer-events:none;z-index:0;';\n    state.hero.insertBefore(canvas, state.hero.firstChild);\n    const renderer = makeHalftoneRenderer(canvas, state);\n    state.renderer = renderer;\n    state.video.pause();\n    state.onPlay = () => state.video.pause();\n    state.video.addEventListener('play', state.onPlay);\n    function stop() { if (state.raf) cancelAnimationFrame(state.raf); state.raf = 0; state.lastTick = 0; }\n    function draw() {\n      if (!state.w || !state.h || state.stopped) return;\n      const start = performance.now();\n      renderer.draw(state.elapsed);\n      state.framePoints = 0;\n      const cost = performance.now() - start;\n      stats.frames++; stats.drawTimeLast = cost; stats.drawTimeMax = Math.max(stats.drawTimeMax, cost); stats.totalDrawTime += cost;\n    }\n    function tick(now) {\n      state.raf = 0;\n      if (state.stopped || !state.inView || document.hidden || mq.matches) { state.lastTick = 0; return; }\n      if (state.lastTick) state.elapsed += Math.min(0.1, (now - state.lastTick) / 1000);\n      state.lastTick = now;\n      if (now - state.lastDraw >= 1000 / CONFIG.maxFPS - 0.5) { state.lastDraw = now; draw(); }\n      state.raf = requestAnimationFrame(tick);\n    }\n    function sync() {\n      if (state.stopped) return;\n      if (!state.inView || document.hidden || mq.matches) { stop(); if (mq.matches) draw(); }\n      else if (!state.raf) { state.lastDraw = 0; state.raf = requestAnimationFrame(tick); }\n    }\n    function resize() {\n      if (state.stopped) return;\n      const rect = state.hero.getBoundingClientRect();\n      const w = Math.max(1, Math.round(rect.width)), h = Math.max(1, Math.round(rect.height));\n      const dpr = Math.min(CONFIG.maxDPR, window.devicePixelRatio || 1);\n      if (w === state.w && h === state.h && dpr === state.dpr) return;\n      state.w = w; state.h = h; state.dpr = dpr;\n      canvas.width = Math.round(w * dpr); canvas.height = Math.round(h * dpr);\n      renderer.resize(w, h, dpr);\n      draw(); sync();\n    }\n    state.io = new IntersectionObserver(entries => { state.inView = entries[0].isIntersecting && entries[0].intersectionRatio > .01; sync(); }, { threshold: [0,.01] });\n    state.io.observe(state.hero);\n    state.ro = new ResizeObserver(resize); state.ro.observe(state.hero);\n    state.sync = sync; state.resize = resize;\n    state.onPointer = event => { const r=state.hero.getBoundingClientRect(); renderer.pointer((event.clientX-r.left)/r.width,(event.clientY-r.top)/r.height); };\n    state.onLeave = () => renderer.pointer(.5,.5);\n    state.hero.addEventListener('pointermove',state.onPointer,{passive:true}); state.hero.addEventListener('pointerleave',state.onLeave,{passive:true});\n    state.dispose = function () {\n      state.stopped = true; stop(); state.io.disconnect(); state.ro.disconnect();\n      state.hero.removeEventListener('pointermove',state.onPointer); state.hero.removeEventListener('pointerleave',state.onLeave);\n      state.video.removeEventListener('play', state.onPlay); renderer.dispose(); canvas.remove();\n      for (const [el, name, before] of state.attributes) { if (before === null) el.removeAttribute(name); else el.setAttribute(name, before); }\n      if (state.positionChanged) state.hero.style.position = state.priorPosition;\n      if (state.wasPlaying && state.video.isConnected && !document.hidden) state.video.play().catch(() => {});\n    };\n    resize();\n    return state;\n  }\n  const style = document.createElement('style');\n  style.setAttribute(owned, 'style');\n  style.textContent = `\n    [data-brainable-vision-wave=\"section\"]{box-sizing:border-box!important;background:#000!important;isolation:isolate;\n      width:100%!important;max-width:100%!important;height:auto!important;min-height:100svh!important;\n      padding:clamp(40px,7svh,100px) clamp(24px,7vw,130px)!important;display:flex!important;align-items:center!important;overflow:clip!important;}\n    [data-brainable-vision-wave=\"original-video\"]{display:none!important;}\n    [data-brainable-vision-wave=\"wrap\"]{width:100%!important;height:auto!important;min-width:0!important;padding:0!important;display:block!important;}\n    [data-brainable-vision-wave=\"content\"]{position:relative!important;inset:auto!important;z-index:1;display:grid!important;\n      grid-template-columns:minmax(0,1fr) minmax(0,2fr) minmax(0,1fr)!important;align-items:center!important;gap:28px!important;\n      width:100%!important;max-width:1540px!important;height:auto!important;min-width:0!important;margin:0 auto!important;padding:0!important;}\n    [data-brainable-vision-wave=\"stat-row\"]{display:contents!important;}\n    [data-brainable-vision-wave=\"headline\"]{grid-column:2;grid-row:1;position:relative!important;inset:auto!important;\n      transform:none!important;width:auto!important;max-width:100%!important;height:auto!important;min-width:0!important;\n      text-align:center!important;font-size:clamp(18px,1.8vw,28px)!important;line-height:1.6!important;letter-spacing:.02em!important;}\n    [data-brainable-vision-wave=\"headline\"] p,[data-brainable-vision-wave=\"headline\"] span{font-size:inherit!important;line-height:inherit!important;white-space:normal!important;word-break:keep-all!important;overflow-wrap:break-word!important;}\n    [data-brainable-vision-wave=\"first\"],[data-brainable-vision-wave=\"second\"]{grid-row:1;position:relative!important;inset:auto!important;\n      transform:none!important;width:100%!important;max-width:100%!important;min-width:0!important;height:auto!important;\n      display:flex!important;flex-direction:column!important;align-items:center!important;align-self:start!important;gap:36px!important;padding:0!important;}\n    [data-brainable-vision-wave=\"first\"]{grid-column:1;}\n    [data-brainable-vision-wave=\"second\"]{grid-column:3;}\n    [data-brainable-vision-wave=\"number\"]{font-size:clamp(80px,8.5vw,144px)!important;line-height:1.08!important;\n      width:2.15ch!important;max-width:100%!important;height:2.16em!important;min-height:0!important;margin:0!important;\n      position:relative!important;inset:auto!important;text-align:center!important;display:block!important;white-space:normal!important;overflow-wrap:anywhere!important;letter-spacing:0!important;}\n    [data-brainable-vision-wave=\"number\"] p,[data-brainable-vision-wave=\"number\"] span{font-size:inherit!important;line-height:inherit!important;letter-spacing:0!important;}\n    [data-brainable-vision-wave=\"caption\"]{position:relative!important;inset:auto!important;width:100%!important;max-width:100%!important;\n      height:auto!important;min-height:0!important;display:block!important;text-align:center!important;font-size:clamp(13px,1.25vw,20px)!important;line-height:1.65!important;}\n    [data-brainable-vision-wave=\"caption\"] p,[data-brainable-vision-wave=\"caption\"] span{font-size:inherit!important;line-height:inherit!important;\n      margin:0!important;white-space:normal!important;word-break:keep-all!important;overflow-wrap:break-word!important;letter-spacing:.025em!important;}\n    @media(max-width:900px){\n      [data-brainable-vision-wave=\"content\"]{grid-template-columns:repeat(2,minmax(0,1fr))!important;gap:36px 24px!important;}\n      [data-brainable-vision-wave=\"headline\"]{grid-column:1/-1;grid-row:1;font-size:clamp(18px,3vw,24px)!important;}\n      [data-brainable-vision-wave=\"first\"],[data-brainable-vision-wave=\"second\"]{grid-row:2;gap:22px!important;}\n      [data-brainable-vision-wave=\"second\"]{grid-column:2;}\n      [data-brainable-vision-wave=\"number\"]{font-size:clamp(64px,11vw,104px)!important;}\n    }\n    @media(max-height:500px) and (min-width:600px){\n      [data-brainable-vision-wave=\"section\"]{padding:24px 40px!important;}\n      [data-brainable-vision-wave=\"content\"]{grid-template-columns:minmax(0,1fr) minmax(0,2fr) minmax(0,1fr)!important;gap:24px!important;}\n      [data-brainable-vision-wave=\"headline\"]{grid-column:2;grid-row:1;font-size:18px!important;}\n      [data-brainable-vision-wave=\"first\"],[data-brainable-vision-wave=\"second\"]{grid-row:1;gap:18px!important;}\n      [data-brainable-vision-wave=\"second\"]{grid-column:3;}\n      [data-brainable-vision-wave=\"number\"]{font-size:60px!important;}\n    }\n  `;\n  document.head.appendChild(style);\n  function rescan() {\n    pending = false;\n    if (dead) return;\n    try {\n      const next = match();\n      if (current && next && current.hero === next.hero && current.video === next.video && current.content === next.content) { current.resize(); return; }\n      if (current) { current.dispose(); current = null; }\n      if (next) current = create(next);\n    } catch (error) { stats.error = String(error); }\n  }\n  function schedule() { if (!pending && !dead) { pending = true; requestAnimationFrame(rescan); } }\n  const mo = new MutationObserver(records => {\n    const relevant = records.some(record => [...record.addedNodes, ...record.removedNodes].some(node => {\n      if (node.nodeType !== 1) return false;\n      if (node.hasAttribute(owned) || node.closest('[' + owned + '=\"canvas\"]')) return false;\n      // Ignore counter overlays, but retain native breakpoint tree replacements.\n      const attrs = [...node.attributes].map(a => a.name).join(' ');\n      return !/brainable.*(count|overlay)/.test(attrs);\n    }));\n    if (relevant) schedule();\n  });\n  mo.observe(document.documentElement, { childList: true, subtree: true });\n  const visibility = () => current && current.sync();\n  document.addEventListener('visibilitychange', visibility);\n  mq.addEventListener('change', visibility);\n  window.addEventListener('resize', schedule); window.addEventListener('pageshow', schedule); window.addEventListener('popstate', schedule);\n  window.__brainableVisionWave = {\n    inspect: () => ({ active: !!current, state: !current ? 'unmatched' : mq.matches ? 'reduced-motion' : document.hidden ? 'hidden' : current.inView ? 'running' : 'offscreen',\n      config: CONFIG, renderer: current ? current.renderer.kind() : null, color: CONFIG.palette[0], palette: CONFIG.palette, background: CONFIG.backgroundColor, frames: stats.frames,\n      width: current ? current.w : 0, height: current ? current.h : 0, dpr: current ? current.dpr : 0,\n      sampledPoints: current ? current.points.length : 0, paintedPoints: current ? current.framePoints : 0,\n      elapsed: current ? current.elapsed : 0, renderCost: { lastMs: stats.drawTimeLast, maxMs: stats.drawTimeMax, meanMs: stats.frames ? stats.totalDrawTime / stats.frames : 0 }, error: stats.error }),\n    refresh: schedule,\n    destroy: () => { if (dead) return; dead = true; mo.disconnect(); if (current) current.dispose(); current = null; style.remove();\n      document.removeEventListener('visibilitychange', visibility); mq.removeEventListener('change', visibility);\n      window.removeEventListener('resize', schedule); window.removeEventListener('pageshow', schedule); window.removeEventListener('popstate', schedule);\n      delete window.__brainableVisionWave; delete window.__brainableBlueHalftone; }\n  };\n  window.__brainableBlueHalftone = window.__brainableVisionWave;\n  rescan();\n})();\n\n\n/* BRAINABLE production global: innovation-flux */\n/* Flux Vortex author license:\nMIT License\n\nCopyright (c) 2026 Meng To\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n\nThree.js runtime license:\nThe MIT License\n\nCopyright © 2010-2023 three.js authors\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n\n*/\n(()=>{/**\n * @license\n * Copyright 2010-2023 Three.js Authors\n * SPDX-License-Identifier: MIT\n */var xl=0,_a=1,vl=2;var Xo=1,yl=2,tn=3,gn=0,we=1,nn=2;var Ye=0,ni=1,_n=2,xa=3,va=4,Ml=5,Cn=100,Sl=101,bl=102,ya=103,Ma=104,El=200,wl=201,Tl=202,Al=203,Sr=204,br=205,Cl=206,Rl=207,Pl=208,Ll=209,Il=210,Ul=211,Dl=212,Nl=213,Fl=214,Ol=0,Bl=1,zl=2,ls=3,Vl=4,kl=5,Hl=6,Gl=7,qo=0,Wl=1,Xl=2,pn=0,ql=1,Yl=2,Zl=3,sa=4,Jl=5,$l=6;var Yo=300,ri=301,ai=302,Er=303,wr=304,Is=306,Tr=1e3,ze=1001,Ar=1002,xe=1003,Sa=1004;var Ws=1005;var Ue=1006,Kl=1007;var Ei=1008;var mn=1009,Ql=1010,jl=1011,ra=1012,Zo=1013,un=1014,dn=1015,ke=1016,Jo=1017,$o=1018,Pn=1020,tc=1021,Ve=1023,ec=1024,nc=1025,Ln=1026,oi=1027,ic=1028,Ko=1029,sc=1030,Qo=1031,jo=1033,Xs=33776,qs=33777,Ys=33778,Zs=33779,ba=35840,Ea=35841,wa=35842,Ta=35843,tl=36196,Aa=37492,Ca=37496,Ra=37808,Pa=37809,La=37810,Ia=37811,Ua=37812,Da=37813,Na=37814,Fa=37815,Oa=37816,Ba=37817,za=37818,Va=37819,ka=37820,Ha=37821,Js=36492,Ga=36494,Wa=36495,rc=36283,Xa=36284,qa=36285,Ya=36286;var cs=2300,hs=2301,$s=2302,Za=2400,Ja=2401,$a=2402;var el=3e3,In=3001,ac=3200,oc=3201,lc=0,cc=1,De=\"\",ce=\"srgb\",rn=\"srgb-linear\",aa=\"display-p3\",Us=\"display-p3-linear\",us=\"linear\",Jt=\"srgb\",ds=\"rec709\",fs=\"p3\";var On=7680;var Ka=519,hc=512,uc=513,dc=514,nl=515,fc=516,pc=517,mc=518,gc=519,Qa=35044;var ja=\"300 es\",Cr=1035,sn=2e3,ps=2001,xn=class{addEventListener(t,e){this._listeners===void 0&&(this._listeners={});let n=this._listeners;n[t]===void 0&&(n[t]=[]),n[t].indexOf(e)===-1&&n[t].push(e)}hasEventListener(t,e){if(this._listeners===void 0)return!1;let n=this._listeners;return n[t]!==void 0&&n[t].indexOf(e)!==-1}removeEventListener(t,e){if(this._listeners===void 0)return;let s=this._listeners[t];if(s!==void 0){let r=s.indexOf(e);r!==-1&&s.splice(r,1)}}dispatchEvent(t){if(this._listeners===void 0)return;let n=this._listeners[t.type];if(n!==void 0){t.target=this;let s=n.slice(0);for(let r=0,o=s.length;r<o;r++)s[r].call(this,t);t.target=null}}},fe=[\"00\",\"01\",\"02\",\"03\",\"04\",\"05\",\"06\",\"07\",\"08\",\"09\",\"0a\",\"0b\",\"0c\",\"0d\",\"0e\",\"0f\",\"10\",\"11\",\"12\",\"13\",\"14\",\"15\",\"16\",\"17\",\"18\",\"19\",\"1a\",\"1b\",\"1c\",\"1d\",\"1e\",\"1f\",\"20\",\"21\",\"22\",\"23\",\"24\",\"25\",\"26\",\"27\",\"28\",\"29\",\"2a\",\"2b\",\"2c\",\"2d\",\"2e\",\"2f\",\"30\",\"31\",\"32\",\"33\",\"34\",\"35\",\"36\",\"37\",\"38\",\"39\",\"3a\",\"3b\",\"3c\",\"3d\",\"3e\",\"3f\",\"40\",\"41\",\"42\",\"43\",\"44\",\"45\",\"46\",\"47\",\"48\",\"49\",\"4a\",\"4b\",\"4c\",\"4d\",\"4e\",\"4f\",\"50\",\"51\",\"52\",\"53\",\"54\",\"55\",\"56\",\"57\",\"58\",\"59\",\"5a\",\"5b\",\"5c\",\"5d\",\"5e\",\"5f\",\"60\",\"61\",\"62\",\"63\",\"64\",\"65\",\"66\",\"67\",\"68\",\"69\",\"6a\",\"6b\",\"6c\",\"6d\",\"6e\",\"6f\",\"70\",\"71\",\"72\",\"73\",\"74\",\"75\",\"76\",\"77\",\"78\",\"79\",\"7a\",\"7b\",\"7c\",\"7d\",\"7e\",\"7f\",\"80\",\"81\",\"82\",\"83\",\"84\",\"85\",\"86\",\"87\",\"88\",\"89\",\"8a\",\"8b\",\"8c\",\"8d\",\"8e\",\"8f\",\"90\",\"91\",\"92\",\"93\",\"94\",\"95\",\"96\",\"97\",\"98\",\"99\",\"9a\",\"9b\",\"9c\",\"9d\",\"9e\",\"9f\",\"a0\",\"a1\",\"a2\",\"a3\",\"a4\",\"a5\",\"a6\",\"a7\",\"a8\",\"a9\",\"aa\",\"ab\",\"ac\",\"ad\",\"ae\",\"af\",\"b0\",\"b1\",\"b2\",\"b3\",\"b4\",\"b5\",\"b6\",\"b7\",\"b8\",\"b9\",\"ba\",\"bb\",\"bc\",\"bd\",\"be\",\"bf\",\"c0\",\"c1\",\"c2\",\"c3\",\"c4\",\"c5\",\"c6\",\"c7\",\"c8\",\"c9\",\"ca\",\"cb\",\"cc\",\"cd\",\"ce\",\"cf\",\"d0\",\"d1\",\"d2\",\"d3\",\"d4\",\"d5\",\"d6\",\"d7\",\"d8\",\"d9\",\"da\",\"db\",\"dc\",\"dd\",\"de\",\"df\",\"e0\",\"e1\",\"e2\",\"e3\",\"e4\",\"e5\",\"e6\",\"e7\",\"e8\",\"e9\",\"ea\",\"eb\",\"ec\",\"ed\",\"ee\",\"ef\",\"f0\",\"f1\",\"f2\",\"f3\",\"f4\",\"f5\",\"f6\",\"f7\",\"f8\",\"f9\",\"fa\",\"fb\",\"fc\",\"fd\",\"fe\",\"ff\"];var Ks=Math.PI/180,Rr=180/Math.PI;function Ii(){let i=Math.random()*4294967295|0,t=Math.random()*4294967295|0,e=Math.random()*4294967295|0,n=Math.random()*4294967295|0;return(fe[i&255]+fe[i>>8&255]+fe[i>>16&255]+fe[i>>24&255]+\"-\"+fe[t&255]+fe[t>>8&255]+\"-\"+fe[t>>16&15|64]+fe[t>>24&255]+\"-\"+fe[e&63|128]+fe[e>>8&255]+\"-\"+fe[e>>16&255]+fe[e>>24&255]+fe[n&255]+fe[n>>8&255]+fe[n>>16&255]+fe[n>>24&255]).toLowerCase()}function Ee(i,t,e){return Math.max(t,Math.min(e,i))}function _c(i,t){return(i%t+t)%t}function Qs(i,t,e){return(1-e)*i+e*t}function to(i){return(i&i-1)===0&&i!==0}function Pr(i){return Math.pow(2,Math.floor(Math.log(i)/Math.LN2))}function _i(i,t){switch(t.constructor){case Float32Array:return i;case Uint32Array:return i/4294967295;case Uint16Array:return i/65535;case Uint8Array:return i/255;case Int32Array:return Math.max(i/2147483647,-1);case Int16Array:return Math.max(i/32767,-1);case Int8Array:return Math.max(i/127,-1);default:throw new Error(\"Invalid component type.\")}}function be(i,t){switch(t.constructor){case Float32Array:return i;case Uint32Array:return Math.round(i*4294967295);case Uint16Array:return Math.round(i*65535);case Uint8Array:return Math.round(i*255);case Int32Array:return Math.round(i*2147483647);case Int16Array:return Math.round(i*32767);case Int8Array:return Math.round(i*127);default:throw new Error(\"Invalid component type.\")}}var Lt=class i{constructor(t=0,e=0){i.prototype.isVector2=!0,this.x=t,this.y=e}get width(){return this.x}set width(t){this.x=t}get height(){return this.y}set height(t){this.y=t}set(t,e){return this.x=t,this.y=e,this}setScalar(t){return this.x=t,this.y=t,this}setX(t){return this.x=t,this}setY(t){return this.y=t,this}setComponent(t,e){switch(t){case 0:this.x=e;break;case 1:this.y=e;break;default:throw new Error(\"index is out of range: \"+t)}return this}getComponent(t){switch(t){case 0:return this.x;case 1:return this.y;default:throw new Error(\"index is out of range: \"+t)}}clone(){return new this.constructor(this.x,this.y)}copy(t){return this.x=t.x,this.y=t.y,this}add(t){return this.x+=t.x,this.y+=t.y,this}addScalar(t){return this.x+=t,this.y+=t,this}addVectors(t,e){return this.x=t.x+e.x,this.y=t.y+e.y,this}addScaledVector(t,e){return this.x+=t.x*e,this.y+=t.y*e,this}sub(t){return this.x-=t.x,this.y-=t.y,this}subScalar(t){return this.x-=t,this.y-=t,this}subVectors(t,e){return this.x=t.x-e.x,this.y=t.y-e.y,this}multiply(t){return this.x*=t.x,this.y*=t.y,this}multiplyScalar(t){return this.x*=t,this.y*=t,this}divide(t){return this.x/=t.x,this.y/=t.y,this}divideScalar(t){return this.multiplyScalar(1/t)}applyMatrix3(t){let e=this.x,n=this.y,s=t.elements;return this.x=s[0]*e+s[3]*n+s[6],this.y=s[1]*e+s[4]*n+s[7],this}min(t){return this.x=Math.min(this.x,t.x),this.y=Math.min(this.y,t.y),this}max(t){return this.x=Math.max(this.x,t.x),this.y=Math.max(this.y,t.y),this}clamp(t,e){return this.x=Math.max(t.x,Math.min(e.x,this.x)),this.y=Math.max(t.y,Math.min(e.y,this.y)),this}clampScalar(t,e){return this.x=Math.max(t,Math.min(e,this.x)),this.y=Math.max(t,Math.min(e,this.y)),this}clampLength(t,e){let n=this.length();return this.divideScalar(n||1).multiplyScalar(Math.max(t,Math.min(e,n)))}floor(){return this.x=Math.floor(this.x),this.y=Math.floor(this.y),this}ceil(){return this.x=Math.ceil(this.x),this.y=Math.ceil(this.y),this}round(){return this.x=Math.round(this.x),this.y=Math.round(this.y),this}roundToZero(){return this.x=Math.trunc(this.x),this.y=Math.trunc(this.y),this}negate(){return this.x=-this.x,this.y=-this.y,this}dot(t){return this.x*t.x+this.y*t.y}cross(t){return this.x*t.y-this.y*t.x}lengthSq(){return this.x*this.x+this.y*this.y}length(){return Math.sqrt(this.x*this.x+this.y*this.y)}manhattanLength(){return Math.abs(this.x)+Math.abs(this.y)}normalize(){return this.divideScalar(this.length()||1)}angle(){return Math.atan2(-this.y,-this.x)+Math.PI}angleTo(t){let e=Math.sqrt(this.lengthSq()*t.lengthSq());if(e===0)return Math.PI/2;let n=this.dot(t)/e;return Math.acos(Ee(n,-1,1))}distanceTo(t){return Math.sqrt(this.distanceToSquared(t))}distanceToSquared(t){let e=this.x-t.x,n=this.y-t.y;return e*e+n*n}manhattanDistanceTo(t){return Math.abs(this.x-t.x)+Math.abs(this.y-t.y)}setLength(t){return this.normalize().multiplyScalar(t)}lerp(t,e){return this.x+=(t.x-this.x)*e,this.y+=(t.y-this.y)*e,this}lerpVectors(t,e,n){return this.x=t.x+(e.x-t.x)*n,this.y=t.y+(e.y-t.y)*n,this}equals(t){return t.x===this.x&&t.y===this.y}fromArray(t,e=0){return this.x=t[e],this.y=t[e+1],this}toArray(t=[],e=0){return t[e]=this.x,t[e+1]=this.y,t}fromBufferAttribute(t,e){return this.x=t.getX(e),this.y=t.getY(e),this}rotateAround(t,e){let n=Math.cos(e),s=Math.sin(e),r=this.x-t.x,o=this.y-t.y;return this.x=r*n-o*s+t.x,this.y=r*s+o*n+t.y,this}random(){return this.x=Math.random(),this.y=Math.random(),this}*[Symbol.iterator](){yield this.x,yield this.y}},zt=class i{constructor(t,e,n,s,r,o,a,l,c){i.prototype.isMatrix3=!0,this.elements=[1,0,0,0,1,0,0,0,1],t!==void 0&&this.set(t,e,n,s,r,o,a,l,c)}set(t,e,n,s,r,o,a,l,c){let h=this.elements;return h[0]=t,h[1]=s,h[2]=a,h[3]=e,h[4]=r,h[5]=l,h[6]=n,h[7]=o,h[8]=c,this}identity(){return this.set(1,0,0,0,1,0,0,0,1),this}copy(t){let e=this.elements,n=t.elements;return e[0]=n[0],e[1]=n[1],e[2]=n[2],e[3]=n[3],e[4]=n[4],e[5]=n[5],e[6]=n[6],e[7]=n[7],e[8]=n[8],this}extractBasis(t,e,n){return t.setFromMatrix3Column(this,0),e.setFromMatrix3Column(this,1),n.setFromMatrix3Column(this,2),this}setFromMatrix4(t){let e=t.elements;return this.set(e[0],e[4],e[8],e[1],e[5],e[9],e[2],e[6],e[10]),this}multiply(t){return this.multiplyMatrices(this,t)}premultiply(t){return this.multiplyMatrices(t,this)}multiplyMatrices(t,e){let n=t.elements,s=e.elements,r=this.elements,o=n[0],a=n[3],l=n[6],c=n[1],h=n[4],d=n[7],f=n[2],m=n[5],g=n[8],x=s[0],p=s[3],u=s[6],w=s[1],v=s[4],P=s[7],U=s[2],R=s[5],C=s[8];return r[0]=o*x+a*w+l*U,r[3]=o*p+a*v+l*R,r[6]=o*u+a*P+l*C,r[1]=c*x+h*w+d*U,r[4]=c*p+h*v+d*R,r[7]=c*u+h*P+d*C,r[2]=f*x+m*w+g*U,r[5]=f*p+m*v+g*R,r[8]=f*u+m*P+g*C,this}multiplyScalar(t){let e=this.elements;return e[0]*=t,e[3]*=t,e[6]*=t,e[1]*=t,e[4]*=t,e[7]*=t,e[2]*=t,e[5]*=t,e[8]*=t,this}determinant(){let t=this.elements,e=t[0],n=t[1],s=t[2],r=t[3],o=t[4],a=t[5],l=t[6],c=t[7],h=t[8];return e*o*h-e*a*c-n*r*h+n*a*l+s*r*c-s*o*l}invert(){let t=this.elements,e=t[0],n=t[1],s=t[2],r=t[3],o=t[4],a=t[5],l=t[6],c=t[7],h=t[8],d=h*o-a*c,f=a*l-h*r,m=c*r-o*l,g=e*d+n*f+s*m;if(g===0)return this.set(0,0,0,0,0,0,0,0,0);let x=1/g;return t[0]=d*x,t[1]=(s*c-h*n)*x,t[2]=(a*n-s*o)*x,t[3]=f*x,t[4]=(h*e-s*l)*x,t[5]=(s*r-a*e)*x,t[6]=m*x,t[7]=(n*l-c*e)*x,t[8]=(o*e-n*r)*x,this}transpose(){let t,e=this.elements;return t=e[1],e[1]=e[3],e[3]=t,t=e[2],e[2]=e[6],e[6]=t,t=e[5],e[5]=e[7],e[7]=t,this}getNormalMatrix(t){return this.setFromMatrix4(t).invert().transpose()}transposeIntoArray(t){let e=this.elements;return t[0]=e[0],t[1]=e[3],t[2]=e[6],t[3]=e[1],t[4]=e[4],t[5]=e[7],t[6]=e[2],t[7]=e[5],t[8]=e[8],this}setUvTransform(t,e,n,s,r,o,a){let l=Math.cos(r),c=Math.sin(r);return this.set(n*l,n*c,-n*(l*o+c*a)+o+t,-s*c,s*l,-s*(-c*o+l*a)+a+e,0,0,1),this}scale(t,e){return this.premultiply(js.makeScale(t,e)),this}rotate(t){return this.premultiply(js.makeRotation(-t)),this}translate(t,e){return this.premultiply(js.makeTranslation(t,e)),this}makeTranslation(t,e){return t.isVector2?this.set(1,0,t.x,0,1,t.y,0,0,1):this.set(1,0,t,0,1,e,0,0,1),this}makeRotation(t){let e=Math.cos(t),n=Math.sin(t);return this.set(e,-n,0,n,e,0,0,0,1),this}makeScale(t,e){return this.set(t,0,0,0,e,0,0,0,1),this}equals(t){let e=this.elements,n=t.elements;for(let s=0;s<9;s++)if(e[s]!==n[s])return!1;return!0}fromArray(t,e=0){for(let n=0;n<9;n++)this.elements[n]=t[n+e];return this}toArray(t=[],e=0){let n=this.elements;return t[e]=n[0],t[e+1]=n[1],t[e+2]=n[2],t[e+3]=n[3],t[e+4]=n[4],t[e+5]=n[5],t[e+6]=n[6],t[e+7]=n[7],t[e+8]=n[8],t}clone(){return new this.constructor().fromArray(this.elements)}},js=new zt;function il(i){for(let t=i.length-1;t>=0;--t)if(i[t]>=65535)return!0;return!1}function ms(i){return document.createElementNS(\"http://www.w3.org/1999/xhtml\",i)}function xc(){let i=ms(\"canvas\");return i.style.display=\"block\",i}var eo={};function Si(i){i in eo||(eo[i]=!0,console.warn(i))}var no=new zt().set(.8224621,.177538,0,.0331941,.9668058,0,.0170827,.0723974,.9105199),io=new zt().set(1.2249401,-.2249404,0,-.0420569,1.0420571,0,-.0196376,-.0786361,1.0982735),Fi={[rn]:{transfer:us,primaries:ds,toReference:i=>i,fromReference:i=>i},[ce]:{transfer:Jt,primaries:ds,toReference:i=>i.convertSRGBToLinear(),fromReference:i=>i.convertLinearToSRGB()},[Us]:{transfer:us,primaries:fs,toReference:i=>i.applyMatrix3(io),fromReference:i=>i.applyMatrix3(no)},[aa]:{transfer:Jt,primaries:fs,toReference:i=>i.convertSRGBToLinear().applyMatrix3(io),fromReference:i=>i.applyMatrix3(no).convertLinearToSRGB()}},vc=new Set([rn,Us]),Wt={enabled:!0,_workingColorSpace:rn,get workingColorSpace(){return this._workingColorSpace},set workingColorSpace(i){if(!vc.has(i))throw new Error(`Unsupported working color space, \"${i}\".`);this._workingColorSpace=i},convert:function(i,t,e){if(this.enabled===!1||t===e||!t||!e)return i;let n=Fi[t].toReference,s=Fi[e].fromReference;return s(n(i))},fromWorkingColorSpace:function(i,t){return this.convert(i,this._workingColorSpace,t)},toWorkingColorSpace:function(i,t){return this.convert(i,t,this._workingColorSpace)},getPrimaries:function(i){return Fi[i].primaries},getTransfer:function(i){return i===De?us:Fi[i].transfer}};function ii(i){return i<.04045?i*.0773993808:Math.pow(i*.9478672986+.0521327014,2.4)}function tr(i){return i<.0031308?i*12.92:1.055*Math.pow(i,.41666)-.055}var Bn,gs=class{static getDataURL(t){if(/^data:/i.test(t.src)||typeof HTMLCanvasElement>\"u\")return t.src;let e;if(t instanceof HTMLCanvasElement)e=t;else{Bn===void 0&&(Bn=ms(\"canvas\")),Bn.width=t.width,Bn.height=t.height;let n=Bn.getContext(\"2d\");t instanceof ImageData?n.putImageData(t,0,0):n.drawImage(t,0,0,t.width,t.height),e=Bn}return e.width>2048||e.height>2048?(console.warn(\"THREE.ImageUtils.getDataURL: Image converted to jpg for performance reasons\",t),e.toDataURL(\"image/jpeg\",.6)):e.toDataURL(\"image/png\")}static sRGBToLinear(t){if(typeof HTMLImageElement<\"u\"&&t instanceof HTMLImageElement||typeof HTMLCanvasElement<\"u\"&&t instanceof HTMLCanvasElement||typeof ImageBitmap<\"u\"&&t instanceof ImageBitmap){let e=ms(\"canvas\");e.width=t.width,e.height=t.height;let n=e.getContext(\"2d\");n.drawImage(t,0,0,t.width,t.height);let s=n.getImageData(0,0,t.width,t.height),r=s.data;for(let o=0;o<r.length;o++)r[o]=ii(r[o]/255)*255;return n.putImageData(s,0,0),e}else if(t.data){let e=t.data.slice(0);for(let n=0;n<e.length;n++)e instanceof Uint8Array||e instanceof Uint8ClampedArray?e[n]=Math.floor(ii(e[n]/255)*255):e[n]=ii(e[n]);return{data:e,width:t.width,height:t.height}}else return console.warn(\"THREE.ImageUtils.sRGBToLinear(): Unsupported image type. No color space conversion applied.\"),t}},yc=0,_s=class{constructor(t=null){this.isSource=!0,Object.defineProperty(this,\"id\",{value:yc++}),this.uuid=Ii(),this.data=t,this.version=0}set needsUpdate(t){t===!0&&this.version++}toJSON(t){let e=t===void 0||typeof t==\"string\";if(!e&&t.images[this.uuid]!==void 0)return t.images[this.uuid];let n={uuid:this.uuid,url:\"\"},s=this.data;if(s!==null){let r;if(Array.isArray(s)){r=[];for(let o=0,a=s.length;o<a;o++)s[o].isDataTexture?r.push(er(s[o].image)):r.push(er(s[o]))}else r=er(s);n.url=r}return e||(t.images[this.uuid]=n),n}};function er(i){return typeof HTMLImageElement<\"u\"&&i instanceof HTMLImageElement||typeof HTMLCanvasElement<\"u\"&&i instanceof HTMLCanvasElement||typeof ImageBitmap<\"u\"&&i instanceof ImageBitmap?gs.getDataURL(i):i.data?{data:Array.from(i.data),width:i.width,height:i.height,type:i.data.constructor.name}:(console.warn(\"THREE.Texture: Unable to serialize Texture.\"),{})}var Mc=0,He=class i extends xn{constructor(t=i.DEFAULT_IMAGE,e=i.DEFAULT_MAPPING,n=ze,s=ze,r=Ue,o=Ei,a=Ve,l=mn,c=i.DEFAULT_ANISOTROPY,h=De){super(),this.isTexture=!0,Object.defineProperty(this,\"id\",{value:Mc++}),this.uuid=Ii(),this.name=\"\",this.source=new _s(t),this.mipmaps=[],this.mapping=e,this.channel=0,this.wrapS=n,this.wrapT=s,this.magFilter=r,this.minFilter=o,this.anisotropy=c,this.format=a,this.internalFormat=null,this.type=l,this.offset=new Lt(0,0),this.repeat=new Lt(1,1),this.center=new Lt(0,0),this.rotation=0,this.matrixAutoUpdate=!0,this.matrix=new zt,this.generateMipmaps=!0,this.premultiplyAlpha=!1,this.flipY=!0,this.unpackAlignment=4,typeof h==\"string\"?this.colorSpace=h:(Si(\"THREE.Texture: Property .encoding has been replaced by .colorSpace.\"),this.colorSpace=h===In?ce:De),this.userData={},this.version=0,this.onUpdate=null,this.isRenderTargetTexture=!1,this.needsPMREMUpdate=!1}get image(){return this.source.data}set image(t=null){this.source.data=t}updateMatrix(){this.matrix.setUvTransform(this.offset.x,this.offset.y,this.repeat.x,this.repeat.y,this.rotation,this.center.x,this.center.y)}clone(){return new this.constructor().copy(this)}copy(t){return this.name=t.name,this.source=t.source,this.mipmaps=t.mipmaps.slice(0),this.mapping=t.mapping,this.channel=t.channel,this.wrapS=t.wrapS,this.wrapT=t.wrapT,this.magFilter=t.magFilter,this.minFilter=t.minFilter,this.anisotropy=t.anisotropy,this.format=t.format,this.internalFormat=t.internalFormat,this.type=t.type,this.offset.copy(t.offset),this.repeat.copy(t.repeat),this.center.copy(t.center),this.rotation=t.rotation,this.matrixAutoUpdate=t.matrixAutoUpdate,this.matrix.copy(t.matrix),this.generateMipmaps=t.generateMipmaps,this.premultiplyAlpha=t.premultiplyAlpha,this.flipY=t.flipY,this.unpackAlignment=t.unpackAlignment,this.colorSpace=t.colorSpace,this.userData=JSON.parse(JSON.stringify(t.userData)),this.needsUpdate=!0,this}toJSON(t){let e=t===void 0||typeof t==\"string\";if(!e&&t.textures[this.uuid]!==void 0)return t.textures[this.uuid];let n={metadata:{version:4.6,type:\"Texture\",generator:\"Texture.toJSON\"},uuid:this.uuid,name:this.name,image:this.source.toJSON(t).uuid,mapping:this.mapping,channel:this.channel,repeat:[this.repeat.x,this.repeat.y],offset:[this.offset.x,this.offset.y],center:[this.center.x,this.center.y],rotation:this.rotation,wrap:[this.wrapS,this.wrapT],format:this.format,internalFormat:this.internalFormat,type:this.type,colorSpace:this.colorSpace,minFilter:this.minFilter,magFilter:this.magFilter,anisotropy:this.anisotropy,flipY:this.flipY,generateMipmaps:this.generateMipmaps,premultiplyAlpha:this.premultiplyAlpha,unpackAlignment:this.unpackAlignment};return Object.keys(this.userData).length>0&&(n.userData=this.userData),e||(t.textures[this.uuid]=n),n}dispose(){this.dispatchEvent({type:\"dispose\"})}transformUv(t){if(this.mapping!==Yo)return t;if(t.applyMatrix3(this.matrix),t.x<0||t.x>1)switch(this.wrapS){case Tr:t.x=t.x-Math.floor(t.x);break;case ze:t.x=t.x<0?0:1;break;case Ar:Math.abs(Math.floor(t.x)%2)===1?t.x=Math.ceil(t.x)-t.x:t.x=t.x-Math.floor(t.x);break}if(t.y<0||t.y>1)switch(this.wrapT){case Tr:t.y=t.y-Math.floor(t.y);break;case ze:t.y=t.y<0?0:1;break;case Ar:Math.abs(Math.floor(t.y)%2)===1?t.y=Math.ceil(t.y)-t.y:t.y=t.y-Math.floor(t.y);break}return this.flipY&&(t.y=1-t.y),t}set needsUpdate(t){t===!0&&(this.version++,this.source.needsUpdate=!0)}get encoding(){return Si(\"THREE.Texture: Property .encoding has been replaced by .colorSpace.\"),this.colorSpace===ce?In:el}set encoding(t){Si(\"THREE.Texture: Property .encoding has been replaced by .colorSpace.\"),this.colorSpace=t===In?ce:De}};He.DEFAULT_IMAGE=null;He.DEFAULT_MAPPING=Yo;He.DEFAULT_ANISOTROPY=1;var he=class i{constructor(t=0,e=0,n=0,s=1){i.prototype.isVector4=!0,this.x=t,this.y=e,this.z=n,this.w=s}get width(){return this.z}set width(t){this.z=t}get height(){return this.w}set height(t){this.w=t}set(t,e,n,s){return this.x=t,this.y=e,this.z=n,this.w=s,this}setScalar(t){return this.x=t,this.y=t,this.z=t,this.w=t,this}setX(t){return this.x=t,this}setY(t){return this.y=t,this}setZ(t){return this.z=t,this}setW(t){return this.w=t,this}setComponent(t,e){switch(t){case 0:this.x=e;break;case 1:this.y=e;break;case 2:this.z=e;break;case 3:this.w=e;break;default:throw new Error(\"index is out of range: \"+t)}return this}getComponent(t){switch(t){case 0:return this.x;case 1:return this.y;case 2:return this.z;case 3:return this.w;default:throw new Error(\"index is out of range: \"+t)}}clone(){return new this.constructor(this.x,this.y,this.z,this.w)}copy(t){return this.x=t.x,this.y=t.y,this.z=t.z,this.w=t.w!==void 0?t.w:1,this}add(t){return this.x+=t.x,this.y+=t.y,this.z+=t.z,this.w+=t.w,this}addScalar(t){return this.x+=t,this.y+=t,this.z+=t,this.w+=t,this}addVectors(t,e){return this.x=t.x+e.x,this.y=t.y+e.y,this.z=t.z+e.z,this.w=t.w+e.w,this}addScaledVector(t,e){return this.x+=t.x*e,this.y+=t.y*e,this.z+=t.z*e,this.w+=t.w*e,this}sub(t){return this.x-=t.x,this.y-=t.y,this.z-=t.z,this.w-=t.w,this}subScalar(t){return this.x-=t,this.y-=t,this.z-=t,this.w-=t,this}subVectors(t,e){return this.x=t.x-e.x,this.y=t.y-e.y,this.z=t.z-e.z,this.w=t.w-e.w,this}multiply(t){return this.x*=t.x,this.y*=t.y,this.z*=t.z,this.w*=t.w,this}multiplyScalar(t){return this.x*=t,this.y*=t,this.z*=t,this.w*=t,this}applyMatrix4(t){let e=this.x,n=this.y,s=this.z,r=this.w,o=t.elements;return this.x=o[0]*e+o[4]*n+o[8]*s+o[12]*r,this.y=o[1]*e+o[5]*n+o[9]*s+o[13]*r,this.z=o[2]*e+o[6]*n+o[10]*s+o[14]*r,this.w=o[3]*e+o[7]*n+o[11]*s+o[15]*r,this}divideScalar(t){return this.multiplyScalar(1/t)}setAxisAngleFromQuaternion(t){this.w=2*Math.acos(t.w);let e=Math.sqrt(1-t.w*t.w);return e<1e-4?(this.x=1,this.y=0,this.z=0):(this.x=t.x/e,this.y=t.y/e,this.z=t.z/e),this}setAxisAngleFromRotationMatrix(t){let e,n,s,r,l=t.elements,c=l[0],h=l[4],d=l[8],f=l[1],m=l[5],g=l[9],x=l[2],p=l[6],u=l[10];if(Math.abs(h-f)<.01&&Math.abs(d-x)<.01&&Math.abs(g-p)<.01){if(Math.abs(h+f)<.1&&Math.abs(d+x)<.1&&Math.abs(g+p)<.1&&Math.abs(c+m+u-3)<.1)return this.set(1,0,0,0),this;e=Math.PI;let v=(c+1)/2,P=(m+1)/2,U=(u+1)/2,R=(h+f)/4,C=(d+x)/4,Y=(g+p)/4;return v>P&&v>U?v<.01?(n=0,s=.707106781,r=.707106781):(n=Math.sqrt(v),s=R/n,r=C/n):P>U?P<.01?(n=.707106781,s=0,r=.707106781):(s=Math.sqrt(P),n=R/s,r=Y/s):U<.01?(n=.707106781,s=.707106781,r=0):(r=Math.sqrt(U),n=C/r,s=Y/r),this.set(n,s,r,e),this}let w=Math.sqrt((p-g)*(p-g)+(d-x)*(d-x)+(f-h)*(f-h));return Math.abs(w)<.001&&(w=1),this.x=(p-g)/w,this.y=(d-x)/w,this.z=(f-h)/w,this.w=Math.acos((c+m+u-1)/2),this}min(t){return this.x=Math.min(this.x,t.x),this.y=Math.min(this.y,t.y),this.z=Math.min(this.z,t.z),this.w=Math.min(this.w,t.w),this}max(t){return this.x=Math.max(this.x,t.x),this.y=Math.max(this.y,t.y),this.z=Math.max(this.z,t.z),this.w=Math.max(this.w,t.w),this}clamp(t,e){return this.x=Math.max(t.x,Math.min(e.x,this.x)),this.y=Math.max(t.y,Math.min(e.y,this.y)),this.z=Math.max(t.z,Math.min(e.z,this.z)),this.w=Math.max(t.w,Math.min(e.w,this.w)),this}clampScalar(t,e){return this.x=Math.max(t,Math.min(e,this.x)),this.y=Math.max(t,Math.min(e,this.y)),this.z=Math.max(t,Math.min(e,this.z)),this.w=Math.max(t,Math.min(e,this.w)),this}clampLength(t,e){let n=this.length();return this.divideScalar(n||1).multiplyScalar(Math.max(t,Math.min(e,n)))}floor(){return this.x=Math.floor(this.x),this.y=Math.floor(this.y),this.z=Math.floor(this.z),this.w=Math.floor(this.w),this}ceil(){return this.x=Math.ceil(this.x),this.y=Math.ceil(this.y),this.z=Math.ceil(this.z),this.w=Math.ceil(this.w),this}round(){return this.x=Math.round(this.x),this.y=Math.round(this.y),this.z=Math.round(this.z),this.w=Math.round(this.w),this}roundToZero(){return this.x=Math.trunc(this.x),this.y=Math.trunc(this.y),this.z=Math.trunc(this.z),this.w=Math.trunc(this.w),this}negate(){return this.x=-this.x,this.y=-this.y,this.z=-this.z,this.w=-this.w,this}dot(t){return this.x*t.x+this.y*t.y+this.z*t.z+this.w*t.w}lengthSq(){return this.x*this.x+this.y*this.y+this.z*this.z+this.w*this.w}length(){return Math.sqrt(this.x*this.x+this.y*this.y+this.z*this.z+this.w*this.w)}manhattanLength(){return Math.abs(this.x)+Math.abs(this.y)+Math.abs(this.z)+Math.abs(this.w)}normalize(){return this.divideScalar(this.length()||1)}setLength(t){return this.normalize().multiplyScalar(t)}lerp(t,e){return this.x+=(t.x-this.x)*e,this.y+=(t.y-this.y)*e,this.z+=(t.z-this.z)*e,this.w+=(t.w-this.w)*e,this}lerpVectors(t,e,n){return this.x=t.x+(e.x-t.x)*n,this.y=t.y+(e.y-t.y)*n,this.z=t.z+(e.z-t.z)*n,this.w=t.w+(e.w-t.w)*n,this}equals(t){return t.x===this.x&&t.y===this.y&&t.z===this.z&&t.w===this.w}fromArray(t,e=0){return this.x=t[e],this.y=t[e+1],this.z=t[e+2],this.w=t[e+3],this}toArray(t=[],e=0){return t[e]=this.x,t[e+1]=this.y,t[e+2]=this.z,t[e+3]=this.w,t}fromBufferAttribute(t,e){return this.x=t.getX(e),this.y=t.getY(e),this.z=t.getZ(e),this.w=t.getW(e),this}random(){return this.x=Math.random(),this.y=Math.random(),this.z=Math.random(),this.w=Math.random(),this}*[Symbol.iterator](){yield this.x,yield this.y,yield this.z,yield this.w}},Lr=class extends xn{constructor(t=1,e=1,n={}){super(),this.isRenderTarget=!0,this.width=t,this.height=e,this.depth=1,this.scissor=new he(0,0,t,e),this.scissorTest=!1,this.viewport=new he(0,0,t,e);let s={width:t,height:e,depth:1};n.encoding!==void 0&&(Si(\"THREE.WebGLRenderTarget: option.encoding has been replaced by option.colorSpace.\"),n.colorSpace=n.encoding===In?ce:De),n=Object.assign({generateMipmaps:!1,internalFormat:null,minFilter:Ue,depthBuffer:!0,stencilBuffer:!1,depthTexture:null,samples:0},n),this.texture=new He(s,n.mapping,n.wrapS,n.wrapT,n.magFilter,n.minFilter,n.format,n.type,n.anisotropy,n.colorSpace),this.texture.isRenderTargetTexture=!0,this.texture.flipY=!1,this.texture.generateMipmaps=n.generateMipmaps,this.texture.internalFormat=n.internalFormat,this.depthBuffer=n.depthBuffer,this.stencilBuffer=n.stencilBuffer,this.depthTexture=n.depthTexture,this.samples=n.samples}setSize(t,e,n=1){(this.width!==t||this.height!==e||this.depth!==n)&&(this.width=t,this.height=e,this.depth=n,this.texture.image.width=t,this.texture.image.height=e,this.texture.image.depth=n,this.dispose()),this.viewport.set(0,0,t,e),this.scissor.set(0,0,t,e)}clone(){return new this.constructor().copy(this)}copy(t){this.width=t.width,this.height=t.height,this.depth=t.depth,this.scissor.copy(t.scissor),this.scissorTest=t.scissorTest,this.viewport.copy(t.viewport),this.texture=t.texture.clone(),this.texture.isRenderTargetTexture=!0;let e=Object.assign({},t.texture.image);return this.texture.source=new _s(e),this.depthBuffer=t.depthBuffer,this.stencilBuffer=t.stencilBuffer,t.depthTexture!==null&&(this.depthTexture=t.depthTexture.clone()),this.samples=t.samples,this}dispose(){this.dispatchEvent({type:\"dispose\"})}},Me=class extends Lr{constructor(t=1,e=1,n={}){super(t,e,n),this.isWebGLRenderTarget=!0}},xs=class extends He{constructor(t=null,e=1,n=1,s=1){super(null),this.isDataArrayTexture=!0,this.image={data:t,width:e,height:n,depth:s},this.magFilter=xe,this.minFilter=xe,this.wrapR=ze,this.generateMipmaps=!1,this.flipY=!1,this.unpackAlignment=1}};var Ir=class extends He{constructor(t=null,e=1,n=1,s=1){super(null),this.isData3DTexture=!0,this.image={data:t,width:e,height:n,depth:s},this.magFilter=xe,this.minFilter=xe,this.wrapR=ze,this.generateMipmaps=!1,this.flipY=!1,this.unpackAlignment=1}};var vn=class{constructor(t=0,e=0,n=0,s=1){this.isQuaternion=!0,this._x=t,this._y=e,this._z=n,this._w=s}static slerpFlat(t,e,n,s,r,o,a){let l=n[s+0],c=n[s+1],h=n[s+2],d=n[s+3],f=r[o+0],m=r[o+1],g=r[o+2],x=r[o+3];if(a===0){t[e+0]=l,t[e+1]=c,t[e+2]=h,t[e+3]=d;return}if(a===1){t[e+0]=f,t[e+1]=m,t[e+2]=g,t[e+3]=x;return}if(d!==x||l!==f||c!==m||h!==g){let p=1-a,u=l*f+c*m+h*g+d*x,w=u>=0?1:-1,v=1-u*u;if(v>Number.EPSILON){let U=Math.sqrt(v),R=Math.atan2(U,u*w);p=Math.sin(p*R)/U,a=Math.sin(a*R)/U}let P=a*w;if(l=l*p+f*P,c=c*p+m*P,h=h*p+g*P,d=d*p+x*P,p===1-a){let U=1/Math.sqrt(l*l+c*c+h*h+d*d);l*=U,c*=U,h*=U,d*=U}}t[e]=l,t[e+1]=c,t[e+2]=h,t[e+3]=d}static multiplyQuaternionsFlat(t,e,n,s,r,o){let a=n[s],l=n[s+1],c=n[s+2],h=n[s+3],d=r[o],f=r[o+1],m=r[o+2],g=r[o+3];return t[e]=a*g+h*d+l*m-c*f,t[e+1]=l*g+h*f+c*d-a*m,t[e+2]=c*g+h*m+a*f-l*d,t[e+3]=h*g-a*d-l*f-c*m,t}get x(){return this._x}set x(t){this._x=t,this._onChangeCallback()}get y(){return this._y}set y(t){this._y=t,this._onChangeCallback()}get z(){return this._z}set z(t){this._z=t,this._onChangeCallback()}get w(){return this._w}set w(t){this._w=t,this._onChangeCallback()}set(t,e,n,s){return this._x=t,this._y=e,this._z=n,this._w=s,this._onChangeCallback(),this}clone(){return new this.constructor(this._x,this._y,this._z,this._w)}copy(t){return this._x=t.x,this._y=t.y,this._z=t.z,this._w=t.w,this._onChangeCallback(),this}setFromEuler(t,e=!0){let n=t._x,s=t._y,r=t._z,o=t._order,a=Math.cos,l=Math.sin,c=a(n/2),h=a(s/2),d=a(r/2),f=l(n/2),m=l(s/2),g=l(r/2);switch(o){case\"XYZ\":this._x=f*h*d+c*m*g,this._y=c*m*d-f*h*g,this._z=c*h*g+f*m*d,this._w=c*h*d-f*m*g;break;case\"YXZ\":this._x=f*h*d+c*m*g,this._y=c*m*d-f*h*g,this._z=c*h*g-f*m*d,this._w=c*h*d+f*m*g;break;case\"ZXY\":this._x=f*h*d-c*m*g,this._y=c*m*d+f*h*g,this._z=c*h*g+f*m*d,this._w=c*h*d-f*m*g;break;case\"ZYX\":this._x=f*h*d-c*m*g,this._y=c*m*d+f*h*g,this._z=c*h*g-f*m*d,this._w=c*h*d+f*m*g;break;case\"YZX\":this._x=f*h*d+c*m*g,this._y=c*m*d+f*h*g,this._z=c*h*g-f*m*d,this._w=c*h*d-f*m*g;break;case\"XZY\":this._x=f*h*d-c*m*g,this._y=c*m*d-f*h*g,this._z=c*h*g+f*m*d,this._w=c*h*d+f*m*g;break;default:console.warn(\"THREE.Quaternion: .setFromEuler() encountered an unknown order: \"+o)}return e===!0&&this._onChangeCallback(),this}setFromAxisAngle(t,e){let n=e/2,s=Math.sin(n);return this._x=t.x*s,this._y=t.y*s,this._z=t.z*s,this._w=Math.cos(n),this._onChangeCallback(),this}setFromRotationMatrix(t){let e=t.elements,n=e[0],s=e[4],r=e[8],o=e[1],a=e[5],l=e[9],c=e[2],h=e[6],d=e[10],f=n+a+d;if(f>0){let m=.5/Math.sqrt(f+1);this._w=.25/m,this._x=(h-l)*m,this._y=(r-c)*m,this._z=(o-s)*m}else if(n>a&&n>d){let m=2*Math.sqrt(1+n-a-d);this._w=(h-l)/m,this._x=.25*m,this._y=(s+o)/m,this._z=(r+c)/m}else if(a>d){let m=2*Math.sqrt(1+a-n-d);this._w=(r-c)/m,this._x=(s+o)/m,this._y=.25*m,this._z=(l+h)/m}else{let m=2*Math.sqrt(1+d-n-a);this._w=(o-s)/m,this._x=(r+c)/m,this._y=(l+h)/m,this._z=.25*m}return this._onChangeCallback(),this}setFromUnitVectors(t,e){let n=t.dot(e)+1;return n<Number.EPSILON?(n=0,Math.abs(t.x)>Math.abs(t.z)?(this._x=-t.y,this._y=t.x,this._z=0,this._w=n):(this._x=0,this._y=-t.z,this._z=t.y,this._w=n)):(this._x=t.y*e.z-t.z*e.y,this._y=t.z*e.x-t.x*e.z,this._z=t.x*e.y-t.y*e.x,this._w=n),this.normalize()}angleTo(t){return 2*Math.acos(Math.abs(Ee(this.dot(t),-1,1)))}rotateTowards(t,e){let n=this.angleTo(t);if(n===0)return this;let s=Math.min(1,e/n);return this.slerp(t,s),this}identity(){return this.set(0,0,0,1)}invert(){return this.conjugate()}conjugate(){return this._x*=-1,this._y*=-1,this._z*=-1,this._onChangeCallback(),this}dot(t){return this._x*t._x+this._y*t._y+this._z*t._z+this._w*t._w}lengthSq(){return this._x*this._x+this._y*this._y+this._z*this._z+this._w*this._w}length(){return Math.sqrt(this._x*this._x+this._y*this._y+this._z*this._z+this._w*this._w)}normalize(){let t=this.length();return t===0?(this._x=0,this._y=0,this._z=0,this._w=1):(t=1/t,this._x=this._x*t,this._y=this._y*t,this._z=this._z*t,this._w=this._w*t),this._onChangeCallback(),this}multiply(t){return this.multiplyQuaternions(this,t)}premultiply(t){return this.multiplyQuaternions(t,this)}multiplyQuaternions(t,e){let n=t._x,s=t._y,r=t._z,o=t._w,a=e._x,l=e._y,c=e._z,h=e._w;return this._x=n*h+o*a+s*c-r*l,this._y=s*h+o*l+r*a-n*c,this._z=r*h+o*c+n*l-s*a,this._w=o*h-n*a-s*l-r*c,this._onChangeCallback(),this}slerp(t,e){if(e===0)return this;if(e===1)return this.copy(t);let n=this._x,s=this._y,r=this._z,o=this._w,a=o*t._w+n*t._x+s*t._y+r*t._z;if(a<0?(this._w=-t._w,this._x=-t._x,this._y=-t._y,this._z=-t._z,a=-a):this.copy(t),a>=1)return this._w=o,this._x=n,this._y=s,this._z=r,this;let l=1-a*a;if(l<=Number.EPSILON){let m=1-e;return this._w=m*o+e*this._w,this._x=m*n+e*this._x,this._y=m*s+e*this._y,this._z=m*r+e*this._z,this.normalize(),this}let c=Math.sqrt(l),h=Math.atan2(c,a),d=Math.sin((1-e)*h)/c,f=Math.sin(e*h)/c;return this._w=o*d+this._w*f,this._x=n*d+this._x*f,this._y=s*d+this._y*f,this._z=r*d+this._z*f,this._onChangeCallback(),this}slerpQuaternions(t,e,n){return this.copy(t).slerp(e,n)}random(){let t=Math.random(),e=Math.sqrt(1-t),n=Math.sqrt(t),s=2*Math.PI*Math.random(),r=2*Math.PI*Math.random();return this.set(e*Math.cos(s),n*Math.sin(r),n*Math.cos(r),e*Math.sin(s))}equals(t){return t._x===this._x&&t._y===this._y&&t._z===this._z&&t._w===this._w}fromArray(t,e=0){return this._x=t[e],this._y=t[e+1],this._z=t[e+2],this._w=t[e+3],this._onChangeCallback(),this}toArray(t=[],e=0){return t[e]=this._x,t[e+1]=this._y,t[e+2]=this._z,t[e+3]=this._w,t}fromBufferAttribute(t,e){return this._x=t.getX(e),this._y=t.getY(e),this._z=t.getZ(e),this._w=t.getW(e),this._onChangeCallback(),this}toJSON(){return this.toArray()}_onChange(t){return this._onChangeCallback=t,this}_onChangeCallback(){}*[Symbol.iterator](){yield this._x,yield this._y,yield this._z,yield this._w}},N=class i{constructor(t=0,e=0,n=0){i.prototype.isVector3=!0,this.x=t,this.y=e,this.z=n}set(t,e,n){return n===void 0&&(n=this.z),this.x=t,this.y=e,this.z=n,this}setScalar(t){return this.x=t,this.y=t,this.z=t,this}setX(t){return this.x=t,this}setY(t){return this.y=t,this}setZ(t){return this.z=t,this}setComponent(t,e){switch(t){case 0:this.x=e;break;case 1:this.y=e;break;case 2:this.z=e;break;default:throw new Error(\"index is out of range: \"+t)}return this}getComponent(t){switch(t){case 0:return this.x;case 1:return this.y;case 2:return this.z;default:throw new Error(\"index is out of range: \"+t)}}clone(){return new this.constructor(this.x,this.y,this.z)}copy(t){return this.x=t.x,this.y=t.y,this.z=t.z,this}add(t){return this.x+=t.x,this.y+=t.y,this.z+=t.z,this}addScalar(t){return this.x+=t,this.y+=t,this.z+=t,this}addVectors(t,e){return this.x=t.x+e.x,this.y=t.y+e.y,this.z=t.z+e.z,this}addScaledVector(t,e){return this.x+=t.x*e,this.y+=t.y*e,this.z+=t.z*e,this}sub(t){return this.x-=t.x,this.y-=t.y,this.z-=t.z,this}subScalar(t){return this.x-=t,this.y-=t,this.z-=t,this}subVectors(t,e){return this.x=t.x-e.x,this.y=t.y-e.y,this.z=t.z-e.z,this}multiply(t){return this.x*=t.x,this.y*=t.y,this.z*=t.z,this}multiplyScalar(t){return this.x*=t,this.y*=t,this.z*=t,this}multiplyVectors(t,e){return this.x=t.x*e.x,this.y=t.y*e.y,this.z=t.z*e.z,this}applyEuler(t){return this.applyQuaternion(so.setFromEuler(t))}applyAxisAngle(t,e){return this.applyQuaternion(so.setFromAxisAngle(t,e))}applyMatrix3(t){let e=this.x,n=this.y,s=this.z,r=t.elements;return this.x=r[0]*e+r[3]*n+r[6]*s,this.y=r[1]*e+r[4]*n+r[7]*s,this.z=r[2]*e+r[5]*n+r[8]*s,this}applyNormalMatrix(t){return this.applyMatrix3(t).normalize()}applyMatrix4(t){let e=this.x,n=this.y,s=this.z,r=t.elements,o=1/(r[3]*e+r[7]*n+r[11]*s+r[15]);return this.x=(r[0]*e+r[4]*n+r[8]*s+r[12])*o,this.y=(r[1]*e+r[5]*n+r[9]*s+r[13])*o,this.z=(r[2]*e+r[6]*n+r[10]*s+r[14])*o,this}applyQuaternion(t){let e=this.x,n=this.y,s=this.z,r=t.x,o=t.y,a=t.z,l=t.w,c=2*(o*s-a*n),h=2*(a*e-r*s),d=2*(r*n-o*e);return this.x=e+l*c+o*d-a*h,this.y=n+l*h+a*c-r*d,this.z=s+l*d+r*h-o*c,this}project(t){return this.applyMatrix4(t.matrixWorldInverse).applyMatrix4(t.projectionMatrix)}unproject(t){return this.applyMatrix4(t.projectionMatrixInverse).applyMatrix4(t.matrixWorld)}transformDirection(t){let e=this.x,n=this.y,s=this.z,r=t.elements;return this.x=r[0]*e+r[4]*n+r[8]*s,this.y=r[1]*e+r[5]*n+r[9]*s,this.z=r[2]*e+r[6]*n+r[10]*s,this.normalize()}divide(t){return this.x/=t.x,this.y/=t.y,this.z/=t.z,this}divideScalar(t){return this.multiplyScalar(1/t)}min(t){return this.x=Math.min(this.x,t.x),this.y=Math.min(this.y,t.y),this.z=Math.min(this.z,t.z),this}max(t){return this.x=Math.max(this.x,t.x),this.y=Math.max(this.y,t.y),this.z=Math.max(this.z,t.z),this}clamp(t,e){return this.x=Math.max(t.x,Math.min(e.x,this.x)),this.y=Math.max(t.y,Math.min(e.y,this.y)),this.z=Math.max(t.z,Math.min(e.z,this.z)),this}clampScalar(t,e){return this.x=Math.max(t,Math.min(e,this.x)),this.y=Math.max(t,Math.min(e,this.y)),this.z=Math.max(t,Math.min(e,this.z)),this}clampLength(t,e){let n=this.length();return this.divideScalar(n||1).multiplyScalar(Math.max(t,Math.min(e,n)))}floor(){return this.x=Math.floor(this.x),this.y=Math.floor(this.y),this.z=Math.floor(this.z),this}ceil(){return this.x=Math.ceil(this.x),this.y=Math.ceil(this.y),this.z=Math.ceil(this.z),this}round(){return this.x=Math.round(this.x),this.y=Math.round(this.y),this.z=Math.round(this.z),this}roundToZero(){return this.x=Math.trunc(this.x),this.y=Math.trunc(this.y),this.z=Math.trunc(this.z),this}negate(){return this.x=-this.x,this.y=-this.y,this.z=-this.z,this}dot(t){return this.x*t.x+this.y*t.y+this.z*t.z}lengthSq(){return this.x*this.x+this.y*this.y+this.z*this.z}length(){return Math.sqrt(this.x*this.x+this.y*this.y+this.z*this.z)}manhattanLength(){return Math.abs(this.x)+Math.abs(this.y)+Math.abs(this.z)}normalize(){return this.divideScalar(this.length()||1)}setLength(t){return this.normalize().multiplyScalar(t)}lerp(t,e){return this.x+=(t.x-this.x)*e,this.y+=(t.y-this.y)*e,this.z+=(t.z-this.z)*e,this}lerpVectors(t,e,n){return this.x=t.x+(e.x-t.x)*n,this.y=t.y+(e.y-t.y)*n,this.z=t.z+(e.z-t.z)*n,this}cross(t){return this.crossVectors(this,t)}crossVectors(t,e){let n=t.x,s=t.y,r=t.z,o=e.x,a=e.y,l=e.z;return this.x=s*l-r*a,this.y=r*o-n*l,this.z=n*a-s*o,this}projectOnVector(t){let e=t.lengthSq();if(e===0)return this.set(0,0,0);let n=t.dot(this)/e;return this.copy(t).multiplyScalar(n)}projectOnPlane(t){return nr.copy(this).projectOnVector(t),this.sub(nr)}reflect(t){return this.sub(nr.copy(t).multiplyScalar(2*this.dot(t)))}angleTo(t){let e=Math.sqrt(this.lengthSq()*t.lengthSq());if(e===0)return Math.PI/2;let n=this.dot(t)/e;return Math.acos(Ee(n,-1,1))}distanceTo(t){return Math.sqrt(this.distanceToSquared(t))}distanceToSquared(t){let e=this.x-t.x,n=this.y-t.y,s=this.z-t.z;return e*e+n*n+s*s}manhattanDistanceTo(t){return Math.abs(this.x-t.x)+Math.abs(this.y-t.y)+Math.abs(this.z-t.z)}setFromSpherical(t){return this.setFromSphericalCoords(t.radius,t.phi,t.theta)}setFromSphericalCoords(t,e,n){let s=Math.sin(e)*t;return this.x=s*Math.sin(n),this.y=Math.cos(e)*t,this.z=s*Math.cos(n),this}setFromCylindrical(t){return this.setFromCylindricalCoords(t.radius,t.theta,t.y)}setFromCylindricalCoords(t,e,n){return this.x=t*Math.sin(e),this.y=n,this.z=t*Math.cos(e),this}setFromMatrixPosition(t){let e=t.elements;return this.x=e[12],this.y=e[13],this.z=e[14],this}setFromMatrixScale(t){let e=this.setFromMatrixColumn(t,0).length(),n=this.setFromMatrixColumn(t,1).length(),s=this.setFromMatrixColumn(t,2).length();return this.x=e,this.y=n,this.z=s,this}setFromMatrixColumn(t,e){return this.fromArray(t.elements,e*4)}setFromMatrix3Column(t,e){return this.fromArray(t.elements,e*3)}setFromEuler(t){return this.x=t._x,this.y=t._y,this.z=t._z,this}setFromColor(t){return this.x=t.r,this.y=t.g,this.z=t.b,this}equals(t){return t.x===this.x&&t.y===this.y&&t.z===this.z}fromArray(t,e=0){return this.x=t[e],this.y=t[e+1],this.z=t[e+2],this}toArray(t=[],e=0){return t[e]=this.x,t[e+1]=this.y,t[e+2]=this.z,t}fromBufferAttribute(t,e){return this.x=t.getX(e),this.y=t.getY(e),this.z=t.getZ(e),this}random(){return this.x=Math.random(),this.y=Math.random(),this.z=Math.random(),this}randomDirection(){let t=(Math.random()-.5)*2,e=Math.random()*Math.PI*2,n=Math.sqrt(1-t**2);return this.x=n*Math.cos(e),this.y=n*Math.sin(e),this.z=t,this}*[Symbol.iterator](){yield this.x,yield this.y,yield this.z}},nr=new N,so=new vn,Un=class{constructor(t=new N(1/0,1/0,1/0),e=new N(-1/0,-1/0,-1/0)){this.isBox3=!0,this.min=t,this.max=e}set(t,e){return this.min.copy(t),this.max.copy(e),this}setFromArray(t){this.makeEmpty();for(let e=0,n=t.length;e<n;e+=3)this.expandByPoint(Fe.fromArray(t,e));return this}setFromBufferAttribute(t){this.makeEmpty();for(let e=0,n=t.count;e<n;e++)this.expandByPoint(Fe.fromBufferAttribute(t,e));return this}setFromPoints(t){this.makeEmpty();for(let e=0,n=t.length;e<n;e++)this.expandByPoint(t[e]);return this}setFromCenterAndSize(t,e){let n=Fe.copy(e).multiplyScalar(.5);return this.min.copy(t).sub(n),this.max.copy(t).add(n),this}setFromObject(t,e=!1){return this.makeEmpty(),this.expandByObject(t,e)}clone(){return new this.constructor().copy(this)}copy(t){return this.min.copy(t.min),this.max.copy(t.max),this}makeEmpty(){return this.min.x=this.min.y=this.min.z=1/0,this.max.x=this.max.y=this.max.z=-1/0,this}isEmpty(){return this.max.x<this.min.x||this.max.y<this.min.y||this.max.z<this.min.z}getCenter(t){return this.isEmpty()?t.set(0,0,0):t.addVectors(this.min,this.max).multiplyScalar(.5)}getSize(t){return this.isEmpty()?t.set(0,0,0):t.subVectors(this.max,this.min)}expandByPoint(t){return this.min.min(t),this.max.max(t),this}expandByVector(t){return this.min.sub(t),this.max.add(t),this}expandByScalar(t){return this.min.addScalar(-t),this.max.addScalar(t),this}expandByObject(t,e=!1){t.updateWorldMatrix(!1,!1);let n=t.geometry;if(n!==void 0){let r=n.getAttribute(\"position\");if(e===!0&&r!==void 0&&t.isInstancedMesh!==!0)for(let o=0,a=r.count;o<a;o++)t.isMesh===!0?t.getVertexPosition(o,Fe):Fe.fromBufferAttribute(r,o),Fe.applyMatrix4(t.matrixWorld),this.expandByPoint(Fe);else t.boundingBox!==void 0?(t.boundingBox===null&&t.computeBoundingBox(),Oi.copy(t.boundingBox)):(n.boundingBox===null&&n.computeBoundingBox(),Oi.copy(n.boundingBox)),Oi.applyMatrix4(t.matrixWorld),this.union(Oi)}let s=t.children;for(let r=0,o=s.length;r<o;r++)this.expandByObject(s[r],e);return this}containsPoint(t){return!(t.x<this.min.x||t.x>this.max.x||t.y<this.min.y||t.y>this.max.y||t.z<this.min.z||t.z>this.max.z)}containsBox(t){return this.min.x<=t.min.x&&t.max.x<=this.max.x&&this.min.y<=t.min.y&&t.max.y<=this.max.y&&this.min.z<=t.min.z&&t.max.z<=this.max.z}getParameter(t,e){return e.set((t.x-this.min.x)/(this.max.x-this.min.x),(t.y-this.min.y)/(this.max.y-this.min.y),(t.z-this.min.z)/(this.max.z-this.min.z))}intersectsBox(t){return!(t.max.x<this.min.x||t.min.x>this.max.x||t.max.y<this.min.y||t.min.y>this.max.y||t.max.z<this.min.z||t.min.z>this.max.z)}intersectsSphere(t){return this.clampPoint(t.center,Fe),Fe.distanceToSquared(t.center)<=t.radius*t.radius}intersectsPlane(t){let e,n;return t.normal.x>0?(e=t.normal.x*this.min.x,n=t.normal.x*this.max.x):(e=t.normal.x*this.max.x,n=t.normal.x*this.min.x),t.normal.y>0?(e+=t.normal.y*this.min.y,n+=t.normal.y*this.max.y):(e+=t.normal.y*this.max.y,n+=t.normal.y*this.min.y),t.normal.z>0?(e+=t.normal.z*this.min.z,n+=t.normal.z*this.max.z):(e+=t.normal.z*this.max.z,n+=t.normal.z*this.min.z),e<=-t.constant&&n>=-t.constant}intersectsTriangle(t){if(this.isEmpty())return!1;this.getCenter(xi),Bi.subVectors(this.max,xi),zn.subVectors(t.a,xi),Vn.subVectors(t.b,xi),kn.subVectors(t.c,xi),an.subVectors(Vn,zn),on.subVectors(kn,Vn),bn.subVectors(zn,kn);let e=[0,-an.z,an.y,0,-on.z,on.y,0,-bn.z,bn.y,an.z,0,-an.x,on.z,0,-on.x,bn.z,0,-bn.x,-an.y,an.x,0,-on.y,on.x,0,-bn.y,bn.x,0];return!ir(e,zn,Vn,kn,Bi)||(e=[1,0,0,0,1,0,0,0,1],!ir(e,zn,Vn,kn,Bi))?!1:(zi.crossVectors(an,on),e=[zi.x,zi.y,zi.z],ir(e,zn,Vn,kn,Bi))}clampPoint(t,e){return e.copy(t).clamp(this.min,this.max)}distanceToPoint(t){return this.clampPoint(t,Fe).distanceTo(t)}getBoundingSphere(t){return this.isEmpty()?t.makeEmpty():(this.getCenter(t.center),t.radius=this.getSize(Fe).length()*.5),t}intersect(t){return this.min.max(t.min),this.max.min(t.max),this.isEmpty()&&this.makeEmpty(),this}union(t){return this.min.min(t.min),this.max.max(t.max),this}applyMatrix4(t){return this.isEmpty()?this:(Je[0].set(this.min.x,this.min.y,this.min.z).applyMatrix4(t),Je[1].set(this.min.x,this.min.y,this.max.z).applyMatrix4(t),Je[2].set(this.min.x,this.max.y,this.min.z).applyMatrix4(t),Je[3].set(this.min.x,this.max.y,this.max.z).applyMatrix4(t),Je[4].set(this.max.x,this.min.y,this.min.z).applyMatrix4(t),Je[5].set(this.max.x,this.min.y,this.max.z).applyMatrix4(t),Je[6].set(this.max.x,this.max.y,this.min.z).applyMatrix4(t),Je[7].set(this.max.x,this.max.y,this.max.z).applyMatrix4(t),this.setFromPoints(Je),this)}translate(t){return this.min.add(t),this.max.add(t),this}equals(t){return t.min.equals(this.min)&&t.max.equals(this.max)}},Je=[new N,new N,new N,new N,new N,new N,new N,new N],Fe=new N,Oi=new Un,zn=new N,Vn=new N,kn=new N,an=new N,on=new N,bn=new N,xi=new N,Bi=new N,zi=new N,En=new N;function ir(i,t,e,n,s){for(let r=0,o=i.length-3;r<=o;r+=3){En.fromArray(i,r);let a=s.x*Math.abs(En.x)+s.y*Math.abs(En.y)+s.z*Math.abs(En.z),l=t.dot(En),c=e.dot(En),h=n.dot(En);if(Math.max(-Math.max(l,c,h),Math.min(l,c,h))>a)return!1}return!0}var Sc=new Un,vi=new N,sr=new N,Dn=class{constructor(t=new N,e=-1){this.isSphere=!0,this.center=t,this.radius=e}set(t,e){return this.center.copy(t),this.radius=e,this}setFromPoints(t,e){let n=this.center;e!==void 0?n.copy(e):Sc.setFromPoints(t).getCenter(n);let s=0;for(let r=0,o=t.length;r<o;r++)s=Math.max(s,n.distanceToSquared(t[r]));return this.radius=Math.sqrt(s),this}copy(t){return this.center.copy(t.center),this.radius=t.radius,this}isEmpty(){return this.radius<0}makeEmpty(){return this.center.set(0,0,0),this.radius=-1,this}containsPoint(t){return t.distanceToSquared(this.center)<=this.radius*this.radius}distanceToPoint(t){return t.distanceTo(this.center)-this.radius}intersectsSphere(t){let e=this.radius+t.radius;return t.center.distanceToSquared(this.center)<=e*e}intersectsBox(t){return t.intersectsSphere(this)}intersectsPlane(t){return Math.abs(t.distanceToPoint(this.center))<=this.radius}clampPoint(t,e){let n=this.center.distanceToSquared(t);return e.copy(t),n>this.radius*this.radius&&(e.sub(this.center).normalize(),e.multiplyScalar(this.radius).add(this.center)),e}getBoundingBox(t){return this.isEmpty()?(t.makeEmpty(),t):(t.set(this.center,this.center),t.expandByScalar(this.radius),t)}applyMatrix4(t){return this.center.applyMatrix4(t),this.radius=this.radius*t.getMaxScaleOnAxis(),this}translate(t){return this.center.add(t),this}expandByPoint(t){if(this.isEmpty())return this.center.copy(t),this.radius=0,this;vi.subVectors(t,this.center);let e=vi.lengthSq();if(e>this.radius*this.radius){let n=Math.sqrt(e),s=(n-this.radius)*.5;this.center.addScaledVector(vi,s/n),this.radius+=s}return this}union(t){return t.isEmpty()?this:this.isEmpty()?(this.copy(t),this):(this.center.equals(t.center)===!0?this.radius=Math.max(this.radius,t.radius):(sr.subVectors(t.center,this.center).setLength(t.radius),this.expandByPoint(vi.copy(t.center).add(sr)),this.expandByPoint(vi.copy(t.center).sub(sr))),this)}equals(t){return t.center.equals(this.center)&&t.radius===this.radius}clone(){return new this.constructor().copy(this)}},$e=new N,rr=new N,Vi=new N,ln=new N,ar=new N,ki=new N,or=new N,wi=class{constructor(t=new N,e=new N(0,0,-1)){this.origin=t,this.direction=e}set(t,e){return this.origin.copy(t),this.direction.copy(e),this}copy(t){return this.origin.copy(t.origin),this.direction.copy(t.direction),this}at(t,e){return e.copy(this.origin).addScaledVector(this.direction,t)}lookAt(t){return this.direction.copy(t).sub(this.origin).normalize(),this}recast(t){return this.origin.copy(this.at(t,$e)),this}closestPointToPoint(t,e){e.subVectors(t,this.origin);let n=e.dot(this.direction);return n<0?e.copy(this.origin):e.copy(this.origin).addScaledVector(this.direction,n)}distanceToPoint(t){return Math.sqrt(this.distanceSqToPoint(t))}distanceSqToPoint(t){let e=$e.subVectors(t,this.origin).dot(this.direction);return e<0?this.origin.distanceToSquared(t):($e.copy(this.origin).addScaledVector(this.direction,e),$e.distanceToSquared(t))}distanceSqToSegment(t,e,n,s){rr.copy(t).add(e).multiplyScalar(.5),Vi.copy(e).sub(t).normalize(),ln.copy(this.origin).sub(rr);let r=t.distanceTo(e)*.5,o=-this.direction.dot(Vi),a=ln.dot(this.direction),l=-ln.dot(Vi),c=ln.lengthSq(),h=Math.abs(1-o*o),d,f,m,g;if(h>0)if(d=o*l-a,f=o*a-l,g=r*h,d>=0)if(f>=-g)if(f<=g){let x=1/h;d*=x,f*=x,m=d*(d+o*f+2*a)+f*(o*d+f+2*l)+c}else f=r,d=Math.max(0,-(o*f+a)),m=-d*d+f*(f+2*l)+c;else f=-r,d=Math.max(0,-(o*f+a)),m=-d*d+f*(f+2*l)+c;else f<=-g?(d=Math.max(0,-(-o*r+a)),f=d>0?-r:Math.min(Math.max(-r,-l),r),m=-d*d+f*(f+2*l)+c):f<=g?(d=0,f=Math.min(Math.max(-r,-l),r),m=f*(f+2*l)+c):(d=Math.max(0,-(o*r+a)),f=d>0?r:Math.min(Math.max(-r,-l),r),m=-d*d+f*(f+2*l)+c);else f=o>0?-r:r,d=Math.max(0,-(o*f+a)),m=-d*d+f*(f+2*l)+c;return n&&n.copy(this.origin).addScaledVector(this.direction,d),s&&s.copy(rr).addScaledVector(Vi,f),m}intersectSphere(t,e){$e.subVectors(t.center,this.origin);let n=$e.dot(this.direction),s=$e.dot($e)-n*n,r=t.radius*t.radius;if(s>r)return null;let o=Math.sqrt(r-s),a=n-o,l=n+o;return l<0?null:a<0?this.at(l,e):this.at(a,e)}intersectsSphere(t){return this.distanceSqToPoint(t.center)<=t.radius*t.radius}distanceToPlane(t){let e=t.normal.dot(this.direction);if(e===0)return t.distanceToPoint(this.origin)===0?0:null;let n=-(this.origin.dot(t.normal)+t.constant)/e;return n>=0?n:null}intersectPlane(t,e){let n=this.distanceToPlane(t);return n===null?null:this.at(n,e)}intersectsPlane(t){let e=t.distanceToPoint(this.origin);return e===0||t.normal.dot(this.direction)*e<0}intersectBox(t,e){let n,s,r,o,a,l,c=1/this.direction.x,h=1/this.direction.y,d=1/this.direction.z,f=this.origin;return c>=0?(n=(t.min.x-f.x)*c,s=(t.max.x-f.x)*c):(n=(t.max.x-f.x)*c,s=(t.min.x-f.x)*c),h>=0?(r=(t.min.y-f.y)*h,o=(t.max.y-f.y)*h):(r=(t.max.y-f.y)*h,o=(t.min.y-f.y)*h),n>o||r>s||((r>n||isNaN(n))&&(n=r),(o<s||isNaN(s))&&(s=o),d>=0?(a=(t.min.z-f.z)*d,l=(t.max.z-f.z)*d):(a=(t.max.z-f.z)*d,l=(t.min.z-f.z)*d),n>l||a>s)||((a>n||n!==n)&&(n=a),(l<s||s!==s)&&(s=l),s<0)?null:this.at(n>=0?n:s,e)}intersectsBox(t){return this.intersectBox(t,$e)!==null}intersectTriangle(t,e,n,s,r){ar.subVectors(e,t),ki.subVectors(n,t),or.crossVectors(ar,ki);let o=this.direction.dot(or),a;if(o>0){if(s)return null;a=1}else if(o<0)a=-1,o=-o;else return null;ln.subVectors(this.origin,t);let l=a*this.direction.dot(ki.crossVectors(ln,ki));if(l<0)return null;let c=a*this.direction.dot(ar.cross(ln));if(c<0||l+c>o)return null;let h=-a*ln.dot(or);return h<0?null:this.at(h/o,r)}applyMatrix4(t){return this.origin.applyMatrix4(t),this.direction.transformDirection(t),this}equals(t){return t.origin.equals(this.origin)&&t.direction.equals(this.direction)}clone(){return new this.constructor().copy(this)}},oe=class i{constructor(t,e,n,s,r,o,a,l,c,h,d,f,m,g,x,p){i.prototype.isMatrix4=!0,this.elements=[1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1],t!==void 0&&this.set(t,e,n,s,r,o,a,l,c,h,d,f,m,g,x,p)}set(t,e,n,s,r,o,a,l,c,h,d,f,m,g,x,p){let u=this.elements;return u[0]=t,u[4]=e,u[8]=n,u[12]=s,u[1]=r,u[5]=o,u[9]=a,u[13]=l,u[2]=c,u[6]=h,u[10]=d,u[14]=f,u[3]=m,u[7]=g,u[11]=x,u[15]=p,this}identity(){return this.set(1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1),this}clone(){return new i().fromArray(this.elements)}copy(t){let e=this.elements,n=t.elements;return e[0]=n[0],e[1]=n[1],e[2]=n[2],e[3]=n[3],e[4]=n[4],e[5]=n[5],e[6]=n[6],e[7]=n[7],e[8]=n[8],e[9]=n[9],e[10]=n[10],e[11]=n[11],e[12]=n[12],e[13]=n[13],e[14]=n[14],e[15]=n[15],this}copyPosition(t){let e=this.elements,n=t.elements;return e[12]=n[12],e[13]=n[13],e[14]=n[14],this}setFromMatrix3(t){let e=t.elements;return this.set(e[0],e[3],e[6],0,e[1],e[4],e[7],0,e[2],e[5],e[8],0,0,0,0,1),this}extractBasis(t,e,n){return t.setFromMatrixColumn(this,0),e.setFromMatrixColumn(this,1),n.setFromMatrixColumn(this,2),this}makeBasis(t,e,n){return this.set(t.x,e.x,n.x,0,t.y,e.y,n.y,0,t.z,e.z,n.z,0,0,0,0,1),this}extractRotation(t){let e=this.elements,n=t.elements,s=1/Hn.setFromMatrixColumn(t,0).length(),r=1/Hn.setFromMatrixColumn(t,1).length(),o=1/Hn.setFromMatrixColumn(t,2).length();return e[0]=n[0]*s,e[1]=n[1]*s,e[2]=n[2]*s,e[3]=0,e[4]=n[4]*r,e[5]=n[5]*r,e[6]=n[6]*r,e[7]=0,e[8]=n[8]*o,e[9]=n[9]*o,e[10]=n[10]*o,e[11]=0,e[12]=0,e[13]=0,e[14]=0,e[15]=1,this}makeRotationFromEuler(t){let e=this.elements,n=t.x,s=t.y,r=t.z,o=Math.cos(n),a=Math.sin(n),l=Math.cos(s),c=Math.sin(s),h=Math.cos(r),d=Math.sin(r);if(t.order===\"XYZ\"){let f=o*h,m=o*d,g=a*h,x=a*d;e[0]=l*h,e[4]=-l*d,e[8]=c,e[1]=m+g*c,e[5]=f-x*c,e[9]=-a*l,e[2]=x-f*c,e[6]=g+m*c,e[10]=o*l}else if(t.order===\"YXZ\"){let f=l*h,m=l*d,g=c*h,x=c*d;e[0]=f+x*a,e[4]=g*a-m,e[8]=o*c,e[1]=o*d,e[5]=o*h,e[9]=-a,e[2]=m*a-g,e[6]=x+f*a,e[10]=o*l}else if(t.order===\"ZXY\"){let f=l*h,m=l*d,g=c*h,x=c*d;e[0]=f-x*a,e[4]=-o*d,e[8]=g+m*a,e[1]=m+g*a,e[5]=o*h,e[9]=x-f*a,e[2]=-o*c,e[6]=a,e[10]=o*l}else if(t.order===\"ZYX\"){let f=o*h,m=o*d,g=a*h,x=a*d;e[0]=l*h,e[4]=g*c-m,e[8]=f*c+x,e[1]=l*d,e[5]=x*c+f,e[9]=m*c-g,e[2]=-c,e[6]=a*l,e[10]=o*l}else if(t.order===\"YZX\"){let f=o*l,m=o*c,g=a*l,x=a*c;e[0]=l*h,e[4]=x-f*d,e[8]=g*d+m,e[1]=d,e[5]=o*h,e[9]=-a*h,e[2]=-c*h,e[6]=m*d+g,e[10]=f-x*d}else if(t.order===\"XZY\"){let f=o*l,m=o*c,g=a*l,x=a*c;e[0]=l*h,e[4]=-d,e[8]=c*h,e[1]=f*d+x,e[5]=o*h,e[9]=m*d-g,e[2]=g*d-m,e[6]=a*h,e[10]=x*d+f}return e[3]=0,e[7]=0,e[11]=0,e[12]=0,e[13]=0,e[14]=0,e[15]=1,this}makeRotationFromQuaternion(t){return this.compose(bc,t,Ec)}lookAt(t,e,n){let s=this.elements;return Ae.subVectors(t,e),Ae.lengthSq()===0&&(Ae.z=1),Ae.normalize(),cn.crossVectors(n,Ae),cn.lengthSq()===0&&(Math.abs(n.z)===1?Ae.x+=1e-4:Ae.z+=1e-4,Ae.normalize(),cn.crossVectors(n,Ae)),cn.normalize(),Hi.crossVectors(Ae,cn),s[0]=cn.x,s[4]=Hi.x,s[8]=Ae.x,s[1]=cn.y,s[5]=Hi.y,s[9]=Ae.y,s[2]=cn.z,s[6]=Hi.z,s[10]=Ae.z,this}multiply(t){return this.multiplyMatrices(this,t)}premultiply(t){return this.multiplyMatrices(t,this)}multiplyMatrices(t,e){let n=t.elements,s=e.elements,r=this.elements,o=n[0],a=n[4],l=n[8],c=n[12],h=n[1],d=n[5],f=n[9],m=n[13],g=n[2],x=n[6],p=n[10],u=n[14],w=n[3],v=n[7],P=n[11],U=n[15],R=s[0],C=s[4],Y=s[8],S=s[12],b=s[1],H=s[5],K=s[9],T=s[13],E=s[2],L=s[6],F=s[10],I=s[14],G=s[3],X=s[7],Z=s[11],$=s[15];return r[0]=o*R+a*b+l*E+c*G,r[4]=o*C+a*H+l*L+c*X,r[8]=o*Y+a*K+l*F+c*Z,r[12]=o*S+a*T+l*I+c*$,r[1]=h*R+d*b+f*E+m*G,r[5]=h*C+d*H+f*L+m*X,r[9]=h*Y+d*K+f*F+m*Z,r[13]=h*S+d*T+f*I+m*$,r[2]=g*R+x*b+p*E+u*G,r[6]=g*C+x*H+p*L+u*X,r[10]=g*Y+x*K+p*F+u*Z,r[14]=g*S+x*T+p*I+u*$,r[3]=w*R+v*b+P*E+U*G,r[7]=w*C+v*H+P*L+U*X,r[11]=w*Y+v*K+P*F+U*Z,r[15]=w*S+v*T+P*I+U*$,this}multiplyScalar(t){let e=this.elements;return e[0]*=t,e[4]*=t,e[8]*=t,e[12]*=t,e[1]*=t,e[5]*=t,e[9]*=t,e[13]*=t,e[2]*=t,e[6]*=t,e[10]*=t,e[14]*=t,e[3]*=t,e[7]*=t,e[11]*=t,e[15]*=t,this}determinant(){let t=this.elements,e=t[0],n=t[4],s=t[8],r=t[12],o=t[1],a=t[5],l=t[9],c=t[13],h=t[2],d=t[6],f=t[10],m=t[14],g=t[3],x=t[7],p=t[11],u=t[15];return g*(+r*l*d-s*c*d-r*a*f+n*c*f+s*a*m-n*l*m)+x*(+e*l*m-e*c*f+r*o*f-s*o*m+s*c*h-r*l*h)+p*(+e*c*d-e*a*m-r*o*d+n*o*m+r*a*h-n*c*h)+u*(-s*a*h-e*l*d+e*a*f+s*o*d-n*o*f+n*l*h)}transpose(){let t=this.elements,e;return e=t[1],t[1]=t[4],t[4]=e,e=t[2],t[2]=t[8],t[8]=e,e=t[6],t[6]=t[9],t[9]=e,e=t[3],t[3]=t[12],t[12]=e,e=t[7],t[7]=t[13],t[13]=e,e=t[11],t[11]=t[14],t[14]=e,this}setPosition(t,e,n){let s=this.elements;return t.isVector3?(s[12]=t.x,s[13]=t.y,s[14]=t.z):(s[12]=t,s[13]=e,s[14]=n),this}invert(){let t=this.elements,e=t[0],n=t[1],s=t[2],r=t[3],o=t[4],a=t[5],l=t[6],c=t[7],h=t[8],d=t[9],f=t[10],m=t[11],g=t[12],x=t[13],p=t[14],u=t[15],w=d*p*c-x*f*c+x*l*m-a*p*m-d*l*u+a*f*u,v=g*f*c-h*p*c-g*l*m+o*p*m+h*l*u-o*f*u,P=h*x*c-g*d*c+g*a*m-o*x*m-h*a*u+o*d*u,U=g*d*l-h*x*l-g*a*f+o*x*f+h*a*p-o*d*p,R=e*w+n*v+s*P+r*U;if(R===0)return this.set(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);let C=1/R;return t[0]=w*C,t[1]=(x*f*r-d*p*r-x*s*m+n*p*m+d*s*u-n*f*u)*C,t[2]=(a*p*r-x*l*r+x*s*c-n*p*c-a*s*u+n*l*u)*C,t[3]=(d*l*r-a*f*r-d*s*c+n*f*c+a*s*m-n*l*m)*C,t[4]=v*C,t[5]=(h*p*r-g*f*r+g*s*m-e*p*m-h*s*u+e*f*u)*C,t[6]=(g*l*r-o*p*r-g*s*c+e*p*c+o*s*u-e*l*u)*C,t[7]=(o*f*r-h*l*r+h*s*c-e*f*c-o*s*m+e*l*m)*C,t[8]=P*C,t[9]=(g*d*r-h*x*r-g*n*m+e*x*m+h*n*u-e*d*u)*C,t[10]=(o*x*r-g*a*r+g*n*c-e*x*c-o*n*u+e*a*u)*C,t[11]=(h*a*r-o*d*r-h*n*c+e*d*c+o*n*m-e*a*m)*C,t[12]=U*C,t[13]=(h*x*s-g*d*s+g*n*f-e*x*f-h*n*p+e*d*p)*C,t[14]=(g*a*s-o*x*s-g*n*l+e*x*l+o*n*p-e*a*p)*C,t[15]=(o*d*s-h*a*s+h*n*l-e*d*l-o*n*f+e*a*f)*C,this}scale(t){let e=this.elements,n=t.x,s=t.y,r=t.z;return e[0]*=n,e[4]*=s,e[8]*=r,e[1]*=n,e[5]*=s,e[9]*=r,e[2]*=n,e[6]*=s,e[10]*=r,e[3]*=n,e[7]*=s,e[11]*=r,this}getMaxScaleOnAxis(){let t=this.elements,e=t[0]*t[0]+t[1]*t[1]+t[2]*t[2],n=t[4]*t[4]+t[5]*t[5]+t[6]*t[6],s=t[8]*t[8]+t[9]*t[9]+t[10]*t[10];return Math.sqrt(Math.max(e,n,s))}makeTranslation(t,e,n){return t.isVector3?this.set(1,0,0,t.x,0,1,0,t.y,0,0,1,t.z,0,0,0,1):this.set(1,0,0,t,0,1,0,e,0,0,1,n,0,0,0,1),this}makeRotationX(t){let e=Math.cos(t),n=Math.sin(t);return this.set(1,0,0,0,0,e,-n,0,0,n,e,0,0,0,0,1),this}makeRotationY(t){let e=Math.cos(t),n=Math.sin(t);return this.set(e,0,n,0,0,1,0,0,-n,0,e,0,0,0,0,1),this}makeRotationZ(t){let e=Math.cos(t),n=Math.sin(t);return this.set(e,-n,0,0,n,e,0,0,0,0,1,0,0,0,0,1),this}makeRotationAxis(t,e){let n=Math.cos(e),s=Math.sin(e),r=1-n,o=t.x,a=t.y,l=t.z,c=r*o,h=r*a;return this.set(c*o+n,c*a-s*l,c*l+s*a,0,c*a+s*l,h*a+n,h*l-s*o,0,c*l-s*a,h*l+s*o,r*l*l+n,0,0,0,0,1),this}makeScale(t,e,n){return this.set(t,0,0,0,0,e,0,0,0,0,n,0,0,0,0,1),this}makeShear(t,e,n,s,r,o){return this.set(1,n,r,0,t,1,o,0,e,s,1,0,0,0,0,1),this}compose(t,e,n){let s=this.elements,r=e._x,o=e._y,a=e._z,l=e._w,c=r+r,h=o+o,d=a+a,f=r*c,m=r*h,g=r*d,x=o*h,p=o*d,u=a*d,w=l*c,v=l*h,P=l*d,U=n.x,R=n.y,C=n.z;return s[0]=(1-(x+u))*U,s[1]=(m+P)*U,s[2]=(g-v)*U,s[3]=0,s[4]=(m-P)*R,s[5]=(1-(f+u))*R,s[6]=(p+w)*R,s[7]=0,s[8]=(g+v)*C,s[9]=(p-w)*C,s[10]=(1-(f+x))*C,s[11]=0,s[12]=t.x,s[13]=t.y,s[14]=t.z,s[15]=1,this}decompose(t,e,n){let s=this.elements,r=Hn.set(s[0],s[1],s[2]).length(),o=Hn.set(s[4],s[5],s[6]).length(),a=Hn.set(s[8],s[9],s[10]).length();this.determinant()<0&&(r=-r),t.x=s[12],t.y=s[13],t.z=s[14],Oe.copy(this);let c=1/r,h=1/o,d=1/a;return Oe.elements[0]*=c,Oe.elements[1]*=c,Oe.elements[2]*=c,Oe.elements[4]*=h,Oe.elements[5]*=h,Oe.elements[6]*=h,Oe.elements[8]*=d,Oe.elements[9]*=d,Oe.elements[10]*=d,e.setFromRotationMatrix(Oe),n.x=r,n.y=o,n.z=a,this}makePerspective(t,e,n,s,r,o,a=sn){let l=this.elements,c=2*r/(e-t),h=2*r/(n-s),d=(e+t)/(e-t),f=(n+s)/(n-s),m,g;if(a===sn)m=-(o+r)/(o-r),g=-2*o*r/(o-r);else if(a===ps)m=-o/(o-r),g=-o*r/(o-r);else throw new Error(\"THREE.Matrix4.makePerspective(): Invalid coordinate system: \"+a);return l[0]=c,l[4]=0,l[8]=d,l[12]=0,l[1]=0,l[5]=h,l[9]=f,l[13]=0,l[2]=0,l[6]=0,l[10]=m,l[14]=g,l[3]=0,l[7]=0,l[11]=-1,l[15]=0,this}makeOrthographic(t,e,n,s,r,o,a=sn){let l=this.elements,c=1/(e-t),h=1/(n-s),d=1/(o-r),f=(e+t)*c,m=(n+s)*h,g,x;if(a===sn)g=(o+r)*d,x=-2*d;else if(a===ps)g=r*d,x=-1*d;else throw new Error(\"THREE.Matrix4.makeOrthographic(): Invalid coordinate system: \"+a);return l[0]=2*c,l[4]=0,l[8]=0,l[12]=-f,l[1]=0,l[5]=2*h,l[9]=0,l[13]=-m,l[2]=0,l[6]=0,l[10]=x,l[14]=-g,l[3]=0,l[7]=0,l[11]=0,l[15]=1,this}equals(t){let e=this.elements,n=t.elements;for(let s=0;s<16;s++)if(e[s]!==n[s])return!1;return!0}fromArray(t,e=0){for(let n=0;n<16;n++)this.elements[n]=t[n+e];return this}toArray(t=[],e=0){let n=this.elements;return t[e]=n[0],t[e+1]=n[1],t[e+2]=n[2],t[e+3]=n[3],t[e+4]=n[4],t[e+5]=n[5],t[e+6]=n[6],t[e+7]=n[7],t[e+8]=n[8],t[e+9]=n[9],t[e+10]=n[10],t[e+11]=n[11],t[e+12]=n[12],t[e+13]=n[13],t[e+14]=n[14],t[e+15]=n[15],t}},Hn=new N,Oe=new oe,bc=new N(0,0,0),Ec=new N(1,1,1),cn=new N,Hi=new N,Ae=new N,ro=new oe,ao=new vn,vs=class i{constructor(t=0,e=0,n=0,s=i.DEFAULT_ORDER){this.isEuler=!0,this._x=t,this._y=e,this._z=n,this._order=s}get x(){return this._x}set x(t){this._x=t,this._onChangeCallback()}get y(){return this._y}set y(t){this._y=t,this._onChangeCallback()}get z(){return this._z}set z(t){this._z=t,this._onChangeCallback()}get order(){return this._order}set order(t){this._order=t,this._onChangeCallback()}set(t,e,n,s=this._order){return this._x=t,this._y=e,this._z=n,this._order=s,this._onChangeCallback(),this}clone(){return new this.constructor(this._x,this._y,this._z,this._order)}copy(t){return this._x=t._x,this._y=t._y,this._z=t._z,this._order=t._order,this._onChangeCallback(),this}setFromRotationMatrix(t,e=this._order,n=!0){let s=t.elements,r=s[0],o=s[4],a=s[8],l=s[1],c=s[5],h=s[9],d=s[2],f=s[6],m=s[10];switch(e){case\"XYZ\":this._y=Math.asin(Ee(a,-1,1)),Math.abs(a)<.9999999?(this._x=Math.atan2(-h,m),this._z=Math.atan2(-o,r)):(this._x=Math.atan2(f,c),this._z=0);break;case\"YXZ\":this._x=Math.asin(-Ee(h,-1,1)),Math.abs(h)<.9999999?(this._y=Math.atan2(a,m),this._z=Math.atan2(l,c)):(this._y=Math.atan2(-d,r),this._z=0);break;case\"ZXY\":this._x=Math.asin(Ee(f,-1,1)),Math.abs(f)<.9999999?(this._y=Math.atan2(-d,m),this._z=Math.atan2(-o,c)):(this._y=0,this._z=Math.atan2(l,r));break;case\"ZYX\":this._y=Math.asin(-Ee(d,-1,1)),Math.abs(d)<.9999999?(this._x=Math.atan2(f,m),this._z=Math.atan2(l,r)):(this._x=0,this._z=Math.atan2(-o,c));break;case\"YZX\":this._z=Math.asin(Ee(l,-1,1)),Math.abs(l)<.9999999?(this._x=Math.atan2(-h,c),this._y=Math.atan2(-d,r)):(this._x=0,this._y=Math.atan2(a,m));break;case\"XZY\":this._z=Math.asin(-Ee(o,-1,1)),Math.abs(o)<.9999999?(this._x=Math.atan2(f,c),this._y=Math.atan2(a,r)):(this._x=Math.atan2(-h,m),this._y=0);break;default:console.warn(\"THREE.Euler: .setFromRotationMatrix() encountered an unknown order: \"+e)}return this._order=e,n===!0&&this._onChangeCallback(),this}setFromQuaternion(t,e,n){return ro.makeRotationFromQuaternion(t),this.setFromRotationMatrix(ro,e,n)}setFromVector3(t,e=this._order){return this.set(t.x,t.y,t.z,e)}reorder(t){return ao.setFromEuler(this),this.setFromQuaternion(ao,t)}equals(t){return t._x===this._x&&t._y===this._y&&t._z===this._z&&t._order===this._order}fromArray(t){return this._x=t[0],this._y=t[1],this._z=t[2],t[3]!==void 0&&(this._order=t[3]),this._onChangeCallback(),this}toArray(t=[],e=0){return t[e]=this._x,t[e+1]=this._y,t[e+2]=this._z,t[e+3]=this._order,t}_onChange(t){return this._onChangeCallback=t,this}_onChangeCallback(){}*[Symbol.iterator](){yield this._x,yield this._y,yield this._z,yield this._order}};vs.DEFAULT_ORDER=\"XYZ\";var ys=class{constructor(){this.mask=1}set(t){this.mask=(1<<t|0)>>>0}enable(t){this.mask|=1<<t|0}enableAll(){this.mask=-1}toggle(t){this.mask^=1<<t|0}disable(t){this.mask&=~(1<<t|0)}disableAll(){this.mask=0}test(t){return(this.mask&t.mask)!==0}isEnabled(t){return(this.mask&(1<<t|0))!==0}},wc=0,oo=new N,Gn=new vn,Ke=new oe,Gi=new N,yi=new N,Tc=new N,Ac=new vn,lo=new N(1,0,0),co=new N(0,1,0),ho=new N(0,0,1),Cc={type:\"added\"},Rc={type:\"removed\"},Pe=class i extends xn{constructor(){super(),this.isObject3D=!0,Object.defineProperty(this,\"id\",{value:wc++}),this.uuid=Ii(),this.name=\"\",this.type=\"Object3D\",this.parent=null,this.children=[],this.up=i.DEFAULT_UP.clone();let t=new N,e=new vs,n=new vn,s=new N(1,1,1);function r(){n.setFromEuler(e,!1)}function o(){e.setFromQuaternion(n,void 0,!1)}e._onChange(r),n._onChange(o),Object.defineProperties(this,{position:{configurable:!0,enumerable:!0,value:t},rotation:{configurable:!0,enumerable:!0,value:e},quaternion:{configurable:!0,enumerable:!0,value:n},scale:{configurable:!0,enumerable:!0,value:s},modelViewMatrix:{value:new oe},normalMatrix:{value:new zt}}),this.matrix=new oe,this.matrixWorld=new oe,this.matrixAutoUpdate=i.DEFAULT_MATRIX_AUTO_UPDATE,this.matrixWorldAutoUpdate=i.DEFAULT_MATRIX_WORLD_AUTO_UPDATE,this.matrixWorldNeedsUpdate=!1,this.layers=new ys,this.visible=!0,this.castShadow=!1,this.receiveShadow=!1,this.frustumCulled=!0,this.renderOrder=0,this.animations=[],this.userData={}}onBeforeShadow(){}onAfterShadow(){}onBeforeRender(){}onAfterRender(){}applyMatrix4(t){this.matrixAutoUpdate&&this.updateMatrix(),this.matrix.premultiply(t),this.matrix.decompose(this.position,this.quaternion,this.scale)}applyQuaternion(t){return this.quaternion.premultiply(t),this}setRotationFromAxisAngle(t,e){this.quaternion.setFromAxisAngle(t,e)}setRotationFromEuler(t){this.quaternion.setFromEuler(t,!0)}setRotationFromMatrix(t){this.quaternion.setFromRotationMatrix(t)}setRotationFromQuaternion(t){this.quaternion.copy(t)}rotateOnAxis(t,e){return Gn.setFromAxisAngle(t,e),this.quaternion.multiply(Gn),this}rotateOnWorldAxis(t,e){return Gn.setFromAxisAngle(t,e),this.quaternion.premultiply(Gn),this}rotateX(t){return this.rotateOnAxis(lo,t)}rotateY(t){return this.rotateOnAxis(co,t)}rotateZ(t){return this.rotateOnAxis(ho,t)}translateOnAxis(t,e){return oo.copy(t).applyQuaternion(this.quaternion),this.position.add(oo.multiplyScalar(e)),this}translateX(t){return this.translateOnAxis(lo,t)}translateY(t){return this.translateOnAxis(co,t)}translateZ(t){return this.translateOnAxis(ho,t)}localToWorld(t){return this.updateWorldMatrix(!0,!1),t.applyMatrix4(this.matrixWorld)}worldToLocal(t){return this.updateWorldMatrix(!0,!1),t.applyMatrix4(Ke.copy(this.matrixWorld).invert())}lookAt(t,e,n){t.isVector3?Gi.copy(t):Gi.set(t,e,n);let s=this.parent;this.updateWorldMatrix(!0,!1),yi.setFromMatrixPosition(this.matrixWorld),this.isCamera||this.isLight?Ke.lookAt(yi,Gi,this.up):Ke.lookAt(Gi,yi,this.up),this.quaternion.setFromRotationMatrix(Ke),s&&(Ke.extractRotation(s.matrixWorld),Gn.setFromRotationMatrix(Ke),this.quaternion.premultiply(Gn.invert()))}add(t){if(arguments.length>1){for(let e=0;e<arguments.length;e++)this.add(arguments[e]);return this}return t===this?(console.error(\"THREE.Object3D.add: object can't be added as a child of itself.\",t),this):(t&&t.isObject3D?(t.parent!==null&&t.parent.remove(t),t.parent=this,this.children.push(t),t.dispatchEvent(Cc)):console.error(\"THREE.Object3D.add: object not an instance of THREE.Object3D.\",t),this)}remove(t){if(arguments.length>1){for(let n=0;n<arguments.length;n++)this.remove(arguments[n]);return this}let e=this.children.indexOf(t);return e!==-1&&(t.parent=null,this.children.splice(e,1),t.dispatchEvent(Rc)),this}removeFromParent(){let t=this.parent;return t!==null&&t.remove(this),this}clear(){return this.remove(...this.children)}attach(t){return this.updateWorldMatrix(!0,!1),Ke.copy(this.matrixWorld).invert(),t.parent!==null&&(t.parent.updateWorldMatrix(!0,!1),Ke.multiply(t.parent.matrixWorld)),t.applyMatrix4(Ke),this.add(t),t.updateWorldMatrix(!1,!0),this}getObjectById(t){return this.getObjectByProperty(\"id\",t)}getObjectByName(t){return this.getObjectByProperty(\"name\",t)}getObjectByProperty(t,e){if(this[t]===e)return this;for(let n=0,s=this.children.length;n<s;n++){let o=this.children[n].getObjectByProperty(t,e);if(o!==void 0)return o}}getObjectsByProperty(t,e,n=[]){this[t]===e&&n.push(this);let s=this.children;for(let r=0,o=s.length;r<o;r++)s[r].getObjectsByProperty(t,e,n);return n}getWorldPosition(t){return this.updateWorldMatrix(!0,!1),t.setFromMatrixPosition(this.matrixWorld)}getWorldQuaternion(t){return this.updateWorldMatrix(!0,!1),this.matrixWorld.decompose(yi,t,Tc),t}getWorldScale(t){return this.updateWorldMatrix(!0,!1),this.matrixWorld.decompose(yi,Ac,t),t}getWorldDirection(t){this.updateWorldMatrix(!0,!1);let e=this.matrixWorld.elements;return t.set(e[8],e[9],e[10]).normalize()}raycast(){}traverse(t){t(this);let e=this.children;for(let n=0,s=e.length;n<s;n++)e[n].traverse(t)}traverseVisible(t){if(this.visible===!1)return;t(this);let e=this.children;for(let n=0,s=e.length;n<s;n++)e[n].traverseVisible(t)}traverseAncestors(t){let e=this.parent;e!==null&&(t(e),e.traverseAncestors(t))}updateMatrix(){this.matrix.compose(this.position,this.quaternion,this.scale),this.matrixWorldNeedsUpdate=!0}updateMatrixWorld(t){this.matrixAutoUpdate&&this.updateMatrix(),(this.matrixWorldNeedsUpdate||t)&&(this.parent===null?this.matrixWorld.copy(this.matrix):this.matrixWorld.multiplyMatrices(this.parent.matrixWorld,this.matrix),this.matrixWorldNeedsUpdate=!1,t=!0);let e=this.children;for(let n=0,s=e.length;n<s;n++){let r=e[n];(r.matrixWorldAutoUpdate===!0||t===!0)&&r.updateMatrixWorld(t)}}updateWorldMatrix(t,e){let n=this.parent;if(t===!0&&n!==null&&n.matrixWorldAutoUpdate===!0&&n.updateWorldMatrix(!0,!1),this.matrixAutoUpdate&&this.updateMatrix(),this.parent===null?this.matrixWorld.copy(this.matrix):this.matrixWorld.multiplyMatrices(this.parent.matrixWorld,this.matrix),e===!0){let s=this.children;for(let r=0,o=s.length;r<o;r++){let a=s[r];a.matrixWorldAutoUpdate===!0&&a.updateWorldMatrix(!1,!0)}}}toJSON(t){let e=t===void 0||typeof t==\"string\",n={};e&&(t={geometries:{},materials:{},textures:{},images:{},shapes:{},skeletons:{},animations:{},nodes:{}},n.metadata={version:4.6,type:\"Object\",generator:\"Object3D.toJSON\"});let s={};s.uuid=this.uuid,s.type=this.type,this.name!==\"\"&&(s.name=this.name),this.castShadow===!0&&(s.castShadow=!0),this.receiveShadow===!0&&(s.receiveShadow=!0),this.visible===!1&&(s.visible=!1),this.frustumCulled===!1&&(s.frustumCulled=!1),this.renderOrder!==0&&(s.renderOrder=this.renderOrder),Object.keys(this.userData).length>0&&(s.userData=this.userData),s.layers=this.layers.mask,s.matrix=this.matrix.toArray(),s.up=this.up.toArray(),this.matrixAutoUpdate===!1&&(s.matrixAutoUpdate=!1),this.isInstancedMesh&&(s.type=\"InstancedMesh\",s.count=this.count,s.instanceMatrix=this.instanceMatrix.toJSON(),this.instanceColor!==null&&(s.instanceColor=this.instanceColor.toJSON())),this.isBatchedMesh&&(s.type=\"BatchedMesh\",s.perObjectFrustumCulled=this.perObjectFrustumCulled,s.sortObjects=this.sortObjects,s.drawRanges=this._drawRanges,s.reservedRanges=this._reservedRanges,s.visibility=this._visibility,s.active=this._active,s.bounds=this._bounds.map(a=>({boxInitialized:a.boxInitialized,boxMin:a.box.min.toArray(),boxMax:a.box.max.toArray(),sphereInitialized:a.sphereInitialized,sphereRadius:a.sphere.radius,sphereCenter:a.sphere.center.toArray()})),s.maxGeometryCount=this._maxGeometryCount,s.maxVertexCount=this._maxVertexCount,s.maxIndexCount=this._maxIndexCount,s.geometryInitialized=this._geometryInitialized,s.geometryCount=this._geometryCount,s.matricesTexture=this._matricesTexture.toJSON(t),this.boundingSphere!==null&&(s.boundingSphere={center:s.boundingSphere.center.toArray(),radius:s.boundingSphere.radius}),this.boundingBox!==null&&(s.boundingBox={min:s.boundingBox.min.toArray(),max:s.boundingBox.max.toArray()}));function r(a,l){return a[l.uuid]===void 0&&(a[l.uuid]=l.toJSON(t)),l.uuid}if(this.isScene)this.background&&(this.background.isColor?s.background=this.background.toJSON():this.background.isTexture&&(s.background=this.background.toJSON(t).uuid)),this.environment&&this.environment.isTexture&&this.environment.isRenderTargetTexture!==!0&&(s.environment=this.environment.toJSON(t).uuid);else if(this.isMesh||this.isLine||this.isPoints){s.geometry=r(t.geometries,this.geometry);let a=this.geometry.parameters;if(a!==void 0&&a.shapes!==void 0){let l=a.shapes;if(Array.isArray(l))for(let c=0,h=l.length;c<h;c++){let d=l[c];r(t.shapes,d)}else r(t.shapes,l)}}if(this.isSkinnedMesh&&(s.bindMode=this.bindMode,s.bindMatrix=this.bindMatrix.toArray(),this.skeleton!==void 0&&(r(t.skeletons,this.skeleton),s.skeleton=this.skeleton.uuid)),this.material!==void 0)if(Array.isArray(this.material)){let a=[];for(let l=0,c=this.material.length;l<c;l++)a.push(r(t.materials,this.material[l]));s.material=a}else s.material=r(t.materials,this.material);if(this.children.length>0){s.children=[];for(let a=0;a<this.children.length;a++)s.children.push(this.children[a].toJSON(t).object)}if(this.animations.length>0){s.animations=[];for(let a=0;a<this.animations.length;a++){let l=this.animations[a];s.animations.push(r(t.animations,l))}}if(e){let a=o(t.geometries),l=o(t.materials),c=o(t.textures),h=o(t.images),d=o(t.shapes),f=o(t.skeletons),m=o(t.animations),g=o(t.nodes);a.length>0&&(n.geometries=a),l.length>0&&(n.materials=l),c.length>0&&(n.textures=c),h.length>0&&(n.images=h),d.length>0&&(n.shapes=d),f.length>0&&(n.skeletons=f),m.length>0&&(n.animations=m),g.length>0&&(n.nodes=g)}return n.object=s,n;function o(a){let l=[];for(let c in a){let h=a[c];delete h.metadata,l.push(h)}return l}}clone(t){return new this.constructor().copy(this,t)}copy(t,e=!0){if(this.name=t.name,this.up.copy(t.up),this.position.copy(t.position),this.rotation.order=t.rotation.order,this.quaternion.copy(t.quaternion),this.scale.copy(t.scale),this.matrix.copy(t.matrix),this.matrixWorld.copy(t.matrixWorld),this.matrixAutoUpdate=t.matrixAutoUpdate,this.matrixWorldAutoUpdate=t.matrixWorldAutoUpdate,this.matrixWorldNeedsUpdate=t.matrixWorldNeedsUpdate,this.layers.mask=t.layers.mask,this.visible=t.visible,this.castShadow=t.castShadow,this.receiveShadow=t.receiveShadow,this.frustumCulled=t.frustumCulled,this.renderOrder=t.renderOrder,this.animations=t.animations.slice(),this.userData=JSON.parse(JSON.stringify(t.userData)),e===!0)for(let n=0;n<t.children.length;n++){let s=t.children[n];this.add(s.clone())}return this}};Pe.DEFAULT_UP=new N(0,1,0);Pe.DEFAULT_MATRIX_AUTO_UPDATE=!0;Pe.DEFAULT_MATRIX_WORLD_AUTO_UPDATE=!0;var Be=new N,Qe=new N,lr=new N,je=new N,Wn=new N,Xn=new N,uo=new N,cr=new N,hr=new N,ur=new N,Wi=!1,jn=class i{constructor(t=new N,e=new N,n=new N){this.a=t,this.b=e,this.c=n}static getNormal(t,e,n,s){s.subVectors(n,e),Be.subVectors(t,e),s.cross(Be);let r=s.lengthSq();return r>0?s.multiplyScalar(1/Math.sqrt(r)):s.set(0,0,0)}static getBarycoord(t,e,n,s,r){Be.subVectors(s,e),Qe.subVectors(n,e),lr.subVectors(t,e);let o=Be.dot(Be),a=Be.dot(Qe),l=Be.dot(lr),c=Qe.dot(Qe),h=Qe.dot(lr),d=o*c-a*a;if(d===0)return r.set(0,0,0),null;let f=1/d,m=(c*l-a*h)*f,g=(o*h-a*l)*f;return r.set(1-m-g,g,m)}static containsPoint(t,e,n,s){return this.getBarycoord(t,e,n,s,je)===null?!1:je.x>=0&&je.y>=0&&je.x+je.y<=1}static getUV(t,e,n,s,r,o,a,l){return Wi===!1&&(console.warn(\"THREE.Triangle.getUV() has been renamed to THREE.Triangle.getInterpolation().\"),Wi=!0),this.getInterpolation(t,e,n,s,r,o,a,l)}static getInterpolation(t,e,n,s,r,o,a,l){return this.getBarycoord(t,e,n,s,je)===null?(l.x=0,l.y=0,\"z\"in l&&(l.z=0),\"w\"in l&&(l.w=0),null):(l.setScalar(0),l.addScaledVector(r,je.x),l.addScaledVector(o,je.y),l.addScaledVector(a,je.z),l)}static isFrontFacing(t,e,n,s){return Be.subVectors(n,e),Qe.subVectors(t,e),Be.cross(Qe).dot(s)<0}set(t,e,n){return this.a.copy(t),this.b.copy(e),this.c.copy(n),this}setFromPointsAndIndices(t,e,n,s){return this.a.copy(t[e]),this.b.copy(t[n]),this.c.copy(t[s]),this}setFromAttributeAndIndices(t,e,n,s){return this.a.fromBufferAttribute(t,e),this.b.fromBufferAttribute(t,n),this.c.fromBufferAttribute(t,s),this}clone(){return new this.constructor().copy(this)}copy(t){return this.a.copy(t.a),this.b.copy(t.b),this.c.copy(t.c),this}getArea(){return Be.subVectors(this.c,this.b),Qe.subVectors(this.a,this.b),Be.cross(Qe).length()*.5}getMidpoint(t){return t.addVectors(this.a,this.b).add(this.c).multiplyScalar(1/3)}getNormal(t){return i.getNormal(this.a,this.b,this.c,t)}getPlane(t){return t.setFromCoplanarPoints(this.a,this.b,this.c)}getBarycoord(t,e){return i.getBarycoord(t,this.a,this.b,this.c,e)}getUV(t,e,n,s,r){return Wi===!1&&(console.warn(\"THREE.Triangle.getUV() has been renamed to THREE.Triangle.getInterpolation().\"),Wi=!0),i.getInterpolation(t,this.a,this.b,this.c,e,n,s,r)}getInterpolation(t,e,n,s,r){return i.getInterpolation(t,this.a,this.b,this.c,e,n,s,r)}containsPoint(t){return i.containsPoint(t,this.a,this.b,this.c)}isFrontFacing(t){return i.isFrontFacing(this.a,this.b,this.c,t)}intersectsBox(t){return t.intersectsTriangle(this)}closestPointToPoint(t,e){let n=this.a,s=this.b,r=this.c,o,a;Wn.subVectors(s,n),Xn.subVectors(r,n),cr.subVectors(t,n);let l=Wn.dot(cr),c=Xn.dot(cr);if(l<=0&&c<=0)return e.copy(n);hr.subVectors(t,s);let h=Wn.dot(hr),d=Xn.dot(hr);if(h>=0&&d<=h)return e.copy(s);let f=l*d-h*c;if(f<=0&&l>=0&&h<=0)return o=l/(l-h),e.copy(n).addScaledVector(Wn,o);ur.subVectors(t,r);let m=Wn.dot(ur),g=Xn.dot(ur);if(g>=0&&m<=g)return e.copy(r);let x=m*c-l*g;if(x<=0&&c>=0&&g<=0)return a=c/(c-g),e.copy(n).addScaledVector(Xn,a);let p=h*g-m*d;if(p<=0&&d-h>=0&&m-g>=0)return uo.subVectors(r,s),a=(d-h)/(d-h+(m-g)),e.copy(s).addScaledVector(uo,a);let u=1/(p+x+f);return o=x*u,a=f*u,e.copy(n).addScaledVector(Wn,o).addScaledVector(Xn,a)}equals(t){return t.a.equals(this.a)&&t.b.equals(this.b)&&t.c.equals(this.c)}},sl={aliceblue:15792383,antiquewhite:16444375,aqua:65535,aquamarine:8388564,azure:15794175,beige:16119260,bisque:16770244,black:0,blanchedalmond:16772045,blue:255,blueviolet:9055202,brown:10824234,burlywood:14596231,cadetblue:6266528,chartreuse:8388352,chocolate:13789470,coral:16744272,cornflowerblue:6591981,cornsilk:16775388,crimson:14423100,cyan:65535,darkblue:139,darkcyan:35723,darkgoldenrod:12092939,darkgray:11119017,darkgreen:25600,darkgrey:11119017,darkkhaki:12433259,darkmagenta:9109643,darkolivegreen:5597999,darkorange:16747520,darkorchid:10040012,darkred:9109504,darksalmon:15308410,darkseagreen:9419919,darkslateblue:4734347,darkslategray:3100495,darkslategrey:3100495,darkturquoise:52945,darkviolet:9699539,deeppink:16716947,deepskyblue:49151,dimgray:6908265,dimgrey:6908265,dodgerblue:2003199,firebrick:11674146,floralwhite:16775920,forestgreen:2263842,fuchsia:16711935,gainsboro:14474460,ghostwhite:16316671,gold:16766720,goldenrod:14329120,gray:8421504,green:32768,greenyellow:11403055,grey:8421504,honeydew:15794160,hotpink:16738740,indianred:13458524,indigo:4915330,ivory:16777200,khaki:15787660,lavender:15132410,lavenderblush:16773365,lawngreen:8190976,lemonchiffon:16775885,lightblue:11393254,lightcoral:15761536,lightcyan:14745599,lightgoldenrodyellow:16448210,lightgray:13882323,lightgreen:9498256,lightgrey:13882323,lightpink:16758465,lightsalmon:16752762,lightseagreen:2142890,lightskyblue:8900346,lightslategray:7833753,lightslategrey:7833753,lightsteelblue:11584734,lightyellow:16777184,lime:65280,limegreen:3329330,linen:16445670,magenta:16711935,maroon:8388608,mediumaquamarine:6737322,mediumblue:205,mediumorchid:12211667,mediumpurple:9662683,mediumseagreen:3978097,mediumslateblue:8087790,mediumspringgreen:64154,mediumturquoise:4772300,mediumvioletred:13047173,midnightblue:1644912,mintcream:16121850,mistyrose:16770273,moccasin:16770229,navajowhite:16768685,navy:128,oldlace:16643558,olive:8421376,olivedrab:7048739,orange:16753920,orangered:16729344,orchid:14315734,palegoldenrod:15657130,palegreen:10025880,paleturquoise:11529966,palevioletred:14381203,papayawhip:16773077,peachpuff:16767673,peru:13468991,pink:16761035,plum:14524637,powderblue:11591910,purple:8388736,rebeccapurple:6697881,red:16711680,rosybrown:12357519,royalblue:4286945,saddlebrown:9127187,salmon:16416882,sandybrown:16032864,seagreen:3050327,seashell:16774638,sienna:10506797,silver:12632256,skyblue:8900331,slateblue:6970061,slategray:7372944,slategrey:7372944,snow:16775930,springgreen:65407,steelblue:4620980,tan:13808780,teal:32896,thistle:14204888,tomato:16737095,turquoise:4251856,violet:15631086,wheat:16113331,white:16777215,whitesmoke:16119285,yellow:16776960,yellowgreen:10145074},hn={h:0,s:0,l:0},Xi={h:0,s:0,l:0};function dr(i,t,e){return e<0&&(e+=1),e>1&&(e-=1),e<1/6?i+(t-i)*6*e:e<1/2?t:e<2/3?i+(t-i)*6*(2/3-e):i}var Pt=class{constructor(t,e,n){return this.isColor=!0,this.r=1,this.g=1,this.b=1,this.set(t,e,n)}set(t,e,n){if(e===void 0&&n===void 0){let s=t;s&&s.isColor?this.copy(s):typeof s==\"number\"?this.setHex(s):typeof s==\"string\"&&this.setStyle(s)}else this.setRGB(t,e,n);return this}setScalar(t){return this.r=t,this.g=t,this.b=t,this}setHex(t,e=ce){return t=Math.floor(t),this.r=(t>>16&255)/255,this.g=(t>>8&255)/255,this.b=(t&255)/255,Wt.toWorkingColorSpace(this,e),this}setRGB(t,e,n,s=Wt.workingColorSpace){return this.r=t,this.g=e,this.b=n,Wt.toWorkingColorSpace(this,s),this}setHSL(t,e,n,s=Wt.workingColorSpace){if(t=_c(t,1),e=Ee(e,0,1),n=Ee(n,0,1),e===0)this.r=this.g=this.b=n;else{let r=n<=.5?n*(1+e):n+e-n*e,o=2*n-r;this.r=dr(o,r,t+1/3),this.g=dr(o,r,t),this.b=dr(o,r,t-1/3)}return Wt.toWorkingColorSpace(this,s),this}setStyle(t,e=ce){function n(r){r!==void 0&&parseFloat(r)<1&&console.warn(\"THREE.Color: Alpha component of \"+t+\" will be ignored.\")}let s;if(s=/^(\\w+)\\(([^\\)]*)\\)/.exec(t)){let r,o=s[1],a=s[2];switch(o){case\"rgb\":case\"rgba\":if(r=/^\\s*(\\d+)\\s*,\\s*(\\d+)\\s*,\\s*(\\d+)\\s*(?:,\\s*(\\d*\\.?\\d+)\\s*)?$/.exec(a))return n(r[4]),this.setRGB(Math.min(255,parseInt(r[1],10))/255,Math.min(255,parseInt(r[2],10))/255,Math.min(255,parseInt(r[3],10))/255,e);if(r=/^\\s*(\\d+)\\%\\s*,\\s*(\\d+)\\%\\s*,\\s*(\\d+)\\%\\s*(?:,\\s*(\\d*\\.?\\d+)\\s*)?$/.exec(a))return n(r[4]),this.setRGB(Math.min(100,parseInt(r[1],10))/100,Math.min(100,parseInt(r[2],10))/100,Math.min(100,parseInt(r[3],10))/100,e);break;case\"hsl\":case\"hsla\":if(r=/^\\s*(\\d*\\.?\\d+)\\s*,\\s*(\\d*\\.?\\d+)\\%\\s*,\\s*(\\d*\\.?\\d+)\\%\\s*(?:,\\s*(\\d*\\.?\\d+)\\s*)?$/.exec(a))return n(r[4]),this.setHSL(parseFloat(r[1])/360,parseFloat(r[2])/100,parseFloat(r[3])/100,e);break;default:console.warn(\"THREE.Color: Unknown color model \"+t)}}else if(s=/^\\#([A-Fa-f\\d]+)$/.exec(t)){let r=s[1],o=r.length;if(o===3)return this.setRGB(parseInt(r.charAt(0),16)/15,parseInt(r.charAt(1),16)/15,parseInt(r.charAt(2),16)/15,e);if(o===6)return this.setHex(parseInt(r,16),e);console.warn(\"THREE.Color: Invalid hex color \"+t)}else if(t&&t.length>0)return this.setColorName(t,e);return this}setColorName(t,e=ce){let n=sl[t.toLowerCase()];return n!==void 0?this.setHex(n,e):console.warn(\"THREE.Color: Unknown color \"+t),this}clone(){return new this.constructor(this.r,this.g,this.b)}copy(t){return this.r=t.r,this.g=t.g,this.b=t.b,this}copySRGBToLinear(t){return this.r=ii(t.r),this.g=ii(t.g),this.b=ii(t.b),this}copyLinearToSRGB(t){return this.r=tr(t.r),this.g=tr(t.g),this.b=tr(t.b),this}convertSRGBToLinear(){return this.copySRGBToLinear(this),this}convertLinearToSRGB(){return this.copyLinearToSRGB(this),this}getHex(t=ce){return Wt.fromWorkingColorSpace(pe.copy(this),t),Math.round(Ee(pe.r*255,0,255))*65536+Math.round(Ee(pe.g*255,0,255))*256+Math.round(Ee(pe.b*255,0,255))}getHexString(t=ce){return(\"000000\"+this.getHex(t).toString(16)).slice(-6)}getHSL(t,e=Wt.workingColorSpace){Wt.fromWorkingColorSpace(pe.copy(this),e);let n=pe.r,s=pe.g,r=pe.b,o=Math.max(n,s,r),a=Math.min(n,s,r),l,c,h=(a+o)/2;if(a===o)l=0,c=0;else{let d=o-a;switch(c=h<=.5?d/(o+a):d/(2-o-a),o){case n:l=(s-r)/d+(s<r?6:0);break;case s:l=(r-n)/d+2;break;case r:l=(n-s)/d+4;break}l/=6}return t.h=l,t.s=c,t.l=h,t}getRGB(t,e=Wt.workingColorSpace){return Wt.fromWorkingColorSpace(pe.copy(this),e),t.r=pe.r,t.g=pe.g,t.b=pe.b,t}getStyle(t=ce){Wt.fromWorkingColorSpace(pe.copy(this),t);let e=pe.r,n=pe.g,s=pe.b;return t!==ce?`color(${t} ${e.toFixed(3)} ${n.toFixed(3)} ${s.toFixed(3)})`:`rgb(${Math.round(e*255)},${Math.round(n*255)},${Math.round(s*255)})`}offsetHSL(t,e,n){return this.getHSL(hn),this.setHSL(hn.h+t,hn.s+e,hn.l+n)}add(t){return this.r+=t.r,this.g+=t.g,this.b+=t.b,this}addColors(t,e){return this.r=t.r+e.r,this.g=t.g+e.g,this.b=t.b+e.b,this}addScalar(t){return this.r+=t,this.g+=t,this.b+=t,this}sub(t){return this.r=Math.max(0,this.r-t.r),this.g=Math.max(0,this.g-t.g),this.b=Math.max(0,this.b-t.b),this}multiply(t){return this.r*=t.r,this.g*=t.g,this.b*=t.b,this}multiplyScalar(t){return this.r*=t,this.g*=t,this.b*=t,this}lerp(t,e){return this.r+=(t.r-this.r)*e,this.g+=(t.g-this.g)*e,this.b+=(t.b-this.b)*e,this}lerpColors(t,e,n){return this.r=t.r+(e.r-t.r)*n,this.g=t.g+(e.g-t.g)*n,this.b=t.b+(e.b-t.b)*n,this}lerpHSL(t,e){this.getHSL(hn),t.getHSL(Xi);let n=Qs(hn.h,Xi.h,e),s=Qs(hn.s,Xi.s,e),r=Qs(hn.l,Xi.l,e);return this.setHSL(n,s,r),this}setFromVector3(t){return this.r=t.x,this.g=t.y,this.b=t.z,this}applyMatrix3(t){let e=this.r,n=this.g,s=this.b,r=t.elements;return this.r=r[0]*e+r[3]*n+r[6]*s,this.g=r[1]*e+r[4]*n+r[7]*s,this.b=r[2]*e+r[5]*n+r[8]*s,this}equals(t){return t.r===this.r&&t.g===this.g&&t.b===this.b}fromArray(t,e=0){return this.r=t[e],this.g=t[e+1],this.b=t[e+2],this}toArray(t=[],e=0){return t[e]=this.r,t[e+1]=this.g,t[e+2]=this.b,t}fromBufferAttribute(t,e){return this.r=t.getX(e),this.g=t.getY(e),this.b=t.getZ(e),this}toJSON(){return this.getHex()}*[Symbol.iterator](){yield this.r,yield this.g,yield this.b}},pe=new Pt;Pt.NAMES=sl;var Pc=0,yn=class extends xn{constructor(){super(),this.isMaterial=!0,Object.defineProperty(this,\"id\",{value:Pc++}),this.uuid=Ii(),this.name=\"\",this.type=\"Material\",this.blending=ni,this.side=gn,this.vertexColors=!1,this.opacity=1,this.transparent=!1,this.alphaHash=!1,this.blendSrc=Sr,this.blendDst=br,this.blendEquation=Cn,this.blendSrcAlpha=null,this.blendDstAlpha=null,this.blendEquationAlpha=null,this.blendColor=new Pt(0,0,0),this.blendAlpha=0,this.depthFunc=ls,this.depthTest=!0,this.depthWrite=!0,this.stencilWriteMask=255,this.stencilFunc=Ka,this.stencilRef=0,this.stencilFuncMask=255,this.stencilFail=On,this.stencilZFail=On,this.stencilZPass=On,this.stencilWrite=!1,this.clippingPlanes=null,this.clipIntersection=!1,this.clipShadows=!1,this.shadowSide=null,this.colorWrite=!0,this.precision=null,this.polygonOffset=!1,this.polygonOffsetFactor=0,this.polygonOffsetUnits=0,this.dithering=!1,this.alphaToCoverage=!1,this.premultipliedAlpha=!1,this.forceSinglePass=!1,this.visible=!0,this.toneMapped=!0,this.userData={},this.version=0,this._alphaTest=0}get alphaTest(){return this._alphaTest}set alphaTest(t){this._alphaTest>0!=t>0&&this.version++,this._alphaTest=t}onBuild(){}onBeforeRender(){}onBeforeCompile(){}customProgramCacheKey(){return this.onBeforeCompile.toString()}setValues(t){if(t!==void 0)for(let e in t){let n=t[e];if(n===void 0){console.warn(`THREE.Material: parameter '${e}' has value of undefined.`);continue}let s=this[e];if(s===void 0){console.warn(`THREE.Material: '${e}' is not a property of THREE.${this.type}.`);continue}s&&s.isColor?s.set(n):s&&s.isVector3&&n&&n.isVector3?s.copy(n):this[e]=n}}toJSON(t){let e=t===void 0||typeof t==\"string\";e&&(t={textures:{},images:{}});let n={metadata:{version:4.6,type:\"Material\",generator:\"Material.toJSON\"}};n.uuid=this.uuid,n.type=this.type,this.name!==\"\"&&(n.name=this.name),this.color&&this.color.isColor&&(n.color=this.color.getHex()),this.roughness!==void 0&&(n.roughness=this.roughness),this.metalness!==void 0&&(n.metalness=this.metalness),this.sheen!==void 0&&(n.sheen=this.sheen),this.sheenColor&&this.sheenColor.isColor&&(n.sheenColor=this.sheenColor.getHex()),this.sheenRoughness!==void 0&&(n.sheenRoughness=this.sheenRoughness),this.emissive&&this.emissive.isColor&&(n.emissive=this.emissive.getHex()),this.emissiveIntensity&&this.emissiveIntensity!==1&&(n.emissiveIntensity=this.emissiveIntensity),this.specular&&this.specular.isColor&&(n.specular=this.specular.getHex()),this.specularIntensity!==void 0&&(n.specularIntensity=this.specularIntensity),this.specularColor&&this.specularColor.isColor&&(n.specularColor=this.specularColor.getHex()),this.shininess!==void 0&&(n.shininess=this.shininess),this.clearcoat!==void 0&&(n.clearcoat=this.clearcoat),this.clearcoatRoughness!==void 0&&(n.clearcoatRoughness=this.clearcoatRoughness),this.clearcoatMap&&this.clearcoatMap.isTexture&&(n.clearcoatMap=this.clearcoatMap.toJSON(t).uuid),this.clearcoatRoughnessMap&&this.clearcoatRoughnessMap.isTexture&&(n.clearcoatRoughnessMap=this.clearcoatRoughnessMap.toJSON(t).uuid),this.clearcoatNormalMap&&this.clearcoatNormalMap.isTexture&&(n.clearcoatNormalMap=this.clearcoatNormalMap.toJSON(t).uuid,n.clearcoatNormalScale=this.clearcoatNormalScale.toArray()),this.iridescence!==void 0&&(n.iridescence=this.iridescence),this.iridescenceIOR!==void 0&&(n.iridescenceIOR=this.iridescenceIOR),this.iridescenceThicknessRange!==void 0&&(n.iridescenceThicknessRange=this.iridescenceThicknessRange),this.iridescenceMap&&this.iridescenceMap.isTexture&&(n.iridescenceMap=this.iridescenceMap.toJSON(t).uuid),this.iridescenceThicknessMap&&this.iridescenceThicknessMap.isTexture&&(n.iridescenceThicknessMap=this.iridescenceThicknessMap.toJSON(t).uuid),this.anisotropy!==void 0&&(n.anisotropy=this.anisotropy),this.anisotropyRotation!==void 0&&(n.anisotropyRotation=this.anisotropyRotation),this.anisotropyMap&&this.anisotropyMap.isTexture&&(n.anisotropyMap=this.anisotropyMap.toJSON(t).uuid),this.map&&this.map.isTexture&&(n.map=this.map.toJSON(t).uuid),this.matcap&&this.matcap.isTexture&&(n.matcap=this.matcap.toJSON(t).uuid),this.alphaMap&&this.alphaMap.isTexture&&(n.alphaMap=this.alphaMap.toJSON(t).uuid),this.lightMap&&this.lightMap.isTexture&&(n.lightMap=this.lightMap.toJSON(t).uuid,n.lightMapIntensity=this.lightMapIntensity),this.aoMap&&this.aoMap.isTexture&&(n.aoMap=this.aoMap.toJSON(t).uuid,n.aoMapIntensity=this.aoMapIntensity),this.bumpMap&&this.bumpMap.isTexture&&(n.bumpMap=this.bumpMap.toJSON(t).uuid,n.bumpScale=this.bumpScale),this.normalMap&&this.normalMap.isTexture&&(n.normalMap=this.normalMap.toJSON(t).uuid,n.normalMapType=this.normalMapType,n.normalScale=this.normalScale.toArray()),this.displacementMap&&this.displacementMap.isTexture&&(n.displacementMap=this.displacementMap.toJSON(t).uuid,n.displacementScale=this.displacementScale,n.displacementBias=this.displacementBias),this.roughnessMap&&this.roughnessMap.isTexture&&(n.roughnessMap=this.roughnessMap.toJSON(t).uuid),this.metalnessMap&&this.metalnessMap.isTexture&&(n.metalnessMap=this.metalnessMap.toJSON(t).uuid),this.emissiveMap&&this.emissiveMap.isTexture&&(n.emissiveMap=this.emissiveMap.toJSON(t).uuid),this.specularMap&&this.specularMap.isTexture&&(n.specularMap=this.specularMap.toJSON(t).uuid),this.specularIntensityMap&&this.specularIntensityMap.isTexture&&(n.specularIntensityMap=this.specularIntensityMap.toJSON(t).uuid),this.specularColorMap&&this.specularColorMap.isTexture&&(n.specularColorMap=this.specularColorMap.toJSON(t).uuid),this.envMap&&this.envMap.isTexture&&(n.envMap=this.envMap.toJSON(t).uuid,this.combine!==void 0&&(n.combine=this.combine)),this.envMapIntensity!==void 0&&(n.envMapIntensity=this.envMapIntensity),this.reflectivity!==void 0&&(n.reflectivity=this.reflectivity),this.refractionRatio!==void 0&&(n.refractionRatio=this.refractionRatio),this.gradientMap&&this.gradientMap.isTexture&&(n.gradientMap=this.gradientMap.toJSON(t).uuid),this.transmission!==void 0&&(n.transmission=this.transmission),this.transmissionMap&&this.transmissionMap.isTexture&&(n.transmissionMap=this.transmissionMap.toJSON(t).uuid),this.thickness!==void 0&&(n.thickness=this.thickness),this.thicknessMap&&this.thicknessMap.isTexture&&(n.thicknessMap=this.thicknessMap.toJSON(t).uuid),this.attenuationDistance!==void 0&&this.attenuationDistance!==1/0&&(n.attenuationDistance=this.attenuationDistance),this.attenuationColor!==void 0&&(n.attenuationColor=this.attenuationColor.getHex()),this.size!==void 0&&(n.size=this.size),this.shadowSide!==null&&(n.shadowSide=this.shadowSide),this.sizeAttenuation!==void 0&&(n.sizeAttenuation=this.sizeAttenuation),this.blending!==ni&&(n.blending=this.blending),this.side!==gn&&(n.side=this.side),this.vertexColors===!0&&(n.vertexColors=!0),this.opacity<1&&(n.opacity=this.opacity),this.transparent===!0&&(n.transparent=!0),this.blendSrc!==Sr&&(n.blendSrc=this.blendSrc),this.blendDst!==br&&(n.blendDst=this.blendDst),this.blendEquation!==Cn&&(n.blendEquation=this.blendEquation),this.blendSrcAlpha!==null&&(n.blendSrcAlpha=this.blendSrcAlpha),this.blendDstAlpha!==null&&(n.blendDstAlpha=this.blendDstAlpha),this.blendEquationAlpha!==null&&(n.blendEquationAlpha=this.blendEquationAlpha),this.blendColor&&this.blendColor.isColor&&(n.blendColor=this.blendColor.getHex()),this.blendAlpha!==0&&(n.blendAlpha=this.blendAlpha),this.depthFunc!==ls&&(n.depthFunc=this.depthFunc),this.depthTest===!1&&(n.depthTest=this.depthTest),this.depthWrite===!1&&(n.depthWrite=this.depthWrite),this.colorWrite===!1&&(n.colorWrite=this.colorWrite),this.stencilWriteMask!==255&&(n.stencilWriteMask=this.stencilWriteMask),this.stencilFunc!==Ka&&(n.stencilFunc=this.stencilFunc),this.stencilRef!==0&&(n.stencilRef=this.stencilRef),this.stencilFuncMask!==255&&(n.stencilFuncMask=this.stencilFuncMask),this.stencilFail!==On&&(n.stencilFail=this.stencilFail),this.stencilZFail!==On&&(n.stencilZFail=this.stencilZFail),this.stencilZPass!==On&&(n.stencilZPass=this.stencilZPass),this.stencilWrite===!0&&(n.stencilWrite=this.stencilWrite),this.rotation!==void 0&&this.rotation!==0&&(n.rotation=this.rotation),this.polygonOffset===!0&&(n.polygonOffset=!0),this.polygonOffsetFactor!==0&&(n.polygonOffsetFactor=this.polygonOffsetFactor),this.polygonOffsetUnits!==0&&(n.polygonOffsetUnits=this.polygonOffsetUnits),this.linewidth!==void 0&&this.linewidth!==1&&(n.linewidth=this.linewidth),this.dashSize!==void 0&&(n.dashSize=this.dashSize),this.gapSize!==void 0&&(n.gapSize=this.gapSize),this.scale!==void 0&&(n.scale=this.scale),this.dithering===!0&&(n.dithering=!0),this.alphaTest>0&&(n.alphaTest=this.alphaTest),this.alphaHash===!0&&(n.alphaHash=!0),this.alphaToCoverage===!0&&(n.alphaToCoverage=!0),this.premultipliedAlpha===!0&&(n.premultipliedAlpha=!0),this.forceSinglePass===!0&&(n.forceSinglePass=!0),this.wireframe===!0&&(n.wireframe=!0),this.wireframeLinewidth>1&&(n.wireframeLinewidth=this.wireframeLinewidth),this.wireframeLinecap!==\"round\"&&(n.wireframeLinecap=this.wireframeLinecap),this.wireframeLinejoin!==\"round\"&&(n.wireframeLinejoin=this.wireframeLinejoin),this.flatShading===!0&&(n.flatShading=!0),this.visible===!1&&(n.visible=!1),this.toneMapped===!1&&(n.toneMapped=!1),this.fog===!1&&(n.fog=!1),Object.keys(this.userData).length>0&&(n.userData=this.userData);function s(r){let o=[];for(let a in r){let l=r[a];delete l.metadata,o.push(l)}return o}if(e){let r=s(t.textures),o=s(t.images);r.length>0&&(n.textures=r),o.length>0&&(n.images=o)}return n}clone(){return new this.constructor().copy(this)}copy(t){this.name=t.name,this.blending=t.blending,this.side=t.side,this.vertexColors=t.vertexColors,this.opacity=t.opacity,this.transparent=t.transparent,this.blendSrc=t.blendSrc,this.blendDst=t.blendDst,this.blendEquation=t.blendEquation,this.blendSrcAlpha=t.blendSrcAlpha,this.blendDstAlpha=t.blendDstAlpha,this.blendEquationAlpha=t.blendEquationAlpha,this.blendColor.copy(t.blendColor),this.blendAlpha=t.blendAlpha,this.depthFunc=t.depthFunc,this.depthTest=t.depthTest,this.depthWrite=t.depthWrite,this.stencilWriteMask=t.stencilWriteMask,this.stencilFunc=t.stencilFunc,this.stencilRef=t.stencilRef,this.stencilFuncMask=t.stencilFuncMask,this.stencilFail=t.stencilFail,this.stencilZFail=t.stencilZFail,this.stencilZPass=t.stencilZPass,this.stencilWrite=t.stencilWrite;let e=t.clippingPlanes,n=null;if(e!==null){let s=e.length;n=new Array(s);for(let r=0;r!==s;++r)n[r]=e[r].clone()}return this.clippingPlanes=n,this.clipIntersection=t.clipIntersection,this.clipShadows=t.clipShadows,this.shadowSide=t.shadowSide,this.colorWrite=t.colorWrite,this.precision=t.precision,this.polygonOffset=t.polygonOffset,this.polygonOffsetFactor=t.polygonOffsetFactor,this.polygonOffsetUnits=t.polygonOffsetUnits,this.dithering=t.dithering,this.alphaTest=t.alphaTest,this.alphaHash=t.alphaHash,this.alphaToCoverage=t.alphaToCoverage,this.premultipliedAlpha=t.premultipliedAlpha,this.forceSinglePass=t.forceSinglePass,this.visible=t.visible,this.toneMapped=t.toneMapped,this.userData=JSON.parse(JSON.stringify(t.userData)),this}dispose(){this.dispatchEvent({type:\"dispose\"})}set needsUpdate(t){t===!0&&this.version++}},li=class extends yn{constructor(t){super(),this.isMeshBasicMaterial=!0,this.type=\"MeshBasicMaterial\",this.color=new Pt(16777215),this.map=null,this.lightMap=null,this.lightMapIntensity=1,this.aoMap=null,this.aoMapIntensity=1,this.specularMap=null,this.alphaMap=null,this.envMap=null,this.combine=qo,this.reflectivity=1,this.refractionRatio=.98,this.wireframe=!1,this.wireframeLinewidth=1,this.wireframeLinecap=\"round\",this.wireframeLinejoin=\"round\",this.fog=!0,this.setValues(t)}copy(t){return super.copy(t),this.color.copy(t.color),this.map=t.map,this.lightMap=t.lightMap,this.lightMapIntensity=t.lightMapIntensity,this.aoMap=t.aoMap,this.aoMapIntensity=t.aoMapIntensity,this.specularMap=t.specularMap,this.alphaMap=t.alphaMap,this.envMap=t.envMap,this.combine=t.combine,this.reflectivity=t.reflectivity,this.refractionRatio=t.refractionRatio,this.wireframe=t.wireframe,this.wireframeLinewidth=t.wireframeLinewidth,this.wireframeLinecap=t.wireframeLinecap,this.wireframeLinejoin=t.wireframeLinejoin,this.fog=t.fog,this}};var ee=new N,qi=new Lt,ye=class{constructor(t,e,n=!1){if(Array.isArray(t))throw new TypeError(\"THREE.BufferAttribute: array should be a Typed Array.\");this.isBufferAttribute=!0,this.name=\"\",this.array=t,this.itemSize=e,this.count=t!==void 0?t.length/e:0,this.normalized=n,this.usage=Qa,this._updateRange={offset:0,count:-1},this.updateRanges=[],this.gpuType=dn,this.version=0}onUploadCallback(){}set needsUpdate(t){t===!0&&this.version++}get updateRange(){return console.warn(\"THREE.BufferAttribute: updateRange() is deprecated and will be removed in r169. Use addUpdateRange() instead.\"),this._updateRange}setUsage(t){return this.usage=t,this}addUpdateRange(t,e){this.updateRanges.push({start:t,count:e})}clearUpdateRanges(){this.updateRanges.length=0}copy(t){return this.name=t.name,this.array=new t.array.constructor(t.array),this.itemSize=t.itemSize,this.count=t.count,this.normalized=t.normalized,this.usage=t.usage,this.gpuType=t.gpuType,this}copyAt(t,e,n){t*=this.itemSize,n*=e.itemSize;for(let s=0,r=this.itemSize;s<r;s++)this.array[t+s]=e.array[n+s];return this}copyArray(t){return this.array.set(t),this}applyMatrix3(t){if(this.itemSize===2)for(let e=0,n=this.count;e<n;e++)qi.fromBufferAttribute(this,e),qi.applyMatrix3(t),this.setXY(e,qi.x,qi.y);else if(this.itemSize===3)for(let e=0,n=this.count;e<n;e++)ee.fromBufferAttribute(this,e),ee.applyMatrix3(t),this.setXYZ(e,ee.x,ee.y,ee.z);return this}applyMatrix4(t){for(let e=0,n=this.count;e<n;e++)ee.fromBufferAttribute(this,e),ee.applyMatrix4(t),this.setXYZ(e,ee.x,ee.y,ee.z);return this}applyNormalMatrix(t){for(let e=0,n=this.count;e<n;e++)ee.fromBufferAttribute(this,e),ee.applyNormalMatrix(t),this.setXYZ(e,ee.x,ee.y,ee.z);return this}transformDirection(t){for(let e=0,n=this.count;e<n;e++)ee.fromBufferAttribute(this,e),ee.transformDirection(t),this.setXYZ(e,ee.x,ee.y,ee.z);return this}set(t,e=0){return this.array.set(t,e),this}getComponent(t,e){let n=this.array[t*this.itemSize+e];return this.normalized&&(n=_i(n,this.array)),n}setComponent(t,e,n){return this.normalized&&(n=be(n,this.array)),this.array[t*this.itemSize+e]=n,this}getX(t){let e=this.array[t*this.itemSize];return this.normalized&&(e=_i(e,this.array)),e}setX(t,e){return this.normalized&&(e=be(e,this.array)),this.array[t*this.itemSize]=e,this}getY(t){let e=this.array[t*this.itemSize+1];return this.normalized&&(e=_i(e,this.array)),e}setY(t,e){return this.normalized&&(e=be(e,this.array)),this.array[t*this.itemSize+1]=e,this}getZ(t){let e=this.array[t*this.itemSize+2];return this.normalized&&(e=_i(e,this.array)),e}setZ(t,e){return this.normalized&&(e=be(e,this.array)),this.array[t*this.itemSize+2]=e,this}getW(t){let e=this.array[t*this.itemSize+3];return this.normalized&&(e=_i(e,this.array)),e}setW(t,e){return this.normalized&&(e=be(e,this.array)),this.array[t*this.itemSize+3]=e,this}setXY(t,e,n){return t*=this.itemSize,this.normalized&&(e=be(e,this.array),n=be(n,this.array)),this.array[t+0]=e,this.array[t+1]=n,this}setXYZ(t,e,n,s){return t*=this.itemSize,this.normalized&&(e=be(e,this.array),n=be(n,this.array),s=be(s,this.array)),this.array[t+0]=e,this.array[t+1]=n,this.array[t+2]=s,this}setXYZW(t,e,n,s,r){return t*=this.itemSize,this.normalized&&(e=be(e,this.array),n=be(n,this.array),s=be(s,this.array),r=be(r,this.array)),this.array[t+0]=e,this.array[t+1]=n,this.array[t+2]=s,this.array[t+3]=r,this}onUpload(t){return this.onUploadCallback=t,this}clone(){return new this.constructor(this.array,this.itemSize).copy(this)}toJSON(){let t={itemSize:this.itemSize,type:this.array.constructor.name,array:Array.from(this.array),normalized:this.normalized};return this.name!==\"\"&&(t.name=this.name),this.usage!==Qa&&(t.usage=this.usage),t}};var Ms=class extends ye{constructor(t,e,n){super(new Uint16Array(t),e,n)}};var Ss=class extends ye{constructor(t,e,n){super(new Uint32Array(t),e,n)}};var Re=class extends ye{constructor(t,e,n){super(new Float32Array(t),e,n)}};var Lc=0,Ie=new oe,fr=new Pe,qn=new N,Ce=new Un,Mi=new Un,ae=new N,Se=class i extends xn{constructor(){super(),this.isBufferGeometry=!0,Object.defineProperty(this,\"id\",{value:Lc++}),this.uuid=Ii(),this.name=\"\",this.type=\"BufferGeometry\",this.index=null,this.attributes={},this.morphAttributes={},this.morphTargetsRelative=!1,this.groups=[],this.boundingBox=null,this.boundingSphere=null,this.drawRange={start:0,count:1/0},this.userData={}}getIndex(){return this.index}setIndex(t){return Array.isArray(t)?this.index=new(il(t)?Ss:Ms)(t,1):this.index=t,this}getAttribute(t){return this.attributes[t]}setAttribute(t,e){return this.attributes[t]=e,this}deleteAttribute(t){return delete this.attributes[t],this}hasAttribute(t){return this.attributes[t]!==void 0}addGroup(t,e,n=0){this.groups.push({start:t,count:e,materialIndex:n})}clearGroups(){this.groups=[]}setDrawRange(t,e){this.drawRange.start=t,this.drawRange.count=e}applyMatrix4(t){let e=this.attributes.position;e!==void 0&&(e.applyMatrix4(t),e.needsUpdate=!0);let n=this.attributes.normal;if(n!==void 0){let r=new zt().getNormalMatrix(t);n.applyNormalMatrix(r),n.needsUpdate=!0}let s=this.attributes.tangent;return s!==void 0&&(s.transformDirection(t),s.needsUpdate=!0),this.boundingBox!==null&&this.computeBoundingBox(),this.boundingSphere!==null&&this.computeBoundingSphere(),this}applyQuaternion(t){return Ie.makeRotationFromQuaternion(t),this.applyMatrix4(Ie),this}rotateX(t){return Ie.makeRotationX(t),this.applyMatrix4(Ie),this}rotateY(t){return Ie.makeRotationY(t),this.applyMatrix4(Ie),this}rotateZ(t){return Ie.makeRotationZ(t),this.applyMatrix4(Ie),this}translate(t,e,n){return Ie.makeTranslation(t,e,n),this.applyMatrix4(Ie),this}scale(t,e,n){return Ie.makeScale(t,e,n),this.applyMatrix4(Ie),this}lookAt(t){return fr.lookAt(t),fr.updateMatrix(),this.applyMatrix4(fr.matrix),this}center(){return this.computeBoundingBox(),this.boundingBox.getCenter(qn).negate(),this.translate(qn.x,qn.y,qn.z),this}setFromPoints(t){let e=[];for(let n=0,s=t.length;n<s;n++){let r=t[n];e.push(r.x,r.y,r.z||0)}return this.setAttribute(\"position\",new Re(e,3)),this}computeBoundingBox(){this.boundingBox===null&&(this.boundingBox=new Un);let t=this.attributes.position,e=this.morphAttributes.position;if(t&&t.isGLBufferAttribute){console.error('THREE.BufferGeometry.computeBoundingBox(): GLBufferAttribute requires a manual bounding box. Alternatively set \"mesh.frustumCulled\" to \"false\".',this),this.boundingBox.set(new N(-1/0,-1/0,-1/0),new N(1/0,1/0,1/0));return}if(t!==void 0){if(this.boundingBox.setFromBufferAttribute(t),e)for(let n=0,s=e.length;n<s;n++){let r=e[n];Ce.setFromBufferAttribute(r),this.morphTargetsRelative?(ae.addVectors(this.boundingBox.min,Ce.min),this.boundingBox.expandByPoint(ae),ae.addVectors(this.boundingBox.max,Ce.max),this.boundingBox.expandByPoint(ae)):(this.boundingBox.expandByPoint(Ce.min),this.boundingBox.expandByPoint(Ce.max))}}else this.boundingBox.makeEmpty();(isNaN(this.boundingBox.min.x)||isNaN(this.boundingBox.min.y)||isNaN(this.boundingBox.min.z))&&console.error('THREE.BufferGeometry.computeBoundingBox(): Computed min/max have NaN values. The \"position\" attribute is likely to have NaN values.',this)}computeBoundingSphere(){this.boundingSphere===null&&(this.boundingSphere=new Dn);let t=this.attributes.position,e=this.morphAttributes.position;if(t&&t.isGLBufferAttribute){console.error('THREE.BufferGeometry.computeBoundingSphere(): GLBufferAttribute requires a manual bounding sphere. Alternatively set \"mesh.frustumCulled\" to \"false\".',this),this.boundingSphere.set(new N,1/0);return}if(t){let n=this.boundingSphere.center;if(Ce.setFromBufferAttribute(t),e)for(let r=0,o=e.length;r<o;r++){let a=e[r];Mi.setFromBufferAttribute(a),this.morphTargetsRelative?(ae.addVectors(Ce.min,Mi.min),Ce.expandByPoint(ae),ae.addVectors(Ce.max,Mi.max),Ce.expandByPoint(ae)):(Ce.expandByPoint(Mi.min),Ce.expandByPoint(Mi.max))}Ce.getCenter(n);let s=0;for(let r=0,o=t.count;r<o;r++)ae.fromBufferAttribute(t,r),s=Math.max(s,n.distanceToSquared(ae));if(e)for(let r=0,o=e.length;r<o;r++){let a=e[r],l=this.morphTargetsRelative;for(let c=0,h=a.count;c<h;c++)ae.fromBufferAttribute(a,c),l&&(qn.fromBufferAttribute(t,c),ae.add(qn)),s=Math.max(s,n.distanceToSquared(ae))}this.boundingSphere.radius=Math.sqrt(s),isNaN(this.boundingSphere.radius)&&console.error('THREE.BufferGeometry.computeBoundingSphere(): Computed radius is NaN. The \"position\" attribute is likely to have NaN values.',this)}}computeTangents(){let t=this.index,e=this.attributes;if(t===null||e.position===void 0||e.normal===void 0||e.uv===void 0){console.error(\"THREE.BufferGeometry: .computeTangents() failed. Missing required attributes (index, position, normal or uv)\");return}let n=t.array,s=e.position.array,r=e.normal.array,o=e.uv.array,a=s.length/3;this.hasAttribute(\"tangent\")===!1&&this.setAttribute(\"tangent\",new ye(new Float32Array(4*a),4));let l=this.getAttribute(\"tangent\").array,c=[],h=[];for(let b=0;b<a;b++)c[b]=new N,h[b]=new N;let d=new N,f=new N,m=new N,g=new Lt,x=new Lt,p=new Lt,u=new N,w=new N;function v(b,H,K){d.fromArray(s,b*3),f.fromArray(s,H*3),m.fromArray(s,K*3),g.fromArray(o,b*2),x.fromArray(o,H*2),p.fromArray(o,K*2),f.sub(d),m.sub(d),x.sub(g),p.sub(g);let T=1/(x.x*p.y-p.x*x.y);isFinite(T)&&(u.copy(f).multiplyScalar(p.y).addScaledVector(m,-x.y).multiplyScalar(T),w.copy(m).multiplyScalar(x.x).addScaledVector(f,-p.x).multiplyScalar(T),c[b].add(u),c[H].add(u),c[K].add(u),h[b].add(w),h[H].add(w),h[K].add(w))}let P=this.groups;P.length===0&&(P=[{start:0,count:n.length}]);for(let b=0,H=P.length;b<H;++b){let K=P[b],T=K.start,E=K.count;for(let L=T,F=T+E;L<F;L+=3)v(n[L+0],n[L+1],n[L+2])}let U=new N,R=new N,C=new N,Y=new N;function S(b){C.fromArray(r,b*3),Y.copy(C);let H=c[b];U.copy(H),U.sub(C.multiplyScalar(C.dot(H))).normalize(),R.crossVectors(Y,H);let T=R.dot(h[b])<0?-1:1;l[b*4]=U.x,l[b*4+1]=U.y,l[b*4+2]=U.z,l[b*4+3]=T}for(let b=0,H=P.length;b<H;++b){let K=P[b],T=K.start,E=K.count;for(let L=T,F=T+E;L<F;L+=3)S(n[L+0]),S(n[L+1]),S(n[L+2])}}computeVertexNormals(){let t=this.index,e=this.getAttribute(\"position\");if(e!==void 0){let n=this.getAttribute(\"normal\");if(n===void 0)n=new ye(new Float32Array(e.count*3),3),this.setAttribute(\"normal\",n);else for(let f=0,m=n.count;f<m;f++)n.setXYZ(f,0,0,0);let s=new N,r=new N,o=new N,a=new N,l=new N,c=new N,h=new N,d=new N;if(t)for(let f=0,m=t.count;f<m;f+=3){let g=t.getX(f+0),x=t.getX(f+1),p=t.getX(f+2);s.fromBufferAttribute(e,g),r.fromBufferAttribute(e,x),o.fromBufferAttribute(e,p),h.subVectors(o,r),d.subVectors(s,r),h.cross(d),a.fromBufferAttribute(n,g),l.fromBufferAttribute(n,x),c.fromBufferAttribute(n,p),a.add(h),l.add(h),c.add(h),n.setXYZ(g,a.x,a.y,a.z),n.setXYZ(x,l.x,l.y,l.z),n.setXYZ(p,c.x,c.y,c.z)}else for(let f=0,m=e.count;f<m;f+=3)s.fromBufferAttribute(e,f+0),r.fromBufferAttribute(e,f+1),o.fromBufferAttribute(e,f+2),h.subVectors(o,r),d.subVectors(s,r),h.cross(d),n.setXYZ(f+0,h.x,h.y,h.z),n.setXYZ(f+1,h.x,h.y,h.z),n.setXYZ(f+2,h.x,h.y,h.z);this.normalizeNormals(),n.needsUpdate=!0}}normalizeNormals(){let t=this.attributes.normal;for(let e=0,n=t.count;e<n;e++)ae.fromBufferAttribute(t,e),ae.normalize(),t.setXYZ(e,ae.x,ae.y,ae.z)}toNonIndexed(){function t(a,l){let c=a.array,h=a.itemSize,d=a.normalized,f=new c.constructor(l.length*h),m=0,g=0;for(let x=0,p=l.length;x<p;x++){a.isInterleavedBufferAttribute?m=l[x]*a.data.stride+a.offset:m=l[x]*h;for(let u=0;u<h;u++)f[g++]=c[m++]}return new ye(f,h,d)}if(this.index===null)return console.warn(\"THREE.BufferGeometry.toNonIndexed(): BufferGeometry is already non-indexed.\"),this;let e=new i,n=this.index.array,s=this.attributes;for(let a in s){let l=s[a],c=t(l,n);e.setAttribute(a,c)}let r=this.morphAttributes;for(let a in r){let l=[],c=r[a];for(let h=0,d=c.length;h<d;h++){let f=c[h],m=t(f,n);l.push(m)}e.morphAttributes[a]=l}e.morphTargetsRelative=this.morphTargetsRelative;let o=this.groups;for(let a=0,l=o.length;a<l;a++){let c=o[a];e.addGroup(c.start,c.count,c.materialIndex)}return e}toJSON(){let t={metadata:{version:4.6,type:\"BufferGeometry\",generator:\"BufferGeometry.toJSON\"}};if(t.uuid=this.uuid,t.type=this.type,this.name!==\"\"&&(t.name=this.name),Object.keys(this.userData).length>0&&(t.userData=this.userData),this.parameters!==void 0){let l=this.parameters;for(let c in l)l[c]!==void 0&&(t[c]=l[c]);return t}t.data={attributes:{}};let e=this.index;e!==null&&(t.data.index={type:e.array.constructor.name,array:Array.prototype.slice.call(e.array)});let n=this.attributes;for(let l in n){let c=n[l];t.data.attributes[l]=c.toJSON(t.data)}let s={},r=!1;for(let l in this.morphAttributes){let c=this.morphAttributes[l],h=[];for(let d=0,f=c.length;d<f;d++){let m=c[d];h.push(m.toJSON(t.data))}h.length>0&&(s[l]=h,r=!0)}r&&(t.data.morphAttributes=s,t.data.morphTargetsRelative=this.morphTargetsRelative);let o=this.groups;o.length>0&&(t.data.groups=JSON.parse(JSON.stringify(o)));let a=this.boundingSphere;return a!==null&&(t.data.boundingSphere={center:a.center.toArray(),radius:a.radius}),t}clone(){return new this.constructor().copy(this)}copy(t){this.index=null,this.attributes={},this.morphAttributes={},this.groups=[],this.boundingBox=null,this.boundingSphere=null;let e={};this.name=t.name;let n=t.index;n!==null&&this.setIndex(n.clone(e));let s=t.attributes;for(let c in s){let h=s[c];this.setAttribute(c,h.clone(e))}let r=t.morphAttributes;for(let c in r){let h=[],d=r[c];for(let f=0,m=d.length;f<m;f++)h.push(d[f].clone(e));this.morphAttributes[c]=h}this.morphTargetsRelative=t.morphTargetsRelative;let o=t.groups;for(let c=0,h=o.length;c<h;c++){let d=o[c];this.addGroup(d.start,d.count,d.materialIndex)}let a=t.boundingBox;a!==null&&(this.boundingBox=a.clone());let l=t.boundingSphere;return l!==null&&(this.boundingSphere=l.clone()),this.drawRange.start=t.drawRange.start,this.drawRange.count=t.drawRange.count,this.userData=t.userData,this}dispose(){this.dispatchEvent({type:\"dispose\"})}},fo=new oe,wn=new wi,Yi=new Dn,po=new N,Yn=new N,Zn=new N,Jn=new N,pr=new N,Zi=new N,Ji=new Lt,$i=new Lt,Ki=new Lt,mo=new N,go=new N,_o=new N,Qi=new N,ji=new N,Ne=class extends Pe{constructor(t=new Se,e=new li){super(),this.isMesh=!0,this.type=\"Mesh\",this.geometry=t,this.material=e,this.updateMorphTargets()}copy(t,e){return super.copy(t,e),t.morphTargetInfluences!==void 0&&(this.morphTargetInfluences=t.morphTargetInfluences.slice()),t.morphTargetDictionary!==void 0&&(this.morphTargetDictionary=Object.assign({},t.morphTargetDictionary)),this.material=Array.isArray(t.material)?t.material.slice():t.material,this.geometry=t.geometry,this}updateMorphTargets(){let e=this.geometry.morphAttributes,n=Object.keys(e);if(n.length>0){let s=e[n[0]];if(s!==void 0){this.morphTargetInfluences=[],this.morphTargetDictionary={};for(let r=0,o=s.length;r<o;r++){let a=s[r].name||String(r);this.morphTargetInfluences.push(0),this.morphTargetDictionary[a]=r}}}}getVertexPosition(t,e){let n=this.geometry,s=n.attributes.position,r=n.morphAttributes.position,o=n.morphTargetsRelative;e.fromBufferAttribute(s,t);let a=this.morphTargetInfluences;if(r&&a){Zi.set(0,0,0);for(let l=0,c=r.length;l<c;l++){let h=a[l],d=r[l];h!==0&&(pr.fromBufferAttribute(d,t),o?Zi.addScaledVector(pr,h):Zi.addScaledVector(pr.sub(e),h))}e.add(Zi)}return e}raycast(t,e){let n=this.geometry,s=this.material,r=this.matrixWorld;s!==void 0&&(n.boundingSphere===null&&n.computeBoundingSphere(),Yi.copy(n.boundingSphere),Yi.applyMatrix4(r),wn.copy(t.ray).recast(t.near),!(Yi.containsPoint(wn.origin)===!1&&(wn.intersectSphere(Yi,po)===null||wn.origin.distanceToSquared(po)>(t.far-t.near)**2))&&(fo.copy(r).invert(),wn.copy(t.ray).applyMatrix4(fo),!(n.boundingBox!==null&&wn.intersectsBox(n.boundingBox)===!1)&&this._computeIntersections(t,e,wn)))}_computeIntersections(t,e,n){let s,r=this.geometry,o=this.material,a=r.index,l=r.attributes.position,c=r.attributes.uv,h=r.attributes.uv1,d=r.attributes.normal,f=r.groups,m=r.drawRange;if(a!==null)if(Array.isArray(o))for(let g=0,x=f.length;g<x;g++){let p=f[g],u=o[p.materialIndex],w=Math.max(p.start,m.start),v=Math.min(a.count,Math.min(p.start+p.count,m.start+m.count));for(let P=w,U=v;P<U;P+=3){let R=a.getX(P),C=a.getX(P+1),Y=a.getX(P+2);s=ts(this,u,t,n,c,h,d,R,C,Y),s&&(s.faceIndex=Math.floor(P/3),s.face.materialIndex=p.materialIndex,e.push(s))}}else{let g=Math.max(0,m.start),x=Math.min(a.count,m.start+m.count);for(let p=g,u=x;p<u;p+=3){let w=a.getX(p),v=a.getX(p+1),P=a.getX(p+2);s=ts(this,o,t,n,c,h,d,w,v,P),s&&(s.faceIndex=Math.floor(p/3),e.push(s))}}else if(l!==void 0)if(Array.isArray(o))for(let g=0,x=f.length;g<x;g++){let p=f[g],u=o[p.materialIndex],w=Math.max(p.start,m.start),v=Math.min(l.count,Math.min(p.start+p.count,m.start+m.count));for(let P=w,U=v;P<U;P+=3){let R=P,C=P+1,Y=P+2;s=ts(this,u,t,n,c,h,d,R,C,Y),s&&(s.faceIndex=Math.floor(P/3),s.face.materialIndex=p.materialIndex,e.push(s))}}else{let g=Math.max(0,m.start),x=Math.min(l.count,m.start+m.count);for(let p=g,u=x;p<u;p+=3){let w=p,v=p+1,P=p+2;s=ts(this,o,t,n,c,h,d,w,v,P),s&&(s.faceIndex=Math.floor(p/3),e.push(s))}}}};function Ic(i,t,e,n,s,r,o,a){let l;if(t.side===we?l=n.intersectTriangle(o,r,s,!0,a):l=n.intersectTriangle(s,r,o,t.side===gn,a),l===null)return null;ji.copy(a),ji.applyMatrix4(i.matrixWorld);let c=e.ray.origin.distanceTo(ji);return c<e.near||c>e.far?null:{distance:c,point:ji.clone(),object:i}}function ts(i,t,e,n,s,r,o,a,l,c){i.getVertexPosition(a,Yn),i.getVertexPosition(l,Zn),i.getVertexPosition(c,Jn);let h=Ic(i,t,e,n,Yn,Zn,Jn,Qi);if(h){s&&(Ji.fromBufferAttribute(s,a),$i.fromBufferAttribute(s,l),Ki.fromBufferAttribute(s,c),h.uv=jn.getInterpolation(Qi,Yn,Zn,Jn,Ji,$i,Ki,new Lt)),r&&(Ji.fromBufferAttribute(r,a),$i.fromBufferAttribute(r,l),Ki.fromBufferAttribute(r,c),h.uv1=jn.getInterpolation(Qi,Yn,Zn,Jn,Ji,$i,Ki,new Lt),h.uv2=h.uv1),o&&(mo.fromBufferAttribute(o,a),go.fromBufferAttribute(o,l),_o.fromBufferAttribute(o,c),h.normal=jn.getInterpolation(Qi,Yn,Zn,Jn,mo,go,_o,new N),h.normal.dot(n.direction)>0&&h.normal.multiplyScalar(-1));let d={a,b:l,c,normal:new N,materialIndex:0};jn.getNormal(Yn,Zn,Jn,d.normal),h.face=d}return h}var Ti=class i extends Se{constructor(t=1,e=1,n=1,s=1,r=1,o=1){super(),this.type=\"BoxGeometry\",this.parameters={width:t,height:e,depth:n,widthSegments:s,heightSegments:r,depthSegments:o};let a=this;s=Math.floor(s),r=Math.floor(r),o=Math.floor(o);let l=[],c=[],h=[],d=[],f=0,m=0;g(\"z\",\"y\",\"x\",-1,-1,n,e,t,o,r,0),g(\"z\",\"y\",\"x\",1,-1,n,e,-t,o,r,1),g(\"x\",\"z\",\"y\",1,1,t,n,e,s,o,2),g(\"x\",\"z\",\"y\",1,-1,t,n,-e,s,o,3),g(\"x\",\"y\",\"z\",1,-1,t,e,n,s,r,4),g(\"x\",\"y\",\"z\",-1,-1,t,e,-n,s,r,5),this.setIndex(l),this.setAttribute(\"position\",new Re(c,3)),this.setAttribute(\"normal\",new Re(h,3)),this.setAttribute(\"uv\",new Re(d,2));function g(x,p,u,w,v,P,U,R,C,Y,S){let b=P/C,H=U/Y,K=P/2,T=U/2,E=R/2,L=C+1,F=Y+1,I=0,G=0,X=new N;for(let Z=0;Z<F;Z++){let $=Z*H-T;for(let et=0;et<L;et++){let W=et*b-K;X[x]=W*w,X[p]=$*v,X[u]=E,c.push(X.x,X.y,X.z),X[x]=0,X[p]=0,X[u]=R>0?1:-1,h.push(X.x,X.y,X.z),d.push(et/C),d.push(1-Z/Y),I+=1}}for(let Z=0;Z<Y;Z++)for(let $=0;$<C;$++){let et=f+$+L*Z,W=f+$+L*(Z+1),q=f+($+1)+L*(Z+1),st=f+($+1)+L*Z;l.push(et,W,st),l.push(W,q,st),G+=6}a.addGroup(m,G,S),m+=G,f+=I}}copy(t){return super.copy(t),this.parameters=Object.assign({},t.parameters),this}static fromJSON(t){return new i(t.width,t.height,t.depth,t.widthSegments,t.heightSegments,t.depthSegments)}};function ci(i){let t={};for(let e in i){t[e]={};for(let n in i[e]){let s=i[e][n];s&&(s.isColor||s.isMatrix3||s.isMatrix4||s.isVector2||s.isVector3||s.isVector4||s.isTexture||s.isQuaternion)?s.isRenderTargetTexture?(console.warn(\"UniformsUtils: Textures of render targets cannot be cloned via cloneUniforms() or mergeUniforms().\"),t[e][n]=null):t[e][n]=s.clone():Array.isArray(s)?t[e][n]=s.slice():t[e][n]=s}}return t}function _e(i){let t={};for(let e=0;e<i.length;e++){let n=ci(i[e]);for(let s in n)t[s]=n[s]}return t}function Uc(i){let t=[];for(let e=0;e<i.length;e++)t.push(i[e].clone());return t}function rl(i){return i.getRenderTarget()===null?i.outputColorSpace:Wt.workingColorSpace}var di={clone:ci,merge:_e},Dc=`void main() {\n\tgl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\n}`,Nc=`void main() {\n\tgl_FragColor = vec4( 1.0, 0.0, 0.0, 1.0 );\n}`,ue=class extends yn{constructor(t){super(),this.isShaderMaterial=!0,this.type=\"ShaderMaterial\",this.defines={},this.uniforms={},this.uniformsGroups=[],this.vertexShader=Dc,this.fragmentShader=Nc,this.linewidth=1,this.wireframe=!1,this.wireframeLinewidth=1,this.fog=!1,this.lights=!1,this.clipping=!1,this.forceSinglePass=!0,this.extensions={derivatives:!1,fragDepth:!1,drawBuffers:!1,shaderTextureLOD:!1,clipCullDistance:!1},this.defaultAttributeValues={color:[1,1,1],uv:[0,0],uv1:[0,0]},this.index0AttributeName=void 0,this.uniformsNeedUpdate=!1,this.glslVersion=null,t!==void 0&&this.setValues(t)}copy(t){return super.copy(t),this.fragmentShader=t.fragmentShader,this.vertexShader=t.vertexShader,this.uniforms=ci(t.uniforms),this.uniformsGroups=Uc(t.uniformsGroups),this.defines=Object.assign({},t.defines),this.wireframe=t.wireframe,this.wireframeLinewidth=t.wireframeLinewidth,this.fog=t.fog,this.lights=t.lights,this.clipping=t.clipping,this.extensions=Object.assign({},t.extensions),this.glslVersion=t.glslVersion,this}toJSON(t){let e=super.toJSON(t);e.glslVersion=this.glslVersion,e.uniforms={};for(let s in this.uniforms){let o=this.uniforms[s].value;o&&o.isTexture?e.uniforms[s]={type:\"t\",value:o.toJSON(t).uuid}:o&&o.isColor?e.uniforms[s]={type:\"c\",value:o.getHex()}:o&&o.isVector2?e.uniforms[s]={type:\"v2\",value:o.toArray()}:o&&o.isVector3?e.uniforms[s]={type:\"v3\",value:o.toArray()}:o&&o.isVector4?e.uniforms[s]={type:\"v4\",value:o.toArray()}:o&&o.isMatrix3?e.uniforms[s]={type:\"m3\",value:o.toArray()}:o&&o.isMatrix4?e.uniforms[s]={type:\"m4\",value:o.toArray()}:e.uniforms[s]={value:o}}Object.keys(this.defines).length>0&&(e.defines=this.defines),e.vertexShader=this.vertexShader,e.fragmentShader=this.fragmentShader,e.lights=this.lights,e.clipping=this.clipping;let n={};for(let s in this.extensions)this.extensions[s]===!0&&(n[s]=!0);return Object.keys(n).length>0&&(e.extensions=n),e}},bs=class extends Pe{constructor(){super(),this.isCamera=!0,this.type=\"Camera\",this.matrixWorldInverse=new oe,this.projectionMatrix=new oe,this.projectionMatrixInverse=new oe,this.coordinateSystem=sn}copy(t,e){return super.copy(t,e),this.matrixWorldInverse.copy(t.matrixWorldInverse),this.projectionMatrix.copy(t.projectionMatrix),this.projectionMatrixInverse.copy(t.projectionMatrixInverse),this.coordinateSystem=t.coordinateSystem,this}getWorldDirection(t){return super.getWorldDirection(t).negate()}updateMatrixWorld(t){super.updateMatrixWorld(t),this.matrixWorldInverse.copy(this.matrixWorld).invert()}updateWorldMatrix(t,e){super.updateWorldMatrix(t,e),this.matrixWorldInverse.copy(this.matrixWorld).invert()}clone(){return new this.constructor().copy(this)}},ve=class extends bs{constructor(t=50,e=1,n=.1,s=2e3){super(),this.isPerspectiveCamera=!0,this.type=\"PerspectiveCamera\",this.fov=t,this.zoom=1,this.near=n,this.far=s,this.focus=10,this.aspect=e,this.view=null,this.filmGauge=35,this.filmOffset=0,this.updateProjectionMatrix()}copy(t,e){return super.copy(t,e),this.fov=t.fov,this.zoom=t.zoom,this.near=t.near,this.far=t.far,this.focus=t.focus,this.aspect=t.aspect,this.view=t.view===null?null:Object.assign({},t.view),this.filmGauge=t.filmGauge,this.filmOffset=t.filmOffset,this}setFocalLength(t){let e=.5*this.getFilmHeight()/t;this.fov=Rr*2*Math.atan(e),this.updateProjectionMatrix()}getFocalLength(){let t=Math.tan(Ks*.5*this.fov);return .5*this.getFilmHeight()/t}getEffectiveFOV(){return Rr*2*Math.atan(Math.tan(Ks*.5*this.fov)/this.zoom)}getFilmWidth(){return this.filmGauge*Math.min(this.aspect,1)}getFilmHeight(){return this.filmGauge/Math.max(this.aspect,1)}setViewOffset(t,e,n,s,r,o){this.aspect=t/e,this.view===null&&(this.view={enabled:!0,fullWidth:1,fullHeight:1,offsetX:0,offsetY:0,width:1,height:1}),this.view.enabled=!0,this.view.fullWidth=t,this.view.fullHeight=e,this.view.offsetX=n,this.view.offsetY=s,this.view.width=r,this.view.height=o,this.updateProjectionMatrix()}clearViewOffset(){this.view!==null&&(this.view.enabled=!1),this.updateProjectionMatrix()}updateProjectionMatrix(){let t=this.near,e=t*Math.tan(Ks*.5*this.fov)/this.zoom,n=2*e,s=this.aspect*n,r=-.5*s,o=this.view;if(this.view!==null&&this.view.enabled){let l=o.fullWidth,c=o.fullHeight;r+=o.offsetX*s/l,e-=o.offsetY*n/c,s*=o.width/l,n*=o.height/c}let a=this.filmOffset;a!==0&&(r+=t*a/this.getFilmWidth()),this.projectionMatrix.makePerspective(r,r+s,e,e-n,t,this.far,this.coordinateSystem),this.projectionMatrixInverse.copy(this.projectionMatrix).invert()}toJSON(t){let e=super.toJSON(t);return e.object.fov=this.fov,e.object.zoom=this.zoom,e.object.near=this.near,e.object.far=this.far,e.object.focus=this.focus,e.object.aspect=this.aspect,this.view!==null&&(e.object.view=Object.assign({},this.view)),e.object.filmGauge=this.filmGauge,e.object.filmOffset=this.filmOffset,e}},$n=-90,Kn=1,Ur=class extends Pe{constructor(t,e,n){super(),this.type=\"CubeCamera\",this.renderTarget=n,this.coordinateSystem=null,this.activeMipmapLevel=0;let s=new ve($n,Kn,t,e);s.layers=this.layers,this.add(s);let r=new ve($n,Kn,t,e);r.layers=this.layers,this.add(r);let o=new ve($n,Kn,t,e);o.layers=this.layers,this.add(o);let a=new ve($n,Kn,t,e);a.layers=this.layers,this.add(a);let l=new ve($n,Kn,t,e);l.layers=this.layers,this.add(l);let c=new ve($n,Kn,t,e);c.layers=this.layers,this.add(c)}updateCoordinateSystem(){let t=this.coordinateSystem,e=this.children.concat(),[n,s,r,o,a,l]=e;for(let c of e)this.remove(c);if(t===sn)n.up.set(0,1,0),n.lookAt(1,0,0),s.up.set(0,1,0),s.lookAt(-1,0,0),r.up.set(0,0,-1),r.lookAt(0,1,0),o.up.set(0,0,1),o.lookAt(0,-1,0),a.up.set(0,1,0),a.lookAt(0,0,1),l.up.set(0,1,0),l.lookAt(0,0,-1);else if(t===ps)n.up.set(0,-1,0),n.lookAt(-1,0,0),s.up.set(0,-1,0),s.lookAt(1,0,0),r.up.set(0,0,1),r.lookAt(0,1,0),o.up.set(0,0,-1),o.lookAt(0,-1,0),a.up.set(0,-1,0),a.lookAt(0,0,1),l.up.set(0,-1,0),l.lookAt(0,0,-1);else throw new Error(\"THREE.CubeCamera.updateCoordinateSystem(): Invalid coordinate system: \"+t);for(let c of e)this.add(c),c.updateMatrixWorld()}update(t,e){this.parent===null&&this.updateMatrixWorld();let{renderTarget:n,activeMipmapLevel:s}=this;this.coordinateSystem!==t.coordinateSystem&&(this.coordinateSystem=t.coordinateSystem,this.updateCoordinateSystem());let[r,o,a,l,c,h]=this.children,d=t.getRenderTarget(),f=t.getActiveCubeFace(),m=t.getActiveMipmapLevel(),g=t.xr.enabled;t.xr.enabled=!1;let x=n.texture.generateMipmaps;n.texture.generateMipmaps=!1,t.setRenderTarget(n,0,s),t.render(e,r),t.setRenderTarget(n,1,s),t.render(e,o),t.setRenderTarget(n,2,s),t.render(e,a),t.setRenderTarget(n,3,s),t.render(e,l),t.setRenderTarget(n,4,s),t.render(e,c),n.texture.generateMipmaps=x,t.setRenderTarget(n,5,s),t.render(e,h),t.setRenderTarget(d,f,m),t.xr.enabled=g,n.texture.needsPMREMUpdate=!0}},Es=class extends He{constructor(t,e,n,s,r,o,a,l,c,h){t=t!==void 0?t:[],e=e!==void 0?e:ri,super(t,e,n,s,r,o,a,l,c,h),this.isCubeTexture=!0,this.flipY=!1}get images(){return this.image}set images(t){this.image=t}},Dr=class extends Me{constructor(t=1,e={}){super(t,t,e),this.isWebGLCubeRenderTarget=!0;let n={width:t,height:t,depth:1},s=[n,n,n,n,n,n];e.encoding!==void 0&&(Si(\"THREE.WebGLCubeRenderTarget: option.encoding has been replaced by option.colorSpace.\"),e.colorSpace=e.encoding===In?ce:De),this.texture=new Es(s,e.mapping,e.wrapS,e.wrapT,e.magFilter,e.minFilter,e.format,e.type,e.anisotropy,e.colorSpace),this.texture.isRenderTargetTexture=!0,this.texture.generateMipmaps=e.generateMipmaps!==void 0?e.generateMipmaps:!1,this.texture.minFilter=e.minFilter!==void 0?e.minFilter:Ue}fromEquirectangularTexture(t,e){this.texture.type=e.type,this.texture.colorSpace=e.colorSpace,this.texture.generateMipmaps=e.generateMipmaps,this.texture.minFilter=e.minFilter,this.texture.magFilter=e.magFilter;let n={uniforms:{tEquirect:{value:null}},vertexShader:`\n\n\t\t\t\tvarying vec3 vWorldDirection;\n\n\t\t\t\tvec3 transformDirection( in vec3 dir, in mat4 matrix ) {\n\n\t\t\t\t\treturn normalize( ( matrix * vec4( dir, 0.0 ) ).xyz );\n\n\t\t\t\t}\n\n\t\t\t\tvoid main() {\n\n\t\t\t\t\tvWorldDirection = transformDirection( position, modelMatrix );\n\n\t\t\t\t\t#include <begin_vertex>\n\t\t\t\t\t#include <project_vertex>\n\n\t\t\t\t}\n\t\t\t`,fragmentShader:`\n\n\t\t\t\tuniform sampler2D tEquirect;\n\n\t\t\t\tvarying vec3 vWorldDirection;\n\n\t\t\t\t#include <common>\n\n\t\t\t\tvoid main() {\n\n\t\t\t\t\tvec3 direction = normalize( vWorldDirection );\n\n\t\t\t\t\tvec2 sampleUV = equirectUv( direction );\n\n\t\t\t\t\tgl_FragColor = texture2D( tEquirect, sampleUV );\n\n\t\t\t\t}\n\t\t\t`},s=new Ti(5,5,5),r=new ue({name:\"CubemapFromEquirect\",uniforms:ci(n.uniforms),vertexShader:n.vertexShader,fragmentShader:n.fragmentShader,side:we,blending:Ye});r.uniforms.tEquirect.value=e;let o=new Ne(s,r),a=e.minFilter;return e.minFilter===Ei&&(e.minFilter=Ue),new Ur(1,10,this).update(t,o),e.minFilter=a,o.geometry.dispose(),o.material.dispose(),this}clear(t,e,n,s){let r=t.getRenderTarget();for(let o=0;o<6;o++)t.setRenderTarget(this,o),t.clear(e,n,s);t.setRenderTarget(r)}},mr=new N,Fc=new N,Oc=new zt,en=class{constructor(t=new N(1,0,0),e=0){this.isPlane=!0,this.normal=t,this.constant=e}set(t,e){return this.normal.copy(t),this.constant=e,this}setComponents(t,e,n,s){return this.normal.set(t,e,n),this.constant=s,this}setFromNormalAndCoplanarPoint(t,e){return this.normal.copy(t),this.constant=-e.dot(this.normal),this}setFromCoplanarPoints(t,e,n){let s=mr.subVectors(n,e).cross(Fc.subVectors(t,e)).normalize();return this.setFromNormalAndCoplanarPoint(s,t),this}copy(t){return this.normal.copy(t.normal),this.constant=t.constant,this}normalize(){let t=1/this.normal.length();return this.normal.multiplyScalar(t),this.constant*=t,this}negate(){return this.constant*=-1,this.normal.negate(),this}distanceToPoint(t){return this.normal.dot(t)+this.constant}distanceToSphere(t){return this.distanceToPoint(t.center)-t.radius}projectPoint(t,e){return e.copy(t).addScaledVector(this.normal,-this.distanceToPoint(t))}intersectLine(t,e){let n=t.delta(mr),s=this.normal.dot(n);if(s===0)return this.distanceToPoint(t.start)===0?e.copy(t.start):null;let r=-(t.start.dot(this.normal)+this.constant)/s;return r<0||r>1?null:e.copy(t.start).addScaledVector(n,r)}intersectsLine(t){let e=this.distanceToPoint(t.start),n=this.distanceToPoint(t.end);return e<0&&n>0||n<0&&e>0}intersectsBox(t){return t.intersectsPlane(this)}intersectsSphere(t){return t.intersectsPlane(this)}coplanarPoint(t){return t.copy(this.normal).multiplyScalar(-this.constant)}applyMatrix4(t,e){let n=e||Oc.getNormalMatrix(t),s=this.coplanarPoint(mr).applyMatrix4(t),r=this.normal.applyMatrix3(n).normalize();return this.constant=-s.dot(r),this}translate(t){return this.constant-=t.dot(this.normal),this}equals(t){return t.normal.equals(this.normal)&&t.constant===this.constant}clone(){return new this.constructor().copy(this)}},Tn=new Dn,es=new N,ws=class{constructor(t=new en,e=new en,n=new en,s=new en,r=new en,o=new en){this.planes=[t,e,n,s,r,o]}set(t,e,n,s,r,o){let a=this.planes;return a[0].copy(t),a[1].copy(e),a[2].copy(n),a[3].copy(s),a[4].copy(r),a[5].copy(o),this}copy(t){let e=this.planes;for(let n=0;n<6;n++)e[n].copy(t.planes[n]);return this}setFromProjectionMatrix(t,e=sn){let n=this.planes,s=t.elements,r=s[0],o=s[1],a=s[2],l=s[3],c=s[4],h=s[5],d=s[6],f=s[7],m=s[8],g=s[9],x=s[10],p=s[11],u=s[12],w=s[13],v=s[14],P=s[15];if(n[0].setComponents(l-r,f-c,p-m,P-u).normalize(),n[1].setComponents(l+r,f+c,p+m,P+u).normalize(),n[2].setComponents(l+o,f+h,p+g,P+w).normalize(),n[3].setComponents(l-o,f-h,p-g,P-w).normalize(),n[4].setComponents(l-a,f-d,p-x,P-v).normalize(),e===sn)n[5].setComponents(l+a,f+d,p+x,P+v).normalize();else if(e===ps)n[5].setComponents(a,d,x,v).normalize();else throw new Error(\"THREE.Frustum.setFromProjectionMatrix(): Invalid coordinate system: \"+e);return this}intersectsObject(t){if(t.boundingSphere!==void 0)t.boundingSphere===null&&t.computeBoundingSphere(),Tn.copy(t.boundingSphere).applyMatrix4(t.matrixWorld);else{let e=t.geometry;e.boundingSphere===null&&e.computeBoundingSphere(),Tn.copy(e.boundingSphere).applyMatrix4(t.matrixWorld)}return this.intersectsSphere(Tn)}intersectsSprite(t){return Tn.center.set(0,0,0),Tn.radius=.7071067811865476,Tn.applyMatrix4(t.matrixWorld),this.intersectsSphere(Tn)}intersectsSphere(t){let e=this.planes,n=t.center,s=-t.radius;for(let r=0;r<6;r++)if(e[r].distanceToPoint(n)<s)return!1;return!0}intersectsBox(t){let e=this.planes;for(let n=0;n<6;n++){let s=e[n];if(es.x=s.normal.x>0?t.max.x:t.min.x,es.y=s.normal.y>0?t.max.y:t.min.y,es.z=s.normal.z>0?t.max.z:t.min.z,s.distanceToPoint(es)<0)return!1}return!0}containsPoint(t){let e=this.planes;for(let n=0;n<6;n++)if(e[n].distanceToPoint(t)<0)return!1;return!0}clone(){return new this.constructor().copy(this)}};function al(){let i=null,t=!1,e=null,n=null;function s(r,o){e(r,o),n=i.requestAnimationFrame(s)}return{start:function(){t!==!0&&e!==null&&(n=i.requestAnimationFrame(s),t=!0)},stop:function(){i.cancelAnimationFrame(n),t=!1},setAnimationLoop:function(r){e=r},setContext:function(r){i=r}}}function Bc(i,t){let e=t.isWebGL2,n=new WeakMap;function s(c,h){let d=c.array,f=c.usage,m=d.byteLength,g=i.createBuffer();i.bindBuffer(h,g),i.bufferData(h,d,f),c.onUploadCallback();let x;if(d instanceof Float32Array)x=i.FLOAT;else if(d instanceof Uint16Array)if(c.isFloat16BufferAttribute)if(e)x=i.HALF_FLOAT;else throw new Error(\"THREE.WebGLAttributes: Usage of Float16BufferAttribute requires WebGL2.\");else x=i.UNSIGNED_SHORT;else if(d instanceof Int16Array)x=i.SHORT;else if(d instanceof Uint32Array)x=i.UNSIGNED_INT;else if(d instanceof Int32Array)x=i.INT;else if(d instanceof Int8Array)x=i.BYTE;else if(d instanceof Uint8Array)x=i.UNSIGNED_BYTE;else if(d instanceof Uint8ClampedArray)x=i.UNSIGNED_BYTE;else throw new Error(\"THREE.WebGLAttributes: Unsupported buffer data format: \"+d);return{buffer:g,type:x,bytesPerElement:d.BYTES_PER_ELEMENT,version:c.version,size:m}}function r(c,h,d){let f=h.array,m=h._updateRange,g=h.updateRanges;if(i.bindBuffer(d,c),m.count===-1&&g.length===0&&i.bufferSubData(d,0,f),g.length!==0){for(let x=0,p=g.length;x<p;x++){let u=g[x];e?i.bufferSubData(d,u.start*f.BYTES_PER_ELEMENT,f,u.start,u.count):i.bufferSubData(d,u.start*f.BYTES_PER_ELEMENT,f.subarray(u.start,u.start+u.count))}h.clearUpdateRanges()}m.count!==-1&&(e?i.bufferSubData(d,m.offset*f.BYTES_PER_ELEMENT,f,m.offset,m.count):i.bufferSubData(d,m.offset*f.BYTES_PER_ELEMENT,f.subarray(m.offset,m.offset+m.count)),m.count=-1),h.onUploadCallback()}function o(c){return c.isInterleavedBufferAttribute&&(c=c.data),n.get(c)}function a(c){c.isInterleavedBufferAttribute&&(c=c.data);let h=n.get(c);h&&(i.deleteBuffer(h.buffer),n.delete(c))}function l(c,h){if(c.isGLBufferAttribute){let f=n.get(c);(!f||f.version<c.version)&&n.set(c,{buffer:c.buffer,type:c.type,bytesPerElement:c.elementSize,version:c.version});return}c.isInterleavedBufferAttribute&&(c=c.data);let d=n.get(c);if(d===void 0)n.set(c,s(c,h));else if(d.version<c.version){if(d.size!==c.array.byteLength)throw new Error(\"THREE.WebGLAttributes: The size of the buffer attribute's array buffer does not match the original size. Resizing buffer attributes is not supported.\");r(d.buffer,c,h),d.version=c.version}}return{get:o,remove:a,update:l}}var Nr=class i extends Se{constructor(t=1,e=1,n=1,s=1){super(),this.type=\"PlaneGeometry\",this.parameters={width:t,height:e,widthSegments:n,heightSegments:s};let r=t/2,o=e/2,a=Math.floor(n),l=Math.floor(s),c=a+1,h=l+1,d=t/a,f=e/l,m=[],g=[],x=[],p=[];for(let u=0;u<h;u++){let w=u*f-o;for(let v=0;v<c;v++){let P=v*d-r;g.push(P,-w,0),x.push(0,0,1),p.push(v/a),p.push(1-u/l)}}for(let u=0;u<l;u++)for(let w=0;w<a;w++){let v=w+c*u,P=w+c*(u+1),U=w+1+c*(u+1),R=w+1+c*u;m.push(v,P,R),m.push(P,U,R)}this.setIndex(m),this.setAttribute(\"position\",new Re(g,3)),this.setAttribute(\"normal\",new Re(x,3)),this.setAttribute(\"uv\",new Re(p,2))}copy(t){return super.copy(t),this.parameters=Object.assign({},t.parameters),this}static fromJSON(t){return new i(t.width,t.height,t.widthSegments,t.heightSegments)}},zc=`#ifdef USE_ALPHAHASH\n\tif ( diffuseColor.a < getAlphaHashThreshold( vPosition ) ) discard;\n#endif`,Vc=`#ifdef USE_ALPHAHASH\n\tconst float ALPHA_HASH_SCALE = 0.05;\n\tfloat hash2D( vec2 value ) {\n\t\treturn fract( 1.0e4 * sin( 17.0 * value.x + 0.1 * value.y ) * ( 0.1 + abs( sin( 13.0 * value.y + value.x ) ) ) );\n\t}\n\tfloat hash3D( vec3 value ) {\n\t\treturn hash2D( vec2( hash2D( value.xy ), value.z ) );\n\t}\n\tfloat getAlphaHashThreshold( vec3 position ) {\n\t\tfloat maxDeriv = max(\n\t\t\tlength( dFdx( position.xyz ) ),\n\t\t\tlength( dFdy( position.xyz ) )\n\t\t);\n\t\tfloat pixScale = 1.0 / ( ALPHA_HASH_SCALE * maxDeriv );\n\t\tvec2 pixScales = vec2(\n\t\t\texp2( floor( log2( pixScale ) ) ),\n\t\t\texp2( ceil( log2( pixScale ) ) )\n\t\t);\n\t\tvec2 alpha = vec2(\n\t\t\thash3D( floor( pixScales.x * position.xyz ) ),\n\t\t\thash3D( floor( pixScales.y * position.xyz ) )\n\t\t);\n\t\tfloat lerpFactor = fract( log2( pixScale ) );\n\t\tfloat x = ( 1.0 - lerpFactor ) * alpha.x + lerpFactor * alpha.y;\n\t\tfloat a = min( lerpFactor, 1.0 - lerpFactor );\n\t\tvec3 cases = vec3(\n\t\t\tx * x / ( 2.0 * a * ( 1.0 - a ) ),\n\t\t\t( x - 0.5 * a ) / ( 1.0 - a ),\n\t\t\t1.0 - ( ( 1.0 - x ) * ( 1.0 - x ) / ( 2.0 * a * ( 1.0 - a ) ) )\n\t\t);\n\t\tfloat threshold = ( x < ( 1.0 - a ) )\n\t\t\t? ( ( x < a ) ? cases.x : cases.y )\n\t\t\t: cases.z;\n\t\treturn clamp( threshold , 1.0e-6, 1.0 );\n\t}\n#endif`,kc=`#ifdef USE_ALPHAMAP\n\tdiffuseColor.a *= texture2D( alphaMap, vAlphaMapUv ).g;\n#endif`,Hc=`#ifdef USE_ALPHAMAP\n\tuniform sampler2D alphaMap;\n#endif`,Gc=`#ifdef USE_ALPHATEST\n\tif ( diffuseColor.a < alphaTest ) discard;\n#endif`,Wc=`#ifdef USE_ALPHATEST\n\tuniform float alphaTest;\n#endif`,Xc=`#ifdef USE_AOMAP\n\tfloat ambientOcclusion = ( texture2D( aoMap, vAoMapUv ).r - 1.0 ) * aoMapIntensity + 1.0;\n\treflectedLight.indirectDiffuse *= ambientOcclusion;\n\t#if defined( USE_CLEARCOAT ) \n\t\tclearcoatSpecularIndirect *= ambientOcclusion;\n\t#endif\n\t#if defined( USE_SHEEN ) \n\t\tsheenSpecularIndirect *= ambientOcclusion;\n\t#endif\n\t#if defined( USE_ENVMAP ) && defined( STANDARD )\n\t\tfloat dotNV = saturate( dot( geometryNormal, geometryViewDir ) );\n\t\treflectedLight.indirectSpecular *= computeSpecularOcclusion( dotNV, ambientOcclusion, material.roughness );\n\t#endif\n#endif`,qc=`#ifdef USE_AOMAP\n\tuniform sampler2D aoMap;\n\tuniform float aoMapIntensity;\n#endif`,Yc=`#ifdef USE_BATCHING\n\tattribute float batchId;\n\tuniform highp sampler2D batchingTexture;\n\tmat4 getBatchingMatrix( const in float i ) {\n\t\tint size = textureSize( batchingTexture, 0 ).x;\n\t\tint j = int( i ) * 4;\n\t\tint x = j % size;\n\t\tint y = j / size;\n\t\tvec4 v1 = texelFetch( batchingTexture, ivec2( x, y ), 0 );\n\t\tvec4 v2 = texelFetch( batchingTexture, ivec2( x + 1, y ), 0 );\n\t\tvec4 v3 = texelFetch( batchingTexture, ivec2( x + 2, y ), 0 );\n\t\tvec4 v4 = texelFetch( batchingTexture, ivec2( x + 3, y ), 0 );\n\t\treturn mat4( v1, v2, v3, v4 );\n\t}\n#endif`,Zc=`#ifdef USE_BATCHING\n\tmat4 batchingMatrix = getBatchingMatrix( batchId );\n#endif`,Jc=`vec3 transformed = vec3( position );\n#ifdef USE_ALPHAHASH\n\tvPosition = vec3( position );\n#endif`,$c=`vec3 objectNormal = vec3( normal );\n#ifdef USE_TANGENT\n\tvec3 objectTangent = vec3( tangent.xyz );\n#endif`,Kc=`float G_BlinnPhong_Implicit( ) {\n\treturn 0.25;\n}\nfloat D_BlinnPhong( const in float shininess, const in float dotNH ) {\n\treturn RECIPROCAL_PI * ( shininess * 0.5 + 1.0 ) * pow( dotNH, shininess );\n}\nvec3 BRDF_BlinnPhong( const in vec3 lightDir, const in vec3 viewDir, const in vec3 normal, const in vec3 specularColor, const in float shininess ) {\n\tvec3 halfDir = normalize( lightDir + viewDir );\n\tfloat dotNH = saturate( dot( normal, halfDir ) );\n\tfloat dotVH = saturate( dot( viewDir, halfDir ) );\n\tvec3 F = F_Schlick( specularColor, 1.0, dotVH );\n\tfloat G = G_BlinnPhong_Implicit( );\n\tfloat D = D_BlinnPhong( shininess, dotNH );\n\treturn F * ( G * D );\n} // validated`,Qc=`#ifdef USE_IRIDESCENCE\n\tconst mat3 XYZ_TO_REC709 = mat3(\n\t\t 3.2404542, -0.9692660,  0.0556434,\n\t\t-1.5371385,  1.8760108, -0.2040259,\n\t\t-0.4985314,  0.0415560,  1.0572252\n\t);\n\tvec3 Fresnel0ToIor( vec3 fresnel0 ) {\n\t\tvec3 sqrtF0 = sqrt( fresnel0 );\n\t\treturn ( vec3( 1.0 ) + sqrtF0 ) / ( vec3( 1.0 ) - sqrtF0 );\n\t}\n\tvec3 IorToFresnel0( vec3 transmittedIor, float incidentIor ) {\n\t\treturn pow2( ( transmittedIor - vec3( incidentIor ) ) / ( transmittedIor + vec3( incidentIor ) ) );\n\t}\n\tfloat IorToFresnel0( float transmittedIor, float incidentIor ) {\n\t\treturn pow2( ( transmittedIor - incidentIor ) / ( transmittedIor + incidentIor ));\n\t}\n\tvec3 evalSensitivity( float OPD, vec3 shift ) {\n\t\tfloat phase = 2.0 * PI * OPD * 1.0e-9;\n\t\tvec3 val = vec3( 5.4856e-13, 4.4201e-13, 5.2481e-13 );\n\t\tvec3 pos = vec3( 1.6810e+06, 1.7953e+06, 2.2084e+06 );\n\t\tvec3 var = vec3( 4.3278e+09, 9.3046e+09, 6.6121e+09 );\n\t\tvec3 xyz = val * sqrt( 2.0 * PI * var ) * cos( pos * phase + shift ) * exp( - pow2( phase ) * var );\n\t\txyz.x += 9.7470e-14 * sqrt( 2.0 * PI * 4.5282e+09 ) * cos( 2.2399e+06 * phase + shift[ 0 ] ) * exp( - 4.5282e+09 * pow2( phase ) );\n\t\txyz /= 1.0685e-7;\n\t\tvec3 rgb = XYZ_TO_REC709 * xyz;\n\t\treturn rgb;\n\t}\n\tvec3 evalIridescence( float outsideIOR, float eta2, float cosTheta1, float thinFilmThickness, vec3 baseF0 ) {\n\t\tvec3 I;\n\t\tfloat iridescenceIOR = mix( outsideIOR, eta2, smoothstep( 0.0, 0.03, thinFilmThickness ) );\n\t\tfloat sinTheta2Sq = pow2( outsideIOR / iridescenceIOR ) * ( 1.0 - pow2( cosTheta1 ) );\n\t\tfloat cosTheta2Sq = 1.0 - sinTheta2Sq;\n\t\tif ( cosTheta2Sq < 0.0 ) {\n\t\t\treturn vec3( 1.0 );\n\t\t}\n\t\tfloat cosTheta2 = sqrt( cosTheta2Sq );\n\t\tfloat R0 = IorToFresnel0( iridescenceIOR, outsideIOR );\n\t\tfloat R12 = F_Schlick( R0, 1.0, cosTheta1 );\n\t\tfloat T121 = 1.0 - R12;\n\t\tfloat phi12 = 0.0;\n\t\tif ( iridescenceIOR < outsideIOR ) phi12 = PI;\n\t\tfloat phi21 = PI - phi12;\n\t\tvec3 baseIOR = Fresnel0ToIor( clamp( baseF0, 0.0, 0.9999 ) );\t\tvec3 R1 = IorToFresnel0( baseIOR, iridescenceIOR );\n\t\tvec3 R23 = F_Schlick( R1, 1.0, cosTheta2 );\n\t\tvec3 phi23 = vec3( 0.0 );\n\t\tif ( baseIOR[ 0 ] < iridescenceIOR ) phi23[ 0 ] = PI;\n\t\tif ( baseIOR[ 1 ] < iridescenceIOR ) phi23[ 1 ] = PI;\n\t\tif ( baseIOR[ 2 ] < iridescenceIOR ) phi23[ 2 ] = PI;\n\t\tfloat OPD = 2.0 * iridescenceIOR * thinFilmThickness * cosTheta2;\n\t\tvec3 phi = vec3( phi21 ) + phi23;\n\t\tvec3 R123 = clamp( R12 * R23, 1e-5, 0.9999 );\n\t\tvec3 r123 = sqrt( R123 );\n\t\tvec3 Rs = pow2( T121 ) * R23 / ( vec3( 1.0 ) - R123 );\n\t\tvec3 C0 = R12 + Rs;\n\t\tI = C0;\n\t\tvec3 Cm = Rs - T121;\n\t\tfor ( int m = 1; m <= 2; ++ m ) {\n\t\t\tCm *= r123;\n\t\t\tvec3 Sm = 2.0 * evalSensitivity( float( m ) * OPD, float( m ) * phi );\n\t\t\tI += Cm * Sm;\n\t\t}\n\t\treturn max( I, vec3( 0.0 ) );\n\t}\n#endif`,jc=`#ifdef USE_BUMPMAP\n\tuniform sampler2D bumpMap;\n\tuniform float bumpScale;\n\tvec2 dHdxy_fwd() {\n\t\tvec2 dSTdx = dFdx( vBumpMapUv );\n\t\tvec2 dSTdy = dFdy( vBumpMapUv );\n\t\tfloat Hll = bumpScale * texture2D( bumpMap, vBumpMapUv ).x;\n\t\tfloat dBx = bumpScale * texture2D( bumpMap, vBumpMapUv + dSTdx ).x - Hll;\n\t\tfloat dBy = bumpScale * texture2D( bumpMap, vBumpMapUv + dSTdy ).x - Hll;\n\t\treturn vec2( dBx, dBy );\n\t}\n\tvec3 perturbNormalArb( vec3 surf_pos, vec3 surf_norm, vec2 dHdxy, float faceDirection ) {\n\t\tvec3 vSigmaX = normalize( dFdx( surf_pos.xyz ) );\n\t\tvec3 vSigmaY = normalize( dFdy( surf_pos.xyz ) );\n\t\tvec3 vN = surf_norm;\n\t\tvec3 R1 = cross( vSigmaY, vN );\n\t\tvec3 R2 = cross( vN, vSigmaX );\n\t\tfloat fDet = dot( vSigmaX, R1 ) * faceDirection;\n\t\tvec3 vGrad = sign( fDet ) * ( dHdxy.x * R1 + dHdxy.y * R2 );\n\t\treturn normalize( abs( fDet ) * surf_norm - vGrad );\n\t}\n#endif`,th=`#if NUM_CLIPPING_PLANES > 0\n\tvec4 plane;\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < UNION_CLIPPING_PLANES; i ++ ) {\n\t\tplane = clippingPlanes[ i ];\n\t\tif ( dot( vClipPosition, plane.xyz ) > plane.w ) discard;\n\t}\n\t#pragma unroll_loop_end\n\t#if UNION_CLIPPING_PLANES < NUM_CLIPPING_PLANES\n\t\tbool clipped = true;\n\t\t#pragma unroll_loop_start\n\t\tfor ( int i = UNION_CLIPPING_PLANES; i < NUM_CLIPPING_PLANES; i ++ ) {\n\t\t\tplane = clippingPlanes[ i ];\n\t\t\tclipped = ( dot( vClipPosition, plane.xyz ) > plane.w ) && clipped;\n\t\t}\n\t\t#pragma unroll_loop_end\n\t\tif ( clipped ) discard;\n\t#endif\n#endif`,eh=`#if NUM_CLIPPING_PLANES > 0\n\tvarying vec3 vClipPosition;\n\tuniform vec4 clippingPlanes[ NUM_CLIPPING_PLANES ];\n#endif`,nh=`#if NUM_CLIPPING_PLANES > 0\n\tvarying vec3 vClipPosition;\n#endif`,ih=`#if NUM_CLIPPING_PLANES > 0\n\tvClipPosition = - mvPosition.xyz;\n#endif`,sh=`#if defined( USE_COLOR_ALPHA )\n\tdiffuseColor *= vColor;\n#elif defined( USE_COLOR )\n\tdiffuseColor.rgb *= vColor;\n#endif`,rh=`#if defined( USE_COLOR_ALPHA )\n\tvarying vec4 vColor;\n#elif defined( USE_COLOR )\n\tvarying vec3 vColor;\n#endif`,ah=`#if defined( USE_COLOR_ALPHA )\n\tvarying vec4 vColor;\n#elif defined( USE_COLOR ) || defined( USE_INSTANCING_COLOR )\n\tvarying vec3 vColor;\n#endif`,oh=`#if defined( USE_COLOR_ALPHA )\n\tvColor = vec4( 1.0 );\n#elif defined( USE_COLOR ) || defined( USE_INSTANCING_COLOR )\n\tvColor = vec3( 1.0 );\n#endif\n#ifdef USE_COLOR\n\tvColor *= color;\n#endif\n#ifdef USE_INSTANCING_COLOR\n\tvColor.xyz *= instanceColor.xyz;\n#endif`,lh=`#define PI 3.141592653589793\n#define PI2 6.283185307179586\n#define PI_HALF 1.5707963267948966\n#define RECIPROCAL_PI 0.3183098861837907\n#define RECIPROCAL_PI2 0.15915494309189535\n#define EPSILON 1e-6\n#ifndef saturate\n#define saturate( a ) clamp( a, 0.0, 1.0 )\n#endif\n#define whiteComplement( a ) ( 1.0 - saturate( a ) )\nfloat pow2( const in float x ) { return x*x; }\nvec3 pow2( const in vec3 x ) { return x*x; }\nfloat pow3( const in float x ) { return x*x*x; }\nfloat pow4( const in float x ) { float x2 = x*x; return x2*x2; }\nfloat max3( const in vec3 v ) { return max( max( v.x, v.y ), v.z ); }\nfloat average( const in vec3 v ) { return dot( v, vec3( 0.3333333 ) ); }\nhighp float rand( const in vec2 uv ) {\n\tconst highp float a = 12.9898, b = 78.233, c = 43758.5453;\n\thighp float dt = dot( uv.xy, vec2( a,b ) ), sn = mod( dt, PI );\n\treturn fract( sin( sn ) * c );\n}\n#ifdef HIGH_PRECISION\n\tfloat precisionSafeLength( vec3 v ) { return length( v ); }\n#else\n\tfloat precisionSafeLength( vec3 v ) {\n\t\tfloat maxComponent = max3( abs( v ) );\n\t\treturn length( v / maxComponent ) * maxComponent;\n\t}\n#endif\nstruct IncidentLight {\n\tvec3 color;\n\tvec3 direction;\n\tbool visible;\n};\nstruct ReflectedLight {\n\tvec3 directDiffuse;\n\tvec3 directSpecular;\n\tvec3 indirectDiffuse;\n\tvec3 indirectSpecular;\n};\n#ifdef USE_ALPHAHASH\n\tvarying vec3 vPosition;\n#endif\nvec3 transformDirection( in vec3 dir, in mat4 matrix ) {\n\treturn normalize( ( matrix * vec4( dir, 0.0 ) ).xyz );\n}\nvec3 inverseTransformDirection( in vec3 dir, in mat4 matrix ) {\n\treturn normalize( ( vec4( dir, 0.0 ) * matrix ).xyz );\n}\nmat3 transposeMat3( const in mat3 m ) {\n\tmat3 tmp;\n\ttmp[ 0 ] = vec3( m[ 0 ].x, m[ 1 ].x, m[ 2 ].x );\n\ttmp[ 1 ] = vec3( m[ 0 ].y, m[ 1 ].y, m[ 2 ].y );\n\ttmp[ 2 ] = vec3( m[ 0 ].z, m[ 1 ].z, m[ 2 ].z );\n\treturn tmp;\n}\nfloat luminance( const in vec3 rgb ) {\n\tconst vec3 weights = vec3( 0.2126729, 0.7151522, 0.0721750 );\n\treturn dot( weights, rgb );\n}\nbool isPerspectiveMatrix( mat4 m ) {\n\treturn m[ 2 ][ 3 ] == - 1.0;\n}\nvec2 equirectUv( in vec3 dir ) {\n\tfloat u = atan( dir.z, dir.x ) * RECIPROCAL_PI2 + 0.5;\n\tfloat v = asin( clamp( dir.y, - 1.0, 1.0 ) ) * RECIPROCAL_PI + 0.5;\n\treturn vec2( u, v );\n}\nvec3 BRDF_Lambert( const in vec3 diffuseColor ) {\n\treturn RECIPROCAL_PI * diffuseColor;\n}\nvec3 F_Schlick( const in vec3 f0, const in float f90, const in float dotVH ) {\n\tfloat fresnel = exp2( ( - 5.55473 * dotVH - 6.98316 ) * dotVH );\n\treturn f0 * ( 1.0 - fresnel ) + ( f90 * fresnel );\n}\nfloat F_Schlick( const in float f0, const in float f90, const in float dotVH ) {\n\tfloat fresnel = exp2( ( - 5.55473 * dotVH - 6.98316 ) * dotVH );\n\treturn f0 * ( 1.0 - fresnel ) + ( f90 * fresnel );\n} // validated`,ch=`#ifdef ENVMAP_TYPE_CUBE_UV\n\t#define cubeUV_minMipLevel 4.0\n\t#define cubeUV_minTileSize 16.0\n\tfloat getFace( vec3 direction ) {\n\t\tvec3 absDirection = abs( direction );\n\t\tfloat face = - 1.0;\n\t\tif ( absDirection.x > absDirection.z ) {\n\t\t\tif ( absDirection.x > absDirection.y )\n\t\t\t\tface = direction.x > 0.0 ? 0.0 : 3.0;\n\t\t\telse\n\t\t\t\tface = direction.y > 0.0 ? 1.0 : 4.0;\n\t\t} else {\n\t\t\tif ( absDirection.z > absDirection.y )\n\t\t\t\tface = direction.z > 0.0 ? 2.0 : 5.0;\n\t\t\telse\n\t\t\t\tface = direction.y > 0.0 ? 1.0 : 4.0;\n\t\t}\n\t\treturn face;\n\t}\n\tvec2 getUV( vec3 direction, float face ) {\n\t\tvec2 uv;\n\t\tif ( face == 0.0 ) {\n\t\t\tuv = vec2( direction.z, direction.y ) / abs( direction.x );\n\t\t} else if ( face == 1.0 ) {\n\t\t\tuv = vec2( - direction.x, - direction.z ) / abs( direction.y );\n\t\t} else if ( face == 2.0 ) {\n\t\t\tuv = vec2( - direction.x, direction.y ) / abs( direction.z );\n\t\t} else if ( face == 3.0 ) {\n\t\t\tuv = vec2( - direction.z, direction.y ) / abs( direction.x );\n\t\t} else if ( face == 4.0 ) {\n\t\t\tuv = vec2( - direction.x, direction.z ) / abs( direction.y );\n\t\t} else {\n\t\t\tuv = vec2( direction.x, direction.y ) / abs( direction.z );\n\t\t}\n\t\treturn 0.5 * ( uv + 1.0 );\n\t}\n\tvec3 bilinearCubeUV( sampler2D envMap, vec3 direction, float mipInt ) {\n\t\tfloat face = getFace( direction );\n\t\tfloat filterInt = max( cubeUV_minMipLevel - mipInt, 0.0 );\n\t\tmipInt = max( mipInt, cubeUV_minMipLevel );\n\t\tfloat faceSize = exp2( mipInt );\n\t\thighp vec2 uv = getUV( direction, face ) * ( faceSize - 2.0 ) + 1.0;\n\t\tif ( face > 2.0 ) {\n\t\t\tuv.y += faceSize;\n\t\t\tface -= 3.0;\n\t\t}\n\t\tuv.x += face * faceSize;\n\t\tuv.x += filterInt * 3.0 * cubeUV_minTileSize;\n\t\tuv.y += 4.0 * ( exp2( CUBEUV_MAX_MIP ) - faceSize );\n\t\tuv.x *= CUBEUV_TEXEL_WIDTH;\n\t\tuv.y *= CUBEUV_TEXEL_HEIGHT;\n\t\t#ifdef texture2DGradEXT\n\t\t\treturn texture2DGradEXT( envMap, uv, vec2( 0.0 ), vec2( 0.0 ) ).rgb;\n\t\t#else\n\t\t\treturn texture2D( envMap, uv ).rgb;\n\t\t#endif\n\t}\n\t#define cubeUV_r0 1.0\n\t#define cubeUV_m0 - 2.0\n\t#define cubeUV_r1 0.8\n\t#define cubeUV_m1 - 1.0\n\t#define cubeUV_r4 0.4\n\t#define cubeUV_m4 2.0\n\t#define cubeUV_r5 0.305\n\t#define cubeUV_m5 3.0\n\t#define cubeUV_r6 0.21\n\t#define cubeUV_m6 4.0\n\tfloat roughnessToMip( float roughness ) {\n\t\tfloat mip = 0.0;\n\t\tif ( roughness >= cubeUV_r1 ) {\n\t\t\tmip = ( cubeUV_r0 - roughness ) * ( cubeUV_m1 - cubeUV_m0 ) / ( cubeUV_r0 - cubeUV_r1 ) + cubeUV_m0;\n\t\t} else if ( roughness >= cubeUV_r4 ) {\n\t\t\tmip = ( cubeUV_r1 - roughness ) * ( cubeUV_m4 - cubeUV_m1 ) / ( cubeUV_r1 - cubeUV_r4 ) + cubeUV_m1;\n\t\t} else if ( roughness >= cubeUV_r5 ) {\n\t\t\tmip = ( cubeUV_r4 - roughness ) * ( cubeUV_m5 - cubeUV_m4 ) / ( cubeUV_r4 - cubeUV_r5 ) + cubeUV_m4;\n\t\t} else if ( roughness >= cubeUV_r6 ) {\n\t\t\tmip = ( cubeUV_r5 - roughness ) * ( cubeUV_m6 - cubeUV_m5 ) / ( cubeUV_r5 - cubeUV_r6 ) + cubeUV_m5;\n\t\t} else {\n\t\t\tmip = - 2.0 * log2( 1.16 * roughness );\t\t}\n\t\treturn mip;\n\t}\n\tvec4 textureCubeUV( sampler2D envMap, vec3 sampleDir, float roughness ) {\n\t\tfloat mip = clamp( roughnessToMip( roughness ), cubeUV_m0, CUBEUV_MAX_MIP );\n\t\tfloat mipF = fract( mip );\n\t\tfloat mipInt = floor( mip );\n\t\tvec3 color0 = bilinearCubeUV( envMap, sampleDir, mipInt );\n\t\tif ( mipF == 0.0 ) {\n\t\t\treturn vec4( color0, 1.0 );\n\t\t} else {\n\t\t\tvec3 color1 = bilinearCubeUV( envMap, sampleDir, mipInt + 1.0 );\n\t\t\treturn vec4( mix( color0, color1, mipF ), 1.0 );\n\t\t}\n\t}\n#endif`,hh=`vec3 transformedNormal = objectNormal;\n#ifdef USE_TANGENT\n\tvec3 transformedTangent = objectTangent;\n#endif\n#ifdef USE_BATCHING\n\tmat3 bm = mat3( batchingMatrix );\n\ttransformedNormal /= vec3( dot( bm[ 0 ], bm[ 0 ] ), dot( bm[ 1 ], bm[ 1 ] ), dot( bm[ 2 ], bm[ 2 ] ) );\n\ttransformedNormal = bm * transformedNormal;\n\t#ifdef USE_TANGENT\n\t\ttransformedTangent = bm * transformedTangent;\n\t#endif\n#endif\n#ifdef USE_INSTANCING\n\tmat3 im = mat3( instanceMatrix );\n\ttransformedNormal /= vec3( dot( im[ 0 ], im[ 0 ] ), dot( im[ 1 ], im[ 1 ] ), dot( im[ 2 ], im[ 2 ] ) );\n\ttransformedNormal = im * transformedNormal;\n\t#ifdef USE_TANGENT\n\t\ttransformedTangent = im * transformedTangent;\n\t#endif\n#endif\ntransformedNormal = normalMatrix * transformedNormal;\n#ifdef FLIP_SIDED\n\ttransformedNormal = - transformedNormal;\n#endif\n#ifdef USE_TANGENT\n\ttransformedTangent = ( modelViewMatrix * vec4( transformedTangent, 0.0 ) ).xyz;\n\t#ifdef FLIP_SIDED\n\t\ttransformedTangent = - transformedTangent;\n\t#endif\n#endif`,uh=`#ifdef USE_DISPLACEMENTMAP\n\tuniform sampler2D displacementMap;\n\tuniform float displacementScale;\n\tuniform float displacementBias;\n#endif`,dh=`#ifdef USE_DISPLACEMENTMAP\n\ttransformed += normalize( objectNormal ) * ( texture2D( displacementMap, vDisplacementMapUv ).x * displacementScale + displacementBias );\n#endif`,fh=`#ifdef USE_EMISSIVEMAP\n\tvec4 emissiveColor = texture2D( emissiveMap, vEmissiveMapUv );\n\ttotalEmissiveRadiance *= emissiveColor.rgb;\n#endif`,ph=`#ifdef USE_EMISSIVEMAP\n\tuniform sampler2D emissiveMap;\n#endif`,mh=\"gl_FragColor = linearToOutputTexel( gl_FragColor );\",gh=`\nconst mat3 LINEAR_SRGB_TO_LINEAR_DISPLAY_P3 = mat3(\n\tvec3( 0.8224621, 0.177538, 0.0 ),\n\tvec3( 0.0331941, 0.9668058, 0.0 ),\n\tvec3( 0.0170827, 0.0723974, 0.9105199 )\n);\nconst mat3 LINEAR_DISPLAY_P3_TO_LINEAR_SRGB = mat3(\n\tvec3( 1.2249401, - 0.2249404, 0.0 ),\n\tvec3( - 0.0420569, 1.0420571, 0.0 ),\n\tvec3( - 0.0196376, - 0.0786361, 1.0982735 )\n);\nvec4 LinearSRGBToLinearDisplayP3( in vec4 value ) {\n\treturn vec4( value.rgb * LINEAR_SRGB_TO_LINEAR_DISPLAY_P3, value.a );\n}\nvec4 LinearDisplayP3ToLinearSRGB( in vec4 value ) {\n\treturn vec4( value.rgb * LINEAR_DISPLAY_P3_TO_LINEAR_SRGB, value.a );\n}\nvec4 LinearTransferOETF( in vec4 value ) {\n\treturn value;\n}\nvec4 sRGBTransferOETF( in vec4 value ) {\n\treturn vec4( mix( pow( value.rgb, vec3( 0.41666 ) ) * 1.055 - vec3( 0.055 ), value.rgb * 12.92, vec3( lessThanEqual( value.rgb, vec3( 0.0031308 ) ) ) ), value.a );\n}\nvec4 LinearToLinear( in vec4 value ) {\n\treturn value;\n}\nvec4 LinearTosRGB( in vec4 value ) {\n\treturn sRGBTransferOETF( value );\n}`,_h=`#ifdef USE_ENVMAP\n\t#ifdef ENV_WORLDPOS\n\t\tvec3 cameraToFrag;\n\t\tif ( isOrthographic ) {\n\t\t\tcameraToFrag = normalize( vec3( - viewMatrix[ 0 ][ 2 ], - viewMatrix[ 1 ][ 2 ], - viewMatrix[ 2 ][ 2 ] ) );\n\t\t} else {\n\t\t\tcameraToFrag = normalize( vWorldPosition - cameraPosition );\n\t\t}\n\t\tvec3 worldNormal = inverseTransformDirection( normal, viewMatrix );\n\t\t#ifdef ENVMAP_MODE_REFLECTION\n\t\t\tvec3 reflectVec = reflect( cameraToFrag, worldNormal );\n\t\t#else\n\t\t\tvec3 reflectVec = refract( cameraToFrag, worldNormal, refractionRatio );\n\t\t#endif\n\t#else\n\t\tvec3 reflectVec = vReflect;\n\t#endif\n\t#ifdef ENVMAP_TYPE_CUBE\n\t\tvec4 envColor = textureCube( envMap, vec3( flipEnvMap * reflectVec.x, reflectVec.yz ) );\n\t#else\n\t\tvec4 envColor = vec4( 0.0 );\n\t#endif\n\t#ifdef ENVMAP_BLENDING_MULTIPLY\n\t\toutgoingLight = mix( outgoingLight, outgoingLight * envColor.xyz, specularStrength * reflectivity );\n\t#elif defined( ENVMAP_BLENDING_MIX )\n\t\toutgoingLight = mix( outgoingLight, envColor.xyz, specularStrength * reflectivity );\n\t#elif defined( ENVMAP_BLENDING_ADD )\n\t\toutgoingLight += envColor.xyz * specularStrength * reflectivity;\n\t#endif\n#endif`,xh=`#ifdef USE_ENVMAP\n\tuniform float envMapIntensity;\n\tuniform float flipEnvMap;\n\t#ifdef ENVMAP_TYPE_CUBE\n\t\tuniform samplerCube envMap;\n\t#else\n\t\tuniform sampler2D envMap;\n\t#endif\n\t\n#endif`,vh=`#ifdef USE_ENVMAP\n\tuniform float reflectivity;\n\t#if defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( PHONG ) || defined( LAMBERT )\n\t\t#define ENV_WORLDPOS\n\t#endif\n\t#ifdef ENV_WORLDPOS\n\t\tvarying vec3 vWorldPosition;\n\t\tuniform float refractionRatio;\n\t#else\n\t\tvarying vec3 vReflect;\n\t#endif\n#endif`,yh=`#ifdef USE_ENVMAP\n\t#if defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( PHONG ) || defined( LAMBERT )\n\t\t#define ENV_WORLDPOS\n\t#endif\n\t#ifdef ENV_WORLDPOS\n\t\t\n\t\tvarying vec3 vWorldPosition;\n\t#else\n\t\tvarying vec3 vReflect;\n\t\tuniform float refractionRatio;\n\t#endif\n#endif`,Mh=`#ifdef USE_ENVMAP\n\t#ifdef ENV_WORLDPOS\n\t\tvWorldPosition = worldPosition.xyz;\n\t#else\n\t\tvec3 cameraToVertex;\n\t\tif ( isOrthographic ) {\n\t\t\tcameraToVertex = normalize( vec3( - viewMatrix[ 0 ][ 2 ], - viewMatrix[ 1 ][ 2 ], - viewMatrix[ 2 ][ 2 ] ) );\n\t\t} else {\n\t\t\tcameraToVertex = normalize( worldPosition.xyz - cameraPosition );\n\t\t}\n\t\tvec3 worldNormal = inverseTransformDirection( transformedNormal, viewMatrix );\n\t\t#ifdef ENVMAP_MODE_REFLECTION\n\t\t\tvReflect = reflect( cameraToVertex, worldNormal );\n\t\t#else\n\t\t\tvReflect = refract( cameraToVertex, worldNormal, refractionRatio );\n\t\t#endif\n\t#endif\n#endif`,Sh=`#ifdef USE_FOG\n\tvFogDepth = - mvPosition.z;\n#endif`,bh=`#ifdef USE_FOG\n\tvarying float vFogDepth;\n#endif`,Eh=`#ifdef USE_FOG\n\t#ifdef FOG_EXP2\n\t\tfloat fogFactor = 1.0 - exp( - fogDensity * fogDensity * vFogDepth * vFogDepth );\n\t#else\n\t\tfloat fogFactor = smoothstep( fogNear, fogFar, vFogDepth );\n\t#endif\n\tgl_FragColor.rgb = mix( gl_FragColor.rgb, fogColor, fogFactor );\n#endif`,wh=`#ifdef USE_FOG\n\tuniform vec3 fogColor;\n\tvarying float vFogDepth;\n\t#ifdef FOG_EXP2\n\t\tuniform float fogDensity;\n\t#else\n\t\tuniform float fogNear;\n\t\tuniform float fogFar;\n\t#endif\n#endif`,Th=`#ifdef USE_GRADIENTMAP\n\tuniform sampler2D gradientMap;\n#endif\nvec3 getGradientIrradiance( vec3 normal, vec3 lightDirection ) {\n\tfloat dotNL = dot( normal, lightDirection );\n\tvec2 coord = vec2( dotNL * 0.5 + 0.5, 0.0 );\n\t#ifdef USE_GRADIENTMAP\n\t\treturn vec3( texture2D( gradientMap, coord ).r );\n\t#else\n\t\tvec2 fw = fwidth( coord ) * 0.5;\n\t\treturn mix( vec3( 0.7 ), vec3( 1.0 ), smoothstep( 0.7 - fw.x, 0.7 + fw.x, coord.x ) );\n\t#endif\n}`,Ah=`#ifdef USE_LIGHTMAP\n\tvec4 lightMapTexel = texture2D( lightMap, vLightMapUv );\n\tvec3 lightMapIrradiance = lightMapTexel.rgb * lightMapIntensity;\n\treflectedLight.indirectDiffuse += lightMapIrradiance;\n#endif`,Ch=`#ifdef USE_LIGHTMAP\n\tuniform sampler2D lightMap;\n\tuniform float lightMapIntensity;\n#endif`,Rh=`LambertMaterial material;\nmaterial.diffuseColor = diffuseColor.rgb;\nmaterial.specularStrength = specularStrength;`,Ph=`varying vec3 vViewPosition;\nstruct LambertMaterial {\n\tvec3 diffuseColor;\n\tfloat specularStrength;\n};\nvoid RE_Direct_Lambert( const in IncidentLight directLight, const in vec3 geometryPosition, const in vec3 geometryNormal, const in vec3 geometryViewDir, const in vec3 geometryClearcoatNormal, const in LambertMaterial material, inout ReflectedLight reflectedLight ) {\n\tfloat dotNL = saturate( dot( geometryNormal, directLight.direction ) );\n\tvec3 irradiance = dotNL * directLight.color;\n\treflectedLight.directDiffuse += irradiance * BRDF_Lambert( material.diffuseColor );\n}\nvoid RE_IndirectDiffuse_Lambert( const in vec3 irradiance, const in vec3 geometryPosition, const in vec3 geometryNormal, const in vec3 geometryViewDir, const in vec3 geometryClearcoatNormal, const in LambertMaterial material, inout ReflectedLight reflectedLight ) {\n\treflectedLight.indirectDiffuse += irradiance * BRDF_Lambert( material.diffuseColor );\n}\n#define RE_Direct\t\t\t\tRE_Direct_Lambert\n#define RE_IndirectDiffuse\t\tRE_IndirectDiffuse_Lambert`,Lh=`uniform bool receiveShadow;\nuniform vec3 ambientLightColor;\n#if defined( USE_LIGHT_PROBES )\n\tuniform vec3 lightProbe[ 9 ];\n#endif\nvec3 shGetIrradianceAt( in vec3 normal, in vec3 shCoefficients[ 9 ] ) {\n\tfloat x = normal.x, y = normal.y, z = normal.z;\n\tvec3 result = shCoefficients[ 0 ] * 0.886227;\n\tresult += shCoefficients[ 1 ] * 2.0 * 0.511664 * y;\n\tresult += shCoefficients[ 2 ] * 2.0 * 0.511664 * z;\n\tresult += shCoefficients[ 3 ] * 2.0 * 0.511664 * x;\n\tresult += shCoefficients[ 4 ] * 2.0 * 0.429043 * x * y;\n\tresult += shCoefficients[ 5 ] * 2.0 * 0.429043 * y * z;\n\tresult += shCoefficients[ 6 ] * ( 0.743125 * z * z - 0.247708 );\n\tresult += shCoefficients[ 7 ] * 2.0 * 0.429043 * x * z;\n\tresult += shCoefficients[ 8 ] * 0.429043 * ( x * x - y * y );\n\treturn result;\n}\nvec3 getLightProbeIrradiance( const in vec3 lightProbe[ 9 ], const in vec3 normal ) {\n\tvec3 worldNormal = inverseTransformDirection( normal, viewMatrix );\n\tvec3 irradiance = shGetIrradianceAt( worldNormal, lightProbe );\n\treturn irradiance;\n}\nvec3 getAmbientLightIrradiance( const in vec3 ambientLightColor ) {\n\tvec3 irradiance = ambientLightColor;\n\treturn irradiance;\n}\nfloat getDistanceAttenuation( const in float lightDistance, const in float cutoffDistance, const in float decayExponent ) {\n\t#if defined ( LEGACY_LIGHTS )\n\t\tif ( cutoffDistance > 0.0 && decayExponent > 0.0 ) {\n\t\t\treturn pow( saturate( - lightDistance / cutoffDistance + 1.0 ), decayExponent );\n\t\t}\n\t\treturn 1.0;\n\t#else\n\t\tfloat distanceFalloff = 1.0 / max( pow( lightDistance, decayExponent ), 0.01 );\n\t\tif ( cutoffDistance > 0.0 ) {\n\t\t\tdistanceFalloff *= pow2( saturate( 1.0 - pow4( lightDistance / cutoffDistance ) ) );\n\t\t}\n\t\treturn distanceFalloff;\n\t#endif\n}\nfloat getSpotAttenuation( const in float coneCosine, const in float penumbraCosine, const in float angleCosine ) {\n\treturn smoothstep( coneCosine, penumbraCosine, angleCosine );\n}\n#if NUM_DIR_LIGHTS > 0\n\tstruct DirectionalLight {\n\t\tvec3 direction;\n\t\tvec3 color;\n\t};\n\tuniform DirectionalLight directionalLights[ NUM_DIR_LIGHTS ];\n\tvoid getDirectionalLightInfo( const in DirectionalLight directionalLight, out IncidentLight light ) {\n\t\tlight.color = directionalLight.color;\n\t\tlight.direction = directionalLight.direction;\n\t\tlight.visible = true;\n\t}\n#endif\n#if NUM_POINT_LIGHTS > 0\n\tstruct PointLight {\n\t\tvec3 position;\n\t\tvec3 color;\n\t\tfloat distance;\n\t\tfloat decay;\n\t};\n\tuniform PointLight pointLights[ NUM_POINT_LIGHTS ];\n\tvoid getPointLightInfo( const in PointLight pointLight, const in vec3 geometryPosition, out IncidentLight light ) {\n\t\tvec3 lVector = pointLight.position - geometryPosition;\n\t\tlight.direction = normalize( lVector );\n\t\tfloat lightDistance = length( lVector );\n\t\tlight.color = pointLight.color;\n\t\tlight.color *= getDistanceAttenuation( lightDistance, pointLight.distance, pointLight.decay );\n\t\tlight.visible = ( light.color != vec3( 0.0 ) );\n\t}\n#endif\n#if NUM_SPOT_LIGHTS > 0\n\tstruct SpotLight {\n\t\tvec3 position;\n\t\tvec3 direction;\n\t\tvec3 color;\n\t\tfloat distance;\n\t\tfloat decay;\n\t\tfloat coneCos;\n\t\tfloat penumbraCos;\n\t};\n\tuniform SpotLight spotLights[ NUM_SPOT_LIGHTS ];\n\tvoid getSpotLightInfo( const in SpotLight spotLight, const in vec3 geometryPosition, out IncidentLight light ) {\n\t\tvec3 lVector = spotLight.position - geometryPosition;\n\t\tlight.direction = normalize( lVector );\n\t\tfloat angleCos = dot( light.direction, spotLight.direction );\n\t\tfloat spotAttenuation = getSpotAttenuation( spotLight.coneCos, spotLight.penumbraCos, angleCos );\n\t\tif ( spotAttenuation > 0.0 ) {\n\t\t\tfloat lightDistance = length( lVector );\n\t\t\tlight.color = spotLight.color * spotAttenuation;\n\t\t\tlight.color *= getDistanceAttenuation( lightDistance, spotLight.distance, spotLight.decay );\n\t\t\tlight.visible = ( light.color != vec3( 0.0 ) );\n\t\t} else {\n\t\t\tlight.color = vec3( 0.0 );\n\t\t\tlight.visible = false;\n\t\t}\n\t}\n#endif\n#if NUM_RECT_AREA_LIGHTS > 0\n\tstruct RectAreaLight {\n\t\tvec3 color;\n\t\tvec3 position;\n\t\tvec3 halfWidth;\n\t\tvec3 halfHeight;\n\t};\n\tuniform sampler2D ltc_1;\tuniform sampler2D ltc_2;\n\tuniform RectAreaLight rectAreaLights[ NUM_RECT_AREA_LIGHTS ];\n#endif\n#if NUM_HEMI_LIGHTS > 0\n\tstruct HemisphereLight {\n\t\tvec3 direction;\n\t\tvec3 skyColor;\n\t\tvec3 groundColor;\n\t};\n\tuniform HemisphereLight hemisphereLights[ NUM_HEMI_LIGHTS ];\n\tvec3 getHemisphereLightIrradiance( const in HemisphereLight hemiLight, const in vec3 normal ) {\n\t\tfloat dotNL = dot( normal, hemiLight.direction );\n\t\tfloat hemiDiffuseWeight = 0.5 * dotNL + 0.5;\n\t\tvec3 irradiance = mix( hemiLight.groundColor, hemiLight.skyColor, hemiDiffuseWeight );\n\t\treturn irradiance;\n\t}\n#endif`,Ih=`#ifdef USE_ENVMAP\n\tvec3 getIBLIrradiance( const in vec3 normal ) {\n\t\t#ifdef ENVMAP_TYPE_CUBE_UV\n\t\t\tvec3 worldNormal = inverseTransformDirection( normal, viewMatrix );\n\t\t\tvec4 envMapColor = textureCubeUV( envMap, worldNormal, 1.0 );\n\t\t\treturn PI * envMapColor.rgb * envMapIntensity;\n\t\t#else\n\t\t\treturn vec3( 0.0 );\n\t\t#endif\n\t}\n\tvec3 getIBLRadiance( const in vec3 viewDir, const in vec3 normal, const in float roughness ) {\n\t\t#ifdef ENVMAP_TYPE_CUBE_UV\n\t\t\tvec3 reflectVec = reflect( - viewDir, normal );\n\t\t\treflectVec = normalize( mix( reflectVec, normal, roughness * roughness) );\n\t\t\treflectVec = inverseTransformDirection( reflectVec, viewMatrix );\n\t\t\tvec4 envMapColor = textureCubeUV( envMap, reflectVec, roughness );\n\t\t\treturn envMapColor.rgb * envMapIntensity;\n\t\t#else\n\t\t\treturn vec3( 0.0 );\n\t\t#endif\n\t}\n\t#ifdef USE_ANISOTROPY\n\t\tvec3 getIBLAnisotropyRadiance( const in vec3 viewDir, const in vec3 normal, const in float roughness, const in vec3 bitangent, const in float anisotropy ) {\n\t\t\t#ifdef ENVMAP_TYPE_CUBE_UV\n\t\t\t\tvec3 bentNormal = cross( bitangent, viewDir );\n\t\t\t\tbentNormal = normalize( cross( bentNormal, bitangent ) );\n\t\t\t\tbentNormal = normalize( mix( bentNormal, normal, pow2( pow2( 1.0 - anisotropy * ( 1.0 - roughness ) ) ) ) );\n\t\t\t\treturn getIBLRadiance( viewDir, bentNormal, roughness );\n\t\t\t#else\n\t\t\t\treturn vec3( 0.0 );\n\t\t\t#endif\n\t\t}\n\t#endif\n#endif`,Uh=`ToonMaterial material;\nmaterial.diffuseColor = diffuseColor.rgb;`,Dh=`varying vec3 vViewPosition;\nstruct ToonMaterial {\n\tvec3 diffuseColor;\n};\nvoid RE_Direct_Toon( const in IncidentLight directLight, const in vec3 geometryPosition, const in vec3 geometryNormal, const in vec3 geometryViewDir, const in vec3 geometryClearcoatNormal, const in ToonMaterial material, inout ReflectedLight reflectedLight ) {\n\tvec3 irradiance = getGradientIrradiance( geometryNormal, directLight.direction ) * directLight.color;\n\treflectedLight.directDiffuse += irradiance * BRDF_Lambert( material.diffuseColor );\n}\nvoid RE_IndirectDiffuse_Toon( const in vec3 irradiance, const in vec3 geometryPosition, const in vec3 geometryNormal, const in vec3 geometryViewDir, const in vec3 geometryClearcoatNormal, const in ToonMaterial material, inout ReflectedLight reflectedLight ) {\n\treflectedLight.indirectDiffuse += irradiance * BRDF_Lambert( material.diffuseColor );\n}\n#define RE_Direct\t\t\t\tRE_Direct_Toon\n#define RE_IndirectDiffuse\t\tRE_IndirectDiffuse_Toon`,Nh=`BlinnPhongMaterial material;\nmaterial.diffuseColor = diffuseColor.rgb;\nmaterial.specularColor = specular;\nmaterial.specularShininess = shininess;\nmaterial.specularStrength = specularStrength;`,Fh=`varying vec3 vViewPosition;\nstruct BlinnPhongMaterial {\n\tvec3 diffuseColor;\n\tvec3 specularColor;\n\tfloat specularShininess;\n\tfloat specularStrength;\n};\nvoid RE_Direct_BlinnPhong( const in IncidentLight directLight, const in vec3 geometryPosition, const in vec3 geometryNormal, const in vec3 geometryViewDir, const in vec3 geometryClearcoatNormal, const in BlinnPhongMaterial material, inout ReflectedLight reflectedLight ) {\n\tfloat dotNL = saturate( dot( geometryNormal, directLight.direction ) );\n\tvec3 irradiance = dotNL * directLight.color;\n\treflectedLight.directDiffuse += irradiance * BRDF_Lambert( material.diffuseColor );\n\treflectedLight.directSpecular += irradiance * BRDF_BlinnPhong( directLight.direction, geometryViewDir, geometryNormal, material.specularColor, material.specularShininess ) * material.specularStrength;\n}\nvoid RE_IndirectDiffuse_BlinnPhong( const in vec3 irradiance, const in vec3 geometryPosition, const in vec3 geometryNormal, const in vec3 geometryViewDir, const in vec3 geometryClearcoatNormal, const in BlinnPhongMaterial material, inout ReflectedLight reflectedLight ) {\n\treflectedLight.indirectDiffuse += irradiance * BRDF_Lambert( material.diffuseColor );\n}\n#define RE_Direct\t\t\t\tRE_Direct_BlinnPhong\n#define RE_IndirectDiffuse\t\tRE_IndirectDiffuse_BlinnPhong`,Oh=`PhysicalMaterial material;\nmaterial.diffuseColor = diffuseColor.rgb * ( 1.0 - metalnessFactor );\nvec3 dxy = max( abs( dFdx( nonPerturbedNormal ) ), abs( dFdy( nonPerturbedNormal ) ) );\nfloat geometryRoughness = max( max( dxy.x, dxy.y ), dxy.z );\nmaterial.roughness = max( roughnessFactor, 0.0525 );material.roughness += geometryRoughness;\nmaterial.roughness = min( material.roughness, 1.0 );\n#ifdef IOR\n\tmaterial.ior = ior;\n\t#ifdef USE_SPECULAR\n\t\tfloat specularIntensityFactor = specularIntensity;\n\t\tvec3 specularColorFactor = specularColor;\n\t\t#ifdef USE_SPECULAR_COLORMAP\n\t\t\tspecularColorFactor *= texture2D( specularColorMap, vSpecularColorMapUv ).rgb;\n\t\t#endif\n\t\t#ifdef USE_SPECULAR_INTENSITYMAP\n\t\t\tspecularIntensityFactor *= texture2D( specularIntensityMap, vSpecularIntensityMapUv ).a;\n\t\t#endif\n\t\tmaterial.specularF90 = mix( specularIntensityFactor, 1.0, metalnessFactor );\n\t#else\n\t\tfloat specularIntensityFactor = 1.0;\n\t\tvec3 specularColorFactor = vec3( 1.0 );\n\t\tmaterial.specularF90 = 1.0;\n\t#endif\n\tmaterial.specularColor = mix( min( pow2( ( material.ior - 1.0 ) / ( material.ior + 1.0 ) ) * specularColorFactor, vec3( 1.0 ) ) * specularIntensityFactor, diffuseColor.rgb, metalnessFactor );\n#else\n\tmaterial.specularColor = mix( vec3( 0.04 ), diffuseColor.rgb, metalnessFactor );\n\tmaterial.specularF90 = 1.0;\n#endif\n#ifdef USE_CLEARCOAT\n\tmaterial.clearcoat = clearcoat;\n\tmaterial.clearcoatRoughness = clearcoatRoughness;\n\tmaterial.clearcoatF0 = vec3( 0.04 );\n\tmaterial.clearcoatF90 = 1.0;\n\t#ifdef USE_CLEARCOATMAP\n\t\tmaterial.clearcoat *= texture2D( clearcoatMap, vClearcoatMapUv ).x;\n\t#endif\n\t#ifdef USE_CLEARCOAT_ROUGHNESSMAP\n\t\tmaterial.clearcoatRoughness *= texture2D( clearcoatRoughnessMap, vClearcoatRoughnessMapUv ).y;\n\t#endif\n\tmaterial.clearcoat = saturate( material.clearcoat );\tmaterial.clearcoatRoughness = max( material.clearcoatRoughness, 0.0525 );\n\tmaterial.clearcoatRoughness += geometryRoughness;\n\tmaterial.clearcoatRoughness = min( material.clearcoatRoughness, 1.0 );\n#endif\n#ifdef USE_IRIDESCENCE\n\tmaterial.iridescence = iridescence;\n\tmaterial.iridescenceIOR = iridescenceIOR;\n\t#ifdef USE_IRIDESCENCEMAP\n\t\tmaterial.iridescence *= texture2D( iridescenceMap, vIridescenceMapUv ).r;\n\t#endif\n\t#ifdef USE_IRIDESCENCE_THICKNESSMAP\n\t\tmaterial.iridescenceThickness = (iridescenceThicknessMaximum - iridescenceThicknessMinimum) * texture2D( iridescenceThicknessMap, vIridescenceThicknessMapUv ).g + iridescenceThicknessMinimum;\n\t#else\n\t\tmaterial.iridescenceThickness = iridescenceThicknessMaximum;\n\t#endif\n#endif\n#ifdef USE_SHEEN\n\tmaterial.sheenColor = sheenColor;\n\t#ifdef USE_SHEEN_COLORMAP\n\t\tmaterial.sheenColor *= texture2D( sheenColorMap, vSheenColorMapUv ).rgb;\n\t#endif\n\tmaterial.sheenRoughness = clamp( sheenRoughness, 0.07, 1.0 );\n\t#ifdef USE_SHEEN_ROUGHNESSMAP\n\t\tmaterial.sheenRoughness *= texture2D( sheenRoughnessMap, vSheenRoughnessMapUv ).a;\n\t#endif\n#endif\n#ifdef USE_ANISOTROPY\n\t#ifdef USE_ANISOTROPYMAP\n\t\tmat2 anisotropyMat = mat2( anisotropyVector.x, anisotropyVector.y, - anisotropyVector.y, anisotropyVector.x );\n\t\tvec3 anisotropyPolar = texture2D( anisotropyMap, vAnisotropyMapUv ).rgb;\n\t\tvec2 anisotropyV = anisotropyMat * normalize( 2.0 * anisotropyPolar.rg - vec2( 1.0 ) ) * anisotropyPolar.b;\n\t#else\n\t\tvec2 anisotropyV = anisotropyVector;\n\t#endif\n\tmaterial.anisotropy = length( anisotropyV );\n\tif( material.anisotropy == 0.0 ) {\n\t\tanisotropyV = vec2( 1.0, 0.0 );\n\t} else {\n\t\tanisotropyV /= material.anisotropy;\n\t\tmaterial.anisotropy = saturate( material.anisotropy );\n\t}\n\tmaterial.alphaT = mix( pow2( material.roughness ), 1.0, pow2( material.anisotropy ) );\n\tmaterial.anisotropyT = tbn[ 0 ] * anisotropyV.x + tbn[ 1 ] * anisotropyV.y;\n\tmaterial.anisotropyB = tbn[ 1 ] * anisotropyV.x - tbn[ 0 ] * anisotropyV.y;\n#endif`,Bh=`struct PhysicalMaterial {\n\tvec3 diffuseColor;\n\tfloat roughness;\n\tvec3 specularColor;\n\tfloat specularF90;\n\t#ifdef USE_CLEARCOAT\n\t\tfloat clearcoat;\n\t\tfloat clearcoatRoughness;\n\t\tvec3 clearcoatF0;\n\t\tfloat clearcoatF90;\n\t#endif\n\t#ifdef USE_IRIDESCENCE\n\t\tfloat iridescence;\n\t\tfloat iridescenceIOR;\n\t\tfloat iridescenceThickness;\n\t\tvec3 iridescenceFresnel;\n\t\tvec3 iridescenceF0;\n\t#endif\n\t#ifdef USE_SHEEN\n\t\tvec3 sheenColor;\n\t\tfloat sheenRoughness;\n\t#endif\n\t#ifdef IOR\n\t\tfloat ior;\n\t#endif\n\t#ifdef USE_TRANSMISSION\n\t\tfloat transmission;\n\t\tfloat transmissionAlpha;\n\t\tfloat thickness;\n\t\tfloat attenuationDistance;\n\t\tvec3 attenuationColor;\n\t#endif\n\t#ifdef USE_ANISOTROPY\n\t\tfloat anisotropy;\n\t\tfloat alphaT;\n\t\tvec3 anisotropyT;\n\t\tvec3 anisotropyB;\n\t#endif\n};\nvec3 clearcoatSpecularDirect = vec3( 0.0 );\nvec3 clearcoatSpecularIndirect = vec3( 0.0 );\nvec3 sheenSpecularDirect = vec3( 0.0 );\nvec3 sheenSpecularIndirect = vec3(0.0 );\nvec3 Schlick_to_F0( const in vec3 f, const in float f90, const in float dotVH ) {\n    float x = clamp( 1.0 - dotVH, 0.0, 1.0 );\n    float x2 = x * x;\n    float x5 = clamp( x * x2 * x2, 0.0, 0.9999 );\n    return ( f - vec3( f90 ) * x5 ) / ( 1.0 - x5 );\n}\nfloat V_GGX_SmithCorrelated( const in float alpha, const in float dotNL, const in float dotNV ) {\n\tfloat a2 = pow2( alpha );\n\tfloat gv = dotNL * sqrt( a2 + ( 1.0 - a2 ) * pow2( dotNV ) );\n\tfloat gl = dotNV * sqrt( a2 + ( 1.0 - a2 ) * pow2( dotNL ) );\n\treturn 0.5 / max( gv + gl, EPSILON );\n}\nfloat D_GGX( const in float alpha, const in float dotNH ) {\n\tfloat a2 = pow2( alpha );\n\tfloat denom = pow2( dotNH ) * ( a2 - 1.0 ) + 1.0;\n\treturn RECIPROCAL_PI * a2 / pow2( denom );\n}\n#ifdef USE_ANISOTROPY\n\tfloat V_GGX_SmithCorrelated_Anisotropic( const in float alphaT, const in float alphaB, const in float dotTV, const in float dotBV, const in float dotTL, const in float dotBL, const in float dotNV, const in float dotNL ) {\n\t\tfloat gv = dotNL * length( vec3( alphaT * dotTV, alphaB * dotBV, dotNV ) );\n\t\tfloat gl = dotNV * length( vec3( alphaT * dotTL, alphaB * dotBL, dotNL ) );\n\t\tfloat v = 0.5 / ( gv + gl );\n\t\treturn saturate(v);\n\t}\n\tfloat D_GGX_Anisotropic( const in float alphaT, const in float alphaB, const in float dotNH, const in float dotTH, const in float dotBH ) {\n\t\tfloat a2 = alphaT * alphaB;\n\t\thighp vec3 v = vec3( alphaB * dotTH, alphaT * dotBH, a2 * dotNH );\n\t\thighp float v2 = dot( v, v );\n\t\tfloat w2 = a2 / v2;\n\t\treturn RECIPROCAL_PI * a2 * pow2 ( w2 );\n\t}\n#endif\n#ifdef USE_CLEARCOAT\n\tvec3 BRDF_GGX_Clearcoat( const in vec3 lightDir, const in vec3 viewDir, const in vec3 normal, const in PhysicalMaterial material) {\n\t\tvec3 f0 = material.clearcoatF0;\n\t\tfloat f90 = material.clearcoatF90;\n\t\tfloat roughness = material.clearcoatRoughness;\n\t\tfloat alpha = pow2( roughness );\n\t\tvec3 halfDir = normalize( lightDir + viewDir );\n\t\tfloat dotNL = saturate( dot( normal, lightDir ) );\n\t\tfloat dotNV = saturate( dot( normal, viewDir ) );\n\t\tfloat dotNH = saturate( dot( normal, halfDir ) );\n\t\tfloat dotVH = saturate( dot( viewDir, halfDir ) );\n\t\tvec3 F = F_Schlick( f0, f90, dotVH );\n\t\tfloat V = V_GGX_SmithCorrelated( alpha, dotNL, dotNV );\n\t\tfloat D = D_GGX( alpha, dotNH );\n\t\treturn F * ( V * D );\n\t}\n#endif\nvec3 BRDF_GGX( const in vec3 lightDir, const in vec3 viewDir, const in vec3 normal, const in PhysicalMaterial material ) {\n\tvec3 f0 = material.specularColor;\n\tfloat f90 = material.specularF90;\n\tfloat roughness = material.roughness;\n\tfloat alpha = pow2( roughness );\n\tvec3 halfDir = normalize( lightDir + viewDir );\n\tfloat dotNL = saturate( dot( normal, lightDir ) );\n\tfloat dotNV = saturate( dot( normal, viewDir ) );\n\tfloat dotNH = saturate( dot( normal, halfDir ) );\n\tfloat dotVH = saturate( dot( viewDir, halfDir ) );\n\tvec3 F = F_Schlick( f0, f90, dotVH );\n\t#ifdef USE_IRIDESCENCE\n\t\tF = mix( F, material.iridescenceFresnel, material.iridescence );\n\t#endif\n\t#ifdef USE_ANISOTROPY\n\t\tfloat dotTL = dot( material.anisotropyT, lightDir );\n\t\tfloat dotTV = dot( material.anisotropyT, viewDir );\n\t\tfloat dotTH = dot( material.anisotropyT, halfDir );\n\t\tfloat dotBL = dot( material.anisotropyB, lightDir );\n\t\tfloat dotBV = dot( material.anisotropyB, viewDir );\n\t\tfloat dotBH = dot( material.anisotropyB, halfDir );\n\t\tfloat V = V_GGX_SmithCorrelated_Anisotropic( material.alphaT, alpha, dotTV, dotBV, dotTL, dotBL, dotNV, dotNL );\n\t\tfloat D = D_GGX_Anisotropic( material.alphaT, alpha, dotNH, dotTH, dotBH );\n\t#else\n\t\tfloat V = V_GGX_SmithCorrelated( alpha, dotNL, dotNV );\n\t\tfloat D = D_GGX( alpha, dotNH );\n\t#endif\n\treturn F * ( V * D );\n}\nvec2 LTC_Uv( const in vec3 N, const in vec3 V, const in float roughness ) {\n\tconst float LUT_SIZE = 64.0;\n\tconst float LUT_SCALE = ( LUT_SIZE - 1.0 ) / LUT_SIZE;\n\tconst float LUT_BIAS = 0.5 / LUT_SIZE;\n\tfloat dotNV = saturate( dot( N, V ) );\n\tvec2 uv = vec2( roughness, sqrt( 1.0 - dotNV ) );\n\tuv = uv * LUT_SCALE + LUT_BIAS;\n\treturn uv;\n}\nfloat LTC_ClippedSphereFormFactor( const in vec3 f ) {\n\tfloat l = length( f );\n\treturn max( ( l * l + f.z ) / ( l + 1.0 ), 0.0 );\n}\nvec3 LTC_EdgeVectorFormFactor( const in vec3 v1, const in vec3 v2 ) {\n\tfloat x = dot( v1, v2 );\n\tfloat y = abs( x );\n\tfloat a = 0.8543985 + ( 0.4965155 + 0.0145206 * y ) * y;\n\tfloat b = 3.4175940 + ( 4.1616724 + y ) * y;\n\tfloat v = a / b;\n\tfloat theta_sintheta = ( x > 0.0 ) ? v : 0.5 * inversesqrt( max( 1.0 - x * x, 1e-7 ) ) - v;\n\treturn cross( v1, v2 ) * theta_sintheta;\n}\nvec3 LTC_Evaluate( const in vec3 N, const in vec3 V, const in vec3 P, const in mat3 mInv, const in vec3 rectCoords[ 4 ] ) {\n\tvec3 v1 = rectCoords[ 1 ] - rectCoords[ 0 ];\n\tvec3 v2 = rectCoords[ 3 ] - rectCoords[ 0 ];\n\tvec3 lightNormal = cross( v1, v2 );\n\tif( dot( lightNormal, P - rectCoords[ 0 ] ) < 0.0 ) return vec3( 0.0 );\n\tvec3 T1, T2;\n\tT1 = normalize( V - N * dot( V, N ) );\n\tT2 = - cross( N, T1 );\n\tmat3 mat = mInv * transposeMat3( mat3( T1, T2, N ) );\n\tvec3 coords[ 4 ];\n\tcoords[ 0 ] = mat * ( rectCoords[ 0 ] - P );\n\tcoords[ 1 ] = mat * ( rectCoords[ 1 ] - P );\n\tcoords[ 2 ] = mat * ( rectCoords[ 2 ] - P );\n\tcoords[ 3 ] = mat * ( rectCoords[ 3 ] - P );\n\tcoords[ 0 ] = normalize( coords[ 0 ] );\n\tcoords[ 1 ] = normalize( coords[ 1 ] );\n\tcoords[ 2 ] = normalize( coords[ 2 ] );\n\tcoords[ 3 ] = normalize( coords[ 3 ] );\n\tvec3 vectorFormFactor = vec3( 0.0 );\n\tvectorFormFactor += LTC_EdgeVectorFormFactor( coords[ 0 ], coords[ 1 ] );\n\tvectorFormFactor += LTC_EdgeVectorFormFactor( coords[ 1 ], coords[ 2 ] );\n\tvectorFormFactor += LTC_EdgeVectorFormFactor( coords[ 2 ], coords[ 3 ] );\n\tvectorFormFactor += LTC_EdgeVectorFormFactor( coords[ 3 ], coords[ 0 ] );\n\tfloat result = LTC_ClippedSphereFormFactor( vectorFormFactor );\n\treturn vec3( result );\n}\n#if defined( USE_SHEEN )\nfloat D_Charlie( float roughness, float dotNH ) {\n\tfloat alpha = pow2( roughness );\n\tfloat invAlpha = 1.0 / alpha;\n\tfloat cos2h = dotNH * dotNH;\n\tfloat sin2h = max( 1.0 - cos2h, 0.0078125 );\n\treturn ( 2.0 + invAlpha ) * pow( sin2h, invAlpha * 0.5 ) / ( 2.0 * PI );\n}\nfloat V_Neubelt( float dotNV, float dotNL ) {\n\treturn saturate( 1.0 / ( 4.0 * ( dotNL + dotNV - dotNL * dotNV ) ) );\n}\nvec3 BRDF_Sheen( const in vec3 lightDir, const in vec3 viewDir, const in vec3 normal, vec3 sheenColor, const in float sheenRoughness ) {\n\tvec3 halfDir = normalize( lightDir + viewDir );\n\tfloat dotNL = saturate( dot( normal, lightDir ) );\n\tfloat dotNV = saturate( dot( normal, viewDir ) );\n\tfloat dotNH = saturate( dot( normal, halfDir ) );\n\tfloat D = D_Charlie( sheenRoughness, dotNH );\n\tfloat V = V_Neubelt( dotNV, dotNL );\n\treturn sheenColor * ( D * V );\n}\n#endif\nfloat IBLSheenBRDF( const in vec3 normal, const in vec3 viewDir, const in float roughness ) {\n\tfloat dotNV = saturate( dot( normal, viewDir ) );\n\tfloat r2 = roughness * roughness;\n\tfloat a = roughness < 0.25 ? -339.2 * r2 + 161.4 * roughness - 25.9 : -8.48 * r2 + 14.3 * roughness - 9.95;\n\tfloat b = roughness < 0.25 ? 44.0 * r2 - 23.7 * roughness + 3.26 : 1.97 * r2 - 3.27 * roughness + 0.72;\n\tfloat DG = exp( a * dotNV + b ) + ( roughness < 0.25 ? 0.0 : 0.1 * ( roughness - 0.25 ) );\n\treturn saturate( DG * RECIPROCAL_PI );\n}\nvec2 DFGApprox( const in vec3 normal, const in vec3 viewDir, const in float roughness ) {\n\tfloat dotNV = saturate( dot( normal, viewDir ) );\n\tconst vec4 c0 = vec4( - 1, - 0.0275, - 0.572, 0.022 );\n\tconst vec4 c1 = vec4( 1, 0.0425, 1.04, - 0.04 );\n\tvec4 r = roughness * c0 + c1;\n\tfloat a004 = min( r.x * r.x, exp2( - 9.28 * dotNV ) ) * r.x + r.y;\n\tvec2 fab = vec2( - 1.04, 1.04 ) * a004 + r.zw;\n\treturn fab;\n}\nvec3 EnvironmentBRDF( const in vec3 normal, const in vec3 viewDir, const in vec3 specularColor, const in float specularF90, const in float roughness ) {\n\tvec2 fab = DFGApprox( normal, viewDir, roughness );\n\treturn specularColor * fab.x + specularF90 * fab.y;\n}\n#ifdef USE_IRIDESCENCE\nvoid computeMultiscatteringIridescence( const in vec3 normal, const in vec3 viewDir, const in vec3 specularColor, const in float specularF90, const in float iridescence, const in vec3 iridescenceF0, const in float roughness, inout vec3 singleScatter, inout vec3 multiScatter ) {\n#else\nvoid computeMultiscattering( const in vec3 normal, const in vec3 viewDir, const in vec3 specularColor, const in float specularF90, const in float roughness, inout vec3 singleScatter, inout vec3 multiScatter ) {\n#endif\n\tvec2 fab = DFGApprox( normal, viewDir, roughness );\n\t#ifdef USE_IRIDESCENCE\n\t\tvec3 Fr = mix( specularColor, iridescenceF0, iridescence );\n\t#else\n\t\tvec3 Fr = specularColor;\n\t#endif\n\tvec3 FssEss = Fr * fab.x + specularF90 * fab.y;\n\tfloat Ess = fab.x + fab.y;\n\tfloat Ems = 1.0 - Ess;\n\tvec3 Favg = Fr + ( 1.0 - Fr ) * 0.047619;\tvec3 Fms = FssEss * Favg / ( 1.0 - Ems * Favg );\n\tsingleScatter += FssEss;\n\tmultiScatter += Fms * Ems;\n}\n#if NUM_RECT_AREA_LIGHTS > 0\n\tvoid RE_Direct_RectArea_Physical( const in RectAreaLight rectAreaLight, const in vec3 geometryPosition, const in vec3 geometryNormal, const in vec3 geometryViewDir, const in vec3 geometryClearcoatNormal, const in PhysicalMaterial material, inout ReflectedLight reflectedLight ) {\n\t\tvec3 normal = geometryNormal;\n\t\tvec3 viewDir = geometryViewDir;\n\t\tvec3 position = geometryPosition;\n\t\tvec3 lightPos = rectAreaLight.position;\n\t\tvec3 halfWidth = rectAreaLight.halfWidth;\n\t\tvec3 halfHeight = rectAreaLight.halfHeight;\n\t\tvec3 lightColor = rectAreaLight.color;\n\t\tfloat roughness = material.roughness;\n\t\tvec3 rectCoords[ 4 ];\n\t\trectCoords[ 0 ] = lightPos + halfWidth - halfHeight;\t\trectCoords[ 1 ] = lightPos - halfWidth - halfHeight;\n\t\trectCoords[ 2 ] = lightPos - halfWidth + halfHeight;\n\t\trectCoords[ 3 ] = lightPos + halfWidth + halfHeight;\n\t\tvec2 uv = LTC_Uv( normal, viewDir, roughness );\n\t\tvec4 t1 = texture2D( ltc_1, uv );\n\t\tvec4 t2 = texture2D( ltc_2, uv );\n\t\tmat3 mInv = mat3(\n\t\t\tvec3( t1.x, 0, t1.y ),\n\t\t\tvec3(    0, 1,    0 ),\n\t\t\tvec3( t1.z, 0, t1.w )\n\t\t);\n\t\tvec3 fresnel = ( material.specularColor * t2.x + ( vec3( 1.0 ) - material.specularColor ) * t2.y );\n\t\treflectedLight.directSpecular += lightColor * fresnel * LTC_Evaluate( normal, viewDir, position, mInv, rectCoords );\n\t\treflectedLight.directDiffuse += lightColor * material.diffuseColor * LTC_Evaluate( normal, viewDir, position, mat3( 1.0 ), rectCoords );\n\t}\n#endif\nvoid RE_Direct_Physical( const in IncidentLight directLight, const in vec3 geometryPosition, const in vec3 geometryNormal, const in vec3 geometryViewDir, const in vec3 geometryClearcoatNormal, const in PhysicalMaterial material, inout ReflectedLight reflectedLight ) {\n\tfloat dotNL = saturate( dot( geometryNormal, directLight.direction ) );\n\tvec3 irradiance = dotNL * directLight.color;\n\t#ifdef USE_CLEARCOAT\n\t\tfloat dotNLcc = saturate( dot( geometryClearcoatNormal, directLight.direction ) );\n\t\tvec3 ccIrradiance = dotNLcc * directLight.color;\n\t\tclearcoatSpecularDirect += ccIrradiance * BRDF_GGX_Clearcoat( directLight.direction, geometryViewDir, geometryClearcoatNormal, material );\n\t#endif\n\t#ifdef USE_SHEEN\n\t\tsheenSpecularDirect += irradiance * BRDF_Sheen( directLight.direction, geometryViewDir, geometryNormal, material.sheenColor, material.sheenRoughness );\n\t#endif\n\treflectedLight.directSpecular += irradiance * BRDF_GGX( directLight.direction, geometryViewDir, geometryNormal, material );\n\treflectedLight.directDiffuse += irradiance * BRDF_Lambert( material.diffuseColor );\n}\nvoid RE_IndirectDiffuse_Physical( const in vec3 irradiance, const in vec3 geometryPosition, const in vec3 geometryNormal, const in vec3 geometryViewDir, const in vec3 geometryClearcoatNormal, const in PhysicalMaterial material, inout ReflectedLight reflectedLight ) {\n\treflectedLight.indirectDiffuse += irradiance * BRDF_Lambert( material.diffuseColor );\n}\nvoid RE_IndirectSpecular_Physical( const in vec3 radiance, const in vec3 irradiance, const in vec3 clearcoatRadiance, const in vec3 geometryPosition, const in vec3 geometryNormal, const in vec3 geometryViewDir, const in vec3 geometryClearcoatNormal, const in PhysicalMaterial material, inout ReflectedLight reflectedLight) {\n\t#ifdef USE_CLEARCOAT\n\t\tclearcoatSpecularIndirect += clearcoatRadiance * EnvironmentBRDF( geometryClearcoatNormal, geometryViewDir, material.clearcoatF0, material.clearcoatF90, material.clearcoatRoughness );\n\t#endif\n\t#ifdef USE_SHEEN\n\t\tsheenSpecularIndirect += irradiance * material.sheenColor * IBLSheenBRDF( geometryNormal, geometryViewDir, material.sheenRoughness );\n\t#endif\n\tvec3 singleScattering = vec3( 0.0 );\n\tvec3 multiScattering = vec3( 0.0 );\n\tvec3 cosineWeightedIrradiance = irradiance * RECIPROCAL_PI;\n\t#ifdef USE_IRIDESCENCE\n\t\tcomputeMultiscatteringIridescence( geometryNormal, geometryViewDir, material.specularColor, material.specularF90, material.iridescence, material.iridescenceFresnel, material.roughness, singleScattering, multiScattering );\n\t#else\n\t\tcomputeMultiscattering( geometryNormal, geometryViewDir, material.specularColor, material.specularF90, material.roughness, singleScattering, multiScattering );\n\t#endif\n\tvec3 totalScattering = singleScattering + multiScattering;\n\tvec3 diffuse = material.diffuseColor * ( 1.0 - max( max( totalScattering.r, totalScattering.g ), totalScattering.b ) );\n\treflectedLight.indirectSpecular += radiance * singleScattering;\n\treflectedLight.indirectSpecular += multiScattering * cosineWeightedIrradiance;\n\treflectedLight.indirectDiffuse += diffuse * cosineWeightedIrradiance;\n}\n#define RE_Direct\t\t\t\tRE_Direct_Physical\n#define RE_Direct_RectArea\t\tRE_Direct_RectArea_Physical\n#define RE_IndirectDiffuse\t\tRE_IndirectDiffuse_Physical\n#define RE_IndirectSpecular\t\tRE_IndirectSpecular_Physical\nfloat computeSpecularOcclusion( const in float dotNV, const in float ambientOcclusion, const in float roughness ) {\n\treturn saturate( pow( dotNV + ambientOcclusion, exp2( - 16.0 * roughness - 1.0 ) ) - 1.0 + ambientOcclusion );\n}`,zh=`\nvec3 geometryPosition = - vViewPosition;\nvec3 geometryNormal = normal;\nvec3 geometryViewDir = ( isOrthographic ) ? vec3( 0, 0, 1 ) : normalize( vViewPosition );\nvec3 geometryClearcoatNormal = vec3( 0.0 );\n#ifdef USE_CLEARCOAT\n\tgeometryClearcoatNormal = clearcoatNormal;\n#endif\n#ifdef USE_IRIDESCENCE\n\tfloat dotNVi = saturate( dot( normal, geometryViewDir ) );\n\tif ( material.iridescenceThickness == 0.0 ) {\n\t\tmaterial.iridescence = 0.0;\n\t} else {\n\t\tmaterial.iridescence = saturate( material.iridescence );\n\t}\n\tif ( material.iridescence > 0.0 ) {\n\t\tmaterial.iridescenceFresnel = evalIridescence( 1.0, material.iridescenceIOR, dotNVi, material.iridescenceThickness, material.specularColor );\n\t\tmaterial.iridescenceF0 = Schlick_to_F0( material.iridescenceFresnel, 1.0, dotNVi );\n\t}\n#endif\nIncidentLight directLight;\n#if ( NUM_POINT_LIGHTS > 0 ) && defined( RE_Direct )\n\tPointLight pointLight;\n\t#if defined( USE_SHADOWMAP ) && NUM_POINT_LIGHT_SHADOWS > 0\n\tPointLightShadow pointLightShadow;\n\t#endif\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_POINT_LIGHTS; i ++ ) {\n\t\tpointLight = pointLights[ i ];\n\t\tgetPointLightInfo( pointLight, geometryPosition, directLight );\n\t\t#if defined( USE_SHADOWMAP ) && ( UNROLLED_LOOP_INDEX < NUM_POINT_LIGHT_SHADOWS )\n\t\tpointLightShadow = pointLightShadows[ i ];\n\t\tdirectLight.color *= ( directLight.visible && receiveShadow ) ? getPointShadow( pointShadowMap[ i ], pointLightShadow.shadowMapSize, pointLightShadow.shadowBias, pointLightShadow.shadowRadius, vPointShadowCoord[ i ], pointLightShadow.shadowCameraNear, pointLightShadow.shadowCameraFar ) : 1.0;\n\t\t#endif\n\t\tRE_Direct( directLight, geometryPosition, geometryNormal, geometryViewDir, geometryClearcoatNormal, material, reflectedLight );\n\t}\n\t#pragma unroll_loop_end\n#endif\n#if ( NUM_SPOT_LIGHTS > 0 ) && defined( RE_Direct )\n\tSpotLight spotLight;\n\tvec4 spotColor;\n\tvec3 spotLightCoord;\n\tbool inSpotLightMap;\n\t#if defined( USE_SHADOWMAP ) && NUM_SPOT_LIGHT_SHADOWS > 0\n\tSpotLightShadow spotLightShadow;\n\t#endif\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_SPOT_LIGHTS; i ++ ) {\n\t\tspotLight = spotLights[ i ];\n\t\tgetSpotLightInfo( spotLight, geometryPosition, directLight );\n\t\t#if ( UNROLLED_LOOP_INDEX < NUM_SPOT_LIGHT_SHADOWS_WITH_MAPS )\n\t\t#define SPOT_LIGHT_MAP_INDEX UNROLLED_LOOP_INDEX\n\t\t#elif ( UNROLLED_LOOP_INDEX < NUM_SPOT_LIGHT_SHADOWS )\n\t\t#define SPOT_LIGHT_MAP_INDEX NUM_SPOT_LIGHT_MAPS\n\t\t#else\n\t\t#define SPOT_LIGHT_MAP_INDEX ( UNROLLED_LOOP_INDEX - NUM_SPOT_LIGHT_SHADOWS + NUM_SPOT_LIGHT_SHADOWS_WITH_MAPS )\n\t\t#endif\n\t\t#if ( SPOT_LIGHT_MAP_INDEX < NUM_SPOT_LIGHT_MAPS )\n\t\t\tspotLightCoord = vSpotLightCoord[ i ].xyz / vSpotLightCoord[ i ].w;\n\t\t\tinSpotLightMap = all( lessThan( abs( spotLightCoord * 2. - 1. ), vec3( 1.0 ) ) );\n\t\t\tspotColor = texture2D( spotLightMap[ SPOT_LIGHT_MAP_INDEX ], spotLightCoord.xy );\n\t\t\tdirectLight.color = inSpotLightMap ? directLight.color * spotColor.rgb : directLight.color;\n\t\t#endif\n\t\t#undef SPOT_LIGHT_MAP_INDEX\n\t\t#if defined( USE_SHADOWMAP ) && ( UNROLLED_LOOP_INDEX < NUM_SPOT_LIGHT_SHADOWS )\n\t\tspotLightShadow = spotLightShadows[ i ];\n\t\tdirectLight.color *= ( directLight.visible && receiveShadow ) ? getShadow( spotShadowMap[ i ], spotLightShadow.shadowMapSize, spotLightShadow.shadowBias, spotLightShadow.shadowRadius, vSpotLightCoord[ i ] ) : 1.0;\n\t\t#endif\n\t\tRE_Direct( directLight, geometryPosition, geometryNormal, geometryViewDir, geometryClearcoatNormal, material, reflectedLight );\n\t}\n\t#pragma unroll_loop_end\n#endif\n#if ( NUM_DIR_LIGHTS > 0 ) && defined( RE_Direct )\n\tDirectionalLight directionalLight;\n\t#if defined( USE_SHADOWMAP ) && NUM_DIR_LIGHT_SHADOWS > 0\n\tDirectionalLightShadow directionalLightShadow;\n\t#endif\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_DIR_LIGHTS; i ++ ) {\n\t\tdirectionalLight = directionalLights[ i ];\n\t\tgetDirectionalLightInfo( directionalLight, directLight );\n\t\t#if defined( USE_SHADOWMAP ) && ( UNROLLED_LOOP_INDEX < NUM_DIR_LIGHT_SHADOWS )\n\t\tdirectionalLightShadow = directionalLightShadows[ i ];\n\t\tdirectLight.color *= ( directLight.visible && receiveShadow ) ? getShadow( directionalShadowMap[ i ], directionalLightShadow.shadowMapSize, directionalLightShadow.shadowBias, directionalLightShadow.shadowRadius, vDirectionalShadowCoord[ i ] ) : 1.0;\n\t\t#endif\n\t\tRE_Direct( directLight, geometryPosition, geometryNormal, geometryViewDir, geometryClearcoatNormal, material, reflectedLight );\n\t}\n\t#pragma unroll_loop_end\n#endif\n#if ( NUM_RECT_AREA_LIGHTS > 0 ) && defined( RE_Direct_RectArea )\n\tRectAreaLight rectAreaLight;\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_RECT_AREA_LIGHTS; i ++ ) {\n\t\trectAreaLight = rectAreaLights[ i ];\n\t\tRE_Direct_RectArea( rectAreaLight, geometryPosition, geometryNormal, geometryViewDir, geometryClearcoatNormal, material, reflectedLight );\n\t}\n\t#pragma unroll_loop_end\n#endif\n#if defined( RE_IndirectDiffuse )\n\tvec3 iblIrradiance = vec3( 0.0 );\n\tvec3 irradiance = getAmbientLightIrradiance( ambientLightColor );\n\t#if defined( USE_LIGHT_PROBES )\n\t\tirradiance += getLightProbeIrradiance( lightProbe, geometryNormal );\n\t#endif\n\t#if ( NUM_HEMI_LIGHTS > 0 )\n\t\t#pragma unroll_loop_start\n\t\tfor ( int i = 0; i < NUM_HEMI_LIGHTS; i ++ ) {\n\t\t\tirradiance += getHemisphereLightIrradiance( hemisphereLights[ i ], geometryNormal );\n\t\t}\n\t\t#pragma unroll_loop_end\n\t#endif\n#endif\n#if defined( RE_IndirectSpecular )\n\tvec3 radiance = vec3( 0.0 );\n\tvec3 clearcoatRadiance = vec3( 0.0 );\n#endif`,Vh=`#if defined( RE_IndirectDiffuse )\n\t#ifdef USE_LIGHTMAP\n\t\tvec4 lightMapTexel = texture2D( lightMap, vLightMapUv );\n\t\tvec3 lightMapIrradiance = lightMapTexel.rgb * lightMapIntensity;\n\t\tirradiance += lightMapIrradiance;\n\t#endif\n\t#if defined( USE_ENVMAP ) && defined( STANDARD ) && defined( ENVMAP_TYPE_CUBE_UV )\n\t\tiblIrradiance += getIBLIrradiance( geometryNormal );\n\t#endif\n#endif\n#if defined( USE_ENVMAP ) && defined( RE_IndirectSpecular )\n\t#ifdef USE_ANISOTROPY\n\t\tradiance += getIBLAnisotropyRadiance( geometryViewDir, geometryNormal, material.roughness, material.anisotropyB, material.anisotropy );\n\t#else\n\t\tradiance += getIBLRadiance( geometryViewDir, geometryNormal, material.roughness );\n\t#endif\n\t#ifdef USE_CLEARCOAT\n\t\tclearcoatRadiance += getIBLRadiance( geometryViewDir, geometryClearcoatNormal, material.clearcoatRoughness );\n\t#endif\n#endif`,kh=`#if defined( RE_IndirectDiffuse )\n\tRE_IndirectDiffuse( irradiance, geometryPosition, geometryNormal, geometryViewDir, geometryClearcoatNormal, material, reflectedLight );\n#endif\n#if defined( RE_IndirectSpecular )\n\tRE_IndirectSpecular( radiance, iblIrradiance, clearcoatRadiance, geometryPosition, geometryNormal, geometryViewDir, geometryClearcoatNormal, material, reflectedLight );\n#endif`,Hh=`#if defined( USE_LOGDEPTHBUF ) && defined( USE_LOGDEPTHBUF_EXT )\n\tgl_FragDepthEXT = vIsPerspective == 0.0 ? gl_FragCoord.z : log2( vFragDepth ) * logDepthBufFC * 0.5;\n#endif`,Gh=`#if defined( USE_LOGDEPTHBUF ) && defined( USE_LOGDEPTHBUF_EXT )\n\tuniform float logDepthBufFC;\n\tvarying float vFragDepth;\n\tvarying float vIsPerspective;\n#endif`,Wh=`#ifdef USE_LOGDEPTHBUF\n\t#ifdef USE_LOGDEPTHBUF_EXT\n\t\tvarying float vFragDepth;\n\t\tvarying float vIsPerspective;\n\t#else\n\t\tuniform float logDepthBufFC;\n\t#endif\n#endif`,Xh=`#ifdef USE_LOGDEPTHBUF\n\t#ifdef USE_LOGDEPTHBUF_EXT\n\t\tvFragDepth = 1.0 + gl_Position.w;\n\t\tvIsPerspective = float( isPerspectiveMatrix( projectionMatrix ) );\n\t#else\n\t\tif ( isPerspectiveMatrix( projectionMatrix ) ) {\n\t\t\tgl_Position.z = log2( max( EPSILON, gl_Position.w + 1.0 ) ) * logDepthBufFC - 1.0;\n\t\t\tgl_Position.z *= gl_Position.w;\n\t\t}\n\t#endif\n#endif`,qh=`#ifdef USE_MAP\n\tvec4 sampledDiffuseColor = texture2D( map, vMapUv );\n\t#ifdef DECODE_VIDEO_TEXTURE\n\t\tsampledDiffuseColor = vec4( mix( pow( sampledDiffuseColor.rgb * 0.9478672986 + vec3( 0.0521327014 ), vec3( 2.4 ) ), sampledDiffuseColor.rgb * 0.0773993808, vec3( lessThanEqual( sampledDiffuseColor.rgb, vec3( 0.04045 ) ) ) ), sampledDiffuseColor.w );\n\t\n\t#endif\n\tdiffuseColor *= sampledDiffuseColor;\n#endif`,Yh=`#ifdef USE_MAP\n\tuniform sampler2D map;\n#endif`,Zh=`#if defined( USE_MAP ) || defined( USE_ALPHAMAP )\n\t#if defined( USE_POINTS_UV )\n\t\tvec2 uv = vUv;\n\t#else\n\t\tvec2 uv = ( uvTransform * vec3( gl_PointCoord.x, 1.0 - gl_PointCoord.y, 1 ) ).xy;\n\t#endif\n#endif\n#ifdef USE_MAP\n\tdiffuseColor *= texture2D( map, uv );\n#endif\n#ifdef USE_ALPHAMAP\n\tdiffuseColor.a *= texture2D( alphaMap, uv ).g;\n#endif`,Jh=`#if defined( USE_POINTS_UV )\n\tvarying vec2 vUv;\n#else\n\t#if defined( USE_MAP ) || defined( USE_ALPHAMAP )\n\t\tuniform mat3 uvTransform;\n\t#endif\n#endif\n#ifdef USE_MAP\n\tuniform sampler2D map;\n#endif\n#ifdef USE_ALPHAMAP\n\tuniform sampler2D alphaMap;\n#endif`,$h=`float metalnessFactor = metalness;\n#ifdef USE_METALNESSMAP\n\tvec4 texelMetalness = texture2D( metalnessMap, vMetalnessMapUv );\n\tmetalnessFactor *= texelMetalness.b;\n#endif`,Kh=`#ifdef USE_METALNESSMAP\n\tuniform sampler2D metalnessMap;\n#endif`,Qh=`#if defined( USE_MORPHCOLORS ) && defined( MORPHTARGETS_TEXTURE )\n\tvColor *= morphTargetBaseInfluence;\n\tfor ( int i = 0; i < MORPHTARGETS_COUNT; i ++ ) {\n\t\t#if defined( USE_COLOR_ALPHA )\n\t\t\tif ( morphTargetInfluences[ i ] != 0.0 ) vColor += getMorph( gl_VertexID, i, 2 ) * morphTargetInfluences[ i ];\n\t\t#elif defined( USE_COLOR )\n\t\t\tif ( morphTargetInfluences[ i ] != 0.0 ) vColor += getMorph( gl_VertexID, i, 2 ).rgb * morphTargetInfluences[ i ];\n\t\t#endif\n\t}\n#endif`,jh=`#ifdef USE_MORPHNORMALS\n\tobjectNormal *= morphTargetBaseInfluence;\n\t#ifdef MORPHTARGETS_TEXTURE\n\t\tfor ( int i = 0; i < MORPHTARGETS_COUNT; i ++ ) {\n\t\t\tif ( morphTargetInfluences[ i ] != 0.0 ) objectNormal += getMorph( gl_VertexID, i, 1 ).xyz * morphTargetInfluences[ i ];\n\t\t}\n\t#else\n\t\tobjectNormal += morphNormal0 * morphTargetInfluences[ 0 ];\n\t\tobjectNormal += morphNormal1 * morphTargetInfluences[ 1 ];\n\t\tobjectNormal += morphNormal2 * morphTargetInfluences[ 2 ];\n\t\tobjectNormal += morphNormal3 * morphTargetInfluences[ 3 ];\n\t#endif\n#endif`,tu=`#ifdef USE_MORPHTARGETS\n\tuniform float morphTargetBaseInfluence;\n\t#ifdef MORPHTARGETS_TEXTURE\n\t\tuniform float morphTargetInfluences[ MORPHTARGETS_COUNT ];\n\t\tuniform sampler2DArray morphTargetsTexture;\n\t\tuniform ivec2 morphTargetsTextureSize;\n\t\tvec4 getMorph( const in int vertexIndex, const in int morphTargetIndex, const in int offset ) {\n\t\t\tint texelIndex = vertexIndex * MORPHTARGETS_TEXTURE_STRIDE + offset;\n\t\t\tint y = texelIndex / morphTargetsTextureSize.x;\n\t\t\tint x = texelIndex - y * morphTargetsTextureSize.x;\n\t\t\tivec3 morphUV = ivec3( x, y, morphTargetIndex );\n\t\t\treturn texelFetch( morphTargetsTexture, morphUV, 0 );\n\t\t}\n\t#else\n\t\t#ifndef USE_MORPHNORMALS\n\t\t\tuniform float morphTargetInfluences[ 8 ];\n\t\t#else\n\t\t\tuniform float morphTargetInfluences[ 4 ];\n\t\t#endif\n\t#endif\n#endif`,eu=`#ifdef USE_MORPHTARGETS\n\ttransformed *= morphTargetBaseInfluence;\n\t#ifdef MORPHTARGETS_TEXTURE\n\t\tfor ( int i = 0; i < MORPHTARGETS_COUNT; i ++ ) {\n\t\t\tif ( morphTargetInfluences[ i ] != 0.0 ) transformed += getMorph( gl_VertexID, i, 0 ).xyz * morphTargetInfluences[ i ];\n\t\t}\n\t#else\n\t\ttransformed += morphTarget0 * morphTargetInfluences[ 0 ];\n\t\ttransformed += morphTarget1 * morphTargetInfluences[ 1 ];\n\t\ttransformed += morphTarget2 * morphTargetInfluences[ 2 ];\n\t\ttransformed += morphTarget3 * morphTargetInfluences[ 3 ];\n\t\t#ifndef USE_MORPHNORMALS\n\t\t\ttransformed += morphTarget4 * morphTargetInfluences[ 4 ];\n\t\t\ttransformed += morphTarget5 * morphTargetInfluences[ 5 ];\n\t\t\ttransformed += morphTarget6 * morphTargetInfluences[ 6 ];\n\t\t\ttransformed += morphTarget7 * morphTargetInfluences[ 7 ];\n\t\t#endif\n\t#endif\n#endif`,nu=`float faceDirection = gl_FrontFacing ? 1.0 : - 1.0;\n#ifdef FLAT_SHADED\n\tvec3 fdx = dFdx( vViewPosition );\n\tvec3 fdy = dFdy( vViewPosition );\n\tvec3 normal = normalize( cross( fdx, fdy ) );\n#else\n\tvec3 normal = normalize( vNormal );\n\t#ifdef DOUBLE_SIDED\n\t\tnormal *= faceDirection;\n\t#endif\n#endif\n#if defined( USE_NORMALMAP_TANGENTSPACE ) || defined( USE_CLEARCOAT_NORMALMAP ) || defined( USE_ANISOTROPY )\n\t#ifdef USE_TANGENT\n\t\tmat3 tbn = mat3( normalize( vTangent ), normalize( vBitangent ), normal );\n\t#else\n\t\tmat3 tbn = getTangentFrame( - vViewPosition, normal,\n\t\t#if defined( USE_NORMALMAP )\n\t\t\tvNormalMapUv\n\t\t#elif defined( USE_CLEARCOAT_NORMALMAP )\n\t\t\tvClearcoatNormalMapUv\n\t\t#else\n\t\t\tvUv\n\t\t#endif\n\t\t);\n\t#endif\n\t#if defined( DOUBLE_SIDED ) && ! defined( FLAT_SHADED )\n\t\ttbn[0] *= faceDirection;\n\t\ttbn[1] *= faceDirection;\n\t#endif\n#endif\n#ifdef USE_CLEARCOAT_NORMALMAP\n\t#ifdef USE_TANGENT\n\t\tmat3 tbn2 = mat3( normalize( vTangent ), normalize( vBitangent ), normal );\n\t#else\n\t\tmat3 tbn2 = getTangentFrame( - vViewPosition, normal, vClearcoatNormalMapUv );\n\t#endif\n\t#if defined( DOUBLE_SIDED ) && ! defined( FLAT_SHADED )\n\t\ttbn2[0] *= faceDirection;\n\t\ttbn2[1] *= faceDirection;\n\t#endif\n#endif\nvec3 nonPerturbedNormal = normal;`,iu=`#ifdef USE_NORMALMAP_OBJECTSPACE\n\tnormal = texture2D( normalMap, vNormalMapUv ).xyz * 2.0 - 1.0;\n\t#ifdef FLIP_SIDED\n\t\tnormal = - normal;\n\t#endif\n\t#ifdef DOUBLE_SIDED\n\t\tnormal = normal * faceDirection;\n\t#endif\n\tnormal = normalize( normalMatrix * normal );\n#elif defined( USE_NORMALMAP_TANGENTSPACE )\n\tvec3 mapN = texture2D( normalMap, vNormalMapUv ).xyz * 2.0 - 1.0;\n\tmapN.xy *= normalScale;\n\tnormal = normalize( tbn * mapN );\n#elif defined( USE_BUMPMAP )\n\tnormal = perturbNormalArb( - vViewPosition, normal, dHdxy_fwd(), faceDirection );\n#endif`,su=`#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n\t#ifdef USE_TANGENT\n\t\tvarying vec3 vTangent;\n\t\tvarying vec3 vBitangent;\n\t#endif\n#endif`,ru=`#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n\t#ifdef USE_TANGENT\n\t\tvarying vec3 vTangent;\n\t\tvarying vec3 vBitangent;\n\t#endif\n#endif`,au=`#ifndef FLAT_SHADED\n\tvNormal = normalize( transformedNormal );\n\t#ifdef USE_TANGENT\n\t\tvTangent = normalize( transformedTangent );\n\t\tvBitangent = normalize( cross( vNormal, vTangent ) * tangent.w );\n\t#endif\n#endif`,ou=`#ifdef USE_NORMALMAP\n\tuniform sampler2D normalMap;\n\tuniform vec2 normalScale;\n#endif\n#ifdef USE_NORMALMAP_OBJECTSPACE\n\tuniform mat3 normalMatrix;\n#endif\n#if ! defined ( USE_TANGENT ) && ( defined ( USE_NORMALMAP_TANGENTSPACE ) || defined ( USE_CLEARCOAT_NORMALMAP ) || defined( USE_ANISOTROPY ) )\n\tmat3 getTangentFrame( vec3 eye_pos, vec3 surf_norm, vec2 uv ) {\n\t\tvec3 q0 = dFdx( eye_pos.xyz );\n\t\tvec3 q1 = dFdy( eye_pos.xyz );\n\t\tvec2 st0 = dFdx( uv.st );\n\t\tvec2 st1 = dFdy( uv.st );\n\t\tvec3 N = surf_norm;\n\t\tvec3 q1perp = cross( q1, N );\n\t\tvec3 q0perp = cross( N, q0 );\n\t\tvec3 T = q1perp * st0.x + q0perp * st1.x;\n\t\tvec3 B = q1perp * st0.y + q0perp * st1.y;\n\t\tfloat det = max( dot( T, T ), dot( B, B ) );\n\t\tfloat scale = ( det == 0.0 ) ? 0.0 : inversesqrt( det );\n\t\treturn mat3( T * scale, B * scale, N );\n\t}\n#endif`,lu=`#ifdef USE_CLEARCOAT\n\tvec3 clearcoatNormal = nonPerturbedNormal;\n#endif`,cu=`#ifdef USE_CLEARCOAT_NORMALMAP\n\tvec3 clearcoatMapN = texture2D( clearcoatNormalMap, vClearcoatNormalMapUv ).xyz * 2.0 - 1.0;\n\tclearcoatMapN.xy *= clearcoatNormalScale;\n\tclearcoatNormal = normalize( tbn2 * clearcoatMapN );\n#endif`,hu=`#ifdef USE_CLEARCOATMAP\n\tuniform sampler2D clearcoatMap;\n#endif\n#ifdef USE_CLEARCOAT_NORMALMAP\n\tuniform sampler2D clearcoatNormalMap;\n\tuniform vec2 clearcoatNormalScale;\n#endif\n#ifdef USE_CLEARCOAT_ROUGHNESSMAP\n\tuniform sampler2D clearcoatRoughnessMap;\n#endif`,uu=`#ifdef USE_IRIDESCENCEMAP\n\tuniform sampler2D iridescenceMap;\n#endif\n#ifdef USE_IRIDESCENCE_THICKNESSMAP\n\tuniform sampler2D iridescenceThicknessMap;\n#endif`,du=`#ifdef OPAQUE\ndiffuseColor.a = 1.0;\n#endif\n#ifdef USE_TRANSMISSION\ndiffuseColor.a *= material.transmissionAlpha;\n#endif\ngl_FragColor = vec4( outgoingLight, diffuseColor.a );`,fu=`vec3 packNormalToRGB( const in vec3 normal ) {\n\treturn normalize( normal ) * 0.5 + 0.5;\n}\nvec3 unpackRGBToNormal( const in vec3 rgb ) {\n\treturn 2.0 * rgb.xyz - 1.0;\n}\nconst float PackUpscale = 256. / 255.;const float UnpackDownscale = 255. / 256.;\nconst vec3 PackFactors = vec3( 256. * 256. * 256., 256. * 256., 256. );\nconst vec4 UnpackFactors = UnpackDownscale / vec4( PackFactors, 1. );\nconst float ShiftRight8 = 1. / 256.;\nvec4 packDepthToRGBA( const in float v ) {\n\tvec4 r = vec4( fract( v * PackFactors ), v );\n\tr.yzw -= r.xyz * ShiftRight8;\treturn r * PackUpscale;\n}\nfloat unpackRGBAToDepth( const in vec4 v ) {\n\treturn dot( v, UnpackFactors );\n}\nvec2 packDepthToRG( in highp float v ) {\n\treturn packDepthToRGBA( v ).yx;\n}\nfloat unpackRGToDepth( const in highp vec2 v ) {\n\treturn unpackRGBAToDepth( vec4( v.xy, 0.0, 0.0 ) );\n}\nvec4 pack2HalfToRGBA( vec2 v ) {\n\tvec4 r = vec4( v.x, fract( v.x * 255.0 ), v.y, fract( v.y * 255.0 ) );\n\treturn vec4( r.x - r.y / 255.0, r.y, r.z - r.w / 255.0, r.w );\n}\nvec2 unpackRGBATo2Half( vec4 v ) {\n\treturn vec2( v.x + ( v.y / 255.0 ), v.z + ( v.w / 255.0 ) );\n}\nfloat viewZToOrthographicDepth( const in float viewZ, const in float near, const in float far ) {\n\treturn ( viewZ + near ) / ( near - far );\n}\nfloat orthographicDepthToViewZ( const in float depth, const in float near, const in float far ) {\n\treturn depth * ( near - far ) - near;\n}\nfloat viewZToPerspectiveDepth( const in float viewZ, const in float near, const in float far ) {\n\treturn ( ( near + viewZ ) * far ) / ( ( far - near ) * viewZ );\n}\nfloat perspectiveDepthToViewZ( const in float depth, const in float near, const in float far ) {\n\treturn ( near * far ) / ( ( far - near ) * depth - far );\n}`,pu=`#ifdef PREMULTIPLIED_ALPHA\n\tgl_FragColor.rgb *= gl_FragColor.a;\n#endif`,mu=`vec4 mvPosition = vec4( transformed, 1.0 );\n#ifdef USE_BATCHING\n\tmvPosition = batchingMatrix * mvPosition;\n#endif\n#ifdef USE_INSTANCING\n\tmvPosition = instanceMatrix * mvPosition;\n#endif\nmvPosition = modelViewMatrix * mvPosition;\ngl_Position = projectionMatrix * mvPosition;`,gu=`#ifdef DITHERING\n\tgl_FragColor.rgb = dithering( gl_FragColor.rgb );\n#endif`,_u=`#ifdef DITHERING\n\tvec3 dithering( vec3 color ) {\n\t\tfloat grid_position = rand( gl_FragCoord.xy );\n\t\tvec3 dither_shift_RGB = vec3( 0.25 / 255.0, -0.25 / 255.0, 0.25 / 255.0 );\n\t\tdither_shift_RGB = mix( 2.0 * dither_shift_RGB, -2.0 * dither_shift_RGB, grid_position );\n\t\treturn color + dither_shift_RGB;\n\t}\n#endif`,xu=`float roughnessFactor = roughness;\n#ifdef USE_ROUGHNESSMAP\n\tvec4 texelRoughness = texture2D( roughnessMap, vRoughnessMapUv );\n\troughnessFactor *= texelRoughness.g;\n#endif`,vu=`#ifdef USE_ROUGHNESSMAP\n\tuniform sampler2D roughnessMap;\n#endif`,yu=`#if NUM_SPOT_LIGHT_COORDS > 0\n\tvarying vec4 vSpotLightCoord[ NUM_SPOT_LIGHT_COORDS ];\n#endif\n#if NUM_SPOT_LIGHT_MAPS > 0\n\tuniform sampler2D spotLightMap[ NUM_SPOT_LIGHT_MAPS ];\n#endif\n#ifdef USE_SHADOWMAP\n\t#if NUM_DIR_LIGHT_SHADOWS > 0\n\t\tuniform sampler2D directionalShadowMap[ NUM_DIR_LIGHT_SHADOWS ];\n\t\tvarying vec4 vDirectionalShadowCoord[ NUM_DIR_LIGHT_SHADOWS ];\n\t\tstruct DirectionalLightShadow {\n\t\t\tfloat shadowBias;\n\t\t\tfloat shadowNormalBias;\n\t\t\tfloat shadowRadius;\n\t\t\tvec2 shadowMapSize;\n\t\t};\n\t\tuniform DirectionalLightShadow directionalLightShadows[ NUM_DIR_LIGHT_SHADOWS ];\n\t#endif\n\t#if NUM_SPOT_LIGHT_SHADOWS > 0\n\t\tuniform sampler2D spotShadowMap[ NUM_SPOT_LIGHT_SHADOWS ];\n\t\tstruct SpotLightShadow {\n\t\t\tfloat shadowBias;\n\t\t\tfloat shadowNormalBias;\n\t\t\tfloat shadowRadius;\n\t\t\tvec2 shadowMapSize;\n\t\t};\n\t\tuniform SpotLightShadow spotLightShadows[ NUM_SPOT_LIGHT_SHADOWS ];\n\t#endif\n\t#if NUM_POINT_LIGHT_SHADOWS > 0\n\t\tuniform sampler2D pointShadowMap[ NUM_POINT_LIGHT_SHADOWS ];\n\t\tvarying vec4 vPointShadowCoord[ NUM_POINT_LIGHT_SHADOWS ];\n\t\tstruct PointLightShadow {\n\t\t\tfloat shadowBias;\n\t\t\tfloat shadowNormalBias;\n\t\t\tfloat shadowRadius;\n\t\t\tvec2 shadowMapSize;\n\t\t\tfloat shadowCameraNear;\n\t\t\tfloat shadowCameraFar;\n\t\t};\n\t\tuniform PointLightShadow pointLightShadows[ NUM_POINT_LIGHT_SHADOWS ];\n\t#endif\n\tfloat texture2DCompare( sampler2D depths, vec2 uv, float compare ) {\n\t\treturn step( compare, unpackRGBAToDepth( texture2D( depths, uv ) ) );\n\t}\n\tvec2 texture2DDistribution( sampler2D shadow, vec2 uv ) {\n\t\treturn unpackRGBATo2Half( texture2D( shadow, uv ) );\n\t}\n\tfloat VSMShadow (sampler2D shadow, vec2 uv, float compare ){\n\t\tfloat occlusion = 1.0;\n\t\tvec2 distribution = texture2DDistribution( shadow, uv );\n\t\tfloat hard_shadow = step( compare , distribution.x );\n\t\tif (hard_shadow != 1.0 ) {\n\t\t\tfloat distance = compare - distribution.x ;\n\t\t\tfloat variance = max( 0.00000, distribution.y * distribution.y );\n\t\t\tfloat softness_probability = variance / (variance + distance * distance );\t\t\tsoftness_probability = clamp( ( softness_probability - 0.3 ) / ( 0.95 - 0.3 ), 0.0, 1.0 );\t\t\tocclusion = clamp( max( hard_shadow, softness_probability ), 0.0, 1.0 );\n\t\t}\n\t\treturn occlusion;\n\t}\n\tfloat getShadow( sampler2D shadowMap, vec2 shadowMapSize, float shadowBias, float shadowRadius, vec4 shadowCoord ) {\n\t\tfloat shadow = 1.0;\n\t\tshadowCoord.xyz /= shadowCoord.w;\n\t\tshadowCoord.z += shadowBias;\n\t\tbool inFrustum = shadowCoord.x >= 0.0 && shadowCoord.x <= 1.0 && shadowCoord.y >= 0.0 && shadowCoord.y <= 1.0;\n\t\tbool frustumTest = inFrustum && shadowCoord.z <= 1.0;\n\t\tif ( frustumTest ) {\n\t\t#if defined( SHADOWMAP_TYPE_PCF )\n\t\t\tvec2 texelSize = vec2( 1.0 ) / shadowMapSize;\n\t\t\tfloat dx0 = - texelSize.x * shadowRadius;\n\t\t\tfloat dy0 = - texelSize.y * shadowRadius;\n\t\t\tfloat dx1 = + texelSize.x * shadowRadius;\n\t\t\tfloat dy1 = + texelSize.y * shadowRadius;\n\t\t\tfloat dx2 = dx0 / 2.0;\n\t\t\tfloat dy2 = dy0 / 2.0;\n\t\t\tfloat dx3 = dx1 / 2.0;\n\t\t\tfloat dy3 = dy1 / 2.0;\n\t\t\tshadow = (\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx0, dy0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( 0.0, dy0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx1, dy0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx2, dy2 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( 0.0, dy2 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx3, dy2 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx0, 0.0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx2, 0.0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy, shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx3, 0.0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx1, 0.0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx2, dy3 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( 0.0, dy3 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx3, dy3 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx0, dy1 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( 0.0, dy1 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx1, dy1 ), shadowCoord.z )\n\t\t\t) * ( 1.0 / 17.0 );\n\t\t#elif defined( SHADOWMAP_TYPE_PCF_SOFT )\n\t\t\tvec2 texelSize = vec2( 1.0 ) / shadowMapSize;\n\t\t\tfloat dx = texelSize.x;\n\t\t\tfloat dy = texelSize.y;\n\t\t\tvec2 uv = shadowCoord.xy;\n\t\t\tvec2 f = fract( uv * shadowMapSize + 0.5 );\n\t\t\tuv -= f * texelSize;\n\t\t\tshadow = (\n\t\t\t\ttexture2DCompare( shadowMap, uv, shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, uv + vec2( dx, 0.0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, uv + vec2( 0.0, dy ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, uv + texelSize, shadowCoord.z ) +\n\t\t\t\tmix( texture2DCompare( shadowMap, uv + vec2( -dx, 0.0 ), shadowCoord.z ),\n\t\t\t\t\t texture2DCompare( shadowMap, uv + vec2( 2.0 * dx, 0.0 ), shadowCoord.z ),\n\t\t\t\t\t f.x ) +\n\t\t\t\tmix( texture2DCompare( shadowMap, uv + vec2( -dx, dy ), shadowCoord.z ),\n\t\t\t\t\t texture2DCompare( shadowMap, uv + vec2( 2.0 * dx, dy ), shadowCoord.z ),\n\t\t\t\t\t f.x ) +\n\t\t\t\tmix( texture2DCompare( shadowMap, uv + vec2( 0.0, -dy ), shadowCoord.z ),\n\t\t\t\t\t texture2DCompare( shadowMap, uv + vec2( 0.0, 2.0 * dy ), shadowCoord.z ),\n\t\t\t\t\t f.y ) +\n\t\t\t\tmix( texture2DCompare( shadowMap, uv + vec2( dx, -dy ), shadowCoord.z ),\n\t\t\t\t\t texture2DCompare( shadowMap, uv + vec2( dx, 2.0 * dy ), shadowCoord.z ),\n\t\t\t\t\t f.y ) +\n\t\t\t\tmix( mix( texture2DCompare( shadowMap, uv + vec2( -dx, -dy ), shadowCoord.z ),\n\t\t\t\t\t\t  texture2DCompare( shadowMap, uv + vec2( 2.0 * dx, -dy ), shadowCoord.z ),\n\t\t\t\t\t\t  f.x ),\n\t\t\t\t\t mix( texture2DCompare( shadowMap, uv + vec2( -dx, 2.0 * dy ), shadowCoord.z ),\n\t\t\t\t\t\t  texture2DCompare( shadowMap, uv + vec2( 2.0 * dx, 2.0 * dy ), shadowCoord.z ),\n\t\t\t\t\t\t  f.x ),\n\t\t\t\t\t f.y )\n\t\t\t) * ( 1.0 / 9.0 );\n\t\t#elif defined( SHADOWMAP_TYPE_VSM )\n\t\t\tshadow = VSMShadow( shadowMap, shadowCoord.xy, shadowCoord.z );\n\t\t#else\n\t\t\tshadow = texture2DCompare( shadowMap, shadowCoord.xy, shadowCoord.z );\n\t\t#endif\n\t\t}\n\t\treturn shadow;\n\t}\n\tvec2 cubeToUV( vec3 v, float texelSizeY ) {\n\t\tvec3 absV = abs( v );\n\t\tfloat scaleToCube = 1.0 / max( absV.x, max( absV.y, absV.z ) );\n\t\tabsV *= scaleToCube;\n\t\tv *= scaleToCube * ( 1.0 - 2.0 * texelSizeY );\n\t\tvec2 planar = v.xy;\n\t\tfloat almostATexel = 1.5 * texelSizeY;\n\t\tfloat almostOne = 1.0 - almostATexel;\n\t\tif ( absV.z >= almostOne ) {\n\t\t\tif ( v.z > 0.0 )\n\t\t\t\tplanar.x = 4.0 - v.x;\n\t\t} else if ( absV.x >= almostOne ) {\n\t\t\tfloat signX = sign( v.x );\n\t\t\tplanar.x = v.z * signX + 2.0 * signX;\n\t\t} else if ( absV.y >= almostOne ) {\n\t\t\tfloat signY = sign( v.y );\n\t\t\tplanar.x = v.x + 2.0 * signY + 2.0;\n\t\t\tplanar.y = v.z * signY - 2.0;\n\t\t}\n\t\treturn vec2( 0.125, 0.25 ) * planar + vec2( 0.375, 0.75 );\n\t}\n\tfloat getPointShadow( sampler2D shadowMap, vec2 shadowMapSize, float shadowBias, float shadowRadius, vec4 shadowCoord, float shadowCameraNear, float shadowCameraFar ) {\n\t\tvec2 texelSize = vec2( 1.0 ) / ( shadowMapSize * vec2( 4.0, 2.0 ) );\n\t\tvec3 lightToPosition = shadowCoord.xyz;\n\t\tfloat dp = ( length( lightToPosition ) - shadowCameraNear ) / ( shadowCameraFar - shadowCameraNear );\t\tdp += shadowBias;\n\t\tvec3 bd3D = normalize( lightToPosition );\n\t\t#if defined( SHADOWMAP_TYPE_PCF ) || defined( SHADOWMAP_TYPE_PCF_SOFT ) || defined( SHADOWMAP_TYPE_VSM )\n\t\t\tvec2 offset = vec2( - 1, 1 ) * shadowRadius * texelSize.y;\n\t\t\treturn (\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.xyy, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.yyy, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.xyx, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.yyx, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.xxy, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.yxy, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.xxx, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.yxx, texelSize.y ), dp )\n\t\t\t) * ( 1.0 / 9.0 );\n\t\t#else\n\t\t\treturn texture2DCompare( shadowMap, cubeToUV( bd3D, texelSize.y ), dp );\n\t\t#endif\n\t}\n#endif`,Mu=`#if NUM_SPOT_LIGHT_COORDS > 0\n\tuniform mat4 spotLightMatrix[ NUM_SPOT_LIGHT_COORDS ];\n\tvarying vec4 vSpotLightCoord[ NUM_SPOT_LIGHT_COORDS ];\n#endif\n#ifdef USE_SHADOWMAP\n\t#if NUM_DIR_LIGHT_SHADOWS > 0\n\t\tuniform mat4 directionalShadowMatrix[ NUM_DIR_LIGHT_SHADOWS ];\n\t\tvarying vec4 vDirectionalShadowCoord[ NUM_DIR_LIGHT_SHADOWS ];\n\t\tstruct DirectionalLightShadow {\n\t\t\tfloat shadowBias;\n\t\t\tfloat shadowNormalBias;\n\t\t\tfloat shadowRadius;\n\t\t\tvec2 shadowMapSize;\n\t\t};\n\t\tuniform DirectionalLightShadow directionalLightShadows[ NUM_DIR_LIGHT_SHADOWS ];\n\t#endif\n\t#if NUM_SPOT_LIGHT_SHADOWS > 0\n\t\tstruct SpotLightShadow {\n\t\t\tfloat shadowBias;\n\t\t\tfloat shadowNormalBias;\n\t\t\tfloat shadowRadius;\n\t\t\tvec2 shadowMapSize;\n\t\t};\n\t\tuniform SpotLightShadow spotLightShadows[ NUM_SPOT_LIGHT_SHADOWS ];\n\t#endif\n\t#if NUM_POINT_LIGHT_SHADOWS > 0\n\t\tuniform mat4 pointShadowMatrix[ NUM_POINT_LIGHT_SHADOWS ];\n\t\tvarying vec4 vPointShadowCoord[ NUM_POINT_LIGHT_SHADOWS ];\n\t\tstruct PointLightShadow {\n\t\t\tfloat shadowBias;\n\t\t\tfloat shadowNormalBias;\n\t\t\tfloat shadowRadius;\n\t\t\tvec2 shadowMapSize;\n\t\t\tfloat shadowCameraNear;\n\t\t\tfloat shadowCameraFar;\n\t\t};\n\t\tuniform PointLightShadow pointLightShadows[ NUM_POINT_LIGHT_SHADOWS ];\n\t#endif\n#endif`,Su=`#if ( defined( USE_SHADOWMAP ) && ( NUM_DIR_LIGHT_SHADOWS > 0 || NUM_POINT_LIGHT_SHADOWS > 0 ) ) || ( NUM_SPOT_LIGHT_COORDS > 0 )\n\tvec3 shadowWorldNormal = inverseTransformDirection( transformedNormal, viewMatrix );\n\tvec4 shadowWorldPosition;\n#endif\n#if defined( USE_SHADOWMAP )\n\t#if NUM_DIR_LIGHT_SHADOWS > 0\n\t\t#pragma unroll_loop_start\n\t\tfor ( int i = 0; i < NUM_DIR_LIGHT_SHADOWS; i ++ ) {\n\t\t\tshadowWorldPosition = worldPosition + vec4( shadowWorldNormal * directionalLightShadows[ i ].shadowNormalBias, 0 );\n\t\t\tvDirectionalShadowCoord[ i ] = directionalShadowMatrix[ i ] * shadowWorldPosition;\n\t\t}\n\t\t#pragma unroll_loop_end\n\t#endif\n\t#if NUM_POINT_LIGHT_SHADOWS > 0\n\t\t#pragma unroll_loop_start\n\t\tfor ( int i = 0; i < NUM_POINT_LIGHT_SHADOWS; i ++ ) {\n\t\t\tshadowWorldPosition = worldPosition + vec4( shadowWorldNormal * pointLightShadows[ i ].shadowNormalBias, 0 );\n\t\t\tvPointShadowCoord[ i ] = pointShadowMatrix[ i ] * shadowWorldPosition;\n\t\t}\n\t\t#pragma unroll_loop_end\n\t#endif\n#endif\n#if NUM_SPOT_LIGHT_COORDS > 0\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_SPOT_LIGHT_COORDS; i ++ ) {\n\t\tshadowWorldPosition = worldPosition;\n\t\t#if ( defined( USE_SHADOWMAP ) && UNROLLED_LOOP_INDEX < NUM_SPOT_LIGHT_SHADOWS )\n\t\t\tshadowWorldPosition.xyz += shadowWorldNormal * spotLightShadows[ i ].shadowNormalBias;\n\t\t#endif\n\t\tvSpotLightCoord[ i ] = spotLightMatrix[ i ] * shadowWorldPosition;\n\t}\n\t#pragma unroll_loop_end\n#endif`,bu=`float getShadowMask() {\n\tfloat shadow = 1.0;\n\t#ifdef USE_SHADOWMAP\n\t#if NUM_DIR_LIGHT_SHADOWS > 0\n\tDirectionalLightShadow directionalLight;\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_DIR_LIGHT_SHADOWS; i ++ ) {\n\t\tdirectionalLight = directionalLightShadows[ i ];\n\t\tshadow *= receiveShadow ? getShadow( directionalShadowMap[ i ], directionalLight.shadowMapSize, directionalLight.shadowBias, directionalLight.shadowRadius, vDirectionalShadowCoord[ i ] ) : 1.0;\n\t}\n\t#pragma unroll_loop_end\n\t#endif\n\t#if NUM_SPOT_LIGHT_SHADOWS > 0\n\tSpotLightShadow spotLight;\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_SPOT_LIGHT_SHADOWS; i ++ ) {\n\t\tspotLight = spotLightShadows[ i ];\n\t\tshadow *= receiveShadow ? getShadow( spotShadowMap[ i ], spotLight.shadowMapSize, spotLight.shadowBias, spotLight.shadowRadius, vSpotLightCoord[ i ] ) : 1.0;\n\t}\n\t#pragma unroll_loop_end\n\t#endif\n\t#if NUM_POINT_LIGHT_SHADOWS > 0\n\tPointLightShadow pointLight;\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_POINT_LIGHT_SHADOWS; i ++ ) {\n\t\tpointLight = pointLightShadows[ i ];\n\t\tshadow *= receiveShadow ? getPointShadow( pointShadowMap[ i ], pointLight.shadowMapSize, pointLight.shadowBias, pointLight.shadowRadius, vPointShadowCoord[ i ], pointLight.shadowCameraNear, pointLight.shadowCameraFar ) : 1.0;\n\t}\n\t#pragma unroll_loop_end\n\t#endif\n\t#endif\n\treturn shadow;\n}`,Eu=`#ifdef USE_SKINNING\n\tmat4 boneMatX = getBoneMatrix( skinIndex.x );\n\tmat4 boneMatY = getBoneMatrix( skinIndex.y );\n\tmat4 boneMatZ = getBoneMatrix( skinIndex.z );\n\tmat4 boneMatW = getBoneMatrix( skinIndex.w );\n#endif`,wu=`#ifdef USE_SKINNING\n\tuniform mat4 bindMatrix;\n\tuniform mat4 bindMatrixInverse;\n\tuniform highp sampler2D boneTexture;\n\tmat4 getBoneMatrix( const in float i ) {\n\t\tint size = textureSize( boneTexture, 0 ).x;\n\t\tint j = int( i ) * 4;\n\t\tint x = j % size;\n\t\tint y = j / size;\n\t\tvec4 v1 = texelFetch( boneTexture, ivec2( x, y ), 0 );\n\t\tvec4 v2 = texelFetch( boneTexture, ivec2( x + 1, y ), 0 );\n\t\tvec4 v3 = texelFetch( boneTexture, ivec2( x + 2, y ), 0 );\n\t\tvec4 v4 = texelFetch( boneTexture, ivec2( x + 3, y ), 0 );\n\t\treturn mat4( v1, v2, v3, v4 );\n\t}\n#endif`,Tu=`#ifdef USE_SKINNING\n\tvec4 skinVertex = bindMatrix * vec4( transformed, 1.0 );\n\tvec4 skinned = vec4( 0.0 );\n\tskinned += boneMatX * skinVertex * skinWeight.x;\n\tskinned += boneMatY * skinVertex * skinWeight.y;\n\tskinned += boneMatZ * skinVertex * skinWeight.z;\n\tskinned += boneMatW * skinVertex * skinWeight.w;\n\ttransformed = ( bindMatrixInverse * skinned ).xyz;\n#endif`,Au=`#ifdef USE_SKINNING\n\tmat4 skinMatrix = mat4( 0.0 );\n\tskinMatrix += skinWeight.x * boneMatX;\n\tskinMatrix += skinWeight.y * boneMatY;\n\tskinMatrix += skinWeight.z * boneMatZ;\n\tskinMatrix += skinWeight.w * boneMatW;\n\tskinMatrix = bindMatrixInverse * skinMatrix * bindMatrix;\n\tobjectNormal = vec4( skinMatrix * vec4( objectNormal, 0.0 ) ).xyz;\n\t#ifdef USE_TANGENT\n\t\tobjectTangent = vec4( skinMatrix * vec4( objectTangent, 0.0 ) ).xyz;\n\t#endif\n#endif`,Cu=`float specularStrength;\n#ifdef USE_SPECULARMAP\n\tvec4 texelSpecular = texture2D( specularMap, vSpecularMapUv );\n\tspecularStrength = texelSpecular.r;\n#else\n\tspecularStrength = 1.0;\n#endif`,Ru=`#ifdef USE_SPECULARMAP\n\tuniform sampler2D specularMap;\n#endif`,Pu=`#if defined( TONE_MAPPING )\n\tgl_FragColor.rgb = toneMapping( gl_FragColor.rgb );\n#endif`,Lu=`#ifndef saturate\n#define saturate( a ) clamp( a, 0.0, 1.0 )\n#endif\nuniform float toneMappingExposure;\nvec3 LinearToneMapping( vec3 color ) {\n\treturn saturate( toneMappingExposure * color );\n}\nvec3 ReinhardToneMapping( vec3 color ) {\n\tcolor *= toneMappingExposure;\n\treturn saturate( color / ( vec3( 1.0 ) + color ) );\n}\nvec3 OptimizedCineonToneMapping( vec3 color ) {\n\tcolor *= toneMappingExposure;\n\tcolor = max( vec3( 0.0 ), color - 0.004 );\n\treturn pow( ( color * ( 6.2 * color + 0.5 ) ) / ( color * ( 6.2 * color + 1.7 ) + 0.06 ), vec3( 2.2 ) );\n}\nvec3 RRTAndODTFit( vec3 v ) {\n\tvec3 a = v * ( v + 0.0245786 ) - 0.000090537;\n\tvec3 b = v * ( 0.983729 * v + 0.4329510 ) + 0.238081;\n\treturn a / b;\n}\nvec3 ACESFilmicToneMapping( vec3 color ) {\n\tconst mat3 ACESInputMat = mat3(\n\t\tvec3( 0.59719, 0.07600, 0.02840 ),\t\tvec3( 0.35458, 0.90834, 0.13383 ),\n\t\tvec3( 0.04823, 0.01566, 0.83777 )\n\t);\n\tconst mat3 ACESOutputMat = mat3(\n\t\tvec3(  1.60475, -0.10208, -0.00327 ),\t\tvec3( -0.53108,  1.10813, -0.07276 ),\n\t\tvec3( -0.07367, -0.00605,  1.07602 )\n\t);\n\tcolor *= toneMappingExposure / 0.6;\n\tcolor = ACESInputMat * color;\n\tcolor = RRTAndODTFit( color );\n\tcolor = ACESOutputMat * color;\n\treturn saturate( color );\n}\nconst mat3 LINEAR_REC2020_TO_LINEAR_SRGB = mat3(\n\tvec3( 1.6605, - 0.1246, - 0.0182 ),\n\tvec3( - 0.5876, 1.1329, - 0.1006 ),\n\tvec3( - 0.0728, - 0.0083, 1.1187 )\n);\nconst mat3 LINEAR_SRGB_TO_LINEAR_REC2020 = mat3(\n\tvec3( 0.6274, 0.0691, 0.0164 ),\n\tvec3( 0.3293, 0.9195, 0.0880 ),\n\tvec3( 0.0433, 0.0113, 0.8956 )\n);\nvec3 agxDefaultContrastApprox( vec3 x ) {\n\tvec3 x2 = x * x;\n\tvec3 x4 = x2 * x2;\n\treturn + 15.5 * x4 * x2\n\t\t- 40.14 * x4 * x\n\t\t+ 31.96 * x4\n\t\t- 6.868 * x2 * x\n\t\t+ 0.4298 * x2\n\t\t+ 0.1191 * x\n\t\t- 0.00232;\n}\nvec3 AgXToneMapping( vec3 color ) {\n\tconst mat3 AgXInsetMatrix = mat3(\n\t\tvec3( 0.856627153315983, 0.137318972929847, 0.11189821299995 ),\n\t\tvec3( 0.0951212405381588, 0.761241990602591, 0.0767994186031903 ),\n\t\tvec3( 0.0482516061458583, 0.101439036467562, 0.811302368396859 )\n\t);\n\tconst mat3 AgXOutsetMatrix = mat3(\n\t\tvec3( 1.1271005818144368, - 0.1413297634984383, - 0.14132976349843826 ),\n\t\tvec3( - 0.11060664309660323, 1.157823702216272, - 0.11060664309660294 ),\n\t\tvec3( - 0.016493938717834573, - 0.016493938717834257, 1.2519364065950405 )\n\t);\n\tconst float AgxMinEv = - 12.47393;\tconst float AgxMaxEv = 4.026069;\n\tcolor = LINEAR_SRGB_TO_LINEAR_REC2020 * color;\n\tcolor *= toneMappingExposure;\n\tcolor = AgXInsetMatrix * color;\n\tcolor = max( color, 1e-10 );\tcolor = log2( color );\n\tcolor = ( color - AgxMinEv ) / ( AgxMaxEv - AgxMinEv );\n\tcolor = clamp( color, 0.0, 1.0 );\n\tcolor = agxDefaultContrastApprox( color );\n\tcolor = AgXOutsetMatrix * color;\n\tcolor = pow( max( vec3( 0.0 ), color ), vec3( 2.2 ) );\n\tcolor = LINEAR_REC2020_TO_LINEAR_SRGB * color;\n\treturn color;\n}\nvec3 CustomToneMapping( vec3 color ) { return color; }`,Iu=`#ifdef USE_TRANSMISSION\n\tmaterial.transmission = transmission;\n\tmaterial.transmissionAlpha = 1.0;\n\tmaterial.thickness = thickness;\n\tmaterial.attenuationDistance = attenuationDistance;\n\tmaterial.attenuationColor = attenuationColor;\n\t#ifdef USE_TRANSMISSIONMAP\n\t\tmaterial.transmission *= texture2D( transmissionMap, vTransmissionMapUv ).r;\n\t#endif\n\t#ifdef USE_THICKNESSMAP\n\t\tmaterial.thickness *= texture2D( thicknessMap, vThicknessMapUv ).g;\n\t#endif\n\tvec3 pos = vWorldPosition;\n\tvec3 v = normalize( cameraPosition - pos );\n\tvec3 n = inverseTransformDirection( normal, viewMatrix );\n\tvec4 transmitted = getIBLVolumeRefraction(\n\t\tn, v, material.roughness, material.diffuseColor, material.specularColor, material.specularF90,\n\t\tpos, modelMatrix, viewMatrix, projectionMatrix, material.ior, material.thickness,\n\t\tmaterial.attenuationColor, material.attenuationDistance );\n\tmaterial.transmissionAlpha = mix( material.transmissionAlpha, transmitted.a, material.transmission );\n\ttotalDiffuse = mix( totalDiffuse, transmitted.rgb, material.transmission );\n#endif`,Uu=`#ifdef USE_TRANSMISSION\n\tuniform float transmission;\n\tuniform float thickness;\n\tuniform float attenuationDistance;\n\tuniform vec3 attenuationColor;\n\t#ifdef USE_TRANSMISSIONMAP\n\t\tuniform sampler2D transmissionMap;\n\t#endif\n\t#ifdef USE_THICKNESSMAP\n\t\tuniform sampler2D thicknessMap;\n\t#endif\n\tuniform vec2 transmissionSamplerSize;\n\tuniform sampler2D transmissionSamplerMap;\n\tuniform mat4 modelMatrix;\n\tuniform mat4 projectionMatrix;\n\tvarying vec3 vWorldPosition;\n\tfloat w0( float a ) {\n\t\treturn ( 1.0 / 6.0 ) * ( a * ( a * ( - a + 3.0 ) - 3.0 ) + 1.0 );\n\t}\n\tfloat w1( float a ) {\n\t\treturn ( 1.0 / 6.0 ) * ( a *  a * ( 3.0 * a - 6.0 ) + 4.0 );\n\t}\n\tfloat w2( float a ){\n\t\treturn ( 1.0 / 6.0 ) * ( a * ( a * ( - 3.0 * a + 3.0 ) + 3.0 ) + 1.0 );\n\t}\n\tfloat w3( float a ) {\n\t\treturn ( 1.0 / 6.0 ) * ( a * a * a );\n\t}\n\tfloat g0( float a ) {\n\t\treturn w0( a ) + w1( a );\n\t}\n\tfloat g1( float a ) {\n\t\treturn w2( a ) + w3( a );\n\t}\n\tfloat h0( float a ) {\n\t\treturn - 1.0 + w1( a ) / ( w0( a ) + w1( a ) );\n\t}\n\tfloat h1( float a ) {\n\t\treturn 1.0 + w3( a ) / ( w2( a ) + w3( a ) );\n\t}\n\tvec4 bicubic( sampler2D tex, vec2 uv, vec4 texelSize, float lod ) {\n\t\tuv = uv * texelSize.zw + 0.5;\n\t\tvec2 iuv = floor( uv );\n\t\tvec2 fuv = fract( uv );\n\t\tfloat g0x = g0( fuv.x );\n\t\tfloat g1x = g1( fuv.x );\n\t\tfloat h0x = h0( fuv.x );\n\t\tfloat h1x = h1( fuv.x );\n\t\tfloat h0y = h0( fuv.y );\n\t\tfloat h1y = h1( fuv.y );\n\t\tvec2 p0 = ( vec2( iuv.x + h0x, iuv.y + h0y ) - 0.5 ) * texelSize.xy;\n\t\tvec2 p1 = ( vec2( iuv.x + h1x, iuv.y + h0y ) - 0.5 ) * texelSize.xy;\n\t\tvec2 p2 = ( vec2( iuv.x + h0x, iuv.y + h1y ) - 0.5 ) * texelSize.xy;\n\t\tvec2 p3 = ( vec2( iuv.x + h1x, iuv.y + h1y ) - 0.5 ) * texelSize.xy;\n\t\treturn g0( fuv.y ) * ( g0x * textureLod( tex, p0, lod ) + g1x * textureLod( tex, p1, lod ) ) +\n\t\t\tg1( fuv.y ) * ( g0x * textureLod( tex, p2, lod ) + g1x * textureLod( tex, p3, lod ) );\n\t}\n\tvec4 textureBicubic( sampler2D sampler, vec2 uv, float lod ) {\n\t\tvec2 fLodSize = vec2( textureSize( sampler, int( lod ) ) );\n\t\tvec2 cLodSize = vec2( textureSize( sampler, int( lod + 1.0 ) ) );\n\t\tvec2 fLodSizeInv = 1.0 / fLodSize;\n\t\tvec2 cLodSizeInv = 1.0 / cLodSize;\n\t\tvec4 fSample = bicubic( sampler, uv, vec4( fLodSizeInv, fLodSize ), floor( lod ) );\n\t\tvec4 cSample = bicubic( sampler, uv, vec4( cLodSizeInv, cLodSize ), ceil( lod ) );\n\t\treturn mix( fSample, cSample, fract( lod ) );\n\t}\n\tvec3 getVolumeTransmissionRay( const in vec3 n, const in vec3 v, const in float thickness, const in float ior, const in mat4 modelMatrix ) {\n\t\tvec3 refractionVector = refract( - v, normalize( n ), 1.0 / ior );\n\t\tvec3 modelScale;\n\t\tmodelScale.x = length( vec3( modelMatrix[ 0 ].xyz ) );\n\t\tmodelScale.y = length( vec3( modelMatrix[ 1 ].xyz ) );\n\t\tmodelScale.z = length( vec3( modelMatrix[ 2 ].xyz ) );\n\t\treturn normalize( refractionVector ) * thickness * modelScale;\n\t}\n\tfloat applyIorToRoughness( const in float roughness, const in float ior ) {\n\t\treturn roughness * clamp( ior * 2.0 - 2.0, 0.0, 1.0 );\n\t}\n\tvec4 getTransmissionSample( const in vec2 fragCoord, const in float roughness, const in float ior ) {\n\t\tfloat lod = log2( transmissionSamplerSize.x ) * applyIorToRoughness( roughness, ior );\n\t\treturn textureBicubic( transmissionSamplerMap, fragCoord.xy, lod );\n\t}\n\tvec3 volumeAttenuation( const in float transmissionDistance, const in vec3 attenuationColor, const in float attenuationDistance ) {\n\t\tif ( isinf( attenuationDistance ) ) {\n\t\t\treturn vec3( 1.0 );\n\t\t} else {\n\t\t\tvec3 attenuationCoefficient = -log( attenuationColor ) / attenuationDistance;\n\t\t\tvec3 transmittance = exp( - attenuationCoefficient * transmissionDistance );\t\t\treturn transmittance;\n\t\t}\n\t}\n\tvec4 getIBLVolumeRefraction( const in vec3 n, const in vec3 v, const in float roughness, const in vec3 diffuseColor,\n\t\tconst in vec3 specularColor, const in float specularF90, const in vec3 position, const in mat4 modelMatrix,\n\t\tconst in mat4 viewMatrix, const in mat4 projMatrix, const in float ior, const in float thickness,\n\t\tconst in vec3 attenuationColor, const in float attenuationDistance ) {\n\t\tvec3 transmissionRay = getVolumeTransmissionRay( n, v, thickness, ior, modelMatrix );\n\t\tvec3 refractedRayExit = position + transmissionRay;\n\t\tvec4 ndcPos = projMatrix * viewMatrix * vec4( refractedRayExit, 1.0 );\n\t\tvec2 refractionCoords = ndcPos.xy / ndcPos.w;\n\t\trefractionCoords += 1.0;\n\t\trefractionCoords /= 2.0;\n\t\tvec4 transmittedLight = getTransmissionSample( refractionCoords, roughness, ior );\n\t\tvec3 transmittance = diffuseColor * volumeAttenuation( length( transmissionRay ), attenuationColor, attenuationDistance );\n\t\tvec3 attenuatedColor = transmittance * transmittedLight.rgb;\n\t\tvec3 F = EnvironmentBRDF( n, v, specularColor, specularF90, roughness );\n\t\tfloat transmittanceFactor = ( transmittance.r + transmittance.g + transmittance.b ) / 3.0;\n\t\treturn vec4( ( 1.0 - F ) * attenuatedColor, 1.0 - ( 1.0 - transmittedLight.a ) * transmittanceFactor );\n\t}\n#endif`,Du=`#if defined( USE_UV ) || defined( USE_ANISOTROPY )\n\tvarying vec2 vUv;\n#endif\n#ifdef USE_MAP\n\tvarying vec2 vMapUv;\n#endif\n#ifdef USE_ALPHAMAP\n\tvarying vec2 vAlphaMapUv;\n#endif\n#ifdef USE_LIGHTMAP\n\tvarying vec2 vLightMapUv;\n#endif\n#ifdef USE_AOMAP\n\tvarying vec2 vAoMapUv;\n#endif\n#ifdef USE_BUMPMAP\n\tvarying vec2 vBumpMapUv;\n#endif\n#ifdef USE_NORMALMAP\n\tvarying vec2 vNormalMapUv;\n#endif\n#ifdef USE_EMISSIVEMAP\n\tvarying vec2 vEmissiveMapUv;\n#endif\n#ifdef USE_METALNESSMAP\n\tvarying vec2 vMetalnessMapUv;\n#endif\n#ifdef USE_ROUGHNESSMAP\n\tvarying vec2 vRoughnessMapUv;\n#endif\n#ifdef USE_ANISOTROPYMAP\n\tvarying vec2 vAnisotropyMapUv;\n#endif\n#ifdef USE_CLEARCOATMAP\n\tvarying vec2 vClearcoatMapUv;\n#endif\n#ifdef USE_CLEARCOAT_NORMALMAP\n\tvarying vec2 vClearcoatNormalMapUv;\n#endif\n#ifdef USE_CLEARCOAT_ROUGHNESSMAP\n\tvarying vec2 vClearcoatRoughnessMapUv;\n#endif\n#ifdef USE_IRIDESCENCEMAP\n\tvarying vec2 vIridescenceMapUv;\n#endif\n#ifdef USE_IRIDESCENCE_THICKNESSMAP\n\tvarying vec2 vIridescenceThicknessMapUv;\n#endif\n#ifdef USE_SHEEN_COLORMAP\n\tvarying vec2 vSheenColorMapUv;\n#endif\n#ifdef USE_SHEEN_ROUGHNESSMAP\n\tvarying vec2 vSheenRoughnessMapUv;\n#endif\n#ifdef USE_SPECULARMAP\n\tvarying vec2 vSpecularMapUv;\n#endif\n#ifdef USE_SPECULAR_COLORMAP\n\tvarying vec2 vSpecularColorMapUv;\n#endif\n#ifdef USE_SPECULAR_INTENSITYMAP\n\tvarying vec2 vSpecularIntensityMapUv;\n#endif\n#ifdef USE_TRANSMISSIONMAP\n\tuniform mat3 transmissionMapTransform;\n\tvarying vec2 vTransmissionMapUv;\n#endif\n#ifdef USE_THICKNESSMAP\n\tuniform mat3 thicknessMapTransform;\n\tvarying vec2 vThicknessMapUv;\n#endif`,Nu=`#if defined( USE_UV ) || defined( USE_ANISOTROPY )\n\tvarying vec2 vUv;\n#endif\n#ifdef USE_MAP\n\tuniform mat3 mapTransform;\n\tvarying vec2 vMapUv;\n#endif\n#ifdef USE_ALPHAMAP\n\tuniform mat3 alphaMapTransform;\n\tvarying vec2 vAlphaMapUv;\n#endif\n#ifdef USE_LIGHTMAP\n\tuniform mat3 lightMapTransform;\n\tvarying vec2 vLightMapUv;\n#endif\n#ifdef USE_AOMAP\n\tuniform mat3 aoMapTransform;\n\tvarying vec2 vAoMapUv;\n#endif\n#ifdef USE_BUMPMAP\n\tuniform mat3 bumpMapTransform;\n\tvarying vec2 vBumpMapUv;\n#endif\n#ifdef USE_NORMALMAP\n\tuniform mat3 normalMapTransform;\n\tvarying vec2 vNormalMapUv;\n#endif\n#ifdef USE_DISPLACEMENTMAP\n\tuniform mat3 displacementMapTransform;\n\tvarying vec2 vDisplacementMapUv;\n#endif\n#ifdef USE_EMISSIVEMAP\n\tuniform mat3 emissiveMapTransform;\n\tvarying vec2 vEmissiveMapUv;\n#endif\n#ifdef USE_METALNESSMAP\n\tuniform mat3 metalnessMapTransform;\n\tvarying vec2 vMetalnessMapUv;\n#endif\n#ifdef USE_ROUGHNESSMAP\n\tuniform mat3 roughnessMapTransform;\n\tvarying vec2 vRoughnessMapUv;\n#endif\n#ifdef USE_ANISOTROPYMAP\n\tuniform mat3 anisotropyMapTransform;\n\tvarying vec2 vAnisotropyMapUv;\n#endif\n#ifdef USE_CLEARCOATMAP\n\tuniform mat3 clearcoatMapTransform;\n\tvarying vec2 vClearcoatMapUv;\n#endif\n#ifdef USE_CLEARCOAT_NORMALMAP\n\tuniform mat3 clearcoatNormalMapTransform;\n\tvarying vec2 vClearcoatNormalMapUv;\n#endif\n#ifdef USE_CLEARCOAT_ROUGHNESSMAP\n\tuniform mat3 clearcoatRoughnessMapTransform;\n\tvarying vec2 vClearcoatRoughnessMapUv;\n#endif\n#ifdef USE_SHEEN_COLORMAP\n\tuniform mat3 sheenColorMapTransform;\n\tvarying vec2 vSheenColorMapUv;\n#endif\n#ifdef USE_SHEEN_ROUGHNESSMAP\n\tuniform mat3 sheenRoughnessMapTransform;\n\tvarying vec2 vSheenRoughnessMapUv;\n#endif\n#ifdef USE_IRIDESCENCEMAP\n\tuniform mat3 iridescenceMapTransform;\n\tvarying vec2 vIridescenceMapUv;\n#endif\n#ifdef USE_IRIDESCENCE_THICKNESSMAP\n\tuniform mat3 iridescenceThicknessMapTransform;\n\tvarying vec2 vIridescenceThicknessMapUv;\n#endif\n#ifdef USE_SPECULARMAP\n\tuniform mat3 specularMapTransform;\n\tvarying vec2 vSpecularMapUv;\n#endif\n#ifdef USE_SPECULAR_COLORMAP\n\tuniform mat3 specularColorMapTransform;\n\tvarying vec2 vSpecularColorMapUv;\n#endif\n#ifdef USE_SPECULAR_INTENSITYMAP\n\tuniform mat3 specularIntensityMapTransform;\n\tvarying vec2 vSpecularIntensityMapUv;\n#endif\n#ifdef USE_TRANSMISSIONMAP\n\tuniform mat3 transmissionMapTransform;\n\tvarying vec2 vTransmissionMapUv;\n#endif\n#ifdef USE_THICKNESSMAP\n\tuniform mat3 thicknessMapTransform;\n\tvarying vec2 vThicknessMapUv;\n#endif`,Fu=`#if defined( USE_UV ) || defined( USE_ANISOTROPY )\n\tvUv = vec3( uv, 1 ).xy;\n#endif\n#ifdef USE_MAP\n\tvMapUv = ( mapTransform * vec3( MAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_ALPHAMAP\n\tvAlphaMapUv = ( alphaMapTransform * vec3( ALPHAMAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_LIGHTMAP\n\tvLightMapUv = ( lightMapTransform * vec3( LIGHTMAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_AOMAP\n\tvAoMapUv = ( aoMapTransform * vec3( AOMAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_BUMPMAP\n\tvBumpMapUv = ( bumpMapTransform * vec3( BUMPMAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_NORMALMAP\n\tvNormalMapUv = ( normalMapTransform * vec3( NORMALMAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_DISPLACEMENTMAP\n\tvDisplacementMapUv = ( displacementMapTransform * vec3( DISPLACEMENTMAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_EMISSIVEMAP\n\tvEmissiveMapUv = ( emissiveMapTransform * vec3( EMISSIVEMAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_METALNESSMAP\n\tvMetalnessMapUv = ( metalnessMapTransform * vec3( METALNESSMAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_ROUGHNESSMAP\n\tvRoughnessMapUv = ( roughnessMapTransform * vec3( ROUGHNESSMAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_ANISOTROPYMAP\n\tvAnisotropyMapUv = ( anisotropyMapTransform * vec3( ANISOTROPYMAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_CLEARCOATMAP\n\tvClearcoatMapUv = ( clearcoatMapTransform * vec3( CLEARCOATMAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_CLEARCOAT_NORMALMAP\n\tvClearcoatNormalMapUv = ( clearcoatNormalMapTransform * vec3( CLEARCOAT_NORMALMAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_CLEARCOAT_ROUGHNESSMAP\n\tvClearcoatRoughnessMapUv = ( clearcoatRoughnessMapTransform * vec3( CLEARCOAT_ROUGHNESSMAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_IRIDESCENCEMAP\n\tvIridescenceMapUv = ( iridescenceMapTransform * vec3( IRIDESCENCEMAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_IRIDESCENCE_THICKNESSMAP\n\tvIridescenceThicknessMapUv = ( iridescenceThicknessMapTransform * vec3( IRIDESCENCE_THICKNESSMAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_SHEEN_COLORMAP\n\tvSheenColorMapUv = ( sheenColorMapTransform * vec3( SHEEN_COLORMAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_SHEEN_ROUGHNESSMAP\n\tvSheenRoughnessMapUv = ( sheenRoughnessMapTransform * vec3( SHEEN_ROUGHNESSMAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_SPECULARMAP\n\tvSpecularMapUv = ( specularMapTransform * vec3( SPECULARMAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_SPECULAR_COLORMAP\n\tvSpecularColorMapUv = ( specularColorMapTransform * vec3( SPECULAR_COLORMAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_SPECULAR_INTENSITYMAP\n\tvSpecularIntensityMapUv = ( specularIntensityMapTransform * vec3( SPECULAR_INTENSITYMAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_TRANSMISSIONMAP\n\tvTransmissionMapUv = ( transmissionMapTransform * vec3( TRANSMISSIONMAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_THICKNESSMAP\n\tvThicknessMapUv = ( thicknessMapTransform * vec3( THICKNESSMAP_UV, 1 ) ).xy;\n#endif`,Ou=`#if defined( USE_ENVMAP ) || defined( DISTANCE ) || defined ( USE_SHADOWMAP ) || defined ( USE_TRANSMISSION ) || NUM_SPOT_LIGHT_COORDS > 0\n\tvec4 worldPosition = vec4( transformed, 1.0 );\n\t#ifdef USE_BATCHING\n\t\tworldPosition = batchingMatrix * worldPosition;\n\t#endif\n\t#ifdef USE_INSTANCING\n\t\tworldPosition = instanceMatrix * worldPosition;\n\t#endif\n\tworldPosition = modelMatrix * worldPosition;\n#endif`,Bu=`varying vec2 vUv;\nuniform mat3 uvTransform;\nvoid main() {\n\tvUv = ( uvTransform * vec3( uv, 1 ) ).xy;\n\tgl_Position = vec4( position.xy, 1.0, 1.0 );\n}`,zu=`uniform sampler2D t2D;\nuniform float backgroundIntensity;\nvarying vec2 vUv;\nvoid main() {\n\tvec4 texColor = texture2D( t2D, vUv );\n\t#ifdef DECODE_VIDEO_TEXTURE\n\t\ttexColor = vec4( mix( pow( texColor.rgb * 0.9478672986 + vec3( 0.0521327014 ), vec3( 2.4 ) ), texColor.rgb * 0.0773993808, vec3( lessThanEqual( texColor.rgb, vec3( 0.04045 ) ) ) ), texColor.w );\n\t#endif\n\ttexColor.rgb *= backgroundIntensity;\n\tgl_FragColor = texColor;\n\t#include <tonemapping_fragment>\n\t#include <colorspace_fragment>\n}`,Vu=`varying vec3 vWorldDirection;\n#include <common>\nvoid main() {\n\tvWorldDirection = transformDirection( position, modelMatrix );\n\t#include <begin_vertex>\n\t#include <project_vertex>\n\tgl_Position.z = gl_Position.w;\n}`,ku=`#ifdef ENVMAP_TYPE_CUBE\n\tuniform samplerCube envMap;\n#elif defined( ENVMAP_TYPE_CUBE_UV )\n\tuniform sampler2D envMap;\n#endif\nuniform float flipEnvMap;\nuniform float backgroundBlurriness;\nuniform float backgroundIntensity;\nvarying vec3 vWorldDirection;\n#include <cube_uv_reflection_fragment>\nvoid main() {\n\t#ifdef ENVMAP_TYPE_CUBE\n\t\tvec4 texColor = textureCube( envMap, vec3( flipEnvMap * vWorldDirection.x, vWorldDirection.yz ) );\n\t#elif defined( ENVMAP_TYPE_CUBE_UV )\n\t\tvec4 texColor = textureCubeUV( envMap, vWorldDirection, backgroundBlurriness );\n\t#else\n\t\tvec4 texColor = vec4( 0.0, 0.0, 0.0, 1.0 );\n\t#endif\n\ttexColor.rgb *= backgroundIntensity;\n\tgl_FragColor = texColor;\n\t#include <tonemapping_fragment>\n\t#include <colorspace_fragment>\n}`,Hu=`varying vec3 vWorldDirection;\n#include <common>\nvoid main() {\n\tvWorldDirection = transformDirection( position, modelMatrix );\n\t#include <begin_vertex>\n\t#include <project_vertex>\n\tgl_Position.z = gl_Position.w;\n}`,Gu=`uniform samplerCube tCube;\nuniform float tFlip;\nuniform float opacity;\nvarying vec3 vWorldDirection;\nvoid main() {\n\tvec4 texColor = textureCube( tCube, vec3( tFlip * vWorldDirection.x, vWorldDirection.yz ) );\n\tgl_FragColor = texColor;\n\tgl_FragColor.a *= opacity;\n\t#include <tonemapping_fragment>\n\t#include <colorspace_fragment>\n}`,Wu=`#include <common>\n#include <batching_pars_vertex>\n#include <uv_pars_vertex>\n#include <displacementmap_pars_vertex>\n#include <morphtarget_pars_vertex>\n#include <skinning_pars_vertex>\n#include <logdepthbuf_pars_vertex>\n#include <clipping_planes_pars_vertex>\nvarying vec2 vHighPrecisionZW;\nvoid main() {\n\t#include <uv_vertex>\n\t#include <batching_vertex>\n\t#include <skinbase_vertex>\n\t#ifdef USE_DISPLACEMENTMAP\n\t\t#include <beginnormal_vertex>\n\t\t#include <morphnormal_vertex>\n\t\t#include <skinnormal_vertex>\n\t#endif\n\t#include <begin_vertex>\n\t#include <morphtarget_vertex>\n\t#include <skinning_vertex>\n\t#include <displacementmap_vertex>\n\t#include <project_vertex>\n\t#include <logdepthbuf_vertex>\n\t#include <clipping_planes_vertex>\n\tvHighPrecisionZW = gl_Position.zw;\n}`,Xu=`#if DEPTH_PACKING == 3200\n\tuniform float opacity;\n#endif\n#include <common>\n#include <packing>\n#include <uv_pars_fragment>\n#include <map_pars_fragment>\n#include <alphamap_pars_fragment>\n#include <alphatest_pars_fragment>\n#include <alphahash_pars_fragment>\n#include <logdepthbuf_pars_fragment>\n#include <clipping_planes_pars_fragment>\nvarying vec2 vHighPrecisionZW;\nvoid main() {\n\t#include <clipping_planes_fragment>\n\tvec4 diffuseColor = vec4( 1.0 );\n\t#if DEPTH_PACKING == 3200\n\t\tdiffuseColor.a = opacity;\n\t#endif\n\t#include <map_fragment>\n\t#include <alphamap_fragment>\n\t#include <alphatest_fragment>\n\t#include <alphahash_fragment>\n\t#include <logdepthbuf_fragment>\n\tfloat fragCoordZ = 0.5 * vHighPrecisionZW[0] / vHighPrecisionZW[1] + 0.5;\n\t#if DEPTH_PACKING == 3200\n\t\tgl_FragColor = vec4( vec3( 1.0 - fragCoordZ ), opacity );\n\t#elif DEPTH_PACKING == 3201\n\t\tgl_FragColor = packDepthToRGBA( fragCoordZ );\n\t#endif\n}`,qu=`#define DISTANCE\nvarying vec3 vWorldPosition;\n#include <common>\n#include <batching_pars_vertex>\n#include <uv_pars_vertex>\n#include <displacementmap_pars_vertex>\n#include <morphtarget_pars_vertex>\n#include <skinning_pars_vertex>\n#include <clipping_planes_pars_vertex>\nvoid main() {\n\t#include <uv_vertex>\n\t#include <batching_vertex>\n\t#include <skinbase_vertex>\n\t#ifdef USE_DISPLACEMENTMAP\n\t\t#include <beginnormal_vertex>\n\t\t#include <morphnormal_vertex>\n\t\t#include <skinnormal_vertex>\n\t#endif\n\t#include <begin_vertex>\n\t#include <morphtarget_vertex>\n\t#include <skinning_vertex>\n\t#include <displacementmap_vertex>\n\t#include <project_vertex>\n\t#include <worldpos_vertex>\n\t#include <clipping_planes_vertex>\n\tvWorldPosition = worldPosition.xyz;\n}`,Yu=`#define DISTANCE\nuniform vec3 referencePosition;\nuniform float nearDistance;\nuniform float farDistance;\nvarying vec3 vWorldPosition;\n#include <common>\n#include <packing>\n#include <uv_pars_fragment>\n#include <map_pars_fragment>\n#include <alphamap_pars_fragment>\n#include <alphatest_pars_fragment>\n#include <alphahash_pars_fragment>\n#include <clipping_planes_pars_fragment>\nvoid main () {\n\t#include <clipping_planes_fragment>\n\tvec4 diffuseColor = vec4( 1.0 );\n\t#include <map_fragment>\n\t#include <alphamap_fragment>\n\t#include <alphatest_fragment>\n\t#include <alphahash_fragment>\n\tfloat dist = length( vWorldPosition - referencePosition );\n\tdist = ( dist - nearDistance ) / ( farDistance - nearDistance );\n\tdist = saturate( dist );\n\tgl_FragColor = packDepthToRGBA( dist );\n}`,Zu=`varying vec3 vWorldDirection;\n#include <common>\nvoid main() {\n\tvWorldDirection = transformDirection( position, modelMatrix );\n\t#include <begin_vertex>\n\t#include <project_vertex>\n}`,Ju=`uniform sampler2D tEquirect;\nvarying vec3 vWorldDirection;\n#include <common>\nvoid main() {\n\tvec3 direction = normalize( vWorldDirection );\n\tvec2 sampleUV = equirectUv( direction );\n\tgl_FragColor = texture2D( tEquirect, sampleUV );\n\t#include <tonemapping_fragment>\n\t#include <colorspace_fragment>\n}`,$u=`uniform float scale;\nattribute float lineDistance;\nvarying float vLineDistance;\n#include <common>\n#include <uv_pars_vertex>\n#include <color_pars_vertex>\n#include <fog_pars_vertex>\n#include <morphtarget_pars_vertex>\n#include <logdepthbuf_pars_vertex>\n#include <clipping_planes_pars_vertex>\nvoid main() {\n\tvLineDistance = scale * lineDistance;\n\t#include <uv_vertex>\n\t#include <color_vertex>\n\t#include <morphcolor_vertex>\n\t#include <begin_vertex>\n\t#include <morphtarget_vertex>\n\t#include <project_vertex>\n\t#include <logdepthbuf_vertex>\n\t#include <clipping_planes_vertex>\n\t#include <fog_vertex>\n}`,Ku=`uniform vec3 diffuse;\nuniform float opacity;\nuniform float dashSize;\nuniform float totalSize;\nvarying float vLineDistance;\n#include <common>\n#include <color_pars_fragment>\n#include <uv_pars_fragment>\n#include <map_pars_fragment>\n#include <fog_pars_fragment>\n#include <logdepthbuf_pars_fragment>\n#include <clipping_planes_pars_fragment>\nvoid main() {\n\t#include <clipping_planes_fragment>\n\tif ( mod( vLineDistance, totalSize ) > dashSize ) {\n\t\tdiscard;\n\t}\n\tvec3 outgoingLight = vec3( 0.0 );\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\t#include <logdepthbuf_fragment>\n\t#include <map_fragment>\n\t#include <color_fragment>\n\toutgoingLight = diffuseColor.rgb;\n\t#include <opaque_fragment>\n\t#include <tonemapping_fragment>\n\t#include <colorspace_fragment>\n\t#include <fog_fragment>\n\t#include <premultiplied_alpha_fragment>\n}`,Qu=`#include <common>\n#include <batching_pars_vertex>\n#include <uv_pars_vertex>\n#include <envmap_pars_vertex>\n#include <color_pars_vertex>\n#include <fog_pars_vertex>\n#include <morphtarget_pars_vertex>\n#include <skinning_pars_vertex>\n#include <logdepthbuf_pars_vertex>\n#include <clipping_planes_pars_vertex>\nvoid main() {\n\t#include <uv_vertex>\n\t#include <color_vertex>\n\t#include <morphcolor_vertex>\n\t#include <batching_vertex>\n\t#if defined ( USE_ENVMAP ) || defined ( USE_SKINNING )\n\t\t#include <beginnormal_vertex>\n\t\t#include <morphnormal_vertex>\n\t\t#include <skinbase_vertex>\n\t\t#include <skinnormal_vertex>\n\t\t#include <defaultnormal_vertex>\n\t#endif\n\t#include <begin_vertex>\n\t#include <morphtarget_vertex>\n\t#include <skinning_vertex>\n\t#include <project_vertex>\n\t#include <logdepthbuf_vertex>\n\t#include <clipping_planes_vertex>\n\t#include <worldpos_vertex>\n\t#include <envmap_vertex>\n\t#include <fog_vertex>\n}`,ju=`uniform vec3 diffuse;\nuniform float opacity;\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n#endif\n#include <common>\n#include <dithering_pars_fragment>\n#include <color_pars_fragment>\n#include <uv_pars_fragment>\n#include <map_pars_fragment>\n#include <alphamap_pars_fragment>\n#include <alphatest_pars_fragment>\n#include <alphahash_pars_fragment>\n#include <aomap_pars_fragment>\n#include <lightmap_pars_fragment>\n#include <envmap_common_pars_fragment>\n#include <envmap_pars_fragment>\n#include <fog_pars_fragment>\n#include <specularmap_pars_fragment>\n#include <logdepthbuf_pars_fragment>\n#include <clipping_planes_pars_fragment>\nvoid main() {\n\t#include <clipping_planes_fragment>\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\t#include <logdepthbuf_fragment>\n\t#include <map_fragment>\n\t#include <color_fragment>\n\t#include <alphamap_fragment>\n\t#include <alphatest_fragment>\n\t#include <alphahash_fragment>\n\t#include <specularmap_fragment>\n\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\n\t#ifdef USE_LIGHTMAP\n\t\tvec4 lightMapTexel = texture2D( lightMap, vLightMapUv );\n\t\treflectedLight.indirectDiffuse += lightMapTexel.rgb * lightMapIntensity * RECIPROCAL_PI;\n\t#else\n\t\treflectedLight.indirectDiffuse += vec3( 1.0 );\n\t#endif\n\t#include <aomap_fragment>\n\treflectedLight.indirectDiffuse *= diffuseColor.rgb;\n\tvec3 outgoingLight = reflectedLight.indirectDiffuse;\n\t#include <envmap_fragment>\n\t#include <opaque_fragment>\n\t#include <tonemapping_fragment>\n\t#include <colorspace_fragment>\n\t#include <fog_fragment>\n\t#include <premultiplied_alpha_fragment>\n\t#include <dithering_fragment>\n}`,td=`#define LAMBERT\nvarying vec3 vViewPosition;\n#include <common>\n#include <batching_pars_vertex>\n#include <uv_pars_vertex>\n#include <displacementmap_pars_vertex>\n#include <envmap_pars_vertex>\n#include <color_pars_vertex>\n#include <fog_pars_vertex>\n#include <normal_pars_vertex>\n#include <morphtarget_pars_vertex>\n#include <skinning_pars_vertex>\n#include <shadowmap_pars_vertex>\n#include <logdepthbuf_pars_vertex>\n#include <clipping_planes_pars_vertex>\nvoid main() {\n\t#include <uv_vertex>\n\t#include <color_vertex>\n\t#include <morphcolor_vertex>\n\t#include <batching_vertex>\n\t#include <beginnormal_vertex>\n\t#include <morphnormal_vertex>\n\t#include <skinbase_vertex>\n\t#include <skinnormal_vertex>\n\t#include <defaultnormal_vertex>\n\t#include <normal_vertex>\n\t#include <begin_vertex>\n\t#include <morphtarget_vertex>\n\t#include <skinning_vertex>\n\t#include <displacementmap_vertex>\n\t#include <project_vertex>\n\t#include <logdepthbuf_vertex>\n\t#include <clipping_planes_vertex>\n\tvViewPosition = - mvPosition.xyz;\n\t#include <worldpos_vertex>\n\t#include <envmap_vertex>\n\t#include <shadowmap_vertex>\n\t#include <fog_vertex>\n}`,ed=`#define LAMBERT\nuniform vec3 diffuse;\nuniform vec3 emissive;\nuniform float opacity;\n#include <common>\n#include <packing>\n#include <dithering_pars_fragment>\n#include <color_pars_fragment>\n#include <uv_pars_fragment>\n#include <map_pars_fragment>\n#include <alphamap_pars_fragment>\n#include <alphatest_pars_fragment>\n#include <alphahash_pars_fragment>\n#include <aomap_pars_fragment>\n#include <lightmap_pars_fragment>\n#include <emissivemap_pars_fragment>\n#include <envmap_common_pars_fragment>\n#include <envmap_pars_fragment>\n#include <fog_pars_fragment>\n#include <bsdfs>\n#include <lights_pars_begin>\n#include <normal_pars_fragment>\n#include <lights_lambert_pars_fragment>\n#include <shadowmap_pars_fragment>\n#include <bumpmap_pars_fragment>\n#include <normalmap_pars_fragment>\n#include <specularmap_pars_fragment>\n#include <logdepthbuf_pars_fragment>\n#include <clipping_planes_pars_fragment>\nvoid main() {\n\t#include <clipping_planes_fragment>\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\n\tvec3 totalEmissiveRadiance = emissive;\n\t#include <logdepthbuf_fragment>\n\t#include <map_fragment>\n\t#include <color_fragment>\n\t#include <alphamap_fragment>\n\t#include <alphatest_fragment>\n\t#include <alphahash_fragment>\n\t#include <specularmap_fragment>\n\t#include <normal_fragment_begin>\n\t#include <normal_fragment_maps>\n\t#include <emissivemap_fragment>\n\t#include <lights_lambert_fragment>\n\t#include <lights_fragment_begin>\n\t#include <lights_fragment_maps>\n\t#include <lights_fragment_end>\n\t#include <aomap_fragment>\n\tvec3 outgoingLight = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + totalEmissiveRadiance;\n\t#include <envmap_fragment>\n\t#include <opaque_fragment>\n\t#include <tonemapping_fragment>\n\t#include <colorspace_fragment>\n\t#include <fog_fragment>\n\t#include <premultiplied_alpha_fragment>\n\t#include <dithering_fragment>\n}`,nd=`#define MATCAP\nvarying vec3 vViewPosition;\n#include <common>\n#include <batching_pars_vertex>\n#include <uv_pars_vertex>\n#include <color_pars_vertex>\n#include <displacementmap_pars_vertex>\n#include <fog_pars_vertex>\n#include <normal_pars_vertex>\n#include <morphtarget_pars_vertex>\n#include <skinning_pars_vertex>\n#include <logdepthbuf_pars_vertex>\n#include <clipping_planes_pars_vertex>\nvoid main() {\n\t#include <uv_vertex>\n\t#include <color_vertex>\n\t#include <morphcolor_vertex>\n\t#include <batching_vertex>\n\t#include <beginnormal_vertex>\n\t#include <morphnormal_vertex>\n\t#include <skinbase_vertex>\n\t#include <skinnormal_vertex>\n\t#include <defaultnormal_vertex>\n\t#include <normal_vertex>\n\t#include <begin_vertex>\n\t#include <morphtarget_vertex>\n\t#include <skinning_vertex>\n\t#include <displacementmap_vertex>\n\t#include <project_vertex>\n\t#include <logdepthbuf_vertex>\n\t#include <clipping_planes_vertex>\n\t#include <fog_vertex>\n\tvViewPosition = - mvPosition.xyz;\n}`,id=`#define MATCAP\nuniform vec3 diffuse;\nuniform float opacity;\nuniform sampler2D matcap;\nvarying vec3 vViewPosition;\n#include <common>\n#include <dithering_pars_fragment>\n#include <color_pars_fragment>\n#include <uv_pars_fragment>\n#include <map_pars_fragment>\n#include <alphamap_pars_fragment>\n#include <alphatest_pars_fragment>\n#include <alphahash_pars_fragment>\n#include <fog_pars_fragment>\n#include <normal_pars_fragment>\n#include <bumpmap_pars_fragment>\n#include <normalmap_pars_fragment>\n#include <logdepthbuf_pars_fragment>\n#include <clipping_planes_pars_fragment>\nvoid main() {\n\t#include <clipping_planes_fragment>\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\t#include <logdepthbuf_fragment>\n\t#include <map_fragment>\n\t#include <color_fragment>\n\t#include <alphamap_fragment>\n\t#include <alphatest_fragment>\n\t#include <alphahash_fragment>\n\t#include <normal_fragment_begin>\n\t#include <normal_fragment_maps>\n\tvec3 viewDir = normalize( vViewPosition );\n\tvec3 x = normalize( vec3( viewDir.z, 0.0, - viewDir.x ) );\n\tvec3 y = cross( viewDir, x );\n\tvec2 uv = vec2( dot( x, normal ), dot( y, normal ) ) * 0.495 + 0.5;\n\t#ifdef USE_MATCAP\n\t\tvec4 matcapColor = texture2D( matcap, uv );\n\t#else\n\t\tvec4 matcapColor = vec4( vec3( mix( 0.2, 0.8, uv.y ) ), 1.0 );\n\t#endif\n\tvec3 outgoingLight = diffuseColor.rgb * matcapColor.rgb;\n\t#include <opaque_fragment>\n\t#include <tonemapping_fragment>\n\t#include <colorspace_fragment>\n\t#include <fog_fragment>\n\t#include <premultiplied_alpha_fragment>\n\t#include <dithering_fragment>\n}`,sd=`#define NORMAL\n#if defined( FLAT_SHADED ) || defined( USE_BUMPMAP ) || defined( USE_NORMALMAP_TANGENTSPACE )\n\tvarying vec3 vViewPosition;\n#endif\n#include <common>\n#include <batching_pars_vertex>\n#include <uv_pars_vertex>\n#include <displacementmap_pars_vertex>\n#include <normal_pars_vertex>\n#include <morphtarget_pars_vertex>\n#include <skinning_pars_vertex>\n#include <logdepthbuf_pars_vertex>\n#include <clipping_planes_pars_vertex>\nvoid main() {\n\t#include <uv_vertex>\n\t#include <batching_vertex>\n\t#include <beginnormal_vertex>\n\t#include <morphnormal_vertex>\n\t#include <skinbase_vertex>\n\t#include <skinnormal_vertex>\n\t#include <defaultnormal_vertex>\n\t#include <normal_vertex>\n\t#include <begin_vertex>\n\t#include <morphtarget_vertex>\n\t#include <skinning_vertex>\n\t#include <displacementmap_vertex>\n\t#include <project_vertex>\n\t#include <logdepthbuf_vertex>\n\t#include <clipping_planes_vertex>\n#if defined( FLAT_SHADED ) || defined( USE_BUMPMAP ) || defined( USE_NORMALMAP_TANGENTSPACE )\n\tvViewPosition = - mvPosition.xyz;\n#endif\n}`,rd=`#define NORMAL\nuniform float opacity;\n#if defined( FLAT_SHADED ) || defined( USE_BUMPMAP ) || defined( USE_NORMALMAP_TANGENTSPACE )\n\tvarying vec3 vViewPosition;\n#endif\n#include <packing>\n#include <uv_pars_fragment>\n#include <normal_pars_fragment>\n#include <bumpmap_pars_fragment>\n#include <normalmap_pars_fragment>\n#include <logdepthbuf_pars_fragment>\n#include <clipping_planes_pars_fragment>\nvoid main() {\n\t#include <clipping_planes_fragment>\n\t#include <logdepthbuf_fragment>\n\t#include <normal_fragment_begin>\n\t#include <normal_fragment_maps>\n\tgl_FragColor = vec4( packNormalToRGB( normal ), opacity );\n\t#ifdef OPAQUE\n\t\tgl_FragColor.a = 1.0;\n\t#endif\n}`,ad=`#define PHONG\nvarying vec3 vViewPosition;\n#include <common>\n#include <batching_pars_vertex>\n#include <uv_pars_vertex>\n#include <displacementmap_pars_vertex>\n#include <envmap_pars_vertex>\n#include <color_pars_vertex>\n#include <fog_pars_vertex>\n#include <normal_pars_vertex>\n#include <morphtarget_pars_vertex>\n#include <skinning_pars_vertex>\n#include <shadowmap_pars_vertex>\n#include <logdepthbuf_pars_vertex>\n#include <clipping_planes_pars_vertex>\nvoid main() {\n\t#include <uv_vertex>\n\t#include <color_vertex>\n\t#include <morphcolor_vertex>\n\t#include <batching_vertex>\n\t#include <beginnormal_vertex>\n\t#include <morphnormal_vertex>\n\t#include <skinbase_vertex>\n\t#include <skinnormal_vertex>\n\t#include <defaultnormal_vertex>\n\t#include <normal_vertex>\n\t#include <begin_vertex>\n\t#include <morphtarget_vertex>\n\t#include <skinning_vertex>\n\t#include <displacementmap_vertex>\n\t#include <project_vertex>\n\t#include <logdepthbuf_vertex>\n\t#include <clipping_planes_vertex>\n\tvViewPosition = - mvPosition.xyz;\n\t#include <worldpos_vertex>\n\t#include <envmap_vertex>\n\t#include <shadowmap_vertex>\n\t#include <fog_vertex>\n}`,od=`#define PHONG\nuniform vec3 diffuse;\nuniform vec3 emissive;\nuniform vec3 specular;\nuniform float shininess;\nuniform float opacity;\n#include <common>\n#include <packing>\n#include <dithering_pars_fragment>\n#include <color_pars_fragment>\n#include <uv_pars_fragment>\n#include <map_pars_fragment>\n#include <alphamap_pars_fragment>\n#include <alphatest_pars_fragment>\n#include <alphahash_pars_fragment>\n#include <aomap_pars_fragment>\n#include <lightmap_pars_fragment>\n#include <emissivemap_pars_fragment>\n#include <envmap_common_pars_fragment>\n#include <envmap_pars_fragment>\n#include <fog_pars_fragment>\n#include <bsdfs>\n#include <lights_pars_begin>\n#include <normal_pars_fragment>\n#include <lights_phong_pars_fragment>\n#include <shadowmap_pars_fragment>\n#include <bumpmap_pars_fragment>\n#include <normalmap_pars_fragment>\n#include <specularmap_pars_fragment>\n#include <logdepthbuf_pars_fragment>\n#include <clipping_planes_pars_fragment>\nvoid main() {\n\t#include <clipping_planes_fragment>\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\n\tvec3 totalEmissiveRadiance = emissive;\n\t#include <logdepthbuf_fragment>\n\t#include <map_fragment>\n\t#include <color_fragment>\n\t#include <alphamap_fragment>\n\t#include <alphatest_fragment>\n\t#include <alphahash_fragment>\n\t#include <specularmap_fragment>\n\t#include <normal_fragment_begin>\n\t#include <normal_fragment_maps>\n\t#include <emissivemap_fragment>\n\t#include <lights_phong_fragment>\n\t#include <lights_fragment_begin>\n\t#include <lights_fragment_maps>\n\t#include <lights_fragment_end>\n\t#include <aomap_fragment>\n\tvec3 outgoingLight = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + reflectedLight.directSpecular + reflectedLight.indirectSpecular + totalEmissiveRadiance;\n\t#include <envmap_fragment>\n\t#include <opaque_fragment>\n\t#include <tonemapping_fragment>\n\t#include <colorspace_fragment>\n\t#include <fog_fragment>\n\t#include <premultiplied_alpha_fragment>\n\t#include <dithering_fragment>\n}`,ld=`#define STANDARD\nvarying vec3 vViewPosition;\n#ifdef USE_TRANSMISSION\n\tvarying vec3 vWorldPosition;\n#endif\n#include <common>\n#include <batching_pars_vertex>\n#include <uv_pars_vertex>\n#include <displacementmap_pars_vertex>\n#include <color_pars_vertex>\n#include <fog_pars_vertex>\n#include <normal_pars_vertex>\n#include <morphtarget_pars_vertex>\n#include <skinning_pars_vertex>\n#include <shadowmap_pars_vertex>\n#include <logdepthbuf_pars_vertex>\n#include <clipping_planes_pars_vertex>\nvoid main() {\n\t#include <uv_vertex>\n\t#include <color_vertex>\n\t#include <morphcolor_vertex>\n\t#include <batching_vertex>\n\t#include <beginnormal_vertex>\n\t#include <morphnormal_vertex>\n\t#include <skinbase_vertex>\n\t#include <skinnormal_vertex>\n\t#include <defaultnormal_vertex>\n\t#include <normal_vertex>\n\t#include <begin_vertex>\n\t#include <morphtarget_vertex>\n\t#include <skinning_vertex>\n\t#include <displacementmap_vertex>\n\t#include <project_vertex>\n\t#include <logdepthbuf_vertex>\n\t#include <clipping_planes_vertex>\n\tvViewPosition = - mvPosition.xyz;\n\t#include <worldpos_vertex>\n\t#include <shadowmap_vertex>\n\t#include <fog_vertex>\n#ifdef USE_TRANSMISSION\n\tvWorldPosition = worldPosition.xyz;\n#endif\n}`,cd=`#define STANDARD\n#ifdef PHYSICAL\n\t#define IOR\n\t#define USE_SPECULAR\n#endif\nuniform vec3 diffuse;\nuniform vec3 emissive;\nuniform float roughness;\nuniform float metalness;\nuniform float opacity;\n#ifdef IOR\n\tuniform float ior;\n#endif\n#ifdef USE_SPECULAR\n\tuniform float specularIntensity;\n\tuniform vec3 specularColor;\n\t#ifdef USE_SPECULAR_COLORMAP\n\t\tuniform sampler2D specularColorMap;\n\t#endif\n\t#ifdef USE_SPECULAR_INTENSITYMAP\n\t\tuniform sampler2D specularIntensityMap;\n\t#endif\n#endif\n#ifdef USE_CLEARCOAT\n\tuniform float clearcoat;\n\tuniform float clearcoatRoughness;\n#endif\n#ifdef USE_IRIDESCENCE\n\tuniform float iridescence;\n\tuniform float iridescenceIOR;\n\tuniform float iridescenceThicknessMinimum;\n\tuniform float iridescenceThicknessMaximum;\n#endif\n#ifdef USE_SHEEN\n\tuniform vec3 sheenColor;\n\tuniform float sheenRoughness;\n\t#ifdef USE_SHEEN_COLORMAP\n\t\tuniform sampler2D sheenColorMap;\n\t#endif\n\t#ifdef USE_SHEEN_ROUGHNESSMAP\n\t\tuniform sampler2D sheenRoughnessMap;\n\t#endif\n#endif\n#ifdef USE_ANISOTROPY\n\tuniform vec2 anisotropyVector;\n\t#ifdef USE_ANISOTROPYMAP\n\t\tuniform sampler2D anisotropyMap;\n\t#endif\n#endif\nvarying vec3 vViewPosition;\n#include <common>\n#include <packing>\n#include <dithering_pars_fragment>\n#include <color_pars_fragment>\n#include <uv_pars_fragment>\n#include <map_pars_fragment>\n#include <alphamap_pars_fragment>\n#include <alphatest_pars_fragment>\n#include <alphahash_pars_fragment>\n#include <aomap_pars_fragment>\n#include <lightmap_pars_fragment>\n#include <emissivemap_pars_fragment>\n#include <iridescence_fragment>\n#include <cube_uv_reflection_fragment>\n#include <envmap_common_pars_fragment>\n#include <envmap_physical_pars_fragment>\n#include <fog_pars_fragment>\n#include <lights_pars_begin>\n#include <normal_pars_fragment>\n#include <lights_physical_pars_fragment>\n#include <transmission_pars_fragment>\n#include <shadowmap_pars_fragment>\n#include <bumpmap_pars_fragment>\n#include <normalmap_pars_fragment>\n#include <clearcoat_pars_fragment>\n#include <iridescence_pars_fragment>\n#include <roughnessmap_pars_fragment>\n#include <metalnessmap_pars_fragment>\n#include <logdepthbuf_pars_fragment>\n#include <clipping_planes_pars_fragment>\nvoid main() {\n\t#include <clipping_planes_fragment>\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\n\tvec3 totalEmissiveRadiance = emissive;\n\t#include <logdepthbuf_fragment>\n\t#include <map_fragment>\n\t#include <color_fragment>\n\t#include <alphamap_fragment>\n\t#include <alphatest_fragment>\n\t#include <alphahash_fragment>\n\t#include <roughnessmap_fragment>\n\t#include <metalnessmap_fragment>\n\t#include <normal_fragment_begin>\n\t#include <normal_fragment_maps>\n\t#include <clearcoat_normal_fragment_begin>\n\t#include <clearcoat_normal_fragment_maps>\n\t#include <emissivemap_fragment>\n\t#include <lights_physical_fragment>\n\t#include <lights_fragment_begin>\n\t#include <lights_fragment_maps>\n\t#include <lights_fragment_end>\n\t#include <aomap_fragment>\n\tvec3 totalDiffuse = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse;\n\tvec3 totalSpecular = reflectedLight.directSpecular + reflectedLight.indirectSpecular;\n\t#include <transmission_fragment>\n\tvec3 outgoingLight = totalDiffuse + totalSpecular + totalEmissiveRadiance;\n\t#ifdef USE_SHEEN\n\t\tfloat sheenEnergyComp = 1.0 - 0.157 * max3( material.sheenColor );\n\t\toutgoingLight = outgoingLight * sheenEnergyComp + sheenSpecularDirect + sheenSpecularIndirect;\n\t#endif\n\t#ifdef USE_CLEARCOAT\n\t\tfloat dotNVcc = saturate( dot( geometryClearcoatNormal, geometryViewDir ) );\n\t\tvec3 Fcc = F_Schlick( material.clearcoatF0, material.clearcoatF90, dotNVcc );\n\t\toutgoingLight = outgoingLight * ( 1.0 - material.clearcoat * Fcc ) + ( clearcoatSpecularDirect + clearcoatSpecularIndirect ) * material.clearcoat;\n\t#endif\n\t#include <opaque_fragment>\n\t#include <tonemapping_fragment>\n\t#include <colorspace_fragment>\n\t#include <fog_fragment>\n\t#include <premultiplied_alpha_fragment>\n\t#include <dithering_fragment>\n}`,hd=`#define TOON\nvarying vec3 vViewPosition;\n#include <common>\n#include <batching_pars_vertex>\n#include <uv_pars_vertex>\n#include <displacementmap_pars_vertex>\n#include <color_pars_vertex>\n#include <fog_pars_vertex>\n#include <normal_pars_vertex>\n#include <morphtarget_pars_vertex>\n#include <skinning_pars_vertex>\n#include <shadowmap_pars_vertex>\n#include <logdepthbuf_pars_vertex>\n#include <clipping_planes_pars_vertex>\nvoid main() {\n\t#include <uv_vertex>\n\t#include <color_vertex>\n\t#include <morphcolor_vertex>\n\t#include <batching_vertex>\n\t#include <beginnormal_vertex>\n\t#include <morphnormal_vertex>\n\t#include <skinbase_vertex>\n\t#include <skinnormal_vertex>\n\t#include <defaultnormal_vertex>\n\t#include <normal_vertex>\n\t#include <begin_vertex>\n\t#include <morphtarget_vertex>\n\t#include <skinning_vertex>\n\t#include <displacementmap_vertex>\n\t#include <project_vertex>\n\t#include <logdepthbuf_vertex>\n\t#include <clipping_planes_vertex>\n\tvViewPosition = - mvPosition.xyz;\n\t#include <worldpos_vertex>\n\t#include <shadowmap_vertex>\n\t#include <fog_vertex>\n}`,ud=`#define TOON\nuniform vec3 diffuse;\nuniform vec3 emissive;\nuniform float opacity;\n#include <common>\n#include <packing>\n#include <dithering_pars_fragment>\n#include <color_pars_fragment>\n#include <uv_pars_fragment>\n#include <map_pars_fragment>\n#include <alphamap_pars_fragment>\n#include <alphatest_pars_fragment>\n#include <alphahash_pars_fragment>\n#include <aomap_pars_fragment>\n#include <lightmap_pars_fragment>\n#include <emissivemap_pars_fragment>\n#include <gradientmap_pars_fragment>\n#include <fog_pars_fragment>\n#include <bsdfs>\n#include <lights_pars_begin>\n#include <normal_pars_fragment>\n#include <lights_toon_pars_fragment>\n#include <shadowmap_pars_fragment>\n#include <bumpmap_pars_fragment>\n#include <normalmap_pars_fragment>\n#include <logdepthbuf_pars_fragment>\n#include <clipping_planes_pars_fragment>\nvoid main() {\n\t#include <clipping_planes_fragment>\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\n\tvec3 totalEmissiveRadiance = emissive;\n\t#include <logdepthbuf_fragment>\n\t#include <map_fragment>\n\t#include <color_fragment>\n\t#include <alphamap_fragment>\n\t#include <alphatest_fragment>\n\t#include <alphahash_fragment>\n\t#include <normal_fragment_begin>\n\t#include <normal_fragment_maps>\n\t#include <emissivemap_fragment>\n\t#include <lights_toon_fragment>\n\t#include <lights_fragment_begin>\n\t#include <lights_fragment_maps>\n\t#include <lights_fragment_end>\n\t#include <aomap_fragment>\n\tvec3 outgoingLight = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + totalEmissiveRadiance;\n\t#include <opaque_fragment>\n\t#include <tonemapping_fragment>\n\t#include <colorspace_fragment>\n\t#include <fog_fragment>\n\t#include <premultiplied_alpha_fragment>\n\t#include <dithering_fragment>\n}`,dd=`uniform float size;\nuniform float scale;\n#include <common>\n#include <color_pars_vertex>\n#include <fog_pars_vertex>\n#include <morphtarget_pars_vertex>\n#include <logdepthbuf_pars_vertex>\n#include <clipping_planes_pars_vertex>\n#ifdef USE_POINTS_UV\n\tvarying vec2 vUv;\n\tuniform mat3 uvTransform;\n#endif\nvoid main() {\n\t#ifdef USE_POINTS_UV\n\t\tvUv = ( uvTransform * vec3( uv, 1 ) ).xy;\n\t#endif\n\t#include <color_vertex>\n\t#include <morphcolor_vertex>\n\t#include <begin_vertex>\n\t#include <morphtarget_vertex>\n\t#include <project_vertex>\n\tgl_PointSize = size;\n\t#ifdef USE_SIZEATTENUATION\n\t\tbool isPerspective = isPerspectiveMatrix( projectionMatrix );\n\t\tif ( isPerspective ) gl_PointSize *= ( scale / - mvPosition.z );\n\t#endif\n\t#include <logdepthbuf_vertex>\n\t#include <clipping_planes_vertex>\n\t#include <worldpos_vertex>\n\t#include <fog_vertex>\n}`,fd=`uniform vec3 diffuse;\nuniform float opacity;\n#include <common>\n#include <color_pars_fragment>\n#include <map_particle_pars_fragment>\n#include <alphatest_pars_fragment>\n#include <alphahash_pars_fragment>\n#include <fog_pars_fragment>\n#include <logdepthbuf_pars_fragment>\n#include <clipping_planes_pars_fragment>\nvoid main() {\n\t#include <clipping_planes_fragment>\n\tvec3 outgoingLight = vec3( 0.0 );\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\t#include <logdepthbuf_fragment>\n\t#include <map_particle_fragment>\n\t#include <color_fragment>\n\t#include <alphatest_fragment>\n\t#include <alphahash_fragment>\n\toutgoingLight = diffuseColor.rgb;\n\t#include <opaque_fragment>\n\t#include <tonemapping_fragment>\n\t#include <colorspace_fragment>\n\t#include <fog_fragment>\n\t#include <premultiplied_alpha_fragment>\n}`,pd=`#include <common>\n#include <batching_pars_vertex>\n#include <fog_pars_vertex>\n#include <morphtarget_pars_vertex>\n#include <skinning_pars_vertex>\n#include <logdepthbuf_pars_vertex>\n#include <shadowmap_pars_vertex>\nvoid main() {\n\t#include <batching_vertex>\n\t#include <beginnormal_vertex>\n\t#include <morphnormal_vertex>\n\t#include <skinbase_vertex>\n\t#include <skinnormal_vertex>\n\t#include <defaultnormal_vertex>\n\t#include <begin_vertex>\n\t#include <morphtarget_vertex>\n\t#include <skinning_vertex>\n\t#include <project_vertex>\n\t#include <logdepthbuf_vertex>\n\t#include <worldpos_vertex>\n\t#include <shadowmap_vertex>\n\t#include <fog_vertex>\n}`,md=`uniform vec3 color;\nuniform float opacity;\n#include <common>\n#include <packing>\n#include <fog_pars_fragment>\n#include <bsdfs>\n#include <lights_pars_begin>\n#include <logdepthbuf_pars_fragment>\n#include <shadowmap_pars_fragment>\n#include <shadowmask_pars_fragment>\nvoid main() {\n\t#include <logdepthbuf_fragment>\n\tgl_FragColor = vec4( color, opacity * ( 1.0 - getShadowMask() ) );\n\t#include <tonemapping_fragment>\n\t#include <colorspace_fragment>\n\t#include <fog_fragment>\n}`,gd=`uniform float rotation;\nuniform vec2 center;\n#include <common>\n#include <uv_pars_vertex>\n#include <fog_pars_vertex>\n#include <logdepthbuf_pars_vertex>\n#include <clipping_planes_pars_vertex>\nvoid main() {\n\t#include <uv_vertex>\n\tvec4 mvPosition = modelViewMatrix * vec4( 0.0, 0.0, 0.0, 1.0 );\n\tvec2 scale;\n\tscale.x = length( vec3( modelMatrix[ 0 ].x, modelMatrix[ 0 ].y, modelMatrix[ 0 ].z ) );\n\tscale.y = length( vec3( modelMatrix[ 1 ].x, modelMatrix[ 1 ].y, modelMatrix[ 1 ].z ) );\n\t#ifndef USE_SIZEATTENUATION\n\t\tbool isPerspective = isPerspectiveMatrix( projectionMatrix );\n\t\tif ( isPerspective ) scale *= - mvPosition.z;\n\t#endif\n\tvec2 alignedPosition = ( position.xy - ( center - vec2( 0.5 ) ) ) * scale;\n\tvec2 rotatedPosition;\n\trotatedPosition.x = cos( rotation ) * alignedPosition.x - sin( rotation ) * alignedPosition.y;\n\trotatedPosition.y = sin( rotation ) * alignedPosition.x + cos( rotation ) * alignedPosition.y;\n\tmvPosition.xy += rotatedPosition;\n\tgl_Position = projectionMatrix * mvPosition;\n\t#include <logdepthbuf_vertex>\n\t#include <clipping_planes_vertex>\n\t#include <fog_vertex>\n}`,_d=`uniform vec3 diffuse;\nuniform float opacity;\n#include <common>\n#include <uv_pars_fragment>\n#include <map_pars_fragment>\n#include <alphamap_pars_fragment>\n#include <alphatest_pars_fragment>\n#include <alphahash_pars_fragment>\n#include <fog_pars_fragment>\n#include <logdepthbuf_pars_fragment>\n#include <clipping_planes_pars_fragment>\nvoid main() {\n\t#include <clipping_planes_fragment>\n\tvec3 outgoingLight = vec3( 0.0 );\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\t#include <logdepthbuf_fragment>\n\t#include <map_fragment>\n\t#include <alphamap_fragment>\n\t#include <alphatest_fragment>\n\t#include <alphahash_fragment>\n\toutgoingLight = diffuseColor.rgb;\n\t#include <opaque_fragment>\n\t#include <tonemapping_fragment>\n\t#include <colorspace_fragment>\n\t#include <fog_fragment>\n}`,Dt={alphahash_fragment:zc,alphahash_pars_fragment:Vc,alphamap_fragment:kc,alphamap_pars_fragment:Hc,alphatest_fragment:Gc,alphatest_pars_fragment:Wc,aomap_fragment:Xc,aomap_pars_fragment:qc,batching_pars_vertex:Yc,batching_vertex:Zc,begin_vertex:Jc,beginnormal_vertex:$c,bsdfs:Kc,iridescence_fragment:Qc,bumpmap_pars_fragment:jc,clipping_planes_fragment:th,clipping_planes_pars_fragment:eh,clipping_planes_pars_vertex:nh,clipping_planes_vertex:ih,color_fragment:sh,color_pars_fragment:rh,color_pars_vertex:ah,color_vertex:oh,common:lh,cube_uv_reflection_fragment:ch,defaultnormal_vertex:hh,displacementmap_pars_vertex:uh,displacementmap_vertex:dh,emissivemap_fragment:fh,emissivemap_pars_fragment:ph,colorspace_fragment:mh,colorspace_pars_fragment:gh,envmap_fragment:_h,envmap_common_pars_fragment:xh,envmap_pars_fragment:vh,envmap_pars_vertex:yh,envmap_physical_pars_fragment:Ih,envmap_vertex:Mh,fog_vertex:Sh,fog_pars_vertex:bh,fog_fragment:Eh,fog_pars_fragment:wh,gradientmap_pars_fragment:Th,lightmap_fragment:Ah,lightmap_pars_fragment:Ch,lights_lambert_fragment:Rh,lights_lambert_pars_fragment:Ph,lights_pars_begin:Lh,lights_toon_fragment:Uh,lights_toon_pars_fragment:Dh,lights_phong_fragment:Nh,lights_phong_pars_fragment:Fh,lights_physical_fragment:Oh,lights_physical_pars_fragment:Bh,lights_fragment_begin:zh,lights_fragment_maps:Vh,lights_fragment_end:kh,logdepthbuf_fragment:Hh,logdepthbuf_pars_fragment:Gh,logdepthbuf_pars_vertex:Wh,logdepthbuf_vertex:Xh,map_fragment:qh,map_pars_fragment:Yh,map_particle_fragment:Zh,map_particle_pars_fragment:Jh,metalnessmap_fragment:$h,metalnessmap_pars_fragment:Kh,morphcolor_vertex:Qh,morphnormal_vertex:jh,morphtarget_pars_vertex:tu,morphtarget_vertex:eu,normal_fragment_begin:nu,normal_fragment_maps:iu,normal_pars_fragment:su,normal_pars_vertex:ru,normal_vertex:au,normalmap_pars_fragment:ou,clearcoat_normal_fragment_begin:lu,clearcoat_normal_fragment_maps:cu,clearcoat_pars_fragment:hu,iridescence_pars_fragment:uu,opaque_fragment:du,packing:fu,premultiplied_alpha_fragment:pu,project_vertex:mu,dithering_fragment:gu,dithering_pars_fragment:_u,roughnessmap_fragment:xu,roughnessmap_pars_fragment:vu,shadowmap_pars_fragment:yu,shadowmap_pars_vertex:Mu,shadowmap_vertex:Su,shadowmask_pars_fragment:bu,skinbase_vertex:Eu,skinning_pars_vertex:wu,skinning_vertex:Tu,skinnormal_vertex:Au,specularmap_fragment:Cu,specularmap_pars_fragment:Ru,tonemapping_fragment:Pu,tonemapping_pars_fragment:Lu,transmission_fragment:Iu,transmission_pars_fragment:Uu,uv_pars_fragment:Du,uv_pars_vertex:Nu,uv_vertex:Fu,worldpos_vertex:Ou,background_vert:Bu,background_frag:zu,backgroundCube_vert:Vu,backgroundCube_frag:ku,cube_vert:Hu,cube_frag:Gu,depth_vert:Wu,depth_frag:Xu,distanceRGBA_vert:qu,distanceRGBA_frag:Yu,equirect_vert:Zu,equirect_frag:Ju,linedashed_vert:$u,linedashed_frag:Ku,meshbasic_vert:Qu,meshbasic_frag:ju,meshlambert_vert:td,meshlambert_frag:ed,meshmatcap_vert:nd,meshmatcap_frag:id,meshnormal_vert:sd,meshnormal_frag:rd,meshphong_vert:ad,meshphong_frag:od,meshphysical_vert:ld,meshphysical_frag:cd,meshtoon_vert:hd,meshtoon_frag:ud,points_vert:dd,points_frag:fd,shadow_vert:pd,shadow_frag:md,sprite_vert:gd,sprite_frag:_d},it={common:{diffuse:{value:new Pt(16777215)},opacity:{value:1},map:{value:null},mapTransform:{value:new zt},alphaMap:{value:null},alphaMapTransform:{value:new zt},alphaTest:{value:0}},specularmap:{specularMap:{value:null},specularMapTransform:{value:new zt}},envmap:{envMap:{value:null},flipEnvMap:{value:-1},reflectivity:{value:1},ior:{value:1.5},refractionRatio:{value:.98}},aomap:{aoMap:{value:null},aoMapIntensity:{value:1},aoMapTransform:{value:new zt}},lightmap:{lightMap:{value:null},lightMapIntensity:{value:1},lightMapTransform:{value:new zt}},bumpmap:{bumpMap:{value:null},bumpMapTransform:{value:new zt},bumpScale:{value:1}},normalmap:{normalMap:{value:null},normalMapTransform:{value:new zt},normalScale:{value:new Lt(1,1)}},displacementmap:{displacementMap:{value:null},displacementMapTransform:{value:new zt},displacementScale:{value:1},displacementBias:{value:0}},emissivemap:{emissiveMap:{value:null},emissiveMapTransform:{value:new zt}},metalnessmap:{metalnessMap:{value:null},metalnessMapTransform:{value:new zt}},roughnessmap:{roughnessMap:{value:null},roughnessMapTransform:{value:new zt}},gradientmap:{gradientMap:{value:null}},fog:{fogDensity:{value:25e-5},fogNear:{value:1},fogFar:{value:2e3},fogColor:{value:new Pt(16777215)}},lights:{ambientLightColor:{value:[]},lightProbe:{value:[]},directionalLights:{value:[],properties:{direction:{},color:{}}},directionalLightShadows:{value:[],properties:{shadowBias:{},shadowNormalBias:{},shadowRadius:{},shadowMapSize:{}}},directionalShadowMap:{value:[]},directionalShadowMatrix:{value:[]},spotLights:{value:[],properties:{color:{},position:{},direction:{},distance:{},coneCos:{},penumbraCos:{},decay:{}}},spotLightShadows:{value:[],properties:{shadowBias:{},shadowNormalBias:{},shadowRadius:{},shadowMapSize:{}}},spotLightMap:{value:[]},spotShadowMap:{value:[]},spotLightMatrix:{value:[]},pointLights:{value:[],properties:{color:{},position:{},decay:{},distance:{}}},pointLightShadows:{value:[],properties:{shadowBias:{},shadowNormalBias:{},shadowRadius:{},shadowMapSize:{},shadowCameraNear:{},shadowCameraFar:{}}},pointShadowMap:{value:[]},pointShadowMatrix:{value:[]},hemisphereLights:{value:[],properties:{direction:{},skyColor:{},groundColor:{}}},rectAreaLights:{value:[],properties:{color:{},position:{},width:{},height:{}}},ltc_1:{value:null},ltc_2:{value:null}},points:{diffuse:{value:new Pt(16777215)},opacity:{value:1},size:{value:1},scale:{value:1},map:{value:null},alphaMap:{value:null},alphaMapTransform:{value:new zt},alphaTest:{value:0},uvTransform:{value:new zt}},sprite:{diffuse:{value:new Pt(16777215)},opacity:{value:1},center:{value:new Lt(.5,.5)},rotation:{value:0},map:{value:null},mapTransform:{value:new zt},alphaMap:{value:null},alphaMapTransform:{value:new zt},alphaTest:{value:0}}},qe={basic:{uniforms:_e([it.common,it.specularmap,it.envmap,it.aomap,it.lightmap,it.fog]),vertexShader:Dt.meshbasic_vert,fragmentShader:Dt.meshbasic_frag},lambert:{uniforms:_e([it.common,it.specularmap,it.envmap,it.aomap,it.lightmap,it.emissivemap,it.bumpmap,it.normalmap,it.displacementmap,it.fog,it.lights,{emissive:{value:new Pt(0)}}]),vertexShader:Dt.meshlambert_vert,fragmentShader:Dt.meshlambert_frag},phong:{uniforms:_e([it.common,it.specularmap,it.envmap,it.aomap,it.lightmap,it.emissivemap,it.bumpmap,it.normalmap,it.displacementmap,it.fog,it.lights,{emissive:{value:new Pt(0)},specular:{value:new Pt(1118481)},shininess:{value:30}}]),vertexShader:Dt.meshphong_vert,fragmentShader:Dt.meshphong_frag},standard:{uniforms:_e([it.common,it.envmap,it.aomap,it.lightmap,it.emissivemap,it.bumpmap,it.normalmap,it.displacementmap,it.roughnessmap,it.metalnessmap,it.fog,it.lights,{emissive:{value:new Pt(0)},roughness:{value:1},metalness:{value:0},envMapIntensity:{value:1}}]),vertexShader:Dt.meshphysical_vert,fragmentShader:Dt.meshphysical_frag},toon:{uniforms:_e([it.common,it.aomap,it.lightmap,it.emissivemap,it.bumpmap,it.normalmap,it.displacementmap,it.gradientmap,it.fog,it.lights,{emissive:{value:new Pt(0)}}]),vertexShader:Dt.meshtoon_vert,fragmentShader:Dt.meshtoon_frag},matcap:{uniforms:_e([it.common,it.bumpmap,it.normalmap,it.displacementmap,it.fog,{matcap:{value:null}}]),vertexShader:Dt.meshmatcap_vert,fragmentShader:Dt.meshmatcap_frag},points:{uniforms:_e([it.points,it.fog]),vertexShader:Dt.points_vert,fragmentShader:Dt.points_frag},dashed:{uniforms:_e([it.common,it.fog,{scale:{value:1},dashSize:{value:1},totalSize:{value:2}}]),vertexShader:Dt.linedashed_vert,fragmentShader:Dt.linedashed_frag},depth:{uniforms:_e([it.common,it.displacementmap]),vertexShader:Dt.depth_vert,fragmentShader:Dt.depth_frag},normal:{uniforms:_e([it.common,it.bumpmap,it.normalmap,it.displacementmap,{opacity:{value:1}}]),vertexShader:Dt.meshnormal_vert,fragmentShader:Dt.meshnormal_frag},sprite:{uniforms:_e([it.sprite,it.fog]),vertexShader:Dt.sprite_vert,fragmentShader:Dt.sprite_frag},background:{uniforms:{uvTransform:{value:new zt},t2D:{value:null},backgroundIntensity:{value:1}},vertexShader:Dt.background_vert,fragmentShader:Dt.background_frag},backgroundCube:{uniforms:{envMap:{value:null},flipEnvMap:{value:-1},backgroundBlurriness:{value:0},backgroundIntensity:{value:1}},vertexShader:Dt.backgroundCube_vert,fragmentShader:Dt.backgroundCube_frag},cube:{uniforms:{tCube:{value:null},tFlip:{value:-1},opacity:{value:1}},vertexShader:Dt.cube_vert,fragmentShader:Dt.cube_frag},equirect:{uniforms:{tEquirect:{value:null}},vertexShader:Dt.equirect_vert,fragmentShader:Dt.equirect_frag},distanceRGBA:{uniforms:_e([it.common,it.displacementmap,{referencePosition:{value:new N},nearDistance:{value:1},farDistance:{value:1e3}}]),vertexShader:Dt.distanceRGBA_vert,fragmentShader:Dt.distanceRGBA_frag},shadow:{uniforms:_e([it.lights,it.fog,{color:{value:new Pt(0)},opacity:{value:1}}]),vertexShader:Dt.shadow_vert,fragmentShader:Dt.shadow_frag}};qe.physical={uniforms:_e([qe.standard.uniforms,{clearcoat:{value:0},clearcoatMap:{value:null},clearcoatMapTransform:{value:new zt},clearcoatNormalMap:{value:null},clearcoatNormalMapTransform:{value:new zt},clearcoatNormalScale:{value:new Lt(1,1)},clearcoatRoughness:{value:0},clearcoatRoughnessMap:{value:null},clearcoatRoughnessMapTransform:{value:new zt},iridescence:{value:0},iridescenceMap:{value:null},iridescenceMapTransform:{value:new zt},iridescenceIOR:{value:1.3},iridescenceThicknessMinimum:{value:100},iridescenceThicknessMaximum:{value:400},iridescenceThicknessMap:{value:null},iridescenceThicknessMapTransform:{value:new zt},sheen:{value:0},sheenColor:{value:new Pt(0)},sheenColorMap:{value:null},sheenColorMapTransform:{value:new zt},sheenRoughness:{value:1},sheenRoughnessMap:{value:null},sheenRoughnessMapTransform:{value:new zt},transmission:{value:0},transmissionMap:{value:null},transmissionMapTransform:{value:new zt},transmissionSamplerSize:{value:new Lt},transmissionSamplerMap:{value:null},thickness:{value:0},thicknessMap:{value:null},thicknessMapTransform:{value:new zt},attenuationDistance:{value:0},attenuationColor:{value:new Pt(0)},specularColor:{value:new Pt(1,1,1)},specularColorMap:{value:null},specularColorMapTransform:{value:new zt},specularIntensity:{value:1},specularIntensityMap:{value:null},specularIntensityMapTransform:{value:new zt},anisotropyVector:{value:new Lt},anisotropyMap:{value:null},anisotropyMapTransform:{value:new zt}}]),vertexShader:Dt.meshphysical_vert,fragmentShader:Dt.meshphysical_frag};var ns={r:0,b:0,g:0};function xd(i,t,e,n,s,r,o){let a=new Pt(0),l=r===!0?0:1,c,h,d=null,f=0,m=null;function g(p,u){let w=!1,v=u.isScene===!0?u.background:null;v&&v.isTexture&&(v=(u.backgroundBlurriness>0?e:t).get(v)),v===null?x(a,l):v&&v.isColor&&(x(v,1),w=!0);let P=i.xr.getEnvironmentBlendMode();P===\"additive\"?n.buffers.color.setClear(0,0,0,1,o):P===\"alpha-blend\"&&n.buffers.color.setClear(0,0,0,0,o),(i.autoClear||w)&&i.clear(i.autoClearColor,i.autoClearDepth,i.autoClearStencil),v&&(v.isCubeTexture||v.mapping===Is)?(h===void 0&&(h=new Ne(new Ti(1,1,1),new ue({name:\"BackgroundCubeMaterial\",uniforms:ci(qe.backgroundCube.uniforms),vertexShader:qe.backgroundCube.vertexShader,fragmentShader:qe.backgroundCube.fragmentShader,side:we,depthTest:!1,depthWrite:!1,fog:!1})),h.geometry.deleteAttribute(\"normal\"),h.geometry.deleteAttribute(\"uv\"),h.onBeforeRender=function(U,R,C){this.matrixWorld.copyPosition(C.matrixWorld)},Object.defineProperty(h.material,\"envMap\",{get:function(){return this.uniforms.envMap.value}}),s.update(h)),h.material.uniforms.envMap.value=v,h.material.uniforms.flipEnvMap.value=v.isCubeTexture&&v.isRenderTargetTexture===!1?-1:1,h.material.uniforms.backgroundBlurriness.value=u.backgroundBlurriness,h.material.uniforms.backgroundIntensity.value=u.backgroundIntensity,h.material.toneMapped=Wt.getTransfer(v.colorSpace)!==Jt,(d!==v||f!==v.version||m!==i.toneMapping)&&(h.material.needsUpdate=!0,d=v,f=v.version,m=i.toneMapping),h.layers.enableAll(),p.unshift(h,h.geometry,h.material,0,0,null)):v&&v.isTexture&&(c===void 0&&(c=new Ne(new Nr(2,2),new ue({name:\"BackgroundMaterial\",uniforms:ci(qe.background.uniforms),vertexShader:qe.background.vertexShader,fragmentShader:qe.background.fragmentShader,side:gn,depthTest:!1,depthWrite:!1,fog:!1})),c.geometry.deleteAttribute(\"normal\"),Object.defineProperty(c.material,\"map\",{get:function(){return this.uniforms.t2D.value}}),s.update(c)),c.material.uniforms.t2D.value=v,c.material.uniforms.backgroundIntensity.value=u.backgroundIntensity,c.material.toneMapped=Wt.getTransfer(v.colorSpace)!==Jt,v.matrixAutoUpdate===!0&&v.updateMatrix(),c.material.uniforms.uvTransform.value.copy(v.matrix),(d!==v||f!==v.version||m!==i.toneMapping)&&(c.material.needsUpdate=!0,d=v,f=v.version,m=i.toneMapping),c.layers.enableAll(),p.unshift(c,c.geometry,c.material,0,0,null))}function x(p,u){p.getRGB(ns,rl(i)),n.buffers.color.setClear(ns.r,ns.g,ns.b,u,o)}return{getClearColor:function(){return a},setClearColor:function(p,u=1){a.set(p),l=u,x(a,l)},getClearAlpha:function(){return l},setClearAlpha:function(p){l=p,x(a,l)},render:g}}function vd(i,t,e,n){let s=i.getParameter(i.MAX_VERTEX_ATTRIBS),r=n.isWebGL2?null:t.get(\"OES_vertex_array_object\"),o=n.isWebGL2||r!==null,a={},l=p(null),c=l,h=!1;function d(E,L,F,I,G){let X=!1;if(o){let Z=x(I,F,L);c!==Z&&(c=Z,m(c.object)),X=u(E,I,F,G),X&&w(E,I,F,G)}else{let Z=L.wireframe===!0;(c.geometry!==I.id||c.program!==F.id||c.wireframe!==Z)&&(c.geometry=I.id,c.program=F.id,c.wireframe=Z,X=!0)}G!==null&&e.update(G,i.ELEMENT_ARRAY_BUFFER),(X||h)&&(h=!1,Y(E,L,F,I),G!==null&&i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,e.get(G).buffer))}function f(){return n.isWebGL2?i.createVertexArray():r.createVertexArrayOES()}function m(E){return n.isWebGL2?i.bindVertexArray(E):r.bindVertexArrayOES(E)}function g(E){return n.isWebGL2?i.deleteVertexArray(E):r.deleteVertexArrayOES(E)}function x(E,L,F){let I=F.wireframe===!0,G=a[E.id];G===void 0&&(G={},a[E.id]=G);let X=G[L.id];X===void 0&&(X={},G[L.id]=X);let Z=X[I];return Z===void 0&&(Z=p(f()),X[I]=Z),Z}function p(E){let L=[],F=[],I=[];for(let G=0;G<s;G++)L[G]=0,F[G]=0,I[G]=0;return{geometry:null,program:null,wireframe:!1,newAttributes:L,enabledAttributes:F,attributeDivisors:I,object:E,attributes:{},index:null}}function u(E,L,F,I){let G=c.attributes,X=L.attributes,Z=0,$=F.getAttributes();for(let et in $)if($[et].location>=0){let q=G[et],st=X[et];if(st===void 0&&(et===\"instanceMatrix\"&&E.instanceMatrix&&(st=E.instanceMatrix),et===\"instanceColor\"&&E.instanceColor&&(st=E.instanceColor)),q===void 0||q.attribute!==st||st&&q.data!==st.data)return!0;Z++}return c.attributesNum!==Z||c.index!==I}function w(E,L,F,I){let G={},X=L.attributes,Z=0,$=F.getAttributes();for(let et in $)if($[et].location>=0){let q=X[et];q===void 0&&(et===\"instanceMatrix\"&&E.instanceMatrix&&(q=E.instanceMatrix),et===\"instanceColor\"&&E.instanceColor&&(q=E.instanceColor));let st={};st.attribute=q,q&&q.data&&(st.data=q.data),G[et]=st,Z++}c.attributes=G,c.attributesNum=Z,c.index=I}function v(){let E=c.newAttributes;for(let L=0,F=E.length;L<F;L++)E[L]=0}function P(E){U(E,0)}function U(E,L){let F=c.newAttributes,I=c.enabledAttributes,G=c.attributeDivisors;F[E]=1,I[E]===0&&(i.enableVertexAttribArray(E),I[E]=1),G[E]!==L&&((n.isWebGL2?i:t.get(\"ANGLE_instanced_arrays\"))[n.isWebGL2?\"vertexAttribDivisor\":\"vertexAttribDivisorANGLE\"](E,L),G[E]=L)}function R(){let E=c.newAttributes,L=c.enabledAttributes;for(let F=0,I=L.length;F<I;F++)L[F]!==E[F]&&(i.disableVertexAttribArray(F),L[F]=0)}function C(E,L,F,I,G,X,Z){Z===!0?i.vertexAttribIPointer(E,L,F,G,X):i.vertexAttribPointer(E,L,F,I,G,X)}function Y(E,L,F,I){if(n.isWebGL2===!1&&(E.isInstancedMesh||I.isInstancedBufferGeometry)&&t.get(\"ANGLE_instanced_arrays\")===null)return;v();let G=I.attributes,X=F.getAttributes(),Z=L.defaultAttributeValues;for(let $ in X){let et=X[$];if(et.location>=0){let W=G[$];if(W===void 0&&($===\"instanceMatrix\"&&E.instanceMatrix&&(W=E.instanceMatrix),$===\"instanceColor\"&&E.instanceColor&&(W=E.instanceColor)),W!==void 0){let q=W.normalized,st=W.itemSize,pt=e.get(W);if(pt===void 0)continue;let dt=pt.buffer,bt=pt.type,Et=pt.bytesPerElement,vt=n.isWebGL2===!0&&(bt===i.INT||bt===i.UNSIGNED_INT||W.gpuType===Zo);if(W.isInterleavedBufferAttribute){let kt=W.data,O=kt.stride,le=W.offset;if(kt.isInstancedInterleavedBuffer){for(let _t=0;_t<et.locationSize;_t++)U(et.location+_t,kt.meshPerAttribute);E.isInstancedMesh!==!0&&I._maxInstanceCount===void 0&&(I._maxInstanceCount=kt.meshPerAttribute*kt.count)}else for(let _t=0;_t<et.locationSize;_t++)P(et.location+_t);i.bindBuffer(i.ARRAY_BUFFER,dt);for(let _t=0;_t<et.locationSize;_t++)C(et.location+_t,st/et.locationSize,bt,q,O*Et,(le+st/et.locationSize*_t)*Et,vt)}else{if(W.isInstancedBufferAttribute){for(let kt=0;kt<et.locationSize;kt++)U(et.location+kt,W.meshPerAttribute);E.isInstancedMesh!==!0&&I._maxInstanceCount===void 0&&(I._maxInstanceCount=W.meshPerAttribute*W.count)}else for(let kt=0;kt<et.locationSize;kt++)P(et.location+kt);i.bindBuffer(i.ARRAY_BUFFER,dt);for(let kt=0;kt<et.locationSize;kt++)C(et.location+kt,st/et.locationSize,bt,q,st*Et,st/et.locationSize*kt*Et,vt)}}else if(Z!==void 0){let q=Z[$];if(q!==void 0)switch(q.length){case 2:i.vertexAttrib2fv(et.location,q);break;case 3:i.vertexAttrib3fv(et.location,q);break;case 4:i.vertexAttrib4fv(et.location,q);break;default:i.vertexAttrib1fv(et.location,q)}}}}R()}function S(){K();for(let E in a){let L=a[E];for(let F in L){let I=L[F];for(let G in I)g(I[G].object),delete I[G];delete L[F]}delete a[E]}}function b(E){if(a[E.id]===void 0)return;let L=a[E.id];for(let F in L){let I=L[F];for(let G in I)g(I[G].object),delete I[G];delete L[F]}delete a[E.id]}function H(E){for(let L in a){let F=a[L];if(F[E.id]===void 0)continue;let I=F[E.id];for(let G in I)g(I[G].object),delete I[G];delete F[E.id]}}function K(){T(),h=!0,c!==l&&(c=l,m(c.object))}function T(){l.geometry=null,l.program=null,l.wireframe=!1}return{setup:d,reset:K,resetDefaultState:T,dispose:S,releaseStatesOfGeometry:b,releaseStatesOfProgram:H,initAttributes:v,enableAttribute:P,disableUnusedAttributes:R}}function yd(i,t,e,n){let s=n.isWebGL2,r;function o(h){r=h}function a(h,d){i.drawArrays(r,h,d),e.update(d,r,1)}function l(h,d,f){if(f===0)return;let m,g;if(s)m=i,g=\"drawArraysInstanced\";else if(m=t.get(\"ANGLE_instanced_arrays\"),g=\"drawArraysInstancedANGLE\",m===null){console.error(\"THREE.WebGLBufferRenderer: using THREE.InstancedBufferGeometry but hardware does not support extension ANGLE_instanced_arrays.\");return}m[g](r,h,d,f),e.update(d,r,f)}function c(h,d,f){if(f===0)return;let m=t.get(\"WEBGL_multi_draw\");if(m===null)for(let g=0;g<f;g++)this.render(h[g],d[g]);else{m.multiDrawArraysWEBGL(r,h,0,d,0,f);let g=0;for(let x=0;x<f;x++)g+=d[x];e.update(g,r,1)}}this.setMode=o,this.render=a,this.renderInstances=l,this.renderMultiDraw=c}function Md(i,t,e){let n;function s(){if(n!==void 0)return n;if(t.has(\"EXT_texture_filter_anisotropic\")===!0){let C=t.get(\"EXT_texture_filter_anisotropic\");n=i.getParameter(C.MAX_TEXTURE_MAX_ANISOTROPY_EXT)}else n=0;return n}function r(C){if(C===\"highp\"){if(i.getShaderPrecisionFormat(i.VERTEX_SHADER,i.HIGH_FLOAT).precision>0&&i.getShaderPrecisionFormat(i.FRAGMENT_SHADER,i.HIGH_FLOAT).precision>0)return\"highp\";C=\"mediump\"}return C===\"mediump\"&&i.getShaderPrecisionFormat(i.VERTEX_SHADER,i.MEDIUM_FLOAT).precision>0&&i.getShaderPrecisionFormat(i.FRAGMENT_SHADER,i.MEDIUM_FLOAT).precision>0?\"mediump\":\"lowp\"}let o=typeof WebGL2RenderingContext<\"u\"&&i.constructor.name===\"WebGL2RenderingContext\",a=e.precision!==void 0?e.precision:\"highp\",l=r(a);l!==a&&(console.warn(\"THREE.WebGLRenderer:\",a,\"not supported, using\",l,\"instead.\"),a=l);let c=o||t.has(\"WEBGL_draw_buffers\"),h=e.logarithmicDepthBuffer===!0,d=i.getParameter(i.MAX_TEXTURE_IMAGE_UNITS),f=i.getParameter(i.MAX_VERTEX_TEXTURE_IMAGE_UNITS),m=i.getParameter(i.MAX_TEXTURE_SIZE),g=i.getParameter(i.MAX_CUBE_MAP_TEXTURE_SIZE),x=i.getParameter(i.MAX_VERTEX_ATTRIBS),p=i.getParameter(i.MAX_VERTEX_UNIFORM_VECTORS),u=i.getParameter(i.MAX_VARYING_VECTORS),w=i.getParameter(i.MAX_FRAGMENT_UNIFORM_VECTORS),v=f>0,P=o||t.has(\"OES_texture_float\"),U=v&&P,R=o?i.getParameter(i.MAX_SAMPLES):0;return{isWebGL2:o,drawBuffers:c,getMaxAnisotropy:s,getMaxPrecision:r,precision:a,logarithmicDepthBuffer:h,maxTextures:d,maxVertexTextures:f,maxTextureSize:m,maxCubemapSize:g,maxAttributes:x,maxVertexUniforms:p,maxVaryings:u,maxFragmentUniforms:w,vertexTextures:v,floatFragmentTextures:P,floatVertexTextures:U,maxSamples:R}}function Sd(i){let t=this,e=null,n=0,s=!1,r=!1,o=new en,a=new zt,l={value:null,needsUpdate:!1};this.uniform=l,this.numPlanes=0,this.numIntersection=0,this.init=function(d,f){let m=d.length!==0||f||n!==0||s;return s=f,n=d.length,m},this.beginShadows=function(){r=!0,h(null)},this.endShadows=function(){r=!1},this.setGlobalState=function(d,f){e=h(d,f,0)},this.setState=function(d,f,m){let g=d.clippingPlanes,x=d.clipIntersection,p=d.clipShadows,u=i.get(d);if(!s||g===null||g.length===0||r&&!p)r?h(null):c();else{let w=r?0:n,v=w*4,P=u.clippingState||null;l.value=P,P=h(g,f,v,m);for(let U=0;U!==v;++U)P[U]=e[U];u.clippingState=P,this.numIntersection=x?this.numPlanes:0,this.numPlanes+=w}};function c(){l.value!==e&&(l.value=e,l.needsUpdate=n>0),t.numPlanes=n,t.numIntersection=0}function h(d,f,m,g){let x=d!==null?d.length:0,p=null;if(x!==0){if(p=l.value,g!==!0||p===null){let u=m+x*4,w=f.matrixWorldInverse;a.getNormalMatrix(w),(p===null||p.length<u)&&(p=new Float32Array(u));for(let v=0,P=m;v!==x;++v,P+=4)o.copy(d[v]).applyMatrix4(w,a),o.normal.toArray(p,P),p[P+3]=o.constant}l.value=p,l.needsUpdate=!0}return t.numPlanes=x,t.numIntersection=0,p}}function bd(i){let t=new WeakMap;function e(o,a){return a===Er?o.mapping=ri:a===wr&&(o.mapping=ai),o}function n(o){if(o&&o.isTexture){let a=o.mapping;if(a===Er||a===wr)if(t.has(o)){let l=t.get(o).texture;return e(l,o.mapping)}else{let l=o.image;if(l&&l.height>0){let c=new Dr(l.height/2);return c.fromEquirectangularTexture(i,o),t.set(o,c),o.addEventListener(\"dispose\",s),e(c.texture,o.mapping)}else return null}}return o}function s(o){let a=o.target;a.removeEventListener(\"dispose\",s);let l=t.get(a);l!==void 0&&(t.delete(a),l.dispose())}function r(){t=new WeakMap}return{get:n,dispose:r}}var Ai=class extends bs{constructor(t=-1,e=1,n=1,s=-1,r=.1,o=2e3){super(),this.isOrthographicCamera=!0,this.type=\"OrthographicCamera\",this.zoom=1,this.view=null,this.left=t,this.right=e,this.top=n,this.bottom=s,this.near=r,this.far=o,this.updateProjectionMatrix()}copy(t,e){return super.copy(t,e),this.left=t.left,this.right=t.right,this.top=t.top,this.bottom=t.bottom,this.near=t.near,this.far=t.far,this.zoom=t.zoom,this.view=t.view===null?null:Object.assign({},t.view),this}setViewOffset(t,e,n,s,r,o){this.view===null&&(this.view={enabled:!0,fullWidth:1,fullHeight:1,offsetX:0,offsetY:0,width:1,height:1}),this.view.enabled=!0,this.view.fullWidth=t,this.view.fullHeight=e,this.view.offsetX=n,this.view.offsetY=s,this.view.width=r,this.view.height=o,this.updateProjectionMatrix()}clearViewOffset(){this.view!==null&&(this.view.enabled=!1),this.updateProjectionMatrix()}updateProjectionMatrix(){let t=(this.right-this.left)/(2*this.zoom),e=(this.top-this.bottom)/(2*this.zoom),n=(this.right+this.left)/2,s=(this.top+this.bottom)/2,r=n-t,o=n+t,a=s+e,l=s-e;if(this.view!==null&&this.view.enabled){let c=(this.right-this.left)/this.view.fullWidth/this.zoom,h=(this.top-this.bottom)/this.view.fullHeight/this.zoom;r+=c*this.view.offsetX,o=r+c*this.view.width,a-=h*this.view.offsetY,l=a-h*this.view.height}this.projectionMatrix.makeOrthographic(r,o,a,l,this.near,this.far,this.coordinateSystem),this.projectionMatrixInverse.copy(this.projectionMatrix).invert()}toJSON(t){let e=super.toJSON(t);return e.object.zoom=this.zoom,e.object.left=this.left,e.object.right=this.right,e.object.top=this.top,e.object.bottom=this.bottom,e.object.near=this.near,e.object.far=this.far,this.view!==null&&(e.object.view=Object.assign({},this.view)),e}},ti=4,xo=[.125,.215,.35,.446,.526,.582],Rn=20,gr=new Ai,vo=new Pt,_r=null,xr=0,vr=0,An=(1+Math.sqrt(5))/2,Qn=1/An,yo=[new N(1,1,1),new N(-1,1,1),new N(1,1,-1),new N(-1,1,-1),new N(0,An,Qn),new N(0,An,-Qn),new N(Qn,0,An),new N(-Qn,0,An),new N(An,Qn,0),new N(-An,Qn,0)],Ts=class{constructor(t){this._renderer=t,this._pingPongRenderTarget=null,this._lodMax=0,this._cubeSize=0,this._lodPlanes=[],this._sizeLods=[],this._sigmas=[],this._blurMaterial=null,this._cubemapMaterial=null,this._equirectMaterial=null,this._compileMaterial(this._blurMaterial)}fromScene(t,e=0,n=.1,s=100){_r=this._renderer.getRenderTarget(),xr=this._renderer.getActiveCubeFace(),vr=this._renderer.getActiveMipmapLevel(),this._setSize(256);let r=this._allocateTargets();return r.depthBuffer=!0,this._sceneToCubeUV(t,n,s,r),e>0&&this._blur(r,0,0,e),this._applyPMREM(r),this._cleanup(r),r}fromEquirectangular(t,e=null){return this._fromTexture(t,e)}fromCubemap(t,e=null){return this._fromTexture(t,e)}compileCubemapShader(){this._cubemapMaterial===null&&(this._cubemapMaterial=bo(),this._compileMaterial(this._cubemapMaterial))}compileEquirectangularShader(){this._equirectMaterial===null&&(this._equirectMaterial=So(),this._compileMaterial(this._equirectMaterial))}dispose(){this._dispose(),this._cubemapMaterial!==null&&this._cubemapMaterial.dispose(),this._equirectMaterial!==null&&this._equirectMaterial.dispose()}_setSize(t){this._lodMax=Math.floor(Math.log2(t)),this._cubeSize=Math.pow(2,this._lodMax)}_dispose(){this._blurMaterial!==null&&this._blurMaterial.dispose(),this._pingPongRenderTarget!==null&&this._pingPongRenderTarget.dispose();for(let t=0;t<this._lodPlanes.length;t++)this._lodPlanes[t].dispose()}_cleanup(t){this._renderer.setRenderTarget(_r,xr,vr),t.scissorTest=!1,is(t,0,0,t.width,t.height)}_fromTexture(t,e){t.mapping===ri||t.mapping===ai?this._setSize(t.image.length===0?16:t.image[0].width||t.image[0].image.width):this._setSize(t.image.width/4),_r=this._renderer.getRenderTarget(),xr=this._renderer.getActiveCubeFace(),vr=this._renderer.getActiveMipmapLevel();let n=e||this._allocateTargets();return this._textureToCubeUV(t,n),this._applyPMREM(n),this._cleanup(n),n}_allocateTargets(){let t=3*Math.max(this._cubeSize,112),e=4*this._cubeSize,n={magFilter:Ue,minFilter:Ue,generateMipmaps:!1,type:ke,format:Ve,colorSpace:rn,depthBuffer:!1},s=Mo(t,e,n);if(this._pingPongRenderTarget===null||this._pingPongRenderTarget.width!==t||this._pingPongRenderTarget.height!==e){this._pingPongRenderTarget!==null&&this._dispose(),this._pingPongRenderTarget=Mo(t,e,n);let{_lodMax:r}=this;({sizeLods:this._sizeLods,lodPlanes:this._lodPlanes,sigmas:this._sigmas}=Ed(r)),this._blurMaterial=wd(r,t,e)}return s}_compileMaterial(t){let e=new Ne(this._lodPlanes[0],t);this._renderer.compile(e,gr)}_sceneToCubeUV(t,e,n,s){let a=new ve(90,1,e,n),l=[1,-1,1,1,1,1],c=[1,1,1,-1,-1,-1],h=this._renderer,d=h.autoClear,f=h.toneMapping;h.getClearColor(vo),h.toneMapping=pn,h.autoClear=!1;let m=new li({name:\"PMREM.Background\",side:we,depthWrite:!1,depthTest:!1}),g=new Ne(new Ti,m),x=!1,p=t.background;p?p.isColor&&(m.color.copy(p),t.background=null,x=!0):(m.color.copy(vo),x=!0);for(let u=0;u<6;u++){let w=u%3;w===0?(a.up.set(0,l[u],0),a.lookAt(c[u],0,0)):w===1?(a.up.set(0,0,l[u]),a.lookAt(0,c[u],0)):(a.up.set(0,l[u],0),a.lookAt(0,0,c[u]));let v=this._cubeSize;is(s,w*v,u>2?v:0,v,v),h.setRenderTarget(s),x&&h.render(g,a),h.render(t,a)}g.geometry.dispose(),g.material.dispose(),h.toneMapping=f,h.autoClear=d,t.background=p}_textureToCubeUV(t,e){let n=this._renderer,s=t.mapping===ri||t.mapping===ai;s?(this._cubemapMaterial===null&&(this._cubemapMaterial=bo()),this._cubemapMaterial.uniforms.flipEnvMap.value=t.isRenderTargetTexture===!1?-1:1):this._equirectMaterial===null&&(this._equirectMaterial=So());let r=s?this._cubemapMaterial:this._equirectMaterial,o=new Ne(this._lodPlanes[0],r),a=r.uniforms;a.envMap.value=t;let l=this._cubeSize;is(e,0,0,3*l,2*l),n.setRenderTarget(e),n.render(o,gr)}_applyPMREM(t){let e=this._renderer,n=e.autoClear;e.autoClear=!1;for(let s=1;s<this._lodPlanes.length;s++){let r=Math.sqrt(this._sigmas[s]*this._sigmas[s]-this._sigmas[s-1]*this._sigmas[s-1]),o=yo[(s-1)%yo.length];this._blur(t,s-1,s,r,o)}e.autoClear=n}_blur(t,e,n,s,r){let o=this._pingPongRenderTarget;this._halfBlur(t,o,e,n,s,\"latitudinal\",r),this._halfBlur(o,t,n,n,s,\"longitudinal\",r)}_halfBlur(t,e,n,s,r,o,a){let l=this._renderer,c=this._blurMaterial;o!==\"latitudinal\"&&o!==\"longitudinal\"&&console.error(\"blur direction must be either latitudinal or longitudinal!\");let h=3,d=new Ne(this._lodPlanes[s],c),f=c.uniforms,m=this._sizeLods[n]-1,g=isFinite(r)?Math.PI/(2*m):2*Math.PI/(2*Rn-1),x=r/g,p=isFinite(r)?1+Math.floor(h*x):Rn;p>Rn&&console.warn(`sigmaRadians, ${r}, is too large and will clip, as it requested ${p} samples when the maximum is set to ${Rn}`);let u=[],w=0;for(let C=0;C<Rn;++C){let Y=C/x,S=Math.exp(-Y*Y/2);u.push(S),C===0?w+=S:C<p&&(w+=2*S)}for(let C=0;C<u.length;C++)u[C]=u[C]/w;f.envMap.value=t.texture,f.samples.value=p,f.weights.value=u,f.latitudinal.value=o===\"latitudinal\",a&&(f.poleAxis.value=a);let{_lodMax:v}=this;f.dTheta.value=g,f.mipInt.value=v-n;let P=this._sizeLods[s],U=3*P*(s>v-ti?s-v+ti:0),R=4*(this._cubeSize-P);is(e,U,R,3*P,2*P),l.setRenderTarget(e),l.render(d,gr)}};function Ed(i){let t=[],e=[],n=[],s=i,r=i-ti+1+xo.length;for(let o=0;o<r;o++){let a=Math.pow(2,s);e.push(a);let l=1/a;o>i-ti?l=xo[o-i+ti-1]:o===0&&(l=0),n.push(l);let c=1/(a-2),h=-c,d=1+c,f=[h,h,d,h,d,d,h,h,d,d,h,d],m=6,g=6,x=3,p=2,u=1,w=new Float32Array(x*g*m),v=new Float32Array(p*g*m),P=new Float32Array(u*g*m);for(let R=0;R<m;R++){let C=R%3*2/3-1,Y=R>2?0:-1,S=[C,Y,0,C+2/3,Y,0,C+2/3,Y+1,0,C,Y,0,C+2/3,Y+1,0,C,Y+1,0];w.set(S,x*g*R),v.set(f,p*g*R);let b=[R,R,R,R,R,R];P.set(b,u*g*R)}let U=new Se;U.setAttribute(\"position\",new ye(w,x)),U.setAttribute(\"uv\",new ye(v,p)),U.setAttribute(\"faceIndex\",new ye(P,u)),t.push(U),s>ti&&s--}return{lodPlanes:t,sizeLods:e,sigmas:n}}function Mo(i,t,e){let n=new Me(i,t,e);return n.texture.mapping=Is,n.texture.name=\"PMREM.cubeUv\",n.scissorTest=!0,n}function is(i,t,e,n,s){i.viewport.set(t,e,n,s),i.scissor.set(t,e,n,s)}function wd(i,t,e){let n=new Float32Array(Rn),s=new N(0,1,0);return new ue({name:\"SphericalGaussianBlur\",defines:{n:Rn,CUBEUV_TEXEL_WIDTH:1/t,CUBEUV_TEXEL_HEIGHT:1/e,CUBEUV_MAX_MIP:`${i}.0`},uniforms:{envMap:{value:null},samples:{value:1},weights:{value:n},latitudinal:{value:!1},dTheta:{value:0},mipInt:{value:0},poleAxis:{value:s}},vertexShader:oa(),fragmentShader:`\n\n\t\t\tprecision mediump float;\n\t\t\tprecision mediump int;\n\n\t\t\tvarying vec3 vOutputDirection;\n\n\t\t\tuniform sampler2D envMap;\n\t\t\tuniform int samples;\n\t\t\tuniform float weights[ n ];\n\t\t\tuniform bool latitudinal;\n\t\t\tuniform float dTheta;\n\t\t\tuniform float mipInt;\n\t\t\tuniform vec3 poleAxis;\n\n\t\t\t#define ENVMAP_TYPE_CUBE_UV\n\t\t\t#include <cube_uv_reflection_fragment>\n\n\t\t\tvec3 getSample( float theta, vec3 axis ) {\n\n\t\t\t\tfloat cosTheta = cos( theta );\n\t\t\t\t// Rodrigues' axis-angle rotation\n\t\t\t\tvec3 sampleDirection = vOutputDirection * cosTheta\n\t\t\t\t\t+ cross( axis, vOutputDirection ) * sin( theta )\n\t\t\t\t\t+ axis * dot( axis, vOutputDirection ) * ( 1.0 - cosTheta );\n\n\t\t\t\treturn bilinearCubeUV( envMap, sampleDirection, mipInt );\n\n\t\t\t}\n\n\t\t\tvoid main() {\n\n\t\t\t\tvec3 axis = latitudinal ? poleAxis : cross( poleAxis, vOutputDirection );\n\n\t\t\t\tif ( all( equal( axis, vec3( 0.0 ) ) ) ) {\n\n\t\t\t\t\taxis = vec3( vOutputDirection.z, 0.0, - vOutputDirection.x );\n\n\t\t\t\t}\n\n\t\t\t\taxis = normalize( axis );\n\n\t\t\t\tgl_FragColor = vec4( 0.0, 0.0, 0.0, 1.0 );\n\t\t\t\tgl_FragColor.rgb += weights[ 0 ] * getSample( 0.0, axis );\n\n\t\t\t\tfor ( int i = 1; i < n; i++ ) {\n\n\t\t\t\t\tif ( i >= samples ) {\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tfloat theta = dTheta * float( i );\n\t\t\t\t\tgl_FragColor.rgb += weights[ i ] * getSample( -1.0 * theta, axis );\n\t\t\t\t\tgl_FragColor.rgb += weights[ i ] * getSample( theta, axis );\n\n\t\t\t\t}\n\n\t\t\t}\n\t\t`,blending:Ye,depthTest:!1,depthWrite:!1})}function So(){return new ue({name:\"EquirectangularToCubeUV\",uniforms:{envMap:{value:null}},vertexShader:oa(),fragmentShader:`\n\n\t\t\tprecision mediump float;\n\t\t\tprecision mediump int;\n\n\t\t\tvarying vec3 vOutputDirection;\n\n\t\t\tuniform sampler2D envMap;\n\n\t\t\t#include <common>\n\n\t\t\tvoid main() {\n\n\t\t\t\tvec3 outputDirection = normalize( vOutputDirection );\n\t\t\t\tvec2 uv = equirectUv( outputDirection );\n\n\t\t\t\tgl_FragColor = vec4( texture2D ( envMap, uv ).rgb, 1.0 );\n\n\t\t\t}\n\t\t`,blending:Ye,depthTest:!1,depthWrite:!1})}function bo(){return new ue({name:\"CubemapToCubeUV\",uniforms:{envMap:{value:null},flipEnvMap:{value:-1}},vertexShader:oa(),fragmentShader:`\n\n\t\t\tprecision mediump float;\n\t\t\tprecision mediump int;\n\n\t\t\tuniform float flipEnvMap;\n\n\t\t\tvarying vec3 vOutputDirection;\n\n\t\t\tuniform samplerCube envMap;\n\n\t\t\tvoid main() {\n\n\t\t\t\tgl_FragColor = textureCube( envMap, vec3( flipEnvMap * vOutputDirection.x, vOutputDirection.yz ) );\n\n\t\t\t}\n\t\t`,blending:Ye,depthTest:!1,depthWrite:!1})}function oa(){return`\n\n\t\tprecision mediump float;\n\t\tprecision mediump int;\n\n\t\tattribute float faceIndex;\n\n\t\tvarying vec3 vOutputDirection;\n\n\t\t// RH coordinate system; PMREM face-indexing convention\n\t\tvec3 getDirection( vec2 uv, float face ) {\n\n\t\t\tuv = 2.0 * uv - 1.0;\n\n\t\t\tvec3 direction = vec3( uv, 1.0 );\n\n\t\t\tif ( face == 0.0 ) {\n\n\t\t\t\tdirection = direction.zyx; // ( 1, v, u ) pos x\n\n\t\t\t} else if ( face == 1.0 ) {\n\n\t\t\t\tdirection = direction.xzy;\n\t\t\t\tdirection.xz *= -1.0; // ( -u, 1, -v ) pos y\n\n\t\t\t} else if ( face == 2.0 ) {\n\n\t\t\t\tdirection.x *= -1.0; // ( -u, v, 1 ) pos z\n\n\t\t\t} else if ( face == 3.0 ) {\n\n\t\t\t\tdirection = direction.zyx;\n\t\t\t\tdirection.xz *= -1.0; // ( -1, v, -u ) neg x\n\n\t\t\t} else if ( face == 4.0 ) {\n\n\t\t\t\tdirection = direction.xzy;\n\t\t\t\tdirection.xy *= -1.0; // ( -u, -1, v ) neg y\n\n\t\t\t} else if ( face == 5.0 ) {\n\n\t\t\t\tdirection.z *= -1.0; // ( u, v, -1 ) neg z\n\n\t\t\t}\n\n\t\t\treturn direction;\n\n\t\t}\n\n\t\tvoid main() {\n\n\t\t\tvOutputDirection = getDirection( uv, faceIndex );\n\t\t\tgl_Position = vec4( position, 1.0 );\n\n\t\t}\n\t`}function Td(i){let t=new WeakMap,e=null;function n(a){if(a&&a.isTexture){let l=a.mapping,c=l===Er||l===wr,h=l===ri||l===ai;if(c||h)if(a.isRenderTargetTexture&&a.needsPMREMUpdate===!0){a.needsPMREMUpdate=!1;let d=t.get(a);return e===null&&(e=new Ts(i)),d=c?e.fromEquirectangular(a,d):e.fromCubemap(a,d),t.set(a,d),d.texture}else{if(t.has(a))return t.get(a).texture;{let d=a.image;if(c&&d&&d.height>0||h&&d&&s(d)){e===null&&(e=new Ts(i));let f=c?e.fromEquirectangular(a):e.fromCubemap(a);return t.set(a,f),a.addEventListener(\"dispose\",r),f.texture}else return null}}}return a}function s(a){let l=0,c=6;for(let h=0;h<c;h++)a[h]!==void 0&&l++;return l===c}function r(a){let l=a.target;l.removeEventListener(\"dispose\",r);let c=t.get(l);c!==void 0&&(t.delete(l),c.dispose())}function o(){t=new WeakMap,e!==null&&(e.dispose(),e=null)}return{get:n,dispose:o}}function Ad(i){let t={};function e(n){if(t[n]!==void 0)return t[n];let s;switch(n){case\"WEBGL_depth_texture\":s=i.getExtension(\"WEBGL_depth_texture\")||i.getExtension(\"MOZ_WEBGL_depth_texture\")||i.getExtension(\"WEBKIT_WEBGL_depth_texture\");break;case\"EXT_texture_filter_anisotropic\":s=i.getExtension(\"EXT_texture_filter_anisotropic\")||i.getExtension(\"MOZ_EXT_texture_filter_anisotropic\")||i.getExtension(\"WEBKIT_EXT_texture_filter_anisotropic\");break;case\"WEBGL_compressed_texture_s3tc\":s=i.getExtension(\"WEBGL_compressed_texture_s3tc\")||i.getExtension(\"MOZ_WEBGL_compressed_texture_s3tc\")||i.getExtension(\"WEBKIT_WEBGL_compressed_texture_s3tc\");break;case\"WEBGL_compressed_texture_pvrtc\":s=i.getExtension(\"WEBGL_compressed_texture_pvrtc\")||i.getExtension(\"WEBKIT_WEBGL_compressed_texture_pvrtc\");break;default:s=i.getExtension(n)}return t[n]=s,s}return{has:function(n){return e(n)!==null},init:function(n){n.isWebGL2?(e(\"EXT_color_buffer_float\"),e(\"WEBGL_clip_cull_distance\")):(e(\"WEBGL_depth_texture\"),e(\"OES_texture_float\"),e(\"OES_texture_half_float\"),e(\"OES_texture_half_float_linear\"),e(\"OES_standard_derivatives\"),e(\"OES_element_index_uint\"),e(\"OES_vertex_array_object\"),e(\"ANGLE_instanced_arrays\")),e(\"OES_texture_float_linear\"),e(\"EXT_color_buffer_half_float\"),e(\"WEBGL_multisampled_render_to_texture\")},get:function(n){let s=e(n);return s===null&&console.warn(\"THREE.WebGLRenderer: \"+n+\" extension not supported.\"),s}}}function Cd(i,t,e,n){let s={},r=new WeakMap;function o(d){let f=d.target;f.index!==null&&t.remove(f.index);for(let g in f.attributes)t.remove(f.attributes[g]);for(let g in f.morphAttributes){let x=f.morphAttributes[g];for(let p=0,u=x.length;p<u;p++)t.remove(x[p])}f.removeEventListener(\"dispose\",o),delete s[f.id];let m=r.get(f);m&&(t.remove(m),r.delete(f)),n.releaseStatesOfGeometry(f),f.isInstancedBufferGeometry===!0&&delete f._maxInstanceCount,e.memory.geometries--}function a(d,f){return s[f.id]===!0||(f.addEventListener(\"dispose\",o),s[f.id]=!0,e.memory.geometries++),f}function l(d){let f=d.attributes;for(let g in f)t.update(f[g],i.ARRAY_BUFFER);let m=d.morphAttributes;for(let g in m){let x=m[g];for(let p=0,u=x.length;p<u;p++)t.update(x[p],i.ARRAY_BUFFER)}}function c(d){let f=[],m=d.index,g=d.attributes.position,x=0;if(m!==null){let w=m.array;x=m.version;for(let v=0,P=w.length;v<P;v+=3){let U=w[v+0],R=w[v+1],C=w[v+2];f.push(U,R,R,C,C,U)}}else if(g!==void 0){let w=g.array;x=g.version;for(let v=0,P=w.length/3-1;v<P;v+=3){let U=v+0,R=v+1,C=v+2;f.push(U,R,R,C,C,U)}}else return;let p=new(il(f)?Ss:Ms)(f,1);p.version=x;let u=r.get(d);u&&t.remove(u),r.set(d,p)}function h(d){let f=r.get(d);if(f){let m=d.index;m!==null&&f.version<m.version&&c(d)}else c(d);return r.get(d)}return{get:a,update:l,getWireframeAttribute:h}}function Rd(i,t,e,n){let s=n.isWebGL2,r;function o(m){r=m}let a,l;function c(m){a=m.type,l=m.bytesPerElement}function h(m,g){i.drawElements(r,g,a,m*l),e.update(g,r,1)}function d(m,g,x){if(x===0)return;let p,u;if(s)p=i,u=\"drawElementsInstanced\";else if(p=t.get(\"ANGLE_instanced_arrays\"),u=\"drawElementsInstancedANGLE\",p===null){console.error(\"THREE.WebGLIndexedBufferRenderer: using THREE.InstancedBufferGeometry but hardware does not support extension ANGLE_instanced_arrays.\");return}p[u](r,g,a,m*l,x),e.update(g,r,x)}function f(m,g,x){if(x===0)return;let p=t.get(\"WEBGL_multi_draw\");if(p===null)for(let u=0;u<x;u++)this.render(m[u]/l,g[u]);else{p.multiDrawElementsWEBGL(r,g,0,a,m,0,x);let u=0;for(let w=0;w<x;w++)u+=g[w];e.update(u,r,1)}}this.setMode=o,this.setIndex=c,this.render=h,this.renderInstances=d,this.renderMultiDraw=f}function Pd(i){let t={geometries:0,textures:0},e={frame:0,calls:0,triangles:0,points:0,lines:0};function n(r,o,a){switch(e.calls++,o){case i.TRIANGLES:e.triangles+=a*(r/3);break;case i.LINES:e.lines+=a*(r/2);break;case i.LINE_STRIP:e.lines+=a*(r-1);break;case i.LINE_LOOP:e.lines+=a*r;break;case i.POINTS:e.points+=a*r;break;default:console.error(\"THREE.WebGLInfo: Unknown draw mode:\",o);break}}function s(){e.calls=0,e.triangles=0,e.points=0,e.lines=0}return{memory:t,render:e,programs:null,autoReset:!0,reset:s,update:n}}function Ld(i,t){return i[0]-t[0]}function Id(i,t){return Math.abs(t[1])-Math.abs(i[1])}function Ud(i,t,e){let n={},s=new Float32Array(8),r=new WeakMap,o=new he,a=[];for(let c=0;c<8;c++)a[c]=[c,0];function l(c,h,d){let f=c.morphTargetInfluences;if(t.isWebGL2===!0){let m=h.morphAttributes.position||h.morphAttributes.normal||h.morphAttributes.color,g=m!==void 0?m.length:0,x=r.get(h);if(x===void 0||x.count!==g){let E=function(){K.dispose(),r.delete(h),h.removeEventListener(\"dispose\",E)};x!==void 0&&x.texture.dispose();let w=h.morphAttributes.position!==void 0,v=h.morphAttributes.normal!==void 0,P=h.morphAttributes.color!==void 0,U=h.morphAttributes.position||[],R=h.morphAttributes.normal||[],C=h.morphAttributes.color||[],Y=0;w===!0&&(Y=1),v===!0&&(Y=2),P===!0&&(Y=3);let S=h.attributes.position.count*Y,b=1;S>t.maxTextureSize&&(b=Math.ceil(S/t.maxTextureSize),S=t.maxTextureSize);let H=new Float32Array(S*b*4*g),K=new xs(H,S,b,g);K.type=dn,K.needsUpdate=!0;let T=Y*4;for(let L=0;L<g;L++){let F=U[L],I=R[L],G=C[L],X=S*b*4*L;for(let Z=0;Z<F.count;Z++){let $=Z*T;w===!0&&(o.fromBufferAttribute(F,Z),H[X+$+0]=o.x,H[X+$+1]=o.y,H[X+$+2]=o.z,H[X+$+3]=0),v===!0&&(o.fromBufferAttribute(I,Z),H[X+$+4]=o.x,H[X+$+5]=o.y,H[X+$+6]=o.z,H[X+$+7]=0),P===!0&&(o.fromBufferAttribute(G,Z),H[X+$+8]=o.x,H[X+$+9]=o.y,H[X+$+10]=o.z,H[X+$+11]=G.itemSize===4?o.w:1)}}x={count:g,texture:K,size:new Lt(S,b)},r.set(h,x),h.addEventListener(\"dispose\",E)}let p=0;for(let w=0;w<f.length;w++)p+=f[w];let u=h.morphTargetsRelative?1:1-p;d.getUniforms().setValue(i,\"morphTargetBaseInfluence\",u),d.getUniforms().setValue(i,\"morphTargetInfluences\",f),d.getUniforms().setValue(i,\"morphTargetsTexture\",x.texture,e),d.getUniforms().setValue(i,\"morphTargetsTextureSize\",x.size)}else{let m=f===void 0?0:f.length,g=n[h.id];if(g===void 0||g.length!==m){g=[];for(let v=0;v<m;v++)g[v]=[v,0];n[h.id]=g}for(let v=0;v<m;v++){let P=g[v];P[0]=v,P[1]=f[v]}g.sort(Id);for(let v=0;v<8;v++)v<m&&g[v][1]?(a[v][0]=g[v][0],a[v][1]=g[v][1]):(a[v][0]=Number.MAX_SAFE_INTEGER,a[v][1]=0);a.sort(Ld);let x=h.morphAttributes.position,p=h.morphAttributes.normal,u=0;for(let v=0;v<8;v++){let P=a[v],U=P[0],R=P[1];U!==Number.MAX_SAFE_INTEGER&&R?(x&&h.getAttribute(\"morphTarget\"+v)!==x[U]&&h.setAttribute(\"morphTarget\"+v,x[U]),p&&h.getAttribute(\"morphNormal\"+v)!==p[U]&&h.setAttribute(\"morphNormal\"+v,p[U]),s[v]=R,u+=R):(x&&h.hasAttribute(\"morphTarget\"+v)===!0&&h.deleteAttribute(\"morphTarget\"+v),p&&h.hasAttribute(\"morphNormal\"+v)===!0&&h.deleteAttribute(\"morphNormal\"+v),s[v]=0)}let w=h.morphTargetsRelative?1:1-u;d.getUniforms().setValue(i,\"morphTargetBaseInfluence\",w),d.getUniforms().setValue(i,\"morphTargetInfluences\",s)}}return{update:l}}function Dd(i,t,e,n){let s=new WeakMap;function r(l){let c=n.render.frame,h=l.geometry,d=t.get(l,h);if(s.get(d)!==c&&(t.update(d),s.set(d,c)),l.isInstancedMesh&&(l.hasEventListener(\"dispose\",a)===!1&&l.addEventListener(\"dispose\",a),s.get(l)!==c&&(e.update(l.instanceMatrix,i.ARRAY_BUFFER),l.instanceColor!==null&&e.update(l.instanceColor,i.ARRAY_BUFFER),s.set(l,c))),l.isSkinnedMesh){let f=l.skeleton;s.get(f)!==c&&(f.update(),s.set(f,c))}return d}function o(){s=new WeakMap}function a(l){let c=l.target;c.removeEventListener(\"dispose\",a),e.remove(c.instanceMatrix),c.instanceColor!==null&&e.remove(c.instanceColor)}return{update:r,dispose:o}}var As=class extends He{constructor(t,e,n,s,r,o,a,l,c,h){if(h=h!==void 0?h:Ln,h!==Ln&&h!==oi)throw new Error(\"DepthTexture format must be either THREE.DepthFormat or THREE.DepthStencilFormat\");n===void 0&&h===Ln&&(n=un),n===void 0&&h===oi&&(n=Pn),super(null,s,r,o,a,l,h,n,c),this.isDepthTexture=!0,this.image={width:t,height:e},this.magFilter=a!==void 0?a:xe,this.minFilter=l!==void 0?l:xe,this.flipY=!1,this.generateMipmaps=!1,this.compareFunction=null}copy(t){return super.copy(t),this.compareFunction=t.compareFunction,this}toJSON(t){let e=super.toJSON(t);return this.compareFunction!==null&&(e.compareFunction=this.compareFunction),e}},ol=new He,ll=new As(1,1);ll.compareFunction=nl;var cl=new xs,hl=new Ir,ul=new Es,Eo=[],wo=[],To=new Float32Array(16),Ao=new Float32Array(9),Co=new Float32Array(4);function fi(i,t,e){let n=i[0];if(n<=0||n>0)return i;let s=t*e,r=Eo[s];if(r===void 0&&(r=new Float32Array(s),Eo[s]=r),t!==0){n.toArray(r,0);for(let o=1,a=0;o!==t;++o)a+=e,i[o].toArray(r,a)}return r}function ne(i,t){if(i.length!==t.length)return!1;for(let e=0,n=i.length;e<n;e++)if(i[e]!==t[e])return!1;return!0}function ie(i,t){for(let e=0,n=t.length;e<n;e++)i[e]=t[e]}function Ds(i,t){let e=wo[t];e===void 0&&(e=new Int32Array(t),wo[t]=e);for(let n=0;n!==t;++n)e[n]=i.allocateTextureUnit();return e}function Nd(i,t){let e=this.cache;e[0]!==t&&(i.uniform1f(this.addr,t),e[0]=t)}function Fd(i,t){let e=this.cache;if(t.x!==void 0)(e[0]!==t.x||e[1]!==t.y)&&(i.uniform2f(this.addr,t.x,t.y),e[0]=t.x,e[1]=t.y);else{if(ne(e,t))return;i.uniform2fv(this.addr,t),ie(e,t)}}function Od(i,t){let e=this.cache;if(t.x!==void 0)(e[0]!==t.x||e[1]!==t.y||e[2]!==t.z)&&(i.uniform3f(this.addr,t.x,t.y,t.z),e[0]=t.x,e[1]=t.y,e[2]=t.z);else if(t.r!==void 0)(e[0]!==t.r||e[1]!==t.g||e[2]!==t.b)&&(i.uniform3f(this.addr,t.r,t.g,t.b),e[0]=t.r,e[1]=t.g,e[2]=t.b);else{if(ne(e,t))return;i.uniform3fv(this.addr,t),ie(e,t)}}function Bd(i,t){let e=this.cache;if(t.x!==void 0)(e[0]!==t.x||e[1]!==t.y||e[2]!==t.z||e[3]!==t.w)&&(i.uniform4f(this.addr,t.x,t.y,t.z,t.w),e[0]=t.x,e[1]=t.y,e[2]=t.z,e[3]=t.w);else{if(ne(e,t))return;i.uniform4fv(this.addr,t),ie(e,t)}}function zd(i,t){let e=this.cache,n=t.elements;if(n===void 0){if(ne(e,t))return;i.uniformMatrix2fv(this.addr,!1,t),ie(e,t)}else{if(ne(e,n))return;Co.set(n),i.uniformMatrix2fv(this.addr,!1,Co),ie(e,n)}}function Vd(i,t){let e=this.cache,n=t.elements;if(n===void 0){if(ne(e,t))return;i.uniformMatrix3fv(this.addr,!1,t),ie(e,t)}else{if(ne(e,n))return;Ao.set(n),i.uniformMatrix3fv(this.addr,!1,Ao),ie(e,n)}}function kd(i,t){let e=this.cache,n=t.elements;if(n===void 0){if(ne(e,t))return;i.uniformMatrix4fv(this.addr,!1,t),ie(e,t)}else{if(ne(e,n))return;To.set(n),i.uniformMatrix4fv(this.addr,!1,To),ie(e,n)}}function Hd(i,t){let e=this.cache;e[0]!==t&&(i.uniform1i(this.addr,t),e[0]=t)}function Gd(i,t){let e=this.cache;if(t.x!==void 0)(e[0]!==t.x||e[1]!==t.y)&&(i.uniform2i(this.addr,t.x,t.y),e[0]=t.x,e[1]=t.y);else{if(ne(e,t))return;i.uniform2iv(this.addr,t),ie(e,t)}}function Wd(i,t){let e=this.cache;if(t.x!==void 0)(e[0]!==t.x||e[1]!==t.y||e[2]!==t.z)&&(i.uniform3i(this.addr,t.x,t.y,t.z),e[0]=t.x,e[1]=t.y,e[2]=t.z);else{if(ne(e,t))return;i.uniform3iv(this.addr,t),ie(e,t)}}function Xd(i,t){let e=this.cache;if(t.x!==void 0)(e[0]!==t.x||e[1]!==t.y||e[2]!==t.z||e[3]!==t.w)&&(i.uniform4i(this.addr,t.x,t.y,t.z,t.w),e[0]=t.x,e[1]=t.y,e[2]=t.z,e[3]=t.w);else{if(ne(e,t))return;i.uniform4iv(this.addr,t),ie(e,t)}}function qd(i,t){let e=this.cache;e[0]!==t&&(i.uniform1ui(this.addr,t),e[0]=t)}function Yd(i,t){let e=this.cache;if(t.x!==void 0)(e[0]!==t.x||e[1]!==t.y)&&(i.uniform2ui(this.addr,t.x,t.y),e[0]=t.x,e[1]=t.y);else{if(ne(e,t))return;i.uniform2uiv(this.addr,t),ie(e,t)}}function Zd(i,t){let e=this.cache;if(t.x!==void 0)(e[0]!==t.x||e[1]!==t.y||e[2]!==t.z)&&(i.uniform3ui(this.addr,t.x,t.y,t.z),e[0]=t.x,e[1]=t.y,e[2]=t.z);else{if(ne(e,t))return;i.uniform3uiv(this.addr,t),ie(e,t)}}function Jd(i,t){let e=this.cache;if(t.x!==void 0)(e[0]!==t.x||e[1]!==t.y||e[2]!==t.z||e[3]!==t.w)&&(i.uniform4ui(this.addr,t.x,t.y,t.z,t.w),e[0]=t.x,e[1]=t.y,e[2]=t.z,e[3]=t.w);else{if(ne(e,t))return;i.uniform4uiv(this.addr,t),ie(e,t)}}function $d(i,t,e){let n=this.cache,s=e.allocateTextureUnit();n[0]!==s&&(i.uniform1i(this.addr,s),n[0]=s);let r=this.type===i.SAMPLER_2D_SHADOW?ll:ol;e.setTexture2D(t||r,s)}function Kd(i,t,e){let n=this.cache,s=e.allocateTextureUnit();n[0]!==s&&(i.uniform1i(this.addr,s),n[0]=s),e.setTexture3D(t||hl,s)}function Qd(i,t,e){let n=this.cache,s=e.allocateTextureUnit();n[0]!==s&&(i.uniform1i(this.addr,s),n[0]=s),e.setTextureCube(t||ul,s)}function jd(i,t,e){let n=this.cache,s=e.allocateTextureUnit();n[0]!==s&&(i.uniform1i(this.addr,s),n[0]=s),e.setTexture2DArray(t||cl,s)}function tf(i){switch(i){case 5126:return Nd;case 35664:return Fd;case 35665:return Od;case 35666:return Bd;case 35674:return zd;case 35675:return Vd;case 35676:return kd;case 5124:case 35670:return Hd;case 35667:case 35671:return Gd;case 35668:case 35672:return Wd;case 35669:case 35673:return Xd;case 5125:return qd;case 36294:return Yd;case 36295:return Zd;case 36296:return Jd;case 35678:case 36198:case 36298:case 36306:case 35682:return $d;case 35679:case 36299:case 36307:return Kd;case 35680:case 36300:case 36308:case 36293:return Qd;case 36289:case 36303:case 36311:case 36292:return jd}}function ef(i,t){i.uniform1fv(this.addr,t)}function nf(i,t){let e=fi(t,this.size,2);i.uniform2fv(this.addr,e)}function sf(i,t){let e=fi(t,this.size,3);i.uniform3fv(this.addr,e)}function rf(i,t){let e=fi(t,this.size,4);i.uniform4fv(this.addr,e)}function af(i,t){let e=fi(t,this.size,4);i.uniformMatrix2fv(this.addr,!1,e)}function of(i,t){let e=fi(t,this.size,9);i.uniformMatrix3fv(this.addr,!1,e)}function lf(i,t){let e=fi(t,this.size,16);i.uniformMatrix4fv(this.addr,!1,e)}function cf(i,t){i.uniform1iv(this.addr,t)}function hf(i,t){i.uniform2iv(this.addr,t)}function uf(i,t){i.uniform3iv(this.addr,t)}function df(i,t){i.uniform4iv(this.addr,t)}function ff(i,t){i.uniform1uiv(this.addr,t)}function pf(i,t){i.uniform2uiv(this.addr,t)}function mf(i,t){i.uniform3uiv(this.addr,t)}function gf(i,t){i.uniform4uiv(this.addr,t)}function _f(i,t,e){let n=this.cache,s=t.length,r=Ds(e,s);ne(n,r)||(i.uniform1iv(this.addr,r),ie(n,r));for(let o=0;o!==s;++o)e.setTexture2D(t[o]||ol,r[o])}function xf(i,t,e){let n=this.cache,s=t.length,r=Ds(e,s);ne(n,r)||(i.uniform1iv(this.addr,r),ie(n,r));for(let o=0;o!==s;++o)e.setTexture3D(t[o]||hl,r[o])}function vf(i,t,e){let n=this.cache,s=t.length,r=Ds(e,s);ne(n,r)||(i.uniform1iv(this.addr,r),ie(n,r));for(let o=0;o!==s;++o)e.setTextureCube(t[o]||ul,r[o])}function yf(i,t,e){let n=this.cache,s=t.length,r=Ds(e,s);ne(n,r)||(i.uniform1iv(this.addr,r),ie(n,r));for(let o=0;o!==s;++o)e.setTexture2DArray(t[o]||cl,r[o])}function Mf(i){switch(i){case 5126:return ef;case 35664:return nf;case 35665:return sf;case 35666:return rf;case 35674:return af;case 35675:return of;case 35676:return lf;case 5124:case 35670:return cf;case 35667:case 35671:return hf;case 35668:case 35672:return uf;case 35669:case 35673:return df;case 5125:return ff;case 36294:return pf;case 36295:return mf;case 36296:return gf;case 35678:case 36198:case 36298:case 36306:case 35682:return _f;case 35679:case 36299:case 36307:return xf;case 35680:case 36300:case 36308:case 36293:return vf;case 36289:case 36303:case 36311:case 36292:return yf}}var Fr=class{constructor(t,e,n){this.id=t,this.addr=n,this.cache=[],this.type=e.type,this.setValue=tf(e.type)}},Or=class{constructor(t,e,n){this.id=t,this.addr=n,this.cache=[],this.type=e.type,this.size=e.size,this.setValue=Mf(e.type)}},Br=class{constructor(t){this.id=t,this.seq=[],this.map={}}setValue(t,e,n){let s=this.seq;for(let r=0,o=s.length;r!==o;++r){let a=s[r];a.setValue(t,e[a.id],n)}}},yr=/(\\w+)(\\])?(\\[|\\.)?/g;function Ro(i,t){i.seq.push(t),i.map[t.id]=t}function Sf(i,t,e){let n=i.name,s=n.length;for(yr.lastIndex=0;;){let r=yr.exec(n),o=yr.lastIndex,a=r[1],l=r[2]===\"]\",c=r[3];if(l&&(a=a|0),c===void 0||c===\"[\"&&o+2===s){Ro(e,c===void 0?new Fr(a,i,t):new Or(a,i,t));break}else{let d=e.map[a];d===void 0&&(d=new Br(a),Ro(e,d)),e=d}}}var si=class{constructor(t,e){this.seq=[],this.map={};let n=t.getProgramParameter(e,t.ACTIVE_UNIFORMS);for(let s=0;s<n;++s){let r=t.getActiveUniform(e,s),o=t.getUniformLocation(e,r.name);Sf(r,o,this)}}setValue(t,e,n,s){let r=this.map[e];r!==void 0&&r.setValue(t,n,s)}setOptional(t,e,n){let s=e[n];s!==void 0&&this.setValue(t,n,s)}static upload(t,e,n,s){for(let r=0,o=e.length;r!==o;++r){let a=e[r],l=n[a.id];l.needsUpdate!==!1&&a.setValue(t,l.value,s)}}static seqWithValue(t,e){let n=[];for(let s=0,r=t.length;s!==r;++s){let o=t[s];o.id in e&&n.push(o)}return n}};function Po(i,t,e){let n=i.createShader(t);return i.shaderSource(n,e),i.compileShader(n),n}var bf=37297,Ef=0;function wf(i,t){let e=i.split(`\n`),n=[],s=Math.max(t-6,0),r=Math.min(t+6,e.length);for(let o=s;o<r;o++){let a=o+1;n.push(`${a===t?\">\":\" \"} ${a}: ${e[o]}`)}return n.join(`\n`)}function Tf(i){let t=Wt.getPrimaries(Wt.workingColorSpace),e=Wt.getPrimaries(i),n;switch(t===e?n=\"\":t===fs&&e===ds?n=\"LinearDisplayP3ToLinearSRGB\":t===ds&&e===fs&&(n=\"LinearSRGBToLinearDisplayP3\"),i){case rn:case Us:return[n,\"LinearTransferOETF\"];case ce:case aa:return[n,\"sRGBTransferOETF\"];default:return console.warn(\"THREE.WebGLProgram: Unsupported color space:\",i),[n,\"LinearTransferOETF\"]}}function Lo(i,t,e){let n=i.getShaderParameter(t,i.COMPILE_STATUS),s=i.getShaderInfoLog(t).trim();if(n&&s===\"\")return\"\";let r=/ERROR: 0:(\\d+)/.exec(s);if(r){let o=parseInt(r[1]);return e.toUpperCase()+`\n\n`+s+`\n\n`+wf(i.getShaderSource(t),o)}else return s}function Af(i,t){let e=Tf(t);return`vec4 ${i}( vec4 value ) { return ${e[0]}( ${e[1]}( value ) ); }`}function Cf(i,t){let e;switch(t){case ql:e=\"Linear\";break;case Yl:e=\"Reinhard\";break;case Zl:e=\"OptimizedCineon\";break;case sa:e=\"ACESFilmic\";break;case $l:e=\"AgX\";break;case Jl:e=\"Custom\";break;default:console.warn(\"THREE.WebGLProgram: Unsupported toneMapping:\",t),e=\"Linear\"}return\"vec3 \"+i+\"( vec3 color ) { return \"+e+\"ToneMapping( color ); }\"}function Rf(i){return[i.extensionDerivatives||i.envMapCubeUVHeight||i.bumpMap||i.normalMapTangentSpace||i.clearcoatNormalMap||i.flatShading||i.shaderID===\"physical\"?\"#extension GL_OES_standard_derivatives : enable\":\"\",(i.extensionFragDepth||i.logarithmicDepthBuffer)&&i.rendererExtensionFragDepth?\"#extension GL_EXT_frag_depth : enable\":\"\",i.extensionDrawBuffers&&i.rendererExtensionDrawBuffers?\"#extension GL_EXT_draw_buffers : require\":\"\",(i.extensionShaderTextureLOD||i.envMap||i.transmission)&&i.rendererExtensionShaderTextureLod?\"#extension GL_EXT_shader_texture_lod : enable\":\"\"].filter(ei).join(`\n`)}function Pf(i){return[i.extensionClipCullDistance?\"#extension GL_ANGLE_clip_cull_distance : require\":\"\"].filter(ei).join(`\n`)}function Lf(i){let t=[];for(let e in i){let n=i[e];n!==!1&&t.push(\"#define \"+e+\" \"+n)}return t.join(`\n`)}function If(i,t){let e={},n=i.getProgramParameter(t,i.ACTIVE_ATTRIBUTES);for(let s=0;s<n;s++){let r=i.getActiveAttrib(t,s),o=r.name,a=1;r.type===i.FLOAT_MAT2&&(a=2),r.type===i.FLOAT_MAT3&&(a=3),r.type===i.FLOAT_MAT4&&(a=4),e[o]={type:r.type,location:i.getAttribLocation(t,o),locationSize:a}}return e}function ei(i){return i!==\"\"}function Io(i,t){let e=t.numSpotLightShadows+t.numSpotLightMaps-t.numSpotLightShadowsWithMaps;return i.replace(/NUM_DIR_LIGHTS/g,t.numDirLights).replace(/NUM_SPOT_LIGHTS/g,t.numSpotLights).replace(/NUM_SPOT_LIGHT_MAPS/g,t.numSpotLightMaps).replace(/NUM_SPOT_LIGHT_COORDS/g,e).replace(/NUM_RECT_AREA_LIGHTS/g,t.numRectAreaLights).replace(/NUM_POINT_LIGHTS/g,t.numPointLights).replace(/NUM_HEMI_LIGHTS/g,t.numHemiLights).replace(/NUM_DIR_LIGHT_SHADOWS/g,t.numDirLightShadows).replace(/NUM_SPOT_LIGHT_SHADOWS_WITH_MAPS/g,t.numSpotLightShadowsWithMaps).replace(/NUM_SPOT_LIGHT_SHADOWS/g,t.numSpotLightShadows).replace(/NUM_POINT_LIGHT_SHADOWS/g,t.numPointLightShadows)}function Uo(i,t){return i.replace(/NUM_CLIPPING_PLANES/g,t.numClippingPlanes).replace(/UNION_CLIPPING_PLANES/g,t.numClippingPlanes-t.numClipIntersection)}var Uf=/^[ \\t]*#include +<([\\w\\d./]+)>/gm;function zr(i){return i.replace(Uf,Nf)}var Df=new Map([[\"encodings_fragment\",\"colorspace_fragment\"],[\"encodings_pars_fragment\",\"colorspace_pars_fragment\"],[\"output_fragment\",\"opaque_fragment\"]]);function Nf(i,t){let e=Dt[t];if(e===void 0){let n=Df.get(t);if(n!==void 0)e=Dt[n],console.warn('THREE.WebGLRenderer: Shader chunk \"%s\" has been deprecated. Use \"%s\" instead.',t,n);else throw new Error(\"Can not resolve #include <\"+t+\">\")}return zr(e)}var Ff=/#pragma unroll_loop_start\\s+for\\s*\\(\\s*int\\s+i\\s*=\\s*(\\d+)\\s*;\\s*i\\s*<\\s*(\\d+)\\s*;\\s*i\\s*\\+\\+\\s*\\)\\s*{([\\s\\S]+?)}\\s+#pragma unroll_loop_end/g;function Do(i){return i.replace(Ff,Of)}function Of(i,t,e,n){let s=\"\";for(let r=parseInt(t);r<parseInt(e);r++)s+=n.replace(/\\[\\s*i\\s*\\]/g,\"[ \"+r+\" ]\").replace(/UNROLLED_LOOP_INDEX/g,r);return s}function No(i){let t=\"precision \"+i.precision+` float;\nprecision `+i.precision+\" int;\";return i.precision===\"highp\"?t+=`\n#define HIGH_PRECISION`:i.precision===\"mediump\"?t+=`\n#define MEDIUM_PRECISION`:i.precision===\"lowp\"&&(t+=`\n#define LOW_PRECISION`),t}function Bf(i){let t=\"SHADOWMAP_TYPE_BASIC\";return i.shadowMapType===Xo?t=\"SHADOWMAP_TYPE_PCF\":i.shadowMapType===yl?t=\"SHADOWMAP_TYPE_PCF_SOFT\":i.shadowMapType===tn&&(t=\"SHADOWMAP_TYPE_VSM\"),t}function zf(i){let t=\"ENVMAP_TYPE_CUBE\";if(i.envMap)switch(i.envMapMode){case ri:case ai:t=\"ENVMAP_TYPE_CUBE\";break;case Is:t=\"ENVMAP_TYPE_CUBE_UV\";break}return t}function Vf(i){let t=\"ENVMAP_MODE_REFLECTION\";if(i.envMap)switch(i.envMapMode){case ai:t=\"ENVMAP_MODE_REFRACTION\";break}return t}function kf(i){let t=\"ENVMAP_BLENDING_NONE\";if(i.envMap)switch(i.combine){case qo:t=\"ENVMAP_BLENDING_MULTIPLY\";break;case Wl:t=\"ENVMAP_BLENDING_MIX\";break;case Xl:t=\"ENVMAP_BLENDING_ADD\";break}return t}function Hf(i){let t=i.envMapCubeUVHeight;if(t===null)return null;let e=Math.log2(t)-2,n=1/t;return{texelWidth:1/(3*Math.max(Math.pow(2,e),112)),texelHeight:n,maxMip:e}}function Gf(i,t,e,n){let s=i.getContext(),r=e.defines,o=e.vertexShader,a=e.fragmentShader,l=Bf(e),c=zf(e),h=Vf(e),d=kf(e),f=Hf(e),m=e.isWebGL2?\"\":Rf(e),g=Pf(e),x=Lf(r),p=s.createProgram(),u,w,v=e.glslVersion?\"#version \"+e.glslVersion+`\n`:\"\";e.isRawShaderMaterial?(u=[\"#define SHADER_TYPE \"+e.shaderType,\"#define SHADER_NAME \"+e.shaderName,x].filter(ei).join(`\n`),u.length>0&&(u+=`\n`),w=[m,\"#define SHADER_TYPE \"+e.shaderType,\"#define SHADER_NAME \"+e.shaderName,x].filter(ei).join(`\n`),w.length>0&&(w+=`\n`)):(u=[No(e),\"#define SHADER_TYPE \"+e.shaderType,\"#define SHADER_NAME \"+e.shaderName,x,e.extensionClipCullDistance?\"#define USE_CLIP_DISTANCE\":\"\",e.batching?\"#define USE_BATCHING\":\"\",e.instancing?\"#define USE_INSTANCING\":\"\",e.instancingColor?\"#define USE_INSTANCING_COLOR\":\"\",e.useFog&&e.fog?\"#define USE_FOG\":\"\",e.useFog&&e.fogExp2?\"#define FOG_EXP2\":\"\",e.map?\"#define USE_MAP\":\"\",e.envMap?\"#define USE_ENVMAP\":\"\",e.envMap?\"#define \"+h:\"\",e.lightMap?\"#define USE_LIGHTMAP\":\"\",e.aoMap?\"#define USE_AOMAP\":\"\",e.bumpMap?\"#define USE_BUMPMAP\":\"\",e.normalMap?\"#define USE_NORMALMAP\":\"\",e.normalMapObjectSpace?\"#define USE_NORMALMAP_OBJECTSPACE\":\"\",e.normalMapTangentSpace?\"#define USE_NORMALMAP_TANGENTSPACE\":\"\",e.displacementMap?\"#define USE_DISPLACEMENTMAP\":\"\",e.emissiveMap?\"#define USE_EMISSIVEMAP\":\"\",e.anisotropy?\"#define USE_ANISOTROPY\":\"\",e.anisotropyMap?\"#define USE_ANISOTROPYMAP\":\"\",e.clearcoatMap?\"#define USE_CLEARCOATMAP\":\"\",e.clearcoatRoughnessMap?\"#define USE_CLEARCOAT_ROUGHNESSMAP\":\"\",e.clearcoatNormalMap?\"#define USE_CLEARCOAT_NORMALMAP\":\"\",e.iridescenceMap?\"#define USE_IRIDESCENCEMAP\":\"\",e.iridescenceThicknessMap?\"#define USE_IRIDESCENCE_THICKNESSMAP\":\"\",e.specularMap?\"#define USE_SPECULARMAP\":\"\",e.specularColorMap?\"#define USE_SPECULAR_COLORMAP\":\"\",e.specularIntensityMap?\"#define USE_SPECULAR_INTENSITYMAP\":\"\",e.roughnessMap?\"#define USE_ROUGHNESSMAP\":\"\",e.metalnessMap?\"#define USE_METALNESSMAP\":\"\",e.alphaMap?\"#define USE_ALPHAMAP\":\"\",e.alphaHash?\"#define USE_ALPHAHASH\":\"\",e.transmission?\"#define USE_TRANSMISSION\":\"\",e.transmissionMap?\"#define USE_TRANSMISSIONMAP\":\"\",e.thicknessMap?\"#define USE_THICKNESSMAP\":\"\",e.sheenColorMap?\"#define USE_SHEEN_COLORMAP\":\"\",e.sheenRoughnessMap?\"#define USE_SHEEN_ROUGHNESSMAP\":\"\",e.mapUv?\"#define MAP_UV \"+e.mapUv:\"\",e.alphaMapUv?\"#define ALPHAMAP_UV \"+e.alphaMapUv:\"\",e.lightMapUv?\"#define LIGHTMAP_UV \"+e.lightMapUv:\"\",e.aoMapUv?\"#define AOMAP_UV \"+e.aoMapUv:\"\",e.emissiveMapUv?\"#define EMISSIVEMAP_UV \"+e.emissiveMapUv:\"\",e.bumpMapUv?\"#define BUMPMAP_UV \"+e.bumpMapUv:\"\",e.normalMapUv?\"#define NORMALMAP_UV \"+e.normalMapUv:\"\",e.displacementMapUv?\"#define DISPLACEMENTMAP_UV \"+e.displacementMapUv:\"\",e.metalnessMapUv?\"#define METALNESSMAP_UV \"+e.metalnessMapUv:\"\",e.roughnessMapUv?\"#define ROUGHNESSMAP_UV \"+e.roughnessMapUv:\"\",e.anisotropyMapUv?\"#define ANISOTROPYMAP_UV \"+e.anisotropyMapUv:\"\",e.clearcoatMapUv?\"#define CLEARCOATMAP_UV \"+e.clearcoatMapUv:\"\",e.clearcoatNormalMapUv?\"#define CLEARCOAT_NORMALMAP_UV \"+e.clearcoatNormalMapUv:\"\",e.clearcoatRoughnessMapUv?\"#define CLEARCOAT_ROUGHNESSMAP_UV \"+e.clearcoatRoughnessMapUv:\"\",e.iridescenceMapUv?\"#define IRIDESCENCEMAP_UV \"+e.iridescenceMapUv:\"\",e.iridescenceThicknessMapUv?\"#define IRIDESCENCE_THICKNESSMAP_UV \"+e.iridescenceThicknessMapUv:\"\",e.sheenColorMapUv?\"#define SHEEN_COLORMAP_UV \"+e.sheenColorMapUv:\"\",e.sheenRoughnessMapUv?\"#define SHEEN_ROUGHNESSMAP_UV \"+e.sheenRoughnessMapUv:\"\",e.specularMapUv?\"#define SPECULARMAP_UV \"+e.specularMapUv:\"\",e.specularColorMapUv?\"#define SPECULAR_COLORMAP_UV \"+e.specularColorMapUv:\"\",e.specularIntensityMapUv?\"#define SPECULAR_INTENSITYMAP_UV \"+e.specularIntensityMapUv:\"\",e.transmissionMapUv?\"#define TRANSMISSIONMAP_UV \"+e.transmissionMapUv:\"\",e.thicknessMapUv?\"#define THICKNESSMAP_UV \"+e.thicknessMapUv:\"\",e.vertexTangents&&e.flatShading===!1?\"#define USE_TANGENT\":\"\",e.vertexColors?\"#define USE_COLOR\":\"\",e.vertexAlphas?\"#define USE_COLOR_ALPHA\":\"\",e.vertexUv1s?\"#define USE_UV1\":\"\",e.vertexUv2s?\"#define USE_UV2\":\"\",e.vertexUv3s?\"#define USE_UV3\":\"\",e.pointsUvs?\"#define USE_POINTS_UV\":\"\",e.flatShading?\"#define FLAT_SHADED\":\"\",e.skinning?\"#define USE_SKINNING\":\"\",e.morphTargets?\"#define USE_MORPHTARGETS\":\"\",e.morphNormals&&e.flatShading===!1?\"#define USE_MORPHNORMALS\":\"\",e.morphColors&&e.isWebGL2?\"#define USE_MORPHCOLORS\":\"\",e.morphTargetsCount>0&&e.isWebGL2?\"#define MORPHTARGETS_TEXTURE\":\"\",e.morphTargetsCount>0&&e.isWebGL2?\"#define MORPHTARGETS_TEXTURE_STRIDE \"+e.morphTextureStride:\"\",e.morphTargetsCount>0&&e.isWebGL2?\"#define MORPHTARGETS_COUNT \"+e.morphTargetsCount:\"\",e.doubleSided?\"#define DOUBLE_SIDED\":\"\",e.flipSided?\"#define FLIP_SIDED\":\"\",e.shadowMapEnabled?\"#define USE_SHADOWMAP\":\"\",e.shadowMapEnabled?\"#define \"+l:\"\",e.sizeAttenuation?\"#define USE_SIZEATTENUATION\":\"\",e.numLightProbes>0?\"#define USE_LIGHT_PROBES\":\"\",e.useLegacyLights?\"#define LEGACY_LIGHTS\":\"\",e.logarithmicDepthBuffer?\"#define USE_LOGDEPTHBUF\":\"\",e.logarithmicDepthBuffer&&e.rendererExtensionFragDepth?\"#define USE_LOGDEPTHBUF_EXT\":\"\",\"uniform mat4 modelMatrix;\",\"uniform mat4 modelViewMatrix;\",\"uniform mat4 projectionMatrix;\",\"uniform mat4 viewMatrix;\",\"uniform mat3 normalMatrix;\",\"uniform vec3 cameraPosition;\",\"uniform bool isOrthographic;\",\"#ifdef USE_INSTANCING\",\"\tattribute mat4 instanceMatrix;\",\"#endif\",\"#ifdef USE_INSTANCING_COLOR\",\"\tattribute vec3 instanceColor;\",\"#endif\",\"attribute vec3 position;\",\"attribute vec3 normal;\",\"attribute vec2 uv;\",\"#ifdef USE_UV1\",\"\tattribute vec2 uv1;\",\"#endif\",\"#ifdef USE_UV2\",\"\tattribute vec2 uv2;\",\"#endif\",\"#ifdef USE_UV3\",\"\tattribute vec2 uv3;\",\"#endif\",\"#ifdef USE_TANGENT\",\"\tattribute vec4 tangent;\",\"#endif\",\"#if defined( USE_COLOR_ALPHA )\",\"\tattribute vec4 color;\",\"#elif defined( USE_COLOR )\",\"\tattribute vec3 color;\",\"#endif\",\"#if ( defined( USE_MORPHTARGETS ) && ! defined( MORPHTARGETS_TEXTURE ) )\",\"\tattribute vec3 morphTarget0;\",\"\tattribute vec3 morphTarget1;\",\"\tattribute vec3 morphTarget2;\",\"\tattribute vec3 morphTarget3;\",\"\t#ifdef USE_MORPHNORMALS\",\"\t\tattribute vec3 morphNormal0;\",\"\t\tattribute vec3 morphNormal1;\",\"\t\tattribute vec3 morphNormal2;\",\"\t\tattribute vec3 morphNormal3;\",\"\t#else\",\"\t\tattribute vec3 morphTarget4;\",\"\t\tattribute vec3 morphTarget5;\",\"\t\tattribute vec3 morphTarget6;\",\"\t\tattribute vec3 morphTarget7;\",\"\t#endif\",\"#endif\",\"#ifdef USE_SKINNING\",\"\tattribute vec4 skinIndex;\",\"\tattribute vec4 skinWeight;\",\"#endif\",`\n`].filter(ei).join(`\n`),w=[m,No(e),\"#define SHADER_TYPE \"+e.shaderType,\"#define SHADER_NAME \"+e.shaderName,x,e.useFog&&e.fog?\"#define USE_FOG\":\"\",e.useFog&&e.fogExp2?\"#define FOG_EXP2\":\"\",e.map?\"#define USE_MAP\":\"\",e.matcap?\"#define USE_MATCAP\":\"\",e.envMap?\"#define USE_ENVMAP\":\"\",e.envMap?\"#define \"+c:\"\",e.envMap?\"#define \"+h:\"\",e.envMap?\"#define \"+d:\"\",f?\"#define CUBEUV_TEXEL_WIDTH \"+f.texelWidth:\"\",f?\"#define CUBEUV_TEXEL_HEIGHT \"+f.texelHeight:\"\",f?\"#define CUBEUV_MAX_MIP \"+f.maxMip+\".0\":\"\",e.lightMap?\"#define USE_LIGHTMAP\":\"\",e.aoMap?\"#define USE_AOMAP\":\"\",e.bumpMap?\"#define USE_BUMPMAP\":\"\",e.normalMap?\"#define USE_NORMALMAP\":\"\",e.normalMapObjectSpace?\"#define USE_NORMALMAP_OBJECTSPACE\":\"\",e.normalMapTangentSpace?\"#define USE_NORMALMAP_TANGENTSPACE\":\"\",e.emissiveMap?\"#define USE_EMISSIVEMAP\":\"\",e.anisotropy?\"#define USE_ANISOTROPY\":\"\",e.anisotropyMap?\"#define USE_ANISOTROPYMAP\":\"\",e.clearcoat?\"#define USE_CLEARCOAT\":\"\",e.clearcoatMap?\"#define USE_CLEARCOATMAP\":\"\",e.clearcoatRoughnessMap?\"#define USE_CLEARCOAT_ROUGHNESSMAP\":\"\",e.clearcoatNormalMap?\"#define USE_CLEARCOAT_NORMALMAP\":\"\",e.iridescence?\"#define USE_IRIDESCENCE\":\"\",e.iridescenceMap?\"#define USE_IRIDESCENCEMAP\":\"\",e.iridescenceThicknessMap?\"#define USE_IRIDESCENCE_THICKNESSMAP\":\"\",e.specularMap?\"#define USE_SPECULARMAP\":\"\",e.specularColorMap?\"#define USE_SPECULAR_COLORMAP\":\"\",e.specularIntensityMap?\"#define USE_SPECULAR_INTENSITYMAP\":\"\",e.roughnessMap?\"#define USE_ROUGHNESSMAP\":\"\",e.metalnessMap?\"#define USE_METALNESSMAP\":\"\",e.alphaMap?\"#define USE_ALPHAMAP\":\"\",e.alphaTest?\"#define USE_ALPHATEST\":\"\",e.alphaHash?\"#define USE_ALPHAHASH\":\"\",e.sheen?\"#define USE_SHEEN\":\"\",e.sheenColorMap?\"#define USE_SHEEN_COLORMAP\":\"\",e.sheenRoughnessMap?\"#define USE_SHEEN_ROUGHNESSMAP\":\"\",e.transmission?\"#define USE_TRANSMISSION\":\"\",e.transmissionMap?\"#define USE_TRANSMISSIONMAP\":\"\",e.thicknessMap?\"#define USE_THICKNESSMAP\":\"\",e.vertexTangents&&e.flatShading===!1?\"#define USE_TANGENT\":\"\",e.vertexColors||e.instancingColor?\"#define USE_COLOR\":\"\",e.vertexAlphas?\"#define USE_COLOR_ALPHA\":\"\",e.vertexUv1s?\"#define USE_UV1\":\"\",e.vertexUv2s?\"#define USE_UV2\":\"\",e.vertexUv3s?\"#define USE_UV3\":\"\",e.pointsUvs?\"#define USE_POINTS_UV\":\"\",e.gradientMap?\"#define USE_GRADIENTMAP\":\"\",e.flatShading?\"#define FLAT_SHADED\":\"\",e.doubleSided?\"#define DOUBLE_SIDED\":\"\",e.flipSided?\"#define FLIP_SIDED\":\"\",e.shadowMapEnabled?\"#define USE_SHADOWMAP\":\"\",e.shadowMapEnabled?\"#define \"+l:\"\",e.premultipliedAlpha?\"#define PREMULTIPLIED_ALPHA\":\"\",e.numLightProbes>0?\"#define USE_LIGHT_PROBES\":\"\",e.useLegacyLights?\"#define LEGACY_LIGHTS\":\"\",e.decodeVideoTexture?\"#define DECODE_VIDEO_TEXTURE\":\"\",e.logarithmicDepthBuffer?\"#define USE_LOGDEPTHBUF\":\"\",e.logarithmicDepthBuffer&&e.rendererExtensionFragDepth?\"#define USE_LOGDEPTHBUF_EXT\":\"\",\"uniform mat4 viewMatrix;\",\"uniform vec3 cameraPosition;\",\"uniform bool isOrthographic;\",e.toneMapping!==pn?\"#define TONE_MAPPING\":\"\",e.toneMapping!==pn?Dt.tonemapping_pars_fragment:\"\",e.toneMapping!==pn?Cf(\"toneMapping\",e.toneMapping):\"\",e.dithering?\"#define DITHERING\":\"\",e.opaque?\"#define OPAQUE\":\"\",Dt.colorspace_pars_fragment,Af(\"linearToOutputTexel\",e.outputColorSpace),e.useDepthPacking?\"#define DEPTH_PACKING \"+e.depthPacking:\"\",`\n`].filter(ei).join(`\n`)),o=zr(o),o=Io(o,e),o=Uo(o,e),a=zr(a),a=Io(a,e),a=Uo(a,e),o=Do(o),a=Do(a),e.isWebGL2&&e.isRawShaderMaterial!==!0&&(v=`#version 300 es\n`,u=[g,\"precision mediump sampler2DArray;\",\"#define attribute in\",\"#define varying out\",\"#define texture2D texture\"].join(`\n`)+`\n`+u,w=[\"precision mediump sampler2DArray;\",\"#define varying in\",e.glslVersion===ja?\"\":\"layout(location = 0) out highp vec4 pc_fragColor;\",e.glslVersion===ja?\"\":\"#define gl_FragColor pc_fragColor\",\"#define gl_FragDepthEXT gl_FragDepth\",\"#define texture2D texture\",\"#define textureCube texture\",\"#define texture2DProj textureProj\",\"#define texture2DLodEXT textureLod\",\"#define texture2DProjLodEXT textureProjLod\",\"#define textureCubeLodEXT textureLod\",\"#define texture2DGradEXT textureGrad\",\"#define texture2DProjGradEXT textureProjGrad\",\"#define textureCubeGradEXT textureGrad\"].join(`\n`)+`\n`+w);let P=v+u+o,U=v+w+a,R=Po(s,s.VERTEX_SHADER,P),C=Po(s,s.FRAGMENT_SHADER,U);s.attachShader(p,R),s.attachShader(p,C),e.index0AttributeName!==void 0?s.bindAttribLocation(p,0,e.index0AttributeName):e.morphTargets===!0&&s.bindAttribLocation(p,0,\"position\"),s.linkProgram(p);function Y(K){if(i.debug.checkShaderErrors){let T=s.getProgramInfoLog(p).trim(),E=s.getShaderInfoLog(R).trim(),L=s.getShaderInfoLog(C).trim(),F=!0,I=!0;if(s.getProgramParameter(p,s.LINK_STATUS)===!1)if(F=!1,typeof i.debug.onShaderError==\"function\")i.debug.onShaderError(s,p,R,C);else{let G=Lo(s,R,\"vertex\"),X=Lo(s,C,\"fragment\");console.error(\"THREE.WebGLProgram: Shader Error \"+s.getError()+\" - VALIDATE_STATUS \"+s.getProgramParameter(p,s.VALIDATE_STATUS)+`\n\nProgram Info Log: `+T+`\n`+G+`\n`+X)}else T!==\"\"?console.warn(\"THREE.WebGLProgram: Program Info Log:\",T):(E===\"\"||L===\"\")&&(I=!1);I&&(K.diagnostics={runnable:F,programLog:T,vertexShader:{log:E,prefix:u},fragmentShader:{log:L,prefix:w}})}s.deleteShader(R),s.deleteShader(C),S=new si(s,p),b=If(s,p)}let S;this.getUniforms=function(){return S===void 0&&Y(this),S};let b;this.getAttributes=function(){return b===void 0&&Y(this),b};let H=e.rendererExtensionParallelShaderCompile===!1;return this.isReady=function(){return H===!1&&(H=s.getProgramParameter(p,bf)),H},this.destroy=function(){n.releaseStatesOfProgram(this),s.deleteProgram(p),this.program=void 0},this.type=e.shaderType,this.name=e.shaderName,this.id=Ef++,this.cacheKey=t,this.usedTimes=1,this.program=p,this.vertexShader=R,this.fragmentShader=C,this}var Wf=0,Vr=class{constructor(){this.shaderCache=new Map,this.materialCache=new Map}update(t){let e=t.vertexShader,n=t.fragmentShader,s=this._getShaderStage(e),r=this._getShaderStage(n),o=this._getShaderCacheForMaterial(t);return o.has(s)===!1&&(o.add(s),s.usedTimes++),o.has(r)===!1&&(o.add(r),r.usedTimes++),this}remove(t){let e=this.materialCache.get(t);for(let n of e)n.usedTimes--,n.usedTimes===0&&this.shaderCache.delete(n.code);return this.materialCache.delete(t),this}getVertexShaderID(t){return this._getShaderStage(t.vertexShader).id}getFragmentShaderID(t){return this._getShaderStage(t.fragmentShader).id}dispose(){this.shaderCache.clear(),this.materialCache.clear()}_getShaderCacheForMaterial(t){let e=this.materialCache,n=e.get(t);return n===void 0&&(n=new Set,e.set(t,n)),n}_getShaderStage(t){let e=this.shaderCache,n=e.get(t);return n===void 0&&(n=new kr(t),e.set(t,n)),n}},kr=class{constructor(t){this.id=Wf++,this.code=t,this.usedTimes=0}};function Xf(i,t,e,n,s,r,o){let a=new ys,l=new Vr,c=[],h=s.isWebGL2,d=s.logarithmicDepthBuffer,f=s.vertexTextures,m=s.precision,g={MeshDepthMaterial:\"depth\",MeshDistanceMaterial:\"distanceRGBA\",MeshNormalMaterial:\"normal\",MeshBasicMaterial:\"basic\",MeshLambertMaterial:\"lambert\",MeshPhongMaterial:\"phong\",MeshToonMaterial:\"toon\",MeshStandardMaterial:\"physical\",MeshPhysicalMaterial:\"physical\",MeshMatcapMaterial:\"matcap\",LineBasicMaterial:\"basic\",LineDashedMaterial:\"dashed\",PointsMaterial:\"points\",ShadowMaterial:\"shadow\",SpriteMaterial:\"sprite\"};function x(S){return S===0?\"uv\":`uv${S}`}function p(S,b,H,K,T){let E=K.fog,L=T.geometry,F=S.isMeshStandardMaterial?K.environment:null,I=(S.isMeshStandardMaterial?e:t).get(S.envMap||F),G=I&&I.mapping===Is?I.image.height:null,X=g[S.type];S.precision!==null&&(m=s.getMaxPrecision(S.precision),m!==S.precision&&console.warn(\"THREE.WebGLProgram.getParameters:\",S.precision,\"not supported, using\",m,\"instead.\"));let Z=L.morphAttributes.position||L.morphAttributes.normal||L.morphAttributes.color,$=Z!==void 0?Z.length:0,et=0;L.morphAttributes.position!==void 0&&(et=1),L.morphAttributes.normal!==void 0&&(et=2),L.morphAttributes.color!==void 0&&(et=3);let W,q,st,pt;if(X){let me=qe[X];W=me.vertexShader,q=me.fragmentShader}else W=S.vertexShader,q=S.fragmentShader,l.update(S),st=l.getVertexShaderID(S),pt=l.getFragmentShaderID(S);let dt=i.getRenderTarget(),bt=T.isInstancedMesh===!0,Et=T.isBatchedMesh===!0,vt=!!S.map,kt=!!S.matcap,O=!!I,le=!!S.aoMap,_t=!!S.lightMap,At=!!S.bumpMap,ht=!!S.normalMap,Xt=!!S.displacementMap,gt=!!S.emissiveMap,M=!!S.metalnessMap,_=!!S.roughnessMap,B=S.anisotropy>0,Q=S.clearcoat>0,J=S.iridescence>0,tt=S.sheen>0,ft=S.transmission>0,rt=B&&!!S.anisotropyMap,ct=Q&&!!S.clearcoatMap,yt=Q&&!!S.clearcoatNormalMap,Nt=Q&&!!S.clearcoatRoughnessMap,j=J&&!!S.iridescenceMap,Gt=J&&!!S.iridescenceThicknessMap,Vt=tt&&!!S.sheenColorMap,Ct=tt&&!!S.sheenRoughnessMap,xt=!!S.specularMap,ut=!!S.specularColorMap,Ut=!!S.specularIntensityMap,Ht=ft&&!!S.transmissionMap,Qt=ft&&!!S.thicknessMap,Ot=!!S.gradientMap,nt=!!S.alphaMap,A=S.alphaTest>0,at=!!S.alphaHash,ot=!!S.extensions,wt=!!L.attributes.uv1,Mt=!!L.attributes.uv2,qt=!!L.attributes.uv3,Yt=pn;return S.toneMapped&&(dt===null||dt.isXRRenderTarget===!0)&&(Yt=i.toneMapping),{isWebGL2:h,shaderID:X,shaderType:S.type,shaderName:S.name,vertexShader:W,fragmentShader:q,defines:S.defines,customVertexShaderID:st,customFragmentShaderID:pt,isRawShaderMaterial:S.isRawShaderMaterial===!0,glslVersion:S.glslVersion,precision:m,batching:Et,instancing:bt,instancingColor:bt&&T.instanceColor!==null,supportsVertexTextures:f,outputColorSpace:dt===null?i.outputColorSpace:dt.isXRRenderTarget===!0?dt.texture.colorSpace:rn,map:vt,matcap:kt,envMap:O,envMapMode:O&&I.mapping,envMapCubeUVHeight:G,aoMap:le,lightMap:_t,bumpMap:At,normalMap:ht,displacementMap:f&&Xt,emissiveMap:gt,normalMapObjectSpace:ht&&S.normalMapType===cc,normalMapTangentSpace:ht&&S.normalMapType===lc,metalnessMap:M,roughnessMap:_,anisotropy:B,anisotropyMap:rt,clearcoat:Q,clearcoatMap:ct,clearcoatNormalMap:yt,clearcoatRoughnessMap:Nt,iridescence:J,iridescenceMap:j,iridescenceThicknessMap:Gt,sheen:tt,sheenColorMap:Vt,sheenRoughnessMap:Ct,specularMap:xt,specularColorMap:ut,specularIntensityMap:Ut,transmission:ft,transmissionMap:Ht,thicknessMap:Qt,gradientMap:Ot,opaque:S.transparent===!1&&S.blending===ni,alphaMap:nt,alphaTest:A,alphaHash:at,combine:S.combine,mapUv:vt&&x(S.map.channel),aoMapUv:le&&x(S.aoMap.channel),lightMapUv:_t&&x(S.lightMap.channel),bumpMapUv:At&&x(S.bumpMap.channel),normalMapUv:ht&&x(S.normalMap.channel),displacementMapUv:Xt&&x(S.displacementMap.channel),emissiveMapUv:gt&&x(S.emissiveMap.channel),metalnessMapUv:M&&x(S.metalnessMap.channel),roughnessMapUv:_&&x(S.roughnessMap.channel),anisotropyMapUv:rt&&x(S.anisotropyMap.channel),clearcoatMapUv:ct&&x(S.clearcoatMap.channel),clearcoatNormalMapUv:yt&&x(S.clearcoatNormalMap.channel),clearcoatRoughnessMapUv:Nt&&x(S.clearcoatRoughnessMap.channel),iridescenceMapUv:j&&x(S.iridescenceMap.channel),iridescenceThicknessMapUv:Gt&&x(S.iridescenceThicknessMap.channel),sheenColorMapUv:Vt&&x(S.sheenColorMap.channel),sheenRoughnessMapUv:Ct&&x(S.sheenRoughnessMap.channel),specularMapUv:xt&&x(S.specularMap.channel),specularColorMapUv:ut&&x(S.specularColorMap.channel),specularIntensityMapUv:Ut&&x(S.specularIntensityMap.channel),transmissionMapUv:Ht&&x(S.transmissionMap.channel),thicknessMapUv:Qt&&x(S.thicknessMap.channel),alphaMapUv:nt&&x(S.alphaMap.channel),vertexTangents:!!L.attributes.tangent&&(ht||B),vertexColors:S.vertexColors,vertexAlphas:S.vertexColors===!0&&!!L.attributes.color&&L.attributes.color.itemSize===4,vertexUv1s:wt,vertexUv2s:Mt,vertexUv3s:qt,pointsUvs:T.isPoints===!0&&!!L.attributes.uv&&(vt||nt),fog:!!E,useFog:S.fog===!0,fogExp2:E&&E.isFogExp2,flatShading:S.flatShading===!0,sizeAttenuation:S.sizeAttenuation===!0,logarithmicDepthBuffer:d,skinning:T.isSkinnedMesh===!0,morphTargets:L.morphAttributes.position!==void 0,morphNormals:L.morphAttributes.normal!==void 0,morphColors:L.morphAttributes.color!==void 0,morphTargetsCount:$,morphTextureStride:et,numDirLights:b.directional.length,numPointLights:b.point.length,numSpotLights:b.spot.length,numSpotLightMaps:b.spotLightMap.length,numRectAreaLights:b.rectArea.length,numHemiLights:b.hemi.length,numDirLightShadows:b.directionalShadowMap.length,numPointLightShadows:b.pointShadowMap.length,numSpotLightShadows:b.spotShadowMap.length,numSpotLightShadowsWithMaps:b.numSpotLightShadowsWithMaps,numLightProbes:b.numLightProbes,numClippingPlanes:o.numPlanes,numClipIntersection:o.numIntersection,dithering:S.dithering,shadowMapEnabled:i.shadowMap.enabled&&H.length>0,shadowMapType:i.shadowMap.type,toneMapping:Yt,useLegacyLights:i._useLegacyLights,decodeVideoTexture:vt&&S.map.isVideoTexture===!0&&Wt.getTransfer(S.map.colorSpace)===Jt,premultipliedAlpha:S.premultipliedAlpha,doubleSided:S.side===nn,flipSided:S.side===we,useDepthPacking:S.depthPacking>=0,depthPacking:S.depthPacking||0,index0AttributeName:S.index0AttributeName,extensionDerivatives:ot&&S.extensions.derivatives===!0,extensionFragDepth:ot&&S.extensions.fragDepth===!0,extensionDrawBuffers:ot&&S.extensions.drawBuffers===!0,extensionShaderTextureLOD:ot&&S.extensions.shaderTextureLOD===!0,extensionClipCullDistance:ot&&S.extensions.clipCullDistance&&n.has(\"WEBGL_clip_cull_distance\"),rendererExtensionFragDepth:h||n.has(\"EXT_frag_depth\"),rendererExtensionDrawBuffers:h||n.has(\"WEBGL_draw_buffers\"),rendererExtensionShaderTextureLod:h||n.has(\"EXT_shader_texture_lod\"),rendererExtensionParallelShaderCompile:n.has(\"KHR_parallel_shader_compile\"),customProgramCacheKey:S.customProgramCacheKey()}}function u(S){let b=[];if(S.shaderID?b.push(S.shaderID):(b.push(S.customVertexShaderID),b.push(S.customFragmentShaderID)),S.defines!==void 0)for(let H in S.defines)b.push(H),b.push(S.defines[H]);return S.isRawShaderMaterial===!1&&(w(b,S),v(b,S),b.push(i.outputColorSpace)),b.push(S.customProgramCacheKey),b.join()}function w(S,b){S.push(b.precision),S.push(b.outputColorSpace),S.push(b.envMapMode),S.push(b.envMapCubeUVHeight),S.push(b.mapUv),S.push(b.alphaMapUv),S.push(b.lightMapUv),S.push(b.aoMapUv),S.push(b.bumpMapUv),S.push(b.normalMapUv),S.push(b.displacementMapUv),S.push(b.emissiveMapUv),S.push(b.metalnessMapUv),S.push(b.roughnessMapUv),S.push(b.anisotropyMapUv),S.push(b.clearcoatMapUv),S.push(b.clearcoatNormalMapUv),S.push(b.clearcoatRoughnessMapUv),S.push(b.iridescenceMapUv),S.push(b.iridescenceThicknessMapUv),S.push(b.sheenColorMapUv),S.push(b.sheenRoughnessMapUv),S.push(b.specularMapUv),S.push(b.specularColorMapUv),S.push(b.specularIntensityMapUv),S.push(b.transmissionMapUv),S.push(b.thicknessMapUv),S.push(b.combine),S.push(b.fogExp2),S.push(b.sizeAttenuation),S.push(b.morphTargetsCount),S.push(b.morphAttributeCount),S.push(b.numDirLights),S.push(b.numPointLights),S.push(b.numSpotLights),S.push(b.numSpotLightMaps),S.push(b.numHemiLights),S.push(b.numRectAreaLights),S.push(b.numDirLightShadows),S.push(b.numPointLightShadows),S.push(b.numSpotLightShadows),S.push(b.numSpotLightShadowsWithMaps),S.push(b.numLightProbes),S.push(b.shadowMapType),S.push(b.toneMapping),S.push(b.numClippingPlanes),S.push(b.numClipIntersection),S.push(b.depthPacking)}function v(S,b){a.disableAll(),b.isWebGL2&&a.enable(0),b.supportsVertexTextures&&a.enable(1),b.instancing&&a.enable(2),b.instancingColor&&a.enable(3),b.matcap&&a.enable(4),b.envMap&&a.enable(5),b.normalMapObjectSpace&&a.enable(6),b.normalMapTangentSpace&&a.enable(7),b.clearcoat&&a.enable(8),b.iridescence&&a.enable(9),b.alphaTest&&a.enable(10),b.vertexColors&&a.enable(11),b.vertexAlphas&&a.enable(12),b.vertexUv1s&&a.enable(13),b.vertexUv2s&&a.enable(14),b.vertexUv3s&&a.enable(15),b.vertexTangents&&a.enable(16),b.anisotropy&&a.enable(17),b.alphaHash&&a.enable(18),b.batching&&a.enable(19),S.push(a.mask),a.disableAll(),b.fog&&a.enable(0),b.useFog&&a.enable(1),b.flatShading&&a.enable(2),b.logarithmicDepthBuffer&&a.enable(3),b.skinning&&a.enable(4),b.morphTargets&&a.enable(5),b.morphNormals&&a.enable(6),b.morphColors&&a.enable(7),b.premultipliedAlpha&&a.enable(8),b.shadowMapEnabled&&a.enable(9),b.useLegacyLights&&a.enable(10),b.doubleSided&&a.enable(11),b.flipSided&&a.enable(12),b.useDepthPacking&&a.enable(13),b.dithering&&a.enable(14),b.transmission&&a.enable(15),b.sheen&&a.enable(16),b.opaque&&a.enable(17),b.pointsUvs&&a.enable(18),b.decodeVideoTexture&&a.enable(19),S.push(a.mask)}function P(S){let b=g[S.type],H;if(b){let K=qe[b];H=di.clone(K.uniforms)}else H=S.uniforms;return H}function U(S,b){let H;for(let K=0,T=c.length;K<T;K++){let E=c[K];if(E.cacheKey===b){H=E,++H.usedTimes;break}}return H===void 0&&(H=new Gf(i,b,S,r),c.push(H)),H}function R(S){if(--S.usedTimes===0){let b=c.indexOf(S);c[b]=c[c.length-1],c.pop(),S.destroy()}}function C(S){l.remove(S)}function Y(){l.dispose()}return{getParameters:p,getProgramCacheKey:u,getUniforms:P,acquireProgram:U,releaseProgram:R,releaseShaderCache:C,programs:c,dispose:Y}}function qf(){let i=new WeakMap;function t(r){let o=i.get(r);return o===void 0&&(o={},i.set(r,o)),o}function e(r){i.delete(r)}function n(r,o,a){i.get(r)[o]=a}function s(){i=new WeakMap}return{get:t,remove:e,update:n,dispose:s}}function Yf(i,t){return i.groupOrder!==t.groupOrder?i.groupOrder-t.groupOrder:i.renderOrder!==t.renderOrder?i.renderOrder-t.renderOrder:i.material.id!==t.material.id?i.material.id-t.material.id:i.z!==t.z?i.z-t.z:i.id-t.id}function Fo(i,t){return i.groupOrder!==t.groupOrder?i.groupOrder-t.groupOrder:i.renderOrder!==t.renderOrder?i.renderOrder-t.renderOrder:i.z!==t.z?t.z-i.z:i.id-t.id}function Oo(){let i=[],t=0,e=[],n=[],s=[];function r(){t=0,e.length=0,n.length=0,s.length=0}function o(d,f,m,g,x,p){let u=i[t];return u===void 0?(u={id:d.id,object:d,geometry:f,material:m,groupOrder:g,renderOrder:d.renderOrder,z:x,group:p},i[t]=u):(u.id=d.id,u.object=d,u.geometry=f,u.material=m,u.groupOrder=g,u.renderOrder=d.renderOrder,u.z=x,u.group=p),t++,u}function a(d,f,m,g,x,p){let u=o(d,f,m,g,x,p);m.transmission>0?n.push(u):m.transparent===!0?s.push(u):e.push(u)}function l(d,f,m,g,x,p){let u=o(d,f,m,g,x,p);m.transmission>0?n.unshift(u):m.transparent===!0?s.unshift(u):e.unshift(u)}function c(d,f){e.length>1&&e.sort(d||Yf),n.length>1&&n.sort(f||Fo),s.length>1&&s.sort(f||Fo)}function h(){for(let d=t,f=i.length;d<f;d++){let m=i[d];if(m.id===null)break;m.id=null,m.object=null,m.geometry=null,m.material=null,m.group=null}}return{opaque:e,transmissive:n,transparent:s,init:r,push:a,unshift:l,finish:h,sort:c}}function Zf(){let i=new WeakMap;function t(n,s){let r=i.get(n),o;return r===void 0?(o=new Oo,i.set(n,[o])):s>=r.length?(o=new Oo,r.push(o)):o=r[s],o}function e(){i=new WeakMap}return{get:t,dispose:e}}function Jf(){let i={};return{get:function(t){if(i[t.id]!==void 0)return i[t.id];let e;switch(t.type){case\"DirectionalLight\":e={direction:new N,color:new Pt};break;case\"SpotLight\":e={position:new N,direction:new N,color:new Pt,distance:0,coneCos:0,penumbraCos:0,decay:0};break;case\"PointLight\":e={position:new N,color:new Pt,distance:0,decay:0};break;case\"HemisphereLight\":e={direction:new N,skyColor:new Pt,groundColor:new Pt};break;case\"RectAreaLight\":e={color:new Pt,position:new N,halfWidth:new N,halfHeight:new N};break}return i[t.id]=e,e}}}function $f(){let i={};return{get:function(t){if(i[t.id]!==void 0)return i[t.id];let e;switch(t.type){case\"DirectionalLight\":e={shadowBias:0,shadowNormalBias:0,shadowRadius:1,shadowMapSize:new Lt};break;case\"SpotLight\":e={shadowBias:0,shadowNormalBias:0,shadowRadius:1,shadowMapSize:new Lt};break;case\"PointLight\":e={shadowBias:0,shadowNormalBias:0,shadowRadius:1,shadowMapSize:new Lt,shadowCameraNear:1,shadowCameraFar:1e3};break}return i[t.id]=e,e}}}var Kf=0;function Qf(i,t){return(t.castShadow?2:0)-(i.castShadow?2:0)+(t.map?1:0)-(i.map?1:0)}function jf(i,t){let e=new Jf,n=$f(),s={version:0,hash:{directionalLength:-1,pointLength:-1,spotLength:-1,rectAreaLength:-1,hemiLength:-1,numDirectionalShadows:-1,numPointShadows:-1,numSpotShadows:-1,numSpotMaps:-1,numLightProbes:-1},ambient:[0,0,0],probe:[],directional:[],directionalShadow:[],directionalShadowMap:[],directionalShadowMatrix:[],spot:[],spotLightMap:[],spotShadow:[],spotShadowMap:[],spotLightMatrix:[],rectArea:[],rectAreaLTC1:null,rectAreaLTC2:null,point:[],pointShadow:[],pointShadowMap:[],pointShadowMatrix:[],hemi:[],numSpotLightShadowsWithMaps:0,numLightProbes:0};for(let h=0;h<9;h++)s.probe.push(new N);let r=new N,o=new oe,a=new oe;function l(h,d){let f=0,m=0,g=0;for(let K=0;K<9;K++)s.probe[K].set(0,0,0);let x=0,p=0,u=0,w=0,v=0,P=0,U=0,R=0,C=0,Y=0,S=0;h.sort(Qf);let b=d===!0?Math.PI:1;for(let K=0,T=h.length;K<T;K++){let E=h[K],L=E.color,F=E.intensity,I=E.distance,G=E.shadow&&E.shadow.map?E.shadow.map.texture:null;if(E.isAmbientLight)f+=L.r*F*b,m+=L.g*F*b,g+=L.b*F*b;else if(E.isLightProbe){for(let X=0;X<9;X++)s.probe[X].addScaledVector(E.sh.coefficients[X],F);S++}else if(E.isDirectionalLight){let X=e.get(E);if(X.color.copy(E.color).multiplyScalar(E.intensity*b),E.castShadow){let Z=E.shadow,$=n.get(E);$.shadowBias=Z.bias,$.shadowNormalBias=Z.normalBias,$.shadowRadius=Z.radius,$.shadowMapSize=Z.mapSize,s.directionalShadow[x]=$,s.directionalShadowMap[x]=G,s.directionalShadowMatrix[x]=E.shadow.matrix,P++}s.directional[x]=X,x++}else if(E.isSpotLight){let X=e.get(E);X.position.setFromMatrixPosition(E.matrixWorld),X.color.copy(L).multiplyScalar(F*b),X.distance=I,X.coneCos=Math.cos(E.angle),X.penumbraCos=Math.cos(E.angle*(1-E.penumbra)),X.decay=E.decay,s.spot[u]=X;let Z=E.shadow;if(E.map&&(s.spotLightMap[C]=E.map,C++,Z.updateMatrices(E),E.castShadow&&Y++),s.spotLightMatrix[u]=Z.matrix,E.castShadow){let $=n.get(E);$.shadowBias=Z.bias,$.shadowNormalBias=Z.normalBias,$.shadowRadius=Z.radius,$.shadowMapSize=Z.mapSize,s.spotShadow[u]=$,s.spotShadowMap[u]=G,R++}u++}else if(E.isRectAreaLight){let X=e.get(E);X.color.copy(L).multiplyScalar(F),X.halfWidth.set(E.width*.5,0,0),X.halfHeight.set(0,E.height*.5,0),s.rectArea[w]=X,w++}else if(E.isPointLight){let X=e.get(E);if(X.color.copy(E.color).multiplyScalar(E.intensity*b),X.distance=E.distance,X.decay=E.decay,E.castShadow){let Z=E.shadow,$=n.get(E);$.shadowBias=Z.bias,$.shadowNormalBias=Z.normalBias,$.shadowRadius=Z.radius,$.shadowMapSize=Z.mapSize,$.shadowCameraNear=Z.camera.near,$.shadowCameraFar=Z.camera.far,s.pointShadow[p]=$,s.pointShadowMap[p]=G,s.pointShadowMatrix[p]=E.shadow.matrix,U++}s.point[p]=X,p++}else if(E.isHemisphereLight){let X=e.get(E);X.skyColor.copy(E.color).multiplyScalar(F*b),X.groundColor.copy(E.groundColor).multiplyScalar(F*b),s.hemi[v]=X,v++}}w>0&&(t.isWebGL2?i.has(\"OES_texture_float_linear\")===!0?(s.rectAreaLTC1=it.LTC_FLOAT_1,s.rectAreaLTC2=it.LTC_FLOAT_2):(s.rectAreaLTC1=it.LTC_HALF_1,s.rectAreaLTC2=it.LTC_HALF_2):i.has(\"OES_texture_float_linear\")===!0?(s.rectAreaLTC1=it.LTC_FLOAT_1,s.rectAreaLTC2=it.LTC_FLOAT_2):i.has(\"OES_texture_half_float_linear\")===!0?(s.rectAreaLTC1=it.LTC_HALF_1,s.rectAreaLTC2=it.LTC_HALF_2):console.error(\"THREE.WebGLRenderer: Unable to use RectAreaLight. Missing WebGL extensions.\")),s.ambient[0]=f,s.ambient[1]=m,s.ambient[2]=g;let H=s.hash;(H.directionalLength!==x||H.pointLength!==p||H.spotLength!==u||H.rectAreaLength!==w||H.hemiLength!==v||H.numDirectionalShadows!==P||H.numPointShadows!==U||H.numSpotShadows!==R||H.numSpotMaps!==C||H.numLightProbes!==S)&&(s.directional.length=x,s.spot.length=u,s.rectArea.length=w,s.point.length=p,s.hemi.length=v,s.directionalShadow.length=P,s.directionalShadowMap.length=P,s.pointShadow.length=U,s.pointShadowMap.length=U,s.spotShadow.length=R,s.spotShadowMap.length=R,s.directionalShadowMatrix.length=P,s.pointShadowMatrix.length=U,s.spotLightMatrix.length=R+C-Y,s.spotLightMap.length=C,s.numSpotLightShadowsWithMaps=Y,s.numLightProbes=S,H.directionalLength=x,H.pointLength=p,H.spotLength=u,H.rectAreaLength=w,H.hemiLength=v,H.numDirectionalShadows=P,H.numPointShadows=U,H.numSpotShadows=R,H.numSpotMaps=C,H.numLightProbes=S,s.version=Kf++)}function c(h,d){let f=0,m=0,g=0,x=0,p=0,u=d.matrixWorldInverse;for(let w=0,v=h.length;w<v;w++){let P=h[w];if(P.isDirectionalLight){let U=s.directional[f];U.direction.setFromMatrixPosition(P.matrixWorld),r.setFromMatrixPosition(P.target.matrixWorld),U.direction.sub(r),U.direction.transformDirection(u),f++}else if(P.isSpotLight){let U=s.spot[g];U.position.setFromMatrixPosition(P.matrixWorld),U.position.applyMatrix4(u),U.direction.setFromMatrixPosition(P.matrixWorld),r.setFromMatrixPosition(P.target.matrixWorld),U.direction.sub(r),U.direction.transformDirection(u),g++}else if(P.isRectAreaLight){let U=s.rectArea[x];U.position.setFromMatrixPosition(P.matrixWorld),U.position.applyMatrix4(u),a.identity(),o.copy(P.matrixWorld),o.premultiply(u),a.extractRotation(o),U.halfWidth.set(P.width*.5,0,0),U.halfHeight.set(0,P.height*.5,0),U.halfWidth.applyMatrix4(a),U.halfHeight.applyMatrix4(a),x++}else if(P.isPointLight){let U=s.point[m];U.position.setFromMatrixPosition(P.matrixWorld),U.position.applyMatrix4(u),m++}else if(P.isHemisphereLight){let U=s.hemi[p];U.direction.setFromMatrixPosition(P.matrixWorld),U.direction.transformDirection(u),p++}}}return{setup:l,setupView:c,state:s}}function Bo(i,t){let e=new jf(i,t),n=[],s=[];function r(){n.length=0,s.length=0}function o(d){n.push(d)}function a(d){s.push(d)}function l(d){e.setup(n,d)}function c(d){e.setupView(n,d)}return{init:r,state:{lightsArray:n,shadowsArray:s,lights:e},setupLights:l,setupLightsView:c,pushLight:o,pushShadow:a}}function tp(i,t){let e=new WeakMap;function n(r,o=0){let a=e.get(r),l;return a===void 0?(l=new Bo(i,t),e.set(r,[l])):o>=a.length?(l=new Bo(i,t),a.push(l)):l=a[o],l}function s(){e=new WeakMap}return{get:n,dispose:s}}var Hr=class extends yn{constructor(t){super(),this.isMeshDepthMaterial=!0,this.type=\"MeshDepthMaterial\",this.depthPacking=ac,this.map=null,this.alphaMap=null,this.displacementMap=null,this.displacementScale=1,this.displacementBias=0,this.wireframe=!1,this.wireframeLinewidth=1,this.setValues(t)}copy(t){return super.copy(t),this.depthPacking=t.depthPacking,this.map=t.map,this.alphaMap=t.alphaMap,this.displacementMap=t.displacementMap,this.displacementScale=t.displacementScale,this.displacementBias=t.displacementBias,this.wireframe=t.wireframe,this.wireframeLinewidth=t.wireframeLinewidth,this}},Gr=class extends yn{constructor(t){super(),this.isMeshDistanceMaterial=!0,this.type=\"MeshDistanceMaterial\",this.map=null,this.alphaMap=null,this.displacementMap=null,this.displacementScale=1,this.displacementBias=0,this.setValues(t)}copy(t){return super.copy(t),this.map=t.map,this.alphaMap=t.alphaMap,this.displacementMap=t.displacementMap,this.displacementScale=t.displacementScale,this.displacementBias=t.displacementBias,this}},ep=`void main() {\n\tgl_Position = vec4( position, 1.0 );\n}`,np=`uniform sampler2D shadow_pass;\nuniform vec2 resolution;\nuniform float radius;\n#include <packing>\nvoid main() {\n\tconst float samples = float( VSM_SAMPLES );\n\tfloat mean = 0.0;\n\tfloat squared_mean = 0.0;\n\tfloat uvStride = samples <= 1.0 ? 0.0 : 2.0 / ( samples - 1.0 );\n\tfloat uvStart = samples <= 1.0 ? 0.0 : - 1.0;\n\tfor ( float i = 0.0; i < samples; i ++ ) {\n\t\tfloat uvOffset = uvStart + i * uvStride;\n\t\t#ifdef HORIZONTAL_PASS\n\t\t\tvec2 distribution = unpackRGBATo2Half( texture2D( shadow_pass, ( gl_FragCoord.xy + vec2( uvOffset, 0.0 ) * radius ) / resolution ) );\n\t\t\tmean += distribution.x;\n\t\t\tsquared_mean += distribution.y * distribution.y + distribution.x * distribution.x;\n\t\t#else\n\t\t\tfloat depth = unpackRGBAToDepth( texture2D( shadow_pass, ( gl_FragCoord.xy + vec2( 0.0, uvOffset ) * radius ) / resolution ) );\n\t\t\tmean += depth;\n\t\t\tsquared_mean += depth * depth;\n\t\t#endif\n\t}\n\tmean = mean / samples;\n\tsquared_mean = squared_mean / samples;\n\tfloat std_dev = sqrt( squared_mean - mean * mean );\n\tgl_FragColor = pack2HalfToRGBA( vec2( mean, std_dev ) );\n}`;function ip(i,t,e){let n=new ws,s=new Lt,r=new Lt,o=new he,a=new Hr({depthPacking:oc}),l=new Gr,c={},h=e.maxTextureSize,d={[gn]:we,[we]:gn,[nn]:nn},f=new ue({defines:{VSM_SAMPLES:8},uniforms:{shadow_pass:{value:null},resolution:{value:new Lt},radius:{value:4}},vertexShader:ep,fragmentShader:np}),m=f.clone();m.defines.HORIZONTAL_PASS=1;let g=new Se;g.setAttribute(\"position\",new ye(new Float32Array([-1,-1,.5,3,-1,.5,-1,3,.5]),3));let x=new Ne(g,f),p=this;this.enabled=!1,this.autoUpdate=!0,this.needsUpdate=!1,this.type=Xo;let u=this.type;this.render=function(R,C,Y){if(p.enabled===!1||p.autoUpdate===!1&&p.needsUpdate===!1||R.length===0)return;let S=i.getRenderTarget(),b=i.getActiveCubeFace(),H=i.getActiveMipmapLevel(),K=i.state;K.setBlending(Ye),K.buffers.color.setClear(1,1,1,1),K.buffers.depth.setTest(!0),K.setScissorTest(!1);let T=u!==tn&&this.type===tn,E=u===tn&&this.type!==tn;for(let L=0,F=R.length;L<F;L++){let I=R[L],G=I.shadow;if(G===void 0){console.warn(\"THREE.WebGLShadowMap:\",I,\"has no shadow.\");continue}if(G.autoUpdate===!1&&G.needsUpdate===!1)continue;s.copy(G.mapSize);let X=G.getFrameExtents();if(s.multiply(X),r.copy(G.mapSize),(s.x>h||s.y>h)&&(s.x>h&&(r.x=Math.floor(h/X.x),s.x=r.x*X.x,G.mapSize.x=r.x),s.y>h&&(r.y=Math.floor(h/X.y),s.y=r.y*X.y,G.mapSize.y=r.y)),G.map===null||T===!0||E===!0){let $=this.type!==tn?{minFilter:xe,magFilter:xe}:{};G.map!==null&&G.map.dispose(),G.map=new Me(s.x,s.y,$),G.map.texture.name=I.name+\".shadowMap\",G.camera.updateProjectionMatrix()}i.setRenderTarget(G.map),i.clear();let Z=G.getViewportCount();for(let $=0;$<Z;$++){let et=G.getViewport($);o.set(r.x*et.x,r.y*et.y,r.x*et.z,r.y*et.w),K.viewport(o),G.updateMatrices(I,$),n=G.getFrustum(),P(C,Y,G.camera,I,this.type)}G.isPointLightShadow!==!0&&this.type===tn&&w(G,Y),G.needsUpdate=!1}u=this.type,p.needsUpdate=!1,i.setRenderTarget(S,b,H)};function w(R,C){let Y=t.update(x);f.defines.VSM_SAMPLES!==R.blurSamples&&(f.defines.VSM_SAMPLES=R.blurSamples,m.defines.VSM_SAMPLES=R.blurSamples,f.needsUpdate=!0,m.needsUpdate=!0),R.mapPass===null&&(R.mapPass=new Me(s.x,s.y)),f.uniforms.shadow_pass.value=R.map.texture,f.uniforms.resolution.value=R.mapSize,f.uniforms.radius.value=R.radius,i.setRenderTarget(R.mapPass),i.clear(),i.renderBufferDirect(C,null,Y,f,x,null),m.uniforms.shadow_pass.value=R.mapPass.texture,m.uniforms.resolution.value=R.mapSize,m.uniforms.radius.value=R.radius,i.setRenderTarget(R.map),i.clear(),i.renderBufferDirect(C,null,Y,m,x,null)}function v(R,C,Y,S){let b=null,H=Y.isPointLight===!0?R.customDistanceMaterial:R.customDepthMaterial;if(H!==void 0)b=H;else if(b=Y.isPointLight===!0?l:a,i.localClippingEnabled&&C.clipShadows===!0&&Array.isArray(C.clippingPlanes)&&C.clippingPlanes.length!==0||C.displacementMap&&C.displacementScale!==0||C.alphaMap&&C.alphaTest>0||C.map&&C.alphaTest>0){let K=b.uuid,T=C.uuid,E=c[K];E===void 0&&(E={},c[K]=E);let L=E[T];L===void 0&&(L=b.clone(),E[T]=L,C.addEventListener(\"dispose\",U)),b=L}if(b.visible=C.visible,b.wireframe=C.wireframe,S===tn?b.side=C.shadowSide!==null?C.shadowSide:C.side:b.side=C.shadowSide!==null?C.shadowSide:d[C.side],b.alphaMap=C.alphaMap,b.alphaTest=C.alphaTest,b.map=C.map,b.clipShadows=C.clipShadows,b.clippingPlanes=C.clippingPlanes,b.clipIntersection=C.clipIntersection,b.displacementMap=C.displacementMap,b.displacementScale=C.displacementScale,b.displacementBias=C.displacementBias,b.wireframeLinewidth=C.wireframeLinewidth,b.linewidth=C.linewidth,Y.isPointLight===!0&&b.isMeshDistanceMaterial===!0){let K=i.properties.get(b);K.light=Y}return b}function P(R,C,Y,S,b){if(R.visible===!1)return;if(R.layers.test(C.layers)&&(R.isMesh||R.isLine||R.isPoints)&&(R.castShadow||R.receiveShadow&&b===tn)&&(!R.frustumCulled||n.intersectsObject(R))){R.modelViewMatrix.multiplyMatrices(Y.matrixWorldInverse,R.matrixWorld);let T=t.update(R),E=R.material;if(Array.isArray(E)){let L=T.groups;for(let F=0,I=L.length;F<I;F++){let G=L[F],X=E[G.materialIndex];if(X&&X.visible){let Z=v(R,X,S,b);R.onBeforeShadow(i,R,C,Y,T,Z,G),i.renderBufferDirect(Y,null,T,Z,R,G),R.onAfterShadow(i,R,C,Y,T,Z,G)}}}else if(E.visible){let L=v(R,E,S,b);R.onBeforeShadow(i,R,C,Y,T,L,null),i.renderBufferDirect(Y,null,T,L,R,null),R.onAfterShadow(i,R,C,Y,T,L,null)}}let K=R.children;for(let T=0,E=K.length;T<E;T++)P(K[T],C,Y,S,b)}function U(R){R.target.removeEventListener(\"dispose\",U);for(let Y in c){let S=c[Y],b=R.target.uuid;b in S&&(S[b].dispose(),delete S[b])}}}function sp(i,t,e){let n=e.isWebGL2;function s(){let A=!1,at=new he,ot=null,wt=new he(0,0,0,0);return{setMask:function(Mt){ot!==Mt&&!A&&(i.colorMask(Mt,Mt,Mt,Mt),ot=Mt)},setLocked:function(Mt){A=Mt},setClear:function(Mt,qt,Yt,se,me){me===!0&&(Mt*=se,qt*=se,Yt*=se),at.set(Mt,qt,Yt,se),wt.equals(at)===!1&&(i.clearColor(Mt,qt,Yt,se),wt.copy(at))},reset:function(){A=!1,ot=null,wt.set(-1,0,0,0)}}}function r(){let A=!1,at=null,ot=null,wt=null;return{setTest:function(Mt){Mt?Et(i.DEPTH_TEST):vt(i.DEPTH_TEST)},setMask:function(Mt){at!==Mt&&!A&&(i.depthMask(Mt),at=Mt)},setFunc:function(Mt){if(ot!==Mt){switch(Mt){case Ol:i.depthFunc(i.NEVER);break;case Bl:i.depthFunc(i.ALWAYS);break;case zl:i.depthFunc(i.LESS);break;case ls:i.depthFunc(i.LEQUAL);break;case Vl:i.depthFunc(i.EQUAL);break;case kl:i.depthFunc(i.GEQUAL);break;case Hl:i.depthFunc(i.GREATER);break;case Gl:i.depthFunc(i.NOTEQUAL);break;default:i.depthFunc(i.LEQUAL)}ot=Mt}},setLocked:function(Mt){A=Mt},setClear:function(Mt){wt!==Mt&&(i.clearDepth(Mt),wt=Mt)},reset:function(){A=!1,at=null,ot=null,wt=null}}}function o(){let A=!1,at=null,ot=null,wt=null,Mt=null,qt=null,Yt=null,se=null,me=null;return{setTest:function(Zt){A||(Zt?Et(i.STENCIL_TEST):vt(i.STENCIL_TEST))},setMask:function(Zt){at!==Zt&&!A&&(i.stencilMask(Zt),at=Zt)},setFunc:function(Zt,ge,Xe){(ot!==Zt||wt!==ge||Mt!==Xe)&&(i.stencilFunc(Zt,ge,Xe),ot=Zt,wt=ge,Mt=Xe)},setOp:function(Zt,ge,Xe){(qt!==Zt||Yt!==ge||se!==Xe)&&(i.stencilOp(Zt,ge,Xe),qt=Zt,Yt=ge,se=Xe)},setLocked:function(Zt){A=Zt},setClear:function(Zt){me!==Zt&&(i.clearStencil(Zt),me=Zt)},reset:function(){A=!1,at=null,ot=null,wt=null,Mt=null,qt=null,Yt=null,se=null,me=null}}}let a=new s,l=new r,c=new o,h=new WeakMap,d=new WeakMap,f={},m={},g=new WeakMap,x=[],p=null,u=!1,w=null,v=null,P=null,U=null,R=null,C=null,Y=null,S=new Pt(0,0,0),b=0,H=!1,K=null,T=null,E=null,L=null,F=null,I=i.getParameter(i.MAX_COMBINED_TEXTURE_IMAGE_UNITS),G=!1,X=0,Z=i.getParameter(i.VERSION);Z.indexOf(\"WebGL\")!==-1?(X=parseFloat(/^WebGL (\\d)/.exec(Z)[1]),G=X>=1):Z.indexOf(\"OpenGL ES\")!==-1&&(X=parseFloat(/^OpenGL ES (\\d)/.exec(Z)[1]),G=X>=2);let $=null,et={},W=i.getParameter(i.SCISSOR_BOX),q=i.getParameter(i.VIEWPORT),st=new he().fromArray(W),pt=new he().fromArray(q);function dt(A,at,ot,wt){let Mt=new Uint8Array(4),qt=i.createTexture();i.bindTexture(A,qt),i.texParameteri(A,i.TEXTURE_MIN_FILTER,i.NEAREST),i.texParameteri(A,i.TEXTURE_MAG_FILTER,i.NEAREST);for(let Yt=0;Yt<ot;Yt++)n&&(A===i.TEXTURE_3D||A===i.TEXTURE_2D_ARRAY)?i.texImage3D(at,0,i.RGBA,1,1,wt,0,i.RGBA,i.UNSIGNED_BYTE,Mt):i.texImage2D(at+Yt,0,i.RGBA,1,1,0,i.RGBA,i.UNSIGNED_BYTE,Mt);return qt}let bt={};bt[i.TEXTURE_2D]=dt(i.TEXTURE_2D,i.TEXTURE_2D,1),bt[i.TEXTURE_CUBE_MAP]=dt(i.TEXTURE_CUBE_MAP,i.TEXTURE_CUBE_MAP_POSITIVE_X,6),n&&(bt[i.TEXTURE_2D_ARRAY]=dt(i.TEXTURE_2D_ARRAY,i.TEXTURE_2D_ARRAY,1,1),bt[i.TEXTURE_3D]=dt(i.TEXTURE_3D,i.TEXTURE_3D,1,1)),a.setClear(0,0,0,1),l.setClear(1),c.setClear(0),Et(i.DEPTH_TEST),l.setFunc(ls),gt(!1),M(_a),Et(i.CULL_FACE),ht(Ye);function Et(A){f[A]!==!0&&(i.enable(A),f[A]=!0)}function vt(A){f[A]!==!1&&(i.disable(A),f[A]=!1)}function kt(A,at){return m[A]!==at?(i.bindFramebuffer(A,at),m[A]=at,n&&(A===i.DRAW_FRAMEBUFFER&&(m[i.FRAMEBUFFER]=at),A===i.FRAMEBUFFER&&(m[i.DRAW_FRAMEBUFFER]=at)),!0):!1}function O(A,at){let ot=x,wt=!1;if(A)if(ot=g.get(at),ot===void 0&&(ot=[],g.set(at,ot)),A.isWebGLMultipleRenderTargets){let Mt=A.texture;if(ot.length!==Mt.length||ot[0]!==i.COLOR_ATTACHMENT0){for(let qt=0,Yt=Mt.length;qt<Yt;qt++)ot[qt]=i.COLOR_ATTACHMENT0+qt;ot.length=Mt.length,wt=!0}}else ot[0]!==i.COLOR_ATTACHMENT0&&(ot[0]=i.COLOR_ATTACHMENT0,wt=!0);else ot[0]!==i.BACK&&(ot[0]=i.BACK,wt=!0);wt&&(e.isWebGL2?i.drawBuffers(ot):t.get(\"WEBGL_draw_buffers\").drawBuffersWEBGL(ot))}function le(A){return p!==A?(i.useProgram(A),p=A,!0):!1}let _t={[Cn]:i.FUNC_ADD,[Sl]:i.FUNC_SUBTRACT,[bl]:i.FUNC_REVERSE_SUBTRACT};if(n)_t[ya]=i.MIN,_t[Ma]=i.MAX;else{let A=t.get(\"EXT_blend_minmax\");A!==null&&(_t[ya]=A.MIN_EXT,_t[Ma]=A.MAX_EXT)}let At={[El]:i.ZERO,[wl]:i.ONE,[Tl]:i.SRC_COLOR,[Sr]:i.SRC_ALPHA,[Il]:i.SRC_ALPHA_SATURATE,[Pl]:i.DST_COLOR,[Cl]:i.DST_ALPHA,[Al]:i.ONE_MINUS_SRC_COLOR,[br]:i.ONE_MINUS_SRC_ALPHA,[Ll]:i.ONE_MINUS_DST_COLOR,[Rl]:i.ONE_MINUS_DST_ALPHA,[Ul]:i.CONSTANT_COLOR,[Dl]:i.ONE_MINUS_CONSTANT_COLOR,[Nl]:i.CONSTANT_ALPHA,[Fl]:i.ONE_MINUS_CONSTANT_ALPHA};function ht(A,at,ot,wt,Mt,qt,Yt,se,me,Zt){if(A===Ye){u===!0&&(vt(i.BLEND),u=!1);return}if(u===!1&&(Et(i.BLEND),u=!0),A!==Ml){if(A!==w||Zt!==H){if((v!==Cn||R!==Cn)&&(i.blendEquation(i.FUNC_ADD),v=Cn,R=Cn),Zt)switch(A){case ni:i.blendFuncSeparate(i.ONE,i.ONE_MINUS_SRC_ALPHA,i.ONE,i.ONE_MINUS_SRC_ALPHA);break;case _n:i.blendFunc(i.ONE,i.ONE);break;case xa:i.blendFuncSeparate(i.ZERO,i.ONE_MINUS_SRC_COLOR,i.ZERO,i.ONE);break;case va:i.blendFuncSeparate(i.ZERO,i.SRC_COLOR,i.ZERO,i.SRC_ALPHA);break;default:console.error(\"THREE.WebGLState: Invalid blending: \",A);break}else switch(A){case ni:i.blendFuncSeparate(i.SRC_ALPHA,i.ONE_MINUS_SRC_ALPHA,i.ONE,i.ONE_MINUS_SRC_ALPHA);break;case _n:i.blendFunc(i.SRC_ALPHA,i.ONE);break;case xa:i.blendFuncSeparate(i.ZERO,i.ONE_MINUS_SRC_COLOR,i.ZERO,i.ONE);break;case va:i.blendFunc(i.ZERO,i.SRC_COLOR);break;default:console.error(\"THREE.WebGLState: Invalid blending: \",A);break}P=null,U=null,C=null,Y=null,S.set(0,0,0),b=0,w=A,H=Zt}return}Mt=Mt||at,qt=qt||ot,Yt=Yt||wt,(at!==v||Mt!==R)&&(i.blendEquationSeparate(_t[at],_t[Mt]),v=at,R=Mt),(ot!==P||wt!==U||qt!==C||Yt!==Y)&&(i.blendFuncSeparate(At[ot],At[wt],At[qt],At[Yt]),P=ot,U=wt,C=qt,Y=Yt),(se.equals(S)===!1||me!==b)&&(i.blendColor(se.r,se.g,se.b,me),S.copy(se),b=me),w=A,H=!1}function Xt(A,at){A.side===nn?vt(i.CULL_FACE):Et(i.CULL_FACE);let ot=A.side===we;at&&(ot=!ot),gt(ot),A.blending===ni&&A.transparent===!1?ht(Ye):ht(A.blending,A.blendEquation,A.blendSrc,A.blendDst,A.blendEquationAlpha,A.blendSrcAlpha,A.blendDstAlpha,A.blendColor,A.blendAlpha,A.premultipliedAlpha),l.setFunc(A.depthFunc),l.setTest(A.depthTest),l.setMask(A.depthWrite),a.setMask(A.colorWrite);let wt=A.stencilWrite;c.setTest(wt),wt&&(c.setMask(A.stencilWriteMask),c.setFunc(A.stencilFunc,A.stencilRef,A.stencilFuncMask),c.setOp(A.stencilFail,A.stencilZFail,A.stencilZPass)),B(A.polygonOffset,A.polygonOffsetFactor,A.polygonOffsetUnits),A.alphaToCoverage===!0?Et(i.SAMPLE_ALPHA_TO_COVERAGE):vt(i.SAMPLE_ALPHA_TO_COVERAGE)}function gt(A){K!==A&&(A?i.frontFace(i.CW):i.frontFace(i.CCW),K=A)}function M(A){A!==xl?(Et(i.CULL_FACE),A!==T&&(A===_a?i.cullFace(i.BACK):A===vl?i.cullFace(i.FRONT):i.cullFace(i.FRONT_AND_BACK))):vt(i.CULL_FACE),T=A}function _(A){A!==E&&(G&&i.lineWidth(A),E=A)}function B(A,at,ot){A?(Et(i.POLYGON_OFFSET_FILL),(L!==at||F!==ot)&&(i.polygonOffset(at,ot),L=at,F=ot)):vt(i.POLYGON_OFFSET_FILL)}function Q(A){A?Et(i.SCISSOR_TEST):vt(i.SCISSOR_TEST)}function J(A){A===void 0&&(A=i.TEXTURE0+I-1),$!==A&&(i.activeTexture(A),$=A)}function tt(A,at,ot){ot===void 0&&($===null?ot=i.TEXTURE0+I-1:ot=$);let wt=et[ot];wt===void 0&&(wt={type:void 0,texture:void 0},et[ot]=wt),(wt.type!==A||wt.texture!==at)&&($!==ot&&(i.activeTexture(ot),$=ot),i.bindTexture(A,at||bt[A]),wt.type=A,wt.texture=at)}function ft(){let A=et[$];A!==void 0&&A.type!==void 0&&(i.bindTexture(A.type,null),A.type=void 0,A.texture=void 0)}function rt(){try{i.compressedTexImage2D.apply(i,arguments)}catch(A){console.error(\"THREE.WebGLState:\",A)}}function ct(){try{i.compressedTexImage3D.apply(i,arguments)}catch(A){console.error(\"THREE.WebGLState:\",A)}}function yt(){try{i.texSubImage2D.apply(i,arguments)}catch(A){console.error(\"THREE.WebGLState:\",A)}}function Nt(){try{i.texSubImage3D.apply(i,arguments)}catch(A){console.error(\"THREE.WebGLState:\",A)}}function j(){try{i.compressedTexSubImage2D.apply(i,arguments)}catch(A){console.error(\"THREE.WebGLState:\",A)}}function Gt(){try{i.compressedTexSubImage3D.apply(i,arguments)}catch(A){console.error(\"THREE.WebGLState:\",A)}}function Vt(){try{i.texStorage2D.apply(i,arguments)}catch(A){console.error(\"THREE.WebGLState:\",A)}}function Ct(){try{i.texStorage3D.apply(i,arguments)}catch(A){console.error(\"THREE.WebGLState:\",A)}}function xt(){try{i.texImage2D.apply(i,arguments)}catch(A){console.error(\"THREE.WebGLState:\",A)}}function ut(){try{i.texImage3D.apply(i,arguments)}catch(A){console.error(\"THREE.WebGLState:\",A)}}function Ut(A){st.equals(A)===!1&&(i.scissor(A.x,A.y,A.z,A.w),st.copy(A))}function Ht(A){pt.equals(A)===!1&&(i.viewport(A.x,A.y,A.z,A.w),pt.copy(A))}function Qt(A,at){let ot=d.get(at);ot===void 0&&(ot=new WeakMap,d.set(at,ot));let wt=ot.get(A);wt===void 0&&(wt=i.getUniformBlockIndex(at,A.name),ot.set(A,wt))}function Ot(A,at){let wt=d.get(at).get(A);h.get(at)!==wt&&(i.uniformBlockBinding(at,wt,A.__bindingPointIndex),h.set(at,wt))}function nt(){i.disable(i.BLEND),i.disable(i.CULL_FACE),i.disable(i.DEPTH_TEST),i.disable(i.POLYGON_OFFSET_FILL),i.disable(i.SCISSOR_TEST),i.disable(i.STENCIL_TEST),i.disable(i.SAMPLE_ALPHA_TO_COVERAGE),i.blendEquation(i.FUNC_ADD),i.blendFunc(i.ONE,i.ZERO),i.blendFuncSeparate(i.ONE,i.ZERO,i.ONE,i.ZERO),i.blendColor(0,0,0,0),i.colorMask(!0,!0,!0,!0),i.clearColor(0,0,0,0),i.depthMask(!0),i.depthFunc(i.LESS),i.clearDepth(1),i.stencilMask(4294967295),i.stencilFunc(i.ALWAYS,0,4294967295),i.stencilOp(i.KEEP,i.KEEP,i.KEEP),i.clearStencil(0),i.cullFace(i.BACK),i.frontFace(i.CCW),i.polygonOffset(0,0),i.activeTexture(i.TEXTURE0),i.bindFramebuffer(i.FRAMEBUFFER,null),n===!0&&(i.bindFramebuffer(i.DRAW_FRAMEBUFFER,null),i.bindFramebuffer(i.READ_FRAMEBUFFER,null)),i.useProgram(null),i.lineWidth(1),i.scissor(0,0,i.canvas.width,i.canvas.height),i.viewport(0,0,i.canvas.width,i.canvas.height),f={},$=null,et={},m={},g=new WeakMap,x=[],p=null,u=!1,w=null,v=null,P=null,U=null,R=null,C=null,Y=null,S=new Pt(0,0,0),b=0,H=!1,K=null,T=null,E=null,L=null,F=null,st.set(0,0,i.canvas.width,i.canvas.height),pt.set(0,0,i.canvas.width,i.canvas.height),a.reset(),l.reset(),c.reset()}return{buffers:{color:a,depth:l,stencil:c},enable:Et,disable:vt,bindFramebuffer:kt,drawBuffers:O,useProgram:le,setBlending:ht,setMaterial:Xt,setFlipSided:gt,setCullFace:M,setLineWidth:_,setPolygonOffset:B,setScissorTest:Q,activeTexture:J,bindTexture:tt,unbindTexture:ft,compressedTexImage2D:rt,compressedTexImage3D:ct,texImage2D:xt,texImage3D:ut,updateUBOMapping:Qt,uniformBlockBinding:Ot,texStorage2D:Vt,texStorage3D:Ct,texSubImage2D:yt,texSubImage3D:Nt,compressedTexSubImage2D:j,compressedTexSubImage3D:Gt,scissor:Ut,viewport:Ht,reset:nt}}function rp(i,t,e,n,s,r,o){let a=s.isWebGL2,l=t.has(\"WEBGL_multisampled_render_to_texture\")?t.get(\"WEBGL_multisampled_render_to_texture\"):null,c=typeof navigator>\"u\"?!1:/OculusBrowser/g.test(navigator.userAgent),h=new WeakMap,d,f=new WeakMap,m=!1;try{m=typeof OffscreenCanvas<\"u\"&&new OffscreenCanvas(1,1).getContext(\"2d\")!==null}catch{}function g(M,_){return m?new OffscreenCanvas(M,_):ms(\"canvas\")}function x(M,_,B,Q){let J=1;if((M.width>Q||M.height>Q)&&(J=Q/Math.max(M.width,M.height)),J<1||_===!0)if(typeof HTMLImageElement<\"u\"&&M instanceof HTMLImageElement||typeof HTMLCanvasElement<\"u\"&&M instanceof HTMLCanvasElement||typeof ImageBitmap<\"u\"&&M instanceof ImageBitmap){let tt=_?Pr:Math.floor,ft=tt(J*M.width),rt=tt(J*M.height);d===void 0&&(d=g(ft,rt));let ct=B?g(ft,rt):d;return ct.width=ft,ct.height=rt,ct.getContext(\"2d\").drawImage(M,0,0,ft,rt),console.warn(\"THREE.WebGLRenderer: Texture has been resized from (\"+M.width+\"x\"+M.height+\") to (\"+ft+\"x\"+rt+\").\"),ct}else return\"data\"in M&&console.warn(\"THREE.WebGLRenderer: Image in DataTexture is too big (\"+M.width+\"x\"+M.height+\").\"),M;return M}function p(M){return to(M.width)&&to(M.height)}function u(M){return a?!1:M.wrapS!==ze||M.wrapT!==ze||M.minFilter!==xe&&M.minFilter!==Ue}function w(M,_){return M.generateMipmaps&&_&&M.minFilter!==xe&&M.minFilter!==Ue}function v(M){i.generateMipmap(M)}function P(M,_,B,Q,J=!1){if(a===!1)return _;if(M!==null){if(i[M]!==void 0)return i[M];console.warn(\"THREE.WebGLRenderer: Attempt to use non-existing WebGL internal format '\"+M+\"'\")}let tt=_;if(_===i.RED&&(B===i.FLOAT&&(tt=i.R32F),B===i.HALF_FLOAT&&(tt=i.R16F),B===i.UNSIGNED_BYTE&&(tt=i.R8)),_===i.RED_INTEGER&&(B===i.UNSIGNED_BYTE&&(tt=i.R8UI),B===i.UNSIGNED_SHORT&&(tt=i.R16UI),B===i.UNSIGNED_INT&&(tt=i.R32UI),B===i.BYTE&&(tt=i.R8I),B===i.SHORT&&(tt=i.R16I),B===i.INT&&(tt=i.R32I)),_===i.RG&&(B===i.FLOAT&&(tt=i.RG32F),B===i.HALF_FLOAT&&(tt=i.RG16F),B===i.UNSIGNED_BYTE&&(tt=i.RG8)),_===i.RGBA){let ft=J?us:Wt.getTransfer(Q);B===i.FLOAT&&(tt=i.RGBA32F),B===i.HALF_FLOAT&&(tt=i.RGBA16F),B===i.UNSIGNED_BYTE&&(tt=ft===Jt?i.SRGB8_ALPHA8:i.RGBA8),B===i.UNSIGNED_SHORT_4_4_4_4&&(tt=i.RGBA4),B===i.UNSIGNED_SHORT_5_5_5_1&&(tt=i.RGB5_A1)}return(tt===i.R16F||tt===i.R32F||tt===i.RG16F||tt===i.RG32F||tt===i.RGBA16F||tt===i.RGBA32F)&&t.get(\"EXT_color_buffer_float\"),tt}function U(M,_,B){return w(M,B)===!0||M.isFramebufferTexture&&M.minFilter!==xe&&M.minFilter!==Ue?Math.log2(Math.max(_.width,_.height))+1:M.mipmaps!==void 0&&M.mipmaps.length>0?M.mipmaps.length:M.isCompressedTexture&&Array.isArray(M.image)?_.mipmaps.length:1}function R(M){return M===xe||M===Sa||M===Ws?i.NEAREST:i.LINEAR}function C(M){let _=M.target;_.removeEventListener(\"dispose\",C),S(_),_.isVideoTexture&&h.delete(_)}function Y(M){let _=M.target;_.removeEventListener(\"dispose\",Y),H(_)}function S(M){let _=n.get(M);if(_.__webglInit===void 0)return;let B=M.source,Q=f.get(B);if(Q){let J=Q[_.__cacheKey];J.usedTimes--,J.usedTimes===0&&b(M),Object.keys(Q).length===0&&f.delete(B)}n.remove(M)}function b(M){let _=n.get(M);i.deleteTexture(_.__webglTexture);let B=M.source,Q=f.get(B);delete Q[_.__cacheKey],o.memory.textures--}function H(M){let _=M.texture,B=n.get(M),Q=n.get(_);if(Q.__webglTexture!==void 0&&(i.deleteTexture(Q.__webglTexture),o.memory.textures--),M.depthTexture&&M.depthTexture.dispose(),M.isWebGLCubeRenderTarget)for(let J=0;J<6;J++){if(Array.isArray(B.__webglFramebuffer[J]))for(let tt=0;tt<B.__webglFramebuffer[J].length;tt++)i.deleteFramebuffer(B.__webglFramebuffer[J][tt]);else i.deleteFramebuffer(B.__webglFramebuffer[J]);B.__webglDepthbuffer&&i.deleteRenderbuffer(B.__webglDepthbuffer[J])}else{if(Array.isArray(B.__webglFramebuffer))for(let J=0;J<B.__webglFramebuffer.length;J++)i.deleteFramebuffer(B.__webglFramebuffer[J]);else i.deleteFramebuffer(B.__webglFramebuffer);if(B.__webglDepthbuffer&&i.deleteRenderbuffer(B.__webglDepthbuffer),B.__webglMultisampledFramebuffer&&i.deleteFramebuffer(B.__webglMultisampledFramebuffer),B.__webglColorRenderbuffer)for(let J=0;J<B.__webglColorRenderbuffer.length;J++)B.__webglColorRenderbuffer[J]&&i.deleteRenderbuffer(B.__webglColorRenderbuffer[J]);B.__webglDepthRenderbuffer&&i.deleteRenderbuffer(B.__webglDepthRenderbuffer)}if(M.isWebGLMultipleRenderTargets)for(let J=0,tt=_.length;J<tt;J++){let ft=n.get(_[J]);ft.__webglTexture&&(i.deleteTexture(ft.__webglTexture),o.memory.textures--),n.remove(_[J])}n.remove(_),n.remove(M)}let K=0;function T(){K=0}function E(){let M=K;return M>=s.maxTextures&&console.warn(\"THREE.WebGLTextures: Trying to use \"+M+\" texture units while this GPU supports only \"+s.maxTextures),K+=1,M}function L(M){let _=[];return _.push(M.wrapS),_.push(M.wrapT),_.push(M.wrapR||0),_.push(M.magFilter),_.push(M.minFilter),_.push(M.anisotropy),_.push(M.internalFormat),_.push(M.format),_.push(M.type),_.push(M.generateMipmaps),_.push(M.premultiplyAlpha),_.push(M.flipY),_.push(M.unpackAlignment),_.push(M.colorSpace),_.join()}function F(M,_){let B=n.get(M);if(M.isVideoTexture&&Xt(M),M.isRenderTargetTexture===!1&&M.version>0&&B.__version!==M.version){let Q=M.image;if(Q===null)console.warn(\"THREE.WebGLRenderer: Texture marked for update but no image data found.\");else if(Q.complete===!1)console.warn(\"THREE.WebGLRenderer: Texture marked for update but image is incomplete\");else{st(B,M,_);return}}e.bindTexture(i.TEXTURE_2D,B.__webglTexture,i.TEXTURE0+_)}function I(M,_){let B=n.get(M);if(M.version>0&&B.__version!==M.version){st(B,M,_);return}e.bindTexture(i.TEXTURE_2D_ARRAY,B.__webglTexture,i.TEXTURE0+_)}function G(M,_){let B=n.get(M);if(M.version>0&&B.__version!==M.version){st(B,M,_);return}e.bindTexture(i.TEXTURE_3D,B.__webglTexture,i.TEXTURE0+_)}function X(M,_){let B=n.get(M);if(M.version>0&&B.__version!==M.version){pt(B,M,_);return}e.bindTexture(i.TEXTURE_CUBE_MAP,B.__webglTexture,i.TEXTURE0+_)}let Z={[Tr]:i.REPEAT,[ze]:i.CLAMP_TO_EDGE,[Ar]:i.MIRRORED_REPEAT},$={[xe]:i.NEAREST,[Sa]:i.NEAREST_MIPMAP_NEAREST,[Ws]:i.NEAREST_MIPMAP_LINEAR,[Ue]:i.LINEAR,[Kl]:i.LINEAR_MIPMAP_NEAREST,[Ei]:i.LINEAR_MIPMAP_LINEAR},et={[hc]:i.NEVER,[gc]:i.ALWAYS,[uc]:i.LESS,[nl]:i.LEQUAL,[dc]:i.EQUAL,[mc]:i.GEQUAL,[fc]:i.GREATER,[pc]:i.NOTEQUAL};function W(M,_,B){if(B?(i.texParameteri(M,i.TEXTURE_WRAP_S,Z[_.wrapS]),i.texParameteri(M,i.TEXTURE_WRAP_T,Z[_.wrapT]),(M===i.TEXTURE_3D||M===i.TEXTURE_2D_ARRAY)&&i.texParameteri(M,i.TEXTURE_WRAP_R,Z[_.wrapR]),i.texParameteri(M,i.TEXTURE_MAG_FILTER,$[_.magFilter]),i.texParameteri(M,i.TEXTURE_MIN_FILTER,$[_.minFilter])):(i.texParameteri(M,i.TEXTURE_WRAP_S,i.CLAMP_TO_EDGE),i.texParameteri(M,i.TEXTURE_WRAP_T,i.CLAMP_TO_EDGE),(M===i.TEXTURE_3D||M===i.TEXTURE_2D_ARRAY)&&i.texParameteri(M,i.TEXTURE_WRAP_R,i.CLAMP_TO_EDGE),(_.wrapS!==ze||_.wrapT!==ze)&&console.warn(\"THREE.WebGLRenderer: Texture is not power of two. Texture.wrapS and Texture.wrapT should be set to THREE.ClampToEdgeWrapping.\"),i.texParameteri(M,i.TEXTURE_MAG_FILTER,R(_.magFilter)),i.texParameteri(M,i.TEXTURE_MIN_FILTER,R(_.minFilter)),_.minFilter!==xe&&_.minFilter!==Ue&&console.warn(\"THREE.WebGLRenderer: Texture is not power of two. Texture.minFilter should be set to THREE.NearestFilter or THREE.LinearFilter.\")),_.compareFunction&&(i.texParameteri(M,i.TEXTURE_COMPARE_MODE,i.COMPARE_REF_TO_TEXTURE),i.texParameteri(M,i.TEXTURE_COMPARE_FUNC,et[_.compareFunction])),t.has(\"EXT_texture_filter_anisotropic\")===!0){let Q=t.get(\"EXT_texture_filter_anisotropic\");if(_.magFilter===xe||_.minFilter!==Ws&&_.minFilter!==Ei||_.type===dn&&t.has(\"OES_texture_float_linear\")===!1||a===!1&&_.type===ke&&t.has(\"OES_texture_half_float_linear\")===!1)return;(_.anisotropy>1||n.get(_).__currentAnisotropy)&&(i.texParameterf(M,Q.TEXTURE_MAX_ANISOTROPY_EXT,Math.min(_.anisotropy,s.getMaxAnisotropy())),n.get(_).__currentAnisotropy=_.anisotropy)}}function q(M,_){let B=!1;M.__webglInit===void 0&&(M.__webglInit=!0,_.addEventListener(\"dispose\",C));let Q=_.source,J=f.get(Q);J===void 0&&(J={},f.set(Q,J));let tt=L(_);if(tt!==M.__cacheKey){J[tt]===void 0&&(J[tt]={texture:i.createTexture(),usedTimes:0},o.memory.textures++,B=!0),J[tt].usedTimes++;let ft=J[M.__cacheKey];ft!==void 0&&(J[M.__cacheKey].usedTimes--,ft.usedTimes===0&&b(_)),M.__cacheKey=tt,M.__webglTexture=J[tt].texture}return B}function st(M,_,B){let Q=i.TEXTURE_2D;(_.isDataArrayTexture||_.isCompressedArrayTexture)&&(Q=i.TEXTURE_2D_ARRAY),_.isData3DTexture&&(Q=i.TEXTURE_3D);let J=q(M,_),tt=_.source;e.bindTexture(Q,M.__webglTexture,i.TEXTURE0+B);let ft=n.get(tt);if(tt.version!==ft.__version||J===!0){e.activeTexture(i.TEXTURE0+B);let rt=Wt.getPrimaries(Wt.workingColorSpace),ct=_.colorSpace===De?null:Wt.getPrimaries(_.colorSpace),yt=_.colorSpace===De||rt===ct?i.NONE:i.BROWSER_DEFAULT_WEBGL;i.pixelStorei(i.UNPACK_FLIP_Y_WEBGL,_.flipY),i.pixelStorei(i.UNPACK_PREMULTIPLY_ALPHA_WEBGL,_.premultiplyAlpha),i.pixelStorei(i.UNPACK_ALIGNMENT,_.unpackAlignment),i.pixelStorei(i.UNPACK_COLORSPACE_CONVERSION_WEBGL,yt);let Nt=u(_)&&p(_.image)===!1,j=x(_.image,Nt,!1,s.maxTextureSize);j=gt(_,j);let Gt=p(j)||a,Vt=r.convert(_.format,_.colorSpace),Ct=r.convert(_.type),xt=P(_.internalFormat,Vt,Ct,_.colorSpace,_.isVideoTexture);W(Q,_,Gt);let ut,Ut=_.mipmaps,Ht=a&&_.isVideoTexture!==!0&&xt!==tl,Qt=ft.__version===void 0||J===!0,Ot=U(_,j,Gt);if(_.isDepthTexture)xt=i.DEPTH_COMPONENT,a?_.type===dn?xt=i.DEPTH_COMPONENT32F:_.type===un?xt=i.DEPTH_COMPONENT24:_.type===Pn?xt=i.DEPTH24_STENCIL8:xt=i.DEPTH_COMPONENT16:_.type===dn&&console.error(\"WebGLRenderer: Floating point depth texture requires WebGL2.\"),_.format===Ln&&xt===i.DEPTH_COMPONENT&&_.type!==ra&&_.type!==un&&(console.warn(\"THREE.WebGLRenderer: Use UnsignedShortType or UnsignedIntType for DepthFormat DepthTexture.\"),_.type=un,Ct=r.convert(_.type)),_.format===oi&&xt===i.DEPTH_COMPONENT&&(xt=i.DEPTH_STENCIL,_.type!==Pn&&(console.warn(\"THREE.WebGLRenderer: Use UnsignedInt248Type for DepthStencilFormat DepthTexture.\"),_.type=Pn,Ct=r.convert(_.type))),Qt&&(Ht?e.texStorage2D(i.TEXTURE_2D,1,xt,j.width,j.height):e.texImage2D(i.TEXTURE_2D,0,xt,j.width,j.height,0,Vt,Ct,null));else if(_.isDataTexture)if(Ut.length>0&&Gt){Ht&&Qt&&e.texStorage2D(i.TEXTURE_2D,Ot,xt,Ut[0].width,Ut[0].height);for(let nt=0,A=Ut.length;nt<A;nt++)ut=Ut[nt],Ht?e.texSubImage2D(i.TEXTURE_2D,nt,0,0,ut.width,ut.height,Vt,Ct,ut.data):e.texImage2D(i.TEXTURE_2D,nt,xt,ut.width,ut.height,0,Vt,Ct,ut.data);_.generateMipmaps=!1}else Ht?(Qt&&e.texStorage2D(i.TEXTURE_2D,Ot,xt,j.width,j.height),e.texSubImage2D(i.TEXTURE_2D,0,0,0,j.width,j.height,Vt,Ct,j.data)):e.texImage2D(i.TEXTURE_2D,0,xt,j.width,j.height,0,Vt,Ct,j.data);else if(_.isCompressedTexture)if(_.isCompressedArrayTexture){Ht&&Qt&&e.texStorage3D(i.TEXTURE_2D_ARRAY,Ot,xt,Ut[0].width,Ut[0].height,j.depth);for(let nt=0,A=Ut.length;nt<A;nt++)ut=Ut[nt],_.format!==Ve?Vt!==null?Ht?e.compressedTexSubImage3D(i.TEXTURE_2D_ARRAY,nt,0,0,0,ut.width,ut.height,j.depth,Vt,ut.data,0,0):e.compressedTexImage3D(i.TEXTURE_2D_ARRAY,nt,xt,ut.width,ut.height,j.depth,0,ut.data,0,0):console.warn(\"THREE.WebGLRenderer: Attempt to load unsupported compressed texture format in .uploadTexture()\"):Ht?e.texSubImage3D(i.TEXTURE_2D_ARRAY,nt,0,0,0,ut.width,ut.height,j.depth,Vt,Ct,ut.data):e.texImage3D(i.TEXTURE_2D_ARRAY,nt,xt,ut.width,ut.height,j.depth,0,Vt,Ct,ut.data)}else{Ht&&Qt&&e.texStorage2D(i.TEXTURE_2D,Ot,xt,Ut[0].width,Ut[0].height);for(let nt=0,A=Ut.length;nt<A;nt++)ut=Ut[nt],_.format!==Ve?Vt!==null?Ht?e.compressedTexSubImage2D(i.TEXTURE_2D,nt,0,0,ut.width,ut.height,Vt,ut.data):e.compressedTexImage2D(i.TEXTURE_2D,nt,xt,ut.width,ut.height,0,ut.data):console.warn(\"THREE.WebGLRenderer: Attempt to load unsupported compressed texture format in .uploadTexture()\"):Ht?e.texSubImage2D(i.TEXTURE_2D,nt,0,0,ut.width,ut.height,Vt,Ct,ut.data):e.texImage2D(i.TEXTURE_2D,nt,xt,ut.width,ut.height,0,Vt,Ct,ut.data)}else if(_.isDataArrayTexture)Ht?(Qt&&e.texStorage3D(i.TEXTURE_2D_ARRAY,Ot,xt,j.width,j.height,j.depth),e.texSubImage3D(i.TEXTURE_2D_ARRAY,0,0,0,0,j.width,j.height,j.depth,Vt,Ct,j.data)):e.texImage3D(i.TEXTURE_2D_ARRAY,0,xt,j.width,j.height,j.depth,0,Vt,Ct,j.data);else if(_.isData3DTexture)Ht?(Qt&&e.texStorage3D(i.TEXTURE_3D,Ot,xt,j.width,j.height,j.depth),e.texSubImage3D(i.TEXTURE_3D,0,0,0,0,j.width,j.height,j.depth,Vt,Ct,j.data)):e.texImage3D(i.TEXTURE_3D,0,xt,j.width,j.height,j.depth,0,Vt,Ct,j.data);else if(_.isFramebufferTexture){if(Qt)if(Ht)e.texStorage2D(i.TEXTURE_2D,Ot,xt,j.width,j.height);else{let nt=j.width,A=j.height;for(let at=0;at<Ot;at++)e.texImage2D(i.TEXTURE_2D,at,xt,nt,A,0,Vt,Ct,null),nt>>=1,A>>=1}}else if(Ut.length>0&&Gt){Ht&&Qt&&e.texStorage2D(i.TEXTURE_2D,Ot,xt,Ut[0].width,Ut[0].height);for(let nt=0,A=Ut.length;nt<A;nt++)ut=Ut[nt],Ht?e.texSubImage2D(i.TEXTURE_2D,nt,0,0,Vt,Ct,ut):e.texImage2D(i.TEXTURE_2D,nt,xt,Vt,Ct,ut);_.generateMipmaps=!1}else Ht?(Qt&&e.texStorage2D(i.TEXTURE_2D,Ot,xt,j.width,j.height),e.texSubImage2D(i.TEXTURE_2D,0,0,0,Vt,Ct,j)):e.texImage2D(i.TEXTURE_2D,0,xt,Vt,Ct,j);w(_,Gt)&&v(Q),ft.__version=tt.version,_.onUpdate&&_.onUpdate(_)}M.__version=_.version}function pt(M,_,B){if(_.image.length!==6)return;let Q=q(M,_),J=_.source;e.bindTexture(i.TEXTURE_CUBE_MAP,M.__webglTexture,i.TEXTURE0+B);let tt=n.get(J);if(J.version!==tt.__version||Q===!0){e.activeTexture(i.TEXTURE0+B);let ft=Wt.getPrimaries(Wt.workingColorSpace),rt=_.colorSpace===De?null:Wt.getPrimaries(_.colorSpace),ct=_.colorSpace===De||ft===rt?i.NONE:i.BROWSER_DEFAULT_WEBGL;i.pixelStorei(i.UNPACK_FLIP_Y_WEBGL,_.flipY),i.pixelStorei(i.UNPACK_PREMULTIPLY_ALPHA_WEBGL,_.premultiplyAlpha),i.pixelStorei(i.UNPACK_ALIGNMENT,_.unpackAlignment),i.pixelStorei(i.UNPACK_COLORSPACE_CONVERSION_WEBGL,ct);let yt=_.isCompressedTexture||_.image[0].isCompressedTexture,Nt=_.image[0]&&_.image[0].isDataTexture,j=[];for(let nt=0;nt<6;nt++)!yt&&!Nt?j[nt]=x(_.image[nt],!1,!0,s.maxCubemapSize):j[nt]=Nt?_.image[nt].image:_.image[nt],j[nt]=gt(_,j[nt]);let Gt=j[0],Vt=p(Gt)||a,Ct=r.convert(_.format,_.colorSpace),xt=r.convert(_.type),ut=P(_.internalFormat,Ct,xt,_.colorSpace),Ut=a&&_.isVideoTexture!==!0,Ht=tt.__version===void 0||Q===!0,Qt=U(_,Gt,Vt);W(i.TEXTURE_CUBE_MAP,_,Vt);let Ot;if(yt){Ut&&Ht&&e.texStorage2D(i.TEXTURE_CUBE_MAP,Qt,ut,Gt.width,Gt.height);for(let nt=0;nt<6;nt++){Ot=j[nt].mipmaps;for(let A=0;A<Ot.length;A++){let at=Ot[A];_.format!==Ve?Ct!==null?Ut?e.compressedTexSubImage2D(i.TEXTURE_CUBE_MAP_POSITIVE_X+nt,A,0,0,at.width,at.height,Ct,at.data):e.compressedTexImage2D(i.TEXTURE_CUBE_MAP_POSITIVE_X+nt,A,ut,at.width,at.height,0,at.data):console.warn(\"THREE.WebGLRenderer: Attempt to load unsupported compressed texture format in .setTextureCube()\"):Ut?e.texSubImage2D(i.TEXTURE_CUBE_MAP_POSITIVE_X+nt,A,0,0,at.width,at.height,Ct,xt,at.data):e.texImage2D(i.TEXTURE_CUBE_MAP_POSITIVE_X+nt,A,ut,at.width,at.height,0,Ct,xt,at.data)}}}else{Ot=_.mipmaps,Ut&&Ht&&(Ot.length>0&&Qt++,e.texStorage2D(i.TEXTURE_CUBE_MAP,Qt,ut,j[0].width,j[0].height));for(let nt=0;nt<6;nt++)if(Nt){Ut?e.texSubImage2D(i.TEXTURE_CUBE_MAP_POSITIVE_X+nt,0,0,0,j[nt].width,j[nt].height,Ct,xt,j[nt].data):e.texImage2D(i.TEXTURE_CUBE_MAP_POSITIVE_X+nt,0,ut,j[nt].width,j[nt].height,0,Ct,xt,j[nt].data);for(let A=0;A<Ot.length;A++){let ot=Ot[A].image[nt].image;Ut?e.texSubImage2D(i.TEXTURE_CUBE_MAP_POSITIVE_X+nt,A+1,0,0,ot.width,ot.height,Ct,xt,ot.data):e.texImage2D(i.TEXTURE_CUBE_MAP_POSITIVE_X+nt,A+1,ut,ot.width,ot.height,0,Ct,xt,ot.data)}}else{Ut?e.texSubImage2D(i.TEXTURE_CUBE_MAP_POSITIVE_X+nt,0,0,0,Ct,xt,j[nt]):e.texImage2D(i.TEXTURE_CUBE_MAP_POSITIVE_X+nt,0,ut,Ct,xt,j[nt]);for(let A=0;A<Ot.length;A++){let at=Ot[A];Ut?e.texSubImage2D(i.TEXTURE_CUBE_MAP_POSITIVE_X+nt,A+1,0,0,Ct,xt,at.image[nt]):e.texImage2D(i.TEXTURE_CUBE_MAP_POSITIVE_X+nt,A+1,ut,Ct,xt,at.image[nt])}}}w(_,Vt)&&v(i.TEXTURE_CUBE_MAP),tt.__version=J.version,_.onUpdate&&_.onUpdate(_)}M.__version=_.version}function dt(M,_,B,Q,J,tt){let ft=r.convert(B.format,B.colorSpace),rt=r.convert(B.type),ct=P(B.internalFormat,ft,rt,B.colorSpace);if(!n.get(_).__hasExternalTextures){let Nt=Math.max(1,_.width>>tt),j=Math.max(1,_.height>>tt);J===i.TEXTURE_3D||J===i.TEXTURE_2D_ARRAY?e.texImage3D(J,tt,ct,Nt,j,_.depth,0,ft,rt,null):e.texImage2D(J,tt,ct,Nt,j,0,ft,rt,null)}e.bindFramebuffer(i.FRAMEBUFFER,M),ht(_)?l.framebufferTexture2DMultisampleEXT(i.FRAMEBUFFER,Q,J,n.get(B).__webglTexture,0,At(_)):(J===i.TEXTURE_2D||J>=i.TEXTURE_CUBE_MAP_POSITIVE_X&&J<=i.TEXTURE_CUBE_MAP_NEGATIVE_Z)&&i.framebufferTexture2D(i.FRAMEBUFFER,Q,J,n.get(B).__webglTexture,tt),e.bindFramebuffer(i.FRAMEBUFFER,null)}function bt(M,_,B){if(i.bindRenderbuffer(i.RENDERBUFFER,M),_.depthBuffer&&!_.stencilBuffer){let Q=a===!0?i.DEPTH_COMPONENT24:i.DEPTH_COMPONENT16;if(B||ht(_)){let J=_.depthTexture;J&&J.isDepthTexture&&(J.type===dn?Q=i.DEPTH_COMPONENT32F:J.type===un&&(Q=i.DEPTH_COMPONENT24));let tt=At(_);ht(_)?l.renderbufferStorageMultisampleEXT(i.RENDERBUFFER,tt,Q,_.width,_.height):i.renderbufferStorageMultisample(i.RENDERBUFFER,tt,Q,_.width,_.height)}else i.renderbufferStorage(i.RENDERBUFFER,Q,_.width,_.height);i.framebufferRenderbuffer(i.FRAMEBUFFER,i.DEPTH_ATTACHMENT,i.RENDERBUFFER,M)}else if(_.depthBuffer&&_.stencilBuffer){let Q=At(_);B&&ht(_)===!1?i.renderbufferStorageMultisample(i.RENDERBUFFER,Q,i.DEPTH24_STENCIL8,_.width,_.height):ht(_)?l.renderbufferStorageMultisampleEXT(i.RENDERBUFFER,Q,i.DEPTH24_STENCIL8,_.width,_.height):i.renderbufferStorage(i.RENDERBUFFER,i.DEPTH_STENCIL,_.width,_.height),i.framebufferRenderbuffer(i.FRAMEBUFFER,i.DEPTH_STENCIL_ATTACHMENT,i.RENDERBUFFER,M)}else{let Q=_.isWebGLMultipleRenderTargets===!0?_.texture:[_.texture];for(let J=0;J<Q.length;J++){let tt=Q[J],ft=r.convert(tt.format,tt.colorSpace),rt=r.convert(tt.type),ct=P(tt.internalFormat,ft,rt,tt.colorSpace),yt=At(_);B&&ht(_)===!1?i.renderbufferStorageMultisample(i.RENDERBUFFER,yt,ct,_.width,_.height):ht(_)?l.renderbufferStorageMultisampleEXT(i.RENDERBUFFER,yt,ct,_.width,_.height):i.renderbufferStorage(i.RENDERBUFFER,ct,_.width,_.height)}}i.bindRenderbuffer(i.RENDERBUFFER,null)}function Et(M,_){if(_&&_.isWebGLCubeRenderTarget)throw new Error(\"Depth Texture with cube render targets is not supported\");if(e.bindFramebuffer(i.FRAMEBUFFER,M),!(_.depthTexture&&_.depthTexture.isDepthTexture))throw new Error(\"renderTarget.depthTexture must be an instance of THREE.DepthTexture\");(!n.get(_.depthTexture).__webglTexture||_.depthTexture.image.width!==_.width||_.depthTexture.image.height!==_.height)&&(_.depthTexture.image.width=_.width,_.depthTexture.image.height=_.height,_.depthTexture.needsUpdate=!0),F(_.depthTexture,0);let Q=n.get(_.depthTexture).__webglTexture,J=At(_);if(_.depthTexture.format===Ln)ht(_)?l.framebufferTexture2DMultisampleEXT(i.FRAMEBUFFER,i.DEPTH_ATTACHMENT,i.TEXTURE_2D,Q,0,J):i.framebufferTexture2D(i.FRAMEBUFFER,i.DEPTH_ATTACHMENT,i.TEXTURE_2D,Q,0);else if(_.depthTexture.format===oi)ht(_)?l.framebufferTexture2DMultisampleEXT(i.FRAMEBUFFER,i.DEPTH_STENCIL_ATTACHMENT,i.TEXTURE_2D,Q,0,J):i.framebufferTexture2D(i.FRAMEBUFFER,i.DEPTH_STENCIL_ATTACHMENT,i.TEXTURE_2D,Q,0);else throw new Error(\"Unknown depthTexture format\")}function vt(M){let _=n.get(M),B=M.isWebGLCubeRenderTarget===!0;if(M.depthTexture&&!_.__autoAllocateDepthBuffer){if(B)throw new Error(\"target.depthTexture not supported in Cube render targets\");Et(_.__webglFramebuffer,M)}else if(B){_.__webglDepthbuffer=[];for(let Q=0;Q<6;Q++)e.bindFramebuffer(i.FRAMEBUFFER,_.__webglFramebuffer[Q]),_.__webglDepthbuffer[Q]=i.createRenderbuffer(),bt(_.__webglDepthbuffer[Q],M,!1)}else e.bindFramebuffer(i.FRAMEBUFFER,_.__webglFramebuffer),_.__webglDepthbuffer=i.createRenderbuffer(),bt(_.__webglDepthbuffer,M,!1);e.bindFramebuffer(i.FRAMEBUFFER,null)}function kt(M,_,B){let Q=n.get(M);_!==void 0&&dt(Q.__webglFramebuffer,M,M.texture,i.COLOR_ATTACHMENT0,i.TEXTURE_2D,0),B!==void 0&&vt(M)}function O(M){let _=M.texture,B=n.get(M),Q=n.get(_);M.addEventListener(\"dispose\",Y),M.isWebGLMultipleRenderTargets!==!0&&(Q.__webglTexture===void 0&&(Q.__webglTexture=i.createTexture()),Q.__version=_.version,o.memory.textures++);let J=M.isWebGLCubeRenderTarget===!0,tt=M.isWebGLMultipleRenderTargets===!0,ft=p(M)||a;if(J){B.__webglFramebuffer=[];for(let rt=0;rt<6;rt++)if(a&&_.mipmaps&&_.mipmaps.length>0){B.__webglFramebuffer[rt]=[];for(let ct=0;ct<_.mipmaps.length;ct++)B.__webglFramebuffer[rt][ct]=i.createFramebuffer()}else B.__webglFramebuffer[rt]=i.createFramebuffer()}else{if(a&&_.mipmaps&&_.mipmaps.length>0){B.__webglFramebuffer=[];for(let rt=0;rt<_.mipmaps.length;rt++)B.__webglFramebuffer[rt]=i.createFramebuffer()}else B.__webglFramebuffer=i.createFramebuffer();if(tt)if(s.drawBuffers){let rt=M.texture;for(let ct=0,yt=rt.length;ct<yt;ct++){let Nt=n.get(rt[ct]);Nt.__webglTexture===void 0&&(Nt.__webglTexture=i.createTexture(),o.memory.textures++)}}else console.warn(\"THREE.WebGLRenderer: WebGLMultipleRenderTargets can only be used with WebGL2 or WEBGL_draw_buffers extension.\");if(a&&M.samples>0&&ht(M)===!1){let rt=tt?_:[_];B.__webglMultisampledFramebuffer=i.createFramebuffer(),B.__webglColorRenderbuffer=[],e.bindFramebuffer(i.FRAMEBUFFER,B.__webglMultisampledFramebuffer);for(let ct=0;ct<rt.length;ct++){let yt=rt[ct];B.__webglColorRenderbuffer[ct]=i.createRenderbuffer(),i.bindRenderbuffer(i.RENDERBUFFER,B.__webglColorRenderbuffer[ct]);let Nt=r.convert(yt.format,yt.colorSpace),j=r.convert(yt.type),Gt=P(yt.internalFormat,Nt,j,yt.colorSpace,M.isXRRenderTarget===!0),Vt=At(M);i.renderbufferStorageMultisample(i.RENDERBUFFER,Vt,Gt,M.width,M.height),i.framebufferRenderbuffer(i.FRAMEBUFFER,i.COLOR_ATTACHMENT0+ct,i.RENDERBUFFER,B.__webglColorRenderbuffer[ct])}i.bindRenderbuffer(i.RENDERBUFFER,null),M.depthBuffer&&(B.__webglDepthRenderbuffer=i.createRenderbuffer(),bt(B.__webglDepthRenderbuffer,M,!0)),e.bindFramebuffer(i.FRAMEBUFFER,null)}}if(J){e.bindTexture(i.TEXTURE_CUBE_MAP,Q.__webglTexture),W(i.TEXTURE_CUBE_MAP,_,ft);for(let rt=0;rt<6;rt++)if(a&&_.mipmaps&&_.mipmaps.length>0)for(let ct=0;ct<_.mipmaps.length;ct++)dt(B.__webglFramebuffer[rt][ct],M,_,i.COLOR_ATTACHMENT0,i.TEXTURE_CUBE_MAP_POSITIVE_X+rt,ct);else dt(B.__webglFramebuffer[rt],M,_,i.COLOR_ATTACHMENT0,i.TEXTURE_CUBE_MAP_POSITIVE_X+rt,0);w(_,ft)&&v(i.TEXTURE_CUBE_MAP),e.unbindTexture()}else if(tt){let rt=M.texture;for(let ct=0,yt=rt.length;ct<yt;ct++){let Nt=rt[ct],j=n.get(Nt);e.bindTexture(i.TEXTURE_2D,j.__webglTexture),W(i.TEXTURE_2D,Nt,ft),dt(B.__webglFramebuffer,M,Nt,i.COLOR_ATTACHMENT0+ct,i.TEXTURE_2D,0),w(Nt,ft)&&v(i.TEXTURE_2D)}e.unbindTexture()}else{let rt=i.TEXTURE_2D;if((M.isWebGL3DRenderTarget||M.isWebGLArrayRenderTarget)&&(a?rt=M.isWebGL3DRenderTarget?i.TEXTURE_3D:i.TEXTURE_2D_ARRAY:console.error(\"THREE.WebGLTextures: THREE.Data3DTexture and THREE.DataArrayTexture only supported with WebGL2.\")),e.bindTexture(rt,Q.__webglTexture),W(rt,_,ft),a&&_.mipmaps&&_.mipmaps.length>0)for(let ct=0;ct<_.mipmaps.length;ct++)dt(B.__webglFramebuffer[ct],M,_,i.COLOR_ATTACHMENT0,rt,ct);else dt(B.__webglFramebuffer,M,_,i.COLOR_ATTACHMENT0,rt,0);w(_,ft)&&v(rt),e.unbindTexture()}M.depthBuffer&&vt(M)}function le(M){let _=p(M)||a,B=M.isWebGLMultipleRenderTargets===!0?M.texture:[M.texture];for(let Q=0,J=B.length;Q<J;Q++){let tt=B[Q];if(w(tt,_)){let ft=M.isWebGLCubeRenderTarget?i.TEXTURE_CUBE_MAP:i.TEXTURE_2D,rt=n.get(tt).__webglTexture;e.bindTexture(ft,rt),v(ft),e.unbindTexture()}}}function _t(M){if(a&&M.samples>0&&ht(M)===!1){let _=M.isWebGLMultipleRenderTargets?M.texture:[M.texture],B=M.width,Q=M.height,J=i.COLOR_BUFFER_BIT,tt=[],ft=M.stencilBuffer?i.DEPTH_STENCIL_ATTACHMENT:i.DEPTH_ATTACHMENT,rt=n.get(M),ct=M.isWebGLMultipleRenderTargets===!0;if(ct)for(let yt=0;yt<_.length;yt++)e.bindFramebuffer(i.FRAMEBUFFER,rt.__webglMultisampledFramebuffer),i.framebufferRenderbuffer(i.FRAMEBUFFER,i.COLOR_ATTACHMENT0+yt,i.RENDERBUFFER,null),e.bindFramebuffer(i.FRAMEBUFFER,rt.__webglFramebuffer),i.framebufferTexture2D(i.DRAW_FRAMEBUFFER,i.COLOR_ATTACHMENT0+yt,i.TEXTURE_2D,null,0);e.bindFramebuffer(i.READ_FRAMEBUFFER,rt.__webglMultisampledFramebuffer),e.bindFramebuffer(i.DRAW_FRAMEBUFFER,rt.__webglFramebuffer);for(let yt=0;yt<_.length;yt++){tt.push(i.COLOR_ATTACHMENT0+yt),M.depthBuffer&&tt.push(ft);let Nt=rt.__ignoreDepthValues!==void 0?rt.__ignoreDepthValues:!1;if(Nt===!1&&(M.depthBuffer&&(J|=i.DEPTH_BUFFER_BIT),M.stencilBuffer&&(J|=i.STENCIL_BUFFER_BIT)),ct&&i.framebufferRenderbuffer(i.READ_FRAMEBUFFER,i.COLOR_ATTACHMENT0,i.RENDERBUFFER,rt.__webglColorRenderbuffer[yt]),Nt===!0&&(i.invalidateFramebuffer(i.READ_FRAMEBUFFER,[ft]),i.invalidateFramebuffer(i.DRAW_FRAMEBUFFER,[ft])),ct){let j=n.get(_[yt]).__webglTexture;i.framebufferTexture2D(i.DRAW_FRAMEBUFFER,i.COLOR_ATTACHMENT0,i.TEXTURE_2D,j,0)}i.blitFramebuffer(0,0,B,Q,0,0,B,Q,J,i.NEAREST),c&&i.invalidateFramebuffer(i.READ_FRAMEBUFFER,tt)}if(e.bindFramebuffer(i.READ_FRAMEBUFFER,null),e.bindFramebuffer(i.DRAW_FRAMEBUFFER,null),ct)for(let yt=0;yt<_.length;yt++){e.bindFramebuffer(i.FRAMEBUFFER,rt.__webglMultisampledFramebuffer),i.framebufferRenderbuffer(i.FRAMEBUFFER,i.COLOR_ATTACHMENT0+yt,i.RENDERBUFFER,rt.__webglColorRenderbuffer[yt]);let Nt=n.get(_[yt]).__webglTexture;e.bindFramebuffer(i.FRAMEBUFFER,rt.__webglFramebuffer),i.framebufferTexture2D(i.DRAW_FRAMEBUFFER,i.COLOR_ATTACHMENT0+yt,i.TEXTURE_2D,Nt,0)}e.bindFramebuffer(i.DRAW_FRAMEBUFFER,rt.__webglMultisampledFramebuffer)}}function At(M){return Math.min(s.maxSamples,M.samples)}function ht(M){let _=n.get(M);return a&&M.samples>0&&t.has(\"WEBGL_multisampled_render_to_texture\")===!0&&_.__useRenderToTexture!==!1}function Xt(M){let _=o.render.frame;h.get(M)!==_&&(h.set(M,_),M.update())}function gt(M,_){let B=M.colorSpace,Q=M.format,J=M.type;return M.isCompressedTexture===!0||M.isVideoTexture===!0||M.format===Cr||B!==rn&&B!==De&&(Wt.getTransfer(B)===Jt?a===!1?t.has(\"EXT_sRGB\")===!0&&Q===Ve?(M.format=Cr,M.minFilter=Ue,M.generateMipmaps=!1):_=gs.sRGBToLinear(_):(Q!==Ve||J!==mn)&&console.warn(\"THREE.WebGLTextures: sRGB encoded textures have to use RGBAFormat and UnsignedByteType.\"):console.error(\"THREE.WebGLTextures: Unsupported texture color space:\",B)),_}this.allocateTextureUnit=E,this.resetTextureUnits=T,this.setTexture2D=F,this.setTexture2DArray=I,this.setTexture3D=G,this.setTextureCube=X,this.rebindTextures=kt,this.setupRenderTarget=O,this.updateRenderTargetMipmap=le,this.updateMultisampleRenderTarget=_t,this.setupDepthRenderbuffer=vt,this.setupFrameBufferTexture=dt,this.useMultisampledRTT=ht}function ap(i,t,e){let n=e.isWebGL2;function s(r,o=De){let a,l=Wt.getTransfer(o);if(r===mn)return i.UNSIGNED_BYTE;if(r===Jo)return i.UNSIGNED_SHORT_4_4_4_4;if(r===$o)return i.UNSIGNED_SHORT_5_5_5_1;if(r===Ql)return i.BYTE;if(r===jl)return i.SHORT;if(r===ra)return i.UNSIGNED_SHORT;if(r===Zo)return i.INT;if(r===un)return i.UNSIGNED_INT;if(r===dn)return i.FLOAT;if(r===ke)return n?i.HALF_FLOAT:(a=t.get(\"OES_texture_half_float\"),a!==null?a.HALF_FLOAT_OES:null);if(r===tc)return i.ALPHA;if(r===Ve)return i.RGBA;if(r===ec)return i.LUMINANCE;if(r===nc)return i.LUMINANCE_ALPHA;if(r===Ln)return i.DEPTH_COMPONENT;if(r===oi)return i.DEPTH_STENCIL;if(r===Cr)return a=t.get(\"EXT_sRGB\"),a!==null?a.SRGB_ALPHA_EXT:null;if(r===ic)return i.RED;if(r===Ko)return i.RED_INTEGER;if(r===sc)return i.RG;if(r===Qo)return i.RG_INTEGER;if(r===jo)return i.RGBA_INTEGER;if(r===Xs||r===qs||r===Ys||r===Zs)if(l===Jt)if(a=t.get(\"WEBGL_compressed_texture_s3tc_srgb\"),a!==null){if(r===Xs)return a.COMPRESSED_SRGB_S3TC_DXT1_EXT;if(r===qs)return a.COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT;if(r===Ys)return a.COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT;if(r===Zs)return a.COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT}else return null;else if(a=t.get(\"WEBGL_compressed_texture_s3tc\"),a!==null){if(r===Xs)return a.COMPRESSED_RGB_S3TC_DXT1_EXT;if(r===qs)return a.COMPRESSED_RGBA_S3TC_DXT1_EXT;if(r===Ys)return a.COMPRESSED_RGBA_S3TC_DXT3_EXT;if(r===Zs)return a.COMPRESSED_RGBA_S3TC_DXT5_EXT}else return null;if(r===ba||r===Ea||r===wa||r===Ta)if(a=t.get(\"WEBGL_compressed_texture_pvrtc\"),a!==null){if(r===ba)return a.COMPRESSED_RGB_PVRTC_4BPPV1_IMG;if(r===Ea)return a.COMPRESSED_RGB_PVRTC_2BPPV1_IMG;if(r===wa)return a.COMPRESSED_RGBA_PVRTC_4BPPV1_IMG;if(r===Ta)return a.COMPRESSED_RGBA_PVRTC_2BPPV1_IMG}else return null;if(r===tl)return a=t.get(\"WEBGL_compressed_texture_etc1\"),a!==null?a.COMPRESSED_RGB_ETC1_WEBGL:null;if(r===Aa||r===Ca)if(a=t.get(\"WEBGL_compressed_texture_etc\"),a!==null){if(r===Aa)return l===Jt?a.COMPRESSED_SRGB8_ETC2:a.COMPRESSED_RGB8_ETC2;if(r===Ca)return l===Jt?a.COMPRESSED_SRGB8_ALPHA8_ETC2_EAC:a.COMPRESSED_RGBA8_ETC2_EAC}else return null;if(r===Ra||r===Pa||r===La||r===Ia||r===Ua||r===Da||r===Na||r===Fa||r===Oa||r===Ba||r===za||r===Va||r===ka||r===Ha)if(a=t.get(\"WEBGL_compressed_texture_astc\"),a!==null){if(r===Ra)return l===Jt?a.COMPRESSED_SRGB8_ALPHA8_ASTC_4x4_KHR:a.COMPRESSED_RGBA_ASTC_4x4_KHR;if(r===Pa)return l===Jt?a.COMPRESSED_SRGB8_ALPHA8_ASTC_5x4_KHR:a.COMPRESSED_RGBA_ASTC_5x4_KHR;if(r===La)return l===Jt?a.COMPRESSED_SRGB8_ALPHA8_ASTC_5x5_KHR:a.COMPRESSED_RGBA_ASTC_5x5_KHR;if(r===Ia)return l===Jt?a.COMPRESSED_SRGB8_ALPHA8_ASTC_6x5_KHR:a.COMPRESSED_RGBA_ASTC_6x5_KHR;if(r===Ua)return l===Jt?a.COMPRESSED_SRGB8_ALPHA8_ASTC_6x6_KHR:a.COMPRESSED_RGBA_ASTC_6x6_KHR;if(r===Da)return l===Jt?a.COMPRESSED_SRGB8_ALPHA8_ASTC_8x5_KHR:a.COMPRESSED_RGBA_ASTC_8x5_KHR;if(r===Na)return l===Jt?a.COMPRESSED_SRGB8_ALPHA8_ASTC_8x6_KHR:a.COMPRESSED_RGBA_ASTC_8x6_KHR;if(r===Fa)return l===Jt?a.COMPRESSED_SRGB8_ALPHA8_ASTC_8x8_KHR:a.COMPRESSED_RGBA_ASTC_8x8_KHR;if(r===Oa)return l===Jt?a.COMPRESSED_SRGB8_ALPHA8_ASTC_10x5_KHR:a.COMPRESSED_RGBA_ASTC_10x5_KHR;if(r===Ba)return l===Jt?a.COMPRESSED_SRGB8_ALPHA8_ASTC_10x6_KHR:a.COMPRESSED_RGBA_ASTC_10x6_KHR;if(r===za)return l===Jt?a.COMPRESSED_SRGB8_ALPHA8_ASTC_10x8_KHR:a.COMPRESSED_RGBA_ASTC_10x8_KHR;if(r===Va)return l===Jt?a.COMPRESSED_SRGB8_ALPHA8_ASTC_10x10_KHR:a.COMPRESSED_RGBA_ASTC_10x10_KHR;if(r===ka)return l===Jt?a.COMPRESSED_SRGB8_ALPHA8_ASTC_12x10_KHR:a.COMPRESSED_RGBA_ASTC_12x10_KHR;if(r===Ha)return l===Jt?a.COMPRESSED_SRGB8_ALPHA8_ASTC_12x12_KHR:a.COMPRESSED_RGBA_ASTC_12x12_KHR}else return null;if(r===Js||r===Ga||r===Wa)if(a=t.get(\"EXT_texture_compression_bptc\"),a!==null){if(r===Js)return l===Jt?a.COMPRESSED_SRGB_ALPHA_BPTC_UNORM_EXT:a.COMPRESSED_RGBA_BPTC_UNORM_EXT;if(r===Ga)return a.COMPRESSED_RGB_BPTC_SIGNED_FLOAT_EXT;if(r===Wa)return a.COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT_EXT}else return null;if(r===rc||r===Xa||r===qa||r===Ya)if(a=t.get(\"EXT_texture_compression_rgtc\"),a!==null){if(r===Js)return a.COMPRESSED_RED_RGTC1_EXT;if(r===Xa)return a.COMPRESSED_SIGNED_RED_RGTC1_EXT;if(r===qa)return a.COMPRESSED_RED_GREEN_RGTC2_EXT;if(r===Ya)return a.COMPRESSED_SIGNED_RED_GREEN_RGTC2_EXT}else return null;return r===Pn?n?i.UNSIGNED_INT_24_8:(a=t.get(\"WEBGL_depth_texture\"),a!==null?a.UNSIGNED_INT_24_8_WEBGL:null):i[r]!==void 0?i[r]:null}return{convert:s}}var Wr=class extends ve{constructor(t=[]){super(),this.isArrayCamera=!0,this.cameras=t}},fn=class extends Pe{constructor(){super(),this.isGroup=!0,this.type=\"Group\"}},op={type:\"move\"},bi=class{constructor(){this._targetRay=null,this._grip=null,this._hand=null}getHandSpace(){return this._hand===null&&(this._hand=new fn,this._hand.matrixAutoUpdate=!1,this._hand.visible=!1,this._hand.joints={},this._hand.inputState={pinching:!1}),this._hand}getTargetRaySpace(){return this._targetRay===null&&(this._targetRay=new fn,this._targetRay.matrixAutoUpdate=!1,this._targetRay.visible=!1,this._targetRay.hasLinearVelocity=!1,this._targetRay.linearVelocity=new N,this._targetRay.hasAngularVelocity=!1,this._targetRay.angularVelocity=new N),this._targetRay}getGripSpace(){return this._grip===null&&(this._grip=new fn,this._grip.matrixAutoUpdate=!1,this._grip.visible=!1,this._grip.hasLinearVelocity=!1,this._grip.linearVelocity=new N,this._grip.hasAngularVelocity=!1,this._grip.angularVelocity=new N),this._grip}dispatchEvent(t){return this._targetRay!==null&&this._targetRay.dispatchEvent(t),this._grip!==null&&this._grip.dispatchEvent(t),this._hand!==null&&this._hand.dispatchEvent(t),this}connect(t){if(t&&t.hand){let e=this._hand;if(e)for(let n of t.hand.values())this._getHandJoint(e,n)}return this.dispatchEvent({type:\"connected\",data:t}),this}disconnect(t){return this.dispatchEvent({type:\"disconnected\",data:t}),this._targetRay!==null&&(this._targetRay.visible=!1),this._grip!==null&&(this._grip.visible=!1),this._hand!==null&&(this._hand.visible=!1),this}update(t,e,n){let s=null,r=null,o=null,a=this._targetRay,l=this._grip,c=this._hand;if(t&&e.session.visibilityState!==\"visible-blurred\"){if(c&&t.hand){o=!0;for(let x of t.hand.values()){let p=e.getJointPose(x,n),u=this._getHandJoint(c,x);p!==null&&(u.matrix.fromArray(p.transform.matrix),u.matrix.decompose(u.position,u.rotation,u.scale),u.matrixWorldNeedsUpdate=!0,u.jointRadius=p.radius),u.visible=p!==null}let h=c.joints[\"index-finger-tip\"],d=c.joints[\"thumb-tip\"],f=h.position.distanceTo(d.position),m=.02,g=.005;c.inputState.pinching&&f>m+g?(c.inputState.pinching=!1,this.dispatchEvent({type:\"pinchend\",handedness:t.handedness,target:this})):!c.inputState.pinching&&f<=m-g&&(c.inputState.pinching=!0,this.dispatchEvent({type:\"pinchstart\",handedness:t.handedness,target:this}))}else l!==null&&t.gripSpace&&(r=e.getPose(t.gripSpace,n),r!==null&&(l.matrix.fromArray(r.transform.matrix),l.matrix.decompose(l.position,l.rotation,l.scale),l.matrixWorldNeedsUpdate=!0,r.linearVelocity?(l.hasLinearVelocity=!0,l.linearVelocity.copy(r.linearVelocity)):l.hasLinearVelocity=!1,r.angularVelocity?(l.hasAngularVelocity=!0,l.angularVelocity.copy(r.angularVelocity)):l.hasAngularVelocity=!1));a!==null&&(s=e.getPose(t.targetRaySpace,n),s===null&&r!==null&&(s=r),s!==null&&(a.matrix.fromArray(s.transform.matrix),a.matrix.decompose(a.position,a.rotation,a.scale),a.matrixWorldNeedsUpdate=!0,s.linearVelocity?(a.hasLinearVelocity=!0,a.linearVelocity.copy(s.linearVelocity)):a.hasLinearVelocity=!1,s.angularVelocity?(a.hasAngularVelocity=!0,a.angularVelocity.copy(s.angularVelocity)):a.hasAngularVelocity=!1,this.dispatchEvent(op)))}return a!==null&&(a.visible=s!==null),l!==null&&(l.visible=r!==null),c!==null&&(c.visible=o!==null),this}_getHandJoint(t,e){if(t.joints[e.jointName]===void 0){let n=new fn;n.matrixAutoUpdate=!1,n.visible=!1,t.joints[e.jointName]=n,t.add(n)}return t.joints[e.jointName]}},Xr=class extends xn{constructor(t,e){super();let n=this,s=null,r=1,o=null,a=\"local-floor\",l=1,c=null,h=null,d=null,f=null,m=null,g=null,x=e.getContextAttributes(),p=null,u=null,w=[],v=[],P=new Lt,U=null,R=new ve;R.layers.enable(1),R.viewport=new he;let C=new ve;C.layers.enable(2),C.viewport=new he;let Y=[R,C],S=new Wr;S.layers.enable(1),S.layers.enable(2);let b=null,H=null;this.cameraAutoUpdate=!0,this.enabled=!1,this.isPresenting=!1,this.getController=function(W){let q=w[W];return q===void 0&&(q=new bi,w[W]=q),q.getTargetRaySpace()},this.getControllerGrip=function(W){let q=w[W];return q===void 0&&(q=new bi,w[W]=q),q.getGripSpace()},this.getHand=function(W){let q=w[W];return q===void 0&&(q=new bi,w[W]=q),q.getHandSpace()};function K(W){let q=v.indexOf(W.inputSource);if(q===-1)return;let st=w[q];st!==void 0&&(st.update(W.inputSource,W.frame,c||o),st.dispatchEvent({type:W.type,data:W.inputSource}))}function T(){s.removeEventListener(\"select\",K),s.removeEventListener(\"selectstart\",K),s.removeEventListener(\"selectend\",K),s.removeEventListener(\"squeeze\",K),s.removeEventListener(\"squeezestart\",K),s.removeEventListener(\"squeezeend\",K),s.removeEventListener(\"end\",T),s.removeEventListener(\"inputsourceschange\",E);for(let W=0;W<w.length;W++){let q=v[W];q!==null&&(v[W]=null,w[W].disconnect(q))}b=null,H=null,t.setRenderTarget(p),m=null,f=null,d=null,s=null,u=null,et.stop(),n.isPresenting=!1,t.setPixelRatio(U),t.setSize(P.width,P.height,!1),n.dispatchEvent({type:\"sessionend\"})}this.setFramebufferScaleFactor=function(W){r=W,n.isPresenting===!0&&console.warn(\"THREE.WebXRManager: Cannot change framebuffer scale while presenting.\")},this.setReferenceSpaceType=function(W){a=W,n.isPresenting===!0&&console.warn(\"THREE.WebXRManager: Cannot change reference space type while presenting.\")},this.getReferenceSpace=function(){return c||o},this.setReferenceSpace=function(W){c=W},this.getBaseLayer=function(){return f!==null?f:m},this.getBinding=function(){return d},this.getFrame=function(){return g},this.getSession=function(){return s},this.setSession=async function(W){if(s=W,s!==null){if(p=t.getRenderTarget(),s.addEventListener(\"select\",K),s.addEventListener(\"selectstart\",K),s.addEventListener(\"selectend\",K),s.addEventListener(\"squeeze\",K),s.addEventListener(\"squeezestart\",K),s.addEventListener(\"squeezeend\",K),s.addEventListener(\"end\",T),s.addEventListener(\"inputsourceschange\",E),x.xrCompatible!==!0&&await e.makeXRCompatible(),U=t.getPixelRatio(),t.getSize(P),s.renderState.layers===void 0||t.capabilities.isWebGL2===!1){let q={antialias:s.renderState.layers===void 0?x.antialias:!0,alpha:!0,depth:x.depth,stencil:x.stencil,framebufferScaleFactor:r};m=new XRWebGLLayer(s,e,q),s.updateRenderState({baseLayer:m}),t.setPixelRatio(1),t.setSize(m.framebufferWidth,m.framebufferHeight,!1),u=new Me(m.framebufferWidth,m.framebufferHeight,{format:Ve,type:mn,colorSpace:t.outputColorSpace,stencilBuffer:x.stencil})}else{let q=null,st=null,pt=null;x.depth&&(pt=x.stencil?e.DEPTH24_STENCIL8:e.DEPTH_COMPONENT24,q=x.stencil?oi:Ln,st=x.stencil?Pn:un);let dt={colorFormat:e.RGBA8,depthFormat:pt,scaleFactor:r};d=new XRWebGLBinding(s,e),f=d.createProjectionLayer(dt),s.updateRenderState({layers:[f]}),t.setPixelRatio(1),t.setSize(f.textureWidth,f.textureHeight,!1),u=new Me(f.textureWidth,f.textureHeight,{format:Ve,type:mn,depthTexture:new As(f.textureWidth,f.textureHeight,st,void 0,void 0,void 0,void 0,void 0,void 0,q),stencilBuffer:x.stencil,colorSpace:t.outputColorSpace,samples:x.antialias?4:0});let bt=t.properties.get(u);bt.__ignoreDepthValues=f.ignoreDepthValues}u.isXRRenderTarget=!0,this.setFoveation(l),c=null,o=await s.requestReferenceSpace(a),et.setContext(s),et.start(),n.isPresenting=!0,n.dispatchEvent({type:\"sessionstart\"})}},this.getEnvironmentBlendMode=function(){if(s!==null)return s.environmentBlendMode};function E(W){for(let q=0;q<W.removed.length;q++){let st=W.removed[q],pt=v.indexOf(st);pt>=0&&(v[pt]=null,w[pt].disconnect(st))}for(let q=0;q<W.added.length;q++){let st=W.added[q],pt=v.indexOf(st);if(pt===-1){for(let bt=0;bt<w.length;bt++)if(bt>=v.length){v.push(st),pt=bt;break}else if(v[bt]===null){v[bt]=st,pt=bt;break}if(pt===-1)break}let dt=w[pt];dt&&dt.connect(st)}}let L=new N,F=new N;function I(W,q,st){L.setFromMatrixPosition(q.matrixWorld),F.setFromMatrixPosition(st.matrixWorld);let pt=L.distanceTo(F),dt=q.projectionMatrix.elements,bt=st.projectionMatrix.elements,Et=dt[14]/(dt[10]-1),vt=dt[14]/(dt[10]+1),kt=(dt[9]+1)/dt[5],O=(dt[9]-1)/dt[5],le=(dt[8]-1)/dt[0],_t=(bt[8]+1)/bt[0],At=Et*le,ht=Et*_t,Xt=pt/(-le+_t),gt=Xt*-le;q.matrixWorld.decompose(W.position,W.quaternion,W.scale),W.translateX(gt),W.translateZ(Xt),W.matrixWorld.compose(W.position,W.quaternion,W.scale),W.matrixWorldInverse.copy(W.matrixWorld).invert();let M=Et+Xt,_=vt+Xt,B=At-gt,Q=ht+(pt-gt),J=kt*vt/_*M,tt=O*vt/_*M;W.projectionMatrix.makePerspective(B,Q,J,tt,M,_),W.projectionMatrixInverse.copy(W.projectionMatrix).invert()}function G(W,q){q===null?W.matrixWorld.copy(W.matrix):W.matrixWorld.multiplyMatrices(q.matrixWorld,W.matrix),W.matrixWorldInverse.copy(W.matrixWorld).invert()}this.updateCamera=function(W){if(s===null)return;S.near=C.near=R.near=W.near,S.far=C.far=R.far=W.far,(b!==S.near||H!==S.far)&&(s.updateRenderState({depthNear:S.near,depthFar:S.far}),b=S.near,H=S.far);let q=W.parent,st=S.cameras;G(S,q);for(let pt=0;pt<st.length;pt++)G(st[pt],q);st.length===2?I(S,R,C):S.projectionMatrix.copy(R.projectionMatrix),X(W,S,q)};function X(W,q,st){st===null?W.matrix.copy(q.matrixWorld):(W.matrix.copy(st.matrixWorld),W.matrix.invert(),W.matrix.multiply(q.matrixWorld)),W.matrix.decompose(W.position,W.quaternion,W.scale),W.updateMatrixWorld(!0),W.projectionMatrix.copy(q.projectionMatrix),W.projectionMatrixInverse.copy(q.projectionMatrixInverse),W.isPerspectiveCamera&&(W.fov=Rr*2*Math.atan(1/W.projectionMatrix.elements[5]),W.zoom=1)}this.getCamera=function(){return S},this.getFoveation=function(){if(!(f===null&&m===null))return l},this.setFoveation=function(W){l=W,f!==null&&(f.fixedFoveation=W),m!==null&&m.fixedFoveation!==void 0&&(m.fixedFoveation=W)};let Z=null;function $(W,q){if(h=q.getViewerPose(c||o),g=q,h!==null){let st=h.views;m!==null&&(t.setRenderTargetFramebuffer(u,m.framebuffer),t.setRenderTarget(u));let pt=!1;st.length!==S.cameras.length&&(S.cameras.length=0,pt=!0);for(let dt=0;dt<st.length;dt++){let bt=st[dt],Et=null;if(m!==null)Et=m.getViewport(bt);else{let kt=d.getViewSubImage(f,bt);Et=kt.viewport,dt===0&&(t.setRenderTargetTextures(u,kt.colorTexture,f.ignoreDepthValues?void 0:kt.depthStencilTexture),t.setRenderTarget(u))}let vt=Y[dt];vt===void 0&&(vt=new ve,vt.layers.enable(dt),vt.viewport=new he,Y[dt]=vt),vt.matrix.fromArray(bt.transform.matrix),vt.matrix.decompose(vt.position,vt.quaternion,vt.scale),vt.projectionMatrix.fromArray(bt.projectionMatrix),vt.projectionMatrixInverse.copy(vt.projectionMatrix).invert(),vt.viewport.set(Et.x,Et.y,Et.width,Et.height),dt===0&&(S.matrix.copy(vt.matrix),S.matrix.decompose(S.position,S.quaternion,S.scale)),pt===!0&&S.cameras.push(vt)}}for(let st=0;st<w.length;st++){let pt=v[st],dt=w[st];pt!==null&&dt!==void 0&&dt.update(pt,q,c||o)}Z&&Z(W,q),q.detectedPlanes&&n.dispatchEvent({type:\"planesdetected\",data:q}),g=null}let et=new al;et.setAnimationLoop($),this.setAnimationLoop=function(W){Z=W},this.dispose=function(){}}};function lp(i,t){function e(p,u){p.matrixAutoUpdate===!0&&p.updateMatrix(),u.value.copy(p.matrix)}function n(p,u){u.color.getRGB(p.fogColor.value,rl(i)),u.isFog?(p.fogNear.value=u.near,p.fogFar.value=u.far):u.isFogExp2&&(p.fogDensity.value=u.density)}function s(p,u,w,v,P){u.isMeshBasicMaterial||u.isMeshLambertMaterial?r(p,u):u.isMeshToonMaterial?(r(p,u),d(p,u)):u.isMeshPhongMaterial?(r(p,u),h(p,u)):u.isMeshStandardMaterial?(r(p,u),f(p,u),u.isMeshPhysicalMaterial&&m(p,u,P)):u.isMeshMatcapMaterial?(r(p,u),g(p,u)):u.isMeshDepthMaterial?r(p,u):u.isMeshDistanceMaterial?(r(p,u),x(p,u)):u.isMeshNormalMaterial?r(p,u):u.isLineBasicMaterial?(o(p,u),u.isLineDashedMaterial&&a(p,u)):u.isPointsMaterial?l(p,u,w,v):u.isSpriteMaterial?c(p,u):u.isShadowMaterial?(p.color.value.copy(u.color),p.opacity.value=u.opacity):u.isShaderMaterial&&(u.uniformsNeedUpdate=!1)}function r(p,u){p.opacity.value=u.opacity,u.color&&p.diffuse.value.copy(u.color),u.emissive&&p.emissive.value.copy(u.emissive).multiplyScalar(u.emissiveIntensity),u.map&&(p.map.value=u.map,e(u.map,p.mapTransform)),u.alphaMap&&(p.alphaMap.value=u.alphaMap,e(u.alphaMap,p.alphaMapTransform)),u.bumpMap&&(p.bumpMap.value=u.bumpMap,e(u.bumpMap,p.bumpMapTransform),p.bumpScale.value=u.bumpScale,u.side===we&&(p.bumpScale.value*=-1)),u.normalMap&&(p.normalMap.value=u.normalMap,e(u.normalMap,p.normalMapTransform),p.normalScale.value.copy(u.normalScale),u.side===we&&p.normalScale.value.negate()),u.displacementMap&&(p.displacementMap.value=u.displacementMap,e(u.displacementMap,p.displacementMapTransform),p.displacementScale.value=u.displacementScale,p.displacementBias.value=u.displacementBias),u.emissiveMap&&(p.emissiveMap.value=u.emissiveMap,e(u.emissiveMap,p.emissiveMapTransform)),u.specularMap&&(p.specularMap.value=u.specularMap,e(u.specularMap,p.specularMapTransform)),u.alphaTest>0&&(p.alphaTest.value=u.alphaTest);let w=t.get(u).envMap;if(w&&(p.envMap.value=w,p.flipEnvMap.value=w.isCubeTexture&&w.isRenderTargetTexture===!1?-1:1,p.reflectivity.value=u.reflectivity,p.ior.value=u.ior,p.refractionRatio.value=u.refractionRatio),u.lightMap){p.lightMap.value=u.lightMap;let v=i._useLegacyLights===!0?Math.PI:1;p.lightMapIntensity.value=u.lightMapIntensity*v,e(u.lightMap,p.lightMapTransform)}u.aoMap&&(p.aoMap.value=u.aoMap,p.aoMapIntensity.value=u.aoMapIntensity,e(u.aoMap,p.aoMapTransform))}function o(p,u){p.diffuse.value.copy(u.color),p.opacity.value=u.opacity,u.map&&(p.map.value=u.map,e(u.map,p.mapTransform))}function a(p,u){p.dashSize.value=u.dashSize,p.totalSize.value=u.dashSize+u.gapSize,p.scale.value=u.scale}function l(p,u,w,v){p.diffuse.value.copy(u.color),p.opacity.value=u.opacity,p.size.value=u.size*w,p.scale.value=v*.5,u.map&&(p.map.value=u.map,e(u.map,p.uvTransform)),u.alphaMap&&(p.alphaMap.value=u.alphaMap,e(u.alphaMap,p.alphaMapTransform)),u.alphaTest>0&&(p.alphaTest.value=u.alphaTest)}function c(p,u){p.diffuse.value.copy(u.color),p.opacity.value=u.opacity,p.rotation.value=u.rotation,u.map&&(p.map.value=u.map,e(u.map,p.mapTransform)),u.alphaMap&&(p.alphaMap.value=u.alphaMap,e(u.alphaMap,p.alphaMapTransform)),u.alphaTest>0&&(p.alphaTest.value=u.alphaTest)}function h(p,u){p.specular.value.copy(u.specular),p.shininess.value=Math.max(u.shininess,1e-4)}function d(p,u){u.gradientMap&&(p.gradientMap.value=u.gradientMap)}function f(p,u){p.metalness.value=u.metalness,u.metalnessMap&&(p.metalnessMap.value=u.metalnessMap,e(u.metalnessMap,p.metalnessMapTransform)),p.roughness.value=u.roughness,u.roughnessMap&&(p.roughnessMap.value=u.roughnessMap,e(u.roughnessMap,p.roughnessMapTransform)),t.get(u).envMap&&(p.envMapIntensity.value=u.envMapIntensity)}function m(p,u,w){p.ior.value=u.ior,u.sheen>0&&(p.sheenColor.value.copy(u.sheenColor).multiplyScalar(u.sheen),p.sheenRoughness.value=u.sheenRoughness,u.sheenColorMap&&(p.sheenColorMap.value=u.sheenColorMap,e(u.sheenColorMap,p.sheenColorMapTransform)),u.sheenRoughnessMap&&(p.sheenRoughnessMap.value=u.sheenRoughnessMap,e(u.sheenRoughnessMap,p.sheenRoughnessMapTransform))),u.clearcoat>0&&(p.clearcoat.value=u.clearcoat,p.clearcoatRoughness.value=u.clearcoatRoughness,u.clearcoatMap&&(p.clearcoatMap.value=u.clearcoatMap,e(u.clearcoatMap,p.clearcoatMapTransform)),u.clearcoatRoughnessMap&&(p.clearcoatRoughnessMap.value=u.clearcoatRoughnessMap,e(u.clearcoatRoughnessMap,p.clearcoatRoughnessMapTransform)),u.clearcoatNormalMap&&(p.clearcoatNormalMap.value=u.clearcoatNormalMap,e(u.clearcoatNormalMap,p.clearcoatNormalMapTransform),p.clearcoatNormalScale.value.copy(u.clearcoatNormalScale),u.side===we&&p.clearcoatNormalScale.value.negate())),u.iridescence>0&&(p.iridescence.value=u.iridescence,p.iridescenceIOR.value=u.iridescenceIOR,p.iridescenceThicknessMinimum.value=u.iridescenceThicknessRange[0],p.iridescenceThicknessMaximum.value=u.iridescenceThicknessRange[1],u.iridescenceMap&&(p.iridescenceMap.value=u.iridescenceMap,e(u.iridescenceMap,p.iridescenceMapTransform)),u.iridescenceThicknessMap&&(p.iridescenceThicknessMap.value=u.iridescenceThicknessMap,e(u.iridescenceThicknessMap,p.iridescenceThicknessMapTransform))),u.transmission>0&&(p.transmission.value=u.transmission,p.transmissionSamplerMap.value=w.texture,p.transmissionSamplerSize.value.set(w.width,w.height),u.transmissionMap&&(p.transmissionMap.value=u.transmissionMap,e(u.transmissionMap,p.transmissionMapTransform)),p.thickness.value=u.thickness,u.thicknessMap&&(p.thicknessMap.value=u.thicknessMap,e(u.thicknessMap,p.thicknessMapTransform)),p.attenuationDistance.value=u.attenuationDistance,p.attenuationColor.value.copy(u.attenuationColor)),u.anisotropy>0&&(p.anisotropyVector.value.set(u.anisotropy*Math.cos(u.anisotropyRotation),u.anisotropy*Math.sin(u.anisotropyRotation)),u.anisotropyMap&&(p.anisotropyMap.value=u.anisotropyMap,e(u.anisotropyMap,p.anisotropyMapTransform))),p.specularIntensity.value=u.specularIntensity,p.specularColor.value.copy(u.specularColor),u.specularColorMap&&(p.specularColorMap.value=u.specularColorMap,e(u.specularColorMap,p.specularColorMapTransform)),u.specularIntensityMap&&(p.specularIntensityMap.value=u.specularIntensityMap,e(u.specularIntensityMap,p.specularIntensityMapTransform))}function g(p,u){u.matcap&&(p.matcap.value=u.matcap)}function x(p,u){let w=t.get(u).light;p.referencePosition.value.setFromMatrixPosition(w.matrixWorld),p.nearDistance.value=w.shadow.camera.near,p.farDistance.value=w.shadow.camera.far}return{refreshFogUniforms:n,refreshMaterialUniforms:s}}function cp(i,t,e,n){let s={},r={},o=[],a=e.isWebGL2?i.getParameter(i.MAX_UNIFORM_BUFFER_BINDINGS):0;function l(w,v){let P=v.program;n.uniformBlockBinding(w,P)}function c(w,v){let P=s[w.id];P===void 0&&(g(w),P=h(w),s[w.id]=P,w.addEventListener(\"dispose\",p));let U=v.program;n.updateUBOMapping(w,U);let R=t.render.frame;r[w.id]!==R&&(f(w),r[w.id]=R)}function h(w){let v=d();w.__bindingPointIndex=v;let P=i.createBuffer(),U=w.__size,R=w.usage;return i.bindBuffer(i.UNIFORM_BUFFER,P),i.bufferData(i.UNIFORM_BUFFER,U,R),i.bindBuffer(i.UNIFORM_BUFFER,null),i.bindBufferBase(i.UNIFORM_BUFFER,v,P),P}function d(){for(let w=0;w<a;w++)if(o.indexOf(w)===-1)return o.push(w),w;return console.error(\"THREE.WebGLRenderer: Maximum number of simultaneously usable uniforms groups reached.\"),0}function f(w){let v=s[w.id],P=w.uniforms,U=w.__cache;i.bindBuffer(i.UNIFORM_BUFFER,v);for(let R=0,C=P.length;R<C;R++){let Y=Array.isArray(P[R])?P[R]:[P[R]];for(let S=0,b=Y.length;S<b;S++){let H=Y[S];if(m(H,R,S,U)===!0){let K=H.__offset,T=Array.isArray(H.value)?H.value:[H.value],E=0;for(let L=0;L<T.length;L++){let F=T[L],I=x(F);typeof F==\"number\"||typeof F==\"boolean\"?(H.__data[0]=F,i.bufferSubData(i.UNIFORM_BUFFER,K+E,H.__data)):F.isMatrix3?(H.__data[0]=F.elements[0],H.__data[1]=F.elements[1],H.__data[2]=F.elements[2],H.__data[3]=0,H.__data[4]=F.elements[3],H.__data[5]=F.elements[4],H.__data[6]=F.elements[5],H.__data[7]=0,H.__data[8]=F.elements[6],H.__data[9]=F.elements[7],H.__data[10]=F.elements[8],H.__data[11]=0):(F.toArray(H.__data,E),E+=I.storage/Float32Array.BYTES_PER_ELEMENT)}i.bufferSubData(i.UNIFORM_BUFFER,K,H.__data)}}}i.bindBuffer(i.UNIFORM_BUFFER,null)}function m(w,v,P,U){let R=w.value,C=v+\"_\"+P;if(U[C]===void 0)return typeof R==\"number\"||typeof R==\"boolean\"?U[C]=R:U[C]=R.clone(),!0;{let Y=U[C];if(typeof R==\"number\"||typeof R==\"boolean\"){if(Y!==R)return U[C]=R,!0}else if(Y.equals(R)===!1)return Y.copy(R),!0}return!1}function g(w){let v=w.uniforms,P=0,U=16;for(let C=0,Y=v.length;C<Y;C++){let S=Array.isArray(v[C])?v[C]:[v[C]];for(let b=0,H=S.length;b<H;b++){let K=S[b],T=Array.isArray(K.value)?K.value:[K.value];for(let E=0,L=T.length;E<L;E++){let F=T[E],I=x(F),G=P%U;G!==0&&U-G<I.boundary&&(P+=U-G),K.__data=new Float32Array(I.storage/Float32Array.BYTES_PER_ELEMENT),K.__offset=P,P+=I.storage}}}let R=P%U;return R>0&&(P+=U-R),w.__size=P,w.__cache={},this}function x(w){let v={boundary:0,storage:0};return typeof w==\"number\"||typeof w==\"boolean\"?(v.boundary=4,v.storage=4):w.isVector2?(v.boundary=8,v.storage=8):w.isVector3||w.isColor?(v.boundary=16,v.storage=12):w.isVector4?(v.boundary=16,v.storage=16):w.isMatrix3?(v.boundary=48,v.storage=48):w.isMatrix4?(v.boundary=64,v.storage=64):w.isTexture?console.warn(\"THREE.WebGLRenderer: Texture samplers can not be part of an uniforms group.\"):console.warn(\"THREE.WebGLRenderer: Unsupported uniform value type.\",w),v}function p(w){let v=w.target;v.removeEventListener(\"dispose\",p);let P=o.indexOf(v.__bindingPointIndex);o.splice(P,1),i.deleteBuffer(s[v.id]),delete s[v.id],delete r[v.id]}function u(){for(let w in s)i.deleteBuffer(s[w]);o=[],s={},r={}}return{bind:l,update:c,dispose:u}}var Ci=class{constructor(t={}){let{canvas:e=xc(),context:n=null,depth:s=!0,stencil:r=!0,alpha:o=!1,antialias:a=!1,premultipliedAlpha:l=!0,preserveDrawingBuffer:c=!1,powerPreference:h=\"default\",failIfMajorPerformanceCaveat:d=!1}=t;this.isWebGLRenderer=!0;let f;n!==null?f=n.getContextAttributes().alpha:f=o;let m=new Uint32Array(4),g=new Int32Array(4),x=null,p=null,u=[],w=[];this.domElement=e,this.debug={checkShaderErrors:!0,onShaderError:null},this.autoClear=!0,this.autoClearColor=!0,this.autoClearDepth=!0,this.autoClearStencil=!0,this.sortObjects=!0,this.clippingPlanes=[],this.localClippingEnabled=!1,this._outputColorSpace=ce,this._useLegacyLights=!1,this.toneMapping=pn,this.toneMappingExposure=1;let v=this,P=!1,U=0,R=0,C=null,Y=-1,S=null,b=new he,H=new he,K=null,T=new Pt(0),E=0,L=e.width,F=e.height,I=1,G=null,X=null,Z=new he(0,0,L,F),$=new he(0,0,L,F),et=!1,W=new ws,q=!1,st=!1,pt=null,dt=new oe,bt=new Lt,Et=new N,vt={background:null,fog:null,environment:null,overrideMaterial:null,isScene:!0};function kt(){return C===null?I:1}let O=n;function le(y,D){for(let V=0;V<y.length;V++){let k=y[V],z=e.getContext(k,D);if(z!==null)return z}return null}try{let y={alpha:!0,depth:s,stencil:r,antialias:a,premultipliedAlpha:l,preserveDrawingBuffer:c,powerPreference:h,failIfMajorPerformanceCaveat:d};if(\"setAttribute\"in e&&e.setAttribute(\"data-engine\",\"three.js r160\"),e.addEventListener(\"webglcontextlost\",nt,!1),e.addEventListener(\"webglcontextrestored\",A,!1),e.addEventListener(\"webglcontextcreationerror\",at,!1),O===null){let D=[\"webgl2\",\"webgl\",\"experimental-webgl\"];if(v.isWebGL1Renderer===!0&&D.shift(),O=le(D,y),O===null)throw le(D)?new Error(\"Error creating WebGL context with your selected attributes.\"):new Error(\"Error creating WebGL context.\")}typeof WebGLRenderingContext<\"u\"&&O instanceof WebGLRenderingContext&&console.warn(\"THREE.WebGLRenderer: WebGL 1 support was deprecated in r153 and will be removed in r163.\"),O.getShaderPrecisionFormat===void 0&&(O.getShaderPrecisionFormat=function(){return{rangeMin:1,rangeMax:1,precision:1}})}catch(y){throw console.error(\"THREE.WebGLRenderer: \"+y.message),y}let _t,At,ht,Xt,gt,M,_,B,Q,J,tt,ft,rt,ct,yt,Nt,j,Gt,Vt,Ct,xt,ut,Ut,Ht;function Qt(){_t=new Ad(O),At=new Md(O,_t,t),_t.init(At),ut=new ap(O,_t,At),ht=new sp(O,_t,At),Xt=new Pd(O),gt=new qf,M=new rp(O,_t,ht,gt,At,ut,Xt),_=new bd(v),B=new Td(v),Q=new Bc(O,At),Ut=new vd(O,_t,Q,At),J=new Cd(O,Q,Xt,Ut),tt=new Dd(O,J,Q,Xt),Vt=new Ud(O,At,M),Nt=new Sd(gt),ft=new Xf(v,_,B,_t,At,Ut,Nt),rt=new lp(v,gt),ct=new Zf,yt=new tp(_t,At),Gt=new xd(v,_,B,ht,tt,f,l),j=new ip(v,tt,At),Ht=new cp(O,Xt,At,ht),Ct=new yd(O,_t,Xt,At),xt=new Rd(O,_t,Xt,At),Xt.programs=ft.programs,v.capabilities=At,v.extensions=_t,v.properties=gt,v.renderLists=ct,v.shadowMap=j,v.state=ht,v.info=Xt}Qt();let Ot=new Xr(v,O);this.xr=Ot,this.getContext=function(){return O},this.getContextAttributes=function(){return O.getContextAttributes()},this.forceContextLoss=function(){let y=_t.get(\"WEBGL_lose_context\");y&&y.loseContext()},this.forceContextRestore=function(){let y=_t.get(\"WEBGL_lose_context\");y&&y.restoreContext()},this.getPixelRatio=function(){return I},this.setPixelRatio=function(y){y!==void 0&&(I=y,this.setSize(L,F,!1))},this.getSize=function(y){return y.set(L,F)},this.setSize=function(y,D,V=!0){if(Ot.isPresenting){console.warn(\"THREE.WebGLRenderer: Can't change size while VR device is presenting.\");return}L=y,F=D,e.width=Math.floor(y*I),e.height=Math.floor(D*I),V===!0&&(e.style.width=y+\"px\",e.style.height=D+\"px\"),this.setViewport(0,0,y,D)},this.getDrawingBufferSize=function(y){return y.set(L*I,F*I).floor()},this.setDrawingBufferSize=function(y,D,V){L=y,F=D,I=V,e.width=Math.floor(y*V),e.height=Math.floor(D*V),this.setViewport(0,0,y,D)},this.getCurrentViewport=function(y){return y.copy(b)},this.getViewport=function(y){return y.copy(Z)},this.setViewport=function(y,D,V,k){y.isVector4?Z.set(y.x,y.y,y.z,y.w):Z.set(y,D,V,k),ht.viewport(b.copy(Z).multiplyScalar(I).floor())},this.getScissor=function(y){return y.copy($)},this.setScissor=function(y,D,V,k){y.isVector4?$.set(y.x,y.y,y.z,y.w):$.set(y,D,V,k),ht.scissor(H.copy($).multiplyScalar(I).floor())},this.getScissorTest=function(){return et},this.setScissorTest=function(y){ht.setScissorTest(et=y)},this.setOpaqueSort=function(y){G=y},this.setTransparentSort=function(y){X=y},this.getClearColor=function(y){return y.copy(Gt.getClearColor())},this.setClearColor=function(){Gt.setClearColor.apply(Gt,arguments)},this.getClearAlpha=function(){return Gt.getClearAlpha()},this.setClearAlpha=function(){Gt.setClearAlpha.apply(Gt,arguments)},this.clear=function(y=!0,D=!0,V=!0){let k=0;if(y){let z=!1;if(C!==null){let lt=C.texture.format;z=lt===jo||lt===Qo||lt===Ko}if(z){let lt=C.texture.type,mt=lt===mn||lt===un||lt===ra||lt===Pn||lt===Jo||lt===$o,St=Gt.getClearColor(),Tt=Gt.getClearAlpha(),Ft=St.r,Rt=St.g,It=St.b;mt?(m[0]=Ft,m[1]=Rt,m[2]=It,m[3]=Tt,O.clearBufferuiv(O.COLOR,0,m)):(g[0]=Ft,g[1]=Rt,g[2]=It,g[3]=Tt,O.clearBufferiv(O.COLOR,0,g))}else k|=O.COLOR_BUFFER_BIT}D&&(k|=O.DEPTH_BUFFER_BIT),V&&(k|=O.STENCIL_BUFFER_BIT,this.state.buffers.stencil.setMask(4294967295)),O.clear(k)},this.clearColor=function(){this.clear(!0,!1,!1)},this.clearDepth=function(){this.clear(!1,!0,!1)},this.clearStencil=function(){this.clear(!1,!1,!0)},this.dispose=function(){e.removeEventListener(\"webglcontextlost\",nt,!1),e.removeEventListener(\"webglcontextrestored\",A,!1),e.removeEventListener(\"webglcontextcreationerror\",at,!1),ct.dispose(),yt.dispose(),gt.dispose(),_.dispose(),B.dispose(),tt.dispose(),Ut.dispose(),Ht.dispose(),ft.dispose(),Ot.dispose(),Ot.removeEventListener(\"sessionstart\",me),Ot.removeEventListener(\"sessionend\",Zt),pt&&(pt.dispose(),pt=null),ge.stop()};function nt(y){y.preventDefault(),console.log(\"THREE.WebGLRenderer: Context Lost.\"),P=!0}function A(){console.log(\"THREE.WebGLRenderer: Context Restored.\"),P=!1;let y=Xt.autoReset,D=j.enabled,V=j.autoUpdate,k=j.needsUpdate,z=j.type;Qt(),Xt.autoReset=y,j.enabled=D,j.autoUpdate=V,j.needsUpdate=k,j.type=z}function at(y){console.error(\"THREE.WebGLRenderer: A WebGL context could not be created. Reason: \",y.statusMessage)}function ot(y){let D=y.target;D.removeEventListener(\"dispose\",ot),wt(D)}function wt(y){Mt(y),gt.remove(y)}function Mt(y){let D=gt.get(y).programs;D!==void 0&&(D.forEach(function(V){ft.releaseProgram(V)}),y.isShaderMaterial&&ft.releaseShaderCache(y))}this.renderBufferDirect=function(y,D,V,k,z,lt){D===null&&(D=vt);let mt=z.isMesh&&z.matrixWorld.determinant()<0,St=pl(y,D,V,k,z);ht.setMaterial(k,mt);let Tt=V.index,Ft=1;if(k.wireframe===!0){if(Tt=J.getWireframeAttribute(V),Tt===void 0)return;Ft=2}let Rt=V.drawRange,It=V.attributes.position,te=Rt.start*Ft,Te=(Rt.start+Rt.count)*Ft;lt!==null&&(te=Math.max(te,lt.start*Ft),Te=Math.min(Te,(lt.start+lt.count)*Ft)),Tt!==null?(te=Math.max(te,0),Te=Math.min(Te,Tt.count)):It!=null&&(te=Math.max(te,0),Te=Math.min(Te,It.count));let re=Te-te;if(re<0||re===1/0)return;Ut.setup(z,k,St,V,Tt);let Ze,Kt=Ct;if(Tt!==null&&(Ze=Q.get(Tt),Kt=xt,Kt.setIndex(Ze)),z.isMesh)k.wireframe===!0?(ht.setLineWidth(k.wireframeLinewidth*kt()),Kt.setMode(O.LINES)):Kt.setMode(O.TRIANGLES);else if(z.isLine){let Bt=k.linewidth;Bt===void 0&&(Bt=1),ht.setLineWidth(Bt*kt()),z.isLineSegments?Kt.setMode(O.LINES):z.isLineLoop?Kt.setMode(O.LINE_LOOP):Kt.setMode(O.LINE_STRIP)}else z.isPoints?Kt.setMode(O.POINTS):z.isSprite&&Kt.setMode(O.TRIANGLES);if(z.isBatchedMesh)Kt.renderMultiDraw(z._multiDrawStarts,z._multiDrawCounts,z._multiDrawCount);else if(z.isInstancedMesh)Kt.renderInstances(te,re,z.count);else if(V.isInstancedBufferGeometry){let Bt=V._maxInstanceCount!==void 0?V._maxInstanceCount:1/0,Vs=Math.min(V.instanceCount,Bt);Kt.renderInstances(te,re,Vs)}else Kt.render(te,re)};function qt(y,D,V){y.transparent===!0&&y.side===nn&&y.forceSinglePass===!1?(y.side=we,y.needsUpdate=!0,Ni(y,D,V),y.side=gn,y.needsUpdate=!0,Ni(y,D,V),y.side=nn):Ni(y,D,V)}this.compile=function(y,D,V=null){V===null&&(V=y),p=yt.get(V),p.init(),w.push(p),V.traverseVisible(function(z){z.isLight&&z.layers.test(D.layers)&&(p.pushLight(z),z.castShadow&&p.pushShadow(z))}),y!==V&&y.traverseVisible(function(z){z.isLight&&z.layers.test(D.layers)&&(p.pushLight(z),z.castShadow&&p.pushShadow(z))}),p.setupLights(v._useLegacyLights);let k=new Set;return y.traverse(function(z){let lt=z.material;if(lt)if(Array.isArray(lt))for(let mt=0;mt<lt.length;mt++){let St=lt[mt];qt(St,V,z),k.add(St)}else qt(lt,V,z),k.add(lt)}),w.pop(),p=null,k},this.compileAsync=function(y,D,V=null){let k=this.compile(y,D,V);return new Promise(z=>{function lt(){if(k.forEach(function(mt){gt.get(mt).currentProgram.isReady()&&k.delete(mt)}),k.size===0){z(y);return}setTimeout(lt,10)}_t.get(\"KHR_parallel_shader_compile\")!==null?lt():setTimeout(lt,10)})};let Yt=null;function se(y){Yt&&Yt(y)}function me(){ge.stop()}function Zt(){ge.start()}let ge=new al;ge.setAnimationLoop(se),typeof self<\"u\"&&ge.setContext(self),this.setAnimationLoop=function(y){Yt=y,Ot.setAnimationLoop(y),y===null?ge.stop():ge.start()},Ot.addEventListener(\"sessionstart\",me),Ot.addEventListener(\"sessionend\",Zt),this.render=function(y,D){if(D!==void 0&&D.isCamera!==!0){console.error(\"THREE.WebGLRenderer.render: camera is not an instance of THREE.Camera.\");return}if(P===!0)return;y.matrixWorldAutoUpdate===!0&&y.updateMatrixWorld(),D.parent===null&&D.matrixWorldAutoUpdate===!0&&D.updateMatrixWorld(),Ot.enabled===!0&&Ot.isPresenting===!0&&(Ot.cameraAutoUpdate===!0&&Ot.updateCamera(D),D=Ot.getCamera()),y.isScene===!0&&y.onBeforeRender(v,y,D,C),p=yt.get(y,w.length),p.init(),w.push(p),dt.multiplyMatrices(D.projectionMatrix,D.matrixWorldInverse),W.setFromProjectionMatrix(dt),st=this.localClippingEnabled,q=Nt.init(this.clippingPlanes,st),x=ct.get(y,u.length),x.init(),u.push(x),Xe(y,D,0,v.sortObjects),x.finish(),v.sortObjects===!0&&x.sort(G,X),this.info.render.frame++,q===!0&&Nt.beginShadows();let V=p.state.shadowsArray;if(j.render(V,y,D),q===!0&&Nt.endShadows(),this.info.autoReset===!0&&this.info.reset(),Gt.render(x,y),p.setupLights(v._useLegacyLights),D.isArrayCamera){let k=D.cameras;for(let z=0,lt=k.length;z<lt;z++){let mt=k[z];ua(x,y,mt,mt.viewport)}}else ua(x,y,D);C!==null&&(M.updateMultisampleRenderTarget(C),M.updateRenderTargetMipmap(C)),y.isScene===!0&&y.onAfterRender(v,y,D),Ut.resetDefaultState(),Y=-1,S=null,w.pop(),w.length>0?p=w[w.length-1]:p=null,u.pop(),u.length>0?x=u[u.length-1]:x=null};function Xe(y,D,V,k){if(y.visible===!1)return;if(y.layers.test(D.layers)){if(y.isGroup)V=y.renderOrder;else if(y.isLOD)y.autoUpdate===!0&&y.update(D);else if(y.isLight)p.pushLight(y),y.castShadow&&p.pushShadow(y);else if(y.isSprite){if(!y.frustumCulled||W.intersectsSprite(y)){k&&Et.setFromMatrixPosition(y.matrixWorld).applyMatrix4(dt);let mt=tt.update(y),St=y.material;St.visible&&x.push(y,mt,St,V,Et.z,null)}}else if((y.isMesh||y.isLine||y.isPoints)&&(!y.frustumCulled||W.intersectsObject(y))){let mt=tt.update(y),St=y.material;if(k&&(y.boundingSphere!==void 0?(y.boundingSphere===null&&y.computeBoundingSphere(),Et.copy(y.boundingSphere.center)):(mt.boundingSphere===null&&mt.computeBoundingSphere(),Et.copy(mt.boundingSphere.center)),Et.applyMatrix4(y.matrixWorld).applyMatrix4(dt)),Array.isArray(St)){let Tt=mt.groups;for(let Ft=0,Rt=Tt.length;Ft<Rt;Ft++){let It=Tt[Ft],te=St[It.materialIndex];te&&te.visible&&x.push(y,mt,te,V,Et.z,It)}}else St.visible&&x.push(y,mt,St,V,Et.z,null)}}let lt=y.children;for(let mt=0,St=lt.length;mt<St;mt++)Xe(lt[mt],D,V,k)}function ua(y,D,V,k){let z=y.opaque,lt=y.transmissive,mt=y.transparent;p.setupLightsView(V),q===!0&&Nt.setGlobalState(v.clippingPlanes,V),lt.length>0&&fl(z,lt,D,V),k&&ht.viewport(b.copy(k)),z.length>0&&Di(z,D,V),lt.length>0&&Di(lt,D,V),mt.length>0&&Di(mt,D,V),ht.buffers.depth.setTest(!0),ht.buffers.depth.setMask(!0),ht.buffers.color.setMask(!0),ht.setPolygonOffset(!1)}function fl(y,D,V,k){if((V.isScene===!0?V.overrideMaterial:null)!==null)return;let lt=At.isWebGL2;pt===null&&(pt=new Me(1,1,{generateMipmaps:!0,type:_t.has(\"EXT_color_buffer_half_float\")?ke:mn,minFilter:Ei,samples:lt?4:0})),v.getDrawingBufferSize(bt),lt?pt.setSize(bt.x,bt.y):pt.setSize(Pr(bt.x),Pr(bt.y));let mt=v.getRenderTarget();v.setRenderTarget(pt),v.getClearColor(T),E=v.getClearAlpha(),E<1&&v.setClearColor(16777215,.5),v.clear();let St=v.toneMapping;v.toneMapping=pn,Di(y,V,k),M.updateMultisampleRenderTarget(pt),M.updateRenderTargetMipmap(pt);let Tt=!1;for(let Ft=0,Rt=D.length;Ft<Rt;Ft++){let It=D[Ft],te=It.object,Te=It.geometry,re=It.material,Ze=It.group;if(re.side===nn&&te.layers.test(k.layers)){let Kt=re.side;re.side=we,re.needsUpdate=!0,da(te,V,k,Te,re,Ze),re.side=Kt,re.needsUpdate=!0,Tt=!0}}Tt===!0&&(M.updateMultisampleRenderTarget(pt),M.updateRenderTargetMipmap(pt)),v.setRenderTarget(mt),v.setClearColor(T,E),v.toneMapping=St}function Di(y,D,V){let k=D.isScene===!0?D.overrideMaterial:null;for(let z=0,lt=y.length;z<lt;z++){let mt=y[z],St=mt.object,Tt=mt.geometry,Ft=k===null?mt.material:k,Rt=mt.group;St.layers.test(V.layers)&&da(St,D,V,Tt,Ft,Rt)}}function da(y,D,V,k,z,lt){y.onBeforeRender(v,D,V,k,z,lt),y.modelViewMatrix.multiplyMatrices(V.matrixWorldInverse,y.matrixWorld),y.normalMatrix.getNormalMatrix(y.modelViewMatrix),z.onBeforeRender(v,D,V,k,y,lt),z.transparent===!0&&z.side===nn&&z.forceSinglePass===!1?(z.side=we,z.needsUpdate=!0,v.renderBufferDirect(V,D,k,z,y,lt),z.side=gn,z.needsUpdate=!0,v.renderBufferDirect(V,D,k,z,y,lt),z.side=nn):v.renderBufferDirect(V,D,k,z,y,lt),y.onAfterRender(v,D,V,k,z,lt)}function Ni(y,D,V){D.isScene!==!0&&(D=vt);let k=gt.get(y),z=p.state.lights,lt=p.state.shadowsArray,mt=z.state.version,St=ft.getParameters(y,z.state,lt,D,V),Tt=ft.getProgramCacheKey(St),Ft=k.programs;k.environment=y.isMeshStandardMaterial?D.environment:null,k.fog=D.fog,k.envMap=(y.isMeshStandardMaterial?B:_).get(y.envMap||k.environment),Ft===void 0&&(y.addEventListener(\"dispose\",ot),Ft=new Map,k.programs=Ft);let Rt=Ft.get(Tt);if(Rt!==void 0){if(k.currentProgram===Rt&&k.lightsStateVersion===mt)return pa(y,St),Rt}else St.uniforms=ft.getUniforms(y),y.onBuild(V,St,v),y.onBeforeCompile(St,v),Rt=ft.acquireProgram(St,Tt),Ft.set(Tt,Rt),k.uniforms=St.uniforms;let It=k.uniforms;return(!y.isShaderMaterial&&!y.isRawShaderMaterial||y.clipping===!0)&&(It.clippingPlanes=Nt.uniform),pa(y,St),k.needsLights=gl(y),k.lightsStateVersion=mt,k.needsLights&&(It.ambientLightColor.value=z.state.ambient,It.lightProbe.value=z.state.probe,It.directionalLights.value=z.state.directional,It.directionalLightShadows.value=z.state.directionalShadow,It.spotLights.value=z.state.spot,It.spotLightShadows.value=z.state.spotShadow,It.rectAreaLights.value=z.state.rectArea,It.ltc_1.value=z.state.rectAreaLTC1,It.ltc_2.value=z.state.rectAreaLTC2,It.pointLights.value=z.state.point,It.pointLightShadows.value=z.state.pointShadow,It.hemisphereLights.value=z.state.hemi,It.directionalShadowMap.value=z.state.directionalShadowMap,It.directionalShadowMatrix.value=z.state.directionalShadowMatrix,It.spotShadowMap.value=z.state.spotShadowMap,It.spotLightMatrix.value=z.state.spotLightMatrix,It.spotLightMap.value=z.state.spotLightMap,It.pointShadowMap.value=z.state.pointShadowMap,It.pointShadowMatrix.value=z.state.pointShadowMatrix),k.currentProgram=Rt,k.uniformsList=null,Rt}function fa(y){if(y.uniformsList===null){let D=y.currentProgram.getUniforms();y.uniformsList=si.seqWithValue(D.seq,y.uniforms)}return y.uniformsList}function pa(y,D){let V=gt.get(y);V.outputColorSpace=D.outputColorSpace,V.batching=D.batching,V.instancing=D.instancing,V.instancingColor=D.instancingColor,V.skinning=D.skinning,V.morphTargets=D.morphTargets,V.morphNormals=D.morphNormals,V.morphColors=D.morphColors,V.morphTargetsCount=D.morphTargetsCount,V.numClippingPlanes=D.numClippingPlanes,V.numIntersection=D.numClipIntersection,V.vertexAlphas=D.vertexAlphas,V.vertexTangents=D.vertexTangents,V.toneMapping=D.toneMapping}function pl(y,D,V,k,z){D.isScene!==!0&&(D=vt),M.resetTextureUnits();let lt=D.fog,mt=k.isMeshStandardMaterial?D.environment:null,St=C===null?v.outputColorSpace:C.isXRRenderTarget===!0?C.texture.colorSpace:rn,Tt=(k.isMeshStandardMaterial?B:_).get(k.envMap||mt),Ft=k.vertexColors===!0&&!!V.attributes.color&&V.attributes.color.itemSize===4,Rt=!!V.attributes.tangent&&(!!k.normalMap||k.anisotropy>0),It=!!V.morphAttributes.position,te=!!V.morphAttributes.normal,Te=!!V.morphAttributes.color,re=pn;k.toneMapped&&(C===null||C.isXRRenderTarget===!0)&&(re=v.toneMapping);let Ze=V.morphAttributes.position||V.morphAttributes.normal||V.morphAttributes.color,Kt=Ze!==void 0?Ze.length:0,Bt=gt.get(k),Vs=p.state.lights;if(q===!0&&(st===!0||y!==S)){let Le=y===S&&k.id===Y;Nt.setState(k,y,Le)}let jt=!1;k.version===Bt.__version?(Bt.needsLights&&Bt.lightsStateVersion!==Vs.state.version||Bt.outputColorSpace!==St||z.isBatchedMesh&&Bt.batching===!1||!z.isBatchedMesh&&Bt.batching===!0||z.isInstancedMesh&&Bt.instancing===!1||!z.isInstancedMesh&&Bt.instancing===!0||z.isSkinnedMesh&&Bt.skinning===!1||!z.isSkinnedMesh&&Bt.skinning===!0||z.isInstancedMesh&&Bt.instancingColor===!0&&z.instanceColor===null||z.isInstancedMesh&&Bt.instancingColor===!1&&z.instanceColor!==null||Bt.envMap!==Tt||k.fog===!0&&Bt.fog!==lt||Bt.numClippingPlanes!==void 0&&(Bt.numClippingPlanes!==Nt.numPlanes||Bt.numIntersection!==Nt.numIntersection)||Bt.vertexAlphas!==Ft||Bt.vertexTangents!==Rt||Bt.morphTargets!==It||Bt.morphNormals!==te||Bt.morphColors!==Te||Bt.toneMapping!==re||At.isWebGL2===!0&&Bt.morphTargetsCount!==Kt)&&(jt=!0):(jt=!0,Bt.__version=k.version);let Mn=Bt.currentProgram;jt===!0&&(Mn=Ni(k,D,z));let ma=!1,gi=!1,ks=!1,de=Mn.getUniforms(),Sn=Bt.uniforms;if(ht.useProgram(Mn.program)&&(ma=!0,gi=!0,ks=!0),k.id!==Y&&(Y=k.id,gi=!0),ma||S!==y){de.setValue(O,\"projectionMatrix\",y.projectionMatrix),de.setValue(O,\"viewMatrix\",y.matrixWorldInverse);let Le=de.map.cameraPosition;Le!==void 0&&Le.setValue(O,Et.setFromMatrixPosition(y.matrixWorld)),At.logarithmicDepthBuffer&&de.setValue(O,\"logDepthBufFC\",2/(Math.log(y.far+1)/Math.LN2)),(k.isMeshPhongMaterial||k.isMeshToonMaterial||k.isMeshLambertMaterial||k.isMeshBasicMaterial||k.isMeshStandardMaterial||k.isShaderMaterial)&&de.setValue(O,\"isOrthographic\",y.isOrthographicCamera===!0),S!==y&&(S=y,gi=!0,ks=!0)}if(z.isSkinnedMesh){de.setOptional(O,z,\"bindMatrix\"),de.setOptional(O,z,\"bindMatrixInverse\");let Le=z.skeleton;Le&&(At.floatVertexTextures?(Le.boneTexture===null&&Le.computeBoneTexture(),de.setValue(O,\"boneTexture\",Le.boneTexture,M)):console.warn(\"THREE.WebGLRenderer: SkinnedMesh can only be used with WebGL 2. With WebGL 1 OES_texture_float and vertex textures support is required.\"))}z.isBatchedMesh&&(de.setOptional(O,z,\"batchingTexture\"),de.setValue(O,\"batchingTexture\",z._matricesTexture,M));let Hs=V.morphAttributes;if((Hs.position!==void 0||Hs.normal!==void 0||Hs.color!==void 0&&At.isWebGL2===!0)&&Vt.update(z,V,Mn),(gi||Bt.receiveShadow!==z.receiveShadow)&&(Bt.receiveShadow=z.receiveShadow,de.setValue(O,\"receiveShadow\",z.receiveShadow)),k.isMeshGouraudMaterial&&k.envMap!==null&&(Sn.envMap.value=Tt,Sn.flipEnvMap.value=Tt.isCubeTexture&&Tt.isRenderTargetTexture===!1?-1:1),gi&&(de.setValue(O,\"toneMappingExposure\",v.toneMappingExposure),Bt.needsLights&&ml(Sn,ks),lt&&k.fog===!0&&rt.refreshFogUniforms(Sn,lt),rt.refreshMaterialUniforms(Sn,k,I,F,pt),si.upload(O,fa(Bt),Sn,M)),k.isShaderMaterial&&k.uniformsNeedUpdate===!0&&(si.upload(O,fa(Bt),Sn,M),k.uniformsNeedUpdate=!1),k.isSpriteMaterial&&de.setValue(O,\"center\",z.center),de.setValue(O,\"modelViewMatrix\",z.modelViewMatrix),de.setValue(O,\"normalMatrix\",z.normalMatrix),de.setValue(O,\"modelMatrix\",z.matrixWorld),k.isShaderMaterial||k.isRawShaderMaterial){let Le=k.uniformsGroups;for(let Gs=0,_l=Le.length;Gs<_l;Gs++)if(At.isWebGL2){let ga=Le[Gs];Ht.update(ga,Mn),Ht.bind(ga,Mn)}else console.warn(\"THREE.WebGLRenderer: Uniform Buffer Objects can only be used with WebGL 2.\")}return Mn}function ml(y,D){y.ambientLightColor.needsUpdate=D,y.lightProbe.needsUpdate=D,y.directionalLights.needsUpdate=D,y.directionalLightShadows.needsUpdate=D,y.pointLights.needsUpdate=D,y.pointLightShadows.needsUpdate=D,y.spotLights.needsUpdate=D,y.spotLightShadows.needsUpdate=D,y.rectAreaLights.needsUpdate=D,y.hemisphereLights.needsUpdate=D}function gl(y){return y.isMeshLambertMaterial||y.isMeshToonMaterial||y.isMeshPhongMaterial||y.isMeshStandardMaterial||y.isShadowMaterial||y.isShaderMaterial&&y.lights===!0}this.getActiveCubeFace=function(){return U},this.getActiveMipmapLevel=function(){return R},this.getRenderTarget=function(){return C},this.setRenderTargetTextures=function(y,D,V){gt.get(y.texture).__webglTexture=D,gt.get(y.depthTexture).__webglTexture=V;let k=gt.get(y);k.__hasExternalTextures=!0,k.__hasExternalTextures&&(k.__autoAllocateDepthBuffer=V===void 0,k.__autoAllocateDepthBuffer||_t.has(\"WEBGL_multisampled_render_to_texture\")===!0&&(console.warn(\"THREE.WebGLRenderer: Render-to-texture extension was disabled because an external texture was provided\"),k.__useRenderToTexture=!1))},this.setRenderTargetFramebuffer=function(y,D){let V=gt.get(y);V.__webglFramebuffer=D,V.__useDefaultFramebuffer=D===void 0},this.setRenderTarget=function(y,D=0,V=0){C=y,U=D,R=V;let k=!0,z=null,lt=!1,mt=!1;if(y){let Tt=gt.get(y);Tt.__useDefaultFramebuffer!==void 0?(ht.bindFramebuffer(O.FRAMEBUFFER,null),k=!1):Tt.__webglFramebuffer===void 0?M.setupRenderTarget(y):Tt.__hasExternalTextures&&M.rebindTextures(y,gt.get(y.texture).__webglTexture,gt.get(y.depthTexture).__webglTexture);let Ft=y.texture;(Ft.isData3DTexture||Ft.isDataArrayTexture||Ft.isCompressedArrayTexture)&&(mt=!0);let Rt=gt.get(y).__webglFramebuffer;y.isWebGLCubeRenderTarget?(Array.isArray(Rt[D])?z=Rt[D][V]:z=Rt[D],lt=!0):At.isWebGL2&&y.samples>0&&M.useMultisampledRTT(y)===!1?z=gt.get(y).__webglMultisampledFramebuffer:Array.isArray(Rt)?z=Rt[V]:z=Rt,b.copy(y.viewport),H.copy(y.scissor),K=y.scissorTest}else b.copy(Z).multiplyScalar(I).floor(),H.copy($).multiplyScalar(I).floor(),K=et;if(ht.bindFramebuffer(O.FRAMEBUFFER,z)&&At.drawBuffers&&k&&ht.drawBuffers(y,z),ht.viewport(b),ht.scissor(H),ht.setScissorTest(K),lt){let Tt=gt.get(y.texture);O.framebufferTexture2D(O.FRAMEBUFFER,O.COLOR_ATTACHMENT0,O.TEXTURE_CUBE_MAP_POSITIVE_X+D,Tt.__webglTexture,V)}else if(mt){let Tt=gt.get(y.texture),Ft=D||0;O.framebufferTextureLayer(O.FRAMEBUFFER,O.COLOR_ATTACHMENT0,Tt.__webglTexture,V||0,Ft)}Y=-1},this.readRenderTargetPixels=function(y,D,V,k,z,lt,mt){if(!(y&&y.isWebGLRenderTarget)){console.error(\"THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not THREE.WebGLRenderTarget.\");return}let St=gt.get(y).__webglFramebuffer;if(y.isWebGLCubeRenderTarget&&mt!==void 0&&(St=St[mt]),St){ht.bindFramebuffer(O.FRAMEBUFFER,St);try{let Tt=y.texture,Ft=Tt.format,Rt=Tt.type;if(Ft!==Ve&&ut.convert(Ft)!==O.getParameter(O.IMPLEMENTATION_COLOR_READ_FORMAT)){console.error(\"THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not in RGBA or implementation defined format.\");return}let It=Rt===ke&&(_t.has(\"EXT_color_buffer_half_float\")||At.isWebGL2&&_t.has(\"EXT_color_buffer_float\"));if(Rt!==mn&&ut.convert(Rt)!==O.getParameter(O.IMPLEMENTATION_COLOR_READ_TYPE)&&!(Rt===dn&&(At.isWebGL2||_t.has(\"OES_texture_float\")||_t.has(\"WEBGL_color_buffer_float\")))&&!It){console.error(\"THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not in UnsignedByteType or implementation defined type.\");return}D>=0&&D<=y.width-k&&V>=0&&V<=y.height-z&&O.readPixels(D,V,k,z,ut.convert(Ft),ut.convert(Rt),lt)}finally{let Tt=C!==null?gt.get(C).__webglFramebuffer:null;ht.bindFramebuffer(O.FRAMEBUFFER,Tt)}}},this.copyFramebufferToTexture=function(y,D,V=0){let k=Math.pow(2,-V),z=Math.floor(D.image.width*k),lt=Math.floor(D.image.height*k);M.setTexture2D(D,0),O.copyTexSubImage2D(O.TEXTURE_2D,V,0,0,y.x,y.y,z,lt),ht.unbindTexture()},this.copyTextureToTexture=function(y,D,V,k=0){let z=D.image.width,lt=D.image.height,mt=ut.convert(V.format),St=ut.convert(V.type);M.setTexture2D(V,0),O.pixelStorei(O.UNPACK_FLIP_Y_WEBGL,V.flipY),O.pixelStorei(O.UNPACK_PREMULTIPLY_ALPHA_WEBGL,V.premultiplyAlpha),O.pixelStorei(O.UNPACK_ALIGNMENT,V.unpackAlignment),D.isDataTexture?O.texSubImage2D(O.TEXTURE_2D,k,y.x,y.y,z,lt,mt,St,D.image.data):D.isCompressedTexture?O.compressedTexSubImage2D(O.TEXTURE_2D,k,y.x,y.y,D.mipmaps[0].width,D.mipmaps[0].height,mt,D.mipmaps[0].data):O.texSubImage2D(O.TEXTURE_2D,k,y.x,y.y,mt,St,D.image),k===0&&V.generateMipmaps&&O.generateMipmap(O.TEXTURE_2D),ht.unbindTexture()},this.copyTextureToTexture3D=function(y,D,V,k,z=0){if(v.isWebGL1Renderer){console.warn(\"THREE.WebGLRenderer.copyTextureToTexture3D: can only be used with WebGL2.\");return}let lt=y.max.x-y.min.x+1,mt=y.max.y-y.min.y+1,St=y.max.z-y.min.z+1,Tt=ut.convert(k.format),Ft=ut.convert(k.type),Rt;if(k.isData3DTexture)M.setTexture3D(k,0),Rt=O.TEXTURE_3D;else if(k.isDataArrayTexture||k.isCompressedArrayTexture)M.setTexture2DArray(k,0),Rt=O.TEXTURE_2D_ARRAY;else{console.warn(\"THREE.WebGLRenderer.copyTextureToTexture3D: only supports THREE.DataTexture3D and THREE.DataTexture2DArray.\");return}O.pixelStorei(O.UNPACK_FLIP_Y_WEBGL,k.flipY),O.pixelStorei(O.UNPACK_PREMULTIPLY_ALPHA_WEBGL,k.premultiplyAlpha),O.pixelStorei(O.UNPACK_ALIGNMENT,k.unpackAlignment);let It=O.getParameter(O.UNPACK_ROW_LENGTH),te=O.getParameter(O.UNPACK_IMAGE_HEIGHT),Te=O.getParameter(O.UNPACK_SKIP_PIXELS),re=O.getParameter(O.UNPACK_SKIP_ROWS),Ze=O.getParameter(O.UNPACK_SKIP_IMAGES),Kt=V.isCompressedTexture?V.mipmaps[z]:V.image;O.pixelStorei(O.UNPACK_ROW_LENGTH,Kt.width),O.pixelStorei(O.UNPACK_IMAGE_HEIGHT,Kt.height),O.pixelStorei(O.UNPACK_SKIP_PIXELS,y.min.x),O.pixelStorei(O.UNPACK_SKIP_ROWS,y.min.y),O.pixelStorei(O.UNPACK_SKIP_IMAGES,y.min.z),V.isDataTexture||V.isData3DTexture?O.texSubImage3D(Rt,z,D.x,D.y,D.z,lt,mt,St,Tt,Ft,Kt.data):V.isCompressedArrayTexture?(console.warn(\"THREE.WebGLRenderer.copyTextureToTexture3D: untested support for compressed srcTexture.\"),O.compressedTexSubImage3D(Rt,z,D.x,D.y,D.z,lt,mt,St,Tt,Kt.data)):O.texSubImage3D(Rt,z,D.x,D.y,D.z,lt,mt,St,Tt,Ft,Kt),O.pixelStorei(O.UNPACK_ROW_LENGTH,It),O.pixelStorei(O.UNPACK_IMAGE_HEIGHT,te),O.pixelStorei(O.UNPACK_SKIP_PIXELS,Te),O.pixelStorei(O.UNPACK_SKIP_ROWS,re),O.pixelStorei(O.UNPACK_SKIP_IMAGES,Ze),z===0&&k.generateMipmaps&&O.generateMipmap(Rt),ht.unbindTexture()},this.initTexture=function(y){y.isCubeTexture?M.setTextureCube(y,0):y.isData3DTexture?M.setTexture3D(y,0):y.isDataArrayTexture||y.isCompressedArrayTexture?M.setTexture2DArray(y,0):M.setTexture2D(y,0),ht.unbindTexture()},this.resetState=function(){U=0,R=0,C=null,ht.reset(),Ut.reset()},typeof __THREE_DEVTOOLS__<\"u\"&&__THREE_DEVTOOLS__.dispatchEvent(new CustomEvent(\"observe\",{detail:this}))}get coordinateSystem(){return sn}get outputColorSpace(){return this._outputColorSpace}set outputColorSpace(t){this._outputColorSpace=t;let e=this.getContext();e.drawingBufferColorSpace=t===aa?\"display-p3\":\"srgb\",e.unpackColorSpace=Wt.workingColorSpace===Us?\"display-p3\":\"srgb\"}get outputEncoding(){return console.warn(\"THREE.WebGLRenderer: Property .outputEncoding has been removed. Use .outputColorSpace instead.\"),this.outputColorSpace===ce?In:el}set outputEncoding(t){console.warn(\"THREE.WebGLRenderer: Property .outputEncoding has been removed. Use .outputColorSpace instead.\"),this.outputColorSpace=t===In?ce:rn}get useLegacyLights(){return console.warn(\"THREE.WebGLRenderer: The property .useLegacyLights has been deprecated. Migrate your lighting according to the following guide: https://discourse.threejs.org/t/updates-to-lighting-in-three-js-r155/53733.\"),this._useLegacyLights}set useLegacyLights(t){console.warn(\"THREE.WebGLRenderer: The property .useLegacyLights has been deprecated. Migrate your lighting according to the following guide: https://discourse.threejs.org/t/updates-to-lighting-in-three-js-r155/53733.\"),this._useLegacyLights=t}},qr=class extends Ci{};qr.prototype.isWebGL1Renderer=!0;var Cs=class i{constructor(t,e=25e-5){this.isFogExp2=!0,this.name=\"\",this.color=new Pt(t),this.density=e}clone(){return new i(this.color,this.density)}toJSON(){return{type:\"FogExp2\",name:this.name,color:this.color.getHex(),density:this.density}}};var Rs=class extends Pe{constructor(){super(),this.isScene=!0,this.type=\"Scene\",this.background=null,this.environment=null,this.fog=null,this.backgroundBlurriness=0,this.backgroundIntensity=1,this.overrideMaterial=null,typeof __THREE_DEVTOOLS__<\"u\"&&__THREE_DEVTOOLS__.dispatchEvent(new CustomEvent(\"observe\",{detail:this}))}copy(t,e){return super.copy(t,e),t.background!==null&&(this.background=t.background.clone()),t.environment!==null&&(this.environment=t.environment.clone()),t.fog!==null&&(this.fog=t.fog.clone()),this.backgroundBlurriness=t.backgroundBlurriness,this.backgroundIntensity=t.backgroundIntensity,t.overrideMaterial!==null&&(this.overrideMaterial=t.overrideMaterial.clone()),this.matrixAutoUpdate=t.matrixAutoUpdate,this}toJSON(t){let e=super.toJSON(t);return this.fog!==null&&(e.object.fog=this.fog.toJSON()),this.backgroundBlurriness>0&&(e.object.backgroundBlurriness=this.backgroundBlurriness),this.backgroundIntensity!==1&&(e.object.backgroundIntensity=this.backgroundIntensity),e}};var Ri=class extends yn{constructor(t){super(),this.isLineBasicMaterial=!0,this.type=\"LineBasicMaterial\",this.color=new Pt(16777215),this.map=null,this.linewidth=1,this.linecap=\"round\",this.linejoin=\"round\",this.fog=!0,this.setValues(t)}copy(t){return super.copy(t),this.color.copy(t.color),this.map=t.map,this.linewidth=t.linewidth,this.linecap=t.linecap,this.linejoin=t.linejoin,this.fog=t.fog,this}},zo=new N,Vo=new N,ko=new oe,Mr=new wi,ss=new Dn,Ps=class extends Pe{constructor(t=new Se,e=new Ri){super(),this.isLine=!0,this.type=\"Line\",this.geometry=t,this.material=e,this.updateMorphTargets()}copy(t,e){return super.copy(t,e),this.material=Array.isArray(t.material)?t.material.slice():t.material,this.geometry=t.geometry,this}computeLineDistances(){let t=this.geometry;if(t.index===null){let e=t.attributes.position,n=[0];for(let s=1,r=e.count;s<r;s++)zo.fromBufferAttribute(e,s-1),Vo.fromBufferAttribute(e,s),n[s]=n[s-1],n[s]+=zo.distanceTo(Vo);t.setAttribute(\"lineDistance\",new Re(n,1))}else console.warn(\"THREE.Line.computeLineDistances(): Computation only possible with non-indexed BufferGeometry.\");return this}raycast(t,e){let n=this.geometry,s=this.matrixWorld,r=t.params.Line.threshold,o=n.drawRange;if(n.boundingSphere===null&&n.computeBoundingSphere(),ss.copy(n.boundingSphere),ss.applyMatrix4(s),ss.radius+=r,t.ray.intersectsSphere(ss)===!1)return;ko.copy(s).invert(),Mr.copy(t.ray).applyMatrix4(ko);let a=r/((this.scale.x+this.scale.y+this.scale.z)/3),l=a*a,c=new N,h=new N,d=new N,f=new N,m=this.isLineSegments?2:1,g=n.index,p=n.attributes.position;if(g!==null){let u=Math.max(0,o.start),w=Math.min(g.count,o.start+o.count);for(let v=u,P=w-1;v<P;v+=m){let U=g.getX(v),R=g.getX(v+1);if(c.fromBufferAttribute(p,U),h.fromBufferAttribute(p,R),Mr.distanceSqToSegment(c,h,f,d)>l)continue;f.applyMatrix4(this.matrixWorld);let Y=t.ray.origin.distanceTo(f);Y<t.near||Y>t.far||e.push({distance:Y,point:d.clone().applyMatrix4(this.matrixWorld),index:v,face:null,faceIndex:null,object:this})}}else{let u=Math.max(0,o.start),w=Math.min(p.count,o.start+o.count);for(let v=u,P=w-1;v<P;v+=m){if(c.fromBufferAttribute(p,v),h.fromBufferAttribute(p,v+1),Mr.distanceSqToSegment(c,h,f,d)>l)continue;f.applyMatrix4(this.matrixWorld);let R=t.ray.origin.distanceTo(f);R<t.near||R>t.far||e.push({distance:R,point:d.clone().applyMatrix4(this.matrixWorld),index:v,face:null,faceIndex:null,object:this})}}}updateMorphTargets(){let e=this.geometry.morphAttributes,n=Object.keys(e);if(n.length>0){let s=e[n[0]];if(s!==void 0){this.morphTargetInfluences=[],this.morphTargetDictionary={};for(let r=0,o=s.length;r<o;r++){let a=s[r].name||String(r);this.morphTargetInfluences.push(0),this.morphTargetDictionary[a]=r}}}}};var hi=class extends yn{constructor(t){super(),this.isPointsMaterial=!0,this.type=\"PointsMaterial\",this.color=new Pt(16777215),this.map=null,this.alphaMap=null,this.size=1,this.sizeAttenuation=!0,this.fog=!0,this.setValues(t)}copy(t){return super.copy(t),this.color.copy(t.color),this.map=t.map,this.alphaMap=t.alphaMap,this.size=t.size,this.sizeAttenuation=t.sizeAttenuation,this.fog=t.fog,this}},Ho=new oe,Yr=new wi,rs=new Dn,as=new N,Pi=class extends Pe{constructor(t=new Se,e=new hi){super(),this.isPoints=!0,this.type=\"Points\",this.geometry=t,this.material=e,this.updateMorphTargets()}copy(t,e){return super.copy(t,e),this.material=Array.isArray(t.material)?t.material.slice():t.material,this.geometry=t.geometry,this}raycast(t,e){let n=this.geometry,s=this.matrixWorld,r=t.params.Points.threshold,o=n.drawRange;if(n.boundingSphere===null&&n.computeBoundingSphere(),rs.copy(n.boundingSphere),rs.applyMatrix4(s),rs.radius+=r,t.ray.intersectsSphere(rs)===!1)return;Ho.copy(s).invert(),Yr.copy(t.ray).applyMatrix4(Ho);let a=r/((this.scale.x+this.scale.y+this.scale.z)/3),l=a*a,c=n.index,d=n.attributes.position;if(c!==null){let f=Math.max(0,o.start),m=Math.min(c.count,o.start+o.count);for(let g=f,x=m;g<x;g++){let p=c.getX(g);as.fromBufferAttribute(d,p),Go(as,p,l,s,t,e,this)}}else{let f=Math.max(0,o.start),m=Math.min(d.count,o.start+o.count);for(let g=f,x=m;g<x;g++)as.fromBufferAttribute(d,g),Go(as,g,l,s,t,e,this)}}updateMorphTargets(){let e=this.geometry.morphAttributes,n=Object.keys(e);if(n.length>0){let s=e[n[0]];if(s!==void 0){this.morphTargetInfluences=[],this.morphTargetDictionary={};for(let r=0,o=s.length;r<o;r++){let a=s[r].name||String(r);this.morphTargetInfluences.push(0),this.morphTargetDictionary[a]=r}}}}};function Go(i,t,e,n,s,r,o){let a=Yr.distanceSqToPoint(i);if(a<e){let l=new N;Yr.closestPointToPoint(i,l),l.applyMatrix4(n);let c=s.ray.origin.distanceTo(l);if(c<s.near||c>s.far)return;r.push({distance:c,distanceToRay:Math.sqrt(a),point:l,index:t,face:null,object:o})}}function os(i,t,e){return!i||!e&&i.constructor===t?i:typeof t.BYTES_PER_ELEMENT==\"number\"?new t(i):Array.prototype.slice.call(i)}function hp(i){return ArrayBuffer.isView(i)&&!(i instanceof DataView)}var ui=class{constructor(t,e,n,s){this.parameterPositions=t,this._cachedIndex=0,this.resultBuffer=s!==void 0?s:new e.constructor(n),this.sampleValues=e,this.valueSize=n,this.settings=null,this.DefaultSettings_={}}evaluate(t){let e=this.parameterPositions,n=this._cachedIndex,s=e[n],r=e[n-1];n:{t:{let o;e:{i:if(!(t<s)){for(let a=n+2;;){if(s===void 0){if(t<r)break i;return n=e.length,this._cachedIndex=n,this.copySampleValue_(n-1)}if(n===a)break;if(r=s,s=e[++n],t<s)break t}o=e.length;break e}if(!(t>=r)){let a=e[1];t<a&&(n=2,r=a);for(let l=n-2;;){if(r===void 0)return this._cachedIndex=0,this.copySampleValue_(0);if(n===l)break;if(s=r,r=e[--n-1],t>=r)break t}o=n,n=0;break e}break n}for(;n<o;){let a=n+o>>>1;t<e[a]?o=a:n=a+1}if(s=e[n],r=e[n-1],r===void 0)return this._cachedIndex=0,this.copySampleValue_(0);if(s===void 0)return n=e.length,this._cachedIndex=n,this.copySampleValue_(n-1)}this._cachedIndex=n,this.intervalChanged_(n,r,s)}return this.interpolate_(n,r,t,s)}getSettings_(){return this.settings||this.DefaultSettings_}copySampleValue_(t){let e=this.resultBuffer,n=this.sampleValues,s=this.valueSize,r=t*s;for(let o=0;o!==s;++o)e[o]=n[r+o];return e}interpolate_(){throw new Error(\"call to abstract method\")}intervalChanged_(){}},Zr=class extends ui{constructor(t,e,n,s){super(t,e,n,s),this._weightPrev=-0,this._offsetPrev=-0,this._weightNext=-0,this._offsetNext=-0,this.DefaultSettings_={endingStart:Za,endingEnd:Za}}intervalChanged_(t,e,n){let s=this.parameterPositions,r=t-2,o=t+1,a=s[r],l=s[o];if(a===void 0)switch(this.getSettings_().endingStart){case Ja:r=t,a=2*e-n;break;case $a:r=s.length-2,a=e+s[r]-s[r+1];break;default:r=t,a=n}if(l===void 0)switch(this.getSettings_().endingEnd){case Ja:o=t,l=2*n-e;break;case $a:o=1,l=n+s[1]-s[0];break;default:o=t-1,l=e}let c=(n-e)*.5,h=this.valueSize;this._weightPrev=c/(e-a),this._weightNext=c/(l-n),this._offsetPrev=r*h,this._offsetNext=o*h}interpolate_(t,e,n,s){let r=this.resultBuffer,o=this.sampleValues,a=this.valueSize,l=t*a,c=l-a,h=this._offsetPrev,d=this._offsetNext,f=this._weightPrev,m=this._weightNext,g=(n-e)/(s-e),x=g*g,p=x*g,u=-f*p+2*f*x-f*g,w=(1+f)*p+(-1.5-2*f)*x+(-.5+f)*g+1,v=(-1-m)*p+(1.5+m)*x+.5*g,P=m*p-m*x;for(let U=0;U!==a;++U)r[U]=u*o[h+U]+w*o[c+U]+v*o[l+U]+P*o[d+U];return r}},Jr=class extends ui{constructor(t,e,n,s){super(t,e,n,s)}interpolate_(t,e,n,s){let r=this.resultBuffer,o=this.sampleValues,a=this.valueSize,l=t*a,c=l-a,h=(n-e)/(s-e),d=1-h;for(let f=0;f!==a;++f)r[f]=o[c+f]*d+o[l+f]*h;return r}},$r=class extends ui{constructor(t,e,n,s){super(t,e,n,s)}interpolate_(t){return this.copySampleValue_(t-1)}},Ge=class{constructor(t,e,n,s){if(t===void 0)throw new Error(\"THREE.KeyframeTrack: track name is undefined\");if(e===void 0||e.length===0)throw new Error(\"THREE.KeyframeTrack: no keyframes in track named \"+t);this.name=t,this.times=os(e,this.TimeBufferType),this.values=os(n,this.ValueBufferType),this.setInterpolation(s||this.DefaultInterpolation)}static toJSON(t){let e=t.constructor,n;if(e.toJSON!==this.toJSON)n=e.toJSON(t);else{n={name:t.name,times:os(t.times,Array),values:os(t.values,Array)};let s=t.getInterpolation();s!==t.DefaultInterpolation&&(n.interpolation=s)}return n.type=t.ValueTypeName,n}InterpolantFactoryMethodDiscrete(t){return new $r(this.times,this.values,this.getValueSize(),t)}InterpolantFactoryMethodLinear(t){return new Jr(this.times,this.values,this.getValueSize(),t)}InterpolantFactoryMethodSmooth(t){return new Zr(this.times,this.values,this.getValueSize(),t)}setInterpolation(t){let e;switch(t){case cs:e=this.InterpolantFactoryMethodDiscrete;break;case hs:e=this.InterpolantFactoryMethodLinear;break;case $s:e=this.InterpolantFactoryMethodSmooth;break}if(e===void 0){let n=\"unsupported interpolation for \"+this.ValueTypeName+\" keyframe track named \"+this.name;if(this.createInterpolant===void 0)if(t!==this.DefaultInterpolation)this.setInterpolation(this.DefaultInterpolation);else throw new Error(n);return console.warn(\"THREE.KeyframeTrack:\",n),this}return this.createInterpolant=e,this}getInterpolation(){switch(this.createInterpolant){case this.InterpolantFactoryMethodDiscrete:return cs;case this.InterpolantFactoryMethodLinear:return hs;case this.InterpolantFactoryMethodSmooth:return $s}}getValueSize(){return this.values.length/this.times.length}shift(t){if(t!==0){let e=this.times;for(let n=0,s=e.length;n!==s;++n)e[n]+=t}return this}scale(t){if(t!==1){let e=this.times;for(let n=0,s=e.length;n!==s;++n)e[n]*=t}return this}trim(t,e){let n=this.times,s=n.length,r=0,o=s-1;for(;r!==s&&n[r]<t;)++r;for(;o!==-1&&n[o]>e;)--o;if(++o,r!==0||o!==s){r>=o&&(o=Math.max(o,1),r=o-1);let a=this.getValueSize();this.times=n.slice(r,o),this.values=this.values.slice(r*a,o*a)}return this}validate(){let t=!0,e=this.getValueSize();e-Math.floor(e)!==0&&(console.error(\"THREE.KeyframeTrack: Invalid value size in track.\",this),t=!1);let n=this.times,s=this.values,r=n.length;r===0&&(console.error(\"THREE.KeyframeTrack: Track is empty.\",this),t=!1);let o=null;for(let a=0;a!==r;a++){let l=n[a];if(typeof l==\"number\"&&isNaN(l)){console.error(\"THREE.KeyframeTrack: Time is not a valid number.\",this,a,l),t=!1;break}if(o!==null&&o>l){console.error(\"THREE.KeyframeTrack: Out of order keys.\",this,a,l,o),t=!1;break}o=l}if(s!==void 0&&hp(s))for(let a=0,l=s.length;a!==l;++a){let c=s[a];if(isNaN(c)){console.error(\"THREE.KeyframeTrack: Value is not a valid number.\",this,a,c),t=!1;break}}return t}optimize(){let t=this.times.slice(),e=this.values.slice(),n=this.getValueSize(),s=this.getInterpolation()===$s,r=t.length-1,o=1;for(let a=1;a<r;++a){let l=!1,c=t[a],h=t[a+1];if(c!==h&&(a!==1||c!==t[0]))if(s)l=!0;else{let d=a*n,f=d-n,m=d+n;for(let g=0;g!==n;++g){let x=e[d+g];if(x!==e[f+g]||x!==e[m+g]){l=!0;break}}}if(l){if(a!==o){t[o]=t[a];let d=a*n,f=o*n;for(let m=0;m!==n;++m)e[f+m]=e[d+m]}++o}}if(r>0){t[o]=t[r];for(let a=r*n,l=o*n,c=0;c!==n;++c)e[l+c]=e[a+c];++o}return o!==t.length?(this.times=t.slice(0,o),this.values=e.slice(0,o*n)):(this.times=t,this.values=e),this}clone(){let t=this.times.slice(),e=this.values.slice(),n=this.constructor,s=new n(this.name,t,e);return s.createInterpolant=this.createInterpolant,s}};Ge.prototype.TimeBufferType=Float32Array;Ge.prototype.ValueBufferType=Float32Array;Ge.prototype.DefaultInterpolation=hs;var Nn=class extends Ge{};Nn.prototype.ValueTypeName=\"bool\";Nn.prototype.ValueBufferType=Array;Nn.prototype.DefaultInterpolation=cs;Nn.prototype.InterpolantFactoryMethodLinear=void 0;Nn.prototype.InterpolantFactoryMethodSmooth=void 0;var Kr=class extends Ge{};Kr.prototype.ValueTypeName=\"color\";var Qr=class extends Ge{};Qr.prototype.ValueTypeName=\"number\";var jr=class extends ui{constructor(t,e,n,s){super(t,e,n,s)}interpolate_(t,e,n,s){let r=this.resultBuffer,o=this.sampleValues,a=this.valueSize,l=(n-e)/(s-e),c=t*a;for(let h=c+a;c!==h;c+=4)vn.slerpFlat(r,0,o,c-a,o,c,l);return r}},Li=class extends Ge{InterpolantFactoryMethodLinear(t){return new jr(this.times,this.values,this.getValueSize(),t)}};Li.prototype.ValueTypeName=\"quaternion\";Li.prototype.DefaultInterpolation=hs;Li.prototype.InterpolantFactoryMethodSmooth=void 0;var Fn=class extends Ge{};Fn.prototype.ValueTypeName=\"string\";Fn.prototype.ValueBufferType=Array;Fn.prototype.DefaultInterpolation=cs;Fn.prototype.InterpolantFactoryMethodLinear=void 0;Fn.prototype.InterpolantFactoryMethodSmooth=void 0;var ta=class extends Ge{};ta.prototype.ValueTypeName=\"vector\";var ea=class{constructor(t,e,n){let s=this,r=!1,o=0,a=0,l,c=[];this.onStart=void 0,this.onLoad=t,this.onProgress=e,this.onError=n,this.itemStart=function(h){a++,r===!1&&s.onStart!==void 0&&s.onStart(h,o,a),r=!0},this.itemEnd=function(h){o++,s.onProgress!==void 0&&s.onProgress(h,o,a),o===a&&(r=!1,s.onLoad!==void 0&&s.onLoad())},this.itemError=function(h){s.onError!==void 0&&s.onError(h)},this.resolveURL=function(h){return l?l(h):h},this.setURLModifier=function(h){return l=h,this},this.addHandler=function(h,d){return c.push(h,d),this},this.removeHandler=function(h){let d=c.indexOf(h);return d!==-1&&c.splice(d,2),this},this.getHandler=function(h){for(let d=0,f=c.length;d<f;d+=2){let m=c[d],g=c[d+1];if(m.global&&(m.lastIndex=0),m.test(h))return g}return null}}},up=new ea,na=class{constructor(t){this.manager=t!==void 0?t:up,this.crossOrigin=\"anonymous\",this.withCredentials=!1,this.path=\"\",this.resourcePath=\"\",this.requestHeader={}}load(){}loadAsync(t,e){let n=this;return new Promise(function(s,r){n.load(t,s,e,r)})}parse(){}setCrossOrigin(t){return this.crossOrigin=t,this}setWithCredentials(t){return this.withCredentials=t,this}setPath(t){return this.path=t,this}setResourcePath(t){return this.resourcePath=t,this}setRequestHeader(t){return this.requestHeader=t,this}};na.DEFAULT_MATERIAL_NAME=\"__DEFAULT\";var Ls=class{constructor(t=!0){this.autoStart=t,this.startTime=0,this.oldTime=0,this.elapsedTime=0,this.running=!1}start(){this.startTime=Wo(),this.oldTime=this.startTime,this.elapsedTime=0,this.running=!0}stop(){this.getElapsedTime(),this.running=!1,this.autoStart=!1}getElapsedTime(){return this.getDelta(),this.elapsedTime}getDelta(){let t=0;if(this.autoStart&&!this.running)return this.start(),0;if(this.running){let e=Wo();t=(e-this.oldTime)/1e3,this.oldTime=e,this.elapsedTime+=t}return t}};function Wo(){return(typeof performance>\"u\"?Date:performance).now()}var la=\"\\\\[\\\\]\\\\.:\\\\/\",dp=new RegExp(\"[\"+la+\"]\",\"g\"),ca=\"[^\"+la+\"]\",fp=\"[^\"+la.replace(\"\\\\.\",\"\")+\"]\",pp=/((?:WC+[\\/:])*)/.source.replace(\"WC\",ca),mp=/(WCOD+)?/.source.replace(\"WCOD\",fp),gp=/(?:\\.(WC+)(?:\\[(.+)\\])?)?/.source.replace(\"WC\",ca),_p=/\\.(WC+)(?:\\[(.+)\\])?/.source.replace(\"WC\",ca),xp=new RegExp(\"^\"+pp+mp+gp+_p+\"$\"),vp=[\"material\",\"materials\",\"bones\",\"map\"],ia=class{constructor(t,e,n){let s=n||$t.parseTrackName(e);this._targetGroup=t,this._bindings=t.subscribe_(e,s)}getValue(t,e){this.bind();let n=this._targetGroup.nCachedObjects_,s=this._bindings[n];s!==void 0&&s.getValue(t,e)}setValue(t,e){let n=this._bindings;for(let s=this._targetGroup.nCachedObjects_,r=n.length;s!==r;++s)n[s].setValue(t,e)}bind(){let t=this._bindings;for(let e=this._targetGroup.nCachedObjects_,n=t.length;e!==n;++e)t[e].bind()}unbind(){let t=this._bindings;for(let e=this._targetGroup.nCachedObjects_,n=t.length;e!==n;++e)t[e].unbind()}},$t=class i{constructor(t,e,n){this.path=e,this.parsedPath=n||i.parseTrackName(e),this.node=i.findNode(t,this.parsedPath.nodeName),this.rootNode=t,this.getValue=this._getValue_unbound,this.setValue=this._setValue_unbound}static create(t,e,n){return t&&t.isAnimationObjectGroup?new i.Composite(t,e,n):new i(t,e,n)}static sanitizeNodeName(t){return t.replace(/\\s/g,\"_\").replace(dp,\"\")}static parseTrackName(t){let e=xp.exec(t);if(e===null)throw new Error(\"PropertyBinding: Cannot parse trackName: \"+t);let n={nodeName:e[2],objectName:e[3],objectIndex:e[4],propertyName:e[5],propertyIndex:e[6]},s=n.nodeName&&n.nodeName.lastIndexOf(\".\");if(s!==void 0&&s!==-1){let r=n.nodeName.substring(s+1);vp.indexOf(r)!==-1&&(n.nodeName=n.nodeName.substring(0,s),n.objectName=r)}if(n.propertyName===null||n.propertyName.length===0)throw new Error(\"PropertyBinding: can not parse propertyName from trackName: \"+t);return n}static findNode(t,e){if(e===void 0||e===\"\"||e===\".\"||e===-1||e===t.name||e===t.uuid)return t;if(t.skeleton){let n=t.skeleton.getBoneByName(e);if(n!==void 0)return n}if(t.children){let n=function(r){for(let o=0;o<r.length;o++){let a=r[o];if(a.name===e||a.uuid===e)return a;let l=n(a.children);if(l)return l}return null},s=n(t.children);if(s)return s}return null}_getValue_unavailable(){}_setValue_unavailable(){}_getValue_direct(t,e){t[e]=this.targetObject[this.propertyName]}_getValue_array(t,e){let n=this.resolvedProperty;for(let s=0,r=n.length;s!==r;++s)t[e++]=n[s]}_getValue_arrayElement(t,e){t[e]=this.resolvedProperty[this.propertyIndex]}_getValue_toArray(t,e){this.resolvedProperty.toArray(t,e)}_setValue_direct(t,e){this.targetObject[this.propertyName]=t[e]}_setValue_direct_setNeedsUpdate(t,e){this.targetObject[this.propertyName]=t[e],this.targetObject.needsUpdate=!0}_setValue_direct_setMatrixWorldNeedsUpdate(t,e){this.targetObject[this.propertyName]=t[e],this.targetObject.matrixWorldNeedsUpdate=!0}_setValue_array(t,e){let n=this.resolvedProperty;for(let s=0,r=n.length;s!==r;++s)n[s]=t[e++]}_setValue_array_setNeedsUpdate(t,e){let n=this.resolvedProperty;for(let s=0,r=n.length;s!==r;++s)n[s]=t[e++];this.targetObject.needsUpdate=!0}_setValue_array_setMatrixWorldNeedsUpdate(t,e){let n=this.resolvedProperty;for(let s=0,r=n.length;s!==r;++s)n[s]=t[e++];this.targetObject.matrixWorldNeedsUpdate=!0}_setValue_arrayElement(t,e){this.resolvedProperty[this.propertyIndex]=t[e]}_setValue_arrayElement_setNeedsUpdate(t,e){this.resolvedProperty[this.propertyIndex]=t[e],this.targetObject.needsUpdate=!0}_setValue_arrayElement_setMatrixWorldNeedsUpdate(t,e){this.resolvedProperty[this.propertyIndex]=t[e],this.targetObject.matrixWorldNeedsUpdate=!0}_setValue_fromArray(t,e){this.resolvedProperty.fromArray(t,e)}_setValue_fromArray_setNeedsUpdate(t,e){this.resolvedProperty.fromArray(t,e),this.targetObject.needsUpdate=!0}_setValue_fromArray_setMatrixWorldNeedsUpdate(t,e){this.resolvedProperty.fromArray(t,e),this.targetObject.matrixWorldNeedsUpdate=!0}_getValue_unbound(t,e){this.bind(),this.getValue(t,e)}_setValue_unbound(t,e){this.bind(),this.setValue(t,e)}bind(){let t=this.node,e=this.parsedPath,n=e.objectName,s=e.propertyName,r=e.propertyIndex;if(t||(t=i.findNode(this.rootNode,e.nodeName),this.node=t),this.getValue=this._getValue_unavailable,this.setValue=this._setValue_unavailable,!t){console.warn(\"THREE.PropertyBinding: No target node found for track: \"+this.path+\".\");return}if(n){let c=e.objectIndex;switch(n){case\"materials\":if(!t.material){console.error(\"THREE.PropertyBinding: Can not bind to material as node does not have a material.\",this);return}if(!t.material.materials){console.error(\"THREE.PropertyBinding: Can not bind to material.materials as node.material does not have a materials array.\",this);return}t=t.material.materials;break;case\"bones\":if(!t.skeleton){console.error(\"THREE.PropertyBinding: Can not bind to bones as node does not have a skeleton.\",this);return}t=t.skeleton.bones;for(let h=0;h<t.length;h++)if(t[h].name===c){c=h;break}break;case\"map\":if(\"map\"in t){t=t.map;break}if(!t.material){console.error(\"THREE.PropertyBinding: Can not bind to material as node does not have a material.\",this);return}if(!t.material.map){console.error(\"THREE.PropertyBinding: Can not bind to material.map as node.material does not have a map.\",this);return}t=t.material.map;break;default:if(t[n]===void 0){console.error(\"THREE.PropertyBinding: Can not bind to objectName of node undefined.\",this);return}t=t[n]}if(c!==void 0){if(t[c]===void 0){console.error(\"THREE.PropertyBinding: Trying to bind to objectIndex of objectName, but is undefined.\",this,t);return}t=t[c]}}let o=t[s];if(o===void 0){let c=e.nodeName;console.error(\"THREE.PropertyBinding: Trying to update property for track: \"+c+\".\"+s+\" but it wasn't found.\",t);return}let a=this.Versioning.None;this.targetObject=t,t.needsUpdate!==void 0?a=this.Versioning.NeedsUpdate:t.matrixWorldNeedsUpdate!==void 0&&(a=this.Versioning.MatrixWorldNeedsUpdate);let l=this.BindingType.Direct;if(r!==void 0){if(s===\"morphTargetInfluences\"){if(!t.geometry){console.error(\"THREE.PropertyBinding: Can not bind to morphTargetInfluences because node does not have a geometry.\",this);return}if(!t.geometry.morphAttributes){console.error(\"THREE.PropertyBinding: Can not bind to morphTargetInfluences because node does not have a geometry.morphAttributes.\",this);return}t.morphTargetDictionary[r]!==void 0&&(r=t.morphTargetDictionary[r])}l=this.BindingType.ArrayElement,this.resolvedProperty=o,this.propertyIndex=r}else o.fromArray!==void 0&&o.toArray!==void 0?(l=this.BindingType.HasFromToArray,this.resolvedProperty=o):Array.isArray(o)?(l=this.BindingType.EntireArray,this.resolvedProperty=o):this.propertyName=s;this.getValue=this.GetterByBindingType[l],this.setValue=this.SetterByBindingTypeAndVersioning[l][a]}unbind(){this.node=null,this.getValue=this._getValue_unbound,this.setValue=this._setValue_unbound}};$t.Composite=ia;$t.prototype.BindingType={Direct:0,EntireArray:1,ArrayElement:2,HasFromToArray:3};$t.prototype.Versioning={None:0,NeedsUpdate:1,MatrixWorldNeedsUpdate:2};$t.prototype.GetterByBindingType=[$t.prototype._getValue_direct,$t.prototype._getValue_array,$t.prototype._getValue_arrayElement,$t.prototype._getValue_toArray];$t.prototype.SetterByBindingTypeAndVersioning=[[$t.prototype._setValue_direct,$t.prototype._setValue_direct_setNeedsUpdate,$t.prototype._setValue_direct_setMatrixWorldNeedsUpdate],[$t.prototype._setValue_array,$t.prototype._setValue_array_setNeedsUpdate,$t.prototype._setValue_array_setMatrixWorldNeedsUpdate],[$t.prototype._setValue_arrayElement,$t.prototype._setValue_arrayElement_setNeedsUpdate,$t.prototype._setValue_arrayElement_setMatrixWorldNeedsUpdate],[$t.prototype._setValue_fromArray,$t.prototype._setValue_fromArray_setNeedsUpdate,$t.prototype._setValue_fromArray_setMatrixWorldNeedsUpdate]];var Sp=new Float32Array(1);typeof __THREE_DEVTOOLS__<\"u\"&&__THREE_DEVTOOLS__.dispatchEvent(new CustomEvent(\"register\",{detail:{revision:\"160\"}}));typeof window<\"u\"&&(window.__THREE__?console.warn(\"WARNING: Multiple instances of Three.js being imported.\"):window.__THREE__=\"160\");var Ns={name:\"CopyShader\",uniforms:{tDiffuse:{value:null},opacity:{value:1}},vertexShader:`\n\n\t\tvarying vec2 vUv;\n\n\t\tvoid main() {\n\n\t\t\tvUv = uv;\n\t\t\tgl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\n\n\t\t}`,fragmentShader:`\n\n\t\tuniform float opacity;\n\n\t\tuniform sampler2D tDiffuse;\n\n\t\tvarying vec2 vUv;\n\n\t\tvoid main() {\n\n\t\t\tvec4 texel = texture2D( tDiffuse, vUv );\n\t\t\tgl_FragColor = opacity * texel;\n\n\n\t\t}`};var We=class{constructor(){this.isPass=!0,this.enabled=!0,this.needsSwap=!0,this.clear=!1,this.renderToScreen=!1}setSize(){}render(){console.error(\"THREE.Pass: .render() must be implemented in derived pass.\")}dispose(){}},yp=new Ai(-1,1,1,-1,0,1),ha=class extends Se{constructor(){super(),this.setAttribute(\"position\",new Re([-1,3,0,-1,-1,0,3,-1,0],3)),this.setAttribute(\"uv\",new Re([0,2,0,0,2,0],2))}},Mp=new ha,pi=class{constructor(t){this._mesh=new Ne(Mp,t)}dispose(){this._mesh.geometry.dispose()}render(t){t.render(this._mesh,yp)}get material(){return this._mesh.material}set material(t){this._mesh.material=t}};var Fs=class extends We{constructor(t,e){super(),this.textureID=e!==void 0?e:\"tDiffuse\",t instanceof ue?(this.uniforms=t.uniforms,this.material=t):t&&(this.uniforms=di.clone(t.uniforms),this.material=new ue({name:t.name!==void 0?t.name:\"unspecified\",defines:Object.assign({},t.defines),uniforms:this.uniforms,vertexShader:t.vertexShader,fragmentShader:t.fragmentShader})),this.fsQuad=new pi(this.material)}render(t,e,n){this.uniforms[this.textureID]&&(this.uniforms[this.textureID].value=n.texture),this.fsQuad.material=this.material,this.renderToScreen?(t.setRenderTarget(null),this.fsQuad.render(t)):(t.setRenderTarget(e),this.clear&&t.clear(t.autoClearColor,t.autoClearDepth,t.autoClearStencil),this.fsQuad.render(t))}dispose(){this.material.dispose(),this.fsQuad.dispose()}};var Ui=class extends We{constructor(t,e){super(),this.scene=t,this.camera=e,this.clear=!0,this.needsSwap=!1,this.inverse=!1}render(t,e,n){let s=t.getContext(),r=t.state;r.buffers.color.setMask(!1),r.buffers.depth.setMask(!1),r.buffers.color.setLocked(!0),r.buffers.depth.setLocked(!0);let o,a;this.inverse?(o=0,a=1):(o=1,a=0),r.buffers.stencil.setTest(!0),r.buffers.stencil.setOp(s.REPLACE,s.REPLACE,s.REPLACE),r.buffers.stencil.setFunc(s.ALWAYS,o,4294967295),r.buffers.stencil.setClear(a),r.buffers.stencil.setLocked(!0),t.setRenderTarget(n),this.clear&&t.clear(),t.render(this.scene,this.camera),t.setRenderTarget(e),this.clear&&t.clear(),t.render(this.scene,this.camera),r.buffers.color.setLocked(!1),r.buffers.depth.setLocked(!1),r.buffers.color.setMask(!0),r.buffers.depth.setMask(!0),r.buffers.stencil.setLocked(!1),r.buffers.stencil.setFunc(s.EQUAL,1,4294967295),r.buffers.stencil.setOp(s.KEEP,s.KEEP,s.KEEP),r.buffers.stencil.setLocked(!0)}},Os=class extends We{constructor(){super(),this.needsSwap=!1}render(t){t.state.buffers.stencil.setLocked(!1),t.state.buffers.stencil.setTest(!1)}};var Bs=class{constructor(t,e){if(this.renderer=t,this._pixelRatio=t.getPixelRatio(),e===void 0){let n=t.getSize(new Lt);this._width=n.width,this._height=n.height,e=new Me(this._width*this._pixelRatio,this._height*this._pixelRatio,{type:ke}),e.texture.name=\"EffectComposer.rt1\"}else this._width=e.width,this._height=e.height;this.renderTarget1=e,this.renderTarget2=e.clone(),this.renderTarget2.texture.name=\"EffectComposer.rt2\",this.writeBuffer=this.renderTarget1,this.readBuffer=this.renderTarget2,this.renderToScreen=!0,this.passes=[],this.copyPass=new Fs(Ns),this.copyPass.material.blending=Ye,this.clock=new Ls}swapBuffers(){let t=this.readBuffer;this.readBuffer=this.writeBuffer,this.writeBuffer=t}addPass(t){this.passes.push(t),t.setSize(this._width*this._pixelRatio,this._height*this._pixelRatio)}insertPass(t,e){this.passes.splice(e,0,t),t.setSize(this._width*this._pixelRatio,this._height*this._pixelRatio)}removePass(t){let e=this.passes.indexOf(t);e!==-1&&this.passes.splice(e,1)}isLastEnabledPass(t){for(let e=t+1;e<this.passes.length;e++)if(this.passes[e].enabled)return!1;return!0}render(t){t===void 0&&(t=this.clock.getDelta());let e=this.renderer.getRenderTarget(),n=!1;for(let s=0,r=this.passes.length;s<r;s++){let o=this.passes[s];if(o.enabled!==!1){if(o.renderToScreen=this.renderToScreen&&this.isLastEnabledPass(s),o.render(this.renderer,this.writeBuffer,this.readBuffer,t,n),o.needsSwap){if(n){let a=this.renderer.getContext(),l=this.renderer.state.buffers.stencil;l.setFunc(a.NOTEQUAL,1,4294967295),this.copyPass.render(this.renderer,this.writeBuffer,this.readBuffer,t),l.setFunc(a.EQUAL,1,4294967295)}this.swapBuffers()}Ui!==void 0&&(o instanceof Ui?n=!0:o instanceof Os&&(n=!1))}}this.renderer.setRenderTarget(e)}reset(t){if(t===void 0){let e=this.renderer.getSize(new Lt);this._pixelRatio=this.renderer.getPixelRatio(),this._width=e.width,this._height=e.height,t=this.renderTarget1.clone(),t.setSize(this._width*this._pixelRatio,this._height*this._pixelRatio)}this.renderTarget1.dispose(),this.renderTarget2.dispose(),this.renderTarget1=t,this.renderTarget2=t.clone(),this.writeBuffer=this.renderTarget1,this.readBuffer=this.renderTarget2}setSize(t,e){this._width=t,this._height=e;let n=this._width*this._pixelRatio,s=this._height*this._pixelRatio;this.renderTarget1.setSize(n,s),this.renderTarget2.setSize(n,s);for(let r=0;r<this.passes.length;r++)this.passes[r].setSize(n,s)}setPixelRatio(t){this._pixelRatio=t,this.setSize(this._width,this._height)}dispose(){this.renderTarget1.dispose(),this.renderTarget2.dispose(),this.copyPass.dispose()}};var zs=class extends We{constructor(t,e,n=null,s=null,r=null){super(),this.scene=t,this.camera=e,this.overrideMaterial=n,this.clearColor=s,this.clearAlpha=r,this.clear=!0,this.clearDepth=!1,this.needsSwap=!1,this._oldClearColor=new Pt}render(t,e,n){let s=t.autoClear;t.autoClear=!1;let r,o;this.overrideMaterial!==null&&(o=this.scene.overrideMaterial,this.scene.overrideMaterial=this.overrideMaterial),this.clearColor!==null&&(t.getClearColor(this._oldClearColor),t.setClearColor(this.clearColor)),this.clearAlpha!==null&&(r=t.getClearAlpha(),t.setClearAlpha(this.clearAlpha)),this.clearDepth==!0&&t.clearDepth(),t.setRenderTarget(this.renderToScreen?null:n),this.clear===!0&&t.clear(t.autoClearColor,t.autoClearDepth,t.autoClearStencil),t.render(this.scene,this.camera),this.clearColor!==null&&t.setClearColor(this._oldClearColor),this.clearAlpha!==null&&t.setClearAlpha(r),this.overrideMaterial!==null&&(this.scene.overrideMaterial=o),t.autoClear=s}};var dl={name:\"LuminosityHighPassShader\",shaderID:\"luminosityHighPass\",uniforms:{tDiffuse:{value:null},luminosityThreshold:{value:1},smoothWidth:{value:1},defaultColor:{value:new Pt(0)},defaultOpacity:{value:0}},vertexShader:`\n\n\t\tvarying vec2 vUv;\n\n\t\tvoid main() {\n\n\t\t\tvUv = uv;\n\n\t\t\tgl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\n\n\t\t}`,fragmentShader:`\n\n\t\tuniform sampler2D tDiffuse;\n\t\tuniform vec3 defaultColor;\n\t\tuniform float defaultOpacity;\n\t\tuniform float luminosityThreshold;\n\t\tuniform float smoothWidth;\n\n\t\tvarying vec2 vUv;\n\n\t\tvoid main() {\n\n\t\t\tvec4 texel = texture2D( tDiffuse, vUv );\n\n\t\t\tvec3 luma = vec3( 0.299, 0.587, 0.114 );\n\n\t\t\tfloat v = dot( texel.xyz, luma );\n\n\t\t\tvec4 outputColor = vec4( defaultColor.rgb, defaultOpacity );\n\n\t\t\tfloat alpha = smoothstep( luminosityThreshold, luminosityThreshold + smoothWidth, v );\n\n\t\t\tgl_FragColor = mix( outputColor, texel, alpha );\n\n\t\t}`};var mi=class i extends We{constructor(t,e,n,s){super(),this.strength=e!==void 0?e:1,this.radius=n,this.threshold=s,this.resolution=t!==void 0?new Lt(t.x,t.y):new Lt(256,256),this.clearColor=new Pt(0,0,0),this.renderTargetsHorizontal=[],this.renderTargetsVertical=[],this.nMips=5;let r=Math.round(this.resolution.x/2),o=Math.round(this.resolution.y/2);this.renderTargetBright=new Me(r,o,{type:ke}),this.renderTargetBright.texture.name=\"UnrealBloomPass.bright\",this.renderTargetBright.texture.generateMipmaps=!1;for(let d=0;d<this.nMips;d++){let f=new Me(r,o,{type:ke});f.texture.name=\"UnrealBloomPass.h\"+d,f.texture.generateMipmaps=!1,this.renderTargetsHorizontal.push(f);let m=new Me(r,o,{type:ke});m.texture.name=\"UnrealBloomPass.v\"+d,m.texture.generateMipmaps=!1,this.renderTargetsVertical.push(m),r=Math.round(r/2),o=Math.round(o/2)}let a=dl;this.highPassUniforms=di.clone(a.uniforms),this.highPassUniforms.luminosityThreshold.value=s,this.highPassUniforms.smoothWidth.value=.01,this.materialHighPassFilter=new ue({uniforms:this.highPassUniforms,vertexShader:a.vertexShader,fragmentShader:a.fragmentShader}),this.separableBlurMaterials=[];let l=[3,5,7,9,11];r=Math.round(this.resolution.x/2),o=Math.round(this.resolution.y/2);for(let d=0;d<this.nMips;d++)this.separableBlurMaterials.push(this.getSeperableBlurMaterial(l[d])),this.separableBlurMaterials[d].uniforms.invSize.value=new Lt(1/r,1/o),r=Math.round(r/2),o=Math.round(o/2);this.compositeMaterial=this.getCompositeMaterial(this.nMips),this.compositeMaterial.uniforms.blurTexture1.value=this.renderTargetsVertical[0].texture,this.compositeMaterial.uniforms.blurTexture2.value=this.renderTargetsVertical[1].texture,this.compositeMaterial.uniforms.blurTexture3.value=this.renderTargetsVertical[2].texture,this.compositeMaterial.uniforms.blurTexture4.value=this.renderTargetsVertical[3].texture,this.compositeMaterial.uniforms.blurTexture5.value=this.renderTargetsVertical[4].texture,this.compositeMaterial.uniforms.bloomStrength.value=e,this.compositeMaterial.uniforms.bloomRadius.value=.1;let c=[1,.8,.6,.4,.2];this.compositeMaterial.uniforms.bloomFactors.value=c,this.bloomTintColors=[new N(1,1,1),new N(1,1,1),new N(1,1,1),new N(1,1,1),new N(1,1,1)],this.compositeMaterial.uniforms.bloomTintColors.value=this.bloomTintColors;let h=Ns;this.copyUniforms=di.clone(h.uniforms),this.blendMaterial=new ue({uniforms:this.copyUniforms,vertexShader:h.vertexShader,fragmentShader:h.fragmentShader,blending:_n,depthTest:!1,depthWrite:!1,transparent:!0}),this.enabled=!0,this.needsSwap=!1,this._oldClearColor=new Pt,this.oldClearAlpha=1,this.basic=new li,this.fsQuad=new pi(null)}dispose(){for(let t=0;t<this.renderTargetsHorizontal.length;t++)this.renderTargetsHorizontal[t].dispose();for(let t=0;t<this.renderTargetsVertical.length;t++)this.renderTargetsVertical[t].dispose();this.renderTargetBright.dispose();for(let t=0;t<this.separableBlurMaterials.length;t++)this.separableBlurMaterials[t].dispose();this.compositeMaterial.dispose(),this.blendMaterial.dispose(),this.basic.dispose(),this.fsQuad.dispose()}setSize(t,e){let n=Math.round(t/2),s=Math.round(e/2);this.renderTargetBright.setSize(n,s);for(let r=0;r<this.nMips;r++)this.renderTargetsHorizontal[r].setSize(n,s),this.renderTargetsVertical[r].setSize(n,s),this.separableBlurMaterials[r].uniforms.invSize.value=new Lt(1/n,1/s),n=Math.round(n/2),s=Math.round(s/2)}render(t,e,n,s,r){t.getClearColor(this._oldClearColor),this.oldClearAlpha=t.getClearAlpha();let o=t.autoClear;t.autoClear=!1,t.setClearColor(this.clearColor,0),r&&t.state.buffers.stencil.setTest(!1),this.renderToScreen&&(this.fsQuad.material=this.basic,this.basic.map=n.texture,t.setRenderTarget(null),t.clear(),this.fsQuad.render(t)),this.highPassUniforms.tDiffuse.value=n.texture,this.highPassUniforms.luminosityThreshold.value=this.threshold,this.fsQuad.material=this.materialHighPassFilter,t.setRenderTarget(this.renderTargetBright),t.clear(),this.fsQuad.render(t);let a=this.renderTargetBright;for(let l=0;l<this.nMips;l++)this.fsQuad.material=this.separableBlurMaterials[l],this.separableBlurMaterials[l].uniforms.colorTexture.value=a.texture,this.separableBlurMaterials[l].uniforms.direction.value=i.BlurDirectionX,t.setRenderTarget(this.renderTargetsHorizontal[l]),t.clear(),this.fsQuad.render(t),this.separableBlurMaterials[l].uniforms.colorTexture.value=this.renderTargetsHorizontal[l].texture,this.separableBlurMaterials[l].uniforms.direction.value=i.BlurDirectionY,t.setRenderTarget(this.renderTargetsVertical[l]),t.clear(),this.fsQuad.render(t),a=this.renderTargetsVertical[l];this.fsQuad.material=this.compositeMaterial,this.compositeMaterial.uniforms.bloomStrength.value=this.strength,this.compositeMaterial.uniforms.bloomRadius.value=this.radius,this.compositeMaterial.uniforms.bloomTintColors.value=this.bloomTintColors,t.setRenderTarget(this.renderTargetsHorizontal[0]),t.clear(),this.fsQuad.render(t),this.fsQuad.material=this.blendMaterial,this.copyUniforms.tDiffuse.value=this.renderTargetsHorizontal[0].texture,r&&t.state.buffers.stencil.setTest(!0),this.renderToScreen?(t.setRenderTarget(null),this.fsQuad.render(t)):(t.setRenderTarget(n),this.fsQuad.render(t)),t.setClearColor(this._oldClearColor,this.oldClearAlpha),t.autoClear=o}getSeperableBlurMaterial(t){let e=[];for(let n=0;n<t;n++)e.push(.39894*Math.exp(-.5*n*n/(t*t))/t);return new ue({defines:{KERNEL_RADIUS:t},uniforms:{colorTexture:{value:null},invSize:{value:new Lt(.5,.5)},direction:{value:new Lt(.5,.5)},gaussianCoefficients:{value:e}},vertexShader:`varying vec2 vUv;\n\t\t\t\tvoid main() {\n\t\t\t\t\tvUv = uv;\n\t\t\t\t\tgl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\n\t\t\t\t}`,fragmentShader:`#include <common>\n\t\t\t\tvarying vec2 vUv;\n\t\t\t\tuniform sampler2D colorTexture;\n\t\t\t\tuniform vec2 invSize;\n\t\t\t\tuniform vec2 direction;\n\t\t\t\tuniform float gaussianCoefficients[KERNEL_RADIUS];\n\n\t\t\t\tvoid main() {\n\t\t\t\t\tfloat weightSum = gaussianCoefficients[0];\n\t\t\t\t\tvec3 diffuseSum = texture2D( colorTexture, vUv ).rgb * weightSum;\n\t\t\t\t\tfor( int i = 1; i < KERNEL_RADIUS; i ++ ) {\n\t\t\t\t\t\tfloat x = float(i);\n\t\t\t\t\t\tfloat w = gaussianCoefficients[i];\n\t\t\t\t\t\tvec2 uvOffset = direction * invSize * x;\n\t\t\t\t\t\tvec3 sample1 = texture2D( colorTexture, vUv + uvOffset ).rgb;\n\t\t\t\t\t\tvec3 sample2 = texture2D( colorTexture, vUv - uvOffset ).rgb;\n\t\t\t\t\t\tdiffuseSum += (sample1 + sample2) * w;\n\t\t\t\t\t\tweightSum += 2.0 * w;\n\t\t\t\t\t}\n\t\t\t\t\tgl_FragColor = vec4(diffuseSum/weightSum, 1.0);\n\t\t\t\t}`})}getCompositeMaterial(t){return new ue({defines:{NUM_MIPS:t},uniforms:{blurTexture1:{value:null},blurTexture2:{value:null},blurTexture3:{value:null},blurTexture4:{value:null},blurTexture5:{value:null},bloomStrength:{value:1},bloomFactors:{value:null},bloomTintColors:{value:null},bloomRadius:{value:0}},vertexShader:`varying vec2 vUv;\n\t\t\t\tvoid main() {\n\t\t\t\t\tvUv = uv;\n\t\t\t\t\tgl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\n\t\t\t\t}`,fragmentShader:`varying vec2 vUv;\n\t\t\t\tuniform sampler2D blurTexture1;\n\t\t\t\tuniform sampler2D blurTexture2;\n\t\t\t\tuniform sampler2D blurTexture3;\n\t\t\t\tuniform sampler2D blurTexture4;\n\t\t\t\tuniform sampler2D blurTexture5;\n\t\t\t\tuniform float bloomStrength;\n\t\t\t\tuniform float bloomRadius;\n\t\t\t\tuniform float bloomFactors[NUM_MIPS];\n\t\t\t\tuniform vec3 bloomTintColors[NUM_MIPS];\n\n\t\t\t\tfloat lerpBloomFactor(const in float factor) {\n\t\t\t\t\tfloat mirrorFactor = 1.2 - factor;\n\t\t\t\t\treturn mix(factor, mirrorFactor, bloomRadius);\n\t\t\t\t}\n\n\t\t\t\tvoid main() {\n\t\t\t\t\tgl_FragColor = bloomStrength * ( lerpBloomFactor(bloomFactors[0]) * vec4(bloomTintColors[0], 1.0) * texture2D(blurTexture1, vUv) +\n\t\t\t\t\t\tlerpBloomFactor(bloomFactors[1]) * vec4(bloomTintColors[1], 1.0) * texture2D(blurTexture2, vUv) +\n\t\t\t\t\t\tlerpBloomFactor(bloomFactors[2]) * vec4(bloomTintColors[2], 1.0) * texture2D(blurTexture3, vUv) +\n\t\t\t\t\t\tlerpBloomFactor(bloomFactors[3]) * vec4(bloomTintColors[3], 1.0) * texture2D(blurTexture4, vUv) +\n\t\t\t\t\t\tlerpBloomFactor(bloomFactors[4]) * vec4(bloomTintColors[4], 1.0) * texture2D(blurTexture5, vUv) );\n\t\t\t\t}`})}};mi.BlurDirectionX=new Lt(1,0);mi.BlurDirectionY=new Lt(0,1);(function(){\"use strict\";let t=\"__brainableInnovationFlux\";if(window[t])return;let e=[\"INNOVATION SYSTEM OF BRAINABLE\",\"INNOVATIVE SYSTEMS OF BRAINABLE\"],n=\"\\uBE0C\\uB808\\uC778\\uC5D0\\uC774\\uBE14\\uB9CC\\uC758 \\uD601\\uC2E0 \\uC2DC\\uC2A4\\uD15C\",s=[\"\\uB3C5\\uC790\\uC801\\uC778 \\uC5F0\\uAD6C\\uAC1C\\uBC1C\",\"\\uC804\\uBB38\\uC801\\uC778 \\uC758\\uB8CC \\uC5F0\\uACC4 \\uC2DC\\uC2A4\\uD15C\",\"\\uC9C0\\uC18D\\uC801\\uC778 \\uD655\\uC7A5\"],r=\"#050505\",o=30,a=1.5,l=T=>String(T||\"\").replace(/\\s+/g,\"\"),c=matchMedia(\"(prefers-reduced-motion: reduce)\"),h=null,d=!1,f=0,m=document.createElement(\"style\");m.id=\"brainable-innovation-flux-style\",m.textContent=`\n    [data-bif=\"section\"]{position:relative!important;isolation:isolate;background:${r}!important;}\n    [data-bif=\"old-background\"]{display:none!important;}\n    [data-bif=\"content\"],[data-bif=\"mobile-content\"]{position:relative!important;z-index:1!important;}\n    [data-bif=\"section\"] h2,[data-bif=\"section\"] p,[data-bif=\"section\"] span{font-family:'Noto Sans KR',sans-serif!important;}\n    [data-bif=\"background\"]{position:absolute!important;inset:0!important;width:100%!important;height:100%!important;\n      margin:0!important;padding:0!important;z-index:0!important;pointer-events:none!important;overflow:hidden!important;\n      background:${r}!important;}\n    [data-bif=\"background\"] canvas{display:block!important;width:100%!important;height:100%!important;\n      margin:0!important;padding:0!important;border:0!important;outline:0!important;pointer-events:none!important;}\n    @media(max-width:379px){\n      [data-bif=\"section\"]:has([data-bif=\"mobile-copy\"]){height:auto!important;min-height:1262px!important;}\n      [data-bif=\"mobile-content\"]{width:100%!important;height:auto!important;min-width:0!important;display:block!important;}\n      [data-bif=\"mobile-frame\"]{position:relative!important;inset:auto!important;transform:none!important;\n        box-sizing:border-box!important;width:100%!important;height:auto!important;min-height:1262px!important;\n        padding:145px 24px 100px!important;display:block!important;}\n      [data-bif=\"mobile-copy\"]{width:min(323px,100%)!important;max-width:100%!important;min-width:0!important;height:auto!important;margin:0 auto!important;}\n      [data-bif=\"mobile-copy\"] div,[data-bif=\"mobile-copy\"] section{max-width:100%!important;min-width:0!important;}\n      [data-bif=\"mobile-copy\"]>div:last-child{width:100%!important;height:auto!important;gap:48px!important;}\n      [data-bif=\"mobile-copy\"] section{width:100%!important;height:auto!important;margin-bottom:0!important;justify-content:flex-start!important;}\n      [data-bif=\"mobile-copy\"] .textContents{width:100%!important;max-width:100%!important;min-width:0!important;height:auto!important;}\n      [data-bif=\"mobile-copy\"] p,[data-bif=\"mobile-copy\"] h2{max-width:100%!important;min-width:0!important;height:auto!important;\n        white-space:normal!important;word-break:keep-all!important;overflow-wrap:break-word!important;}\n    }\n  `,document.head.appendChild(m);function g(T,E,L){L.push([T,T.getAttribute(\"data-bif\")]),T.setAttribute(\"data-bif\",E)}function x(){let T=Array.from(document.querySelectorAll(\"main h2\")).filter(L=>e.some(F=>l(L.textContent)===l(F))),E=[];for(let L of T){let F=null;for(let I=L.parentElement;I&&I.tagName!==\"MAIN\";I=I.parentElement){let G=Array.from(I.querySelectorAll(\"h2,p\")).map(et=>l(et.textContent));if(!G.includes(l(n))||!s.every(et=>G.includes(l(et))))continue;!F&&l(L.textContent)===l(e[1])&&(F=I);let X=Array.from(I.children).find(et=>et.getAttribute(\"aria-hidden\")===\"true\"&&et.querySelector('img[alt=\"\"]')),Z=Array.from(I.children).find(et=>et.contains(L)),$=l(L.textContent)===l(e[1])&&I.parentElement?.tagName===\"MAIN\";if(Z&&Z!==X&&(X||$)){E.push({section:I,background:X||null,content:Z,mobileCopy:$?F:null,mobileFrame:$?F?.parentElement:null});break}}}return E.length===1?E[0]:null}function p(T){if(!T.gpu)return;let E=T.gpu;T.gpu=null,E.scene.traverse(L=>{L.geometry&&L.geometry.dispose(),L.material&&(Array.isArray(L.material)?L.material:[L.material]).forEach(I=>I.dispose())}),E.bloomPass.dispose(),E.composer.dispose(),E.renderer.dispose(),E.renderer.forceContextLoss()}function u(T){let E=new Rs;E.background=new Pt(328965),E.fog=new Cs(328965,.04);let L=new ve(75,T.width/Math.max(1,T.height),.1,100);L.position.z=7;let F;try{let dt=function(gt,M){let _=[];for(let tt=0;tt<400;tt++){let ft=tt/399,rt=ft*Math.PI*14+gt,ct=.2+ft*2.8,yt=(.5-ft)*6;_.push(new N(Math.cos(rt)*ct,yt,Math.sin(rt)*ct))}let Q=new Se().setFromPoints(_),J=new Ri({color:M,transparent:!0,opacity:.15,blending:_n});return new Ps(Q,J)};F=new Ci({canvas:T.canvas,antialias:!1,powerPreference:\"high-performance\",alpha:!1}),F.setPixelRatio(T.dpr),F.setSize(T.width,T.height,!1),F.toneMapping=sa,F.toneMappingExposure=1;let I=new fn;E.add(I);let G=9500,X=new Float32Array(G*3),Z=new Float32Array(G),$=new Float32Array(G),et=new Float32Array(G),W=new Float32Array(G);for(let gt=0;gt<G;gt++){let M=gt*3,_=(Math.random()-.5)*7.5,B=.4+Math.abs(_)*.2,Q=(.1+Math.pow(Math.random(),1.5)*2.5)*B,J=Math.random()*Math.PI*2;et[gt]=_,Z[gt]=Q,$[gt]=J,W[gt]=.5+Math.random()*.8,X[M]=Math.cos(J)*Q,X[M+1]=_,X[M+2]=Math.sin(J)*Q}let q=new Se;q.setAttribute(\"position\",new ye(X,3));let st=new hi({size:.006,color:14540253,transparent:!0,opacity:.6,blending:_n,depthWrite:!1}),pt=new Pi(q,st);I.add(pt);let bt=dt(0,5592405),Et=dt(Math.PI,14540253);I.add(bt),I.add(Et);let vt=new Se,kt=300,O=new Float32Array(kt*3);for(let gt=0;gt<kt*3;gt++)O[gt]=(Math.random()-.5)*12;vt.setAttribute(\"position\",new ye(O,3));let le=new hi({size:.008,color:5592405,transparent:!0,opacity:.4,blending:_n}),_t=new Pi(vt,le);E.add(_t);let At=new zs(E,L),ht=new mi(new Lt(T.width,T.height),1,.4,.85);ht.strength=.6,ht.radius=.3,ht.threshold=.2;let Xt=new Bs(F);return Xt.addPass(At),Xt.addPass(ht),T.gpu={scene:E,camera:L,renderer:F,mainGroup:I,vortexGeometry:q,vortexCount:G,vortexRadius:Z,vortexAngle:$,vortexHeight:et,vortexSpeed:W,spiralLineA:bt,spiralLineB:Et,particlesMesh:_t,composer:Xt,bloomPass:ht},T.error=null,!0}catch(I){return E.traverse(G=>{G.geometry?.dispose(),G.material?.dispose()}),F&&F.dispose(),T.error=String(I?.message||I),T.state=\"webgl-unavailable\",!1}}function w(T,E,L=1/60){if(!T.gpu)return;let F=performance.now(),I=T.gpu,G=T.mouseX*.001,X=T.mouseY*8e-4,Z=L*60,$=1-Math.pow(1-.03,Z),et=.002*(1-.03)/.03;I.mainGroup.rotation.y+=$*(G+et-I.mainGroup.rotation.y),I.mainGroup.rotation.x+=$*(X-I.mainGroup.rotation.x);let W=I.vortexGeometry.attributes.position.array;for(let q=0;q<I.vortexCount;q++){let st=q*3,pt=E*I.vortexSpeed[q]*.5+I.vortexHeight[q]*.5,dt=I.vortexAngle[q]+pt,bt=Math.sin(E*1.2+q*.01)*.05,Et=I.vortexRadius[q]+bt;W[st]=Math.cos(dt)*Et,W[st+1]=I.vortexHeight[q]+Math.sin(E+q*.02)*.03,W[st+2]=Math.sin(dt)*Et}I.vortexGeometry.attributes.position.needsUpdate=!0,I.spiralLineA.rotation.y=E*.15,I.spiralLineB.rotation.y=-E*.12,I.particlesMesh.rotation.y=E*.03,I.particlesMesh.rotation.x=-T.mouseY*1e-4;try{I.composer.render(),T.frames+=1,T.renderCost=performance.now()-F,T.renderMax=Math.max(T.renderMax,T.renderCost)}catch(q){T.error=String(q?.message||q),T.state=\"render-unavailable\",v(T)}}function v(T){T.raf&&cancelAnimationFrame(T.raf),T.raf=0,T.last=0}function P(T){let E=h;if(!E||!E.raf)return;if(!E.visible||document.hidden||c.matches||E.error){v(E),U();return}E.last===0&&(E.last=T);let L=T-E.last;if(L>=1e3/o-.5){let F=Math.min(L/1e3,.1);E.elapsed+=F,E.last=T,w(E,E.elapsed,F)}E.error||(E.raf=requestAnimationFrame(P))}function U(){let T=h;if(T){if(T.error){v(T);return}if(!T.visible||document.hidden){v(T),T.state=document.hidden?\"document-hidden\":\"offscreen\";return}if(!(!T.gpu&&!u(T))){if(c.matches){v(T),T.state=\"reduced-motion\",w(T,T.elapsed||.76);return}T.state=\"running\",T.raf||(w(T,T.elapsed),T.error||(T.raf=requestAnimationFrame(P)))}}}function R(T){let E=T.section.getBoundingClientRect(),L=Math.max(1,Math.round(E.width)),F=Math.max(1,Math.round(E.height)),I=Math.min(devicePixelRatio||1,a);T.width===L&&T.height===F&&T.dpr===I||(T.width=L,T.height=F,T.dpr=I,T.gpu&&(T.gpu.camera.aspect=L/F,T.gpu.camera.updateProjectionMatrix(),T.gpu.renderer.setPixelRatio(I),T.gpu.renderer.setSize(L,F,!1),T.gpu.composer.setPixelRatio(I),T.gpu.composer.setSize(L,F),T.visible&&!document.hidden&&w(T,T.elapsed||.76)))}function C(){let T=h;T&&(h=null,v(T),Y.unobserve(T.section),T.resize.disconnect(),T.section.removeEventListener(\"pointermove\",T.pointer),T.section.removeEventListener(\"pointerleave\",T.leave),T.canvas.removeEventListener(\"webglcontextlost\",T.contextLost),T.canvas.removeEventListener(\"webglcontextrestored\",T.contextRestored),p(T),T.background.remove(),T.records.forEach(([E,L])=>L===null?E.removeAttribute(\"data-bif\"):E.setAttribute(\"data-bif\",L)))}let Y=new IntersectionObserver(T=>{let E=T.find(L=>L.target===h?.section);E&&h&&(h.visible=E.isIntersecting&&E.intersectionRatio>.01,U())},{threshold:[0,.01]});function S(T){let E=[];g(T.section,\"section\",E),T.background&&g(T.background,\"old-background\",E),g(T.content,T.mobileCopy?\"mobile-content\":\"content\",E),T.mobileFrame&&T.mobileFrame!==T.content&&g(T.mobileFrame,\"mobile-frame\",E),T.mobileCopy&&g(T.mobileCopy,\"mobile-copy\",E);let L=document.createElement(\"div\");L.setAttribute(\"data-bif\",\"background\"),L.setAttribute(\"aria-hidden\",\"true\");let F=document.createElement(\"canvas\");F.setAttribute(\"aria-hidden\",\"true\"),L.appendChild(F),T.section.prepend(L);let I={section:T.section,background:L,canvas:F,records:E,width:0,height:0,dpr:0,copy:Array.from(T.section.querySelectorAll(\"h2,p\")).map(G=>[G,G.textContent]),gpu:null,raf:0,last:0,elapsed:0,visible:!1,mouseX:0,mouseY:0,frames:0,state:\"waiting-visibility\",error:null,renderCost:0,renderMax:0};I.pointer=G=>{if(G.pointerType===\"touch\")return;let X=I.section.getBoundingClientRect();I.mouseX=G.clientX-X.left-X.width/2,I.mouseY=G.clientY-X.top-X.height/2},I.leave=()=>{I.mouseX=0,I.mouseY=0},I.contextLost=G=>{G.preventDefault(),I.error=\"WebGL context lost\",I.state=\"webgl-context-lost\",v(I)},I.contextRestored=()=>{I.error=null,I.state=\"restoring\",requestAnimationFrame(()=>{h!==I||d||(R(I),U())})},I.resize=new ResizeObserver(()=>R(I)),h=I,R(I),I.resize.observe(I.section),I.section.addEventListener(\"pointermove\",I.pointer,{passive:!0}),I.section.addEventListener(\"pointerleave\",I.leave,{passive:!0}),F.addEventListener(\"webglcontextlost\",I.contextLost),F.addEventListener(\"webglcontextrestored\",I.contextRestored),Y.observe(I.section)}function b(){if(f=0,d)return;if(!/^\\/about_us\\/?$/.test(location.pathname)){C();return}let T=x();if(h?.section===T?.section){h&&R(h);return}C(),T&&S(T)}function H(){!d&&!f&&(f=requestAnimationFrame(b))}let K=new MutationObserver(T=>{T.some(E=>!E.target.closest?.('[data-bif=\"background\"]'))&&H()});K.observe(document.body,{childList:!0,subtree:!0}),window.addEventListener(\"popstate\",H),window.addEventListener(\"pageshow\",H),window.addEventListener(\"resize\",H,{passive:!0}),document.addEventListener(\"visibilitychange\",U),c.addEventListener(\"change\",U),window[t]={version:\"innovation-flux-1\",inspect(){let T=h;return{matched:!!T,active:!!T?.gpu,state:T?.state||\"unmatched\",running:!!T?.raf,inViewport:T?.visible||!1,reducedMotion:c.matches,documentHidden:document.hidden,originalTextRetained:T?T.copy.every(([E,L])=>E.isConnected&&E.textContent===L):null,width:T?.width||0,height:T?.height||0,dpr:T?.dpr||0,frames:T?.frames||0,elapsed:T?.elapsed||0,renderCost:T?.renderCost||0,renderMax:T?.renderMax||0,error:T?.error||null,background:r,colors:[\"#dddddd\",\"#555555\"],vortexParticles:9500,ambientParticles:300,maxFPS:o,maxDPR:a,threeVersion:\"0.160.0\",source:\"MengTo/threeui@68802d5428071ada5c20db8094b1649e6bb770ed\"}},destroy(){d=!0,K.disconnect(),Y.disconnect(),f&&cancelAnimationFrame(f),window.removeEventListener(\"popstate\",H),window.removeEventListener(\"pageshow\",H),window.removeEventListener(\"resize\",H),document.removeEventListener(\"visibilitychange\",U),c.removeEventListener(\"change\",U),C(),m.remove(),delete window[t]}},b()})();})();\n\n\n/* BRAINABLE production global: home-liquid */\n/*\nBRAINABLE HOME Liquid Metal adaptation, 2026-09-30.\nCult/ui source adapted to native product copy and route-scoped DOM lifecycle.\nPaper Shaders 0.0.71 rendering code unmodified; image/parameters from upstream.\n\nMIT License\n\nCopyright (c) 2023 Jordan-Gilliam\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n\nMIT License\n\nCopyright (c) 2024 Lost Coast Labs, Inc. (Paper Design)\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n\n*/\n(()=>{var ft=Object.defineProperty;var gt=(o,e,i)=>e in o?ft(o,e,{enumerable:!0,configurable:!0,writable:!0,value:i}):o[e]=i;var m=(o,e,i)=>gt(o,typeof e!=\"symbol\"?e+\"\":e,i);var it=`#version 300 es\nprecision mediump float;\n\nlayout(location = 0) in vec4 a_position;\n\nuniform vec2 u_resolution;\nuniform float u_pixelRatio;\nuniform float u_imageAspectRatio;\nuniform float u_originX;\nuniform float u_originY;\nuniform float u_worldWidth;\nuniform float u_worldHeight;\nuniform float u_fit;\nuniform float u_scale;\nuniform float u_rotation;\nuniform float u_offsetX;\nuniform float u_offsetY;\n\nout vec2 v_objectUV;\nout vec2 v_objectBoxSize;\nout vec2 v_responsiveUV;\nout vec2 v_responsiveBoxGivenSize;\nout vec2 v_patternUV;\nout vec2 v_patternBoxSize;\nout vec2 v_imageUV;\n\nvec3 getBoxSize(float boxRatio, vec2 givenBoxSize) {\n  vec2 box = vec2(0.);\n  // fit = none\n  box.x = boxRatio * min(givenBoxSize.x / boxRatio, givenBoxSize.y);\n  float noFitBoxWidth = box.x;\n  if (u_fit == 1.) { // fit = contain\n    box.x = boxRatio * min(u_resolution.x / boxRatio, u_resolution.y);\n  } else if (u_fit == 2.) { // fit = cover\n    box.x = boxRatio * max(u_resolution.x / boxRatio, u_resolution.y);\n  }\n  box.y = box.x / boxRatio;\n  return vec3(box, noFitBoxWidth);\n}\n\nvoid main() {\n  gl_Position = a_position;\n\n  vec2 uv = gl_Position.xy * .5;\n  vec2 boxOrigin = vec2(.5 - u_originX, u_originY - .5);\n  vec2 givenBoxSize = vec2(u_worldWidth, u_worldHeight);\n  givenBoxSize = max(givenBoxSize, vec2(1.)) * u_pixelRatio;\n  float r = u_rotation * 3.14159265358979323846 / 180.;\n  mat2 graphicRotation = mat2(cos(r), sin(r), -sin(r), cos(r));\n  vec2 graphicOffset = vec2(-u_offsetX, u_offsetY);\n\n\n  // ===================================================\n\n  float fixedRatio = 1.;\n  vec2 fixedRatioBoxGivenSize = vec2(\n  (u_worldWidth == 0.) ? u_resolution.x : givenBoxSize.x,\n  (u_worldHeight == 0.) ? u_resolution.y : givenBoxSize.y\n  );\n\n  v_objectBoxSize = getBoxSize(fixedRatio, fixedRatioBoxGivenSize).xy;\n  vec2 objectWorldScale = u_resolution.xy / v_objectBoxSize;\n\n  v_objectUV = uv;\n  v_objectUV *= objectWorldScale;\n  v_objectUV += boxOrigin * (objectWorldScale - 1.);\n  v_objectUV += graphicOffset;\n  v_objectUV /= u_scale;\n  v_objectUV = graphicRotation * v_objectUV;\n\n  // ===================================================\n\n  v_responsiveBoxGivenSize = vec2(\n  (u_worldWidth == 0.) ? u_resolution.x : givenBoxSize.x,\n  (u_worldHeight == 0.) ? u_resolution.y : givenBoxSize.y\n  );\n  float responsiveRatio = v_responsiveBoxGivenSize.x / v_responsiveBoxGivenSize.y;\n  vec2 responsiveBoxSize = getBoxSize(responsiveRatio, v_responsiveBoxGivenSize).xy;\n  vec2 responsiveBoxScale = u_resolution.xy / responsiveBoxSize;\n\n  #ifdef ADD_HELPERS\n  v_responsiveHelperBox = uv;\n  v_responsiveHelperBox *= responsiveBoxScale;\n  v_responsiveHelperBox += boxOrigin * (responsiveBoxScale - 1.);\n  #endif\n\n  v_responsiveUV = uv;\n  v_responsiveUV *= responsiveBoxScale;\n  v_responsiveUV += boxOrigin * (responsiveBoxScale - 1.);\n  v_responsiveUV += graphicOffset;\n  v_responsiveUV /= u_scale;\n  v_responsiveUV.x *= responsiveRatio;\n  v_responsiveUV = graphicRotation * v_responsiveUV;\n  v_responsiveUV.x /= responsiveRatio;\n\n  // ===================================================\n\n  float patternBoxRatio = givenBoxSize.x / givenBoxSize.y;\n  vec2 patternBoxGivenSize = vec2(\n  (u_worldWidth == 0.) ? u_resolution.x : givenBoxSize.x,\n  (u_worldHeight == 0.) ? u_resolution.y : givenBoxSize.y\n  );\n  patternBoxRatio = patternBoxGivenSize.x / patternBoxGivenSize.y;\n\n  vec3 boxSizeData = getBoxSize(patternBoxRatio, patternBoxGivenSize);\n  v_patternBoxSize = boxSizeData.xy;\n  float patternBoxNoFitBoxWidth = boxSizeData.z;\n  vec2 patternBoxScale = u_resolution.xy / v_patternBoxSize;\n\n  v_patternUV = uv;\n  v_patternUV += graphicOffset / patternBoxScale;\n  v_patternUV += boxOrigin;\n  v_patternUV -= boxOrigin / patternBoxScale;\n  v_patternUV *= u_resolution.xy;\n  v_patternUV /= u_pixelRatio;\n  if (u_fit > 0.) {\n    v_patternUV *= (patternBoxNoFitBoxWidth / v_patternBoxSize.x);\n  }\n  v_patternUV /= u_scale;\n  v_patternUV = graphicRotation * v_patternUV;\n  v_patternUV += boxOrigin / patternBoxScale;\n  v_patternUV -= boxOrigin;\n  // x100 is a default multiplier between vertex and fragmant shaders\n  // we use it to avoid UV presision issues\n  v_patternUV *= .01;\n\n  // ===================================================\n\n  vec2 imageBoxSize;\n  if (u_fit == 1.) { // contain\n    imageBoxSize.x = min(u_resolution.x / u_imageAspectRatio, u_resolution.y) * u_imageAspectRatio;\n  } else if (u_fit == 2.) { // cover\n    imageBoxSize.x = max(u_resolution.x / u_imageAspectRatio, u_resolution.y) * u_imageAspectRatio;\n  } else {\n    imageBoxSize.x = min(10.0, 10.0 / u_imageAspectRatio * u_imageAspectRatio);\n  }\n  imageBoxSize.y = imageBoxSize.x / u_imageAspectRatio;\n  vec2 imageBoxScale = u_resolution.xy / imageBoxSize;\n\n  v_imageUV = uv;\n  v_imageUV *= imageBoxScale;\n  v_imageUV += boxOrigin * (imageBoxScale - 1.);\n  v_imageUV += graphicOffset;\n  v_imageUV /= u_scale;\n  v_imageUV.x *= u_imageAspectRatio;\n  v_imageUV = graphicRotation * v_imageUV;\n  v_imageUV.x /= u_imageAspectRatio;\n\n  v_imageUV += .5;\n  v_imageUV.y = 1. - v_imageUV.y;\n}`;var at=1920*1080*4,Z=class{constructor(e,i,r,s,l=0,h=0,a=2,y=at,c=[]){m(this,\"parentElement\");m(this,\"canvasElement\");m(this,\"gl\");m(this,\"program\",null);m(this,\"uniformLocations\",{});m(this,\"fragmentShader\");m(this,\"rafId\",null);m(this,\"lastRenderTime\",0);m(this,\"currentFrame\",0);m(this,\"speed\",0);m(this,\"currentSpeed\",0);m(this,\"providedUniforms\");m(this,\"mipmaps\",[]);m(this,\"hasBeenDisposed\",!1);m(this,\"resolutionChanged\",!0);m(this,\"textures\",new Map);m(this,\"minPixelRatio\");m(this,\"maxPixelCount\");m(this,\"isSafari\",bt());m(this,\"uniformCache\",{});m(this,\"textureUnitMap\",new Map);m(this,\"initProgram\",()=>{let e=xt(this.gl,it,this.fragmentShader);e&&(this.program=e)});m(this,\"setupPositionAttribute\",()=>{let e=this.gl.getAttribLocation(this.program,\"a_position\"),i=this.gl.createBuffer();this.gl.bindBuffer(this.gl.ARRAY_BUFFER,i);let r=[-1,-1,1,-1,-1,1,-1,1,1,-1,1,1];this.gl.bufferData(this.gl.ARRAY_BUFFER,new Float32Array(r),this.gl.STATIC_DRAW),this.gl.enableVertexAttribArray(e),this.gl.vertexAttribPointer(e,2,this.gl.FLOAT,!1,0,0)});m(this,\"setupUniforms\",()=>{let e={u_time:this.gl.getUniformLocation(this.program,\"u_time\"),u_pixelRatio:this.gl.getUniformLocation(this.program,\"u_pixelRatio\"),u_resolution:this.gl.getUniformLocation(this.program,\"u_resolution\")};Object.entries(this.providedUniforms).forEach(([i,r])=>{if(e[i]=this.gl.getUniformLocation(this.program,i),r instanceof HTMLImageElement){let s=`${i}AspectRatio`;e[s]=this.gl.getUniformLocation(this.program,s)}}),this.uniformLocations=e});m(this,\"renderScale\",1);m(this,\"parentWidth\",0);m(this,\"parentHeight\",0);m(this,\"parentDevicePixelWidth\",0);m(this,\"parentDevicePixelHeight\",0);m(this,\"devicePixelsSupported\",!1);m(this,\"resizeObserver\",null);m(this,\"setupResizeObserver\",()=>{this.resizeObserver=new ResizeObserver(([e])=>{if(e?.borderBoxSize[0]){let i=e.devicePixelContentBoxSize?.[0];i!==void 0&&(this.devicePixelsSupported=!0,this.parentDevicePixelWidth=i.inlineSize,this.parentDevicePixelHeight=i.blockSize),this.parentWidth=e.borderBoxSize[0].inlineSize,this.parentHeight=e.borderBoxSize[0].blockSize}this.handleResize()}),this.resizeObserver.observe(this.parentElement)});m(this,\"handleVisualViewportChange\",()=>{this.resizeObserver?.disconnect(),this.setupResizeObserver()});m(this,\"handleResize\",()=>{let e=0,i=0,r=Math.max(1,window.devicePixelRatio),s=visualViewport?.scale??1;if(this.devicePixelsSupported){let R=Math.max(1,this.minPixelRatio/r);e=this.parentDevicePixelWidth*R*s,i=this.parentDevicePixelHeight*R*s}else{let R=Math.max(r,this.minPixelRatio)*s;if(this.isSafari){let u=_t();R*=Math.max(1,u)}e=Math.round(this.parentWidth)*R,i=Math.round(this.parentHeight)*R}let l=Math.sqrt(this.maxPixelCount)/Math.sqrt(e*i),h=Math.min(1,l),a=Math.round(e*h),y=Math.round(i*h),c=a/Math.round(this.parentWidth);(this.canvasElement.width!==a||this.canvasElement.height!==y||this.renderScale!==c)&&(this.renderScale=c,this.canvasElement.width=a,this.canvasElement.height=y,this.resolutionChanged=!0,this.gl.viewport(0,0,this.gl.canvas.width,this.gl.canvas.height),this.render(performance.now()))});m(this,\"render\",e=>{if(this.hasBeenDisposed)return;if(this.program===null){console.warn(\"Tried to render before program or gl was initialized\");return}let i=e-this.lastRenderTime;this.lastRenderTime=e,this.currentSpeed!==0&&(this.currentFrame+=i*this.currentSpeed),this.gl.clear(this.gl.COLOR_BUFFER_BIT),this.gl.useProgram(this.program),this.gl.uniform1f(this.uniformLocations.u_time,this.currentFrame*.001),this.resolutionChanged&&(this.gl.uniform2f(this.uniformLocations.u_resolution,this.gl.canvas.width,this.gl.canvas.height),this.gl.uniform1f(this.uniformLocations.u_pixelRatio,this.renderScale),this.resolutionChanged=!1),this.gl.drawArrays(this.gl.TRIANGLES,0,6),this.currentSpeed!==0?this.requestRender():this.rafId=null});m(this,\"requestRender\",()=>{this.rafId!==null&&cancelAnimationFrame(this.rafId),this.rafId=requestAnimationFrame(this.render)});m(this,\"setTextureUniform\",(e,i)=>{if(!i.complete||i.naturalWidth===0)throw new Error(`Paper Shaders: image for uniform ${e} must be fully loaded`);let r=this.textures.get(e);r&&this.gl.deleteTexture(r),this.textureUnitMap.has(e)||this.textureUnitMap.set(e,this.textureUnitMap.size);let s=this.textureUnitMap.get(e);this.gl.activeTexture(this.gl.TEXTURE0+s);let l=this.gl.createTexture();this.gl.bindTexture(this.gl.TEXTURE_2D,l),this.gl.texParameteri(this.gl.TEXTURE_2D,this.gl.TEXTURE_WRAP_S,this.gl.CLAMP_TO_EDGE),this.gl.texParameteri(this.gl.TEXTURE_2D,this.gl.TEXTURE_WRAP_T,this.gl.CLAMP_TO_EDGE),this.gl.texParameteri(this.gl.TEXTURE_2D,this.gl.TEXTURE_MIN_FILTER,this.gl.LINEAR),this.gl.texParameteri(this.gl.TEXTURE_2D,this.gl.TEXTURE_MAG_FILTER,this.gl.LINEAR),this.gl.texImage2D(this.gl.TEXTURE_2D,0,this.gl.RGBA,this.gl.RGBA,this.gl.UNSIGNED_BYTE,i),this.mipmaps.includes(e)&&(this.gl.generateMipmap(this.gl.TEXTURE_2D),this.gl.texParameteri(this.gl.TEXTURE_2D,this.gl.TEXTURE_MIN_FILTER,this.gl.LINEAR_MIPMAP_LINEAR));let h=this.gl.getError();if(h!==this.gl.NO_ERROR||l===null){console.error(\"Paper Shaders: WebGL error when uploading texture:\",h);return}this.textures.set(e,l);let a=this.uniformLocations[e];if(a){this.gl.uniform1i(a,s);let y=`${e}AspectRatio`,c=this.uniformLocations[y];if(c){let R=i.naturalWidth/i.naturalHeight;this.gl.uniform1f(c,R)}}});m(this,\"areUniformValuesEqual\",(e,i)=>e===i?!0:Array.isArray(e)&&Array.isArray(i)&&e.length===i.length?e.every((r,s)=>this.areUniformValuesEqual(r,i[s])):!1);m(this,\"setUniformValues\",e=>{this.gl.useProgram(this.program),Object.entries(e).forEach(([i,r])=>{let s=r;if(r instanceof HTMLImageElement&&(s=`${r.src.slice(0,200)}|${r.naturalWidth}x${r.naturalHeight}`),this.areUniformValuesEqual(this.uniformCache[i],s))return;this.uniformCache[i]=s;let l=this.uniformLocations[i];if(!l){console.warn(`Uniform location for ${i} not found`);return}if(r instanceof HTMLImageElement)this.setTextureUniform(i,r);else if(Array.isArray(r)){let h=null,a=null;if(r[0]!==void 0&&Array.isArray(r[0])){let y=r[0].length;if(r.every(c=>c.length===y))h=r.flat(),a=y;else{console.warn(`All child arrays must be the same length for ${i}`);return}}else h=r,a=h.length;switch(a){case 2:this.gl.uniform2fv(l,h);break;case 3:this.gl.uniform3fv(l,h);break;case 4:this.gl.uniform4fv(l,h);break;case 9:this.gl.uniformMatrix3fv(l,!1,h);break;case 16:this.gl.uniformMatrix4fv(l,!1,h);break;default:console.warn(`Unsupported uniform array length: ${a}`)}}else typeof r==\"number\"?this.gl.uniform1f(l,r):typeof r==\"boolean\"?this.gl.uniform1i(l,r?1:0):console.warn(`Unsupported uniform type for ${i}: ${typeof r}`)})});m(this,\"getCurrentFrame\",()=>this.currentFrame);m(this,\"setFrame\",e=>{this.currentFrame=e,this.lastRenderTime=performance.now(),this.render(performance.now())});m(this,\"setSpeed\",(e=1)=>{this.speed=e,this.setCurrentSpeed(document.hidden?0:e)});m(this,\"setCurrentSpeed\",e=>{this.currentSpeed=e,this.rafId===null&&e!==0&&(this.lastRenderTime=performance.now(),this.rafId=requestAnimationFrame(this.render)),this.rafId!==null&&e===0&&(cancelAnimationFrame(this.rafId),this.rafId=null)});m(this,\"setMaxPixelCount\",(e=at)=>{this.maxPixelCount=e,this.handleResize()});m(this,\"setMinPixelRatio\",(e=2)=>{this.minPixelRatio=e,this.handleResize()});m(this,\"setUniforms\",e=>{this.setUniformValues(e),this.providedUniforms={...this.providedUniforms,...e},this.render(performance.now())});m(this,\"handleDocumentVisibilityChange\",()=>{this.setCurrentSpeed(document.hidden?0:this.speed)});m(this,\"dispose\",()=>{this.hasBeenDisposed=!0,this.rafId!==null&&(cancelAnimationFrame(this.rafId),this.rafId=null),this.gl&&this.program&&(this.textures.forEach(e=>{this.gl.deleteTexture(e)}),this.textures.clear(),this.gl.deleteProgram(this.program),this.program=null,this.gl.bindBuffer(this.gl.ARRAY_BUFFER,null),this.gl.bindBuffer(this.gl.ELEMENT_ARRAY_BUFFER,null),this.gl.bindRenderbuffer(this.gl.RENDERBUFFER,null),this.gl.bindFramebuffer(this.gl.FRAMEBUFFER,null),this.gl.getError()),this.resizeObserver&&(this.resizeObserver.disconnect(),this.resizeObserver=null),visualViewport?.removeEventListener(\"resize\",this.handleVisualViewportChange),document.removeEventListener(\"visibilitychange\",this.handleDocumentVisibilityChange),this.uniformLocations={},this.canvasElement.remove(),delete this.parentElement.paperShaderMount});if(e instanceof HTMLElement)this.parentElement=e;else throw new Error(\"Paper Shaders: parent element must be an HTMLElement\");if(!document.querySelector(\"style[data-paper-shader]\")){let v=document.createElement(\"style\");v.innerHTML=vt,v.setAttribute(\"data-paper-shader\",\"\"),document.head.prepend(v)}let R=document.createElement(\"canvas\");this.canvasElement=R,this.parentElement.prepend(R),this.fragmentShader=i,this.providedUniforms=r,this.mipmaps=c,this.currentFrame=h,this.minPixelRatio=a,this.maxPixelCount=y;let u=R.getContext(\"webgl2\",s);if(!u)throw new Error(\"Paper Shaders: WebGL is not supported in this browser\");this.gl=u,this.initProgram(),this.setupPositionAttribute(),this.setupUniforms(),this.setUniformValues(this.providedUniforms),this.setupResizeObserver(),visualViewport?.addEventListener(\"resize\",this.handleVisualViewportChange),this.setSpeed(l),this.parentElement.setAttribute(\"data-paper-shader\",\"\"),this.parentElement.paperShaderMount=this,document.addEventListener(\"visibilitychange\",this.handleDocumentVisibilityChange)}};function rt(o,e,i){let r=o.createShader(e);return r?(o.shaderSource(r,i),o.compileShader(r),o.getShaderParameter(r,o.COMPILE_STATUS)?r:(console.error(\"An error occurred compiling the shaders: \"+o.getShaderInfoLog(r)),o.deleteShader(r),null)):null}function xt(o,e,i){let r=o.getShaderPrecisionFormat(o.FRAGMENT_SHADER,o.MEDIUM_FLOAT),s=r?r.precision:null;s&&s<23&&(e=e.replace(/precision\\s+(lowp|mediump)\\s+float;/g,\"precision highp float;\"),i=i.replace(/precision\\s+(lowp|mediump)\\s+float/g,\"precision highp float\").replace(/\\b(uniform|varying|attribute)\\s+(lowp|mediump)\\s+(\\w+)/g,\"$1 highp $3\"));let l=rt(o,o.VERTEX_SHADER,e),h=rt(o,o.FRAGMENT_SHADER,i);if(!l||!h)return null;let a=o.createProgram();return a?(o.attachShader(a,l),o.attachShader(a,h),o.linkProgram(a),o.getProgramParameter(a,o.LINK_STATUS)?(o.detachShader(a,l),o.detachShader(a,h),o.deleteShader(l),o.deleteShader(h),a):(console.error(\"Unable to initialize the shader program: \"+o.getProgramInfoLog(a)),o.deleteProgram(a),o.deleteShader(l),o.deleteShader(h),null)):null}var vt=`@layer paper-shaders {\n  :where([data-paper-shader]) {\n    isolation: isolate;\n    position: relative;\n\n    & canvas {\n      contain: strict;\n      display: block;\n      position: absolute;\n      inset: 0;\n      z-index: -1;\n      width: 100%;\n      height: 100%;\n      border-radius: inherit;\n      corner-shape: inherit;\n    }\n  }\n}`;function bt(){let o=navigator.userAgent.toLowerCase();return o.includes(\"safari\")&&!o.includes(\"chrome\")&&!o.includes(\"android\")}function _t(){let o=visualViewport?.scale??1,e=visualViewport?.width??window.innerWidth,i=window.innerWidth-document.documentElement.clientWidth,r=o*e+i,s=outerWidth/r,l=Math.round(100*s);return l%5===0?l/100:l===33?1/3:l===67?2/3:l===133?4/3:s}var nt=`\n#define TWO_PI 6.28318530718\n#define PI 3.14159265358979323846\n`,st=`\nvec2 rotate(vec2 uv, float th) {\n  return mat2(cos(th), sin(th), -sin(th), cos(th)) * uv;\n}\n`;var mt=`\n  color += 1. / 256. * (fract(sin(dot(.014 * gl_FragCoord.xy, vec2(12.9898, 78.233))) * 43758.5453123) - .5);\n`,lt=`\nvec3 permute(vec3 x) { return mod(((x * 34.0) + 1.0) * x, 289.0); }\nfloat snoise(vec2 v) {\n  const vec4 C = vec4(0.211324865405187, 0.366025403784439,\n    -0.577350269189626, 0.024390243902439);\n  vec2 i = floor(v + dot(v, C.yy));\n  vec2 x0 = v - i + dot(i, C.xx);\n  vec2 i1;\n  i1 = (x0.x > x0.y) ? vec2(1.0, 0.0) : vec2(0.0, 1.0);\n  vec4 x12 = x0.xyxy + C.xxzz;\n  x12.xy -= i1;\n  i = mod(i, 289.0);\n  vec3 p = permute(permute(i.y + vec3(0.0, i1.y, 1.0))\n    + i.x + vec3(0.0, i1.x, 1.0));\n  vec3 m = max(0.5 - vec3(dot(x0, x0), dot(x12.xy, x12.xy),\n      dot(x12.zw, x12.zw)), 0.0);\n  m = m * m;\n  m = m * m;\n  vec3 x = 2.0 * fract(p * C.www) - 1.0;\n  vec3 h = abs(x) - 0.5;\n  vec3 ox = floor(x + 0.5);\n  vec3 a0 = x - ox;\n  m *= 1.79284291400159 - 0.85373472095314 * (a0 * a0 + h * h);\n  vec3 g;\n  g.x = a0.x * x0.x + h.x * x0.y;\n  g.yz = a0.yz * x12.xz + h.yz * x12.yw;\n  return 130.0 * dot(m, g);\n}\n`;var pt=`#version 300 es\nprecision mediump float;\n\nuniform sampler2D u_image;\nuniform float u_imageAspectRatio;\n\nuniform vec2 u_resolution;\nuniform float u_time;\n\nuniform vec4 u_colorBack;\nuniform vec4 u_colorTint;\n\nuniform float u_softness;\nuniform float u_repetition;\nuniform float u_shiftRed;\nuniform float u_shiftBlue;\nuniform float u_distortion;\nuniform float u_contour;\nuniform float u_angle;\n\nuniform float u_shape;\nuniform bool u_isImage;\n\nin vec2 v_objectUV;\nin vec2 v_responsiveUV;\nin vec2 v_responsiveBoxGivenSize;\nin vec2 v_imageUV;\n\nout vec4 fragColor;\n\n${nt}\n${st}\n${lt}\n\nfloat getColorChanges(float c1, float c2, float stripe_p, vec3 w, float blur, float bump, float tint) {\n\n  float ch = mix(c2, c1, smoothstep(.0, 2. * blur, stripe_p));\n\n  float border = w[0];\n  ch = mix(ch, c2, smoothstep(border, border + 2. * blur, stripe_p));\n\n  if (u_isImage == true) {\n    bump = smoothstep(.2, .8, bump);\n  }\n  border = w[0] + .4 * (1. - bump) * w[1];\n  ch = mix(ch, c1, smoothstep(border, border + 2. * blur, stripe_p));\n\n  border = w[0] + .5 * (1. - bump) * w[1];\n  ch = mix(ch, c2, smoothstep(border, border + 2. * blur, stripe_p));\n\n  border = w[0] + w[1];\n  ch = mix(ch, c1, smoothstep(border, border + 2. * blur, stripe_p));\n\n  float gradient_t = (stripe_p - w[0] - w[1]) / w[2];\n  float gradient = mix(c1, c2, smoothstep(0., 1., gradient_t));\n  ch = mix(ch, gradient, smoothstep(border, border + .5 * blur, stripe_p));\n\n  // Tint color is applied with color burn blending\n  ch = mix(ch, 1. - min(1., (1. - ch) / max(tint, 0.0001)), u_colorTint.a);\n  return ch;\n}\n\nfloat getImgFrame(vec2 uv, float th) {\n  float frame = 1.;\n  frame *= smoothstep(0., th, uv.y);\n  frame *= 1.0 - smoothstep(1. - th, 1., uv.y);\n  frame *= smoothstep(0., th, uv.x);\n  frame *= 1.0 - smoothstep(1. - th, 1., uv.x);\n  return frame;\n}\n\nfloat blurEdge3x3(sampler2D tex, vec2 uv, vec2 dudx, vec2 dudy, float radius, float centerSample) {\n  vec2 texel = 1.0 / vec2(textureSize(tex, 0));\n  vec2 r = radius * texel;\n\n  float w1 = 1.0, w2 = 2.0, w4 = 4.0;\n  float norm = 16.0;\n  float sum = w4 * centerSample;\n\n  sum += w2 * textureGrad(tex, uv + vec2(0.0, -r.y), dudx, dudy).r;\n  sum += w2 * textureGrad(tex, uv + vec2(0.0, r.y), dudx, dudy).r;\n  sum += w2 * textureGrad(tex, uv + vec2(-r.x, 0.0), dudx, dudy).r;\n  sum += w2 * textureGrad(tex, uv + vec2(r.x, 0.0), dudx, dudy).r;\n\n  sum += w1 * textureGrad(tex, uv + vec2(-r.x, -r.y), dudx, dudy).r;\n  sum += w1 * textureGrad(tex, uv + vec2(r.x, -r.y), dudx, dudy).r;\n  sum += w1 * textureGrad(tex, uv + vec2(-r.x, r.y), dudx, dudy).r;\n  sum += w1 * textureGrad(tex, uv + vec2(r.x, r.y), dudx, dudy).r;\n\n  return sum / norm;\n}\n\nfloat lst(float edge0, float edge1, float x) {\n  return clamp((x - edge0) / (edge1 - edge0), 0.0, 1.0);\n}\n\nvoid main() {\n\n  const float firstFrameOffset = 2.8;\n  float t = .3 * (u_time + firstFrameOffset);\n\n  vec2 uv = v_imageUV;\n  vec2 dudx = dFdx(v_imageUV);\n  vec2 dudy = dFdy(v_imageUV);\n  vec4 img = textureGrad(u_image, uv, dudx, dudy);\n\n  if (u_isImage == false) {\n    uv = v_objectUV + .5;\n    uv.y = 1. - uv.y;\n  }\n\n  float cycleWidth = u_repetition;\n  float edge = 0.;\n  float contOffset = 1.;\n\n  vec2 rotatedUV = uv - vec2(.5);\n  float angle = (-u_angle + 70.) * PI / 180.;\n  float cosA = cos(angle);\n  float sinA = sin(angle);\n  rotatedUV = vec2(\n  rotatedUV.x * cosA - rotatedUV.y * sinA,\n  rotatedUV.x * sinA + rotatedUV.y * cosA\n  ) + vec2(.5);\n\n  if (u_isImage == true) {\n    float edgeRaw = img.r;\n    edge = blurEdge3x3(u_image, uv, dudx, dudy, 6., edgeRaw);\n    edge = pow(edge, 1.6);\n    edge *= mix(0.0, 1.0, smoothstep(0.0, 0.4, u_contour));\n  } else {\n    if (u_shape < 1.) {\n      // full-fill on canvas\n      vec2 borderUV = v_responsiveUV + .5;\n      float ratio = v_responsiveBoxGivenSize.x / v_responsiveBoxGivenSize.y;\n      vec2 mask = min(borderUV, 1. - borderUV);\n      vec2 pixel_thickness = 250. / v_responsiveBoxGivenSize;\n      float maskX = smoothstep(0.0, pixel_thickness.x, mask.x);\n      float maskY = smoothstep(0.0, pixel_thickness.y, mask.y);\n      maskX = pow(maskX, .25);\n      maskY = pow(maskY, .25);\n      edge = clamp(1. - maskX * maskY, 0., 1.);\n\n      uv = v_responsiveUV;\n      if (ratio > 1.) {\n        uv.y /= ratio;\n      } else {\n        uv.x *= ratio;\n      }\n      uv += .5;\n      uv.y = 1. - uv.y;\n\n      cycleWidth *= 2.;\n      contOffset = 1.5;\n\n    } else if (u_shape < 2.) {\n      // circle\n      vec2 shapeUV = uv - .5;\n      shapeUV *= .67;\n      edge = pow(clamp(3. * length(shapeUV), 0., 1.), 18.);\n    } else if (u_shape < 3.) {\n      // daisy\n      vec2 shapeUV = uv - .5;\n      shapeUV *= 1.68;\n\n      float r = length(shapeUV) * 2.;\n      float a = atan(shapeUV.y, shapeUV.x) + .2;\n      r *= (1. + .05 * sin(3. * a + 2. * t));\n      float f = abs(cos(a * 3.));\n      edge = smoothstep(f, f + .7, r);\n      edge *= edge;\n\n      uv *= .8;\n      cycleWidth *= 1.6;\n\n    } else if (u_shape < 4.) {\n      // diamond\n      vec2 shapeUV = uv - .5;\n      shapeUV = rotate(shapeUV, .25 * PI);\n      shapeUV *= 1.42;\n      shapeUV += .5;\n      vec2 mask = min(shapeUV, 1. - shapeUV);\n      vec2 pixel_thickness = vec2(.15);\n      float maskX = smoothstep(0.0, pixel_thickness.x, mask.x);\n      float maskY = smoothstep(0.0, pixel_thickness.y, mask.y);\n      maskX = pow(maskX, .25);\n      maskY = pow(maskY, .25);\n      edge = clamp(1. - maskX * maskY, 0., 1.);\n    } else if (u_shape < 5.) {\n      // metaballs\n      vec2 shapeUV = uv - .5;\n      shapeUV *= 1.3;\n      edge = 0.;\n      for (int i = 0; i < 5; i++) {\n        float fi = float(i);\n        float speed = 1.5 + 2./3. * sin(fi * 12.345);\n        float angle = -fi * 1.5;\n        vec2 dir1 = vec2(cos(angle), sin(angle));\n        vec2 dir2 = vec2(cos(angle + 1.57), sin(angle + 1.));\n        vec2 traj = .4 * (dir1 * sin(t * speed + fi * 1.23) + dir2 * cos(t * (speed * 0.7) + fi * 2.17));\n        float d = length(shapeUV + traj);\n        edge += pow(1.0 - clamp(d, 0.0, 1.0), 4.0);\n      }\n      edge = 1. - smoothstep(.65, .9, edge);\n      edge = pow(edge, 4.);\n    }\n\n    edge = mix(smoothstep(.9 - 2. * fwidth(edge), .9, edge), edge, smoothstep(0.0, 0.4, u_contour));\n\n  }\n\n  float opacity = 0.;\n  if (u_isImage == true) {\n    opacity = img.g;\n    float frame = getImgFrame(v_imageUV, 0.);\n    opacity *= frame;\n  } else {\n    opacity = 1. - smoothstep(.9 - 2. * fwidth(edge), .9, edge);\n    if (u_shape < 2.) {\n      edge = 1.2 * edge;\n    } else if (u_shape < 5.) {\n      edge = 1.8 * pow(edge, 1.5);\n    }\n  }\n\n  float diagBLtoTR = rotatedUV.x - rotatedUV.y;\n  float diagTLtoBR = rotatedUV.x + rotatedUV.y;\n\n  vec3 color = vec3(0.);\n  vec3 color1 = vec3(.98, 0.98, 1.);\n  vec3 color2 = vec3(.1, .1, .1 + .1 * smoothstep(.7, 1.3, diagTLtoBR));\n\n  vec2 grad_uv = uv - .5;\n\n  float dist = length(grad_uv + vec2(0., .2 * diagBLtoTR));\n  grad_uv = rotate(grad_uv, (.25 - .2 * diagBLtoTR) * PI);\n  float direction = grad_uv.x;\n\n  float bump = pow(1.8 * dist, 1.2);\n  bump = 1. - bump;\n  bump *= pow(uv.y, .3);\n\n\n  float thin_strip_1_ratio = .12 / cycleWidth * (1. - .4 * bump);\n  float thin_strip_2_ratio = .07 / cycleWidth * (1. + .4 * bump);\n  float wide_strip_ratio = (1. - thin_strip_1_ratio - thin_strip_2_ratio);\n\n  float thin_strip_1_width = cycleWidth * thin_strip_1_ratio;\n  float thin_strip_2_width = cycleWidth * thin_strip_2_ratio;\n\n  float noise = snoise(uv - t);\n\n  edge += (1. - edge) * u_distortion * noise;\n\n  direction += diagBLtoTR;\n  float contour = 0.;\n  direction -= 2. * noise * diagBLtoTR * (smoothstep(0., 1., edge) * (1.0 - smoothstep(0., 1., edge)));\n  direction *= mix(1., 1. - edge, smoothstep(.5, 1., u_contour));\n  direction -= 1.7 * edge * smoothstep(.5, 1., u_contour);\n  direction += .2 * pow(u_contour, 4.) * (1.0 - smoothstep(0., 1., edge));\n\n  bump *= clamp(pow(uv.y, .1), .3, 1.);\n  direction *= (.1 + (1.1 - edge) * bump);\n\n  direction *= (.4 + .6 * (1.0 - smoothstep(.5, 1., edge)));\n  direction += .18 * (smoothstep(.1, .2, uv.y) * (1.0 - smoothstep(.2, .4, uv.y)));\n  direction += .03 * (smoothstep(.1, .2, 1. - uv.y) * (1.0 - smoothstep(.2, .4, 1. - uv.y)));\n\n  direction *= (.5 + .5 * pow(uv.y, 2.));\n  direction *= cycleWidth;\n  direction -= t;\n\n\n  float colorDispersion = (1. - bump);\n  colorDispersion = clamp(colorDispersion, 0., 1.);\n  float dispersionRed = colorDispersion;\n  dispersionRed += .03 * bump * noise;\n  dispersionRed += 5. * (smoothstep(-.1, .2, uv.y) * (1.0 - smoothstep(.1, .5, uv.y))) * (smoothstep(.4, .6, bump) * (1.0 - smoothstep(.4, 1., bump)));\n  dispersionRed -= diagBLtoTR;\n\n  float dispersionBlue = colorDispersion;\n  dispersionBlue *= 1.3;\n  dispersionBlue += (smoothstep(0., .4, uv.y) * (1.0 - smoothstep(.1, .8, uv.y))) * (smoothstep(.4, .6, bump) * (1.0 - smoothstep(.4, .8, bump)));\n  dispersionBlue -= .2 * edge;\n\n  dispersionRed *= (u_shiftRed / 20.);\n  dispersionBlue *= (u_shiftBlue / 20.);\n\n  float blur = 0.;\n  float rExtraBlur = 0.;\n  float gExtraBlur = 0.;\n  if (u_isImage == true) {\n    float softness = 0.05 * u_softness;\n    blur = softness + .5 * smoothstep(1., 10., u_repetition) * smoothstep(.0, 1., edge);\n    float smallCanvasT = 1.0 - smoothstep(100., 500., min(u_resolution.x, u_resolution.y));\n    blur += smallCanvasT * smoothstep(.0, 1., edge);\n    rExtraBlur = softness * (0.05 + .1 * (u_shiftRed / 20.) * bump);\n    gExtraBlur = softness * 0.05 / max(0.001, abs(1. - diagBLtoTR));\n  } else {\n    blur = u_softness / 15. + .3 * contour;\n  }\n\n  vec3 w = vec3(thin_strip_1_width, thin_strip_2_width, wide_strip_ratio);\n  w[1] -= .02 * smoothstep(.0, 1., edge + bump);\n  float stripe_r = fract(direction + dispersionRed);\n  float r = getColorChanges(color1.r, color2.r, stripe_r, w, blur + fwidth(stripe_r) + rExtraBlur, bump, u_colorTint.r);\n  float stripe_g = fract(direction);\n  float g = getColorChanges(color1.g, color2.g, stripe_g, w, blur + fwidth(stripe_g) + gExtraBlur, bump, u_colorTint.g);\n  float stripe_b = fract(direction - dispersionBlue);\n  float b = getColorChanges(color1.b, color2.b, stripe_b, w, blur + fwidth(stripe_b), bump, u_colorTint.b);\n\n  color = vec3(r, g, b);\n  color *= opacity;\n\n  vec3 bgColor = u_colorBack.rgb * u_colorBack.a;\n  color = color + bgColor * (1. - opacity);\n  opacity = opacity + u_colorBack.a * (1. - opacity);\n\n  ${mt}\n\n  fragColor = vec4(color, opacity);\n}\n`,O={measurePerformance:!1,workingSize:512,iterations:40};function dt(o){let e=document.createElement(\"canvas\"),i=e.getContext(\"2d\"),r=typeof o==\"string\"&&o.startsWith(\"blob:\");return new Promise((s,l)=>{if(!o||!i){l(new Error(\"Invalid file or canvas context\"));return}let h=r&&fetch(o).then(c=>c.headers.get(\"Content-Type\")),a=new Image;a.crossOrigin=\"anonymous\";let y=performance.now();a.onload=async()=>{let c,R=await h;R?c=R===\"image/svg+xml\":typeof o==\"string\"?c=o.endsWith(\".svg\")||o.startsWith(\"data:image/svg+xml\"):c=o.type===\"image/svg+xml\";let u=a.width||a.naturalWidth,v=a.height||a.naturalHeight;if(c){let x=u/v;u>v?(u=4096,v=4096/x):(v=4096,u=4096*x),a.width=u,a.height=v}let C=Math.min(u,v),b=O.workingSize/C,p=Math.round(u*b),_=Math.round(v*b);O.measurePerformance&&(console.log(\"[Processing Mode]\"),console.log(`  Original: ${u}\\xD7${v}`),console.log(`  Working: ${p}\\xD7${_} (${(b*100).toFixed(1)}% scale)`),b<1&&console.log(`  Speedup: ~${Math.round(1/(b*b))}\\xD7`)),e.width=u,e.height=v;let T=document.createElement(\"canvas\");T.width=p,T.height=_;let I=T.getContext(\"2d\");I.drawImage(a,0,0,p,_);let P=performance.now(),V=I.getImageData(0,0,p,_).data,U=new Uint8Array(p*_),X=new Uint8Array(p*_),W=0;for(let d=0,x=0;d<V.length;d+=4,x++){let z=V[d+3]===0?0:1;U[x]=z,W+=z}let j=[],k=[];for(let d=0;d<_;d++)for(let x=0;x<p;x++){let S=d*p+x;if(!U[S])continue;let z=!1;x===0||x===p-1||d===0||d===_-1?z=!0:z=!U[S-1]||!U[S+1]||!U[S-p]||!U[S+p]||!U[S-p-1]||!U[S-p+1]||!U[S+p-1]||!U[S+p+1],z?(X[S]=1,j.push(S)):k.push(S)}O.measurePerformance&&(console.log(`[Mask Building] Time: ${(performance.now()-P).toFixed(2)}ms`),console.log(`  Shape pixels: ${W} / ${p*_} (${(W/(p*_)*100).toFixed(1)}%)`),console.log(`  Interior pixels: ${k.length}`),console.log(`  Boundary pixels: ${j.length}`));let N=wt(U,X,new Uint32Array(k),new Uint32Array(j),p,_),Y=performance.now(),L=yt(N,U,X,p,_);O.measurePerformance&&console.log(`[Poisson Solve] Time: ${(performance.now()-Y).toFixed(2)}ms`);let t=0,n;for(let d=0;d<k.length;d++){let x=k[d];L[x]>t&&(t=L[x])}let f=document.createElement(\"canvas\");f.width=p,f.height=_;let E=f.getContext(\"2d\"),B=E.createImageData(p,_);for(let d=0;d<_;d++)for(let x=0;x<p;x++){let S=d*p+x,z=S*4;if(!U[S])B.data[z]=255,B.data[z+1]=255,B.data[z+2]=255,B.data[z+3]=0;else{let F=255*(1-L[S]/t);B.data[z]=F,B.data[z+1]=F,B.data[z+2]=F,B.data[z+3]=255}}E.putImageData(B,0,0),i.imageSmoothingEnabled=!0,i.imageSmoothingQuality=\"high\",i.drawImage(f,0,0,p,_,0,0,u,v);let g=i.getImageData(0,0,u,v),G=document.createElement(\"canvas\");G.width=u,G.height=v;let w=G.getContext(\"2d\");w.drawImage(a,0,0,u,v);let A=w.getImageData(0,0,u,v);for(let d=0;d<g.data.length;d+=4){let x=A.data[d+3],S=g.data[d+3];x===0?(g.data[d]=255,g.data[d+1]=0):(g.data[d]=S===0?0:g.data[d],g.data[d+1]=x),g.data[d+2]=255,g.data[d+3]=255}i.putImageData(g,0,0),n=g,e.toBlob(d=>{if(!d){l(new Error(\"Failed to create PNG blob\"));return}if(O.measurePerformance){let x=performance.now()-y;if(console.log(`[Total Processing Time] ${x.toFixed(2)}ms`),b<1){let S=x*Math.pow(u*v/(p*_),1.5);console.log(`[Estimated time at full resolution] ~${S.toFixed(0)}ms`),console.log(`[Time saved] ~${(S-x).toFixed(0)}ms (${Math.round(S/x)}\\xD7 faster)`)}}s({imageData:n,pngBlob:d})},\"image/png\")},a.onerror=()=>l(new Error(\"Failed to load image\")),a.src=typeof o==\"string\"?o:URL.createObjectURL(o)})}function wt(o,e,i,r,s,l){let h=i.length,a=new Int32Array(h*4);for(let y=0;y<h;y++){let c=i[y],R=c%s,u=Math.floor(c/s);a[y*4+0]=R<s-1&&o[c+1]?c+1:-1,a[y*4+1]=R>0&&o[c-1]?c-1:-1,a[y*4+2]=u>0&&o[c-s]?c-s:-1,a[y*4+3]=u<l-1&&o[c+s]?c+s:-1}return{interiorPixels:i,boundaryPixels:r,pixelCount:h,neighborIndices:a}}function yt(o,e,i,r,s){let l=O.iterations,h=.01,a=new Float32Array(r*s),{interiorPixels:y,neighborIndices:c,pixelCount:R}=o,u=performance.now(),v=1.9,C=[],q=[];for(let b=0;b<R;b++){let p=y[b],_=p%r,T=Math.floor(p/r);(_+T)%2===0?C.push(b):q.push(b)}for(let b=0;b<l;b++){for(let p of C){let _=y[p],T=c[p*4+0],I=c[p*4+1],P=c[p*4+2],M=c[p*4+3],V=0;T>=0&&(V+=a[T]),I>=0&&(V+=a[I]),P>=0&&(V+=a[P]),M>=0&&(V+=a[M]);let U=(h+V)/4;a[_]=v*U+(1-v)*a[_]}for(let p of q){let _=y[p],T=c[p*4+0],I=c[p*4+1],P=c[p*4+2],M=c[p*4+3],V=0;T>=0&&(V+=a[T]),I>=0&&(V+=a[I]),P>=0&&(V+=a[P]),M>=0&&(V+=a[M]);let U=(h+V)/4;a[_]=v*U+(1-v)*a[_]}}if(O.measurePerformance){let b=performance.now()-u;console.log(`[Optimized Poisson Solver (SOR \\u03C9=${v})]`),console.log(`  Working size: ${r}\\xD7${s}`),console.log(`  Iterations: ${l}`),console.log(`  Time: ${b.toFixed(2)}ms`),console.log(`  Interior pixels processed: ${R}`),console.log(`  Speed: ${(l*R/(b*1e3)).toFixed(2)} Mpixels/sec`)}return a}var ct=`<svg width=\"260\" height=\"478\" viewBox=\"0 0 260 478\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n<path d=\"M130 216.896C106.106 216.896 86.6667 197.457 86.6667 173.563C86.6667 149.669 106.106 130.23 130 130.23C153.894 130.23 173.333 149.669 173.333 173.563C173.333 197.457 153.894 216.896 130 216.896ZM130 390.69C153.894 390.69 173.333 410.129 173.333 434.023C173.333 457.917 153.894 477.356 130 477.356C106.106 477.356 86.6667 457.917 86.6667 434.023C86.6667 410.129 106.106 390.69 130 390.69ZM216.667 86.6667C192.772 86.6667 173.333 67.2277 173.333 43.3333C173.333 19.439 192.772 0 216.667 0C240.561 0 260 19.439 260 43.3333C260 67.2277 240.561 86.6667 216.667 86.6667ZM216.667 260.459C240.561 260.459 260 279.898 260 303.793C260 327.687 240.561 347.126 216.667 347.126C192.772 347.126 173.333 327.687 173.333 303.793C173.333 279.898 192.772 260.459 216.667 260.459ZM43.3333 86.6667C19.439 86.6667 0 67.2277 0 43.3333C0 19.439 19.439 0 43.3333 0C67.2277 0 86.6667 19.439 86.6667 43.3333C86.6667 67.2277 67.2277 86.6667 43.3333 86.6667ZM43.3333 260.459C67.2277 260.459 86.6667 279.898 86.6667 303.793C86.6667 327.687 67.2277 347.126 43.3333 347.126C19.439 347.126 0 327.687 0 303.793C0 279.898 19.439 260.459 43.3333 260.459Z\" fill=\"black\"/>\n</svg>\n`;var ht=`<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 1000 1000\" width=\"1000\" height=\"1000\">\n    <polygon points=\"500,126 874,500 500,874 126,500\" fill=\"#000\"/>\n</svg>\n`;(()=>{let o=\"__brainableHomeLiquid\";window[o]?.destroy?.();let e=t=>String(t||\"\").replace(/[\\s\\u200b-\\u200d]/g,\"\"),i=[\"LASERABLE\",\"READINGABLE\",\"LISTENINGABLE\"],r=new Map,s=null,l=!1,h=0,a=0,y=new Map,c=new Map,R=new Map,u=matchMedia(\"(prefers-reduced-motion: reduce)\"),v=document.createElement(\"style\");v.dataset.brainableHomeLiquidStyle=\"\",v.textContent=`\n[data-hf30-products][data-hlm-root]{box-sizing:border-box!important;position:relative!important;inset:auto!important;transform:none!important;opacity:1!important;display:block!important;width:100%!important;max-width:100%!important;min-width:0!important;height:auto!important;min-height:0!important;max-height:none!important;flex-shrink:0!important;background:#000!important;color:#fafafa!important;isolation:isolate!important;overflow:hidden!important;padding:clamp(48px,6vw,96px) clamp(20px,4vw,64px) 0!important;margin:0!important}\n[data-hlm-root] [data-hlm-old]{display:none!important}\n[data-hlm-root] [data-hlm-inner]{box-sizing:border-box!important;position:relative!important;inset:auto!important;transform:none!important;opacity:1!important;display:block!important;width:100%!important;max-width:1536px!important;min-width:0!important;height:auto!important;min-height:0!important;max-height:none!important;padding:0!important;margin:0 auto!important;overflow:visible!important;gap:0!important}\n[data-hlm-root] [data-hlm-intro]{box-sizing:border-box!important;position:relative!important;inset:auto!important;transform:none!important;opacity:1!important;display:block!important;width:100%!important;max-width:1120px!important;min-width:0!important;height:auto!important;min-height:0!important;padding:0!important;margin:0 auto clamp(48px,6vw,88px)!important;grid-area:auto!important;text-align:center!important}\n[data-hlm-root] [data-hlm-intro] p,[data-hlm-root] [data-hlm-intro] span{font-family:'Noto Sans KR',sans-serif!important;font-size:clamp(16px,1.6vw,22px)!important;line-height:1.7!important;letter-spacing:0!important;color:#fafafa!important;width:auto!important;max-width:100%!important;height:auto!important;min-height:0!important;margin:0!important;white-space:normal!important;word-break:keep-all!important;overflow-wrap:anywhere!important}\n[data-hlm-root] [data-hlm-grid]{box-sizing:border-box!important;display:block!important;position:relative!important;inset:auto!important;transform:none!important;opacity:1!important;width:100%!important;max-width:100%!important;min-width:0!important;height:auto!important;min-height:0!important;max-height:none!important;padding:0!important;margin:0!important;gap:0!important;grid-template-columns:none!important;grid-template-rows:none!important;overflow:visible!important}\n[data-hlm-root] [data-hf30-card][data-hlm-card]{box-sizing:border-box!important;display:grid!important;grid-template-columns:minmax(0,1fr)!important;align-items:center!important;gap:24px!important;position:relative!important;inset:auto!important;transform:none!important;opacity:1!important;grid-area:auto!important;width:100%!important;max-width:100%!important;min-width:0!important;height:auto!important;min-height:0!important;max-height:none!important;overflow:visible!important;margin:0!important;padding:0 0 64px!important;background:transparent!important;border:0!important;box-shadow:none!important}\n[data-hlm-root] [data-hlm-card]+[data-hlm-card]{padding-top:64px!important}\n[data-hlm-root] [data-hlm-content]{box-sizing:border-box!important;position:relative!important;inset:auto!important;transform:none!important;opacity:1!important;display:flex!important;flex-direction:column!important;justify-content:center!important;align-items:stretch!important;gap:16px!important;grid-area:auto!important;width:100%!important;min-width:0!important;max-width:100%!important;height:auto!important;min-height:0!important;margin:0!important;padding:0!important;text-wrap:balance!important}\n[data-hlm-root] [data-hlm-heading]{box-sizing:border-box!important;position:relative!important;inset:auto!important;transform:none!important;opacity:1!important;display:flex!important;flex-direction:column!important;gap:0!important;align-items:stretch!important;width:100%!important;max-width:100%!important;min-width:0!important;height:auto!important;min-height:0!important;grid-area:auto!important;margin:0!important;padding:16px 0 0!important;text-align:center!important}\n[data-hlm-root] [data-hlm-card] [data-hf30-name],[data-hlm-root] [data-hlm-card] [data-hf30-category]{box-sizing:border-box!important;position:relative!important;inset:auto!important;transform:none!important;opacity:1!important;display:block!important;width:100%!important;min-width:0!important;max-width:100%!important;height:auto!important;min-height:0!important;max-height:none!important;grid-area:auto!important;order:0!important;gap:0!important;padding:0!important;margin:0!important;font-family:'Noto Sans KR',sans-serif!important;font-weight:500!important;font-size:30px!important;line-height:1.22!important;letter-spacing:-.04em!important;color:#fafafa!important;text-wrap:balance!important;white-space:normal!important;word-break:keep-all!important;overflow-wrap:anywhere!important}\n[data-hlm-root] [data-hlm-card] [data-hf30-name] p,[data-hlm-root] [data-hlm-card] [data-hf30-name] span{font:inherit!important;letter-spacing:inherit!important;color:inherit!important;line-height:inherit!important;white-space:normal!important;word-break:keep-all!important;overflow-wrap:anywhere!important;width:auto!important;max-width:100%!important;min-width:0!important;height:auto!important;min-height:0!important;margin:0!important;padding:0!important}\n[data-hlm-root] [data-hlm-card] [data-hf30-description]{box-sizing:border-box!important;position:relative!important;inset:auto!important;transform:none!important;opacity:1!important;display:block!important;width:100%!important;min-width:0!important;max-width:576px!important;height:auto!important;min-height:0!important;max-height:none!important;grid-area:auto!important;order:0!important;padding:0 0 8px!important;margin:0 auto!important;text-align:center!important;gap:0!important}\n[data-hlm-root] [data-hlm-card] [data-hf30-description] p{font-family:'Noto Sans KR',sans-serif!important;box-sizing:border-box!important;display:inline!important;font-size:14px!important;line-height:1.65!important;letter-spacing:0!important;color:rgba(250,250,250,.7)!important;position:relative!important;inset:auto!important;transform:none!important;width:auto!important;max-width:100%!important;min-width:0!important;height:auto!important;min-height:0!important;margin:0!important;padding:0!important;text-wrap:pretty!important;white-space:normal!important;word-break:keep-all!important;overflow-wrap:anywhere!important}\n[data-hlm-root] [data-hlm-card] [data-hf30-description] span{font-family:'Noto Sans KR',sans-serif!important;font-size:inherit!important;line-height:inherit!important;letter-spacing:inherit!important;color:inherit!important}\n[data-hlm-root] [data-hlm-card] [data-hf30-blank],[data-hlm-root] [data-hlm-card] [data-hf30-description] [data-hf30-blank]{display:none!important}\n[data-hlm-root] [data-hlm-actions]{box-sizing:border-box!important;position:relative!important;inset:auto!important;transform:none!important;opacity:1!important;display:flex!important;justify-content:center!important;align-items:center!important;gap:16px!important;width:100%!important;min-width:0!important;height:auto!important;min-height:0!important;padding:0 0 16px!important;margin:0!important;grid-area:auto!important}\n[data-hlm-root] [data-hlm-actions] a{box-sizing:border-box!important;position:relative!important;inset:auto!important;transform:none!important;display:inline-flex!important;align-items:center!important;justify-content:center!important;gap:8px!important;width:auto!important;min-width:0!important;max-width:100%!important;height:44px!important;min-height:44px!important;padding:0 32px!important;border:0!important;border-radius:6px!important;background:#fafafa!important;color:#18181b!important;font-family:'Noto Sans KR',sans-serif!important;font-size:14px!important;font-weight:500!important;line-height:1!important;letter-spacing:0!important;text-decoration:none!important;white-space:nowrap!important;box-shadow:0 1px 2px rgba(0,0,0,.05)!important;transition:background-color .15s,transform .15s!important;cursor:pointer!important}\n[data-hlm-root] [data-hlm-actions] a:hover{background:rgba(250,250,250,.9)!important}\n[data-hlm-root] [data-hlm-actions] a:focus-visible{outline:2px solid #8ac0ff!important;outline-offset:4px!important}\n[data-hlm-root] [data-hlm-visual]{box-sizing:border-box!important;display:block!important;position:relative!important;inset:auto!important;transform:none!important;opacity:1!important;grid-area:auto!important;width:100%!important;min-width:0!important;max-width:100%!important;height:360px!important;min-height:0!important;overflow:hidden!important;margin:-24px 0 -48px!important;padding:0!important;pointer-events:none!important;order:0!important}\n[data-hlm-root] [data-hlm-clip]{position:absolute!important;inset:0!important;transform:none!important;display:flex!important;align-items:center!important;justify-content:center!important;overflow:hidden!important;border-radius:0!important;width:100%!important;height:100%!important;min-height:0!important;gap:0!important;padding:0!important;margin:0!important}\n[data-hlm-root] [data-hlm-shader]{box-sizing:border-box!important;position:relative!important;inset:auto!important;transform:none!important;flex-shrink:0!important;display:block!important;width:100%!important;height:100%!important;min-height:0!important;max-width:none!important;max-height:none!important;padding:0!important;margin:0!important;overflow:hidden!important}\n[data-hlm-root] [data-hlm-shader] canvas{box-sizing:border-box!important;display:block!important;position:absolute!important;inset:0!important;width:100%!important;height:100%!important;padding:0!important;margin:0!important}\n[data-hlm-root] [data-hlm-fallback]{position:absolute!important;left:50%!important;top:50%!important;transform:translate(-50%,-50%)!important;width:auto!important;height:var(--hlm-fallback-scale,68%)!important;max-width:var(--hlm-fallback-scale,68%)!important;object-fit:contain!important;opacity:.75!important;filter:invert(1)!important;pointer-events:none!important}\n[data-hlm-root] [data-hlm-visual][data-hlm-ready] [data-hlm-fallback]{display:none!important}\n[data-hlm-root] [data-hlm-fade]{display:block!important;position:absolute!important;inset:0 0 auto!important;width:100%!important;height:224px!important;background:linear-gradient(to bottom,#000,rgba(0,0,0,.95),transparent)!important;z-index:2!important;pointer-events:none!important;margin:0!important;padding:0!important}\n@media(min-width:640px){[data-hlm-root] [data-hlm-content]{gap:20px!important;padding:0 16px!important}[data-hlm-root] [data-hlm-heading]{padding-top:24px!important}[data-hlm-root] [data-hlm-card] [data-hf30-name],[data-hlm-root] [data-hlm-card] [data-hf30-category]{font-size:36px!important}[data-hlm-root] [data-hlm-card] [data-hf30-description] p{font-size:16px!important}[data-hlm-root] [data-hlm-card] [data-hf30-description]{padding-bottom:16px!important}[data-hlm-root] [data-hf30-card][data-hlm-card]{gap:32px!important;padding-bottom:80px!important}}\n@media(min-width:768px){[data-hlm-root] [data-hlm-content]{padding:0 32px!important}[data-hlm-root] [data-hlm-card] [data-hf30-name],[data-hlm-root] [data-hlm-card] [data-hf30-category]{font-size:48px!important}}\n@media(min-width:1024px){[data-hlm-root] [data-hf30-card][data-hlm-card]{grid-template-columns:minmax(0,1fr) minmax(300px,500px)!important;gap:48px!important;padding-bottom:96px!important}[data-hlm-root] [data-hlm-content]{gap:24px!important;padding:0 0 0 16px!important}[data-hlm-root] [data-hlm-heading]{padding-top:0!important;text-align:left!important}[data-hlm-root] [data-hlm-card] [data-hf30-name],[data-hlm-root] [data-hlm-card] [data-hf30-category]{letter-spacing:-.06em!important}[data-hlm-root] [data-hlm-card] [data-hf30-description]{max-width:none!important;margin:0!important;padding:0!important;text-align:left!important}[data-hlm-root] [data-hlm-card] [data-hf30-description] p{font-size:18px!important;color:rgba(250,250,250,.8)!important}[data-hlm-root] [data-hlm-actions]{justify-content:flex-start!important;padding-bottom:0!important}[data-hlm-root] [data-hlm-visual]{height:400px!important;margin:0!important}[data-hlm-root] [data-hlm-clip]{border-radius:9999px!important}[data-hlm-root] [data-hlm-shader]{width:1280px!important;height:720px!important}[data-hlm-root] [data-hlm-fallback]{height:var(--hlm-fallback-scale,60%)!important;max-width:var(--hlm-fallback-scale,60%)!important}[data-hlm-root] [data-hlm-fade]{display:none!important}}\n@media(min-width:1280px){[data-hlm-root] [data-hf30-card][data-hlm-card]{grid-template-columns:minmax(0,1fr) minmax(0,1fr)!important}[data-hlm-root] [data-hlm-content]{padding-left:32px!important}[data-hlm-root] [data-hlm-card] [data-hf30-name],[data-hlm-root] [data-hlm-card] [data-hf30-category]{font-size:60px!important}[data-hlm-root] [data-hlm-card] [data-hf30-description] p{font-size:20px!important}[data-hlm-root] [data-hlm-visual]{height:500px!important}}\n@media(min-width:1536px){[data-hlm-root] [data-hlm-content]{padding-left:0!important}[data-hlm-root] [data-hlm-card] [data-hf30-name],[data-hlm-root] [data-hlm-card] [data-hf30-category]{font-size:72px!important}}\n@media(prefers-reduced-motion:reduce){[data-hlm-root] [data-hlm-actions] a{transition:none!important}}\n`,document.head.append(v);function C(t,n,f=\"\"){if(!t)return;let E=r.get(t);E||r.set(t,E=new Map),E.has(n)||E.set(n,t.getAttribute(n)),t.setAttribute(n,f)}function q(){for(let[t,n]of r)for(let[f,E]of n)E===null?t.removeAttribute(f):t.setAttribute(f,E);r.clear()}function b(t,n){let f=document.createElement(t);return f.setAttribute(\"data-hlm-\"+n,\"\"),f}let p={\"cult-icon.svg\":\"data:image/svg+xml;charset=utf-8,\"+encodeURIComponent(ct),\"diamond.svg\":\"data:image/svg+xml;charset=utf-8,\"+encodeURIComponent(ht)},_=[\"Default\",\"Root-level shader props\",\"Configured via props\"];function T(t){let n=innerWidth<1024,f={colorBack:\"#ffffff00\",colorTint:\"#2c5d72\",repetition:6,softness:.8,shiftRed:1,shiftBlue:-1,distortion:.4,contour:.4,angle:0,speed:1,scale:n?.68:.6,fit:\"contain\",image:t.asset};return t.variantIndex===1&&(f.scale=.6),t.variantIndex===2&&Object.assign(f,n?{speed:.65,scale:.78,colorTint:\"#0ea5e9\"}:{scale:.8,speed:.7,repetition:7,softness:.9,distortion:.3,colorTint:\"#4f46e5\"}),f}function I(t){return[parseInt(t.slice(1,3),16)/255,parseInt(t.slice(3,5),16)/255,parseInt(t.slice(5,7),16)/255,t.length===9?parseInt(t.slice(7,9),16)/255:1]}async function P(t){return y.has(t)||y.set(t,dt(p[t]).then(({pngBlob:n})=>new Promise((f,E)=>{if(l){E(new Error(\"Liquid metal module disposed\"));return}let B=URL.createObjectURL(n);c.set(t,B);let g=new Image;g.onload=()=>{l?(URL.revokeObjectURL(B),c.delete(t),E(new Error(\"Liquid metal module disposed\"))):f(g)},g.onerror=()=>E(new Error(\"Liquid metal processed image could not load\")),g.src=B})).catch(n=>{throw R.set(t,String(n?.message||n)),n})),y.get(t)}function M(t){let n=T(t);return{u_colorBack:I(n.colorBack),u_colorTint:I(n.colorTint),u_image:t.image,u_contour:n.contour,u_distortion:n.distortion,u_softness:n.softness,u_repetition:n.repetition,u_shiftRed:n.shiftRed,u_shiftBlue:n.shiftBlue,u_angle:n.angle,u_isImage:!0,u_shape:0,u_fit:1,u_scale:n.scale,u_rotation:0,u_offsetX:0,u_offsetY:0,u_originX:.5,u_originY:.5,u_worldWidth:0,u_worldHeight:0}}function V(t){return t.error?\"fallback\":t.loading?\"loading\":t.mount?document.hidden?\"hidden\":u.matches?\"reduced-motion\":t.visible?\"running\":\"offscreen\":\"idle\"}function U(t){if(t.error){t.mount&&t.mount.setSpeed(0);return}let n=T(t);t.visual.style.setProperty(\"--hlm-fallback-scale\",`${n.scale*100}%`),t.mount&&(t.mount.setUniforms(M(t)),t.mount.setSpeed(t.visible&&!document.hidden&&!u.matches?n.speed:0),u.matches&&t.mount.getCurrentFrame()===0&&t.mount.setFrame(1200))}async function X(t,n){if(t.mount||t.loading||t.error||l)return;t.loading=!0;let f=a;try{let E=await P(t.asset);if(l||s!==n||f!==a||!t.visual.isConnected)return;if(t.image=E,t.mount=new Z(t.shader,pt,M(t),{alpha:!0,premultipliedAlpha:!0,antialias:!0},0,u.matches?1200:0,1,1280*720*2,[\"u_image\"]),!t.mount.program||!t.mount.gl||t.mount.gl.isContextLost())throw new Error(\"Liquid metal WebGL program did not initialize\");t.visual.setAttribute(\"data-hlm-ready\",\"\"),t.contextLost=B=>{B.preventDefault(),t.error=\"WebGL context lost\",t.visual.removeAttribute(\"data-hlm-ready\");let g=t.mount;t.mount=null;try{g?.dispose()}catch{}},t.mount.canvasElement.addEventListener(\"webglcontextlost\",t.contextLost),U(t)}catch(E){if(s===n){t.error=String(E?.message||E);let B=t.mount;t.mount=null;try{B?.dispose()}catch{}t.visual.removeAttribute(\"data-hlm-ready\"),t.shader.querySelectorAll(\"canvas\").forEach(g=>g.remove())}}finally{t.loading=!1}}function W(){if(!s)return;a++;let t=s;s=null,t.io.disconnect();for(let n of t.cards){if(n.mount){n.mount.canvasElement.removeEventListener(\"webglcontextlost\",n.contextLost);try{n.mount.dispose()}catch{}}for(let f of n.moves.slice().reverse())f.next?.parentNode===f.parent?f.parent.insertBefore(f.node,f.next):f.parent.append(f.node);n.content.remove(),n.visual.remove()}q();for(let n of t.videos)!n.paused&&n.node.isConnected&&n.node.play().catch(()=>{})}function j(t){let n=[...t.querySelectorAll(\"[data-hf30-card]\")].filter(w=>i.includes(e(w.querySelector(\"[data-hf30-name]\")?.textContent)));if(n.length!==3)return;let f=n[0].parentElement,E=f.parentElement,B=[...E.children].find(w=>w!==f&&e(w.textContent).startsWith(\"\\uBE0C\\uB808\\uC778\\uC5D0\\uC774\\uBE14\\uC740\\uBAA8\\uB4E0\\uC774\\uC758\\uC7A0\\uC7AC\\uB825\\uC744\\uAE68\\uC6B0\\uAE30\\uC704\\uD574\"));if(!B)return;let g={root:t,cards:[],videos:[],copyNodes:[],copyText:[],io:null};s=g,a++,C(t,\"data-hlm-root\"),C(E,\"data-hlm-inner\"),C(f,\"data-hlm-grid\"),C(B,\"data-hlm-intro\");for(let w of t.children)w!==E&&(w.tagName===\"VIDEO\"||!e(w.textContent))&&C(w,\"data-hlm-old\");for(let w of t.querySelectorAll(\"video\"))g.videos.push({node:w,paused:w.paused}),w.pause();let G=document.createTreeWalker(t,NodeFilter.SHOW_TEXT);for(let w=G.nextNode();w;w=G.nextNode())g.copyNodes.push(w),g.copyText.push(w.nodeValue);for(let[w,A]of n.entries()){let d=A.querySelector(\"[data-hf30-name]\"),x=A.querySelector(\"[data-hf30-category]\"),S=A.querySelector(\"[data-hf30-description]\"),z=b(\"div\",\"content\"),Q=b(\"div\",\"heading\"),F=b(\"div\",\"visual\"),et=b(\"div\",\"clip\"),J=b(\"div\",\"shader\"),K=b(\"img\",\"fallback\"),ut=b(\"div\",\"fade\"),ot=w===0?\"cult-icon.svg\":\"diamond.svg\";K.src=p[ot],K.alt=\"\",K.setAttribute(\"aria-hidden\",\"true\"),F.setAttribute(\"aria-hidden\",\"true\");let tt={node:A,name:e(d.textContent),variantIndex:w,asset:ot,image:null,content:z,visual:F,shader:J,mount:null,loading:!1,visible:!1,error:null,moves:[d,x,S].map($=>({node:$,parent:$.parentNode,next:$.nextSibling}))};if(C(A,\"data-hlm-card\"),Q.append(d,x),z.append(Q,S),tt.name===\"LASERABLE\"){let $=b(\"div\",\"actions\"),H=document.createElement(\"a\");H.textContent=\"\\uC81C\\uD488\\uC18C\\uAC1C\",H.href=\"/laserable\",H.setAttribute(\"data-hlm-cta\",\"\"),H.addEventListener(\"click\",D=>{D.stopPropagation(),!(D.button!==0||D.metaKey||D.ctrlKey||D.shiftKey||D.altKey)&&(D.preventDefault(),location.assign(H.href))}),$.append(H),z.append($)}J.append(K),et.append(J),F.append(et,ut),A.append(z,F),g.cards.push(tt),U(tt)}g.io=new IntersectionObserver(w=>{if(!(s!==g||l))for(let A of w){let d=g.cards.find(x=>x.node===A.target);d&&(d.visible=A.isIntersecting&&A.intersectionRatio>.01,d.visible&&X(d,g),U(d))}},{threshold:[0,.01]}),g.cards.forEach(w=>g.io.observe(w.node))}function k(){if(h=0,l)return;let n=(location.pathname.replace(/\\/+$/,\"\")||\"/\")===\"/\"?document.querySelector(\"[data-hf30-products]\"):null;s&&(s.root!==n||!s.root.isConnected)&&W(),n&&!s&&j(n)}let N=()=>{!l&&!h&&(h=requestAnimationFrame(k))},Y=new MutationObserver(N);Y.observe(document.body,{childList:!0,subtree:!0});let L=()=>{s?.cards.forEach(U),N()};document.addEventListener(\"visibilitychange\",L),window.addEventListener(\"resize\",L,{passive:!0}),window.addEventListener(\"popstate\",N),u.addEventListener(\"change\",L),k(),window[o]={inspect(){return{matched:!!s,route:location.pathname,reducedMotion:u.matches,hidden:document.hidden,source:\"cult/ui Hero Liquid Metal + Paper Shaders 0.0.71\",variants:s?.cards.map(t=>({name:t.name,variant:_[t.variantIndex],shaderConfig:T(t)}))??[],nativeTextRetained:s?s.copyNodes.every((t,n)=>t.nodeValue===s.copyText[n]&&s.root.contains(t)):null,processingErrors:Object.fromEntries(R),ctas:s?[...s.root.querySelectorAll(\"[data-hlm-cta]\")].map(t=>({text:t.textContent,href:t.getAttribute(\"href\"),card:e(t.closest(\"[data-hlm-card]\")?.querySelector(\"[data-hf30-name]\")?.textContent)})):[],cards:s?.cards.map(t=>({name:t.name,variant:_[t.variantIndex],shaderConfig:T(t),state:V(t),visible:t.visible,initialized:!!t.mount,error:t.error,frame:t.mount?.getCurrentFrame()??null,canvas:t.mount?{width:t.mount.canvasElement.width,height:t.mount.canvasElement.height}:null}))??[]}},destroy(){if(!l){l=!0,Y.disconnect(),cancelAnimationFrame(h),document.removeEventListener(\"visibilitychange\",L),window.removeEventListener(\"resize\",L),window.removeEventListener(\"popstate\",N),u.removeEventListener(\"change\",L),W(),v.remove();for(let t of c.values())URL.revokeObjectURL(t);c.clear(),delete window[o]}}}})();})();\n\n\n/* BRAINABLE production global: home-spotlight */\n/* UICapsule Gradient Orb shader, Copyright (c) 2023 Kaiyu Hsu.\n * Exact public shader port; scoped BRAINABLE banner adapter.\n * Primary-source proof: ./reference/NOTES.md\n * MIT License\n * \n * Copyright (c) 2023 Kaiyu Hsu\n * \n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n * \n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n * \n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n(function brainableHomeGradientOrb() {\n  'use strict';\n  const KEY = '__brainableHomeGradientOrb';\n  if (window[KEY]) return;\n  const COPY = '놀라운 기술력을 바탕으로, 세상에 없던제품을 만듭니다.';\n  const compact = value => String(value || '').replace(/\\s+/g, '');\n  const vertexSource = \"\\n  varying vec2 vUv;\\n\\n  void main() {\\n    vUv = uv;\\n    gl_Position = vec4(position.xy, 0.0, 1.0);\\n  }\\n\";\n  const fragmentSource = \"\\n  precision highp float;\\n\\n  uniform float iTime;\\n  uniform vec3 iResolution;\\n  uniform float hue;\\n  uniform float rot;\\n  uniform float noiseScale;\\n  uniform float innerRadius;\\n\\n  varying vec2 vUv;\\n\\n  // --- YIQ color space hue rotation ---\\n\\n  vec3 rgb2yiq(vec3 c) {\\n    return vec3(\\n      dot(c, vec3(0.299, 0.587, 0.114)),\\n      dot(c, vec3(0.596, -0.274, -0.322)),\\n      dot(c, vec3(0.211, -0.523, 0.312))\\n    );\\n  }\\n\\n  vec3 yiq2rgb(vec3 c) {\\n    return vec3(\\n      c.x + 0.956 * c.y + 0.621 * c.z,\\n      c.x - 0.272 * c.y - 0.647 * c.z,\\n      c.x - 1.106 * c.y + 1.703 * c.z\\n    );\\n  }\\n\\n  vec3 adjustHue(vec3 color, float hueDeg) {\\n    float hueRad = radians(hueDeg);\\n    vec3 yiq = rgb2yiq(color);\\n    float cosA = cos(hueRad);\\n    float sinA = sin(hueRad);\\n    yiq.yz = vec2(yiq.y * cosA - yiq.z * sinA, yiq.y * sinA + yiq.z * cosA);\\n    return yiq2rgb(yiq);\\n  }\\n\\n  // --- 3D simplex noise (hash-based) ---\\n\\n  vec3 hash33(vec3 p3) {\\n    p3 = fract(p3 * vec3(0.1031, 0.11369, 0.13787));\\n    p3 += dot(p3, p3.yxz + 19.19);\\n    return -1.0 + 2.0 * fract(vec3(p3.x + p3.y, p3.x + p3.z, p3.y + p3.z) * p3.zyx);\\n  }\\n\\n  float snoise3(vec3 p) {\\n    const float K1 = 0.333333333;\\n    const float K2 = 0.166666667;\\n    vec3 i = floor(p + (p.x + p.y + p.z) * K1);\\n    vec3 d0 = p - (i - (i.x + i.y + i.z) * K2);\\n    vec3 e = step(vec3(0.0), d0 - d0.yzx);\\n    vec3 i1 = e * (1.0 - e.zxy);\\n    vec3 i2 = 1.0 - e.zxy * (1.0 - e);\\n    vec3 d1 = d0 - (i1 - K2);\\n    vec3 d2 = d0 - (i2 - K1);\\n    vec3 d3 = d0 - 0.5;\\n    vec4 h = max(0.6 - vec4(dot(d0, d0), dot(d1, d1), dot(d2, d2), dot(d3, d3)), 0.0);\\n    vec4 n = h * h * h * h * vec4(\\n      dot(d0, hash33(i)),\\n      dot(d1, hash33(i + i1)),\\n      dot(d2, hash33(i + i2)),\\n      dot(d3, hash33(i + 1.0))\\n    );\\n    return dot(vec4(31.316), n);\\n  }\\n\\n  // --- Orb rendering ---\\n\\n  vec4 extractAlpha(vec3 colorIn) {\\n    float a = max(max(colorIn.r, colorIn.g), colorIn.b);\\n    return vec4(colorIn.rgb / (a + 1e-5), a);\\n  }\\n\\n  const vec3 baseColor0 = vec3(0.239, 0.353, 1.0);   // blue\\n  const vec3 baseColor1 = vec3(0.616, 0.0, 1.0);     // purple\\n  const vec3 baseColor2 = vec3(1.0, 0.373, 0.122);   // orange\\n  const vec3 baseColor3 = vec3(0.0, 0.0, 0.0);       // black\\n\\n  float light1(float intensity, float attenuation, float dist) {\\n    return intensity / (1.0 + dist * attenuation);\\n  }\\n\\n  float light2(float intensity, float attenuation, float dist) {\\n    return intensity / (1.0 + dist * dist * attenuation);\\n  }\\n\\n  vec4 draw(vec2 uv) {\\n    vec3 color0 = adjustHue(baseColor0, hue);\\n    vec3 color1 = adjustHue(baseColor1, hue);\\n    vec3 color2 = adjustHue(baseColor2, hue);\\n    vec3 color3 = adjustHue(baseColor3, hue);\\n\\n    float len = length(uv);\\n    float invLen = len > 0.0 ? 1.0 / len : 0.0;\\n\\n    float pulse = sin(iTime * 1.5) * 0.02;\\n\\n    float n0 = snoise3(vec3(uv * noiseScale, iTime * 0.5)) * 0.5 + 0.5;\\n\\n    float r0 = mix(mix(innerRadius + pulse, 1.0, 0.4), mix(innerRadius + pulse, 1.0, 0.6), n0);\\n\\n    float d0 = distance(uv, (r0 * invLen) * uv);\\n    float v0 = light1(1.0, 10.0, d0);\\n    v0 *= smoothstep(r0 * 1.05, r0, len);\\n    float cl = cos(atan(uv.y, uv.x) + iTime * 2.0) * 0.5 + 0.5;\\n\\n    float a = iTime * -1.0;\\n    vec2 pos = vec2(cos(a), sin(a)) * r0;\\n    float d = distance(uv, pos);\\n    float v1 = light2(1.5, 5.0, d);\\n    v1 *= light1(1.0, 50.0, d0);\\n\\n    float v2 = smoothstep(1.0, mix(innerRadius, 1.0, n0 * 0.5), len);\\n    float v3 = smoothstep(innerRadius, mix(innerRadius, 1.0, 0.5), len);\\n\\n    vec3 col = mix(color1, color2, cl);\\n    col = mix(col, color0, n0);\\n    col = mix(color3, col, v0);\\n    col = (col + v1) * v2 * v3;\\n    col = clamp(col, 0.0, 1.0);\\n\\n    return extractAlpha(col);\\n  }\\n\\n  void main() {\\n    vec2 center = iResolution.xy * 0.5;\\n    float size = min(iResolution.x, iResolution.y);\\n    vec2 uv = (vUv * iResolution.xy - center) / size * 2.0;\\n\\n    float s = sin(rot);\\n    float c = cos(rot);\\n    uv = vec2(c * uv.x - s * uv.y, s * uv.x + c * uv.y);\\n\\n    vec4 col = draw(uv);\\n    gl_FragColor = vec4(col.rgb * col.a, col.a);\\n  }\\n\";\n  const originalBlackHole = window.__brainableBlackHole30;\n  const reduced = matchMedia('(prefers-reduced-motion: reduce)');\n  let binding = null, scanFrame = 0, dead = false;\n  const style = document.createElement('style');\n  style.id = 'brainable-home-gradient-orb-style';\n  style.textContent = `\n[data-hf30-banner][data-bgo-host]{box-sizing:border-box!important;position:relative!important;isolation:isolate!important;\n  overflow:hidden!important;height:900px!important;min-height:900px!important;max-height:none!important;\n  flex-shrink:0!important;background:#0a0a0a!important;background-image:none!important;opacity:1!important;\n  filter:none!important;backdrop-filter:none!important;}\n[data-hf30-banner][data-bgo-host] [data-bgo-native-background]{display:none!important;}\n[data-hf30-banner][data-bgo-host] [data-bgo-content]{z-index:1!important;filter:none!important;backdrop-filter:none!important;}\n[data-hf30-banner][data-bgo-host] .textContents,\n[data-hf30-banner][data-bgo-host] .textContents p,\n[data-hf30-banner][data-bgo-host] .textContents span{font-family:'Noto Sans KR',sans-serif!important;letter-spacing:.08em!important;}\n[data-hf30-banner][data-bgo-host] [data-hf30-flow]{box-sizing:border-box!important;min-width:0!important;max-width:100%!important;}\n[data-bgo-background]{box-sizing:border-box!important;position:absolute!important;inset:0!important;width:100%!important;height:100%!important;\n  z-index:0!important;pointer-events:none!important;overflow:hidden!important;opacity:1!important;filter:none!important;\n  backdrop-filter:none!important;background:#0a0a0a!important;}\n[data-bgo-background] canvas{display:block!important;position:absolute!important;inset:0!important;width:100%!important;height:100%!important;}\n[data-bgo-fallback]{display:none;position:absolute;top:50%;left:50%;width:58%;max-width:520px;aspect-ratio:1;transform:translate(-50%,-50%);\n  border-radius:50%;background:radial-gradient(circle at 50% 50%,#0a0a0a 0 53%,#0e0b1b 60%,#2b1750 66%,#7247bf 68%,#e5cbff 69%,#4d39a6 70%,#0a0a0a 73%);\n  box-shadow:0 0 18px 1px rgba(126,79,232,.14);}\n[data-bgo-background][data-bgo-fallback-active] canvas{display:none!important;}\n[data-bgo-background][data-bgo-fallback-active] [data-bgo-fallback]{display:block;}\n@media(max-width:1279px){\n [data-hf30-main]>[data-hf30-banner][data-bgo-host]{height:525px!important;min-height:525px!important;}\n [data-hf30-banner][data-bgo-host] .textContents,[data-hf30-banner][data-bgo-host] .textContents p,\n [data-hf30-banner][data-bgo-host] .textContents span{letter-spacing:.03em!important;}\n [data-bgo-fallback]{max-width:300px;}\n}\n@media(max-width:767px){\n [data-hf30-main]>[data-hf30-banner][data-bgo-host]{height:350px!important;min-height:350px!important;}\n}\n`;\n  document.head.append(style);\n  const recordAttr = (node, key, value, records) => {\n    records.push([node, key, node.getAttribute(key)]);\n    node.setAttribute(key, value);\n  };\n\n  function makeRenderer(canvas, background) {\n    let gl = null, program = null, buffer = null, shaders = [], uniforms = {};\n    let frame = 0, lastStamp = null, lastDraw = 0, elapsed = 0, running = false, lost = false, disposed = false;\n    let frameCount = 0, fault = null, dimensions = [0, 0];\n    const fallback = () => background.setAttribute('data-bgo-fallback-active', '');\n    const cancel = () => { if (frame) cancelAnimationFrame(frame); frame = 0; lastStamp = null; };\n    function releaseResources() {\n      if (gl && !lost) {\n        if (buffer) gl.deleteBuffer(buffer);\n        if (program) gl.deleteProgram(program);\n        shaders.forEach(shader => gl.deleteShader(shader));\n      }\n      buffer = null; program = null; shaders = []; uniforms = {};\n    }\n    function initialize() {\n      if (disposed) return;\n      try {\n        gl = gl || canvas.getContext('webgl', { alpha:false, antialias:true, premultipliedAlpha:true, powerPreference:'low-power' });\n        if (!gl) throw new Error('WebGL unavailable');\n        const compile = (type, source) => {\n          const shader = gl.createShader(type);\n          gl.shaderSource(shader, source); gl.compileShader(shader); shaders.push(shader);\n          if (!gl.getShaderParameter(shader, gl.COMPILE_STATUS)) throw new Error(gl.getShaderInfoLog(shader) || 'Shader compile failed');\n          return shader;\n        };\n        const vertex = compile(gl.VERTEX_SHADER, 'attribute vec3 position;\\nattribute vec2 uv;\\n' + vertexSource);\n        const fragment = compile(gl.FRAGMENT_SHADER, fragmentSource);\n        program = gl.createProgram(); gl.attachShader(program, vertex); gl.attachShader(program, fragment); gl.linkProgram(program);\n        if (!gl.getProgramParameter(program, gl.LINK_STATUS)) throw new Error(gl.getProgramInfoLog(program) || 'Shader link failed');\n        buffer = gl.createBuffer(); gl.bindBuffer(gl.ARRAY_BUFFER, buffer);\n        gl.bufferData(gl.ARRAY_BUFFER, new Float32Array([-1,-1,0,0,0, 3,-1,0,2,0, -1,3,0,0,2]), gl.STATIC_DRAW);\n        gl.useProgram(program);\n        for (const [name, size, offset] of [['position',3,0],['uv',2,12]]) {\n          const location = gl.getAttribLocation(program,name);\n          gl.enableVertexAttribArray(location); gl.vertexAttribPointer(location,size,gl.FLOAT,false,20,offset);\n        }\n        for (const name of ['iTime','iResolution','hue','rot','noiseScale','innerRadius']) uniforms[name] = gl.getUniformLocation(program,name);\n        gl.disable(gl.DEPTH_TEST); gl.disable(gl.CULL_FACE);\n        gl.enable(gl.BLEND); gl.blendFuncSeparate(gl.SRC_ALPHA,gl.ONE_MINUS_SRC_ALPHA,gl.ONE,gl.ONE_MINUS_SRC_ALPHA);\n        gl.clearColor(10/255,10/255,10/255,1);\n        gl.uniform1f(uniforms.hue,0); gl.uniform1f(uniforms.noiseScale,.65); gl.uniform1f(uniforms.innerRadius,.1);\n        fault = null; background.removeAttribute('data-bgo-fallback-active'); resize();\n      } catch (error) { fault = String(error?.message || error); releaseResources(); fallback(); }\n    }\n    function draw() {\n      if (disposed || lost || !program || !dimensions[0] || !dimensions[1]) return;\n      gl.useProgram(program); gl.clear(gl.COLOR_BUFFER_BIT);\n      gl.uniform3f(uniforms.iResolution,dimensions[0],dimensions[1],dimensions[0]/dimensions[1]);\n      gl.uniform1f(uniforms.iTime,elapsed); gl.uniform1f(uniforms.rot,elapsed*.3);\n      gl.drawArrays(gl.TRIANGLES,0,3); frameCount++;\n    }\n    function resize() {\n      if (disposed || lost || !program) return;\n      const rect = canvas.getBoundingClientRect(), dpr = Math.min(devicePixelRatio || 1, 1.5);\n      const width = Math.max(1,Math.round(rect.width*dpr)), height = Math.max(1,Math.round(rect.height*dpr));\n      if (canvas.width !== width || canvas.height !== height) { canvas.width=width; canvas.height=height; }\n      dimensions=[width,height]; gl.viewport(0,0,width,height); draw();\n    }\n    function tick(stamp) {\n      frame=0;\n      if (!running || disposed || lost || !program) return;\n      if (lastStamp !== null) elapsed += Math.min((stamp-lastStamp)/1000,.1);\n      lastStamp=stamp;\n      if (stamp-lastDraw >= 1000/30) { draw(); lastDraw=stamp; }\n      frame=requestAnimationFrame(tick);\n    }\n    function setRunning(value) {\n      running=!!value && !disposed && !lost && !!program;\n      if (!running) cancel(); else if (!frame) frame=requestAnimationFrame(tick);\n    }\n    const onLost = event => { event.preventDefault(); lost=true; cancel(); running=false; releaseResources(); fallback(); };\n    const onRestored = () => { lost=false; releaseResources(); initialize(); sync(); };\n    canvas.addEventListener('webglcontextlost',onLost,false); canvas.addEventListener('webglcontextrestored',onRestored,false);\n    initialize();\n    return {\n      resize, setRunning,\n      inspect: () => ({mode:program&&!lost?'webgl':'static-fallback',running,contextLost:lost,frames:frameCount,elapsed,dimensions,fault}),\n      dispose() { disposed=true; running=false; cancel(); canvas.removeEventListener('webglcontextlost',onLost); canvas.removeEventListener('webglcontextrestored',onRestored); releaseResources(); }\n    };\n  }\n  function sync() {\n    if (!binding) return;\n    binding.renderer.setRunning(!reduced.matches && !document.hidden && binding.visible);\n  }\n  const intersection = new IntersectionObserver(entries => {\n    const entry = entries.find(e => e.target === binding?.host);\n    if (!entry) return;\n    binding.visible=entry.isIntersecting && entry.intersectionRatio>.01;\n    sync();\n  }, {threshold:[0,.01]});\n  const resize = new ResizeObserver(() => binding?.renderer.resize());\n  function clear() {\n    if (!binding) return;\n    intersection.unobserve(binding.host); resize.unobserve(binding.host); binding.renderer.dispose(); binding.background.remove();\n    binding.records.reverse().forEach(([node,key,old]) => old===null?node.removeAttribute(key):node.setAttribute(key,old));\n    binding=null;\n  }\n  function scan() {\n    scanFrame=0;\n    if (dead) return;\n    if (location.pathname!=='/') { clear(); return; }\n    const hosts=Array.from(document.querySelectorAll('[data-hf30-banner]')).filter(host =>\n      compact(host.textContent)===compact(COPY) && host.getClientRects().length && host.getBoundingClientRect().width>0);\n    if (hosts.length!==1) { if(binding&&!hosts.includes(binding.host)) clear(); return; }\n    const host=hosts[0];\n    if(binding?.host===host) { binding.renderer.resize(); return; }\n    clear();\n    const records=[], originalCopy=host.textContent;\n    recordAttr(host,'data-bgo-host','',records);\n    for(const node of Array.from(host.children)) {\n      if(node.getAttribute('aria-hidden')==='true') recordAttr(node,'data-bgo-native-background','',records);\n      else recordAttr(node,'data-bgo-content','',records);\n    }\n    const background=document.createElement('div'); background.setAttribute('data-bgo-background',''); background.setAttribute('aria-hidden','true');\n    const canvas=document.createElement('canvas'); canvas.setAttribute('aria-hidden','true');\n    const fallback=document.createElement('div'); fallback.setAttribute('data-bgo-fallback','');\n    background.append(canvas,fallback); host.prepend(background);\n    const rect=host.getBoundingClientRect();\n    binding={host,background,records,originalCopy,visible:rect.bottom>0&&rect.top<innerHeight,renderer:makeRenderer(canvas,background)};\n    intersection.observe(host); resize.observe(host); sync();\n  }\n  function schedule() {if(!dead&&!scanFrame)scanFrame=requestAnimationFrame(scan);}\n  const mutation=new MutationObserver(records=>{if(records.some(record=>!record.target.closest?.('[data-bgo-background]')))schedule();});\n  mutation.observe(document.body,{childList:true,subtree:true});\n  window.addEventListener('resize',schedule,{passive:true}); window.addEventListener('pageshow',schedule); window.addEventListener('popstate',schedule);\n  document.addEventListener('visibilitychange',sync); reduced.addEventListener('change',sync);\n  const api={\n    version:'home-gradient-orb-1', provenance:'exact-uicapsule-public-shader-port',\n    inspect:()=>({matched:!!binding,reducedMotion:reduced.matches,background:'#0a0a0a',defaults:{hue:0,rotationSpeed:.3,noiseScale:.65,innerRadius:.1},\n      nativeCopyRetained:binding?binding.host.textContent===binding.originalCopy:null,blackHoleRuntimeRetained:window.__brainableBlackHole30===originalBlackHole,\n      extraDimOverlay:false,extraFilter:false,bounds:binding?binding.host.getBoundingClientRect().toJSON():null,\n      canvasBounds:binding?binding.background.querySelector('canvas').getBoundingClientRect().toJSON():null,\n      renderer:binding?.renderer.inspect() || null}),\n    destroy(){\n      dead=true; mutation.disconnect(); intersection.disconnect(); resize.disconnect(); if(scanFrame)cancelAnimationFrame(scanFrame);\n      window.removeEventListener('resize',schedule); window.removeEventListener('pageshow',schedule); window.removeEventListener('popstate',schedule);\n      document.removeEventListener('visibilitychange',sync); reduced.removeEventListener('change',sync); clear(); style.remove();\n      if(window[KEY]===api)delete window[KEY];\n      if(window.__brainableHomeSpotlight===api)delete window.__brainableHomeSpotlight;\n    }\n  };\n  window[KEY]=api;\n  window.__brainableHomeSpotlight=api;\n  scan();\n})();\n\n\n;/* Full-height HOME opening scene. Preserve all native copy, wordmark and graphics. */\n(() => {\n  'use strict';\n  const KEY = '__brainableHomeHeroRestored';\n  window[KEY]?.destroy?.();\n  window.__brainableHomeAnimatedText?.destroy?.();\n  const style = document.createElement('style');\n  style.setAttribute('data-hhr30-style', '');\n  style.textContent = `\n/* Native entrance positions the English description above its clipping wrapper. */\n[data-hf30-hero] [data-hf30-hero-wrap]{overflow:visible!important}\n/* The native MAIN centers children in a fixed-height box. Enlarged approved\n   sections can protrude above MAIN and cover the first scene; use normal flow. */\ndiv:has(>[data-hf30-hero]){height:auto!important;min-height:100svh!important}\n/* Native footer flex-basis:0 collapses under the naturally sized HOME root. */\ndiv:has(>[data-hf30-hero])>footer,[data-hmf30-footer]{flex:0 0 auto!important;height:auto!important;min-height:0!important}\n[data-hf30-page]{height:auto!important;min-height:0!important;flex-shrink:0!important}\n[data-hf30-main]{height:auto!important;min-height:0!important;justify-content:flex-start!important;flex-shrink:0!important}\n/* Prevent the native fixed-height flex page from shrinking the first scene. */\n[data-hf30-hero]{height:calc(100svh - 64px)!important;min-height:0!important;max-height:none!important;flex-shrink:0!important;position:relative!important;top:auto!important}\n@media(min-width:1024px){[data-hf30-hero]{height:calc(100svh - 80px)!important}}\n/* Reflow native layers inside the scene, including tall desktop windows. */\n@media(min-width:1280px){\n[data-hf30-hero]{box-sizing:border-box!important;width:100%!important;min-width:0!important;max-width:100%!important;height:calc(100svh - 80px)!important;min-height:0!important;position:relative!important;overflow:hidden!important;--hhr30-pad:clamp(32px,4vw,64px);--hhr30-type:clamp(28px,5.5svh,45px);--hhr30-logo:clamp(170px,33svh,268px);--hhr30-bottom:56px;--hhr30-tag-gap:32px;--hhr30-meta-bottom:20px}\n[data-hf30-hero] [data-hf30-hero-wrap]{display:contents!important;transform:none!important;opacity:1!important}\n[data-hf30-hero] [data-hf30-headline]{box-sizing:border-box!important;position:absolute!important;left:var(--hhr30-pad)!important;right:var(--hhr30-pad)!important;top:auto!important;bottom:var(--hhr30-bottom)!important;width:auto!important;height:auto!important;min-width:0!important;min-height:0!important;transform:none!important;opacity:1!important;display:flex!important;flex-direction:column!important;align-items:stretch!important;gap:6px!important}\n[data-hf30-hero] [data-hf30-headline] h1,[data-hf30-hero] [data-hf30-headline] span{font-size:var(--hhr30-type)!important;line-height:1.4!important;letter-spacing:0!important}\n[data-hf30-hero] [data-hf30-headline] h1{width:100%!important;height:auto!important;min-height:0!important;margin:0!important;white-space:normal!important}\n[data-hf30-hero] [data-hf30-spacer]{display:inline-block!important;width:calc(var(--hhr30-logo) + 8px)!important;font-size:0!important}\n[data-hf30-hero] [data-hf30-wordmark]{position:absolute!important;left:var(--hhr30-pad)!important;right:auto!important;top:auto!important;bottom:calc(var(--hhr30-bottom) + var(--hhr30-type)*.15)!important;width:var(--hhr30-logo)!important;height:calc(var(--hhr30-logo)*.14552)!important;transform:none!important;opacity:1!important}\n[data-hf30-hero] [data-hf30-wordmark] img{width:100%!important;height:100%!important;object-fit:contain!important}\n[data-hf30-hero] [data-hf30-tagline]{position:absolute!important;left:var(--hhr30-pad)!important;right:var(--hhr30-pad)!important;top:auto!important;bottom:calc(var(--hhr30-bottom) + var(--hhr30-tag-gap) + var(--hhr30-type)*2.8)!important;width:auto!important;height:auto!important;min-height:0!important;transform:none!important;opacity:1!important;display:block!important}\n[data-hf30-hero] [data-hf30-tagline] p{font-size:16px!important;line-height:1.5!important;letter-spacing:.04em!important;width:auto!important;height:auto!important;margin:0!important}\n[data-hf30-hero] [data-hf30-meta]{position:absolute!important;left:var(--hhr30-pad)!important;right:var(--hhr30-pad)!important;top:auto!important;bottom:var(--hhr30-meta-bottom)!important;width:auto!important;height:auto!important;transform:none!important;opacity:1!important;display:block!important}\n[data-hf30-hero] [data-hf30-meta] h3{width:auto!important;height:auto!important;margin:0!important;font-size:12px!important;line-height:1.4!important}\n}\n@media(min-width:1280px) and (min-height:851px){\n[data-hf30-hero]{--hhr30-bottom:clamp(56px,calc(56px + (100svh - 850px)*1.5),32svh);--hhr30-tag-gap:clamp(32px,calc(32px + (100svh - 850px)*.44),112px);--hhr30-meta-bottom:clamp(20px,calc(20px + (100svh - 850px)*.57),12svh)}\n}\n@media(min-width:1280px) and (max-height:420px){\n[data-hf30-hero]{--hhr30-type:clamp(17px,5svh,21px);--hhr30-logo:clamp(100px,30svh,126px);--hhr30-bottom:40px;--hhr30-tag-gap:18px;--hhr30-meta-bottom:12px}\n[data-hf30-hero] [data-hf30-tagline] p{font-size:12px!important}\n[data-hf30-hero] [data-hf30-meta] h3{font-size:10px!important}\n}\n/* Short landscape keeps the complete original scene within the available height. */\n@media(max-width:1279px) and (max-height:420px){\n[data-hf30-hero]{--hf30-type:clamp(17px,5svh,21px);--hf30-logo:clamp(100px,30svh,126px)}\n[data-hf30-hero] [data-hf30-headline]{bottom:40px!important;gap:4px!important}\n[data-hf30-hero] [data-hf30-wordmark]{bottom:calc(40px + var(--hf30-type)*.15)!important}\n[data-hf30-hero] [data-hf30-tagline]{bottom:calc(58px + var(--hf30-type)*2.8)!important}\n[data-hf30-hero] [data-hf30-meta]{bottom:12px!important}\n}\n`;\n  document.head.append(style);\n  window[KEY] = { destroy() { style.remove(); delete window[KEY]; } };\n})();\n\n;/* Tag the HOME footer at its actual sibling location for the existing mobile reflow. */\n(()=>{\n 'use strict';\n const KEY='__brainableHomeFooterRestored';window[KEY]?.destroy?.();\n const marked=new Map();let raf=0,disposed=false;\n const mark=(el,key)=>{if(!el)return;const attr='data-'+key;let attrs=marked.get(el);if(!attrs){attrs=new Map();marked.set(el,attrs)}if(!attrs.has(attr))attrs.set(attr,el.getAttribute(attr));el.setAttribute(attr,'')};\n function restore(el,attrs){for(const[attr,value]of attrs)value===null?el.removeAttribute(attr):el.setAttribute(attr,value);marked.delete(el)}\n function refresh(){raf=0;if(disposed)return;for(const[el,attrs]of marked)if(!el.isConnected)restore(el,attrs);\n  const hero=document.querySelector('[data-hf30-hero]');\n  const footer=hero?.parentElement?.querySelector(':scope>footer');\n  if(!footer){for(const[el,attrs]of marked)restore(el,attrs);return}\n  mark(footer,'hmf30-footer');mark(footer,'hf30-footer');\n  for(const el of footer.querySelectorAll('div'))if(el.textContent.replace(/[\\s\\u200b-\\u200d]/g,''))mark(el,'hf30-flow');\n }\n const schedule=()=>{if(!disposed&&!raf)raf=requestAnimationFrame(refresh)};\n const observer=new MutationObserver(schedule);observer.observe(document.body,{childList:true,subtree:true});\n window.addEventListener('resize',schedule,{passive:true});refresh();\n window[KEY]={destroy(){disposed=true;observer.disconnect();cancelAnimationFrame(raf);window.removeEventListener('resize',schedule);for(const[el,attrs]of marked)restore(el,attrs);delete window[KEY]}};\n})();\n\n;/*! Animated Text motion adapted from Bundui, Copyright (c) 2024 Bundui.\n * MIT License\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n * Source: bundui/components@c07468613dfe7db776f1749a0921a1e5e7bd33d5\n * Exact entrance: letters, 80ms stagger, 600ms, y10 -> 0, opacity0 -> 1, easeOut.\n */\n(() => {\n  'use strict';\n  const KEY = '__brainableHomeNativeAnimatedText';\n  window[KEY]?.destroy?.();\n  const FIRST = '잠재력을 깨우는 기술,';\n  const SECOND = '이 함께합니다.';\n  const WORDMARK_SOURCE = 'fde0244a54e45655f579546c98baaa88b4e2d8c7';\n  const WORDMARK_SLOTS = Array.from('브레인에이블').length;\n  const DURATION = 600;\n  const STAGGER = 80;\n  const EASING = 'cubic-bezier(0, 0, 0.58, 1)';\n  const LETTER_ATTR = 'data-hnmat30-letter';\n  const reduced = window.matchMedia('(prefers-reduced-motion: reduce)');\n  const bindings = new Map();\n  const normalize = text => String(text || '').replace(/[\\s\\u200b-\\u200d]+/g, ' ').trim();\n  const atHome = () => (location.pathname.replace(/\\/+$/, '') || '/') === '/';\n  const segmenter = typeof Intl.Segmenter === 'function'\n    ? new Intl.Segmenter('ko', { granularity: 'grapheme' }) : null;\n  const graphemes = text => segmenter\n    ? Array.from(segmenter.segment(text), part => part.segment) : Array.from(text);\n  const isSpace = text => /^[\\s\\u200b-\\u200d\\ufeff]+$/u.test(text);\n  let destroyed = false;\n  let frame = 0;\n\n  function matchingHeroes() {\n    const found = new Map();\n    if (!atHome()) return found;\n    for (const first of document.querySelectorAll('h1')) {\n      if (normalize(first.textContent) !== FIRST) continue;\n      let host = first.closest('[data-hf30-hero]');\n      if (!host) {\n        host = first.parentElement;\n        while (host && !Array.from(host.children).some(child => child.tagName === 'VIDEO')) host = host.parentElement;\n      }\n      if (!host || !host.getClientRects().length || host.getBoundingClientRect().width <= 0) continue;\n      const headline = first.closest('[data-hf30-headline]') || first.parentElement;\n      const second = Array.from(headline.querySelectorAll('h1')).find(node => node !== first && normalize(node.textContent) === SECOND);\n      if (!second) continue;\n      const image = host.querySelector(`[data-hf30-wordmark] img[src*=\"${WORDMARK_SOURCE}\"]`)\n        || host.querySelector(`img[src*=\"${WORDMARK_SOURCE}\"]`)\n        || host.querySelector('[data-hf30-wordmark] img');\n      found.set(host, { first, second, image });\n    }\n    return found;\n  }\n\n  function bind(host, native) {\n    const originalCopy = [native.first.textContent, native.second.textContent];\n    const originals = [];\n    const units = [];\n    const animations = new Set();\n    let cursor = 0;\n    let state = 'waiting';\n    let started = false;\n    let released = false;\n    let intersection = null;\n    let startedAt = null;\n    let completedAt = null;\n    let completedUnits = 0;\n    const baselineBounds = {\n      hero: host.getBoundingClientRect().toJSON(),\n      first: native.first.getBoundingClientRect().toJSON(),\n      second: native.second.getBoundingClientRect().toJSON(),\n      wordmark: native.image?.getBoundingClientRect().toJSON() || null,\n    };\n\n    function wrapHeading(heading) {\n      const walker = document.createTreeWalker(heading, NodeFilter.SHOW_TEXT);\n      const nodes = [];\n      for (let node = walker.nextNode(); node; node = walker.nextNode()) {\n        if (!node.nodeValue || isSpace(node.nodeValue) || node.parentElement?.closest('[data-hf30-spacer]')) continue;\n        nodes.push(node);\n      }\n      for (const original of nodes) {\n        if (!original.parentNode) continue;\n        const parent = original.parentNode;\n        const start = document.createComment('brainable-native-motion:start');\n        const end = document.createComment('brainable-native-motion:end');\n        const fragment = document.createDocumentFragment();\n        const replacement = [];\n        fragment.append(start);\n        let pendingSpace = '';\n        const flushSpace = () => {\n          if (!pendingSpace) return;\n          const node = document.createTextNode(pendingSpace);\n          replacement.push(node); fragment.append(node); pendingSpace = '';\n        };\n        for (const part of graphemes(original.nodeValue)) {\n          if (isSpace(part)) { pendingSpace += part; cursor++; continue; }\n          flushSpace();\n          const letter = document.createElement('span');\n          letter.setAttribute(LETTER_ATTR, String(cursor++));\n          letter.style.display = 'inline-block';\n          letter.textContent = part;\n          replacement.push(letter); fragment.append(letter);\n          units.push({ node: letter, index: cursor - 1, kind: 'letter', copy: part });\n        }\n        flushSpace(); fragment.append(end);\n        parent.replaceChild(fragment, original);\n        originals.push({ parent, original, start, end, replacement, copy: original.nodeValue });\n      }\n    }\n\n    wrapHeading(native.first);\n    if (native.image) units.push({ node: native.image, index: cursor, kind: 'wordmark', copy: null });\n    // The existing PNG is one visual unit; its timing occupies the six original\n    // brand letters so the following suffix retains the approved stagger timing.\n    cursor += WORDMARK_SLOTS;\n    wrapHeading(native.second);\n\n    const finish = () => {\n      for (const animation of animations) {\n        animation.onfinish = null;\n        try { animation.cancel(); } catch (_) { /* Native base style is final. */ }\n      }\n      animations.clear(); state = 'complete';\n      completedUnits = units.length; completedAt = performance.now();\n    };\n    const start = () => {\n      if (started || released) return;\n      started = true;\n      if (reduced.matches || document.hidden || units.some(unit => typeof unit.node.animate !== 'function')) { finish(); return; }\n      state = 'running'; startedAt = performance.now();\n      try {\n        for (const unit of units) {\n          const animation = unit.node.animate([\n            { opacity: 0, transform: 'translateY(10px)' },\n            { opacity: 1, transform: 'translateY(0px)' },\n          ], { duration: DURATION, delay: unit.index * STAGGER, easing: EASING, fill: 'backwards' });\n          animations.add(animation);\n          animation.onfinish = () => {\n            animation.onfinish = null; animations.delete(animation); completedUnits++;\n            try { animation.cancel(); } catch (_) { /* Native base style is final. */ }\n            if (!animations.size) { state = 'complete'; completedAt = performance.now(); }\n          };\n        }\n      } catch (_) { finish(); }\n    };\n    const visibleBounds = host.getBoundingClientRect();\n    if (reduced.matches || (visibleBounds.bottom > 0 && visibleBounds.top < window.innerHeight)) start();\n    else if (typeof IntersectionObserver === 'function') {\n      intersection = new IntersectionObserver(entries => {\n        if (!released && entries.some(entry => entry.isIntersecting)) { start(); intersection.disconnect(); }\n      }, { threshold: 0.01 });\n      intersection.observe(host);\n    } else start();\n\n    function currentRegion(record) {\n      if (record.start.parentNode !== record.parent || record.end.parentNode !== record.parent) return null;\n      const nodes = [];\n      for (let node = record.start.nextSibling; node && node !== record.end; node = node.nextSibling) nodes.push(node);\n      if (record.start.nextSibling === null || (nodes.length && nodes[nodes.length - 1].nextSibling !== record.end)) return null;\n      return nodes;\n    }\n    const intact = () => originalCopy[0] === native.first.textContent && originalCopy[1] === native.second.textContent\n      && units.every(unit => unit.node.isConnected && (unit.kind !== 'letter' || unit.node.textContent === unit.copy))\n      && originals.every(record => {\n        const nodes = currentRegion(record);\n        return nodes && nodes.length === record.replacement.length && nodes.every((node, index) => node === record.replacement[index]);\n      });\n    const motion = () => {\n      if (reduced.matches) { started = true; finish(); return; }\n      for (const animation of animations) {\n        try { document.hidden ? animation.pause() : animation.play(); } catch (_) { finish(); break; }\n      }\n    };\n    return {\n      host, native, intact, motion,\n      inspect() {\n        return {\n          copy: [native.first.textContent, native.second.textContent],\n          targetText: { first: FIRST, second: SECOND },\n          nativeCopyRetained: originalCopy[0] === native.first.textContent && originalCopy[1] === native.second.textContent,\n          originalWordmarkPresent: !!native.image?.isConnected,\n          originalCopy: originalCopy.slice(),\n          unitCount: units.length,\n          motion: { state, started, completed: state === 'complete', completedUnits, activeAnimations: animations.size,\n            units: units.length, timelineSlots: cursor,\n            duration: DURATION, stagger: STAGGER, initialY: 10, easing: EASING, reducedMotion: reduced.matches,\n            elapsedMs: startedAt === null ? 0 : Math.max(0, (completedAt ?? performance.now()) - startedAt),\n            totalDurationMs: units.length ? units[units.length - 1].index * STAGGER + DURATION : 0 },\n          units: units.map(unit => ({ kind: unit.kind, text: unit.copy, delay: unit.index * STAGGER })),\n          baselineBounds,\n          bounds: { hero: host.getBoundingClientRect().toJSON(), first: native.first.getBoundingClientRect().toJSON(),\n            second: native.second.getBoundingClientRect().toJSON(), wordmark: native.image?.getBoundingClientRect().toJSON() || null },\n        };\n      },\n      release() {\n        if (released) return;\n        released = true; intersection?.disconnect(); finish();\n        for (const record of originals.slice().reverse()) {\n          const nodes = currentRegion(record);\n          const unchanged = nodes && nodes.length === record.replacement.length\n            && nodes.every((node, index) => node === record.replacement[index])\n            && nodes.map(node => node.textContent).join('') === record.copy;\n          if (unchanged) {\n            record.parent.insertBefore(record.original, record.start);\n            for (const node of nodes) node.remove();\n          } else {\n            // React may have replaced/edited this region. Preserve its latest\n            // content and only unwrap connected elements owned by this addon.\n            for (const node of record.replacement) {\n              if (node.nodeType === Node.ELEMENT_NODE && node.hasAttribute(LETTER_ATTR) && node.parentNode) node.replaceWith(...node.childNodes);\n            }\n          }\n          record.start.remove(); record.end.remove();\n        }\n      },\n    };\n  }\n\n  function reconcile() {\n    frame = 0;\n    if (destroyed) return;\n    const wanted = matchingHeroes();\n    for (const [host, binding] of bindings) {\n      const native = wanted.get(host);\n      if (!native || native.first !== binding.native.first || native.second !== binding.native.second\n          || native.image !== binding.native.image || !binding.intact()) {\n        binding.release(); bindings.delete(host);\n      }\n    }\n    for (const [host, native] of wanted) if (!bindings.has(host)) bindings.set(host, bind(host, native));\n  }\n  function schedule() { if (!destroyed && !frame) frame = requestAnimationFrame(reconcile); }\n  const observer = new MutationObserver(schedule);\n  observer.observe(document.body, { childList: true, characterData: true, subtree: true });\n  const updateMotion = () => { for (const binding of bindings.values()) binding.motion(); };\n  window.addEventListener('resize', schedule, { passive: true });\n  window.addEventListener('popstate', schedule);\n  document.addEventListener('visibilitychange', updateMotion);\n  if (reduced.addEventListener) reduced.addEventListener('change', updateMotion); else reduced.addListener(updateMotion);\n  reconcile();\n  const api = {\n    inspect() { return { route: location.pathname, activeHeroes: bindings.size, source: 'Bundui Animated Text, native nodes only',\n      heroes: Array.from(bindings.values(), binding => binding.inspect()) }; },\n    destroy() {\n      if (destroyed) return;\n      destroyed = true; observer.disconnect(); cancelAnimationFrame(frame);\n      window.removeEventListener('resize', schedule); window.removeEventListener('popstate', schedule);\n      document.removeEventListener('visibilitychange', updateMotion);\n      if (reduced.removeEventListener) reduced.removeEventListener('change', updateMotion); else reduced.removeListener(updateMotion);\n      for (const binding of bindings.values()) binding.release();\n      bindings.clear();\n      if (window[KEY] === api) delete window[KEY];\n    },\n  };\n  window[KEY] = api;\n})();\n\n\n;/* Approved tPBM film, limited to the existing native mechanism image frame. */\n(() => {\n  'use strict';\n  const KEY='__brainableTPBMMotion31';\n  window[KEY]?.dispose();\n  const VIDEO=\"https://d2ol7oe51mr4n9.cloudfront.net/user_3BNVGSW82f0j62u9r7tl0n0tA52/6116d975-2f8e-41ec-889d-d379cab336c0.mp4\";\n  const POSTER=\"https://d2ol7oe51mr4n9.cloudfront.net/user_3BNVGSW82f0j62u9r7tl0n0tA52/411feb5b-255b-47b2-af2d-dba75d5e914d.png\";\n  const mediaQuery=matchMedia('(prefers-reduced-motion: reduce)');\n  const bindings=new Map();\n  let stopped=false, raf=0, route=location.pathname;\n  const style=document.createElement('style');\n  style.id='brainable-tpbm-motion-final31';\n  style.textContent=`\n    [data-tp20-image-frame][data-tp31-motion]{background:#000!important;isolation:isolate!important;overflow:hidden!important;}\n    [data-tp31-layer]{position:absolute!important;inset:0!important;z-index:1!important;background:#000!important;opacity:0;pointer-events:none!important;}\n    [data-tp31-ready] [data-tp31-layer]{opacity:1!important;}\n    [data-tp31-ready] img[data-tp20-image]{opacity:0!important;}\n    [data-tp31-layer] > img,[data-tp31-layer] > video{position:absolute!important;inset:0!important;width:100%!important;height:100%!important;max-width:none!important;max-height:none!important;object-fit:contain!important;display:block!important;margin:0!important;padding:0!important;border:0!important;background:#000!important;}\n    [data-tp31-layer] > video{opacity:0;}\n    [data-tp31-video-ready] [data-tp31-layer] > video{opacity:1!important;}\n    [data-tp31-toggle]{position:absolute!important;right:10px!important;bottom:10px!important;z-index:2!important;width:36px!important;height:36px!important;min-width:36px!important;min-height:36px!important;display:grid!important;place-items:center!important;border:1px solid #677b9c!important;border-radius:50%!important;background:rgba(8,16,32,.82)!important;color:#fff!important;cursor:pointer!important;opacity:0;visibility:hidden;}\n    [data-tp31-ready] [data-tp31-toggle]{opacity:1!important;visibility:visible!important;}\n    [data-tp31-toggle]:focus-visible{outline:2px solid #8bb9ff!important;outline-offset:3px!important;}\n    [data-tp31-toggle] svg{width:16px!important;height:16px!important;display:block!important;}\n  `;\n  document.head.appendChild(style);\n  const onRoute=()=>location.pathname.replace(/\\/+$/,'')==='/laserable';\n  const icon=paused=>paused?'<svg viewBox=\"0 0 16 16\" aria-hidden=\"true\"><path d=\"M4 2L13 8L4 14Z\" fill=\"currentColor\"/></svg>':'<svg viewBox=\"0 0 16 16\" aria-hidden=\"true\"><path d=\"M4 2V14M12 2V14\" stroke=\"currentColor\" stroke-width=\"3\"/></svg>';\n  function bind(frame) {\n    const original=frame.querySelector('img[data-tp20-image]');\n    if(!original) return;\n    const layer=document.createElement('div');layer.setAttribute('data-tp31-layer','');\n    const poster=document.createElement('img');poster.alt='';poster.src=POSTER;poster.decoding='async';\n    const video=document.createElement('video');\n    video.muted=true;video.defaultMuted=true;video.loop=true;video.playsInline=true;\n    video.setAttribute('muted','');video.setAttribute('playsinline','');video.setAttribute('loop','');\n    video.setAttribute('aria-label','빛의 진입과 신경세포·미토콘드리아의 반응 및 신호 전달을 보여주는 메카니즘 애니메이션');\n    video.preload=mediaQuery.matches?'none':'metadata';video.poster=POSTER;video.src=VIDEO;\n    const button=document.createElement('button');button.type='button';button.setAttribute('data-tp31-toggle','');\n    const record={frame,layer,poster,video,button,visible:false,userPaused:false,userStarted:false,failed:false};\n    const label=()=>{const paused=video.paused;button.setAttribute('aria-label',paused?'애니메이션 재생':'애니메이션 일시정지');button.title=paused?'애니메이션 재생':'애니메이션 일시정지';button.innerHTML=icon(paused);};\n    const start=()=>{\n      if(record.failed||record.userPaused||(!record.userStarted&&mediaQuery.matches)||!record.visible||document.hidden) {video.pause();return;}\n      video.play().catch(()=>{label();});\n    };\n    const showPoster=()=>{if(poster.naturalWidth) frame.setAttribute('data-tp31-ready','');};\n    const loaded=()=>{frame.setAttribute('data-tp31-ready','');frame.setAttribute('data-tp31-video-ready','');label();};\n    const error=()=>{record.failed=true;frame.removeAttribute('data-tp31-video-ready');if(!poster.naturalWidth)frame.removeAttribute('data-tp31-ready');label();};\n    const toggle=event=>{event.preventDefault();event.stopPropagation();if(video.paused){record.userPaused=false;record.userStarted=true;record.failed=false;record.visible=true;video.play().catch(label);}else{record.userPaused=true;video.pause();}label();};\n    const visibility=()=>start();\n    const preference=()=>{record.userStarted=false;start();};\n    poster.addEventListener('load',showPoster);video.addEventListener('loadeddata',loaded);video.addEventListener('error',error);\n    video.addEventListener('play',label);video.addEventListener('pause',label);button.addEventListener('click',toggle);\n    document.addEventListener('visibilitychange',visibility);mediaQuery.addEventListener('change',preference);\n    layer.append(poster,video);frame.append(layer,button);frame.setAttribute('data-tp31-motion','');\n    const observer=new IntersectionObserver(entries=>{record.visible=entries[0].isIntersecting;start();},{threshold:0.02});observer.observe(frame);\n    record.dispose=()=>{observer.disconnect();video.pause();video.removeAttribute('src');video.load();poster.removeEventListener('load',showPoster);video.removeEventListener('loadeddata',loaded);video.removeEventListener('error',error);video.removeEventListener('play',label);video.removeEventListener('pause',label);button.removeEventListener('click',toggle);document.removeEventListener('visibilitychange',visibility);mediaQuery.removeEventListener('change',preference);layer.remove();button.remove();for(const attr of ['data-tp31-motion','data-tp31-ready','data-tp31-video-ready'])frame.removeAttribute(attr);};\n    bindings.set(frame,record);showPoster();label();\n  }\n  function scan(){raf=0;if(stopped)return;for(const [frame,record] of bindings)if(!onRoute()||!frame.isConnected){record.dispose();bindings.delete(frame);}if(onRoute())for(const frame of document.querySelectorAll('[data-tp20-diagram] [data-tp20-image-frame]'))if(!bindings.has(frame))bind(frame);}\n  function schedule(){if(!stopped&&!raf)raf=requestAnimationFrame(scan);}\n  const observer=new MutationObserver(schedule);observer.observe(document.documentElement,{childList:true,subtree:true,attributes:true,attributeFilter:['data-tp20-diagram','data-tp20-image-frame','data-tp20-image']});\n  const timer=setInterval(()=>{if(route!==location.pathname){route=location.pathname;schedule();}},300);\n  window.addEventListener('popstate',schedule);window.addEventListener('pageshow',schedule);\n  window[KEY]={scan,inspect(){return{route:location.pathname,reducedMotion:mediaQuery.matches,bindings:[...bindings.values()].map(r=>({connected:r.frame.isConnected,visible:r.visible,ready:r.video.readyState,width:r.video.videoWidth,height:r.video.videoHeight,currentTime:r.video.currentTime,paused:r.video.paused,loop:r.video.loop,muted:r.video.muted,playsInline:r.video.playsInline,posterLoaded:r.poster.naturalWidth>0,error:r.video.error?.code||null,frame:r.frame.getBoundingClientRect().toJSON()}))};},dispose(){stopped=true;observer.disconnect();clearInterval(timer);if(raf)cancelAnimationFrame(raf);window.removeEventListener('popstate',schedule);window.removeEventListener('pageshow',schedule);for(const record of bindings.values())record.dispose();bindings.clear();style.remove();delete window[KEY];}};\n  schedule();\n})();\n\n\n;/* HOME only: disable the accidental /about_us anchor around the complete native\n * MAIN. Preserve the mobile company card, all descendants, native event handlers,\n * classes, layout, copy and every real navigation/CTA link.\n * Observed source: backup/home-before.html, desktop breakpoint node-0_4.\n * This module must run with the existing confirmed-hydration gate. It removes\n * only the wrapper's href. A capture guard on that exact wrapper blocks bare\n * background/text clicks while passing every descendant action through.\n */\n(function brainableHomeUnintendedLinkFix() {\n  'use strict';\n  const KEY = '__brainableHomeUnintendedLinkFix31';\n  const MARK = 'data-hul31-body-link';\n  const ACTION = 'a[href],button,[role=\"link\"],[role=\"button\"],input,select,textarea,option,label,summary,form,[contenteditable]:not([contenteditable=\"false\"])';\n  if (window[KEY]) return;\n  const records = new Map();\n  let stopped = false, frame = 0, timer = 0, lastRoute = location.pathname;\n  const normalize = value => (value || '').replace(/\\s+/g, ' ').trim();\n\n  function ready() {\n    const phase = window.__brainableHydrationGate31?.inspect?.().phase;\n    return phase === 'active' || phase === 'starting';\n  }\n  function onHome() { return location.pathname.replace(/\\/+$/, '') === ''; }\n  function isAboutHref(value) {\n    if (!value) return false;\n    try {\n      const url = new URL(value, location.href);\n      return url.origin === location.origin && url.pathname.replace(/\\/+$/, '') === '/about_us' && !url.search && !url.hash;\n    } catch (_) { return false; }\n  }\n  function exactBodyWrapper(anchor) {\n    if (!anchor.isConnected || anchor.tagName !== 'A' || anchor.closest('header,nav,footer')) return false;\n    // A direct native MAIN is the defining defect. The mobile card is a DIV\n    // inside MAIN and intentionally remains a normal company-information link.\n    const main = [...anchor.children].find(node => node.tagName === 'MAIN');\n    if (!main || anchor.children.length !== 1 || main.querySelector('header,nav,footer')) return false;\n    const text = normalize(main.textContent);\n    const intro = [...main.querySelectorAll('h1,h2,h3')].some(node => normalize(node.textContent).startsWith('BrainAble, 두뇌의 가능성을 깨우다'));\n    return intro && text.includes('LASERABLE') && text.includes('READINGABLE') && text.includes('Hear From Our Clients');\n  }\n  function isDescendantAction(event, anchor) {\n    const path = typeof event.composedPath === 'function' ? event.composedPath() : [];\n    if (path.length) {\n      for (const node of path) {\n        if (node === anchor) break;\n        if (node?.nodeType === 1 && node.matches(ACTION)) return true;\n      }\n      return false;\n    }\n    for (let node = event.target?.nodeType === 1 ? event.target : event.target?.parentElement;\n         node && node !== anchor; node = node.parentElement) {\n      if (node.matches(ACTION)) return true;\n    }\n    return false;\n  }\n  function guardFor(anchor) {\n    return event => {\n      if (!onHome() || !records.has(anchor) || !exactBodyWrapper(anchor) || isDescendantAction(event, anchor)) return;\n      // This one malformed native anchor may retain a React router callback\n      // closing over its old href. Block only its background/text activation.\n      event.preventDefault();\n      event.stopPropagation();\n    };\n  }\n  function restore(anchor, record) {\n    anchor.removeEventListener('click', record.guard, true);\n    // Preserve a newer value if React or another explicit edit changed the link.\n    if (!anchor.hasAttribute('href')) anchor.setAttribute('href', record.href);\n    if (anchor.getAttribute(MARK) === '') {\n      if (record.marker === null) anchor.removeAttribute(MARK);\n      else anchor.setAttribute(MARK, record.marker);\n    }\n    records.delete(anchor);\n  }\n  function reconcile() {\n    frame = 0;\n    if (stopped) return;\n    if (!ready()) return;\n    const wanted = new Set();\n    if (onHome()) {\n      for (const anchor of document.querySelectorAll('a[href],a[' + MARK + ']')) {\n        const current = anchor.getAttribute('href');\n        const saved = records.get(anchor);\n        if (!isAboutHref(current === null ? saved?.href : current) || !exactBodyWrapper(anchor)) continue;\n        wanted.add(anchor);\n        if (!saved) {\n          const record = {href:current, target:anchor.getAttribute('target'), tabindex:anchor.getAttribute('tabindex'), marker:anchor.getAttribute(MARK), guard:guardFor(anchor)};\n          records.set(anchor, record);\n          anchor.addEventListener('click', record.guard, true);\n        }\n        if (anchor.hasAttribute('href')) anchor.removeAttribute('href');\n        if (anchor.getAttribute(MARK) !== '') anchor.setAttribute(MARK, '');\n      }\n    }\n    for (const [anchor, record] of [...records]) if (!wanted.has(anchor)) restore(anchor, record);\n  }\n  function schedule() {\n    if (!stopped && !frame) frame = requestAnimationFrame(reconcile);\n  }\n  const observer = new MutationObserver(schedule);\n  observer.observe(document.documentElement, {\n    childList:true, characterData:true, subtree:true, attributes:true, attributeFilter:['href']\n  });\n  // Read-only route polling also catches pushState/replaceState with no DOM\n  // mutation; the browser's history methods and all click handlers stay intact.\n  timer = window.setInterval(() => {\n    if (stopped) return;\n    if (!ready()) { schedule(); return; }\n    if (location.pathname !== lastRoute) { lastRoute = location.pathname; schedule(); }\n  }, 250);\n  window.addEventListener('popstate', schedule);\n  window.addEventListener('pageshow', schedule);\n  window.navigation?.addEventListener('navigatesuccess', schedule);\n  document.addEventListener('DOMContentLoaded', schedule);\n  window[KEY] = {\n    scan:reconcile,\n    inspect() {\n      return {route:location.pathname, hydrationReady:ready(), wrappers:[...records].map(([anchor, record]) => ({\n        breakpoint:anchor.closest('[data-breakpoint-id]')?.getAttribute('data-breakpoint-id') || null,\n        connected:anchor.isConnected, originalHref:record.href, currentHref:anchor.getAttribute('href'),\n        originalTarget:record.target, currentTarget:anchor.getAttribute('target'), originalTabindex:record.tabindex, currentTabindex:anchor.getAttribute('tabindex'),\n        descendantActions:anchor.querySelectorAll('a[href],button,[role=\"link\"],[role=\"button\"]').length\n      }))};\n    },\n    destroy() {\n      if (stopped) return;\n      stopped = true;\n      observer.disconnect();\n      if (frame) cancelAnimationFrame(frame);\n      window.clearInterval(timer);\n      window.removeEventListener('popstate', schedule);\n      window.removeEventListener('pageshow', schedule);\n      window.navigation?.removeEventListener('navigatesuccess', schedule);\n      document.removeEventListener('DOMContentLoaded', schedule);\n      for (const [anchor, record] of [...records]) restore(anchor, record);\n      if (window[KEY] === this) delete window[KEY];\n    }\n  };\n  schedule();\n})();\n\n\n;/* Approved HOME fallback and mobile copy protection. Native content is retained. */\n(function brainableMobileHomeReliability32() {\n  'use strict';\n  const KEY = '__brainableMobileHomeReliability32';\n  window[KEY]?.dispose();\n  const bindings = new Map(), cards = new Map();\n  let frame = 0, stopped = false;\n  const home = () => location.pathname.replace(/\\/+$/, '') === '';\n  function bind(hero) {\n    const videos = Array.from(hero.children).filter(e => e.tagName === 'VIDEO');\n    const pause = event => { const v = event?.currentTarget; if (v) v.pause(); };\n    for (const video of videos) {\n      video.pause();\n      video.addEventListener('play', pause);\n    }\n    hero.setAttribute('data-hm32-poster', '');\n    return {videos,dispose() { videos.forEach(v => v.removeEventListener('play',pause)); hero.removeAttribute('data-hm32-poster'); }};\n  }\n  function sync() {\n    frame = 0;\n    if (stopped) return;\n    const heroes = home() ? new Set(Array.from(document.querySelectorAll('[data-bh30-native-hero],[data-hf30-hero]'))) : new Set();\n    for (const [hero,entry] of bindings) {\n      const next=Array.from(hero.children).filter(e=>e.tagName==='VIDEO');\n      if (!heroes.has(hero) || !hero.isConnected || next.length!==entry.videos.length || next.some((v,i)=>v!==entry.videos[i])) { entry.dispose();bindings.delete(hero); }\n    }\n    for (const hero of heroes) if (!bindings.has(hero)) bindings.set(hero,bind(hero));\n    const desired=new Set();\n    if (home()) for (const card of document.querySelectorAll('[data-hlm-card]')) {\n      const name = card.querySelector('[data-hf30-name]')?.textContent.replace(/[\\s\\u200b]/g,'');\n      if (name === 'LASERABLE') desired.add(card);\n    }\n    for (const [card,old] of cards) if (!desired.has(card)) { old===null?card.removeAttribute('data-hm32-laserable'):card.setAttribute('data-hm32-laserable',old);cards.delete(card); }\n    for (const card of desired) if (!cards.has(card)) { cards.set(card,card.getAttribute('data-hm32-laserable'));card.setAttribute('data-hm32-laserable',''); }\n  }\n  function schedule() { if (!stopped && !frame) frame=requestAnimationFrame(sync); }\n  const observer = new MutationObserver(schedule);\n  observer.observe(document.body,{childList:true,subtree:true,attributes:true,attributeFilter:['data-bh30-native-hero','data-hf30-hero','data-hlm-card','data-hf30-name']});\n  window.addEventListener('popstate',schedule);\n  sync();\n  window[KEY] = {\n    inspect() { return {route:location.pathname,heroes:Array.from(bindings.keys()).map(hero=>({\n      rect:hero.getBoundingClientRect().toJSON(),poster:getComputedStyle(hero).backgroundImage.startsWith('url('),\n      renderer:hero.querySelector('.bh30-background')?.getAttribute('data-state'),\n      videos:Array.from(hero.querySelectorAll(':scope > video')).map(v=>({paused:v.paused,visibility:getComputedStyle(v).visibility,display:getComputedStyle(v).display}))\n    })),products:Array.from(document.querySelectorAll('[data-hlm-card] [data-hf30-name]')).map(e=>({name:e.textContent,whiteSpace:getComputedStyle(e).whiteSpace,overflowWrap:getComputedStyle(e).overflowWrap,width:e.getBoundingClientRect().width}))}; },\n    dispose() { stopped=true; observer.disconnect();cancelAnimationFrame(frame); window.removeEventListener('popstate',schedule);for (const entry of bindings.values()) entry.dispose();bindings.clear();for (const [card,old] of cards) old===null?card.removeAttribute('data-hm32-laserable'):card.setAttribute('data-hm32-laserable',old);cards.clear(); }\n  };\n})();\n\n\n});\n\n</script>","addBypassLinks":true,"socialImageFilename":"44da5c3edea87192afa55819594c43cdfdac890b.png","labs":{"E5FBBA911B2B7A09E649D4BE6CDF8591EAEFC881":false},"description":"브레인에이블은 단순한 뇌기능 개선을 넘어, 건강한 뇌를 기반으로 행복한 삶을 실현하는 것을 목표로 합니다. \n유아부터 성인 그리고 노인에 이르기까지 각 생애주기에 따른 맞춤형 두뇌 기능 향상 솔루션을 제공하여 더 나은 삶으로 안내합니다.\n--------------------------------------\nBrainable goes beyond simply improving brain function. Our goal is to help people achieve happier, more fulfilling lives through better brain health.\nFrom early childhood through adulthood and into later life, we provide personalized brain-function enhancement solutions tailored to every stage of life, guiding each individual toward a better quality of life."},"sourceCodeHash":"a197a94d2ab0f7d96916c9a86227b13daf07febf"}