diff --git a/src/Microsoft.AspNet.Razor/CodeGenerators/CSharpCodeWriter.cs b/src/Microsoft.AspNet.Razor/CodeGenerators/CSharpCodeWriter.cs index 980c147e76..552f031a4e 100644 --- a/src/Microsoft.AspNet.Razor/CodeGenerators/CSharpCodeWriter.cs +++ b/src/Microsoft.AspNet.Razor/CodeGenerators/CSharpCodeWriter.cs @@ -498,23 +498,6 @@ namespace Microsoft.AspNet.Razor.CodeGenerators Write(literal[i].ToString()); break; } - if (i > 0 && i % 80 == 0) - { - // If current character is a high surrogate and the following - // character is a low surrogate, don't break them. - // Otherwise when we write the string to a file, we might lose - // the characters. - if (Char.IsHighSurrogate(literal[i]) - && (i < literal.Length - 1) - && Char.IsLowSurrogate(literal[i + 1])) - { - Write(literal[++i].ToString()); - } - - Write("\" +"); - Write(NewLine); - Write("\""); - } } Write("\""); } diff --git a/src/Microsoft.AspNet.Razor/CodeGenerators/Visitors/CSharpCodeVisitor.cs b/src/Microsoft.AspNet.Razor/CodeGenerators/Visitors/CSharpCodeVisitor.cs index f9965d9e48..75e76be6cb 100644 --- a/src/Microsoft.AspNet.Razor/CodeGenerators/Visitors/CSharpCodeVisitor.cs +++ b/src/Microsoft.AspNet.Razor/CodeGenerators/Visitors/CSharpCodeVisitor.cs @@ -15,6 +15,7 @@ namespace Microsoft.AspNet.Razor.CodeGenerators.Visitors private const string ItemParameterName = "item"; private const string ValueWriterName = "__razor_attribute_value_writer"; private const string TemplateWriterName = "__razor_template_writer"; + private const int MaxStringLiteralLength = 1024; private CSharpPaddingBuilder _paddingBuilder; private CSharpTagHelperCodeRenderer _tagHelperCodeRenderer; @@ -134,17 +135,7 @@ namespace Microsoft.AspNet.Razor.CodeGenerators.Visitors Writer.WriteStartInstrumentationContext(Context, start, text.Length, isLiteral: true); } - if (Context.ExpressionRenderingMode == ExpressionRenderingMode.WriteToOutput) - { - RenderPreWriteStart(); - } - - Writer.WriteStringLiteral(text); - - if (Context.ExpressionRenderingMode == ExpressionRenderingMode.WriteToOutput) - { - Writer.WriteEndMethodInvocation(); - } + RenderStartWriteLiteral(text); if (Context.Host.EnableInstrumentation) { @@ -165,17 +156,7 @@ namespace Microsoft.AspNet.Razor.CodeGenerators.Visitors Writer.WriteStartInstrumentationContext(Context, chunk.Association, isLiteral: true); } - if (Context.ExpressionRenderingMode == ExpressionRenderingMode.WriteToOutput) - { - RenderPreWriteStart(); - } - - Writer.WriteStringLiteral(chunk.Text); - - if (Context.ExpressionRenderingMode == ExpressionRenderingMode.WriteToOutput) - { - Writer.WriteEndMethodInvocation(); - } + RenderStartWriteLiteral(chunk.Text); if (Context.Host.EnableInstrumentation) { @@ -575,25 +556,47 @@ namespace Microsoft.AspNet.Razor.CodeGenerators.Visitors Context.ExpressionRenderingMode == ExpressionRenderingMode.WriteToOutput; } - private CSharpCodeWriter RenderPreWriteStart() + private void RenderStartWriteLiteral(string text) { - return RenderPreWriteStart(Writer, Context); - } + var charactersRendered = 0; - public static CSharpCodeWriter RenderPreWriteStart(CSharpCodeWriter writer, CodeGeneratorContext context) - { - if (!string.IsNullOrEmpty(context.TargetWriterName)) + // Render the string in pieces to avoid Roslyn OOM exceptions at compile time: + // https://github.com/aspnet/External/issues/54 + while (charactersRendered < text.Length) { - writer.WriteStartMethodInvocation(context.Host.GeneratedClassContext.WriteLiteralToMethodName) - .Write(context.TargetWriterName) - .WriteParameterSeparator(); - } - else - { - writer.WriteStartMethodInvocation(context.Host.GeneratedClassContext.WriteLiteralMethodName); - } + if (Context.ExpressionRenderingMode == ExpressionRenderingMode.WriteToOutput) + { + if (!string.IsNullOrEmpty(Context.TargetWriterName)) + { + Writer.WriteStartMethodInvocation(Context.Host.GeneratedClassContext.WriteLiteralToMethodName) + .Write(Context.TargetWriterName) + .WriteParameterSeparator(); + } + else + { + Writer.WriteStartMethodInvocation(Context.Host.GeneratedClassContext.WriteLiteralMethodName); + } + } - return writer; + string textToRender; + if (text.Length <= MaxStringLiteralLength) + { + textToRender = text; + } + else + { + var charactersToSubstring = Math.Min(MaxStringLiteralLength, text.Length - charactersRendered); + textToRender = text.Substring(charactersRendered, charactersToSubstring); + } + + Writer.WriteStringLiteral(textToRender); + charactersRendered += textToRender.Length; + + if (Context.ExpressionRenderingMode == ExpressionRenderingMode.WriteToOutput) + { + Writer.WriteEndMethodInvocation(); + } + } } } } diff --git a/test/Microsoft.AspNet.Razor.Test/CodeGenerators/CSharpRazorChunkGeneratorTest.cs b/test/Microsoft.AspNet.Razor.Test/CodeGenerators/CSharpRazorChunkGeneratorTest.cs index f4604fc06f..11b1c6cb9a 100644 --- a/test/Microsoft.AspNet.Razor.Test/CodeGenerators/CSharpRazorChunkGeneratorTest.cs +++ b/test/Microsoft.AspNet.Razor.Test/CodeGenerators/CSharpRazorChunkGeneratorTest.cs @@ -52,6 +52,7 @@ namespace Microsoft.AspNet.Razor.Test.Generator } [Theory] + [InlineData("StringLiterals")] [InlineData("NestedCSharp")] [InlineData("NullConditionalExpressions")] [InlineData("NestedCodeBlocks")] diff --git a/test/Microsoft.AspNet.Razor.Test/TestFiles/CodeGenerator/Output/Await.cs b/test/Microsoft.AspNet.Razor.Test/TestFiles/CodeGenerator/Output/Await.cs index 36f827ce73..cfe6ee051e 100644 --- a/test/Microsoft.AspNet.Razor.Test/TestFiles/CodeGenerator/Output/Await.cs +++ b/test/Microsoft.AspNet.Razor.Test/TestFiles/CodeGenerator/Output/Await.cs @@ -24,8 +24,7 @@ namespace TestOutput public override async Task ExecuteAsync() { Instrumentation.BeginContext(91, 100, true); - WriteLiteral("\r\n
\r\n

Basic Asynchronous Expression Test

\r\n

Basic Asynch" + -"ronous Expression: "); + WriteLiteral("\r\n

\r\n

Basic Asynchronous Expression Test

\r\n

Basic Asynchronous Expression: "); Instrumentation.EndContext(); Instrumentation.BeginContext(192, 11, false); #line 10 "Await.cshtml" @@ -83,8 +82,7 @@ namespace TestOutput #line hidden Instrumentation.EndContext(); Instrumentation.BeginContext(453, 124, true); - WriteLiteral("

\r\n
\r\n\r\n
\r\n

Advanced Asynchronous Expression Test

" + -"\r\n

Advanced Asynchronous Expression: "); + WriteLiteral("

\r\n
\r\n\r\n
\r\n

Advanced Asynchronous Expression Test

\r\n

Advanced Asynchronous Expression: "); Instrumentation.EndContext(); Instrumentation.BeginContext(578, 15, false); #line 19 "Await.cshtml" diff --git a/test/Microsoft.AspNet.Razor.Test/TestFiles/CodeGenerator/Output/BasicTagHelpers.RemoveTagHelper.cs b/test/Microsoft.AspNet.Razor.Test/TestFiles/CodeGenerator/Output/BasicTagHelpers.RemoveTagHelper.cs index 17425e18a1..62f22578dc 100644 --- a/test/Microsoft.AspNet.Razor.Test/TestFiles/CodeGenerator/Output/BasicTagHelpers.RemoveTagHelper.cs +++ b/test/Microsoft.AspNet.Razor.Test/TestFiles/CodeGenerator/Output/BasicTagHelpers.RemoveTagHelper.cs @@ -15,9 +15,7 @@ namespace TestOutput public override async Task ExecuteAsync() { Instrumentation.BeginContext(70, 187, true); - WriteLiteral("\r\n

\r\n

\r\n " + -"

\r\n \r\n \r\n

\r\n
"); + WriteLiteral("\r\n
\r\n

\r\n

\r\n \r\n \r\n

\r\n
"); Instrumentation.EndContext(); } #pragma warning restore 1998 diff --git a/test/Microsoft.AspNet.Razor.Test/TestFiles/CodeGenerator/Output/ConditionalAttributes.cs b/test/Microsoft.AspNet.Razor.Test/TestFiles/CodeGenerator/Output/ConditionalAttributes.cs index f1ab19a994..4fe76000d9 100644 --- a/test/Microsoft.AspNet.Razor.Test/TestFiles/CodeGenerator/Output/ConditionalAttributes.cs +++ b/test/Microsoft.AspNet.Razor.Test/TestFiles/CodeGenerator/Output/ConditionalAttributes.cs @@ -123,8 +123,7 @@ WriteAttributeValue("", 426, Url.Content("~/Scripts/modernizr-2.0.6-development- #line hidden EndWriteAttribute(); Instrumentation.BeginContext(488, 152, true); - WriteLiteral(" type=\"text/javascript\">\r\n \r\n"); + WriteLiteral(" type=\"text/javascript\">\r\n \r\n"); Instrumentation.EndContext(); #line 15 "ConditionalAttributes.cshtml" diff --git a/test/Microsoft.AspNet.Razor.Test/TestFiles/CodeGenerator/Output/NestedScriptTagTagHelpers.cs b/test/Microsoft.AspNet.Razor.Test/TestFiles/CodeGenerator/Output/NestedScriptTagTagHelpers.cs index 3907cfe076..3399b2b1d5 100644 --- a/test/Microsoft.AspNet.Razor.Test/TestFiles/CodeGenerator/Output/NestedScriptTagTagHelpers.cs +++ b/test/Microsoft.AspNet.Razor.Test/TestFiles/CodeGenerator/Output/NestedScriptTagTagHelpers.cs @@ -26,8 +26,7 @@ namespace TestOutput { __tagHelperRunner = __tagHelperRunner ?? new global::Microsoft.AspNet.Razor.Runtime.TagHelperRunner(); Instrumentation.BeginContext(31, 106, true); - WriteLiteral("\r\n\r\n "); + WriteLiteral(" \r\n "); Instrumentation.EndContext(); } , StartTagHelperWritingScope, EndTagHelperWritingScope); diff --git a/test/Microsoft.AspNet.Razor.Test/TestFiles/CodeGenerator/Output/StringLiterals.cs b/test/Microsoft.AspNet.Razor.Test/TestFiles/CodeGenerator/Output/StringLiterals.cs new file mode 100644 index 0000000000..254352c126 --- /dev/null +++ b/test/Microsoft.AspNet.Razor.Test/TestFiles/CodeGenerator/Output/StringLiterals.cs @@ -0,0 +1,279 @@ +#pragma checksum "StringLiterals.cshtml" "{ff1816ec-aa5e-4d10-87f7-6f4963833460}" "3c21118a6113e76e4f71d17e3ae081f13d451427" +namespace TestOutput +{ + using System; + using System.Threading.Tasks; + + public class StringLiterals + { + #line hidden + public StringLiterals() + { + } + + #pragma warning disable 1998 + public override async Task ExecuteAsync() + { + Instrumentation.BeginContext(0, 2013, true); + WriteLiteral(@"

This is line 1

+

This is line 2

+

This is line 3

+

This is line 4

+

This is line 5

+

This is line 6

+

This is line 7

+

This is line 8

+

This is line 9

+

This is line 10

+

This is line 11

+

This is line 12

+

This is line 13

+

This is line 14

+

This is line 15

+

This is line 16

+

This is line 17

+

This is line 18

+

This is line 19

+

This is line 20

+

This is line 21

+

This is line 22

+

This is line 23

+

This is line 24

+

This is line 25

+

This is line 26

+

This is line 27

+

This is line 28

+

This is line 29

+

This is line 30

+

This is line 31

+

This is line 32

+

This is line 33

+

This is line 34

+

This is line 35

+

This is line 36

+

This is line 37

+

This is line 38

+

This is line 39

+

This is line 40

+

This is line 41

+

This is line 42

+

This is line 43

+<"); + WriteLiteral(@"p>This is line 44

+

This is line 45

+

This is line 46

+

This is line 47

+

This is line 48

+

This is line 49

+

This is line 50

+

This is line 51

+

This is line 52

+

This is line 53

+

This is line 54

+

This is line 55

+

This is line 56

+

This is line 57

+

This is line 58

+

This is line 59

+

This is line 60

+

This is line 61

+

This is line 62

+

This is line 63

+

This is line 64

+

This is line 65

+

This is line 66

+

This is line 67

+

This is line 68

+

This is line 69

+

This is line 70

+

This is line 71

+

This is line 72

+

This is line 73

+

This is line 74

+

This is line 75

+

This is line 76

+

This is line 77

+

This is line 78

+

This is line 79

+

This is line 80

+

This is line 81

+

This is line 82

+

This is line 83

+

This is line 84


+ +"); + Instrumentation.EndContext(); + DefineSection("WriteLiteralsToInHere", async(__razor_template_writer) => { + Instrumentation.BeginContext(2045, 2618, true); + WriteLiteralTo(__razor_template_writer, @" +

This is line 1 nested

+

This is line 2 nested

+

This is line 3 nested

+

This is line 4 nested

+

This is line 5 nested

+

This is line 6 nested

+

This is line 7 nested

+

This is line 8 nested

+

This is line 9 nested

+

This is line 10 nested

+

This is line 11 nested

+

This is line 12 nested

+

This is line 13 nested

+

This is line 14 nested

+

This is line 15 nested

+

This is line 16 nested

+

This is line 17 nested

+

This is line 18 nested

+

This is line 19 nested

+

This is line 20 nested

+

This is line 21 nested

+

This is line 22 nested

+

This is line 23 nested

+

This is line 24 nested

+

This is line 25 nested

+

This is line 26 nested

+

This is line 27 nested

+

This is line 28 nested

+

This is line 29 nested

+

This is l"); + WriteLiteralTo(__razor_template_writer, @"ine 30 nested

+

This is line 31 nested

+

This is line 32 nested

+

This is line 33 nested

+

This is line 34 nested

+

This is line 35 nested

+

This is line 36 nested

+

This is line 37 nested

+

This is line 38 nested

+

This is line 39 nested

+

This is line 40 nested

+

This is line 41 nested

+

This is line 42 nested

+

This is line 43 nested

+

This is line 44 nested

+

This is line 45 nested

+

This is line 46 nested

+

This is line 47 nested

+

This is line 48 nested

+

This is line 49 nested

+

This is line 50 nested

+

This is line 51 nested

+

This is line 52 nested

+

This is line 53 nested

+

This is line 54 nested

+

This is line 55 nested

+

This is line 56 nested

+

This is line 57 nested

+

This is line 58 nested

+

This is line 59 ne"); + WriteLiteralTo(__razor_template_writer, @"sted

+

This is line 60 nested

+

This is line 61 nested

+

This is line 62 nested

+

This is line 63 nested

+

This is line 64 nested

+

This is line 65 nested

+

This is line 66 nested

+

This is line 67 nested

+

This is line 68 nested

+

This is line 69 nested

+

This is line 70 nested

+

This is line 71 nested

+

This is line 72 nested

+

This is line 73 nested

+

This is line 74 nested

+

This is line 75 nested

+"); + Instrumentation.EndContext(); + } + ); + Instrumentation.BeginContext(4666, 1026, true); + WriteLiteral(@"

This is line 1

+

This is line 2

+

This is line 3

+

This is line 4

+

This is line 5

+

This is line 6

+

This is line 7

+

This is line 8

+

This is line 9

+

This is line 10

+

This is line 11

+

This is line 12

+

This is line 13

+

This is line 14

+

This is line 15

+

This is line 16

+

This is line 17

+

This is line 18

+

This is line 19

+

This is line 20

+

This is line 21

+

This is line 22

+

This is line 23

+

This is line 24

+

This is line 25

+

This is line 26

+

This is line 27

+

This is line 28

+

This is line 29

+

This is line 30

+

This is line 31

+

This is line 32

+

This is line 33

+

This is line 34

+

This is line 35

+

This is line 36

+

This is line 37

+

This is line 38

+

This is line 39

+

This is line 40

+

This is line 41

+

This is line 42

+

This is line 43

hi!"); + WriteLiteral("\r\n"); + Instrumentation.EndContext(); + DefineSection("WriteLiteralsToInHereAlso", async(__razor_template_writer) => { + Instrumentation.BeginContext(5728, 1023, true); + WriteLiteralTo(__razor_template_writer, @" +

This is line 1 nested

+

This is line 2 nested

+

This is line 3 nested

+

This is line 4 nested

+

This is line 5 nested

+

This is line 6 nested

+

This is line 7 nested

+

This is line 8 nested

+

This is line 9 nested

+

This is line 10 nested

+

This is line 11 nested

+

This is line 12 nested

+

This is line 13 nested

+

This is line 14 nested

+

This is line 15 nested

+

This is line 16 nested

+

This is line 17 nested

+

This is line 18 nested

+

This is line 19 nested

+

This is line 20 nested

+

This is line 21 nested

+

This is line 22 nested

+

This is line 23 nested

+

This is line 24 nested

+

This is line 25 nested

+

This is line 26 nested

+

This is line 27 nested

+

This is line 28 nested

+

This is line 29 nested

+

30

+"); + Instrumentation.EndContext(); + } + ); + Instrumentation.BeginContext(6752, 1, true); + WriteLiteral("!"); + Instrumentation.EndContext(); + } + #pragma warning restore 1998 + } +} diff --git a/test/Microsoft.AspNet.Razor.Test/TestFiles/CodeGenerator/Output/SymbolBoundAttributes.cs b/test/Microsoft.AspNet.Razor.Test/TestFiles/CodeGenerator/Output/SymbolBoundAttributes.cs index 4e8f59c6f9..583c80f0dd 100644 --- a/test/Microsoft.AspNet.Razor.Test/TestFiles/CodeGenerator/Output/SymbolBoundAttributes.cs +++ b/test/Microsoft.AspNet.Razor.Test/TestFiles/CodeGenerator/Output/SymbolBoundAttributes.cs @@ -24,10 +24,7 @@ namespace TestOutput { __tagHelperRunner = __tagHelperRunner ?? new global::Microsoft.AspNet.Razor.Runtime.TagHelperRunner(); Instrumentation.BeginContext(23, 253, true); - WriteLiteral("\r\n\r\n\r\n\r\n\r\n\r\n\r\n
\r\n
\r\n\r\n"); + WriteLiteral("\r\n
    \r\n
      \r\n\r\n\r\n\r\n
      \r\n
      \r\n\r\n"); Instrumentation.EndContext(); __tagHelperExecutionContext = __tagHelperScopeManager.Begin("ul", global::Microsoft.AspNet.Razor.TagHelpers.TagMode.StartTagAndEndTag, "test", async() => { } diff --git a/test/Microsoft.AspNet.Razor.Test/TestFiles/CodeGenerator/Source/StringLiterals.cshtml b/test/Microsoft.AspNet.Razor.Test/TestFiles/CodeGenerator/Source/StringLiterals.cshtml new file mode 100644 index 0000000000..19d498abfe --- /dev/null +++ b/test/Microsoft.AspNet.Razor.Test/TestFiles/CodeGenerator/Source/StringLiterals.cshtml @@ -0,0 +1,237 @@ +

      This is line 1

      +

      This is line 2

      +

      This is line 3

      +

      This is line 4

      +

      This is line 5

      +

      This is line 6

      +

      This is line 7

      +

      This is line 8

      +

      This is line 9

      +

      This is line 10

      +

      This is line 11

      +

      This is line 12

      +

      This is line 13

      +

      This is line 14

      +

      This is line 15

      +

      This is line 16

      +

      This is line 17

      +

      This is line 18

      +

      This is line 19

      +

      This is line 20

      +

      This is line 21

      +

      This is line 22

      +

      This is line 23

      +

      This is line 24

      +

      This is line 25

      +

      This is line 26

      +

      This is line 27

      +

      This is line 28

      +

      This is line 29

      +

      This is line 30

      +

      This is line 31

      +

      This is line 32

      +

      This is line 33

      +

      This is line 34

      +

      This is line 35

      +

      This is line 36

      +

      This is line 37

      +

      This is line 38

      +

      This is line 39

      +

      This is line 40

      +

      This is line 41

      +

      This is line 42

      +

      This is line 43

      +

      This is line 44

      +

      This is line 45

      +

      This is line 46

      +

      This is line 47

      +

      This is line 48

      +

      This is line 49

      +

      This is line 50

      +

      This is line 51

      +

      This is line 52

      +

      This is line 53

      +

      This is line 54

      +

      This is line 55

      +

      This is line 56

      +

      This is line 57

      +

      This is line 58

      +

      This is line 59

      +

      This is line 60

      +

      This is line 61

      +

      This is line 62

      +

      This is line 63

      +

      This is line 64

      +

      This is line 65

      +

      This is line 66

      +

      This is line 67

      +

      This is line 68

      +

      This is line 69

      +

      This is line 70

      +

      This is line 71

      +

      This is line 72

      +

      This is line 73

      +

      This is line 74

      +

      This is line 75

      +

      This is line 76

      +

      This is line 77

      +

      This is line 78

      +

      This is line 79

      +

      This is line 80

      +

      This is line 81

      +

      This is line 82

      +

      This is line 83

      +

      This is line 84


      + +@section WriteLiteralsToInHere { +

      This is line 1 nested

      +

      This is line 2 nested

      +

      This is line 3 nested

      +

      This is line 4 nested

      +

      This is line 5 nested

      +

      This is line 6 nested

      +

      This is line 7 nested

      +

      This is line 8 nested

      +

      This is line 9 nested

      +

      This is line 10 nested

      +

      This is line 11 nested

      +

      This is line 12 nested

      +

      This is line 13 nested

      +

      This is line 14 nested

      +

      This is line 15 nested

      +

      This is line 16 nested

      +

      This is line 17 nested

      +

      This is line 18 nested

      +

      This is line 19 nested

      +

      This is line 20 nested

      +

      This is line 21 nested

      +

      This is line 22 nested

      +

      This is line 23 nested

      +

      This is line 24 nested

      +

      This is line 25 nested

      +

      This is line 26 nested

      +

      This is line 27 nested

      +

      This is line 28 nested

      +

      This is line 29 nested

      +

      This is line 30 nested

      +

      This is line 31 nested

      +

      This is line 32 nested

      +

      This is line 33 nested

      +

      This is line 34 nested

      +

      This is line 35 nested

      +

      This is line 36 nested

      +

      This is line 37 nested

      +

      This is line 38 nested

      +

      This is line 39 nested

      +

      This is line 40 nested

      +

      This is line 41 nested

      +

      This is line 42 nested

      +

      This is line 43 nested

      +

      This is line 44 nested

      +

      This is line 45 nested

      +

      This is line 46 nested

      +

      This is line 47 nested

      +

      This is line 48 nested

      +

      This is line 49 nested

      +

      This is line 50 nested

      +

      This is line 51 nested

      +

      This is line 52 nested

      +

      This is line 53 nested

      +

      This is line 54 nested

      +

      This is line 55 nested

      +

      This is line 56 nested

      +

      This is line 57 nested

      +

      This is line 58 nested

      +

      This is line 59 nested

      +

      This is line 60 nested

      +

      This is line 61 nested

      +

      This is line 62 nested

      +

      This is line 63 nested

      +

      This is line 64 nested

      +

      This is line 65 nested

      +

      This is line 66 nested

      +

      This is line 67 nested

      +

      This is line 68 nested

      +

      This is line 69 nested

      +

      This is line 70 nested

      +

      This is line 71 nested

      +

      This is line 72 nested

      +

      This is line 73 nested

      +

      This is line 74 nested

      +

      This is line 75 nested

      +} +

      This is line 1

      +

      This is line 2

      +

      This is line 3

      +

      This is line 4

      +

      This is line 5

      +

      This is line 6

      +

      This is line 7

      +

      This is line 8

      +

      This is line 9

      +

      This is line 10

      +

      This is line 11

      +

      This is line 12

      +

      This is line 13

      +

      This is line 14

      +

      This is line 15

      +

      This is line 16

      +

      This is line 17

      +

      This is line 18

      +

      This is line 19

      +

      This is line 20

      +

      This is line 21

      +

      This is line 22

      +

      This is line 23

      +

      This is line 24

      +

      This is line 25

      +

      This is line 26

      +

      This is line 27

      +

      This is line 28

      +

      This is line 29

      +

      This is line 30

      +

      This is line 31

      +

      This is line 32

      +

      This is line 33

      +

      This is line 34

      +

      This is line 35

      +

      This is line 36

      +

      This is line 37

      +

      This is line 38

      +

      This is line 39

      +

      This is line 40

      +

      This is line 41

      +

      This is line 42

      +

      This is line 43

      hi! +@section WriteLiteralsToInHereAlso { +

      This is line 1 nested

      +

      This is line 2 nested

      +

      This is line 3 nested

      +

      This is line 4 nested

      +

      This is line 5 nested

      +

      This is line 6 nested

      +

      This is line 7 nested

      +

      This is line 8 nested

      +

      This is line 9 nested

      +

      This is line 10 nested

      +

      This is line 11 nested

      +

      This is line 12 nested

      +

      This is line 13 nested

      +

      This is line 14 nested

      +

      This is line 15 nested

      +

      This is line 16 nested

      +

      This is line 17 nested

      +

      This is line 18 nested

      +

      This is line 19 nested

      +

      This is line 20 nested

      +

      This is line 21 nested

      +

      This is line 22 nested

      +

      This is line 23 nested

      +

      This is line 24 nested

      +

      This is line 25 nested

      +

      This is line 26 nested

      +

      This is line 27 nested

      +

      This is line 28 nested

      +

      This is line 29 nested

      +

      30

      +}! \ No newline at end of file