Warning, /frameworks/syntax-highlighting/autotests/reference/test.swift.ref is written in an unsupported language. File is not indexed.

0001 <Comment>//</Comment><br/>
0002 <Comment>//  Arguments.swift</Comment><br/>
0003 <Comment>//  SwiftFormat</Comment><br/>
0004 <Comment>//</Comment><br/>
0005 <Comment>//  Created by Nick Lockwood on 07/08/2018.</Comment><br/>
0006 <Comment>//  Copyright © 2018 Nick Lockwood.</Comment><br/>
0007 <Comment>//</Comment><br/>
0008 <Comment>//  Distributed under the permissive MIT license</Comment><br/>
0009 <Comment>//  Get the latest version from here:</Comment><br/>
0010 <Comment>//</Comment><br/>
0011 <Comment>//  https://github.com/nicklockwood/SwiftFormat</Comment><br/>
0012 <Comment>//</Comment><br/>
0013 <Comment>//  Permission is hereby granted, free of charge, to any person obtaining a copy</Comment><br/>
0014 <Comment>//  of this software and associated documentation files (the "Software"), to deal</Comment><br/>
0015 <Comment>//  in the Software without restriction, including without limitation the rights</Comment><br/>
0016 <Comment>//  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell</Comment><br/>
0017 <Comment>//  copies of the Software, and to permit persons to whom the Software is</Comment><br/>
0018 <Comment>//  furnished to do so, subject to the following conditions:</Comment><br/>
0019 <Comment>//</Comment><br/>
0020 <Comment>//  The above copyright notice and this permission notice shall be included in all</Comment><br/>
0021 <Comment>//  copies or substantial portions of the Software.</Comment><br/>
0022 <Comment>//</Comment><br/>
0023 <Comment>//  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR</Comment><br/>
0024 <Comment>//  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,</Comment><br/>
0025 <Comment>//  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE</Comment><br/>
0026 <Comment>//  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER</Comment><br/>
0027 <Comment>//  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,</Comment><br/>
0028 <Comment>//  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE</Comment><br/>
0029 <Comment>//  SOFTWARE.</Comment><br/>
0030 <Comment>//</Comment><br/>
0031 <Normal Text></Normal Text><br/>
0032 <Keyword>import</Keyword><Normal Text> </Normal Text><Imports>Foundation</Imports><br/>
0033 <Normal Text></Normal Text><br/>
0034 <Keyword>extension</Keyword><Normal Text> Options </Normal Text><Symbol>{</Symbol><br/>
0035 <Normal Text>    </Normal Text><Keyword>static</Keyword><Normal Text> </Normal Text><Keyword>let</Keyword><Normal Text> </Normal Text><Variable>maxArgumentNameLength</Variable><Normal Text> </Normal Text><Symbol>=</Symbol><Normal Text> </Normal Text><Decimal>16</Decimal><br/>
0036 <Normal Text></Normal Text><br/>
0037 <Normal Text>    </Normal Text><Keyword>init</Keyword><Symbol>(</Symbol><Normal Text>_ args</Normal Text><Symbol>:</Symbol><Normal Text> </Normal Text><Symbol>[</Symbol><Normal Text>String</Normal Text><Symbol>:</Symbol><Normal Text> String</Normal Text><Symbol>],</Symbol><Normal Text> </Normal Text><ControlFlowKeyword>in</ControlFlowKeyword><Normal Text> directory</Normal Text><Symbol>:</Symbol><Normal Text> String</Normal Text><Symbol>)</Symbol><Normal Text> </Normal Text><Keyword>throws</Keyword><Normal Text> </Normal Text><Symbol>{</Symbol><br/>
0038 <Normal Text>        fileOptions </Normal Text><Symbol>=</Symbol><Normal Text> </Normal Text><ControlFlowKeyword>try</ControlFlowKeyword><Normal Text> fileOptionsFor</Normal Text><Symbol>(</Symbol><Normal Text>args</Normal Text><Symbol>,</Symbol><Normal Text> </Normal Text><ControlFlowKeyword>in</ControlFlowKeyword><Symbol>:</Symbol><Normal Text> directory</Normal Text><Symbol>)</Symbol><br/>
0039 <Normal Text>        formatOptions </Normal Text><Symbol>=</Symbol><Normal Text> </Normal Text><ControlFlowKeyword>try</ControlFlowKeyword><Normal Text> formatOptionsFor</Normal Text><Symbol>(</Symbol><Normal Text>args</Normal Text><Symbol>)</Symbol><br/>
0040 <Normal Text>        </Normal Text><Keyword>let</Keyword><Normal Text> </Normal Text><Variable>lint</Variable><Normal Text> </Normal Text><Symbol>=</Symbol><Normal Text> args</Normal Text><Symbol>.</Symbol><Normal Text>keys</Normal Text><Symbol>.</Symbol><Normal Text>contains</Normal Text><Symbol>(</Symbol><String>"lint"</String><Symbol>)</Symbol><br/>
0041 <Normal Text>        </Normal Text><Keyword>self</Keyword><Symbol>.</Symbol><Normal Text>lint </Normal Text><Symbol>=</Symbol><Normal Text> lint</Normal Text><br/>
0042 <Normal Text>        rules </Normal Text><Symbol>=</Symbol><Normal Text> </Normal Text><ControlFlowKeyword>try</ControlFlowKeyword><Normal Text> rulesFor</Normal Text><Symbol>(</Symbol><Normal Text>args</Normal Text><Symbol>,</Symbol><Normal Text> lint</Normal Text><Symbol>:</Symbol><Normal Text> lint</Normal Text><Symbol>)</Symbol><br/>
0043 <Normal Text>    </Normal Text><Symbol>}</Symbol><br/>
0044 <Normal Text></Normal Text><br/>
0045 <Normal Text>    </Normal Text><Keyword>mutating</Keyword><Normal Text> </Normal Text><Keyword>func</Keyword><Normal Text> </Normal Text><Function>addArguments</Function><Symbol>(</Symbol><Variable>_</Variable><Normal Text> </Normal Text><Variable>args</Variable><Symbol>:</Symbol><Normal Text> [</Normal Text><Data Type>String</Data Type><Symbol>:</Symbol><Normal Text> </Normal Text><Data Type>String</Data Type><Normal Text>]</Normal Text><Symbol>,</Symbol><Normal Text> </Normal Text><Variable>in</Variable><Normal Text> </Normal Text><Variable>directory</Variable><Symbol>:</Symbol><Normal Text> </Normal Text><Data Type>String</Data Type><Symbol>)</Symbol><Normal Text> </Normal Text><Keyword>throws</Keyword><Normal Text> </Normal Text><Symbol>{</Symbol><br/>
0046 <Normal Text>        </Normal Text><Keyword>let</Keyword><Normal Text> </Normal Text><Variable>oldArguments</Variable><Normal Text> </Normal Text><Symbol>=</Symbol><Normal Text> argumentsFor</Normal Text><Symbol>(</Symbol><Keyword>self</Keyword><Symbol>)</Symbol><br/>
0047 <Normal Text>        </Normal Text><Keyword>let</Keyword><Normal Text> </Normal Text><Variable>newArguments</Variable><Normal Text> </Normal Text><Symbol>=</Symbol><Normal Text> </Normal Text><ControlFlowKeyword>try</ControlFlowKeyword><Normal Text> mergeArguments</Normal Text><Symbol>(</Symbol><Normal Text>args</Normal Text><Symbol>,</Symbol><Normal Text> into</Normal Text><Symbol>:</Symbol><Normal Text> oldArguments</Normal Text><Symbol>)</Symbol><br/>
0048 <Normal Text>        </Normal Text><Keyword>var</Keyword><Normal Text> </Normal Text><Variable>newOptions</Variable><Normal Text> </Normal Text><Symbol>=</Symbol><Normal Text> </Normal Text><ControlFlowKeyword>try</ControlFlowKeyword><Normal Text> Options</Normal Text><Symbol>(</Symbol><Normal Text>newArguments</Normal Text><Symbol>,</Symbol><Normal Text> </Normal Text><ControlFlowKeyword>in</ControlFlowKeyword><Symbol>:</Symbol><Normal Text> directory</Normal Text><Symbol>)</Symbol><br/>
0049 <Normal Text>        </Normal Text><ControlFlowKeyword>if</ControlFlowKeyword><Normal Text> </Normal Text><Keyword>let</Keyword><Normal Text> </Normal Text><Variable>fileInfo</Variable><Normal Text> </Normal Text><Symbol>=</Symbol><Normal Text> formatOptions</Normal Text><Symbol>?.</Symbol><Normal Text>fileInfo </Normal Text><Symbol>{</Symbol><br/>
0050 <Normal Text>            newOptions</Normal Text><Symbol>.</Symbol><Normal Text>formatOptions</Normal Text><Symbol>?.</Symbol><Normal Text>fileInfo </Normal Text><Symbol>=</Symbol><Normal Text> fileInfo</Normal Text><br/>
0051 <Normal Text>        </Normal Text><Symbol>}</Symbol><br/>
0052 <Normal Text>        </Normal Text><Keyword>self</Keyword><Normal Text> </Normal Text><Symbol>=</Symbol><Normal Text> newOptions</Normal Text><br/>
0053 <Normal Text>    </Normal Text><Symbol>}</Symbol><br/>
0054 <Symbol>}</Symbol><br/>
0055 <Normal Text></Normal Text><br/>
0056 <Comment>// Parse a space-delimited string into an array of command-line arguments</Comment><br/>
0057 <Comment>// Replicates the behavior implemented by the console when parsing input</Comment><br/>
0058 <Keyword>func</Keyword><Normal Text> </Normal Text><Function>parseArguments</Function><Symbol>(</Symbol><Variable>_</Variable><Normal Text> </Normal Text><Variable>argumentString</Variable><Symbol>:</Symbol><Normal Text> </Normal Text><Data Type>String</Data Type><Symbol>,</Symbol><Normal Text> </Normal Text><Variable>ignoreComments</Variable><Symbol>:</Symbol><Normal Text> </Normal Text><Data Type>Bool</Data Type><Normal Text> </Normal Text><Symbol>=</Symbol><Normal Text> true</Normal Text><Symbol>)</Symbol><Normal Text> -> [</Normal Text><Function>String</Function><Normal Text>] </Normal Text><Symbol>{</Symbol><br/>
0059 <Normal Text>    </Normal Text><Keyword>var</Keyword><Normal Text> </Normal Text><Variable>arguments</Variable><Normal Text> </Normal Text><Symbol>=</Symbol><Normal Text> </Normal Text><Symbol>[</Symbol><String>""</String><Symbol>]</Symbol><Normal Text> </Normal Text><Comment>// Arguments always begin with script path</Comment><br/>
0060 <Normal Text>    </Normal Text><Keyword>var</Keyword><Normal Text> </Normal Text><Variable>characters</Variable><Normal Text> </Normal Text><Symbol>=</Symbol><Normal Text> String</Normal Text><Symbol>.</Symbol><Normal Text>UnicodeScalarView</Normal Text><Symbol>.</Symbol><Normal Text>SubSequence</Normal Text><Symbol>(</Symbol><Normal Text>argumentString</Normal Text><Symbol>.</Symbol><Normal Text>unicodeScalars</Normal Text><Symbol>)</Symbol><br/>
0061 <Normal Text>    </Normal Text><Keyword>var</Keyword><Normal Text> </Normal Text><Variable>string</Variable><Normal Text> </Normal Text><Symbol>=</Symbol><Normal Text> </Normal Text><String>""</String><br/>
0062 <Normal Text>    </Normal Text><Keyword>var</Keyword><Normal Text> </Normal Text><Variable>escaped</Variable><Normal Text> </Normal Text><Symbol>=</Symbol><Normal Text> </Normal Text><Keyword>false</Keyword><br/>
0063 <Normal Text>    </Normal Text><Keyword>var</Keyword><Normal Text> </Normal Text><Variable>quoted</Variable><Normal Text> </Normal Text><Symbol>=</Symbol><Normal Text> </Normal Text><Keyword>false</Keyword><br/>
0064 <Normal Text>    loop</Normal Text><Symbol>:</Symbol><Normal Text> </Normal Text><ControlFlowKeyword>while</ControlFlowKeyword><Normal Text> </Normal Text><Keyword>let</Keyword><Normal Text> </Normal Text><Variable>char</Variable><Normal Text> </Normal Text><Symbol>=</Symbol><Normal Text> characters</Normal Text><Symbol>.</Symbol><Normal Text>popFirst</Normal Text><Symbol>()</Symbol><Normal Text> </Normal Text><Symbol>{</Symbol><br/>
0065 <Normal Text>        </Normal Text><ControlFlowKeyword>switch</ControlFlowKeyword><Normal Text> char </Normal Text><Symbol>{</Symbol><br/>
0066 <Normal Text>        </Normal Text><ControlFlowKeyword>case</ControlFlowKeyword><Normal Text> </Normal Text><String>"#"</String><Normal Text> </Normal Text><Keyword>where</Keyword><Normal Text> </Normal Text><Symbol>!</Symbol><Normal Text>ignoreComments </Normal Text><Symbol>&&</Symbol><Normal Text> </Normal Text><Symbol>!</Symbol><Normal Text>escaped </Normal Text><Symbol>&&</Symbol><Normal Text> </Normal Text><Symbol>!</Symbol><Normal Text>quoted</Normal Text><Symbol>:</Symbol><br/>
0067 <Normal Text>            </Normal Text><ControlFlowKeyword>break</ControlFlowKeyword><Normal Text> loop </Normal Text><Comment>// comment</Comment><br/>
0068 <Normal Text>        </Normal Text><ControlFlowKeyword>case</ControlFlowKeyword><Normal Text> </Normal Text><String>"</String><String Char>\\</String Char><String>"</String><Normal Text> </Normal Text><Keyword>where</Keyword><Normal Text> </Normal Text><Symbol>!</Symbol><Normal Text>escaped</Normal Text><Symbol>:</Symbol><br/>
0069 <Normal Text>            escaped </Normal Text><Symbol>=</Symbol><Normal Text> </Normal Text><Keyword>true</Keyword><br/>
0070 <Normal Text>        </Normal Text><ControlFlowKeyword>case</ControlFlowKeyword><Normal Text> </Normal Text><String>"</String><String Char>\"</String Char><String>"</String><Normal Text> </Normal Text><Keyword>where</Keyword><Normal Text> </Normal Text><Symbol>!</Symbol><Normal Text>escaped </Normal Text><Symbol>&&</Symbol><Normal Text> </Normal Text><Symbol>!</Symbol><Normal Text>quoted</Normal Text><Symbol>:</Symbol><br/>
0071 <Normal Text>            quoted </Normal Text><Symbol>=</Symbol><Normal Text> </Normal Text><Keyword>true</Keyword><br/>
0072 <Normal Text>        </Normal Text><ControlFlowKeyword>case</ControlFlowKeyword><Normal Text> </Normal Text><String>"</String><String Char>\"</String Char><String>"</String><Normal Text> </Normal Text><Keyword>where</Keyword><Normal Text> </Normal Text><Symbol>!</Symbol><Normal Text>escaped </Normal Text><Symbol>&&</Symbol><Normal Text> quoted</Normal Text><Symbol>:</Symbol><br/>
0073 <Normal Text>            quoted </Normal Text><Symbol>=</Symbol><Normal Text> </Normal Text><Keyword>false</Keyword><br/>
0074 <Normal Text>            </Normal Text><ControlFlowKeyword>fallthrough</ControlFlowKeyword><br/>
0075 <Normal Text>        </Normal Text><ControlFlowKeyword>case</ControlFlowKeyword><Normal Text> </Normal Text><String>" "</String><Normal Text> </Normal Text><Keyword>where</Keyword><Normal Text> </Normal Text><Symbol>!</Symbol><Normal Text>escaped </Normal Text><Symbol>&&</Symbol><Normal Text> </Normal Text><Symbol>!</Symbol><Normal Text>quoted</Normal Text><Symbol>:</Symbol><br/>
0076 <Normal Text>            </Normal Text><ControlFlowKeyword>if</ControlFlowKeyword><Normal Text> </Normal Text><Symbol>!</Symbol><Normal Text>string</Normal Text><Symbol>.</Symbol><Normal Text>isEmpty </Normal Text><Symbol>{</Symbol><br/>
0077 <Normal Text>                arguments</Normal Text><Symbol>.</Symbol><Normal Text>append</Normal Text><Symbol>(</Symbol><Normal Text>string</Normal Text><Symbol>)</Symbol><br/>
0078 <Normal Text>            </Normal Text><Symbol>}</Symbol><br/>
0079 <Normal Text>            string</Normal Text><Symbol>.</Symbol><Normal Text>removeAll</Normal Text><Symbol>()</Symbol><br/>
0080 <Normal Text>        </Normal Text><ControlFlowKeyword>case</ControlFlowKeyword><Normal Text> </Normal Text><String>"</String><String Char>\"</String Char><String>"</String><Normal Text> </Normal Text><Keyword>where</Keyword><Normal Text> escaped</Normal Text><Symbol>:</Symbol><br/>
0081 <Normal Text>            escaped </Normal Text><Symbol>=</Symbol><Normal Text> </Normal Text><Keyword>false</Keyword><br/>
0082 <Normal Text>            string</Normal Text><Symbol>.</Symbol><Normal Text>append</Normal Text><Symbol>(</Symbol><String>"</String><String Char>\"</String Char><String>"</String><Symbol>)</Symbol><br/>
0083 <Normal Text>        </Normal Text><ControlFlowKeyword>case</ControlFlowKeyword><Normal Text> _ </Normal Text><Keyword>where</Keyword><Normal Text> escaped </Normal Text><Symbol>&&</Symbol><Normal Text> quoted</Normal Text><Symbol>:</Symbol><br/>
0084 <Normal Text>            string</Normal Text><Symbol>.</Symbol><Normal Text>append</Normal Text><Symbol>(</Symbol><String>"</String><String Char>\\</String Char><String>"</String><Symbol>)</Symbol><br/>
0085 <Normal Text>            </Normal Text><ControlFlowKeyword>fallthrough</ControlFlowKeyword><br/>
0086 <Normal Text>        </Normal Text><Keyword>default</Keyword><Symbol>:</Symbol><br/>
0087 <Normal Text>            escaped </Normal Text><Symbol>=</Symbol><Normal Text> </Normal Text><Keyword>false</Keyword><br/>
0088 <Normal Text>            string</Normal Text><Symbol>.</Symbol><Normal Text>append</Normal Text><Symbol>(</Symbol><Normal Text>Character</Normal Text><Symbol>(</Symbol><Normal Text>char</Normal Text><Symbol>))</Symbol><br/>
0089 <Normal Text>        </Normal Text><Symbol>}</Symbol><br/>
0090 <Normal Text>    </Normal Text><Symbol>}</Symbol><br/>
0091 <Normal Text>    </Normal Text><ControlFlowKeyword>if</ControlFlowKeyword><Normal Text> </Normal Text><Symbol>!</Symbol><Normal Text>string</Normal Text><Symbol>.</Symbol><Normal Text>isEmpty </Normal Text><Symbol>{</Symbol><br/>
0092 <Normal Text>        arguments</Normal Text><Symbol>.</Symbol><Normal Text>append</Normal Text><Symbol>(</Symbol><Normal Text>string</Normal Text><Symbol>)</Symbol><br/>
0093 <Normal Text>    </Normal Text><Symbol>}</Symbol><br/>
0094 <Normal Text>    </Normal Text><Keyword>return</Keyword><Normal Text> arguments</Normal Text><br/>
0095 <Symbol>}</Symbol><br/>
0096 <Normal Text></Normal Text><br/>
0097 <Comment>// Parse a flat array of command-line arguments into a dictionary of flags and values</Comment><br/>
0098 <Keyword>func</Keyword><Normal Text> </Normal Text><Function>preprocessArguments</Function><Symbol>(</Symbol><Variable>_</Variable><Normal Text> </Normal Text><Variable>args</Variable><Symbol>:</Symbol><Normal Text> [</Normal Text><Data Type>String</Data Type><Normal Text>]</Normal Text><Symbol>,</Symbol><Normal Text> </Normal Text><Variable>_</Variable><Normal Text> </Normal Text><Variable>names</Variable><Symbol>:</Symbol><Normal Text> [</Normal Text><Data Type>String</Data Type><Normal Text>]</Normal Text><Symbol>)</Symbol><Normal Text> </Normal Text><Keyword>throws</Keyword><Normal Text> -> [</Normal Text><Function>String</Function><Symbol>:</Symbol><Normal Text> </Normal Text><Data Type>String</Data Type><Normal Text>] </Normal Text><Symbol>{</Symbol><br/>
0099 <Normal Text>    </Normal Text><Keyword>var</Keyword><Normal Text> </Normal Text><Variable>anonymousArgs</Variable><Normal Text> </Normal Text><Symbol>=</Symbol><Normal Text> </Normal Text><Decimal>0</Decimal><br/>
0100 <Normal Text>    </Normal Text><Keyword>var</Keyword><Normal Text> </Normal Text><Variable>namedArgs</Variable><Symbol>:</Symbol><Normal Text> </Normal Text><Symbol>[</Symbol><Normal Text>String</Normal Text><Symbol>:</Symbol><Normal Text> String</Normal Text><Symbol>]</Symbol><Normal Text> </Normal Text><Symbol>=</Symbol><Normal Text> </Normal Text><Symbol>[:]</Symbol><br/>
0101 <Normal Text>    </Normal Text><Keyword>var</Keyword><Normal Text> </Normal Text><Variable>name</Variable><Normal Text> </Normal Text><Symbol>=</Symbol><Normal Text> </Normal Text><String>""</String><br/>
0102 <Normal Text>    </Normal Text><ControlFlowKeyword>for</ControlFlowKeyword><Normal Text> arg </Normal Text><ControlFlowKeyword>in</ControlFlowKeyword><Normal Text> args </Normal Text><Symbol>{</Symbol><br/>
0103 <Normal Text>        </Normal Text><ControlFlowKeyword>if</ControlFlowKeyword><Normal Text> arg</Normal Text><Symbol>.</Symbol><Normal Text>hasPrefix</Normal Text><Symbol>(</Symbol><String>"--"</String><Symbol>)</Symbol><Normal Text> </Normal Text><Symbol>{</Symbol><br/>
0104 <Normal Text>            </Normal Text><Comment>// Long argument names</Comment><br/>
0105 <Normal Text>            </Normal Text><Keyword>let</Keyword><Normal Text> </Normal Text><Variable>key</Variable><Normal Text> </Normal Text><Symbol>=</Symbol><Normal Text> String</Normal Text><Symbol>(</Symbol><Normal Text>arg</Normal Text><Symbol>.</Symbol><Normal Text>unicodeScalars</Normal Text><Symbol>.</Symbol><Normal Text>dropFirst</Normal Text><Symbol>(</Symbol><Decimal>2</Decimal><Symbol>))</Symbol><br/>
0106 <Normal Text>            </Normal Text><ControlFlowKeyword>guard</ControlFlowKeyword><Normal Text> names</Normal Text><Symbol>.</Symbol><Normal Text>contains</Normal Text><Symbol>(</Symbol><Normal Text>key</Normal Text><Symbol>)</Symbol><Normal Text> </Normal Text><ControlFlowKeyword>else</ControlFlowKeyword><Normal Text> </Normal Text><Symbol>{</Symbol><br/>
0107 <Normal Text>                </Normal Text><ControlFlowKeyword>guard</ControlFlowKeyword><Normal Text> </Normal Text><Keyword>let</Keyword><Normal Text> </Normal Text><Variable>match</Variable><Normal Text> </Normal Text><Symbol>=</Symbol><Normal Text> bestMatches</Normal Text><Symbol>(</Symbol><ControlFlowKeyword>for</ControlFlowKeyword><Symbol>:</Symbol><Normal Text> key</Normal Text><Symbol>,</Symbol><Normal Text> </Normal Text><ControlFlowKeyword>in</ControlFlowKeyword><Symbol>:</Symbol><Normal Text> names</Normal Text><Symbol>).</Symbol><Normal Text>first </Normal Text><ControlFlowKeyword>else</ControlFlowKeyword><Normal Text> </Normal Text><Symbol>{</Symbol><br/>
0108 <Normal Text>                    </Normal Text><Keyword>throw</Keyword><Normal Text> FormatError</Normal Text><Symbol>.</Symbol><Normal Text>options</Normal Text><Symbol>(</Symbol><String>"Unknown option --</String><Error>\(</Error><String>key)"</String><Symbol>)</Symbol><br/>
0109 <Normal Text>                </Normal Text><Symbol>}</Symbol><br/>
0110 <Normal Text>                </Normal Text><Keyword>throw</Keyword><Normal Text> FormatError</Normal Text><Symbol>.</Symbol><Normal Text>options</Normal Text><Symbol>(</Symbol><String>"Unknown option --</String><Error>\(</Error><String>key). Did you mean --</String><Error>\(</Error><String>match)?"</String><Symbol>)</Symbol><br/>
0111 <Normal Text>            </Normal Text><Symbol>}</Symbol><br/>
0112 <Normal Text>            name </Normal Text><Symbol>=</Symbol><Normal Text> key</Normal Text><br/>
0113 <Normal Text>            namedArgs</Normal Text><Symbol>[</Symbol><Normal Text>name</Normal Text><Symbol>]</Symbol><Normal Text> </Normal Text><Symbol>=</Symbol><Normal Text> namedArgs</Normal Text><Symbol>[</Symbol><Normal Text>name</Normal Text><Symbol>]</Symbol><Normal Text> </Normal Text><Symbol>??</Symbol><Normal Text> </Normal Text><String>""</String><br/>
0114 <Normal Text>            </Normal Text><ControlFlowKeyword>continue</ControlFlowKeyword><br/>
0115 <Normal Text>        </Normal Text><Symbol>}</Symbol><Normal Text> </Normal Text><ControlFlowKeyword>else</ControlFlowKeyword><Normal Text> </Normal Text><ControlFlowKeyword>if</ControlFlowKeyword><Normal Text> arg</Normal Text><Symbol>.</Symbol><Normal Text>hasPrefix</Normal Text><Symbol>(</Symbol><String>"-"</String><Symbol>)</Symbol><Normal Text> </Normal Text><Symbol>{</Symbol><br/>
0116 <Normal Text>            </Normal Text><Comment>// Short argument names</Comment><br/>
0117 <Normal Text>            </Normal Text><Keyword>let</Keyword><Normal Text> </Normal Text><Variable>flag</Variable><Normal Text> </Normal Text><Symbol>=</Symbol><Normal Text> String</Normal Text><Symbol>(</Symbol><Normal Text>arg</Normal Text><Symbol>.</Symbol><Normal Text>unicodeScalars</Normal Text><Symbol>.</Symbol><Normal Text>dropFirst</Normal Text><Symbol>())</Symbol><br/>
0118 <Normal Text>            </Normal Text><ControlFlowKeyword>guard</ControlFlowKeyword><Normal Text> </Normal Text><Keyword>let</Keyword><Normal Text> </Normal Text><Variable>match</Variable><Normal Text> </Normal Text><Symbol>=</Symbol><Normal Text> names</Normal Text><Symbol>.</Symbol><Normal Text>first</Normal Text><Symbol>(</Symbol><Keyword>where</Keyword><Symbol>:</Symbol><Normal Text> </Normal Text><Symbol>{</Symbol><Normal Text> $</Normal Text><Float>0.</Float><Normal Text>hasPrefix</Normal Text><Symbol>(</Symbol><Normal Text>flag</Normal Text><Symbol>)</Symbol><Normal Text> </Normal Text><Symbol>})</Symbol><Normal Text> </Normal Text><ControlFlowKeyword>else</ControlFlowKeyword><Normal Text> </Normal Text><Symbol>{</Symbol><br/>
0119 <Normal Text>                </Normal Text><Keyword>throw</Keyword><Normal Text> FormatError</Normal Text><Symbol>.</Symbol><Normal Text>options</Normal Text><Symbol>(</Symbol><String>"Unknown flag -</String><Error>\(</Error><String>flag)"</String><Symbol>)</Symbol><br/>
0120 <Normal Text>            </Normal Text><Symbol>}</Symbol><br/>
0121 <Normal Text>            name </Normal Text><Symbol>=</Symbol><Normal Text> match</Normal Text><br/>
0122 <Normal Text>            namedArgs</Normal Text><Symbol>[</Symbol><Normal Text>name</Normal Text><Symbol>]</Symbol><Normal Text> </Normal Text><Symbol>=</Symbol><Normal Text> namedArgs</Normal Text><Symbol>[</Symbol><Normal Text>name</Normal Text><Symbol>]</Symbol><Normal Text> </Normal Text><Symbol>??</Symbol><Normal Text> </Normal Text><String>""</String><br/>
0123 <Normal Text>            </Normal Text><ControlFlowKeyword>continue</ControlFlowKeyword><br/>
0124 <Normal Text>        </Normal Text><Symbol>}</Symbol><br/>
0125 <Normal Text>        </Normal Text><ControlFlowKeyword>if</ControlFlowKeyword><Normal Text> name </Normal Text><Symbol>==</Symbol><Normal Text> </Normal Text><String>""</String><Normal Text> </Normal Text><Symbol>{</Symbol><br/>
0126 <Normal Text>            </Normal Text><Comment>// Argument is anonymous</Comment><br/>
0127 <Normal Text>            name </Normal Text><Symbol>=</Symbol><Normal Text> String</Normal Text><Symbol>(</Symbol><Normal Text>anonymousArgs</Normal Text><Symbol>)</Symbol><br/>
0128 <Normal Text>            anonymousArgs </Normal Text><Symbol>+=</Symbol><Normal Text> </Normal Text><Decimal>1</Decimal><br/>
0129 <Normal Text>        </Normal Text><Symbol>}</Symbol><br/>
0130 <Normal Text>        </Normal Text><Keyword>var</Keyword><Normal Text> </Normal Text><Variable>arg</Variable><Normal Text> </Normal Text><Symbol>=</Symbol><Normal Text> arg</Normal Text><br/>
0131 <Normal Text>        </Normal Text><Keyword>let</Keyword><Normal Text> </Normal Text><Variable>hasTrailingComma</Variable><Normal Text> </Normal Text><Symbol>=</Symbol><Normal Text> arg</Normal Text><Symbol>.</Symbol><Normal Text>hasSuffix</Normal Text><Symbol>(</Symbol><String>","</String><Symbol>)</Symbol><Normal Text> </Normal Text><Symbol>&&</Symbol><Normal Text> arg </Normal Text><Symbol>!=</Symbol><Normal Text> </Normal Text><String>","</String><br/>
0132 <Normal Text>        </Normal Text><ControlFlowKeyword>if</ControlFlowKeyword><Normal Text> hasTrailingComma </Normal Text><Symbol>{</Symbol><br/>
0133 <Normal Text>            arg </Normal Text><Symbol>=</Symbol><Normal Text> String</Normal Text><Symbol>(</Symbol><Normal Text>arg</Normal Text><Symbol>.</Symbol><Normal Text>dropLast</Normal Text><Symbol>())</Symbol><br/>
0134 <Normal Text>        </Normal Text><Symbol>}</Symbol><br/>
0135 <Normal Text>        </Normal Text><ControlFlowKeyword>if</ControlFlowKeyword><Normal Text> </Normal Text><Keyword>let</Keyword><Normal Text> </Normal Text><Variable>existing</Variable><Normal Text> </Normal Text><Symbol>=</Symbol><Normal Text> namedArgs</Normal Text><Symbol>[</Symbol><Normal Text>name</Normal Text><Symbol>],</Symbol><Normal Text> </Normal Text><Symbol>!</Symbol><Normal Text>existing</Normal Text><Symbol>.</Symbol><Normal Text>isEmpty</Normal Text><Symbol>,</Symbol><br/>
0136 <Normal Text>           </Normal Text><Comment>// </Comment><Alert Level 2>TODO</Alert Level 2><Comment>: find a more general way to represent merge-able options</Comment><br/>
0137 <Normal Text>           </Normal Text><Symbol>[</Symbol><String>"exclude"</String><Symbol>,</Symbol><Normal Text> </Normal Text><String>"unexclude"</String><Symbol>,</Symbol><Normal Text> </Normal Text><String>"disable"</String><Symbol>,</Symbol><Normal Text> </Normal Text><String>"enable"</String><Symbol>,</Symbol><Normal Text> </Normal Text><String>"lintonly"</String><Symbol>,</Symbol><Normal Text> </Normal Text><String>"rules"</String><Symbol>].</Symbol><Normal Text>contains</Normal Text><Symbol>(</Symbol><Normal Text>name</Normal Text><Symbol>)</Symbol><Normal Text> </Normal Text><Symbol>||</Symbol><br/>
0138 <Normal Text>           Descriptors</Normal Text><Symbol>.</Symbol><Normal Text>all</Normal Text><Symbol>.</Symbol><Normal Text>contains</Normal Text><Symbol>(</Symbol><Keyword>where</Keyword><Symbol>:</Symbol><Normal Text> </Normal Text><Symbol>{</Symbol><br/>
0139 <Normal Text>               $</Normal Text><Float>0.</Float><Normal Text>argumentName </Normal Text><Symbol>==</Symbol><Normal Text> name </Normal Text><Symbol>&&</Symbol><Normal Text> $</Normal Text><Float>0.</Float><Normal Text>isSetType</Normal Text><br/>
0140 <Normal Text>           </Normal Text><Symbol>})</Symbol><br/>
0141 <Normal Text>        </Normal Text><Symbol>{</Symbol><br/>
0142 <Normal Text>            namedArgs</Normal Text><Symbol>[</Symbol><Normal Text>name</Normal Text><Symbol>]</Symbol><Normal Text> </Normal Text><Symbol>=</Symbol><Normal Text> existing </Normal Text><Symbol>+</Symbol><Normal Text> </Normal Text><String>","</String><Normal Text> </Normal Text><Symbol>+</Symbol><Normal Text> arg</Normal Text><br/>
0143 <Normal Text>        </Normal Text><Symbol>}</Symbol><Normal Text> </Normal Text><ControlFlowKeyword>else</ControlFlowKeyword><Normal Text> </Normal Text><Symbol>{</Symbol><br/>
0144 <Normal Text>            namedArgs</Normal Text><Symbol>[</Symbol><Normal Text>name</Normal Text><Symbol>]</Symbol><Normal Text> </Normal Text><Symbol>=</Symbol><Normal Text> arg</Normal Text><br/>
0145 <Normal Text>        </Normal Text><Symbol>}</Symbol><br/>
0146 <Normal Text>        </Normal Text><ControlFlowKeyword>if</ControlFlowKeyword><Normal Text> </Normal Text><Symbol>!</Symbol><Normal Text>hasTrailingComma </Normal Text><Symbol>{</Symbol><br/>
0147 <Normal Text>            name </Normal Text><Symbol>=</Symbol><Normal Text> </Normal Text><String>""</String><br/>
0148 <Normal Text>        </Normal Text><Symbol>}</Symbol><br/>
0149 <Normal Text>    </Normal Text><Symbol>}</Symbol><br/>
0150 <Normal Text>    </Normal Text><Keyword>return</Keyword><Normal Text> namedArgs</Normal Text><br/>
0151 <Symbol>}</Symbol><br/>
0152 <Normal Text></Normal Text><br/>
0153 <Comment>// Find best match for a given string in a list of options</Comment><br/>
0154 <Keyword>func</Keyword><Normal Text> </Normal Text><Function>bestMatches</Function><Symbol>(</Symbol><Variable>for</Variable><Normal Text> </Normal Text><Variable>query</Variable><Symbol>:</Symbol><Normal Text> </Normal Text><Data Type>String</Data Type><Symbol>,</Symbol><Normal Text> </Normal Text><Variable>in</Variable><Normal Text> </Normal Text><Variable>options</Variable><Symbol>:</Symbol><Normal Text> [</Normal Text><Data Type>String</Data Type><Normal Text>]</Normal Text><Symbol>)</Symbol><Normal Text> -> [</Normal Text><Function>String</Function><Normal Text>] </Normal Text><Symbol>{</Symbol><br/>
0155 <Normal Text>    </Normal Text><Keyword>let</Keyword><Normal Text> </Normal Text><Variable>lowercaseQuery</Variable><Normal Text> </Normal Text><Symbol>=</Symbol><Normal Text> query</Normal Text><Symbol>.</Symbol><Normal Text>lowercased</Normal Text><Symbol>()</Symbol><br/>
0156 <Normal Text>    </Normal Text><Comment>// Sort matches by Levenshtein edit distance</Comment><br/>
0157 <Normal Text>    </Normal Text><Keyword>return</Keyword><Normal Text> options</Normal Text><br/>
0158 <Normal Text>        </Normal Text><Symbol>.</Symbol><Normal Text>compactMap </Normal Text><Symbol>{</Symbol><Normal Text> option </Normal Text><Symbol>-></Symbol><Normal Text> </Normal Text><Symbol>(</Symbol><Normal Text>String</Normal Text><Symbol>,</Symbol><Normal Text> distance</Normal Text><Symbol>:</Symbol><Normal Text> Int</Normal Text><Symbol>,</Symbol><Normal Text> commonPrefix</Normal Text><Symbol>:</Symbol><Normal Text> Int</Normal Text><Symbol>)?</Symbol><Normal Text> </Normal Text><ControlFlowKeyword>in</ControlFlowKeyword><br/>
0159 <Normal Text>            </Normal Text><Keyword>let</Keyword><Normal Text> </Normal Text><Variable>lowercaseOption</Variable><Normal Text> </Normal Text><Symbol>=</Symbol><Normal Text> option</Normal Text><Symbol>.</Symbol><Normal Text>lowercased</Normal Text><Symbol>()</Symbol><br/>
0160 <Normal Text>            </Normal Text><Keyword>let</Keyword><Normal Text> </Normal Text><Variable>distance</Variable><Normal Text> </Normal Text><Symbol>=</Symbol><Normal Text> editDistance</Normal Text><Symbol>(</Symbol><Normal Text>lowercaseOption</Normal Text><Symbol>,</Symbol><Normal Text> lowercaseQuery</Normal Text><Symbol>)</Symbol><br/>
0161 <Normal Text>            </Normal Text><Keyword>let</Keyword><Normal Text> </Normal Text><Variable>commonPrefix</Variable><Normal Text> </Normal Text><Symbol>=</Symbol><Normal Text> lowercaseOption</Normal Text><Symbol>.</Symbol><Normal Text>commonPrefix</Normal Text><Symbol>(</Symbol><Normal Text>with</Normal Text><Symbol>:</Symbol><Normal Text> lowercaseQuery</Normal Text><Symbol>)</Symbol><br/>
0162 <Normal Text>            </Normal Text><ControlFlowKeyword>if</ControlFlowKeyword><Normal Text> commonPrefix</Normal Text><Symbol>.</Symbol><Normal Text>isEmpty</Normal Text><Symbol>,</Symbol><Normal Text> distance </Normal Text><Symbol>></Symbol><Normal Text> lowercaseQuery</Normal Text><Symbol>.</Symbol><Normal Text>count </Normal Text><Symbol>/</Symbol><Normal Text> </Normal Text><Decimal>2</Decimal><Normal Text> </Normal Text><Symbol>{</Symbol><br/>
0163 <Normal Text>                </Normal Text><Keyword>return</Keyword><Normal Text> </Normal Text><Keyword>nil</Keyword><br/>
0164 <Normal Text>            </Normal Text><Symbol>}</Symbol><br/>
0165 <Normal Text>            </Normal Text><Keyword>return</Keyword><Normal Text> </Normal Text><Symbol>(</Symbol><Normal Text>option</Normal Text><Symbol>,</Symbol><Normal Text> distance</Normal Text><Symbol>,</Symbol><Normal Text> commonPrefix</Normal Text><Symbol>.</Symbol><Normal Text>count</Normal Text><Symbol>)</Symbol><br/>
0166 <Normal Text>        </Normal Text><Symbol>}</Symbol><br/>
0167 <Normal Text>        </Normal Text><Symbol>.</Symbol><Normal Text>sorted </Normal Text><Symbol>{</Symbol><br/>
0168 <Normal Text>            </Normal Text><ControlFlowKeyword>if</ControlFlowKeyword><Normal Text> $</Normal Text><Float>0.</Float><Normal Text>distance </Normal Text><Symbol>==</Symbol><Normal Text> $</Normal Text><Float>1.</Float><Normal Text>distance </Normal Text><Symbol>{</Symbol><br/>
0169 <Normal Text>                </Normal Text><Keyword>return</Keyword><Normal Text> $</Normal Text><Float>0.</Float><Normal Text>commonPrefix </Normal Text><Symbol>></Symbol><Normal Text> $</Normal Text><Float>1.</Float><Normal Text>commonPrefix</Normal Text><br/>
0170 <Normal Text>            </Normal Text><Symbol>}</Symbol><br/>
0171 <Normal Text>            </Normal Text><Keyword>return</Keyword><Normal Text> $</Normal Text><Float>0.</Float><Normal Text>distance </Normal Text><Symbol><</Symbol><Normal Text> $</Normal Text><Float>1.</Float><Normal Text>distance</Normal Text><br/>
0172 <Normal Text>        </Normal Text><Symbol>}</Symbol><br/>
0173 <Normal Text>        </Normal Text><Symbol>.</Symbol><Normal Text>map </Normal Text><Symbol>{</Symbol><Normal Text> $</Normal Text><Float>0.0</Float><Normal Text> </Normal Text><Symbol>}</Symbol><br/>
0174 <Symbol>}</Symbol><br/>
0175 <Normal Text></Normal Text><br/>
0176 <Comment>/// The Damerau-Levenshtein edit-distance between two strings</Comment><br/>
0177 <Keyword>func</Keyword><Normal Text> </Normal Text><Function>editDistance</Function><Symbol>(</Symbol><Variable>_</Variable><Normal Text> </Normal Text><Variable>lhs</Variable><Symbol>:</Symbol><Normal Text> </Normal Text><Data Type>String</Data Type><Symbol>,</Symbol><Normal Text> </Normal Text><Variable>_</Variable><Normal Text> </Normal Text><Variable>rhs</Variable><Symbol>:</Symbol><Normal Text> </Normal Text><Data Type>String</Data Type><Symbol>)</Symbol><Normal Text> -> </Normal Text><Function>Int</Function><Normal Text> </Normal Text><Symbol>{</Symbol><br/>
0178 <Normal Text>    </Normal Text><Keyword>let</Keyword><Normal Text> </Normal Text><Variable>lhs</Variable><Normal Text> </Normal Text><Symbol>=</Symbol><Normal Text> Array</Normal Text><Symbol>(</Symbol><Normal Text>lhs</Normal Text><Symbol>)</Symbol><br/>
0179 <Normal Text>    </Normal Text><Keyword>let</Keyword><Normal Text> </Normal Text><Variable>rhs</Variable><Normal Text> </Normal Text><Symbol>=</Symbol><Normal Text> Array</Normal Text><Symbol>(</Symbol><Normal Text>rhs</Normal Text><Symbol>)</Symbol><br/>
0180 <Normal Text>    </Normal Text><Keyword>var</Keyword><Normal Text> </Normal Text><Variable>dist</Variable><Normal Text> </Normal Text><Symbol>=</Symbol><Normal Text> </Normal Text><Symbol>[[</Symbol><Normal Text>Int</Normal Text><Symbol>]]()</Symbol><br/>
0181 <Normal Text>    </Normal Text><ControlFlowKeyword>for</ControlFlowKeyword><Normal Text> i </Normal Text><ControlFlowKeyword>in</ControlFlowKeyword><Normal Text> </Normal Text><Decimal>0</Decimal><Normal Text> </Normal Text><Symbol>...</Symbol><Normal Text> lhs</Normal Text><Symbol>.</Symbol><Normal Text>count </Normal Text><Symbol>{</Symbol><br/>
0182 <Normal Text>        dist</Normal Text><Symbol>.</Symbol><Normal Text>append</Normal Text><Symbol>([</Symbol><Normal Text>i</Normal Text><Symbol>])</Symbol><br/>
0183 <Normal Text>    </Normal Text><Symbol>}</Symbol><br/>
0184 <Normal Text>    </Normal Text><ControlFlowKeyword>for</ControlFlowKeyword><Normal Text> j </Normal Text><ControlFlowKeyword>in</ControlFlowKeyword><Normal Text> </Normal Text><Decimal>1</Decimal><Normal Text> </Normal Text><Symbol>...</Symbol><Normal Text> rhs</Normal Text><Symbol>.</Symbol><Normal Text>count </Normal Text><Symbol>{</Symbol><br/>
0185 <Normal Text>        dist</Normal Text><Symbol>[</Symbol><Decimal>0</Decimal><Symbol>].</Symbol><Normal Text>append</Normal Text><Symbol>(</Symbol><Normal Text>j</Normal Text><Symbol>)</Symbol><br/>
0186 <Normal Text>    </Normal Text><Symbol>}</Symbol><br/>
0187 <Normal Text>    </Normal Text><ControlFlowKeyword>for</ControlFlowKeyword><Normal Text> i </Normal Text><ControlFlowKeyword>in</ControlFlowKeyword><Normal Text> </Normal Text><Decimal>1</Decimal><Normal Text> </Normal Text><Symbol>...</Symbol><Normal Text> lhs</Normal Text><Symbol>.</Symbol><Normal Text>count </Normal Text><Symbol>{</Symbol><br/>
0188 <Normal Text>        </Normal Text><ControlFlowKeyword>for</ControlFlowKeyword><Normal Text> j </Normal Text><ControlFlowKeyword>in</ControlFlowKeyword><Normal Text> </Normal Text><Decimal>1</Decimal><Normal Text> </Normal Text><Symbol>...</Symbol><Normal Text> rhs</Normal Text><Symbol>.</Symbol><Normal Text>count </Normal Text><Symbol>{</Symbol><br/>
0189 <Normal Text>            </Normal Text><ControlFlowKeyword>if</ControlFlowKeyword><Normal Text> lhs</Normal Text><Symbol>[</Symbol><Normal Text>i </Normal Text><Symbol>-</Symbol><Normal Text> </Normal Text><Decimal>1</Decimal><Symbol>]</Symbol><Normal Text> </Normal Text><Symbol>==</Symbol><Normal Text> rhs</Normal Text><Symbol>[</Symbol><Normal Text>j </Normal Text><Symbol>-</Symbol><Normal Text> </Normal Text><Decimal>1</Decimal><Symbol>]</Symbol><Normal Text> </Normal Text><Symbol>{</Symbol><br/>
0190 <Normal Text>                dist</Normal Text><Symbol>[</Symbol><Normal Text>i</Normal Text><Symbol>].</Symbol><Normal Text>append</Normal Text><Symbol>(</Symbol><Normal Text>dist</Normal Text><Symbol>[</Symbol><Normal Text>i </Normal Text><Symbol>-</Symbol><Normal Text> </Normal Text><Decimal>1</Decimal><Symbol>][</Symbol><Normal Text>j </Normal Text><Symbol>-</Symbol><Normal Text> </Normal Text><Decimal>1</Decimal><Symbol>])</Symbol><br/>
0191 <Normal Text>            </Normal Text><Symbol>}</Symbol><Normal Text> </Normal Text><ControlFlowKeyword>else</ControlFlowKeyword><Normal Text> </Normal Text><Symbol>{</Symbol><br/>
0192 <Normal Text>                dist</Normal Text><Symbol>[</Symbol><Normal Text>i</Normal Text><Symbol>].</Symbol><Normal Text>append</Normal Text><Symbol>(</Symbol><Normal Text>min</Normal Text><Symbol>(</Symbol><Normal Text>dist</Normal Text><Symbol>[</Symbol><Normal Text>i </Normal Text><Symbol>-</Symbol><Normal Text> </Normal Text><Decimal>1</Decimal><Symbol>][</Symbol><Normal Text>j</Normal Text><Symbol>]</Symbol><Normal Text> </Normal Text><Symbol>+</Symbol><Normal Text> </Normal Text><Decimal>1</Decimal><Symbol>,</Symbol><br/>
0193 <Normal Text>                                   dist</Normal Text><Symbol>[</Symbol><Normal Text>i</Normal Text><Symbol>][</Symbol><Normal Text>j </Normal Text><Symbol>-</Symbol><Normal Text> </Normal Text><Decimal>1</Decimal><Symbol>]</Symbol><Normal Text> </Normal Text><Symbol>+</Symbol><Normal Text> </Normal Text><Decimal>1</Decimal><Symbol>,</Symbol><br/>
0194 <Normal Text>                                   dist</Normal Text><Symbol>[</Symbol><Normal Text>i </Normal Text><Symbol>-</Symbol><Normal Text> </Normal Text><Decimal>1</Decimal><Symbol>][</Symbol><Normal Text>j </Normal Text><Symbol>-</Symbol><Normal Text> </Normal Text><Decimal>1</Decimal><Symbol>]</Symbol><Normal Text> </Normal Text><Symbol>+</Symbol><Normal Text> </Normal Text><Decimal>1</Decimal><Symbol>))</Symbol><br/>
0195 <Normal Text>            </Normal Text><Symbol>}</Symbol><br/>
0196 <Normal Text>            </Normal Text><ControlFlowKeyword>if</ControlFlowKeyword><Normal Text> i </Normal Text><Symbol>></Symbol><Normal Text> </Normal Text><Decimal>1</Decimal><Symbol>,</Symbol><Normal Text> j </Normal Text><Symbol>></Symbol><Normal Text> </Normal Text><Decimal>1</Decimal><Symbol>,</Symbol><Normal Text> lhs</Normal Text><Symbol>[</Symbol><Normal Text>i </Normal Text><Symbol>-</Symbol><Normal Text> </Normal Text><Decimal>1</Decimal><Symbol>]</Symbol><Normal Text> </Normal Text><Symbol>==</Symbol><Normal Text> rhs</Normal Text><Symbol>[</Symbol><Normal Text>j </Normal Text><Symbol>-</Symbol><Normal Text> </Normal Text><Decimal>2</Decimal><Symbol>],</Symbol><Normal Text> lhs</Normal Text><Symbol>[</Symbol><Normal Text>i </Normal Text><Symbol>-</Symbol><Normal Text> </Normal Text><Decimal>2</Decimal><Symbol>]</Symbol><Normal Text> </Normal Text><Symbol>==</Symbol><Normal Text> rhs</Normal Text><Symbol>[</Symbol><Normal Text>j </Normal Text><Symbol>-</Symbol><Normal Text> </Normal Text><Decimal>1</Decimal><Symbol>]</Symbol><Normal Text> </Normal Text><Symbol>{</Symbol><br/>
0197 <Normal Text>                dist</Normal Text><Symbol>[</Symbol><Normal Text>i</Normal Text><Symbol>][</Symbol><Normal Text>j</Normal Text><Symbol>]</Symbol><Normal Text> </Normal Text><Symbol>=</Symbol><Normal Text> min</Normal Text><Symbol>(</Symbol><Normal Text>dist</Normal Text><Symbol>[</Symbol><Normal Text>i</Normal Text><Symbol>][</Symbol><Normal Text>j</Normal Text><Symbol>],</Symbol><Normal Text> dist</Normal Text><Symbol>[</Symbol><Normal Text>i </Normal Text><Symbol>-</Symbol><Normal Text> </Normal Text><Decimal>2</Decimal><Symbol>][</Symbol><Normal Text>j </Normal Text><Symbol>-</Symbol><Normal Text> </Normal Text><Decimal>2</Decimal><Symbol>]</Symbol><Normal Text> </Normal Text><Symbol>+</Symbol><Normal Text> </Normal Text><Decimal>1</Decimal><Symbol>)</Symbol><br/>
0198 <Normal Text>            </Normal Text><Symbol>}</Symbol><br/>
0199 <Normal Text>        </Normal Text><Symbol>}</Symbol><br/>
0200 <Normal Text>    </Normal Text><Symbol>}</Symbol><br/>
0201 <Normal Text>    </Normal Text><Keyword>return</Keyword><Normal Text> dist</Normal Text><Symbol>[</Symbol><Normal Text>lhs</Normal Text><Symbol>.</Symbol><Normal Text>count</Normal Text><Symbol>][</Symbol><Normal Text>rhs</Normal Text><Symbol>.</Symbol><Normal Text>count</Normal Text><Symbol>]</Symbol><br/>
0202 <Symbol>}</Symbol><br/>
0203 <Normal Text></Normal Text><br/>
0204 <Comment>// Parse a comma-delimited list of items</Comment><br/>
0205 <Keyword>func</Keyword><Normal Text> </Normal Text><Function>parseCommaDelimitedList</Function><Symbol>(</Symbol><Variable>_</Variable><Normal Text> </Normal Text><Variable>string</Variable><Symbol>:</Symbol><Normal Text> </Normal Text><Data Type>String</Data Type><Symbol>)</Symbol><Normal Text> -> [</Normal Text><Function>String</Function><Normal Text>] </Normal Text><Symbol>{</Symbol><br/>
0206 <Normal Text>    </Normal Text><Keyword>return</Keyword><Normal Text> string</Normal Text><Symbol>.</Symbol><Normal Text>components</Normal Text><Symbol>(</Symbol><Normal Text>separatedBy</Normal Text><Symbol>:</Symbol><Normal Text> </Normal Text><String>","</String><Symbol>).</Symbol><Normal Text>compactMap </Normal Text><Symbol>{</Symbol><br/>
0207 <Normal Text>        </Normal Text><Keyword>let</Keyword><Normal Text> </Normal Text><Variable>item</Variable><Normal Text> </Normal Text><Symbol>=</Symbol><Normal Text> $</Normal Text><Float>0.</Float><Normal Text>trimmingCharacters</Normal Text><Symbol>(</Symbol><ControlFlowKeyword>in</ControlFlowKeyword><Symbol>:</Symbol><Normal Text> </Normal Text><Symbol>.</Symbol><Normal Text>whitespacesAndNewlines</Normal Text><Symbol>)</Symbol><br/>
0208 <Normal Text>        </Normal Text><Keyword>return</Keyword><Normal Text> item</Normal Text><Symbol>.</Symbol><Normal Text>isEmpty </Normal Text><Symbol>?</Symbol><Normal Text> </Normal Text><Keyword>nil</Keyword><Normal Text> </Normal Text><Symbol>:</Symbol><Normal Text> item</Normal Text><br/>
0209 <Normal Text>    </Normal Text><Symbol>}</Symbol><br/>
0210 <Symbol>}</Symbol><br/>
0211 <Normal Text></Normal Text><br/>
0212 <Comment>// Parse a comma-delimited string into an array of rules</Comment><br/>
0213 <Keyword>let</Keyword><Normal Text> </Normal Text><Variable>allRules</Variable><Normal Text> </Normal Text><Symbol>=</Symbol><Normal Text> Set</Normal Text><Symbol>(</Symbol><Normal Text>FormatRules</Normal Text><Symbol>.</Symbol><Normal Text>byName</Normal Text><Symbol>.</Symbol><Normal Text>keys</Normal Text><Symbol>)</Symbol><br/>
0214 <Keyword>func</Keyword><Normal Text> </Normal Text><Function>parseRules</Function><Symbol>(</Symbol><Variable>_</Variable><Normal Text> </Normal Text><Variable>rules</Variable><Symbol>:</Symbol><Normal Text> </Normal Text><Data Type>String</Data Type><Symbol>)</Symbol><Normal Text> </Normal Text><Keyword>throws</Keyword><Normal Text> -> [</Normal Text><Function>String</Function><Normal Text>] </Normal Text><Symbol>{</Symbol><br/>
0215 <Normal Text>    </Normal Text><Keyword>return</Keyword><Normal Text> </Normal Text><ControlFlowKeyword>try</ControlFlowKeyword><Normal Text> parseCommaDelimitedList</Normal Text><Symbol>(</Symbol><Normal Text>rules</Normal Text><Symbol>).</Symbol><Normal Text>map </Normal Text><Symbol>{</Symbol><Normal Text> proposedName </Normal Text><ControlFlowKeyword>in</ControlFlowKeyword><br/>
0216 <Normal Text>        </Normal Text><ControlFlowKeyword>if</ControlFlowKeyword><Normal Text> </Normal Text><Keyword>let</Keyword><Normal Text> </Normal Text><Variable>name</Variable><Normal Text> </Normal Text><Symbol>=</Symbol><Normal Text> allRules</Normal Text><Symbol>.</Symbol><Normal Text>first</Normal Text><Symbol>(</Symbol><Keyword>where</Keyword><Symbol>:</Symbol><Normal Text> </Normal Text><Symbol>{</Symbol><br/>
0217 <Normal Text>            $</Normal Text><Float>0.</Float><Normal Text>lowercased</Normal Text><Symbol>()</Symbol><Normal Text> </Normal Text><Symbol>==</Symbol><Normal Text> proposedName</Normal Text><Symbol>.</Symbol><Normal Text>lowercased</Normal Text><Symbol>()</Symbol><br/>
0218 <Normal Text>        </Normal Text><Symbol>})</Symbol><Normal Text> </Normal Text><Symbol>{</Symbol><br/>
0219 <Normal Text>            </Normal Text><Keyword>return</Keyword><Normal Text> name</Normal Text><br/>
0220 <Normal Text>        </Normal Text><Symbol>}</Symbol><br/>
0221 <Normal Text>        </Normal Text><ControlFlowKeyword>if</ControlFlowKeyword><Normal Text> Descriptors</Normal Text><Symbol>.</Symbol><Normal Text>all</Normal Text><Symbol>.</Symbol><Normal Text>contains</Normal Text><Symbol>(</Symbol><Keyword>where</Keyword><Symbol>:</Symbol><Normal Text> </Normal Text><Symbol>{</Symbol><br/>
0222 <Normal Text>            $</Normal Text><Float>0.</Float><Normal Text>argumentName </Normal Text><Symbol>==</Symbol><Normal Text> proposedName</Normal Text><br/>
0223 <Normal Text>        </Normal Text><Symbol>})</Symbol><Normal Text> </Normal Text><Symbol>{</Symbol><br/>
0224 <Normal Text>            </Normal Text><ControlFlowKeyword>for</ControlFlowKeyword><Normal Text> rule </Normal Text><ControlFlowKeyword>in</ControlFlowKeyword><Normal Text> FormatRules</Normal Text><Symbol>.</Symbol><Normal Text>all </Normal Text><Keyword>where</Keyword><Normal Text> rule</Normal Text><Symbol>.</Symbol><Normal Text>options</Normal Text><Symbol>.</Symbol><Normal Text>contains</Normal Text><Symbol>(</Symbol><Normal Text>proposedName</Normal Text><Symbol>)</Symbol><Normal Text> </Normal Text><Symbol>{</Symbol><br/>
0225 <Normal Text>                </Normal Text><Keyword>throw</Keyword><Normal Text> FormatError</Normal Text><Symbol>.</Symbol><Normal Text>options</Normal Text><Symbol>(</Symbol><br/>
0226 <Normal Text>                    </Normal Text><String>"'</String><Error>\(</Error><String>proposedName)' is not a formatting rule. Did you mean '</String><Error>\(</Error><String>rule.name)'?"</String><br/>
0227 <Normal Text>                </Normal Text><Symbol>)</Symbol><br/>
0228 <Normal Text>            </Normal Text><Symbol>}</Symbol><br/>
0229 <Normal Text>            </Normal Text><Keyword>throw</Keyword><Normal Text> FormatError</Normal Text><Symbol>.</Symbol><Normal Text>options</Normal Text><Symbol>(</Symbol><String>"'</String><Error>\(</Error><String>proposedName)' is not a formatting rule"</String><Symbol>)</Symbol><br/>
0230 <Normal Text>        </Normal Text><Symbol>}</Symbol><br/>
0231 <Normal Text>        </Normal Text><ControlFlowKeyword>guard</ControlFlowKeyword><Normal Text> </Normal Text><Keyword>let</Keyword><Normal Text> </Normal Text><Variable>match</Variable><Normal Text> </Normal Text><Symbol>=</Symbol><Normal Text> bestMatches</Normal Text><Symbol>(</Symbol><ControlFlowKeyword>for</ControlFlowKeyword><Symbol>:</Symbol><Normal Text> proposedName</Normal Text><Symbol>,</Symbol><Normal Text> </Normal Text><ControlFlowKeyword>in</ControlFlowKeyword><Symbol>:</Symbol><Normal Text> Array</Normal Text><Symbol>(</Symbol><Normal Text>allRules</Normal Text><Symbol>)).</Symbol><Normal Text>first </Normal Text><ControlFlowKeyword>else</ControlFlowKeyword><Normal Text> </Normal Text><Symbol>{</Symbol><br/>
0232 <Normal Text>            </Normal Text><Keyword>throw</Keyword><Normal Text> FormatError</Normal Text><Symbol>.</Symbol><Normal Text>options</Normal Text><Symbol>(</Symbol><String>"Unknown rule '</String><Error>\(</Error><String>proposedName)'"</String><Symbol>)</Symbol><br/>
0233 <Normal Text>        </Normal Text><Symbol>}</Symbol><br/>
0234 <Normal Text>        </Normal Text><Keyword>throw</Keyword><Normal Text> FormatError</Normal Text><Symbol>.</Symbol><Normal Text>options</Normal Text><Symbol>(</Symbol><String>"Unknown rule '</String><Error>\(</Error><String>proposedName)'. Did you mean '</String><Error>\(</Error><String>match)'?"</String><Symbol>)</Symbol><br/>
0235 <Normal Text>    </Normal Text><Symbol>}</Symbol><br/>
0236 <Symbol>}</Symbol><br/>
0237 <Normal Text></Normal Text><br/>
0238 <Comment>// Parse single file path, disallowing globs or commas</Comment><br/>
0239 <Keyword>func</Keyword><Normal Text> </Normal Text><Function>parsePath</Function><Symbol>(</Symbol><Variable>_</Variable><Normal Text> </Normal Text><Variable>path</Variable><Symbol>:</Symbol><Normal Text> </Normal Text><Data Type>String</Data Type><Symbol>,</Symbol><Normal Text> </Normal Text><Variable>for</Variable><Normal Text> </Normal Text><Variable>argument</Variable><Symbol>:</Symbol><Normal Text> </Normal Text><Data Type>String</Data Type><Symbol>,</Symbol><Normal Text> </Normal Text><Variable>in</Variable><Normal Text> </Normal Text><Variable>directory</Variable><Symbol>:</Symbol><Normal Text> </Normal Text><Data Type>String</Data Type><Symbol>)</Symbol><Normal Text> </Normal Text><Keyword>throws</Keyword><Normal Text> -> </Normal Text><Function>URL</Function><Normal Text> </Normal Text><Symbol>{</Symbol><br/>
0240 <Normal Text>    </Normal Text><Keyword>let</Keyword><Normal Text> </Normal Text><Variable>expandedPath</Variable><Normal Text> </Normal Text><Symbol>=</Symbol><Normal Text> expandPath</Normal Text><Symbol>(</Symbol><Normal Text>path</Normal Text><Symbol>,</Symbol><Normal Text> </Normal Text><ControlFlowKeyword>in</ControlFlowKeyword><Symbol>:</Symbol><Normal Text> directory</Normal Text><Symbol>)</Symbol><br/>
0241 <Normal Text>    </Normal Text><ControlFlowKeyword>if</ControlFlowKeyword><Normal Text> </Normal Text><Symbol>!</Symbol><Normal Text>FileManager</Normal Text><Symbol>.</Symbol><Keyword>default</Keyword><Symbol>.</Symbol><Normal Text>fileExists</Normal Text><Symbol>(</Symbol><Normal Text>atPath</Normal Text><Symbol>:</Symbol><Normal Text> expandedPath</Normal Text><Symbol>.</Symbol><Normal Text>path</Normal Text><Symbol>)</Symbol><Normal Text> </Normal Text><Symbol>{</Symbol><br/>
0242 <Normal Text>        </Normal Text><ControlFlowKeyword>if</ControlFlowKeyword><Normal Text> path</Normal Text><Symbol>.</Symbol><Normal Text>contains</Normal Text><Symbol>(</Symbol><String>","</String><Symbol>)</Symbol><Normal Text> </Normal Text><Symbol>{</Symbol><br/>
0243 <Normal Text>            </Normal Text><Keyword>throw</Keyword><Normal Text> FormatError</Normal Text><Symbol>.</Symbol><Normal Text>options</Normal Text><Symbol>(</Symbol><String>"</String><Error>\(</Error><String>argument) argument does not support multiple paths"</String><Symbol>)</Symbol><br/>
0244 <Normal Text>        </Normal Text><Symbol>}</Symbol><br/>
0245 <Normal Text>        </Normal Text><ControlFlowKeyword>if</ControlFlowKeyword><Normal Text> pathContainsGlobSyntax</Normal Text><Symbol>(</Symbol><Normal Text>path</Normal Text><Symbol>)</Symbol><Normal Text> </Normal Text><Symbol>{</Symbol><br/>
0246 <Normal Text>            </Normal Text><Keyword>throw</Keyword><Normal Text> FormatError</Normal Text><Symbol>.</Symbol><Normal Text>options</Normal Text><Symbol>(</Symbol><String>"</String><Error>\(</Error><String>argument) path cannot contain wildcards"</String><Symbol>)</Symbol><br/>
0247 <Normal Text>        </Normal Text><Symbol>}</Symbol><br/>
0248 <Normal Text>    </Normal Text><Symbol>}</Symbol><br/>
0249 <Normal Text>    </Normal Text><Keyword>return</Keyword><Normal Text> expandedPath</Normal Text><br/>
0250 <Symbol>}</Symbol><br/>
0251 <Normal Text></Normal Text><br/>
0252 <Comment>// Parse one or more comma-delimited file paths, expanding globs as required</Comment><br/>
0253 <Keyword>func</Keyword><Normal Text> </Normal Text><Function>parsePaths</Function><Symbol>(</Symbol><Variable>_</Variable><Normal Text> </Normal Text><Variable>paths</Variable><Symbol>:</Symbol><Normal Text> </Normal Text><Data Type>String</Data Type><Symbol>,</Symbol><Normal Text> </Normal Text><Variable>in</Variable><Normal Text> </Normal Text><Variable>directory</Variable><Symbol>:</Symbol><Normal Text> </Normal Text><Data Type>String</Data Type><Symbol>)</Symbol><Normal Text> </Normal Text><Keyword>throws</Keyword><Normal Text> -> [</Normal Text><Function>URL</Function><Normal Text>] </Normal Text><Symbol>{</Symbol><br/>
0254 <Normal Text>    </Normal Text><Keyword>return</Keyword><Normal Text> </Normal Text><ControlFlowKeyword>try</ControlFlowKeyword><Normal Text> matchGlobs</Normal Text><Symbol>(</Symbol><Normal Text>expandGlobs</Normal Text><Symbol>(</Symbol><Normal Text>paths</Normal Text><Symbol>,</Symbol><Normal Text> </Normal Text><ControlFlowKeyword>in</ControlFlowKeyword><Symbol>:</Symbol><Normal Text> directory</Normal Text><Symbol>),</Symbol><Normal Text> </Normal Text><ControlFlowKeyword>in</ControlFlowKeyword><Symbol>:</Symbol><Normal Text> directory</Normal Text><Symbol>)</Symbol><br/>
0255 <Symbol>}</Symbol><br/>
0256 <Normal Text></Normal Text><br/>
0257 <Comment>// Merge two dictionaries of arguments</Comment><br/>
0258 <Keyword>func</Keyword><Normal Text> </Normal Text><Function>mergeArguments</Function><Symbol>(</Symbol><Variable>_</Variable><Normal Text> </Normal Text><Variable>args</Variable><Symbol>:</Symbol><Normal Text> [</Normal Text><Data Type>String</Data Type><Symbol>:</Symbol><Normal Text> </Normal Text><Data Type>String</Data Type><Normal Text>]</Normal Text><Symbol>,</Symbol><Normal Text> </Normal Text><Variable>into</Variable><Normal Text> </Normal Text><Variable>config</Variable><Symbol>:</Symbol><Normal Text> [</Normal Text><Data Type>String</Data Type><Symbol>:</Symbol><Normal Text> </Normal Text><Data Type>String</Data Type><Normal Text>]</Normal Text><Symbol>)</Symbol><Normal Text> </Normal Text><Keyword>throws</Keyword><Normal Text> -> [</Normal Text><Function>String</Function><Symbol>:</Symbol><Normal Text> </Normal Text><Data Type>String</Data Type><Normal Text>] </Normal Text><Symbol>{</Symbol><br/>
0259 <Normal Text>    </Normal Text><Keyword>var</Keyword><Normal Text> </Normal Text><Variable>input</Variable><Normal Text> </Normal Text><Symbol>=</Symbol><Normal Text> config</Normal Text><br/>
0260 <Normal Text>    </Normal Text><Keyword>var</Keyword><Normal Text> </Normal Text><Variable>output</Variable><Normal Text> </Normal Text><Symbol>=</Symbol><Normal Text> args</Normal Text><br/>
0261 <Normal Text>    </Normal Text><Comment>// Merge excluded urls</Comment><br/>
0262 <Normal Text>    </Normal Text><ControlFlowKeyword>if</ControlFlowKeyword><Normal Text> </Normal Text><Keyword>let</Keyword><Normal Text> </Normal Text><Variable>exclude</Variable><Normal Text> </Normal Text><Symbol>=</Symbol><Normal Text> output</Normal Text><Symbol>[</Symbol><String>"exclude"</String><Symbol>].</Symbol><Normal Text>map</Normal Text><Symbol>(</Symbol><Normal Text>parseCommaDelimitedList</Normal Text><Symbol>),</Symbol><br/>
0263 <Normal Text>       </Normal Text><Keyword>var</Keyword><Normal Text> </Normal Text><Variable>excluded</Variable><Normal Text> </Normal Text><Symbol>=</Symbol><Normal Text> input</Normal Text><Symbol>[</Symbol><String>"exclude"</String><Symbol>].</Symbol><Normal Text>map</Normal Text><Symbol>({</Symbol><Normal Text> Set</Normal Text><Symbol>(</Symbol><Normal Text>parseCommaDelimitedList</Normal Text><Symbol>(</Symbol><Normal Text>$</Normal Text><Decimal>0</Decimal><Symbol>))</Symbol><Normal Text> </Normal Text><Symbol>})</Symbol><br/>
0264 <Normal Text>    </Normal Text><Symbol>{</Symbol><br/>
0265 <Normal Text>        excluded</Normal Text><Symbol>.</Symbol><Normal Text>formUnion</Normal Text><Symbol>(</Symbol><Normal Text>exclude</Normal Text><Symbol>)</Symbol><br/>
0266 <Normal Text>        output</Normal Text><Symbol>[</Symbol><String>"exclude"</String><Symbol>]</Symbol><Normal Text> </Normal Text><Symbol>=</Symbol><Normal Text> Array</Normal Text><Symbol>(</Symbol><Normal Text>excluded</Normal Text><Symbol>).</Symbol><Normal Text>sorted</Normal Text><Symbol>().</Symbol><Normal Text>joined</Normal Text><Symbol>(</Symbol><Normal Text>separator</Normal Text><Symbol>:</Symbol><Normal Text> </Normal Text><String>","</String><Symbol>)</Symbol><br/>
0267 <Normal Text>    </Normal Text><Symbol>}</Symbol><br/>
0268 <Normal Text>    </Normal Text><Comment>// Merge unexcluded urls</Comment><br/>
0269 <Normal Text>    </Normal Text><ControlFlowKeyword>if</ControlFlowKeyword><Normal Text> </Normal Text><Keyword>let</Keyword><Normal Text> </Normal Text><Variable>unexclude</Variable><Normal Text> </Normal Text><Symbol>=</Symbol><Normal Text> output</Normal Text><Symbol>[</Symbol><String>"unexclude"</String><Symbol>].</Symbol><Normal Text>map</Normal Text><Symbol>(</Symbol><Normal Text>parseCommaDelimitedList</Normal Text><Symbol>),</Symbol><br/>
0270 <Normal Text>       </Normal Text><Keyword>var</Keyword><Normal Text> </Normal Text><Variable>unexcluded</Variable><Normal Text> </Normal Text><Symbol>=</Symbol><Normal Text> input</Normal Text><Symbol>[</Symbol><String>"unexclude"</String><Symbol>].</Symbol><Normal Text>map</Normal Text><Symbol>({</Symbol><Normal Text> Set</Normal Text><Symbol>(</Symbol><Normal Text>parseCommaDelimitedList</Normal Text><Symbol>(</Symbol><Normal Text>$</Normal Text><Decimal>0</Decimal><Symbol>))</Symbol><Normal Text> </Normal Text><Symbol>})</Symbol><br/>
0271 <Normal Text>    </Normal Text><Symbol>{</Symbol><br/>
0272 <Normal Text>        unexcluded</Normal Text><Symbol>.</Symbol><Normal Text>formUnion</Normal Text><Symbol>(</Symbol><Normal Text>unexclude</Normal Text><Symbol>)</Symbol><br/>
0273 <Normal Text>        output</Normal Text><Symbol>[</Symbol><String>"unexclude"</String><Symbol>]</Symbol><Normal Text> </Normal Text><Symbol>=</Symbol><Normal Text> Array</Normal Text><Symbol>(</Symbol><Normal Text>unexcluded</Normal Text><Symbol>).</Symbol><Normal Text>sorted</Normal Text><Symbol>().</Symbol><Normal Text>joined</Normal Text><Symbol>(</Symbol><Normal Text>separator</Normal Text><Symbol>:</Symbol><Normal Text> </Normal Text><String>","</String><Symbol>)</Symbol><br/>
0274 <Normal Text>    </Normal Text><Symbol>}</Symbol><br/>
0275 <Normal Text>    </Normal Text><Comment>// Merge rules</Comment><br/>
0276 <Normal Text>    </Normal Text><ControlFlowKeyword>if</ControlFlowKeyword><Normal Text> </Normal Text><Keyword>let</Keyword><Normal Text> </Normal Text><Variable>rules</Variable><Normal Text> </Normal Text><Symbol>=</Symbol><Normal Text> </Normal Text><ControlFlowKeyword>try</ControlFlowKeyword><Normal Text> output</Normal Text><Symbol>[</Symbol><String>"rules"</String><Symbol>].</Symbol><Normal Text>map</Normal Text><Symbol>(</Symbol><Normal Text>parseRules</Normal Text><Symbol>)</Symbol><Normal Text> </Normal Text><Symbol>{</Symbol><br/>
0277 <Normal Text>        </Normal Text><ControlFlowKeyword>if</ControlFlowKeyword><Normal Text> rules</Normal Text><Symbol>.</Symbol><Normal Text>isEmpty </Normal Text><Symbol>{</Symbol><br/>
0278 <Normal Text>            output</Normal Text><Symbol>[</Symbol><String>"rules"</String><Symbol>]</Symbol><Normal Text> </Normal Text><Symbol>=</Symbol><Normal Text> </Normal Text><Keyword>nil</Keyword><br/>
0279 <Normal Text>        </Normal Text><Symbol>}</Symbol><Normal Text> </Normal Text><ControlFlowKeyword>else</ControlFlowKeyword><Normal Text> </Normal Text><Symbol>{</Symbol><br/>
0280 <Normal Text>            input</Normal Text><Symbol>[</Symbol><String>"rules"</String><Symbol>]</Symbol><Normal Text> </Normal Text><Symbol>=</Symbol><Normal Text> </Normal Text><Keyword>nil</Keyword><br/>
0281 <Normal Text>            input</Normal Text><Symbol>[</Symbol><String>"enable"</String><Symbol>]</Symbol><Normal Text> </Normal Text><Symbol>=</Symbol><Normal Text> </Normal Text><Keyword>nil</Keyword><br/>
0282 <Normal Text>            input</Normal Text><Symbol>[</Symbol><String>"disable"</String><Symbol>]</Symbol><Normal Text> </Normal Text><Symbol>=</Symbol><Normal Text> </Normal Text><Keyword>nil</Keyword><br/>
0283 <Normal Text>            input</Normal Text><Symbol>[</Symbol><String>"lintonly"</String><Symbol>]</Symbol><Normal Text> </Normal Text><Symbol>=</Symbol><Normal Text> </Normal Text><Keyword>nil</Keyword><br/>
0284 <Normal Text>        </Normal Text><Symbol>}</Symbol><br/>
0285 <Normal Text>    </Normal Text><Symbol>}</Symbol><Normal Text> </Normal Text><ControlFlowKeyword>else</ControlFlowKeyword><Normal Text> </Normal Text><Symbol>{</Symbol><br/>
0286 <Normal Text>        </Normal Text><ControlFlowKeyword>if</ControlFlowKeyword><Normal Text> </Normal Text><Keyword>let</Keyword><Normal Text> </Normal Text><Variable>_disable</Variable><Normal Text> </Normal Text><Symbol>=</Symbol><Normal Text> </Normal Text><ControlFlowKeyword>try</ControlFlowKeyword><Normal Text> output</Normal Text><Symbol>[</Symbol><String>"disable"</String><Symbol>].</Symbol><Normal Text>map</Normal Text><Symbol>(</Symbol><Normal Text>parseRules</Normal Text><Symbol>)</Symbol><Normal Text> </Normal Text><Symbol>{</Symbol><br/>
0287 <Normal Text>            </Normal Text><ControlFlowKeyword>if</ControlFlowKeyword><Normal Text> </Normal Text><Keyword>let</Keyword><Normal Text> </Normal Text><Variable>rules</Variable><Normal Text> </Normal Text><Symbol>=</Symbol><Normal Text> </Normal Text><ControlFlowKeyword>try</ControlFlowKeyword><Normal Text> input</Normal Text><Symbol>[</Symbol><String>"rules"</String><Symbol>].</Symbol><Normal Text>map</Normal Text><Symbol>(</Symbol><Normal Text>parseRules</Normal Text><Symbol>)</Symbol><Normal Text> </Normal Text><Symbol>{</Symbol><br/>
0288 <Normal Text>                input</Normal Text><Symbol>[</Symbol><String>"rules"</String><Symbol>]</Symbol><Normal Text> </Normal Text><Symbol>=</Symbol><Normal Text> Set</Normal Text><Symbol>(</Symbol><Normal Text>rules</Normal Text><Symbol>).</Symbol><Normal Text>subtracting</Normal Text><Symbol>(</Symbol><Normal Text>_disable</Normal Text><Symbol>).</Symbol><Normal Text>sorted</Normal Text><Symbol>().</Symbol><Normal Text>joined</Normal Text><Symbol>(</Symbol><Normal Text>separator</Normal Text><Symbol>:</Symbol><Normal Text> </Normal Text><String>","</String><Symbol>)</Symbol><br/>
0289 <Normal Text>            </Normal Text><Symbol>}</Symbol><br/>
0290 <Normal Text>            </Normal Text><ControlFlowKeyword>if</ControlFlowKeyword><Normal Text> </Normal Text><Keyword>let</Keyword><Normal Text> </Normal Text><Variable>enable</Variable><Normal Text> </Normal Text><Symbol>=</Symbol><Normal Text> </Normal Text><ControlFlowKeyword>try</ControlFlowKeyword><Normal Text> input</Normal Text><Symbol>[</Symbol><String>"enable"</String><Symbol>].</Symbol><Normal Text>map</Normal Text><Symbol>(</Symbol><Normal Text>parseRules</Normal Text><Symbol>)</Symbol><Normal Text> </Normal Text><Symbol>{</Symbol><br/>
0291 <Normal Text>                input</Normal Text><Symbol>[</Symbol><String>"enable"</String><Symbol>]</Symbol><Normal Text> </Normal Text><Symbol>=</Symbol><Normal Text> Set</Normal Text><Symbol>(</Symbol><Normal Text>enable</Normal Text><Symbol>).</Symbol><Normal Text>subtracting</Normal Text><Symbol>(</Symbol><Normal Text>_disable</Normal Text><Symbol>).</Symbol><Normal Text>sorted</Normal Text><Symbol>().</Symbol><Normal Text>joined</Normal Text><Symbol>(</Symbol><Normal Text>separator</Normal Text><Symbol>:</Symbol><Normal Text> </Normal Text><String>","</String><Symbol>)</Symbol><br/>
0292 <Normal Text>            </Normal Text><Symbol>}</Symbol><br/>
0293 <Normal Text>            </Normal Text><ControlFlowKeyword>if</ControlFlowKeyword><Normal Text> </Normal Text><Keyword>let</Keyword><Normal Text> </Normal Text><Variable>lintonly</Variable><Normal Text> </Normal Text><Symbol>=</Symbol><Normal Text> </Normal Text><ControlFlowKeyword>try</ControlFlowKeyword><Normal Text> input</Normal Text><Symbol>[</Symbol><String>"lintonly"</String><Symbol>].</Symbol><Normal Text>map</Normal Text><Symbol>(</Symbol><Normal Text>parseRules</Normal Text><Symbol>)</Symbol><Normal Text> </Normal Text><Symbol>{</Symbol><br/>
0294 <Normal Text>                input</Normal Text><Symbol>[</Symbol><String>"lintonly"</String><Symbol>]</Symbol><Normal Text> </Normal Text><Symbol>=</Symbol><Normal Text> Set</Normal Text><Symbol>(</Symbol><Normal Text>lintonly</Normal Text><Symbol>).</Symbol><Normal Text>subtracting</Normal Text><Symbol>(</Symbol><Normal Text>_disable</Normal Text><Symbol>).</Symbol><Normal Text>sorted</Normal Text><Symbol>().</Symbol><Normal Text>joined</Normal Text><Symbol>(</Symbol><Normal Text>separator</Normal Text><Symbol>:</Symbol><Normal Text> </Normal Text><String>","</String><Symbol>)</Symbol><br/>
0295 <Normal Text>            </Normal Text><Symbol>}</Symbol><br/>
0296 <Normal Text>            </Normal Text><ControlFlowKeyword>if</ControlFlowKeyword><Normal Text> </Normal Text><Keyword>let</Keyword><Normal Text> </Normal Text><Variable>disable</Variable><Normal Text> </Normal Text><Symbol>=</Symbol><Normal Text> </Normal Text><ControlFlowKeyword>try</ControlFlowKeyword><Normal Text> input</Normal Text><Symbol>[</Symbol><String>"disable"</String><Symbol>].</Symbol><Normal Text>map</Normal Text><Symbol>(</Symbol><Normal Text>parseRules</Normal Text><Symbol>)</Symbol><Normal Text> </Normal Text><Symbol>{</Symbol><br/>
0297 <Normal Text>                input</Normal Text><Symbol>[</Symbol><String>"disable"</String><Symbol>]</Symbol><Normal Text> </Normal Text><Symbol>=</Symbol><Normal Text> Set</Normal Text><Symbol>(</Symbol><Normal Text>disable</Normal Text><Symbol>).</Symbol><Normal Text>union</Normal Text><Symbol>(</Symbol><Normal Text>_disable</Normal Text><Symbol>).</Symbol><Normal Text>sorted</Normal Text><Symbol>().</Symbol><Normal Text>joined</Normal Text><Symbol>(</Symbol><Normal Text>separator</Normal Text><Symbol>:</Symbol><Normal Text> </Normal Text><String>","</String><Symbol>)</Symbol><br/>
0298 <Normal Text>                output</Normal Text><Symbol>[</Symbol><String>"disable"</String><Symbol>]</Symbol><Normal Text> </Normal Text><Symbol>=</Symbol><Normal Text> </Normal Text><Keyword>nil</Keyword><br/>
0299 <Normal Text>            </Normal Text><Symbol>}</Symbol><br/>
0300 <Normal Text>        </Normal Text><Symbol>}</Symbol><br/>
0301 <Normal Text>        </Normal Text><ControlFlowKeyword>if</ControlFlowKeyword><Normal Text> </Normal Text><Keyword>let</Keyword><Normal Text> </Normal Text><Variable>_enable</Variable><Normal Text> </Normal Text><Symbol>=</Symbol><Normal Text> </Normal Text><ControlFlowKeyword>try</ControlFlowKeyword><Normal Text> output</Normal Text><Symbol>[</Symbol><String>"enable"</String><Symbol>].</Symbol><Normal Text>map</Normal Text><Symbol>(</Symbol><Normal Text>parseRules</Normal Text><Symbol>)</Symbol><Normal Text> </Normal Text><Symbol>{</Symbol><br/>
0302 <Normal Text>            </Normal Text><ControlFlowKeyword>if</ControlFlowKeyword><Normal Text> </Normal Text><Keyword>let</Keyword><Normal Text> </Normal Text><Variable>enable</Variable><Normal Text> </Normal Text><Symbol>=</Symbol><Normal Text> </Normal Text><ControlFlowKeyword>try</ControlFlowKeyword><Normal Text> input</Normal Text><Symbol>[</Symbol><String>"enable"</String><Symbol>].</Symbol><Normal Text>map</Normal Text><Symbol>(</Symbol><Normal Text>parseRules</Normal Text><Symbol>)</Symbol><Normal Text> </Normal Text><Symbol>{</Symbol><br/>
0303 <Normal Text>                input</Normal Text><Symbol>[</Symbol><String>"enable"</String><Symbol>]</Symbol><Normal Text> </Normal Text><Symbol>=</Symbol><Normal Text> Set</Normal Text><Symbol>(</Symbol><Normal Text>enable</Normal Text><Symbol>).</Symbol><Normal Text>union</Normal Text><Symbol>(</Symbol><Normal Text>_enable</Normal Text><Symbol>).</Symbol><Normal Text>sorted</Normal Text><Symbol>().</Symbol><Normal Text>joined</Normal Text><Symbol>(</Symbol><Normal Text>separator</Normal Text><Symbol>:</Symbol><Normal Text> </Normal Text><String>","</String><Symbol>)</Symbol><br/>
0304 <Normal Text>                output</Normal Text><Symbol>[</Symbol><String>"enable"</String><Symbol>]</Symbol><Normal Text> </Normal Text><Symbol>=</Symbol><Normal Text> </Normal Text><Keyword>nil</Keyword><br/>
0305 <Normal Text>            </Normal Text><Symbol>}</Symbol><br/>
0306 <Normal Text>            </Normal Text><ControlFlowKeyword>if</ControlFlowKeyword><Normal Text> </Normal Text><Keyword>let</Keyword><Normal Text> </Normal Text><Variable>lintonly</Variable><Normal Text> </Normal Text><Symbol>=</Symbol><Normal Text> </Normal Text><ControlFlowKeyword>try</ControlFlowKeyword><Normal Text> input</Normal Text><Symbol>[</Symbol><String>"lintonly"</String><Symbol>].</Symbol><Normal Text>map</Normal Text><Symbol>(</Symbol><Normal Text>parseRules</Normal Text><Symbol>)</Symbol><Normal Text> </Normal Text><Symbol>{</Symbol><br/>
0307 <Normal Text>                input</Normal Text><Symbol>[</Symbol><String>"lintonly"</String><Symbol>]</Symbol><Normal Text> </Normal Text><Symbol>=</Symbol><Normal Text> Set</Normal Text><Symbol>(</Symbol><Normal Text>lintonly</Normal Text><Symbol>).</Symbol><Normal Text>subtracting</Normal Text><Symbol>(</Symbol><Normal Text>_enable</Normal Text><Symbol>).</Symbol><Normal Text>sorted</Normal Text><Symbol>().</Symbol><Normal Text>joined</Normal Text><Symbol>(</Symbol><Normal Text>separator</Normal Text><Symbol>:</Symbol><Normal Text> </Normal Text><String>","</String><Symbol>)</Symbol><br/>
0308 <Normal Text>            </Normal Text><Symbol>}</Symbol><br/>
0309 <Normal Text>            </Normal Text><ControlFlowKeyword>if</ControlFlowKeyword><Normal Text> </Normal Text><Keyword>let</Keyword><Normal Text> </Normal Text><Variable>disable</Variable><Normal Text> </Normal Text><Symbol>=</Symbol><Normal Text> </Normal Text><ControlFlowKeyword>try</ControlFlowKeyword><Normal Text> input</Normal Text><Symbol>[</Symbol><String>"disable"</String><Symbol>].</Symbol><Normal Text>map</Normal Text><Symbol>(</Symbol><Normal Text>parseRules</Normal Text><Symbol>)</Symbol><Normal Text> </Normal Text><Symbol>{</Symbol><br/>
0310 <Normal Text>                input</Normal Text><Symbol>[</Symbol><String>"disable"</String><Symbol>]</Symbol><Normal Text> </Normal Text><Symbol>=</Symbol><Normal Text> Set</Normal Text><Symbol>(</Symbol><Normal Text>disable</Normal Text><Symbol>).</Symbol><Normal Text>subtracting</Normal Text><Symbol>(</Symbol><Normal Text>_enable</Normal Text><Symbol>).</Symbol><Normal Text>sorted</Normal Text><Symbol>().</Symbol><Normal Text>joined</Normal Text><Symbol>(</Symbol><Normal Text>separator</Normal Text><Symbol>:</Symbol><Normal Text> </Normal Text><String>","</String><Symbol>)</Symbol><br/>
0311 <Normal Text>            </Normal Text><Symbol>}</Symbol><br/>
0312 <Normal Text>        </Normal Text><Symbol>}</Symbol><br/>
0313 <Normal Text>        </Normal Text><ControlFlowKeyword>if</ControlFlowKeyword><Normal Text> </Normal Text><Keyword>let</Keyword><Normal Text> </Normal Text><Variable>_lintonly</Variable><Normal Text> </Normal Text><Symbol>=</Symbol><Normal Text> </Normal Text><ControlFlowKeyword>try</ControlFlowKeyword><Normal Text> output</Normal Text><Symbol>[</Symbol><String>"lintonly"</String><Symbol>].</Symbol><Normal Text>map</Normal Text><Symbol>(</Symbol><Normal Text>parseRules</Normal Text><Symbol>)</Symbol><Normal Text> </Normal Text><Symbol>{</Symbol><br/>
0314 <Normal Text>            </Normal Text><ControlFlowKeyword>if</ControlFlowKeyword><Normal Text> </Normal Text><Keyword>let</Keyword><Normal Text> </Normal Text><Variable>lintonly</Variable><Normal Text> </Normal Text><Symbol>=</Symbol><Normal Text> </Normal Text><ControlFlowKeyword>try</ControlFlowKeyword><Normal Text> input</Normal Text><Symbol>[</Symbol><String>"lintonly"</String><Symbol>].</Symbol><Normal Text>map</Normal Text><Symbol>(</Symbol><Normal Text>parseRules</Normal Text><Symbol>)</Symbol><Normal Text> </Normal Text><Symbol>{</Symbol><br/>
0315 <Normal Text>                input</Normal Text><Symbol>[</Symbol><String>"lintonly"</String><Symbol>]</Symbol><Normal Text> </Normal Text><Symbol>=</Symbol><Normal Text> Set</Normal Text><Symbol>(</Symbol><Normal Text>lintonly</Normal Text><Symbol>).</Symbol><Normal Text>union</Normal Text><Symbol>(</Symbol><Normal Text>_lintonly</Normal Text><Symbol>).</Symbol><Normal Text>sorted</Normal Text><Symbol>().</Symbol><Normal Text>joined</Normal Text><Symbol>(</Symbol><Normal Text>separator</Normal Text><Symbol>:</Symbol><Normal Text> </Normal Text><String>","</String><Symbol>)</Symbol><br/>
0316 <Normal Text>                output</Normal Text><Symbol>[</Symbol><String>"lintonly"</String><Symbol>]</Symbol><Normal Text> </Normal Text><Symbol>=</Symbol><Normal Text> </Normal Text><Keyword>nil</Keyword><br/>
0317 <Normal Text>            </Normal Text><Symbol>}</Symbol><br/>
0318 <Normal Text>        </Normal Text><Symbol>}</Symbol><br/>
0319 <Normal Text>    </Normal Text><Symbol>}</Symbol><br/>
0320 <Normal Text>    </Normal Text><Comment>// Merge other arguments</Comment><br/>
0321 <Normal Text>    </Normal Text><ControlFlowKeyword>for</ControlFlowKeyword><Normal Text> </Normal Text><Symbol>(</Symbol><Normal Text>key</Normal Text><Symbol>,</Symbol><Normal Text> inValue</Normal Text><Symbol>)</Symbol><Normal Text> </Normal Text><ControlFlowKeyword>in</ControlFlowKeyword><Normal Text> input </Normal Text><Symbol>{</Symbol><br/>
0322 <Normal Text>        </Normal Text><ControlFlowKeyword>guard</ControlFlowKeyword><Normal Text> </Normal Text><Keyword>let</Keyword><Normal Text> </Normal Text><Variable>outValue</Variable><Normal Text> </Normal Text><Symbol>=</Symbol><Normal Text> output</Normal Text><Symbol>[</Symbol><Normal Text>key</Normal Text><Symbol>]</Symbol><Normal Text> </Normal Text><ControlFlowKeyword>else</ControlFlowKeyword><Normal Text> </Normal Text><Symbol>{</Symbol><br/>
0323 <Normal Text>            output</Normal Text><Symbol>[</Symbol><Normal Text>key</Normal Text><Symbol>]</Symbol><Normal Text> </Normal Text><Symbol>=</Symbol><Normal Text> inValue</Normal Text><br/>
0324 <Normal Text>            </Normal Text><ControlFlowKeyword>continue</ControlFlowKeyword><br/>
0325 <Normal Text>        </Normal Text><Symbol>}</Symbol><br/>
0326 <Normal Text>        </Normal Text><ControlFlowKeyword>if</ControlFlowKeyword><Normal Text> Descriptors</Normal Text><Symbol>.</Symbol><Normal Text>all</Normal Text><Symbol>.</Symbol><Normal Text>contains</Normal Text><Symbol>(</Symbol><Keyword>where</Keyword><Symbol>:</Symbol><Normal Text> </Normal Text><Symbol>{</Symbol><Normal Text> $</Normal Text><Float>0.</Float><Normal Text>argumentName </Normal Text><Symbol>==</Symbol><Normal Text> key </Normal Text><Symbol>&&</Symbol><Normal Text> $</Normal Text><Float>0.</Float><Normal Text>isSetType </Normal Text><Symbol>})</Symbol><Normal Text> </Normal Text><Symbol>{</Symbol><br/>
0327 <Normal Text>            </Normal Text><Keyword>let</Keyword><Normal Text> </Normal Text><Variable>inOptions</Variable><Normal Text> </Normal Text><Symbol>=</Symbol><Normal Text> parseCommaDelimitedList</Normal Text><Symbol>(</Symbol><Normal Text>inValue</Normal Text><Symbol>)</Symbol><br/>
0328 <Normal Text>            </Normal Text><Keyword>let</Keyword><Normal Text> </Normal Text><Variable>outOptions</Variable><Normal Text> </Normal Text><Symbol>=</Symbol><Normal Text> parseCommaDelimitedList</Normal Text><Symbol>(</Symbol><Normal Text>outValue</Normal Text><Symbol>)</Symbol><br/>
0329 <Normal Text>            output</Normal Text><Symbol>[</Symbol><Normal Text>key</Normal Text><Symbol>]</Symbol><Normal Text> </Normal Text><Symbol>=</Symbol><Normal Text> Set</Normal Text><Symbol>(</Symbol><Normal Text>inOptions</Normal Text><Symbol>).</Symbol><Normal Text>union</Normal Text><Symbol>(</Symbol><Normal Text>outOptions</Normal Text><Symbol>).</Symbol><Normal Text>sorted</Normal Text><Symbol>().</Symbol><Normal Text>joined</Normal Text><Symbol>(</Symbol><Normal Text>separator</Normal Text><Symbol>:</Symbol><Normal Text> </Normal Text><String>","</String><Symbol>)</Symbol><br/>
0330 <Normal Text>        </Normal Text><Symbol>}</Symbol><br/>
0331 <Normal Text>    </Normal Text><Symbol>}</Symbol><br/>
0332 <Normal Text>    </Normal Text><Keyword>return</Keyword><Normal Text> output</Normal Text><br/>
0333 <Symbol>}</Symbol><br/>
0334 <Normal Text></Normal Text><br/>
0335 <Comment>// Parse a configuration file into a dictionary of arguments</Comment><br/>
0336 <Keyword>public</Keyword><Normal Text> </Normal Text><Keyword>func</Keyword><Normal Text> </Normal Text><Function>parseConfigFile</Function><Symbol>(</Symbol><Variable>_</Variable><Normal Text> </Normal Text><Variable>data</Variable><Symbol>:</Symbol><Normal Text> </Normal Text><Data Type>Data</Data Type><Symbol>)</Symbol><Normal Text> </Normal Text><Keyword>throws</Keyword><Normal Text> -> [</Normal Text><Function>String</Function><Symbol>:</Symbol><Normal Text> </Normal Text><Data Type>String</Data Type><Normal Text>] </Normal Text><Symbol>{</Symbol><br/>
0337 <Normal Text>    </Normal Text><ControlFlowKeyword>guard</ControlFlowKeyword><Normal Text> </Normal Text><Keyword>let</Keyword><Normal Text> </Normal Text><Variable>input</Variable><Normal Text> </Normal Text><Symbol>=</Symbol><Normal Text> String</Normal Text><Symbol>(</Symbol><Normal Text>data</Normal Text><Symbol>:</Symbol><Normal Text> data</Normal Text><Symbol>,</Symbol><Normal Text> encoding</Normal Text><Symbol>:</Symbol><Normal Text> </Normal Text><Symbol>.</Symbol><Normal Text>utf8</Normal Text><Symbol>)</Symbol><Normal Text> </Normal Text><ControlFlowKeyword>else</ControlFlowKeyword><Normal Text> </Normal Text><Symbol>{</Symbol><br/>
0338 <Normal Text>        </Normal Text><Keyword>throw</Keyword><Normal Text> FormatError</Normal Text><Symbol>.</Symbol><Normal Text>reading</Normal Text><Symbol>(</Symbol><String>"Unable to read data for configuration file"</String><Symbol>)</Symbol><br/>
0339 <Normal Text>    </Normal Text><Symbol>}</Symbol><br/>
0340 <Normal Text>    </Normal Text><Keyword>let</Keyword><Normal Text> </Normal Text><Variable>lines</Variable><Normal Text> </Normal Text><Symbol>=</Symbol><Normal Text> </Normal Text><ControlFlowKeyword>try</ControlFlowKeyword><Normal Text> cumulate</Normal Text><Symbol>(</Symbol><Normal Text>successiveLines</Normal Text><Symbol>:</Symbol><Normal Text> input</Normal Text><Symbol>.</Symbol><Normal Text>components</Normal Text><Symbol>(</Symbol><Normal Text>separatedBy</Normal Text><Symbol>:</Symbol><Normal Text> </Normal Text><Symbol>.</Symbol><Normal Text>newlines</Normal Text><Symbol>))</Symbol><br/>
0341 <Normal Text>    </Normal Text><Keyword>let</Keyword><Normal Text> </Normal Text><Variable>arguments</Variable><Normal Text> </Normal Text><Symbol>=</Symbol><Normal Text> </Normal Text><ControlFlowKeyword>try</ControlFlowKeyword><Normal Text> lines</Normal Text><Symbol>.</Symbol><Normal Text>flatMap </Normal Text><Symbol>{</Symbol><Normal Text> line </Normal Text><Symbol>-></Symbol><Normal Text> </Normal Text><Symbol>[</Symbol><Normal Text>String</Normal Text><Symbol>]</Symbol><Normal Text> </Normal Text><ControlFlowKeyword>in</ControlFlowKeyword><br/>
0342 <Normal Text>        </Normal Text><Comment>// </Comment><Alert Level 2>TODO</Alert Level 2><Comment>: parseArguments isn't a perfect fit here - should we use a different approach?</Comment><br/>
0343 <Normal Text>        </Normal Text><Keyword>let</Keyword><Normal Text> </Normal Text><Variable>line</Variable><Normal Text> </Normal Text><Symbol>=</Symbol><Normal Text> line</Normal Text><Symbol>.</Symbol><Normal Text>replacingOccurrences</Normal Text><Symbol>(</Symbol><Normal Text>of</Normal Text><Symbol>:</Symbol><Normal Text> </Normal Text><String>"</String><String Char>\\</String Char><String>n"</String><Symbol>,</Symbol><Normal Text> with</Normal Text><Symbol>:</Symbol><Normal Text> </Normal Text><String>"</String><String Char>\n</String Char><String>"</String><Symbol>)</Symbol><br/>
0344 <Normal Text>        </Normal Text><Keyword>let</Keyword><Normal Text> </Normal Text><Variable>parts</Variable><Normal Text> </Normal Text><Symbol>=</Symbol><Normal Text> parseArguments</Normal Text><Symbol>(</Symbol><Normal Text>line</Normal Text><Symbol>,</Symbol><Normal Text> ignoreComments</Normal Text><Symbol>:</Symbol><Normal Text> </Normal Text><Keyword>false</Keyword><Symbol>).</Symbol><Normal Text>dropFirst</Normal Text><Symbol>().</Symbol><Normal Text>map </Normal Text><Symbol>{</Symbol><br/>
0345 <Normal Text>            $</Normal Text><Float>0.</Float><Normal Text>replacingOccurrences</Normal Text><Symbol>(</Symbol><Normal Text>of</Normal Text><Symbol>:</Symbol><Normal Text> </Normal Text><String>"</String><String Char>\n</String Char><String>"</String><Symbol>,</Symbol><Normal Text> with</Normal Text><Symbol>:</Symbol><Normal Text> </Normal Text><String>"</String><String Char>\\</String Char><String>n"</String><Symbol>)</Symbol><br/>
0346 <Normal Text>        </Normal Text><Symbol>}</Symbol><br/>
0347 <Normal Text>        </Normal Text><ControlFlowKeyword>guard</ControlFlowKeyword><Normal Text> </Normal Text><Keyword>let</Keyword><Normal Text> </Normal Text><Variable>key</Variable><Normal Text> </Normal Text><Symbol>=</Symbol><Normal Text> parts</Normal Text><Symbol>.</Symbol><Normal Text>first </Normal Text><ControlFlowKeyword>else</ControlFlowKeyword><Normal Text> </Normal Text><Symbol>{</Symbol><br/>
0348 <Normal Text>            </Normal Text><Keyword>return</Keyword><Normal Text> </Normal Text><Symbol>[]</Symbol><br/>
0349 <Normal Text>        </Normal Text><Symbol>}</Symbol><br/>
0350 <Normal Text>        </Normal Text><ControlFlowKeyword>if</ControlFlowKeyword><Normal Text> </Normal Text><Symbol>!</Symbol><Normal Text>key</Normal Text><Symbol>.</Symbol><Normal Text>hasPrefix</Normal Text><Symbol>(</Symbol><String>"-"</String><Symbol>)</Symbol><Normal Text> </Normal Text><Symbol>{</Symbol><br/>
0351 <Normal Text>            </Normal Text><Keyword>throw</Keyword><Normal Text> FormatError</Normal Text><Symbol>.</Symbol><Normal Text>options</Normal Text><Symbol>(</Symbol><String>"Unknown option '</String><Error>\(</Error><String>key)' in configuration file"</String><Symbol>)</Symbol><br/>
0352 <Normal Text>        </Normal Text><Symbol>}</Symbol><br/>
0353 <Normal Text>        </Normal Text><Keyword>return</Keyword><Normal Text> </Normal Text><Symbol>[</Symbol><Normal Text>key</Normal Text><Symbol>,</Symbol><Normal Text> parts</Normal Text><Symbol>.</Symbol><Normal Text>dropFirst</Normal Text><Symbol>().</Symbol><Normal Text>joined</Normal Text><Symbol>(</Symbol><Normal Text>separator</Normal Text><Symbol>:</Symbol><Normal Text> </Normal Text><String>" "</String><Symbol>)]</Symbol><br/>
0354 <Normal Text>    </Normal Text><Symbol>}</Symbol><br/>
0355 <Normal Text>    </Normal Text><ControlFlowKeyword>do</ControlFlowKeyword><Normal Text> </Normal Text><Symbol>{</Symbol><br/>
0356 <Normal Text>        </Normal Text><Keyword>return</Keyword><Normal Text> </Normal Text><ControlFlowKeyword>try</ControlFlowKeyword><Normal Text> preprocessArguments</Normal Text><Symbol>(</Symbol><Normal Text>arguments</Normal Text><Symbol>,</Symbol><Normal Text> optionsArguments</Normal Text><Symbol>)</Symbol><br/>
0357 <Normal Text>    </Normal Text><Symbol>}</Symbol><Normal Text> </Normal Text><ControlFlowKeyword>catch</ControlFlowKeyword><Normal Text> </Normal Text><Keyword>let</Keyword><Normal Text> </Normal Text><Variable>FormatError</Variable><Symbol>.</Symbol><Normal Text>options</Normal Text><Symbol>(</Symbol><Normal Text>message</Normal Text><Symbol>)</Symbol><Normal Text> </Normal Text><Symbol>{</Symbol><br/>
0358 <Normal Text>        </Normal Text><Keyword>throw</Keyword><Normal Text> FormatError</Normal Text><Symbol>.</Symbol><Normal Text>options</Normal Text><Symbol>(</Symbol><String>"</String><Error>\(</Error><String>message) in configuration file"</String><Symbol>)</Symbol><br/>
0359 <Normal Text>    </Normal Text><Symbol>}</Symbol><br/>
0360 <Symbol>}</Symbol><br/>
0361 <Normal Text></Normal Text><br/>
0362 <Keyword>private</Keyword><Normal Text> </Normal Text><Keyword>func</Keyword><Normal Text> </Normal Text><Function>cumulate</Function><Symbol>(</Symbol><Variable>successiveLines</Variable><Symbol>:</Symbol><Normal Text> [</Normal Text><Data Type>String</Data Type><Normal Text>]</Normal Text><Symbol>)</Symbol><Normal Text> </Normal Text><Keyword>throws</Keyword><Normal Text> -> [</Normal Text><Function>String</Function><Normal Text>] </Normal Text><Symbol>{</Symbol><br/>
0363 <Normal Text>    </Normal Text><Keyword>var</Keyword><Normal Text> </Normal Text><Variable>cumulatedLines</Variable><Normal Text> </Normal Text><Symbol>=</Symbol><Normal Text> </Normal Text><Symbol>[</Symbol><Normal Text>String</Normal Text><Symbol>]()</Symbol><br/>
0364 <Normal Text>    </Normal Text><Keyword>var</Keyword><Normal Text> </Normal Text><Variable>iterator</Variable><Normal Text> </Normal Text><Symbol>=</Symbol><Normal Text> successiveLines</Normal Text><Symbol>.</Symbol><Normal Text>makeIterator</Normal Text><Symbol>()</Symbol><br/>
0365 <Normal Text>    </Normal Text><ControlFlowKeyword>while</ControlFlowKeyword><Normal Text> </Normal Text><Keyword>let</Keyword><Normal Text> </Normal Text><Variable>currentLine</Variable><Normal Text> </Normal Text><Symbol>=</Symbol><Normal Text> iterator</Normal Text><Symbol>.</Symbol><Normal Text>next</Normal Text><Symbol>()</Symbol><Normal Text> </Normal Text><Symbol>{</Symbol><br/>
0366 <Normal Text>        </Normal Text><Keyword>var</Keyword><Normal Text> </Normal Text><Variable>cumulatedLine</Variable><Normal Text> </Normal Text><Symbol>=</Symbol><Normal Text> effectiveContent</Normal Text><Symbol>(</Symbol><Normal Text>of</Normal Text><Symbol>:</Symbol><Normal Text> currentLine</Normal Text><Symbol>)</Symbol><br/>
0367 <Normal Text>        </Normal Text><ControlFlowKeyword>while</ControlFlowKeyword><Normal Text> cumulatedLine</Normal Text><Symbol>.</Symbol><Normal Text>hasSuffix</Normal Text><Symbol>(</Symbol><String>"</String><String Char>\\</String Char><String>"</String><Symbol>)</Symbol><Normal Text> </Normal Text><Symbol>{</Symbol><br/>
0368 <Normal Text>            </Normal Text><ControlFlowKeyword>guard</ControlFlowKeyword><Normal Text> </Normal Text><Keyword>let</Keyword><Normal Text> </Normal Text><Variable>nextLine</Variable><Normal Text> </Normal Text><Symbol>=</Symbol><Normal Text> iterator</Normal Text><Symbol>.</Symbol><Normal Text>next</Normal Text><Symbol>()</Symbol><Normal Text> </Normal Text><ControlFlowKeyword>else</ControlFlowKeyword><Normal Text> </Normal Text><Symbol>{</Symbol><br/>
0369 <Normal Text>                </Normal Text><Keyword>throw</Keyword><Normal Text> FormatError</Normal Text><Symbol>.</Symbol><Normal Text>reading</Normal Text><Symbol>(</Symbol><String>"Configuration file ends with an illegal line continuation character '</String><String Char>\'</String Char><String>"</String><Symbol>)</Symbol><br/>
0370 <Normal Text>            </Normal Text><Symbol>}</Symbol><br/>
0371 <Normal Text>            </Normal Text><ControlFlowKeyword>if</ControlFlowKeyword><Normal Text> </Normal Text><Symbol>!</Symbol><Normal Text>nextLine</Normal Text><Symbol>.</Symbol><Normal Text>trimmingCharacters</Normal Text><Symbol>(</Symbol><ControlFlowKeyword>in</ControlFlowKeyword><Symbol>:</Symbol><Normal Text> </Normal Text><Symbol>.</Symbol><Normal Text>whitespaces</Normal Text><Symbol>).</Symbol><Normal Text>starts</Normal Text><Symbol>(</Symbol><Normal Text>with</Normal Text><Symbol>:</Symbol><Normal Text> </Normal Text><String>"#"</String><Symbol>)</Symbol><Normal Text> </Normal Text><Symbol>{</Symbol><br/>
0372 <Normal Text>                cumulatedLine </Normal Text><Symbol>=</Symbol><Normal Text> cumulatedLine</Normal Text><Symbol>.</Symbol><Normal Text>dropLast</Normal Text><Symbol>()</Symbol><Normal Text> </Normal Text><Symbol>+</Symbol><Normal Text> effectiveContent</Normal Text><Symbol>(</Symbol><Normal Text>of</Normal Text><Symbol>:</Symbol><Normal Text> nextLine</Normal Text><Symbol>)</Symbol><br/>
0373 <Normal Text>            </Normal Text><Symbol>}</Symbol><br/>
0374 <Normal Text>        </Normal Text><Symbol>}</Symbol><br/>
0375 <Normal Text>        cumulatedLines</Normal Text><Symbol>.</Symbol><Normal Text>append</Normal Text><Symbol>(</Symbol><Normal Text>String</Normal Text><Symbol>(</Symbol><Normal Text>cumulatedLine</Normal Text><Symbol>))</Symbol><br/>
0376 <Normal Text>    </Normal Text><Symbol>}</Symbol><br/>
0377 <Normal Text>    </Normal Text><Keyword>return</Keyword><Normal Text> cumulatedLines</Normal Text><br/>
0378 <Symbol>}</Symbol><br/>
0379 <Normal Text></Normal Text><br/>
0380 <Keyword>private</Keyword><Normal Text> </Normal Text><Keyword>func</Keyword><Normal Text> </Normal Text><Function>effectiveContent</Function><Symbol>(</Symbol><Variable>of</Variable><Normal Text> </Normal Text><Variable>line</Variable><Symbol>:</Symbol><Normal Text> </Normal Text><Data Type>String</Data Type><Symbol>)</Symbol><Normal Text> -> </Normal Text><Function>String</Function><Normal Text> </Normal Text><Symbol>{</Symbol><br/>
0381 <Normal Text>    </Normal Text><Keyword>return</Keyword><Normal Text> line</Normal Text><br/>
0382 <Normal Text>        </Normal Text><Symbol>.</Symbol><Normal Text>prefix </Normal Text><Symbol>{</Symbol><Normal Text> $</Normal Text><Decimal>0</Decimal><Normal Text> </Normal Text><Symbol>!=</Symbol><Normal Text> </Normal Text><String>"#"</String><Normal Text> </Normal Text><Symbol>}</Symbol><br/>
0383 <Normal Text>        </Normal Text><Symbol>.</Symbol><Normal Text>trimmingCharacters</Normal Text><Symbol>(</Symbol><ControlFlowKeyword>in</ControlFlowKeyword><Symbol>:</Symbol><Normal Text> </Normal Text><Symbol>.</Symbol><Normal Text>whitespaces</Normal Text><Symbol>)</Symbol><br/>
0384 <Symbol>}</Symbol><br/>
0385 <Normal Text></Normal Text><br/>
0386 <Comment>// Serialize a set of options into either an arguments string or a file</Comment><br/>
0387 <Keyword>func</Keyword><Normal Text> </Normal Text><Function>serialize</Function><Symbol>(</Symbol><Variable>options</Variable><Symbol>:</Symbol><Normal Text> </Normal Text><Data Type>Options</Data Type><Symbol>,</Symbol><br/>
0388 <Normal Text>               </Normal Text><Variable>swiftVersion</Variable><Symbol>:</Symbol><Normal Text> </Normal Text><Data Type>Version</Data Type><Normal Text> </Normal Text><Symbol>=</Symbol><Normal Text> </Normal Text><Symbol>.</Symbol><Normal Text>undefined</Normal Text><Symbol>,</Symbol><br/>
0389 <Normal Text>               </Normal Text><Variable>excludingDefaults</Variable><Symbol>:</Symbol><Normal Text> </Normal Text><Data Type>Bool</Data Type><Normal Text> </Normal Text><Symbol>=</Symbol><Normal Text> false</Normal Text><Symbol>,</Symbol><br/>
0390 <Normal Text>               </Normal Text><Variable>separator</Variable><Symbol>:</Symbol><Normal Text> </Normal Text><Data Type>String</Data Type><Normal Text> </Normal Text><Symbol>=</Symbol><Normal Text> </Normal Text><String>"</String><String Char>\n</String Char><String>"</String><Symbol>)</Symbol><Normal Text> -> </Normal Text><Function>String</Function><br/>
0391 <Symbol>{</Symbol><br/>
0392 <Normal Text>    </Normal Text><Keyword>var</Keyword><Normal Text> </Normal Text><Variable>arguments</Variable><Normal Text> </Normal Text><Symbol>=</Symbol><Normal Text> </Normal Text><Symbol>[[</Symbol><Normal Text>String</Normal Text><Symbol>:</Symbol><Normal Text> String</Normal Text><Symbol>]]()</Symbol><br/>
0393 <Normal Text>    </Normal Text><ControlFlowKeyword>if</ControlFlowKeyword><Normal Text> </Normal Text><Keyword>let</Keyword><Normal Text> </Normal Text><Variable>fileOptions</Variable><Normal Text> </Normal Text><Symbol>=</Symbol><Normal Text> options</Normal Text><Symbol>.</Symbol><Normal Text>fileOptions </Normal Text><Symbol>{</Symbol><br/>
0394 <Normal Text>        arguments</Normal Text><Symbol>.</Symbol><Normal Text>append</Normal Text><Symbol>(</Symbol><Normal Text>argumentsFor</Normal Text><Symbol>(</Symbol><br/>
0395 <Normal Text>            Options</Normal Text><Symbol>(</Symbol><Normal Text>fileOptions</Normal Text><Symbol>:</Symbol><Normal Text> fileOptions</Normal Text><Symbol>),</Symbol><br/>
0396 <Normal Text>            excludingDefaults</Normal Text><Symbol>:</Symbol><Normal Text> excludingDefaults</Normal Text><br/>
0397 <Normal Text>        </Normal Text><Symbol>))</Symbol><br/>
0398 <Normal Text>    </Normal Text><Symbol>}</Symbol><br/>
0399 <Normal Text>    </Normal Text><ControlFlowKeyword>if</ControlFlowKeyword><Normal Text> </Normal Text><Keyword>let</Keyword><Normal Text> </Normal Text><Variable>formatOptions</Variable><Normal Text> </Normal Text><Symbol>=</Symbol><Normal Text> options</Normal Text><Symbol>.</Symbol><Normal Text>formatOptions </Normal Text><Symbol>{</Symbol><br/>
0400 <Normal Text>        arguments</Normal Text><Symbol>.</Symbol><Normal Text>append</Normal Text><Symbol>(</Symbol><Normal Text>argumentsFor</Normal Text><Symbol>(</Symbol><br/>
0401 <Normal Text>            Options</Normal Text><Symbol>(</Symbol><Normal Text>formatOptions</Normal Text><Symbol>:</Symbol><Normal Text> formatOptions</Normal Text><Symbol>),</Symbol><br/>
0402 <Normal Text>            excludingDefaults</Normal Text><Symbol>:</Symbol><Normal Text> excludingDefaults</Normal Text><br/>
0403 <Normal Text>        </Normal Text><Symbol>))</Symbol><br/>
0404 <Normal Text>    </Normal Text><Symbol>}</Symbol><Normal Text> </Normal Text><ControlFlowKeyword>else</ControlFlowKeyword><Normal Text> </Normal Text><ControlFlowKeyword>if</ControlFlowKeyword><Normal Text> swiftVersion </Normal Text><Symbol>!=</Symbol><Normal Text> </Normal Text><Symbol>.</Symbol><Normal Text>undefined </Normal Text><Symbol>{</Symbol><br/>
0405 <Normal Text>        </Normal Text><Keyword>let</Keyword><Normal Text> </Normal Text><Variable>descriptor</Variable><Normal Text> </Normal Text><Symbol>=</Symbol><Normal Text> Descriptors</Normal Text><Symbol>.</Symbol><Normal Text>swiftVersion</Normal Text><br/>
0406 <Normal Text>        arguments</Normal Text><Symbol>.</Symbol><Normal Text>append</Normal Text><Symbol>([</Symbol><Normal Text>descriptor</Normal Text><Symbol>.</Symbol><Normal Text>argumentName</Normal Text><Symbol>:</Symbol><Normal Text> swiftVersion</Normal Text><Symbol>.</Symbol><Normal Text>rawValue</Normal Text><Symbol>])</Symbol><br/>
0407 <Normal Text>    </Normal Text><Symbol>}</Symbol><br/>
0408 <Normal Text>    </Normal Text><ControlFlowKeyword>if</ControlFlowKeyword><Normal Text> </Normal Text><Keyword>let</Keyword><Normal Text> </Normal Text><Variable>rules</Variable><Normal Text> </Normal Text><Symbol>=</Symbol><Normal Text> options</Normal Text><Symbol>.</Symbol><Normal Text>rules </Normal Text><Symbol>{</Symbol><br/>
0409 <Normal Text>        arguments</Normal Text><Symbol>.</Symbol><Normal Text>append</Normal Text><Symbol>(</Symbol><Normal Text>argumentsFor</Normal Text><Symbol>(</Symbol><br/>
0410 <Normal Text>            Options</Normal Text><Symbol>(</Symbol><Normal Text>rules</Normal Text><Symbol>:</Symbol><Normal Text> rules</Normal Text><Symbol>),</Symbol><br/>
0411 <Normal Text>            excludingDefaults</Normal Text><Symbol>:</Symbol><Normal Text> excludingDefaults</Normal Text><br/>
0412 <Normal Text>        </Normal Text><Symbol>))</Symbol><br/>
0413 <Normal Text>    </Normal Text><Symbol>}</Symbol><br/>
0414 <Normal Text>    </Normal Text><Keyword>return</Keyword><Normal Text> arguments</Normal Text><br/>
0415 <Normal Text>        </Normal Text><Symbol>.</Symbol><Normal Text>map </Normal Text><Symbol>{</Symbol><Normal Text> serialize</Normal Text><Symbol>(</Symbol><Normal Text>arguments</Normal Text><Symbol>:</Symbol><Normal Text> $</Normal Text><Decimal>0</Decimal><Symbol>,</Symbol><Normal Text> separator</Normal Text><Symbol>:</Symbol><Normal Text> separator</Normal Text><Symbol>)</Symbol><Normal Text> </Normal Text><Symbol>}</Symbol><br/>
0416 <Normal Text>        </Normal Text><Symbol>.</Symbol><Normal Text>filter </Normal Text><Symbol>{</Symbol><Normal Text> </Normal Text><Symbol>!</Symbol><Normal Text>$</Normal Text><Float>0.</Float><Normal Text>isEmpty </Normal Text><Symbol>}</Symbol><br/>
0417 <Normal Text>        </Normal Text><Symbol>.</Symbol><Normal Text>joined</Normal Text><Symbol>(</Symbol><Normal Text>separator</Normal Text><Symbol>:</Symbol><Normal Text> separator</Normal Text><Symbol>)</Symbol><br/>
0418 <Symbol>}</Symbol><br/>
0419 <Normal Text></Normal Text><br/>
0420 <Comment>// Serialize arguments</Comment><br/>
0421 <Keyword>func</Keyword><Normal Text> </Normal Text><Function>serialize</Function><Symbol>(</Symbol><Variable>arguments</Variable><Symbol>:</Symbol><Normal Text> [</Normal Text><Data Type>String</Data Type><Symbol>:</Symbol><Normal Text> </Normal Text><Data Type>String</Data Type><Normal Text>]</Normal Text><Symbol>,</Symbol><br/>
0422 <Normal Text>               </Normal Text><Variable>separator</Variable><Symbol>:</Symbol><Normal Text> </Normal Text><Data Type>String</Data Type><Normal Text> </Normal Text><Symbol>=</Symbol><Normal Text> </Normal Text><String>"</String><String Char>\n</String Char><String>"</String><Symbol>)</Symbol><Normal Text> -> </Normal Text><Function>String</Function><br/>
0423 <Symbol>{</Symbol><br/>
0424 <Normal Text>    </Normal Text><Keyword>return</Keyword><Normal Text> arguments</Normal Text><Symbol>.</Symbol><Normal Text>map </Normal Text><Symbol>{</Symbol><br/>
0425 <Normal Text>        </Normal Text><Keyword>var</Keyword><Normal Text> </Normal Text><Variable>value</Variable><Normal Text> </Normal Text><Symbol>=</Symbol><Normal Text> $</Normal Text><Decimal>1</Decimal><br/>
0426 <Normal Text>        </Normal Text><ControlFlowKeyword>if</ControlFlowKeyword><Normal Text> value</Normal Text><Symbol>.</Symbol><Normal Text>contains</Normal Text><Symbol>(</Symbol><String>" "</String><Symbol>)</Symbol><Normal Text> </Normal Text><Symbol>{</Symbol><br/>
0427 <Normal Text>            value </Normal Text><Symbol>=</Symbol><Normal Text> </Normal Text><String>"</String><String Char>\"</String Char><Error>\(</Error><String>value.replacingOccurrences(of: "</String><Normal Text>\</Normal Text><String>""</String><Symbol>,</Symbol><Normal Text> with</Normal Text><Symbol>:</Symbol><Normal Text> </Normal Text><String>"</String><String Char>\\\"</String Char><String>"</String><Symbol>))</Symbol><Normal Text>\</Normal Text><String>""</String><br/>
0428 <Normal Text>        </Normal Text><Symbol>}</Symbol><br/>
0429 <Normal Text>        </Normal Text><Keyword>return</Keyword><Normal Text> </Normal Text><String>"--</String><Error>\(</Error><String Interpolation>$</String Interpolation><String>0) </String><Error>\(</Error><String>value)"</String><br/>
0430 <Normal Text>    </Normal Text><Symbol>}.</Symbol><Normal Text>sorted</Normal Text><Symbol>().</Symbol><Normal Text>joined</Normal Text><Symbol>(</Symbol><Normal Text>separator</Normal Text><Symbol>:</Symbol><Normal Text> separator</Normal Text><Symbol>)</Symbol><br/>
0431 <Symbol>}</Symbol><br/>
0432 <Normal Text></Normal Text><br/>
0433 <Comment>// Get command line arguments from options</Comment><br/>
0434 <Keyword>func</Keyword><Normal Text> </Normal Text><Function>argumentsFor</Function><Symbol>(</Symbol><Variable>_</Variable><Normal Text> </Normal Text><Variable>options</Variable><Symbol>:</Symbol><Normal Text> </Normal Text><Data Type>Options</Data Type><Symbol>,</Symbol><Normal Text> </Normal Text><Variable>excludingDefaults</Variable><Symbol>:</Symbol><Normal Text> </Normal Text><Data Type>Bool</Data Type><Normal Text> </Normal Text><Symbol>=</Symbol><Normal Text> false</Normal Text><Symbol>)</Symbol><Normal Text> -> [</Normal Text><Function>String</Function><Symbol>:</Symbol><Normal Text> </Normal Text><Data Type>String</Data Type><Normal Text>] </Normal Text><Symbol>{</Symbol><br/>
0435 <Normal Text>    </Normal Text><Keyword>var</Keyword><Normal Text> </Normal Text><Variable>args</Variable><Normal Text> </Normal Text><Symbol>=</Symbol><Normal Text> </Normal Text><Symbol>[</Symbol><Normal Text>String</Normal Text><Symbol>:</Symbol><Normal Text> String</Normal Text><Symbol>]()</Symbol><br/>
0436 <Normal Text>    </Normal Text><ControlFlowKeyword>if</ControlFlowKeyword><Normal Text> </Normal Text><Keyword>let</Keyword><Normal Text> </Normal Text><Variable>fileOptions</Variable><Normal Text> </Normal Text><Symbol>=</Symbol><Normal Text> options</Normal Text><Symbol>.</Symbol><Normal Text>fileOptions </Normal Text><Symbol>{</Symbol><br/>
0437 <Normal Text>        </Normal Text><Keyword>var</Keyword><Normal Text> </Normal Text><Variable>arguments</Variable><Normal Text> </Normal Text><Symbol>=</Symbol><Normal Text> Set</Normal Text><Symbol>(</Symbol><Normal Text>fileArguments</Normal Text><Symbol>)</Symbol><br/>
0438 <Normal Text>        </Normal Text><ControlFlowKeyword>do</ControlFlowKeyword><Normal Text> </Normal Text><Symbol>{</Symbol><br/>
0439 <Normal Text>            </Normal Text><ControlFlowKeyword>if</ControlFlowKeyword><Normal Text> </Normal Text><Symbol>!</Symbol><Normal Text>excludingDefaults </Normal Text><Symbol>||</Symbol><Normal Text> fileOptions</Normal Text><Symbol>.</Symbol><Normal Text>followSymlinks </Normal Text><Symbol>!=</Symbol><Normal Text> FileOptions</Normal Text><Symbol>.</Symbol><Keyword>default</Keyword><Symbol>.</Symbol><Normal Text>followSymlinks </Normal Text><Symbol>{</Symbol><br/>
0440 <Normal Text>                args</Normal Text><Symbol>[</Symbol><String>"symlinks"</String><Symbol>]</Symbol><Normal Text> </Normal Text><Symbol>=</Symbol><Normal Text> fileOptions</Normal Text><Symbol>.</Symbol><Normal Text>followSymlinks </Normal Text><Symbol>?</Symbol><Normal Text> </Normal Text><String>"follow"</String><Normal Text> </Normal Text><Symbol>:</Symbol><Normal Text> </Normal Text><String>"ignore"</String><br/>
0441 <Normal Text>            </Normal Text><Symbol>}</Symbol><br/>
0442 <Normal Text>            arguments</Normal Text><Symbol>.</Symbol><Normal Text>remove</Normal Text><Symbol>(</Symbol><String>"symlinks"</String><Symbol>)</Symbol><br/>
0443 <Normal Text>        </Normal Text><Symbol>}</Symbol><br/>
0444 <Normal Text>        </Normal Text><ControlFlowKeyword>do</ControlFlowKeyword><Normal Text> </Normal Text><Symbol>{</Symbol><br/>
0445 <Normal Text>            </Normal Text><ControlFlowKeyword>if</ControlFlowKeyword><Normal Text> </Normal Text><Symbol>!</Symbol><Normal Text>fileOptions</Normal Text><Symbol>.</Symbol><Normal Text>excludedGlobs</Normal Text><Symbol>.</Symbol><Normal Text>isEmpty </Normal Text><Symbol>{</Symbol><br/>
0446 <Normal Text>                </Normal Text><Comment>// </Comment><Alert Level 2>TODO</Alert Level 2><Comment>: find a better alternative to stringifying url</Comment><br/>
0447 <Normal Text>                args</Normal Text><Symbol>[</Symbol><String>"exclude"</String><Symbol>]</Symbol><Normal Text> </Normal Text><Symbol>=</Symbol><Normal Text> fileOptions</Normal Text><Symbol>.</Symbol><Normal Text>excludedGlobs</Normal Text><Symbol>.</Symbol><Normal Text>map </Normal Text><Symbol>{</Symbol><Normal Text> $</Normal Text><Float>0.</Float><Normal Text>description </Normal Text><Symbol>}.</Symbol><Normal Text>sorted</Normal Text><Symbol>().</Symbol><Normal Text>joined</Normal Text><Symbol>(</Symbol><Normal Text>separator</Normal Text><Symbol>:</Symbol><Normal Text> </Normal Text><String>","</String><Symbol>)</Symbol><br/>
0448 <Normal Text>            </Normal Text><Symbol>}</Symbol><br/>
0449 <Normal Text>            arguments</Normal Text><Symbol>.</Symbol><Normal Text>remove</Normal Text><Symbol>(</Symbol><String>"exclude"</String><Symbol>)</Symbol><br/>
0450 <Normal Text>        </Normal Text><Symbol>}</Symbol><br/>
0451 <Normal Text>        </Normal Text><ControlFlowKeyword>do</ControlFlowKeyword><Normal Text> </Normal Text><Symbol>{</Symbol><br/>
0452 <Normal Text>            </Normal Text><ControlFlowKeyword>if</ControlFlowKeyword><Normal Text> </Normal Text><Symbol>!</Symbol><Normal Text>fileOptions</Normal Text><Symbol>.</Symbol><Normal Text>unexcludedGlobs</Normal Text><Symbol>.</Symbol><Normal Text>isEmpty </Normal Text><Symbol>{</Symbol><br/>
0453 <Normal Text>                </Normal Text><Comment>// </Comment><Alert Level 2>TODO</Alert Level 2><Comment>: find a better alternative to stringifying url</Comment><br/>
0454 <Normal Text>                args</Normal Text><Symbol>[</Symbol><String>"unexclude"</String><Symbol>]</Symbol><Normal Text> </Normal Text><Symbol>=</Symbol><Normal Text> fileOptions</Normal Text><Symbol>.</Symbol><Normal Text>unexcludedGlobs</Normal Text><Symbol>.</Symbol><Normal Text>map </Normal Text><Symbol>{</Symbol><Normal Text> $</Normal Text><Float>0.</Float><Normal Text>description </Normal Text><Symbol>}.</Symbol><Normal Text>sorted</Normal Text><Symbol>().</Symbol><Normal Text>joined</Normal Text><Symbol>(</Symbol><Normal Text>separator</Normal Text><Symbol>:</Symbol><Normal Text> </Normal Text><String>","</String><Symbol>)</Symbol><br/>
0455 <Normal Text>            </Normal Text><Symbol>}</Symbol><br/>
0456 <Normal Text>            arguments</Normal Text><Symbol>.</Symbol><Normal Text>remove</Normal Text><Symbol>(</Symbol><String>"unexclude"</String><Symbol>)</Symbol><br/>
0457 <Normal Text>        </Normal Text><Symbol>}</Symbol><br/>
0458 <Normal Text>        </Normal Text><ControlFlowKeyword>do</ControlFlowKeyword><Normal Text> </Normal Text><Symbol>{</Symbol><br/>
0459 <Normal Text>            </Normal Text><ControlFlowKeyword>if</ControlFlowKeyword><Normal Text> </Normal Text><Symbol>!</Symbol><Normal Text>excludingDefaults </Normal Text><Symbol>||</Symbol><Normal Text> fileOptions</Normal Text><Symbol>.</Symbol><Normal Text>minVersion </Normal Text><Symbol>!=</Symbol><Normal Text> FileOptions</Normal Text><Symbol>.</Symbol><Keyword>default</Keyword><Symbol>.</Symbol><Normal Text>minVersion </Normal Text><Symbol>{</Symbol><br/>
0460 <Normal Text>                args</Normal Text><Symbol>[</Symbol><String>"minversion"</String><Symbol>]</Symbol><Normal Text> </Normal Text><Symbol>=</Symbol><Normal Text> fileOptions</Normal Text><Symbol>.</Symbol><Normal Text>minVersion</Normal Text><Symbol>.</Symbol><Normal Text>description</Normal Text><br/>
0461 <Normal Text>            </Normal Text><Symbol>}</Symbol><br/>
0462 <Normal Text>            arguments</Normal Text><Symbol>.</Symbol><Normal Text>remove</Normal Text><Symbol>(</Symbol><String>"minversion"</String><Symbol>)</Symbol><br/>
0463 <Normal Text>        </Normal Text><Symbol>}</Symbol><br/>
0464 <Normal Text>        assert</Normal Text><Symbol>(</Symbol><Normal Text>arguments</Normal Text><Symbol>.</Symbol><Normal Text>isEmpty</Normal Text><Symbol>)</Symbol><br/>
0465 <Normal Text>    </Normal Text><Symbol>}</Symbol><br/>
0466 <Normal Text>    </Normal Text><ControlFlowKeyword>if</ControlFlowKeyword><Normal Text> </Normal Text><Keyword>let</Keyword><Normal Text> </Normal Text><Variable>formatOptions</Variable><Normal Text> </Normal Text><Symbol>=</Symbol><Normal Text> options</Normal Text><Symbol>.</Symbol><Normal Text>formatOptions </Normal Text><Symbol>{</Symbol><br/>
0467 <Normal Text>        </Normal Text><ControlFlowKeyword>for</ControlFlowKeyword><Normal Text> descriptor </Normal Text><ControlFlowKeyword>in</ControlFlowKeyword><Normal Text> Descriptors</Normal Text><Symbol>.</Symbol><Normal Text>all </Normal Text><Keyword>where</Keyword><Normal Text> </Normal Text><Symbol>!</Symbol><Normal Text>descriptor</Normal Text><Symbol>.</Symbol><Normal Text>isRenamed </Normal Text><Symbol>{</Symbol><br/>
0468 <Normal Text>            </Normal Text><Keyword>let</Keyword><Normal Text> </Normal Text><Variable>value</Variable><Normal Text> </Normal Text><Symbol>=</Symbol><Normal Text> descriptor</Normal Text><Symbol>.</Symbol><Normal Text>fromOptions</Normal Text><Symbol>(</Symbol><Normal Text>formatOptions</Normal Text><Symbol>)</Symbol><br/>
0469 <Normal Text>            </Normal Text><ControlFlowKeyword>guard</ControlFlowKeyword><Normal Text> value </Normal Text><Symbol>!=</Symbol><Normal Text> descriptor</Normal Text><Symbol>.</Symbol><Normal Text>fromOptions</Normal Text><Symbol>(.</Symbol><Keyword>default</Keyword><Symbol>)</Symbol><Normal Text> </Normal Text><Symbol>||</Symbol><br/>
0470 <Normal Text>                </Normal Text><Symbol>(!</Symbol><Normal Text>excludingDefaults </Normal Text><Symbol>&&</Symbol><Normal Text> </Normal Text><Symbol>!</Symbol><Normal Text>descriptor</Normal Text><Symbol>.</Symbol><Normal Text>isDeprecated</Normal Text><Symbol>)</Symbol><br/>
0471 <Normal Text>            </Normal Text><ControlFlowKeyword>else</ControlFlowKeyword><Normal Text> </Normal Text><Symbol>{</Symbol><br/>
0472 <Normal Text>                </Normal Text><ControlFlowKeyword>continue</ControlFlowKeyword><br/>
0473 <Normal Text>            </Normal Text><Symbol>}</Symbol><br/>
0474 <Normal Text>            </Normal Text><Comment>// Special case for swiftVersion</Comment><br/>
0475 <Normal Text>            </Normal Text><Comment>// </Comment><Alert Level 2>TODO</Alert Level 2><Comment>: find a better solution for this</Comment><br/>
0476 <Normal Text>            </Normal Text><ControlFlowKeyword>if</ControlFlowKeyword><Normal Text> descriptor</Normal Text><Symbol>.</Symbol><Normal Text>argumentName </Normal Text><Symbol>==</Symbol><Normal Text> Descriptors</Normal Text><Symbol>.</Symbol><Normal Text>swiftVersion</Normal Text><Symbol>.</Symbol><Normal Text>argumentName</Normal Text><Symbol>,</Symbol><br/>
0477 <Normal Text>               value </Normal Text><Symbol>==</Symbol><Normal Text> Version</Normal Text><Symbol>.</Symbol><Normal Text>undefined</Normal Text><Symbol>.</Symbol><Normal Text>rawValue</Normal Text><br/>
0478 <Normal Text>            </Normal Text><Symbol>{</Symbol><br/>
0479 <Normal Text>                </Normal Text><ControlFlowKeyword>continue</ControlFlowKeyword><br/>
0480 <Normal Text>            </Normal Text><Symbol>}</Symbol><br/>
0481 <Normal Text>            args</Normal Text><Symbol>[</Symbol><Normal Text>descriptor</Normal Text><Symbol>.</Symbol><Normal Text>argumentName</Normal Text><Symbol>]</Symbol><Normal Text> </Normal Text><Symbol>=</Symbol><Normal Text> value</Normal Text><br/>
0482 <Normal Text>        </Normal Text><Symbol>}</Symbol><br/>
0483 <Normal Text>        </Normal Text><Comment>// Special case for wrapParameters</Comment><br/>
0484 <Normal Text>        </Normal Text><Keyword>let</Keyword><Normal Text> </Normal Text><Variable>argumentName</Variable><Normal Text> </Normal Text><Symbol>=</Symbol><Normal Text> Descriptors</Normal Text><Symbol>.</Symbol><Normal Text>wrapParameters</Normal Text><Symbol>.</Symbol><Normal Text>argumentName</Normal Text><br/>
0485 <Normal Text>        </Normal Text><ControlFlowKeyword>if</ControlFlowKeyword><Normal Text> args</Normal Text><Symbol>[</Symbol><Normal Text>argumentName</Normal Text><Symbol>]</Symbol><Normal Text> </Normal Text><Symbol>==</Symbol><Normal Text> WrapMode</Normal Text><Symbol>.</Symbol><Keyword>default</Keyword><Symbol>.</Symbol><Normal Text>rawValue </Normal Text><Symbol>{</Symbol><br/>
0486 <Normal Text>            args</Normal Text><Symbol>[</Symbol><Normal Text>argumentName</Normal Text><Symbol>]</Symbol><Normal Text> </Normal Text><Symbol>=</Symbol><Normal Text> args</Normal Text><Symbol>[</Symbol><Normal Text>Descriptors</Normal Text><Symbol>.</Symbol><Normal Text>wrapArguments</Normal Text><Symbol>.</Symbol><Normal Text>argumentName</Normal Text><Symbol>]</Symbol><br/>
0487 <Normal Text>        </Normal Text><Symbol>}</Symbol><br/>
0488 <Normal Text>    </Normal Text><Symbol>}</Symbol><br/>
0489 <Normal Text>    </Normal Text><ControlFlowKeyword>if</ControlFlowKeyword><Normal Text> options</Normal Text><Symbol>.</Symbol><Normal Text>lint </Normal Text><Symbol>{</Symbol><br/>
0490 <Normal Text>        args</Normal Text><Symbol>[</Symbol><String>"lint"</String><Symbol>]</Symbol><Normal Text> </Normal Text><Symbol>=</Symbol><Normal Text> </Normal Text><String>""</String><br/>
0491 <Normal Text>    </Normal Text><Symbol>}</Symbol><br/>
0492 <Normal Text>    </Normal Text><ControlFlowKeyword>if</ControlFlowKeyword><Normal Text> </Normal Text><Keyword>let</Keyword><Normal Text> </Normal Text><Variable>rules</Variable><Normal Text> </Normal Text><Symbol>=</Symbol><Normal Text> options</Normal Text><Symbol>.</Symbol><Normal Text>rules </Normal Text><Symbol>{</Symbol><br/>
0493 <Normal Text>        </Normal Text><Keyword>let</Keyword><Normal Text> </Normal Text><Variable>defaultRules</Variable><Normal Text> </Normal Text><Symbol>=</Symbol><Normal Text> allRules</Normal Text><Symbol>.</Symbol><Normal Text>subtracting</Normal Text><Symbol>(</Symbol><Normal Text>FormatRules</Normal Text><Symbol>.</Symbol><Normal Text>disabledByDefault</Normal Text><Symbol>)</Symbol><br/>
0494 <Normal Text></Normal Text><br/>
0495 <Normal Text>        </Normal Text><Keyword>let</Keyword><Normal Text> </Normal Text><Variable>enabled</Variable><Normal Text> </Normal Text><Symbol>=</Symbol><Normal Text> rules</Normal Text><Symbol>.</Symbol><Normal Text>subtracting</Normal Text><Symbol>(</Symbol><Normal Text>defaultRules</Normal Text><Symbol>)</Symbol><br/>
0496 <Normal Text>        </Normal Text><ControlFlowKeyword>if</ControlFlowKeyword><Normal Text> </Normal Text><Symbol>!</Symbol><Normal Text>enabled</Normal Text><Symbol>.</Symbol><Normal Text>isEmpty </Normal Text><Symbol>{</Symbol><br/>
0497 <Normal Text>            args</Normal Text><Symbol>[</Symbol><String>"enable"</String><Symbol>]</Symbol><Normal Text> </Normal Text><Symbol>=</Symbol><Normal Text> enabled</Normal Text><Symbol>.</Symbol><Normal Text>sorted</Normal Text><Symbol>().</Symbol><Normal Text>joined</Normal Text><Symbol>(</Symbol><Normal Text>separator</Normal Text><Symbol>:</Symbol><Normal Text> </Normal Text><String>","</String><Symbol>)</Symbol><br/>
0498 <Normal Text>        </Normal Text><Symbol>}</Symbol><br/>
0499 <Normal Text></Normal Text><br/>
0500 <Normal Text>        </Normal Text><Keyword>let</Keyword><Normal Text> </Normal Text><Variable>disabled</Variable><Normal Text> </Normal Text><Symbol>=</Symbol><Normal Text> defaultRules</Normal Text><Symbol>.</Symbol><Normal Text>subtracting</Normal Text><Symbol>(</Symbol><Normal Text>rules</Normal Text><Symbol>)</Symbol><br/>
0501 <Normal Text>        </Normal Text><ControlFlowKeyword>if</ControlFlowKeyword><Normal Text> </Normal Text><Symbol>!</Symbol><Normal Text>disabled</Normal Text><Symbol>.</Symbol><Normal Text>isEmpty </Normal Text><Symbol>{</Symbol><br/>
0502 <Normal Text>            args</Normal Text><Symbol>[</Symbol><String>"disable"</String><Symbol>]</Symbol><Normal Text> </Normal Text><Symbol>=</Symbol><Normal Text> disabled</Normal Text><Symbol>.</Symbol><Normal Text>sorted</Normal Text><Symbol>().</Symbol><Normal Text>joined</Normal Text><Symbol>(</Symbol><Normal Text>separator</Normal Text><Symbol>:</Symbol><Normal Text> </Normal Text><String>","</String><Symbol>)</Symbol><br/>
0503 <Normal Text>        </Normal Text><Symbol>}</Symbol><br/>
0504 <Normal Text>    </Normal Text><Symbol>}</Symbol><br/>
0505 <Normal Text>    </Normal Text><Keyword>return</Keyword><Normal Text> args</Normal Text><br/>
0506 <Symbol>}</Symbol><br/>
0507 <Normal Text></Normal Text><br/>
0508 <Keyword>private</Keyword><Normal Text> </Normal Text><Keyword>func</Keyword><Normal Text> </Normal Text><Function>processOption</Function><Symbol>(</Symbol><Variable>_</Variable><Normal Text> </Normal Text><Variable>key</Variable><Symbol>:</Symbol><Normal Text> </Normal Text><Data Type>String</Data Type><Symbol>,</Symbol><br/>
0509 <Normal Text>                           </Normal Text><Variable>in</Variable><Normal Text> </Normal Text><Variable>args</Variable><Symbol>:</Symbol><Normal Text> [</Normal Text><Data Type>String</Data Type><Symbol>:</Symbol><Normal Text> </Normal Text><Data Type>String</Data Type><Normal Text>]</Normal Text><Symbol>,</Symbol><br/>
0510 <Normal Text>                           </Normal Text><Variable>from</Variable><Symbol>:</Symbol><Normal Text> </Normal Text><Data Type>inout</Data Type><Normal Text> </Normal Text><Variable>Set</Variable><Normal Text><</Normal Text><Variable>String</Variable><Normal Text>></Normal Text><Symbol>,</Symbol><br/>
0511 <Normal Text>                           </Normal Text><Variable>handler</Variable><Symbol>:</Symbol><Normal Text> </Normal Text><Symbol>(</Symbol><Data Type>String</Data Type><Symbol>)</Symbol><Normal Text> </Normal Text><Data Type>throws</Data Type><Normal Text> -> </Normal Text><Variable>Void</Variable><Symbol>)</Symbol><Normal Text> </Normal Text><Keyword>throws</Keyword><br/>
0512 <Symbol>{</Symbol><br/>
0513 <Normal Text>    precondition</Normal Text><Symbol>(</Symbol><Normal Text>optionsArguments</Normal Text><Symbol>.</Symbol><Normal Text>contains</Normal Text><Symbol>(</Symbol><Normal Text>key</Normal Text><Symbol>),</Symbol><Normal Text> </Normal Text><String>"</String><Error>\(</Error><String>key) not in optionsArguments"</String><Symbol>)</Symbol><br/>
0514 <Normal Text>    </Normal Text><Keyword>var</Keyword><Normal Text> </Normal Text><Variable>arguments</Variable><Normal Text> </Normal Text><Symbol>=</Symbol><Normal Text> from</Normal Text><br/>
0515 <Normal Text>    arguments</Normal Text><Symbol>.</Symbol><Normal Text>remove</Normal Text><Symbol>(</Symbol><Normal Text>key</Normal Text><Symbol>)</Symbol><br/>
0516 <Normal Text>    from </Normal Text><Symbol>=</Symbol><Normal Text> arguments</Normal Text><br/>
0517 <Normal Text>    </Normal Text><ControlFlowKeyword>guard</ControlFlowKeyword><Normal Text> </Normal Text><Keyword>let</Keyword><Normal Text> </Normal Text><Variable>value</Variable><Normal Text> </Normal Text><Symbol>=</Symbol><Normal Text> args</Normal Text><Symbol>[</Symbol><Normal Text>key</Normal Text><Symbol>]</Symbol><Normal Text> </Normal Text><ControlFlowKeyword>else</ControlFlowKeyword><Normal Text> </Normal Text><Symbol>{</Symbol><br/>
0518 <Normal Text>        </Normal Text><Keyword>return</Keyword><br/>
0519 <Normal Text>    </Normal Text><Symbol>}</Symbol><br/>
0520 <Normal Text>    </Normal Text><ControlFlowKeyword>do</ControlFlowKeyword><Normal Text> </Normal Text><Symbol>{</Symbol><br/>
0521 <Normal Text>        </Normal Text><ControlFlowKeyword>try</ControlFlowKeyword><Normal Text> handler</Normal Text><Symbol>(</Symbol><Normal Text>value</Normal Text><Symbol>)</Symbol><br/>
0522 <Normal Text>    </Normal Text><Symbol>}</Symbol><Normal Text> </Normal Text><ControlFlowKeyword>catch</ControlFlowKeyword><Normal Text> </Normal Text><Symbol>{</Symbol><br/>
0523 <Normal Text>        </Normal Text><ControlFlowKeyword>guard</ControlFlowKeyword><Normal Text> </Normal Text><Symbol>!</Symbol><Normal Text>value</Normal Text><Symbol>.</Symbol><Normal Text>isEmpty </Normal Text><ControlFlowKeyword>else</ControlFlowKeyword><Normal Text> </Normal Text><Symbol>{</Symbol><br/>
0524 <Normal Text>            </Normal Text><Keyword>throw</Keyword><Normal Text> FormatError</Normal Text><Symbol>.</Symbol><Normal Text>options</Normal Text><Symbol>(</Symbol><String>"--</String><Error>\(</Error><String>key) option expects a value"</String><Symbol>)</Symbol><br/>
0525 <Normal Text>        </Normal Text><Symbol>}</Symbol><br/>
0526 <Normal Text>        </Normal Text><ControlFlowKeyword>if</ControlFlowKeyword><Normal Text> </Normal Text><ControlFlowKeyword>case</ControlFlowKeyword><Normal Text> </Normal Text><Keyword>var</Keyword><Normal Text> </Normal Text><Variable>FormatError</Variable><Symbol>.</Symbol><Normal Text>options</Normal Text><Symbol>(</Symbol><Normal Text>string</Normal Text><Symbol>)</Symbol><Normal Text> </Normal Text><Symbol>=</Symbol><Normal Text> error</Normal Text><Symbol>,</Symbol><Normal Text> </Normal Text><Symbol>!</Symbol><Normal Text>string</Normal Text><Symbol>.</Symbol><Normal Text>isEmpty </Normal Text><Symbol>{</Symbol><br/>
0527 <Normal Text>            </Normal Text><ControlFlowKeyword>if</ControlFlowKeyword><Normal Text> </Normal Text><Symbol>!</Symbol><Normal Text>string</Normal Text><Symbol>.</Symbol><Normal Text>contains</Normal Text><Symbol>(</Symbol><Normal Text>key</Normal Text><Symbol>)</Symbol><Normal Text> </Normal Text><Symbol>{</Symbol><br/>
0528 <Normal Text>                string </Normal Text><Symbol>+=</Symbol><Normal Text> </Normal Text><String>" in --</String><Error>\(</Error><String>key)"</String><br/>
0529 <Normal Text>            </Normal Text><Symbol>}</Symbol><br/>
0530 <Normal Text>            </Normal Text><Keyword>throw</Keyword><Normal Text> FormatError</Normal Text><Symbol>.</Symbol><Normal Text>options</Normal Text><Symbol>(</Symbol><Normal Text>string</Normal Text><Symbol>)</Symbol><br/>
0531 <Normal Text>        </Normal Text><Symbol>}</Symbol><br/>
0532 <Normal Text>        </Normal Text><Keyword>throw</Keyword><Normal Text> FormatError</Normal Text><Symbol>.</Symbol><Normal Text>options</Normal Text><Symbol>(</Symbol><String>"Unsupported --</String><Error>\(</Error><String>key) value '</String><Error>\(</Error><String>value)'"</String><Symbol>)</Symbol><br/>
0533 <Normal Text>    </Normal Text><Symbol>}</Symbol><br/>
0534 <Symbol>}</Symbol><br/>
0535 <Normal Text></Normal Text><br/>
0536 <Comment>// Parse rule names from arguments</Comment><br/>
0537 <Keyword>public</Keyword><Normal Text> </Normal Text><Keyword>func</Keyword><Normal Text> </Normal Text><Function>rulesFor</Function><Symbol>(</Symbol><Variable>_</Variable><Normal Text> </Normal Text><Variable>args</Variable><Symbol>:</Symbol><Normal Text> [</Normal Text><Data Type>String</Data Type><Symbol>:</Symbol><Normal Text> </Normal Text><Data Type>String</Data Type><Normal Text>]</Normal Text><Symbol>,</Symbol><Normal Text> </Normal Text><Variable>lint</Variable><Symbol>:</Symbol><Normal Text> </Normal Text><Data Type>Bool</Data Type><Symbol>)</Symbol><Normal Text> </Normal Text><Keyword>throws</Keyword><Normal Text> -> </Normal Text><Function>Set</Function><Symbol><</Symbol><Data Type>String</Data Type><Symbol>></Symbol><Normal Text> </Normal Text><Symbol>{</Symbol><br/>
0538 <Normal Text>    </Normal Text><Keyword>var</Keyword><Normal Text> </Normal Text><Variable>rules</Variable><Normal Text> </Normal Text><Symbol>=</Symbol><Normal Text> allRules</Normal Text><br/>
0539 <Normal Text>    rules </Normal Text><Symbol>=</Symbol><Normal Text> </Normal Text><ControlFlowKeyword>try</ControlFlowKeyword><Normal Text> args</Normal Text><Symbol>[</Symbol><String>"rules"</String><Symbol>].</Symbol><Normal Text>map </Normal Text><Symbol>{</Symbol><br/>
0540 <Normal Text>        </Normal Text><ControlFlowKeyword>try</ControlFlowKeyword><Normal Text> Set</Normal Text><Symbol>(</Symbol><Normal Text>parseRules</Normal Text><Symbol>(</Symbol><Normal Text>$</Normal Text><Decimal>0</Decimal><Symbol>))</Symbol><br/>
0541 <Normal Text>    </Normal Text><Symbol>}</Symbol><Normal Text> </Normal Text><Symbol>??</Symbol><Normal Text> rules</Normal Text><Symbol>.</Symbol><Normal Text>subtracting</Normal Text><Symbol>(</Symbol><Normal Text>FormatRules</Normal Text><Symbol>.</Symbol><Normal Text>disabledByDefault</Normal Text><Symbol>)</Symbol><br/>
0542 <Normal Text>    </Normal Text><ControlFlowKeyword>try</ControlFlowKeyword><Normal Text> args</Normal Text><Symbol>[</Symbol><String>"enable"</String><Symbol>].</Symbol><Normal Text>map </Normal Text><Symbol>{</Symbol><br/>
0543 <Normal Text>        </Normal Text><ControlFlowKeyword>try</ControlFlowKeyword><Normal Text> rules</Normal Text><Symbol>.</Symbol><Normal Text>formUnion</Normal Text><Symbol>(</Symbol><Normal Text>parseRules</Normal Text><Symbol>(</Symbol><Normal Text>$</Normal Text><Decimal>0</Decimal><Symbol>))</Symbol><br/>
0544 <Normal Text>    </Normal Text><Symbol>}</Symbol><br/>
0545 <Normal Text>    </Normal Text><ControlFlowKeyword>try</ControlFlowKeyword><Normal Text> args</Normal Text><Symbol>[</Symbol><String>"disable"</String><Symbol>].</Symbol><Normal Text>map </Normal Text><Symbol>{</Symbol><br/>
0546 <Normal Text>        </Normal Text><ControlFlowKeyword>try</ControlFlowKeyword><Normal Text> rules</Normal Text><Symbol>.</Symbol><Normal Text>subtract</Normal Text><Symbol>(</Symbol><Normal Text>parseRules</Normal Text><Symbol>(</Symbol><Normal Text>$</Normal Text><Decimal>0</Decimal><Symbol>))</Symbol><br/>
0547 <Normal Text>    </Normal Text><Symbol>}</Symbol><br/>
0548 <Normal Text>    </Normal Text><ControlFlowKeyword>try</ControlFlowKeyword><Normal Text> args</Normal Text><Symbol>[</Symbol><String>"lintonly"</String><Symbol>].</Symbol><Normal Text>map </Normal Text><Symbol>{</Symbol><Normal Text> rulesString </Normal Text><ControlFlowKeyword>in</ControlFlowKeyword><br/>
0549 <Normal Text>        </Normal Text><ControlFlowKeyword>if</ControlFlowKeyword><Normal Text> lint </Normal Text><Symbol>{</Symbol><br/>
0550 <Normal Text>            </Normal Text><ControlFlowKeyword>try</ControlFlowKeyword><Normal Text> rules</Normal Text><Symbol>.</Symbol><Normal Text>formUnion</Normal Text><Symbol>(</Symbol><Normal Text>parseRules</Normal Text><Symbol>(</Symbol><Normal Text>rulesString</Normal Text><Symbol>))</Symbol><br/>
0551 <Normal Text>        </Normal Text><Symbol>}</Symbol><Normal Text> </Normal Text><ControlFlowKeyword>else</ControlFlowKeyword><Normal Text> </Normal Text><Symbol>{</Symbol><br/>
0552 <Normal Text>            </Normal Text><ControlFlowKeyword>try</ControlFlowKeyword><Normal Text> rules</Normal Text><Symbol>.</Symbol><Normal Text>subtract</Normal Text><Symbol>(</Symbol><Normal Text>parseRules</Normal Text><Symbol>(</Symbol><Normal Text>rulesString</Normal Text><Symbol>))</Symbol><br/>
0553 <Normal Text>        </Normal Text><Symbol>}</Symbol><br/>
0554 <Normal Text>    </Normal Text><Symbol>}</Symbol><br/>
0555 <Normal Text>    </Normal Text><Keyword>return</Keyword><Normal Text> rules</Normal Text><br/>
0556 <Symbol>}</Symbol><br/>
0557 <Normal Text></Normal Text><br/>
0558 <Comment>// Parse FileOptions from arguments</Comment><br/>
0559 <Keyword>func</Keyword><Normal Text> </Normal Text><Function>fileOptionsFor</Function><Symbol>(</Symbol><Variable>_</Variable><Normal Text> </Normal Text><Variable>args</Variable><Symbol>:</Symbol><Normal Text> [</Normal Text><Data Type>String</Data Type><Symbol>:</Symbol><Normal Text> </Normal Text><Data Type>String</Data Type><Normal Text>]</Normal Text><Symbol>,</Symbol><Normal Text> </Normal Text><Variable>in</Variable><Normal Text> </Normal Text><Variable>directory</Variable><Symbol>:</Symbol><Normal Text> </Normal Text><Data Type>String</Data Type><Symbol>)</Symbol><Normal Text> </Normal Text><Keyword>throws</Keyword><Normal Text> -> </Normal Text><Function>FileOptions</Function><Normal Text>? </Normal Text><Symbol>{</Symbol><br/>
0560 <Normal Text>    </Normal Text><Keyword>var</Keyword><Normal Text> </Normal Text><Variable>options</Variable><Normal Text> </Normal Text><Symbol>=</Symbol><Normal Text> FileOptions</Normal Text><Symbol>()</Symbol><br/>
0561 <Normal Text>    </Normal Text><Keyword>var</Keyword><Normal Text> </Normal Text><Variable>arguments</Variable><Normal Text> </Normal Text><Symbol>=</Symbol><Normal Text> Set</Normal Text><Symbol>(</Symbol><Normal Text>fileArguments</Normal Text><Symbol>)</Symbol><br/>
0562 <Normal Text></Normal Text><br/>
0563 <Normal Text>    </Normal Text><Keyword>var</Keyword><Normal Text> </Normal Text><Variable>containsFileOption</Variable><Normal Text> </Normal Text><Symbol>=</Symbol><Normal Text> </Normal Text><Keyword>false</Keyword><br/>
0564 <Normal Text>    </Normal Text><ControlFlowKeyword>try</ControlFlowKeyword><Normal Text> processOption</Normal Text><Symbol>(</Symbol><String>"symlinks"</String><Symbol>,</Symbol><Normal Text> </Normal Text><ControlFlowKeyword>in</ControlFlowKeyword><Symbol>:</Symbol><Normal Text> args</Normal Text><Symbol>,</Symbol><Normal Text> from</Normal Text><Symbol>:</Symbol><Normal Text> </Normal Text><Symbol>&</Symbol><Normal Text>arguments</Normal Text><Symbol>)</Symbol><Normal Text> </Normal Text><Symbol>{</Symbol><br/>
0565 <Normal Text>        containsFileOption </Normal Text><Symbol>=</Symbol><Normal Text> </Normal Text><Keyword>true</Keyword><br/>
0566 <Normal Text>        </Normal Text><ControlFlowKeyword>switch</ControlFlowKeyword><Normal Text> $</Normal Text><Float>0.</Float><Normal Text>lowercased</Normal Text><Symbol>()</Symbol><Normal Text> </Normal Text><Symbol>{</Symbol><br/>
0567 <Normal Text>        </Normal Text><ControlFlowKeyword>case</ControlFlowKeyword><Normal Text> </Normal Text><String>"follow"</String><Symbol>:</Symbol><br/>
0568 <Normal Text>            options</Normal Text><Symbol>.</Symbol><Normal Text>followSymlinks </Normal Text><Symbol>=</Symbol><Normal Text> </Normal Text><Keyword>true</Keyword><br/>
0569 <Normal Text>        </Normal Text><ControlFlowKeyword>case</ControlFlowKeyword><Normal Text> </Normal Text><String>"ignore"</String><Symbol>:</Symbol><br/>
0570 <Normal Text>            options</Normal Text><Symbol>.</Symbol><Normal Text>followSymlinks </Normal Text><Symbol>=</Symbol><Normal Text> </Normal Text><Keyword>false</Keyword><br/>
0571 <Normal Text>        </Normal Text><Keyword>default</Keyword><Symbol>:</Symbol><br/>
0572 <Normal Text>            </Normal Text><Keyword>throw</Keyword><Normal Text> FormatError</Normal Text><Symbol>.</Symbol><Normal Text>options</Normal Text><Symbol>(</Symbol><String>""</String><Symbol>)</Symbol><br/>
0573 <Normal Text>        </Normal Text><Symbol>}</Symbol><br/>
0574 <Normal Text>    </Normal Text><Symbol>}</Symbol><br/>
0575 <Normal Text>    </Normal Text><ControlFlowKeyword>try</ControlFlowKeyword><Normal Text> processOption</Normal Text><Symbol>(</Symbol><String>"exclude"</String><Symbol>,</Symbol><Normal Text> </Normal Text><ControlFlowKeyword>in</ControlFlowKeyword><Symbol>:</Symbol><Normal Text> args</Normal Text><Symbol>,</Symbol><Normal Text> from</Normal Text><Symbol>:</Symbol><Normal Text> </Normal Text><Symbol>&</Symbol><Normal Text>arguments</Normal Text><Symbol>)</Symbol><Normal Text> </Normal Text><Symbol>{</Symbol><br/>
0576 <Normal Text>        containsFileOption </Normal Text><Symbol>=</Symbol><Normal Text> </Normal Text><Keyword>true</Keyword><br/>
0577 <Normal Text>        options</Normal Text><Symbol>.</Symbol><Normal Text>excludedGlobs </Normal Text><Symbol>+=</Symbol><Normal Text> expandGlobs</Normal Text><Symbol>(</Symbol><Normal Text>$</Normal Text><Decimal>0</Decimal><Symbol>,</Symbol><Normal Text> </Normal Text><ControlFlowKeyword>in</ControlFlowKeyword><Symbol>:</Symbol><Normal Text> directory</Normal Text><Symbol>)</Symbol><br/>
0578 <Normal Text>    </Normal Text><Symbol>}</Symbol><br/>
0579 <Normal Text>    </Normal Text><ControlFlowKeyword>try</ControlFlowKeyword><Normal Text> processOption</Normal Text><Symbol>(</Symbol><String>"unexclude"</String><Symbol>,</Symbol><Normal Text> </Normal Text><ControlFlowKeyword>in</ControlFlowKeyword><Symbol>:</Symbol><Normal Text> args</Normal Text><Symbol>,</Symbol><Normal Text> from</Normal Text><Symbol>:</Symbol><Normal Text> </Normal Text><Symbol>&</Symbol><Normal Text>arguments</Normal Text><Symbol>)</Symbol><Normal Text> </Normal Text><Symbol>{</Symbol><br/>
0580 <Normal Text>        containsFileOption </Normal Text><Symbol>=</Symbol><Normal Text> </Normal Text><Keyword>true</Keyword><br/>
0581 <Normal Text>        options</Normal Text><Symbol>.</Symbol><Normal Text>unexcludedGlobs </Normal Text><Symbol>+=</Symbol><Normal Text> expandGlobs</Normal Text><Symbol>(</Symbol><Normal Text>$</Normal Text><Decimal>0</Decimal><Symbol>,</Symbol><Normal Text> </Normal Text><ControlFlowKeyword>in</ControlFlowKeyword><Symbol>:</Symbol><Normal Text> directory</Normal Text><Symbol>)</Symbol><br/>
0582 <Normal Text>    </Normal Text><Symbol>}</Symbol><br/>
0583 <Normal Text>    </Normal Text><ControlFlowKeyword>try</ControlFlowKeyword><Normal Text> processOption</Normal Text><Symbol>(</Symbol><String>"minversion"</String><Symbol>,</Symbol><Normal Text> </Normal Text><ControlFlowKeyword>in</ControlFlowKeyword><Symbol>:</Symbol><Normal Text> args</Normal Text><Symbol>,</Symbol><Normal Text> from</Normal Text><Symbol>:</Symbol><Normal Text> </Normal Text><Symbol>&</Symbol><Normal Text>arguments</Normal Text><Symbol>)</Symbol><Normal Text> </Normal Text><Symbol>{</Symbol><br/>
0584 <Normal Text>        containsFileOption </Normal Text><Symbol>=</Symbol><Normal Text> </Normal Text><Keyword>true</Keyword><br/>
0585 <Normal Text>        </Normal Text><ControlFlowKeyword>guard</ControlFlowKeyword><Normal Text> </Normal Text><Keyword>let</Keyword><Normal Text> </Normal Text><Variable>minVersion</Variable><Normal Text> </Normal Text><Symbol>=</Symbol><Normal Text> Version</Normal Text><Symbol>(</Symbol><Normal Text>rawValue</Normal Text><Symbol>:</Symbol><Normal Text> $</Normal Text><Decimal>0</Decimal><Symbol>)</Symbol><Normal Text> </Normal Text><ControlFlowKeyword>else</ControlFlowKeyword><Normal Text> </Normal Text><Symbol>{</Symbol><br/>
0586 <Normal Text>            </Normal Text><Keyword>throw</Keyword><Normal Text> FormatError</Normal Text><Symbol>.</Symbol><Normal Text>options</Normal Text><Symbol>(</Symbol><String>"Unsupported --minversion value '</String><Error>\(</Error><String Interpolation>$</String Interpolation><String>0)'"</String><Symbol>)</Symbol><br/>
0587 <Normal Text>        </Normal Text><Symbol>}</Symbol><br/>
0588 <Normal Text>        </Normal Text><ControlFlowKeyword>guard</ControlFlowKeyword><Normal Text> minVersion </Normal Text><Symbol><=</Symbol><Normal Text> Version</Normal Text><Symbol>(</Symbol><Normal Text>stringLiteral</Normal Text><Symbol>:</Symbol><Normal Text> swiftFormatVersion</Normal Text><Symbol>)</Symbol><Normal Text> </Normal Text><ControlFlowKeyword>else</ControlFlowKeyword><Normal Text> </Normal Text><Symbol>{</Symbol><br/>
0589 <Normal Text>            </Normal Text><Keyword>throw</Keyword><Normal Text> FormatError</Normal Text><Symbol>.</Symbol><Normal Text>options</Normal Text><Symbol>(</Symbol><String>"Project specifies SwiftFormat --minversion of </String><Error>\(</Error><String>minVersion)"</String><Symbol>)</Symbol><br/>
0590 <Normal Text>        </Normal Text><Symbol>}</Symbol><br/>
0591 <Normal Text>        options</Normal Text><Symbol>.</Symbol><Normal Text>minVersion </Normal Text><Symbol>=</Symbol><Normal Text> minVersion</Normal Text><br/>
0592 <Normal Text>    </Normal Text><Symbol>}</Symbol><br/>
0593 <Normal Text>    assert</Normal Text><Symbol>(</Symbol><Normal Text>arguments</Normal Text><Symbol>.</Symbol><Normal Text>isEmpty</Normal Text><Symbol>,</Symbol><Normal Text> </Normal Text><String>"</String><Error>\(</Error><String>arguments.joined(separator: "</String><Symbol>,</Symbol><String>"))"</String><Symbol>)</Symbol><br/>
0594 <Normal Text>    </Normal Text><Keyword>return</Keyword><Normal Text> containsFileOption </Normal Text><Symbol>?</Symbol><Normal Text> options </Normal Text><Symbol>:</Symbol><Normal Text> </Normal Text><Keyword>nil</Keyword><br/>
0595 <Symbol>}</Symbol><br/>
0596 <Normal Text></Normal Text><br/>
0597 <Comment>// Parse FormatOptions from arguments</Comment><br/>
0598 <Comment>// Returns nil if the arguments dictionary does not contain any formatting arguments</Comment><br/>
0599 <Keyword>public</Keyword><Normal Text> </Normal Text><Keyword>func</Keyword><Normal Text> </Normal Text><Function>formatOptionsFor</Function><Symbol>(</Symbol><Variable>_</Variable><Normal Text> </Normal Text><Variable>args</Variable><Symbol>:</Symbol><Normal Text> [</Normal Text><Data Type>String</Data Type><Symbol>:</Symbol><Normal Text> </Normal Text><Data Type>String</Data Type><Normal Text>]</Normal Text><Symbol>)</Symbol><Normal Text> </Normal Text><Keyword>throws</Keyword><Normal Text> -> </Normal Text><Function>FormatOptions</Function><Normal Text>? </Normal Text><Symbol>{</Symbol><br/>
0600 <Normal Text>    </Normal Text><Keyword>var</Keyword><Normal Text> </Normal Text><Variable>options</Variable><Normal Text> </Normal Text><Symbol>=</Symbol><Normal Text> FormatOptions</Normal Text><Symbol>.</Symbol><Keyword>default</Keyword><br/>
0601 <Normal Text>    </Normal Text><Keyword>var</Keyword><Normal Text> </Normal Text><Variable>arguments</Variable><Normal Text> </Normal Text><Symbol>=</Symbol><Normal Text> Set</Normal Text><Symbol>(</Symbol><Normal Text>formattingArguments</Normal Text><Symbol>)</Symbol><br/>
0602 <Normal Text></Normal Text><br/>
0603 <Normal Text>    </Normal Text><Keyword>var</Keyword><Normal Text> </Normal Text><Variable>containsFormatOption</Variable><Normal Text> </Normal Text><Symbol>=</Symbol><Normal Text> </Normal Text><Keyword>false</Keyword><br/>
0604 <Normal Text>    </Normal Text><ControlFlowKeyword>for</ControlFlowKeyword><Normal Text> option </Normal Text><ControlFlowKeyword>in</ControlFlowKeyword><Normal Text> Descriptors</Normal Text><Symbol>.</Symbol><Normal Text>all </Normal Text><Symbol>{</Symbol><br/>
0605 <Normal Text>        </Normal Text><ControlFlowKeyword>try</ControlFlowKeyword><Normal Text> processOption</Normal Text><Symbol>(</Symbol><Normal Text>option</Normal Text><Symbol>.</Symbol><Normal Text>argumentName</Normal Text><Symbol>,</Symbol><Normal Text> </Normal Text><ControlFlowKeyword>in</ControlFlowKeyword><Symbol>:</Symbol><Normal Text> args</Normal Text><Symbol>,</Symbol><Normal Text> from</Normal Text><Symbol>:</Symbol><Normal Text> </Normal Text><Symbol>&</Symbol><Normal Text>arguments</Normal Text><Symbol>)</Symbol><Normal Text> </Normal Text><Symbol>{</Symbol><br/>
0606 <Normal Text>            containsFormatOption </Normal Text><Symbol>=</Symbol><Normal Text> </Normal Text><Keyword>true</Keyword><br/>
0607 <Normal Text>            </Normal Text><ControlFlowKeyword>try</ControlFlowKeyword><Normal Text> option</Normal Text><Symbol>.</Symbol><Normal Text>toOptions</Normal Text><Symbol>(</Symbol><Normal Text>$</Normal Text><Decimal>0</Decimal><Symbol>,</Symbol><Normal Text> </Normal Text><Symbol>&</Symbol><Normal Text>options</Normal Text><Symbol>)</Symbol><br/>
0608 <Normal Text>        </Normal Text><Symbol>}</Symbol><br/>
0609 <Normal Text>    </Normal Text><Symbol>}</Symbol><br/>
0610 <Normal Text>    assert</Normal Text><Symbol>(</Symbol><Normal Text>arguments</Normal Text><Symbol>.</Symbol><Normal Text>isEmpty</Normal Text><Symbol>,</Symbol><Normal Text> </Normal Text><String>"</String><Error>\(</Error><String>arguments.joined(separator: "</String><Symbol>,</Symbol><String>"))"</String><Symbol>)</Symbol><br/>
0611 <Normal Text>    </Normal Text><Keyword>return</Keyword><Normal Text> containsFormatOption </Normal Text><Symbol>?</Symbol><Normal Text> options </Normal Text><Symbol>:</Symbol><Normal Text> </Normal Text><Keyword>nil</Keyword><br/>
0612 <Symbol>}</Symbol><br/>
0613 <Normal Text></Normal Text><br/>
0614 <Comment>// Get deprecation warnings from a set of arguments</Comment><br/>
0615 <Keyword>func</Keyword><Normal Text> </Normal Text><Function>warningsForArguments</Function><Symbol>(</Symbol><Variable>_</Variable><Normal Text> </Normal Text><Variable>args</Variable><Symbol>:</Symbol><Normal Text> [</Normal Text><Data Type>String</Data Type><Symbol>:</Symbol><Normal Text> </Normal Text><Data Type>String</Data Type><Normal Text>]</Normal Text><Symbol>)</Symbol><Normal Text> -> [</Normal Text><Function>String</Function><Normal Text>] </Normal Text><Symbol>{</Symbol><br/>
0616 <Normal Text>    </Normal Text><Keyword>var</Keyword><Normal Text> </Normal Text><Variable>warnings</Variable><Normal Text> </Normal Text><Symbol>=</Symbol><Normal Text> </Normal Text><Symbol>[</Symbol><Normal Text>String</Normal Text><Symbol>]()</Symbol><br/>
0617 <Normal Text>    </Normal Text><ControlFlowKeyword>for</ControlFlowKeyword><Normal Text> option </Normal Text><ControlFlowKeyword>in</ControlFlowKeyword><Normal Text> Descriptors</Normal Text><Symbol>.</Symbol><Normal Text>all </Normal Text><Symbol>{</Symbol><br/>
0618 <Normal Text>        </Normal Text><ControlFlowKeyword>if</ControlFlowKeyword><Normal Text> args</Normal Text><Symbol>[</Symbol><Normal Text>option</Normal Text><Symbol>.</Symbol><Normal Text>argumentName</Normal Text><Symbol>]</Symbol><Normal Text> </Normal Text><Symbol>!=</Symbol><Normal Text> </Normal Text><Keyword>nil</Keyword><Symbol>,</Symbol><Normal Text> </Normal Text><Keyword>let</Keyword><Normal Text> </Normal Text><Variable>message</Variable><Normal Text> </Normal Text><Symbol>=</Symbol><Normal Text> option</Normal Text><Symbol>.</Symbol><Normal Text>deprecationMessage </Normal Text><Symbol>{</Symbol><br/>
0619 <Normal Text>            warnings</Normal Text><Symbol>.</Symbol><Normal Text>append</Normal Text><Symbol>(</Symbol><String>"--</String><Error>\(</Error><String>option.argumentName) option is deprecated. </String><Error>\(</Error><String>message)"</String><Symbol>)</Symbol><br/>
0620 <Normal Text>        </Normal Text><Symbol>}</Symbol><br/>
0621 <Normal Text>    </Normal Text><Symbol>}</Symbol><br/>
0622 <Normal Text>    </Normal Text><ControlFlowKeyword>for</ControlFlowKeyword><Normal Text> name </Normal Text><ControlFlowKeyword>in</ControlFlowKeyword><Normal Text> Set</Normal Text><Symbol>(</Symbol><Normal Text>rulesArguments</Normal Text><Symbol>.</Symbol><Normal Text>flatMap </Normal Text><Symbol>{</Symbol><Normal Text> </Normal Text><Symbol>(</Symbol><ControlFlowKeyword>try</ControlFlowKeyword><Symbol>?</Symbol><Normal Text> args</Normal Text><Symbol>[</Symbol><Normal Text>$</Normal Text><Decimal>0</Decimal><Symbol>].</Symbol><Normal Text>map</Normal Text><Symbol>(</Symbol><Normal Text>parseRules</Normal Text><Symbol>)</Symbol><Normal Text> </Normal Text><Symbol>??</Symbol><Normal Text> </Normal Text><Symbol>[])</Symbol><Normal Text> </Normal Text><Symbol>??</Symbol><Normal Text> </Normal Text><Symbol>[]</Symbol><Normal Text> </Normal Text><Symbol>})</Symbol><Normal Text> </Normal Text><Symbol>{</Symbol><br/>
0623 <Normal Text>        </Normal Text><ControlFlowKeyword>if</ControlFlowKeyword><Normal Text> </Normal Text><Keyword>let</Keyword><Normal Text> </Normal Text><Variable>message</Variable><Normal Text> </Normal Text><Symbol>=</Symbol><Normal Text> FormatRules</Normal Text><Symbol>.</Symbol><Normal Text>byName</Normal Text><Symbol>[</Symbol><Normal Text>name</Normal Text><Symbol>]?.</Symbol><Normal Text>deprecationMessage </Normal Text><Symbol>{</Symbol><br/>
0624 <Normal Text>            warnings</Normal Text><Symbol>.</Symbol><Normal Text>append</Normal Text><Symbol>(</Symbol><String>"</String><Error>\(</Error><String>name) rule is deprecated. </String><Error>\(</Error><String>message)"</String><Symbol>)</Symbol><br/>
0625 <Normal Text>        </Normal Text><Symbol>}</Symbol><br/>
0626 <Normal Text>    </Normal Text><Symbol>}</Symbol><br/>
0627 <Normal Text>    </Normal Text><ControlFlowKeyword>if</ControlFlowKeyword><Normal Text> </Normal Text><Keyword>let</Keyword><Normal Text> </Normal Text><Variable>rules</Variable><Normal Text> </Normal Text><Symbol>=</Symbol><Normal Text> </Normal Text><ControlFlowKeyword>try</ControlFlowKeyword><Symbol>?</Symbol><Normal Text> rulesFor</Normal Text><Symbol>(</Symbol><Normal Text>args</Normal Text><Symbol>,</Symbol><Normal Text> lint</Normal Text><Symbol>:</Symbol><Normal Text> </Normal Text><Keyword>true</Keyword><Symbol>)</Symbol><Normal Text> </Normal Text><Symbol>{</Symbol><br/>
0628 <Normal Text>        </Normal Text><ControlFlowKeyword>for</ControlFlowKeyword><Normal Text> arg </Normal Text><ControlFlowKeyword>in</ControlFlowKeyword><Normal Text> args</Normal Text><Symbol>.</Symbol><Normal Text>keys </Normal Text><Keyword>where</Keyword><Normal Text> formattingArguments</Normal Text><Symbol>.</Symbol><Normal Text>contains</Normal Text><Symbol>(</Symbol><Normal Text>arg</Normal Text><Symbol>)</Symbol><Normal Text> </Normal Text><Symbol>{</Symbol><br/>
0629 <Normal Text>            </Normal Text><ControlFlowKeyword>if</ControlFlowKeyword><Normal Text> </Normal Text><Symbol>!</Symbol><Normal Text>rules</Normal Text><Symbol>.</Symbol><Normal Text>contains</Normal Text><Symbol>(</Symbol><Keyword>where</Keyword><Symbol>:</Symbol><Normal Text> </Normal Text><Symbol>{</Symbol><br/>
0630 <Normal Text>                </Normal Text><ControlFlowKeyword>guard</ControlFlowKeyword><Normal Text> </Normal Text><Keyword>let</Keyword><Normal Text> </Normal Text><Variable>rule</Variable><Normal Text> </Normal Text><Symbol>=</Symbol><Normal Text> FormatRules</Normal Text><Symbol>.</Symbol><Normal Text>byName</Normal Text><Symbol>[</Symbol><Normal Text>$</Normal Text><Decimal>0</Decimal><Symbol>]</Symbol><Normal Text> </Normal Text><ControlFlowKeyword>else</ControlFlowKeyword><Normal Text> </Normal Text><Symbol>{</Symbol><br/>
0631 <Normal Text>                    </Normal Text><Keyword>return</Keyword><Normal Text> </Normal Text><Keyword>false</Keyword><br/>
0632 <Normal Text>                </Normal Text><Symbol>}</Symbol><br/>
0633 <Normal Text>                </Normal Text><Keyword>return</Keyword><Normal Text> rule</Normal Text><Symbol>.</Symbol><Normal Text>options</Normal Text><Symbol>.</Symbol><Normal Text>contains</Normal Text><Symbol>(</Symbol><Normal Text>arg</Normal Text><Symbol>)</Symbol><Normal Text> </Normal Text><Symbol>||</Symbol><Normal Text> rule</Normal Text><Symbol>.</Symbol><Normal Text>sharedOptions</Normal Text><Symbol>.</Symbol><Normal Text>contains</Normal Text><Symbol>(</Symbol><Normal Text>arg</Normal Text><Symbol>)</Symbol><br/>
0634 <Normal Text>            </Normal Text><Symbol>})</Symbol><Normal Text> </Normal Text><Symbol>{</Symbol><br/>
0635 <Normal Text>                </Normal Text><Keyword>let</Keyword><Normal Text> </Normal Text><Variable>expected</Variable><Normal Text> </Normal Text><Symbol>=</Symbol><Normal Text> FormatRules</Normal Text><Symbol>.</Symbol><Normal Text>all</Normal Text><Symbol>.</Symbol><Normal Text>first</Normal Text><Symbol>(</Symbol><Keyword>where</Keyword><Symbol>:</Symbol><Normal Text> </Normal Text><Symbol>{</Symbol><br/>
0636 <Normal Text>                    $</Normal Text><Float>0.</Float><Normal Text>options</Normal Text><Symbol>.</Symbol><Normal Text>contains</Normal Text><Symbol>(</Symbol><Normal Text>arg</Normal Text><Symbol>)</Symbol><br/>
0637 <Normal Text>                </Normal Text><Symbol>})?.</Symbol><Normal Text>name </Normal Text><Symbol>??</Symbol><Normal Text> </Normal Text><String>"associated"</String><br/>
0638 <Normal Text>                warnings</Normal Text><Symbol>.</Symbol><Normal Text>append</Normal Text><Symbol>(</Symbol><String>"--</String><Error>\(</Error><String>arg) option has no effect when </String><Error>\(</Error><String>expected) rule is disabled"</String><Symbol>)</Symbol><br/>
0639 <Normal Text>            </Normal Text><Symbol>}</Symbol><br/>
0640 <Normal Text>        </Normal Text><Symbol>}</Symbol><br/>
0641 <Normal Text>    </Normal Text><Symbol>}</Symbol><br/>
0642 <Normal Text>    </Normal Text><Keyword>return</Keyword><Normal Text> warnings</Normal Text><br/>
0643 <Symbol>}</Symbol><br/>
0644 <Normal Text></Normal Text><br/>
0645 <Keyword>let</Keyword><Normal Text> </Normal Text><Variable>fileArguments</Variable><Normal Text> </Normal Text><Symbol>=</Symbol><Normal Text> </Normal Text><Symbol>[</Symbol><br/>
0646 <Normal Text>    </Normal Text><String>"symlinks"</String><Symbol>,</Symbol><br/>
0647 <Normal Text>    </Normal Text><String>"exclude"</String><Symbol>,</Symbol><br/>
0648 <Normal Text>    </Normal Text><String>"unexclude"</String><Symbol>,</Symbol><br/>
0649 <Normal Text>    </Normal Text><String>"minversion"</String><Symbol>,</Symbol><br/>
0650 <Symbol>]</Symbol><br/>
0651 <Normal Text></Normal Text><br/>
0652 <Keyword>let</Keyword><Normal Text> </Normal Text><Variable>rulesArguments</Variable><Normal Text> </Normal Text><Symbol>=</Symbol><Normal Text> </Normal Text><Symbol>[</Symbol><br/>
0653 <Normal Text>    </Normal Text><String>"disable"</String><Symbol>,</Symbol><br/>
0654 <Normal Text>    </Normal Text><String>"enable"</String><Symbol>,</Symbol><br/>
0655 <Normal Text>    </Normal Text><String>"lintonly"</String><Symbol>,</Symbol><br/>
0656 <Normal Text>    </Normal Text><String>"rules"</String><Symbol>,</Symbol><br/>
0657 <Symbol>]</Symbol><br/>
0658 <Normal Text></Normal Text><br/>
0659 <Keyword>let</Keyword><Normal Text> </Normal Text><Variable>formattingArguments</Variable><Normal Text> </Normal Text><Symbol>=</Symbol><Normal Text> Descriptors</Normal Text><Symbol>.</Symbol><Normal Text>formatting</Normal Text><Symbol>.</Symbol><Normal Text>map </Normal Text><Symbol>{</Symbol><Normal Text> $</Normal Text><Float>0.</Float><Normal Text>argumentName </Normal Text><Symbol>}</Symbol><br/>
0660 <Keyword>let</Keyword><Normal Text> </Normal Text><Variable>internalArguments</Variable><Normal Text> </Normal Text><Symbol>=</Symbol><Normal Text> Descriptors</Normal Text><Symbol>.</Symbol><Keyword>internal</Keyword><Symbol>.</Symbol><Normal Text>map </Normal Text><Symbol>{</Symbol><Normal Text> $</Normal Text><Float>0.</Float><Normal Text>argumentName </Normal Text><Symbol>}</Symbol><br/>
0661 <Keyword>let</Keyword><Normal Text> </Normal Text><Variable>optionsArguments</Variable><Normal Text> </Normal Text><Symbol>=</Symbol><Normal Text> fileArguments </Normal Text><Symbol>+</Symbol><Normal Text> rulesArguments </Normal Text><Symbol>+</Symbol><Normal Text> formattingArguments </Normal Text><Symbol>+</Symbol><Normal Text> internalArguments</Normal Text><br/>
0662 <Normal Text></Normal Text><br/>
0663 <Keyword>let</Keyword><Normal Text> </Normal Text><Variable>commandLineArguments</Variable><Normal Text> </Normal Text><Symbol>=</Symbol><Normal Text> </Normal Text><Symbol>[</Symbol><br/>
0664 <Normal Text>    </Normal Text><Comment>// Input options</Comment><br/>
0665 <Normal Text>    </Normal Text><String>"filelist"</String><Symbol>,</Symbol><br/>
0666 <Normal Text>    </Normal Text><String>"stdinpath"</String><Symbol>,</Symbol><br/>
0667 <Normal Text>    </Normal Text><String>"config"</String><Symbol>,</Symbol><br/>
0668 <Normal Text>    </Normal Text><String>"inferoptions"</String><Symbol>,</Symbol><br/>
0669 <Normal Text>    </Normal Text><String>"linerange"</String><Symbol>,</Symbol><br/>
0670 <Normal Text>    </Normal Text><String>"output"</String><Symbol>,</Symbol><br/>
0671 <Normal Text>    </Normal Text><String>"cache"</String><Symbol>,</Symbol><br/>
0672 <Normal Text>    </Normal Text><String>"dryrun"</String><Symbol>,</Symbol><br/>
0673 <Normal Text>    </Normal Text><String>"lint"</String><Symbol>,</Symbol><br/>
0674 <Normal Text>    </Normal Text><String>"lenient"</String><Symbol>,</Symbol><br/>
0675 <Normal Text>    </Normal Text><String>"verbose"</String><Symbol>,</Symbol><br/>
0676 <Normal Text>    </Normal Text><String>"quiet"</String><Symbol>,</Symbol><br/>
0677 <Normal Text>    </Normal Text><String>"report"</String><Symbol>,</Symbol><br/>
0678 <Normal Text>    </Normal Text><Comment>// Misc</Comment><br/>
0679 <Normal Text>    </Normal Text><String>"help"</String><Symbol>,</Symbol><br/>
0680 <Normal Text>    </Normal Text><String>"version"</String><Symbol>,</Symbol><br/>
0681 <Normal Text>    </Normal Text><String>"options"</String><Symbol>,</Symbol><br/>
0682 <Normal Text>    </Normal Text><String>"ruleinfo"</String><Symbol>,</Symbol><br/>
0683 <Symbol>]</Symbol><Normal Text> </Normal Text><Symbol>+</Symbol><Normal Text> optionsArguments</Normal Text><br/>
0684 <Normal Text></Normal Text><br/>
0685 <Keyword>let</Keyword><Normal Text> </Normal Text><Variable>deprecatedArguments</Variable><Normal Text> </Normal Text><Symbol>=</Symbol><Normal Text> Descriptors</Normal Text><Symbol>.</Symbol><Normal Text>all</Normal Text><Symbol>.</Symbol><Normal Text>compactMap </Normal Text><Symbol>{</Symbol><br/>
0686 <Normal Text>    $</Normal Text><Float>0.</Float><Normal Text>isDeprecated </Normal Text><Symbol>?</Symbol><Normal Text> $</Normal Text><Float>0.</Float><Normal Text>argumentName </Normal Text><Symbol>:</Symbol><Normal Text> </Normal Text><Keyword>nil</Keyword><br/>
0687 <Symbol>}</Symbol><br/>