diff --git a/docs/release-notes/.FSharp.Compiler.Service/10.0.100.md b/docs/release-notes/.FSharp.Compiler.Service/10.0.100.md index fe1ddaf787d..314ac11cbf0 100644 --- a/docs/release-notes/.FSharp.Compiler.Service/10.0.100.md +++ b/docs/release-notes/.FSharp.Compiler.Service/10.0.100.md @@ -7,6 +7,7 @@ * Diagnostics: add extended data for 'No constructors' error ([PR #18863](https://github.com/dotnet/fsharp/pull/18863)) * FSharpType.Format: support top-level prefix generic types style. ([PR #18897](https://github.com/dotnet/fsharp/pull/18897)) * FCS: allow getting captured types ([PR $18878](https://github.com/dotnet/fsharp/pull/18878)) +* Support `CallerArgumentExpression` ([Language Suggestion #966](https://github.com/fsharp/fslang-suggestions/issues/966), [PR #17519](https://github.com/dotnet/fsharp/pull/17519)) ### Fixed @@ -42,6 +43,7 @@ * Parser: Capture named fields block separators. ([PR #18857](https://github.com/dotnet/fsharp/pull/18857)) * Type checker: use inner expr range in upcast constraints errors ([PR #18850](https://github.com/dotnet/fsharp/pull/18850)) * Import `IEnumerable` as `seq`. ([PR #18865](https://github.com/dotnet/fsharp/pull/18865)) +* `assert` keyword enhancement ([Issue #18489](https://github.com/dotnet/fsharp/issues/18489), [PR #17519](https://github.com/dotnet/fsharp/pull/17519)) ### Breaking Changes diff --git a/docs/release-notes/.Language/preview.md b/docs/release-notes/.Language/preview.md index fcec4b8170e..c2900cc4e0e 100644 --- a/docs/release-notes/.Language/preview.md +++ b/docs/release-notes/.Language/preview.md @@ -11,6 +11,7 @@ * Allow `let!`, `use!`, `and!` type annotations without requiring parentheses (([PR #18508](https://github.com/dotnet/fsharp/pull/18508) and [PR #18682](https://github.com/dotnet/fsharp/pull/18682))) * Exception names are now validated for illegal characters using the same mechanism as types/modules/namespaces ([Issue #18763](https://github.com/dotnet/fsharp/issues/18763)) * Support tail calls in computation expressions ([PR #18804](https://github.com/dotnet/fsharp/pull/18804)) +* Support `CallerArgumentExpression` ([Language Suggestion #966](https://github.com/fsharp/fslang-suggestions/issues/966), [PR #17519](https://github.com/dotnet/fsharp/pull/17519)) ### Fixed diff --git a/src/Compiler/Checking/CheckBasics.fs b/src/Compiler/Checking/CheckBasics.fs index 7cbca970cc3..401c39791f0 100644 --- a/src/Compiler/Checking/CheckBasics.fs +++ b/src/Compiler/Checking/CheckBasics.fs @@ -335,6 +335,8 @@ type TcFileState = // forward call TcComputationExpression: TcFileState -> TcEnv -> OverallTy -> UnscopedTyparEnv -> range * Expr * TType * SynExpr -> Expr * UnscopedTyparEnv + + SourceText: ISourceText option } /// Create a new compilation environment @@ -344,7 +346,8 @@ type TcFileState = tcSimplePats, tcSequenceExpressionEntry, tcArrayOrListSequenceExpression, - tcComputationExpression) = + tcComputationExpression, + sourceText: ISourceText option) = let niceNameGen = NiceNameGenerator() let infoReader = InfoReader(g, amap) @@ -376,6 +379,7 @@ type TcFileState = TcSequenceExpressionEntry = tcSequenceExpressionEntry TcArrayOrListComputedExpression = tcArrayOrListSequenceExpression TcComputationExpression = tcComputationExpression + SourceText = sourceText } override _.ToString() = "" diff --git a/src/Compiler/Checking/CheckBasics.fsi b/src/Compiler/Checking/CheckBasics.fsi index 179752c394c..cda5f9c646e 100644 --- a/src/Compiler/Checking/CheckBasics.fsi +++ b/src/Compiler/Checking/CheckBasics.fsi @@ -313,6 +313,9 @@ type TcFileState = -> UnscopedTyparEnv -> range * Expr * TType * SynExpr -> Expr * UnscopedTyparEnv + + /// The impl file content. Used to support `CallerArgumentExpression` feature. + SourceText: ISourceText option } static member Create: @@ -356,5 +359,6 @@ type TcFileState = -> OverallTy -> UnscopedTyparEnv -> range * Expr * TType * SynExpr - -> Expr * UnscopedTyparEnv) -> + -> Expr * UnscopedTyparEnv) * + sourceText: ISourceText option -> TcFileState diff --git a/src/Compiler/Checking/CheckDeclarations.fs b/src/Compiler/Checking/CheckDeclarations.fs index cbf79fbdfb3..c2af8940b46 100644 --- a/src/Compiler/Checking/CheckDeclarations.fs +++ b/src/Compiler/Checking/CheckDeclarations.fs @@ -5766,7 +5766,8 @@ let CheckOneImplFile env, rootSigOpt: ModuleOrNamespaceType option, synImplFile, - diagnosticOptions) = + diagnosticOptions, + sourceText: ISourceText option) = let (ParsedImplFileInput (fileName, isScript, qualNameOfFile, _, implFileFrags, isLastCompiland, _, _)) = synImplFile let infoReader = InfoReader(g, amap) @@ -5789,7 +5790,8 @@ let CheckOneImplFile tcSimplePats=TcSimplePats, tcSequenceExpressionEntry=TcSequenceExpressionEntry, tcArrayOrListSequenceExpression=TcArrayOrListComputedExpression, - tcComputationExpression=TcComputationExpression) + tcComputationExpression=TcComputationExpression, + sourceText=sourceText) let envinner, moduleTyAcc = MakeInitialEnv env @@ -5934,7 +5936,8 @@ let CheckOneSigFile (g, amap, thisCcu, checkForErrors, conditionalDefines, tcSin tcSimplePats=TcSimplePats, tcSequenceExpressionEntry=TcSequenceExpressionEntry, tcArrayOrListSequenceExpression=TcArrayOrListComputedExpression, - tcComputationExpression=TcComputationExpression) + tcComputationExpression=TcComputationExpression, + sourceText=None) let envinner, moduleTyAcc = MakeInitialEnv tcEnv let m = sigFile.QualifiedName.Range diff --git a/src/Compiler/Checking/CheckDeclarations.fsi b/src/Compiler/Checking/CheckDeclarations.fsi index 9b06fcc828d..95c770d984f 100644 --- a/src/Compiler/Checking/CheckDeclarations.fsi +++ b/src/Compiler/Checking/CheckDeclarations.fsi @@ -59,7 +59,8 @@ val CheckOneImplFile: TcEnv * ModuleOrNamespaceType option * ParsedImplFileInput * - FSharpDiagnosticOptions -> + FSharpDiagnosticOptions * + ISourceText option -> Cancellable val CheckOneSigFile: diff --git a/src/Compiler/Checking/Expressions/CheckExpressions.fs b/src/Compiler/Checking/Expressions/CheckExpressions.fs index 6979f20f0e0..7329417f98f 100644 --- a/src/Compiler/Checking/Expressions/CheckExpressions.fs +++ b/src/Compiler/Checking/Expressions/CheckExpressions.fs @@ -7727,9 +7727,23 @@ and TcConstExpr cenv (overallTy: OverallTy) env m tpenv c = // Check an 'assert x' expression. and TcAssertExpr cenv overallTy env (m: range) tpenv x = let synm = m.MakeSynthetic() // Mark as synthetic so the language service won't pick it up. + + // wrap an extra parentheses so 'assert(x=1) isn't considered a named argument to a method call + let arg1Expr = SynExpr.Paren (x, range0, None, synm) + + let argExpr = + match cenv.SourceText with + | Some sourceText when cenv.g.langVersion.SupportsFeature LanguageFeature.SupportCallerArgumentExpression -> + let mArgExpr = x.Range.MakeSynthetic() + let code = sourceText.GetSubTextFromRange mArgExpr + if System.String.IsNullOrEmpty code then arg1Expr + else + let arg2Expr = SynExpr.Const (SynConst.String (code, SynStringKind.Regular, mArgExpr), mArgExpr) + SynExpr.Tuple(false, [arg1Expr; arg2Expr], [], mArgExpr) + | _ -> arg1Expr + let callDiagnosticsExpr = SynExpr.App (ExprAtomicFlag.Atomic, false, mkSynLidGet synm ["System";"Diagnostics";"Debug"] "Assert", - // wrap an extra parentheses so 'assert(x=1) isn't considered a named argument to a method call - SynExpr.Paren (x, range0, None, synm), synm) + argExpr, synm) TcExpr cenv overallTy env tpenv callDiagnosticsExpr @@ -10309,8 +10323,18 @@ and TcMethodApplication /// STEP 5. Build the argument list. Adjust for optional arguments, byref arguments and coercions. let objArgPreBinder, objArgs, allArgsPreBinders, allArgs, allArgsCoerced, optArgPreBinder, paramArrayPreBinders, outArgExprs, outArgTmpBinds = + + // We apply CallerArgumentExpression to optional parameters only when the method call has syntactic arguments. + // Otherwise, we cannot get the range of the argument. The argument range will be the method name range. + // System.ArgumentException.ThrowIfNullOrEmpty(null) <-- Can get the argument text through its range + // (System.ArgumentException.ThrowIfNullOrEmpty) null <-- Cannot get the right text + // System.ArgumentException.ThrowIfNullOrEmpty <| null <-- Cannot get the right text + // null |> System.ArgumentException.ThrowIfNullOrEmpty <-- Cannot get the right text + // let f = System.ArgumentException.ThrowIfNullOrEmpty in f(null) <-- Cannot get the right text + let canApplyCallerArgumentExpression = curriedCallerArgsOpt.IsSome + let tcVal = LightweightTcValForUsingInBuildMethodCall g - AdjustCallerArgs tcVal TcFieldInit env.eCallerMemberName cenv.infoReader ad finalCalledMeth objArgs lambdaVars mItem mMethExpr + AdjustCallerArgs tcVal TcFieldInit cenv.infoReader ad finalCalledMeth objArgs lambdaVars mItem mMethExpr (env.eCallerMemberName, cenv.SourceText, canApplyCallerArgumentExpression) // Record the resolution of the named argument for the Language Service allArgs |> List.iter (fun assignedArg -> diff --git a/src/Compiler/Checking/MethodCalls.fs b/src/Compiler/Checking/MethodCalls.fs index 18c74326333..6929a21ae56 100644 --- a/src/Compiler/Checking/MethodCalls.fs +++ b/src/Compiler/Checking/MethodCalls.fs @@ -1443,9 +1443,31 @@ let AdjustCallerArgExpr tcVal (g: TcGlobals) amap infoReader ad isOutArg calledA /// matter what order they are applied in as long as they are all composed together. let emptyPreBinder (e: Expr) = e +[] +type CheckCallerAttributesEnv<'t> = + { + eCallerMemberName: string option + sourceText: ISourceText option + assignedArgs: AssignedCalledArg<'t> list + canApplyCallerArgumentExpression: bool + } + +/// Try to pick the code text of an argument with the given parameter name from a list of assigned arguments. +let tryPickArgumentCodeText checkCallerAttributesEnv paramName = + if not checkCallerAttributesEnv.canApplyCallerArgumentExpression then None else + checkCallerAttributesEnv.assignedArgs + |> List.tryPick (fun { CalledArg=called; CallerArg=caller } -> + match called.NameOpt, checkCallerAttributesEnv.sourceText with + | Some x, Some sourceText when x.idText = paramName -> + let range = caller.Range + let code = sourceText.GetSubTextFromRange range + if System.String.IsNullOrEmpty code then None + else Some code + | _ -> None) + /// Get the expression that must be inserted on the caller side for a CallerSide optional arg, /// i.e. one where there is no corresponding caller arg. -let rec GetDefaultExpressionForCallerSideOptionalArg tcFieldInit g (calledArg: CalledArg) currCalledArgTy currDfltVal eCallerMemberName mMethExpr = +let rec GetDefaultExpressionForCallerSideOptionalArg tcFieldInit g (calledArg: CalledArg) currCalledArgTy currDfltVal mMethExpr checkCallerAttributesEnv = match currDfltVal with | MissingValue -> // Add an I_nop if this is an initonly field to make sure we never recognize it as an lvalue. See mkExprAddrOfExpr. @@ -1462,10 +1484,10 @@ let rec GetDefaultExpressionForCallerSideOptionalArg tcFieldInit g (calledArg: C let ctorArgs = [Expr.Const (tcFieldInit mMethExpr fieldInit, mMethExpr, inst)] emptyPreBinder, Expr.Op (TOp.ILCall (false, false, true, true, NormalValUse, false, false, ctor, [inst], [], [currCalledArgTy]), [], ctorArgs, mMethExpr) | ByrefTy g inst -> - GetDefaultExpressionForCallerSideOptionalArg tcFieldInit g calledArg inst (PassByRef(inst, currDfltVal)) eCallerMemberName mMethExpr + GetDefaultExpressionForCallerSideOptionalArg tcFieldInit g calledArg inst (PassByRef(inst, currDfltVal)) mMethExpr checkCallerAttributesEnv | _ -> let mLineDirectivesApplied = mMethExpr.ApplyLineDirectives() - match calledArg.CallerInfo, eCallerMemberName with + match calledArg.CallerInfo, checkCallerAttributesEnv.eCallerMemberName with | CallerLineNumber, _ when typeEquiv g currCalledArgTy g.int_ty -> emptyPreBinder, Expr.Const (Const.Int32(mLineDirectivesApplied.StartLine), mMethExpr, currCalledArgTy) | CallerFilePath, _ when typeEquiv g currCalledArgTy g.string_ty -> @@ -1473,6 +1495,14 @@ let rec GetDefaultExpressionForCallerSideOptionalArg tcFieldInit g (calledArg: C emptyPreBinder, Expr.Const (Const.String fileName, mMethExpr, currCalledArgTy) | CallerMemberName, Some callerName when (typeEquiv g currCalledArgTy g.string_ty) -> emptyPreBinder, Expr.Const (Const.String callerName, mMethExpr, currCalledArgTy) + + | CallerArgumentExpression param, _ when g.langVersion.SupportsFeature LanguageFeature.SupportCallerArgumentExpression && typeEquiv g currCalledArgTy g.string_ty -> + let stringConst = + match tryPickArgumentCodeText checkCallerAttributesEnv param with + | Some code -> Const.String code + | None -> tcFieldInit mMethExpr fieldInit + emptyPreBinder, Expr.Const (stringConst, mMethExpr, currCalledArgTy) + | _ -> emptyPreBinder, Expr.Const (tcFieldInit mMethExpr fieldInit, mMethExpr, currCalledArgTy) @@ -1496,18 +1526,18 @@ let rec GetDefaultExpressionForCallerSideOptionalArg tcFieldInit g (calledArg: C | PassByRef (ty, dfltVal2) -> let v, _ = mkCompGenLocal mMethExpr "defaultByrefArg" ty - let wrapper2, rhs = GetDefaultExpressionForCallerSideOptionalArg tcFieldInit g calledArg currCalledArgTy dfltVal2 eCallerMemberName mMethExpr + let wrapper2, rhs = GetDefaultExpressionForCallerSideOptionalArg tcFieldInit g calledArg currCalledArgTy dfltVal2 mMethExpr checkCallerAttributesEnv (wrapper2 >> mkCompGenLet mMethExpr v rhs), mkValAddr mMethExpr false (mkLocalValRef v) /// Get the expression that must be inserted on the caller side for a CalleeSide optional arg where /// no caller argument has been provided. Normally this is 'None', however CallerMemberName and friends /// can be used with 'CalleeSide' optional arguments -let GetDefaultExpressionForCalleeSideOptionalArg g (calledArg: CalledArg) eCallerMemberName (mMethExpr: range) = +let GetDefaultExpressionForCalleeSideOptionalArg g (calledArg: CalledArg) (mMethExpr: range) checkCallerAttributesEnv = let calledArgTy = calledArg.CalledArgumentType let calledNonOptTy = tryDestOptionalTy g calledArgTy let mLineDirectivesApplied = mMethExpr.ApplyLineDirectives() - match calledArg.CallerInfo, eCallerMemberName with + match calledArg.CallerInfo, checkCallerAttributesEnv.eCallerMemberName with | CallerLineNumber, _ when typeEquiv g calledNonOptTy g.int_ty -> let lineExpr = Expr.Const(Const.Int32 mLineDirectivesApplied.StartLine, mMethExpr, calledNonOptTy) mkOptionalSome g calledArgTy calledNonOptTy lineExpr mMethExpr @@ -1518,13 +1548,21 @@ let GetDefaultExpressionForCalleeSideOptionalArg g (calledArg: CalledArg) eCalle | CallerMemberName, Some(callerName) when typeEquiv g calledNonOptTy g.string_ty -> let memberNameExpr = Expr.Const (Const.String callerName, mMethExpr, calledNonOptTy) mkOptionalSome g calledArgTy calledNonOptTy memberNameExpr mMethExpr + + | CallerArgumentExpression param, _ when g.langVersion.SupportsFeature LanguageFeature.SupportCallerArgumentExpression && typeEquiv g calledNonOptTy g.string_ty -> + match tryPickArgumentCodeText checkCallerAttributesEnv param with + | Some code -> + let expr = Expr.Const(Const.String code, mMethExpr, calledNonOptTy) + mkOptionalSome g calledArgTy calledNonOptTy expr mMethExpr + | None -> mkOptionalNone g calledArgTy calledNonOptTy mMethExpr + | _ -> mkOptionalNone g calledArgTy calledNonOptTy mMethExpr /// Get the expression that must be inserted on the caller side for an optional arg where /// no caller argument has been provided. -let GetDefaultExpressionForOptionalArg tcFieldInit g (calledArg: CalledArg) eCallerMemberName mItem (mMethExpr: range) = +let GetDefaultExpressionForOptionalArg tcFieldInit g (calledArg: CalledArg) mItem (mMethExpr: range) checkCallerAttributesEnv = let calledArgTy = calledArg.CalledArgumentType let preBinder, expr = match calledArg.OptArgInfo with @@ -1532,17 +1570,17 @@ let GetDefaultExpressionForOptionalArg tcFieldInit g (calledArg: CalledArg) eCal error(InternalError("Unexpected NotOptional", mItem)) | CallerSide dfltVal -> - GetDefaultExpressionForCallerSideOptionalArg tcFieldInit g calledArg calledArgTy dfltVal eCallerMemberName mMethExpr + GetDefaultExpressionForCallerSideOptionalArg tcFieldInit g calledArg calledArgTy dfltVal mMethExpr checkCallerAttributesEnv | CalleeSide -> - emptyPreBinder, GetDefaultExpressionForCalleeSideOptionalArg g calledArg eCallerMemberName mMethExpr + emptyPreBinder, GetDefaultExpressionForCalleeSideOptionalArg g calledArg mMethExpr checkCallerAttributesEnv // Combine the variable allocators (if any) let callerArg = CallerArg(calledArgTy, mMethExpr, false, expr) preBinder, { NamedArgIdOpt = None; CalledArg = calledArg; CallerArg = callerArg } // Adjust all the optional arguments, filling in values for defaults, -let AdjustCallerArgForOptional tcVal tcFieldInit eCallerMemberName (infoReader: InfoReader) ad (assignedArg: AssignedCalledArg<_>) = +let AdjustCallerArgForOptional tcVal tcFieldInit checkCallerAttributesEnv (infoReader: InfoReader) ad (assignedArg: AssignedCalledArg<_>) = let g = infoReader.g let amap = infoReader.amap let callerArg = assignedArg.CallerArg @@ -1589,7 +1627,8 @@ let AdjustCallerArgForOptional tcVal tcFieldInit eCallerMemberName (infoReader: mkOptionToNullable g m (destOptionTy g callerArgTy) callerArgExpr else // CSharpMethod(?x=b) when 'b' has optional type and 'x' has non-nullable type --> CSharpMethod(x=Option.defaultValue DEFAULT v) - let _wrapper, defaultExpr = GetDefaultExpressionForCallerSideOptionalArg tcFieldInit g calledArg calledArgTy dfltVal eCallerMemberName m + let checkCallerAttributesEnv = { checkCallerAttributesEnv with assignedArgs = [assignedArg] } + let _wrapper, defaultExpr = GetDefaultExpressionForCallerSideOptionalArg tcFieldInit g calledArg calledArgTy dfltVal m checkCallerAttributesEnv let ty = destOptionTy g callerArgTy mkOptionDefaultValue g m ty defaultExpr callerArgExpr else @@ -1639,7 +1678,7 @@ let AdjustCallerArgForOptional tcVal tcFieldInit eCallerMemberName (infoReader: // - VB also allows you to pass intrinsic values as optional values to parameters // typed as Object. What we do in this case is we box the intrinsic value." // -let AdjustCallerArgsForOptionals tcVal tcFieldInit eCallerMemberName (infoReader: InfoReader) ad (calledMeth: CalledMeth<_>) mItem mMethExpr = +let AdjustCallerArgsForOptionals tcVal tcFieldInit (infoReader: InfoReader) ad (calledMeth: CalledMeth<_>) mItem mMethExpr (eCallerMemberName, sourceText, canApplyCallerArgumentExpression) = let g = infoReader.g let assignedNamedArgs = calledMeth.ArgSets |> List.collect (fun argSet -> argSet.AssignedNamedArgs) @@ -1649,15 +1688,26 @@ let AdjustCallerArgsForOptionals tcVal tcFieldInit eCallerMemberName (infoReader (unnamedCalledArgs, unnamedCallerArgs) ||> List.map2 (fun called caller -> { NamedArgIdOpt = None; CalledArg=called; CallerArg=caller }) + let checkCallerAttributesEnv = + { + sourceText = sourceText + eCallerMemberName = eCallerMemberName + assignedArgs = assignedNamedArgs @ unnamedArgs + canApplyCallerArgumentExpression = canApplyCallerArgumentExpression + } + + if not canApplyCallerArgumentExpression && calledMeth.UnnamedCalledOptArgs |> List.exists (fun i -> i.CallerInfo.IsCallerArgumentExpression) then + informationalWarning(Error(FSComp.SR.tcCallerArgumentExpressionWillNotBeApplied(), mMethExpr)) + // Adjust all the optional arguments that require a default value to be inserted into the call, // i.e. there is no corresponding caller arg. let optArgs, optArgPreBinder = (emptyPreBinder, calledMeth.UnnamedCalledOptArgs) ||> List.mapFold (fun preBinder calledArg -> - let preBinder2, arg = GetDefaultExpressionForOptionalArg tcFieldInit g calledArg eCallerMemberName mItem mMethExpr + let preBinder2, arg = GetDefaultExpressionForOptionalArg tcFieldInit g calledArg mItem mMethExpr checkCallerAttributesEnv arg, (preBinder >> preBinder2)) - let adjustedNormalUnnamedArgs = List.map (AdjustCallerArgForOptional tcVal tcFieldInit eCallerMemberName infoReader ad) unnamedArgs - let adjustedAssignedNamedArgs = List.map (AdjustCallerArgForOptional tcVal tcFieldInit eCallerMemberName infoReader ad) assignedNamedArgs + let adjustedNormalUnnamedArgs = List.map (AdjustCallerArgForOptional tcVal tcFieldInit checkCallerAttributesEnv infoReader ad) unnamedArgs + let adjustedAssignedNamedArgs = List.map (AdjustCallerArgForOptional tcVal tcFieldInit checkCallerAttributesEnv infoReader ad) assignedNamedArgs optArgs, optArgPreBinder, adjustedNormalUnnamedArgs, adjustedAssignedNamedArgs @@ -1705,7 +1755,7 @@ let AdjustParamArrayCallerArgs tcVal g amap infoReader ad (calledMeth: CalledMet /// Build the argument list for a method call. Adjust for param array, optional arguments, byref arguments and coercions. /// For example, if you pass an F# reference cell to a byref then we must get the address of the /// contents of the ref. Likewise lots of adjustments are made for optional arguments etc. -let AdjustCallerArgs tcVal tcFieldInit eCallerMemberName (infoReader: InfoReader) ad (calledMeth: CalledMeth<_>) objArgs lambdaVars mItem mMethExpr = +let AdjustCallerArgs tcVal tcFieldInit (infoReader: InfoReader) ad (calledMeth: CalledMeth<_>) objArgs lambdaVars mItem mMethExpr (eCallerMemberName, sourceText, canApplyCallerArgumentExpression) = let g = infoReader.g let amap = infoReader.amap let calledMethInfo = calledMeth.Method @@ -1727,7 +1777,7 @@ let AdjustCallerArgs tcVal tcFieldInit eCallerMemberName (infoReader: InfoReader AdjustParamArrayCallerArgs tcVal g amap infoReader ad calledMeth mMethExpr let optArgs, optArgPreBinder, adjustedNormalUnnamedArgs, adjustedFinalAssignedNamedArgs = - AdjustCallerArgsForOptionals tcVal tcFieldInit eCallerMemberName infoReader ad calledMeth mItem mMethExpr + AdjustCallerArgsForOptionals tcVal tcFieldInit infoReader ad calledMeth mItem mMethExpr (eCallerMemberName, sourceText, canApplyCallerArgumentExpression) let outArgs, outArgExprs, outArgTmpBinds = AdjustOutCallerArgs g calledMeth mMethExpr diff --git a/src/Compiler/Checking/MethodCalls.fsi b/src/Compiler/Checking/MethodCalls.fsi index f167fbe3b03..28bec7a6cad 100644 --- a/src/Compiler/Checking/MethodCalls.fsi +++ b/src/Compiler/Checking/MethodCalls.fsi @@ -433,7 +433,6 @@ val AdjustCallerArgExpr: val AdjustCallerArgs: tcVal: (ValRef -> ValUseFlag -> TType list -> range -> Expr * TType) -> tcFieldInit: (range -> AbstractIL.IL.ILFieldInit -> Const) -> - eCallerMemberName: string option -> infoReader: InfoReader -> ad: AccessorDomain -> calledMeth: CalledMeth -> @@ -441,6 +440,7 @@ val AdjustCallerArgs: lambdaVars: 'a option -> mItem: range -> mMethExpr: range -> + eCallerMemberName: string option * sourceText: ISourceText option * canApplyCallerArgumentExpression: bool -> (Expr -> Expr) * Expr list * 'b option list * diff --git a/src/Compiler/Checking/PostInferenceChecks.fs b/src/Compiler/Checking/PostInferenceChecks.fs index 751112e3918..e0ab6c768a4 100644 --- a/src/Compiler/Checking/PostInferenceChecks.fs +++ b/src/Compiler/Checking/PostInferenceChecks.fs @@ -2391,8 +2391,10 @@ let CheckEntityDefn cenv env (tycon: Entity) = if numCurriedArgSets > 1 && others |> List.exists (fun minfo2 -> not (IsAbstractDefaultPair2 minfo minfo2)) then errorR(Error(FSComp.SR.chkDuplicateMethodCurried(nm, NicePrint.minimalStringOfType cenv.denv ty), m)) + let paramDatas = minfo.GetParamDatas(cenv.amap, m, minfo.FormalMethodInst) + if numCurriedArgSets > 1 && - (minfo.GetParamDatas(cenv.amap, m, minfo.FormalMethodInst) + (paramDatas |> List.existsSquared (fun (ParamData(isParamArrayArg, _isInArg, isOutArg, optArgInfo, callerInfo, _, reflArgInfo, ty)) -> isParamArrayArg || isOutArg || reflArgInfo.AutoQuote || optArgInfo.IsOptional || callerInfo <> NoCallerInfo || isByrefLikeTy g m ty)) then errorR(Error(FSComp.SR.chkCurriedMethodsCantHaveOutParams(), m)) @@ -2418,7 +2420,20 @@ let CheckEntityDefn cenv env (tycon: Entity) = | ValueSome innerTy -> errorR(Error(FSComp.SR.tcCallerInfoWrongType(callerInfo |> string, desiredTyName, NicePrint.minimalStringOfType cenv.denv innerTy), m)) | ValueNone -> errorR(Error(FSComp.SR.tcCallerInfoWrongType(callerInfo |> string, desiredTyName, NicePrint.minimalStringOfType cenv.denv ty), m)) - minfo.GetParamDatas(cenv.amap, m, minfo.FormalMethodInst) + let paramNames = HashSet() + paramDatas + |> List.iterSquared (fun (ParamData(_, _, _, _, _, nameOpt, _, _)) -> + nameOpt |> Option.iter (fun name -> paramNames.Add name.idText |> ignore)) + + let checkArgOfCallerArgumentExpression m arg (nameOpt: Ident option) = + match nameOpt with + | Some ident when arg = ident.idText -> + warning(Error(FSComp.SR.tcCallerArgumentExpressionSelfReferential(), m)) + | _ when not (paramNames.Contains arg) -> + warning(Error(FSComp.SR.tcCallerArgumentExpressionHasInvalidParameterName(), m)) + | _ -> () + + paramDatas |> List.iterSquared (fun (ParamData(_, isInArg, _, optArgInfo, callerInfo, nameOpt, _, ty)) -> ignore isInArg @@ -2436,6 +2451,14 @@ let CheckEntityDefn cenv env (tycon: Entity) = | CalleeSide, CallerLineNumber -> errorIfNotOptional g.int32_ty "int" m ty callerInfo | CallerSide _, (CallerFilePath | CallerMemberName) -> errorIfNotStringTy m ty callerInfo | CalleeSide, (CallerFilePath | CallerMemberName) -> errorIfNotOptional g.string_ty "string" m ty callerInfo + | CallerSide _, CallerArgumentExpression arg -> + checkLanguageFeatureAndRecover g.langVersion LanguageFeature.SupportCallerArgumentExpression m + errorIfNotStringTy m ty callerInfo + checkArgOfCallerArgumentExpression m arg nameOpt + | CalleeSide, CallerArgumentExpression arg -> + checkLanguageFeatureAndRecover g.langVersion LanguageFeature.SupportCallerArgumentExpression m + errorIfNotOptional g.string_ty "string" m ty callerInfo + checkArgOfCallerArgumentExpression m arg nameOpt ) for pinfo in immediateProps do diff --git a/src/Compiler/Checking/infos.fs b/src/Compiler/Checking/infos.fs index 81c777c3685..59f19323df8 100644 --- a/src/Compiler/Checking/infos.fs +++ b/src/Compiler/Checking/infos.fs @@ -240,6 +240,7 @@ type CallerInfo = | CallerLineNumber | CallerMemberName | CallerFilePath + | CallerArgumentExpression of paramName: string override x.ToString() = sprintf "%+A" x @@ -317,20 +318,34 @@ let CrackParamAttribsInfo g (ty: TType, argInfo: ArgReprInfo) = let isCallerLineNumberArg = HasFSharpAttribute g g.attrib_CallerLineNumberAttribute argInfo.Attribs let isCallerFilePathArg = HasFSharpAttribute g g.attrib_CallerFilePathAttribute argInfo.Attribs let isCallerMemberNameArg = HasFSharpAttribute g g.attrib_CallerMemberNameAttribute argInfo.Attribs + let callerArgumentExpressionArg = + TryFindFSharpAttributeOpt g g.attrib_CallerArgumentExpressionAttribute argInfo.Attribs + |> Option.orElseWith (fun () -> TryFindFSharpAttributeByName "System.Runtime.CompilerServices.CallerArgumentExpressionAttribute" argInfo.Attribs) let callerInfo = - match isCallerLineNumberArg, isCallerFilePathArg, isCallerMemberNameArg with - | false, false, false -> NoCallerInfo - | true, false, false -> CallerLineNumber - | false, true, false -> CallerFilePath - | false, false, true -> CallerMemberName - | false, true, true -> + match isCallerLineNumberArg, isCallerFilePathArg, isCallerMemberNameArg, callerArgumentExpressionArg with + | false, false, false, None -> NoCallerInfo + | true, false, false, None -> CallerLineNumber + | false, true, false, None -> CallerFilePath + | false, false, true, None -> CallerMemberName + | false, false, false, Some(Attrib(_, _, (AttribStringArg x :: _), _, _, _, _)) -> + CallerArgumentExpression(x) + + // The caller info precedence: CallerFilePath > CallerMemberName > CallerArgumentExpression + | false, true, false, Some _ + | false, false, true, Some _ -> + let info = if isCallerFilePathArg then CallerFilePath else CallerMemberName + warning(Error(FSComp.SR.tcCallerArgumentExpressionIsOverridden(string info), argInfo.Name.Value.idRange)) + info + | false, true, true, _ -> match TryFindFSharpAttribute g g.attrib_CallerMemberNameAttribute argInfo.Attribs with | Some(Attrib(_, _, _, _, _, _, callerMemberNameAttributeRange)) -> warning(Error(FSComp.SR.CallerMemberNameIsOverridden(argInfo.Name.Value.idText), callerMemberNameAttributeRange)) + if callerArgumentExpressionArg.IsSome then + warning(Error(FSComp.SR.tcCallerArgumentExpressionIsOverridden(nameof CallerFilePath), argInfo.Name.Value.idRange)) CallerFilePath | _ -> failwith "Impossible" - | _, _, _ -> + | _, _, _, _ -> // if multiple caller info attributes are specified, pick the "wrong" one here // so that we get an error later match tryDestOptionTy g ty with @@ -1280,14 +1295,20 @@ type MethInfo = let isCallerLineNumberArg = TryFindILAttribute g.attrib_CallerLineNumberAttribute attrs let isCallerFilePathArg = TryFindILAttribute g.attrib_CallerFilePathAttribute attrs let isCallerMemberNameArg = TryFindILAttribute g.attrib_CallerMemberNameAttribute attrs + let isCallerArgumentExpressionArg = + g.attrib_CallerArgumentExpressionAttribute + |> Option.bind (fun (AttribInfo(tref, _)) -> TryDecodeILAttribute tref attrs) + |> Option.orElseWith (fun () -> TryDecodeILAttributeByName "System.Runtime.CompilerServices.CallerArgumentExpressionAttribute" attrs) let callerInfo = - match isCallerLineNumberArg, isCallerFilePathArg, isCallerMemberNameArg with - | false, false, false -> NoCallerInfo - | true, false, false -> CallerLineNumber - | false, true, false -> CallerFilePath - | false, false, true -> CallerMemberName - | _, _, _ -> + match isCallerLineNumberArg, isCallerFilePathArg, isCallerMemberNameArg, isCallerArgumentExpressionArg with + | false, false, false, None -> NoCallerInfo + | true, false, false, None -> CallerLineNumber + | false, true, false, None -> CallerFilePath + | false, false, true, None -> CallerMemberName + | false, false, false, Some ([ILAttribElem.String (Some name) ], _) -> CallerArgumentExpression(name) + | false, false, false, _ -> NoCallerInfo + | _, _, _, _ -> // if multiple caller info attributes are specified, pick the "wrong" one here // so that we get an error later if p.Type.TypeRef.FullName = "System.Int32" then CallerFilePath diff --git a/src/Compiler/Checking/infos.fsi b/src/Compiler/Checking/infos.fsi index e091834e271..c8a2cdc5e8e 100644 --- a/src/Compiler/Checking/infos.fsi +++ b/src/Compiler/Checking/infos.fsi @@ -101,6 +101,7 @@ type CallerInfo = | CallerLineNumber | CallerMemberName | CallerFilePath + | CallerArgumentExpression of paramName: string [] type ReflectedArgInfo = diff --git a/src/Compiler/Driver/ParseAndCheckInputs.fs b/src/Compiler/Driver/ParseAndCheckInputs.fs index c6de5e776a1..ea2481e770d 100644 --- a/src/Compiler/Driver/ParseAndCheckInputs.fs +++ b/src/Compiler/Driver/ParseAndCheckInputs.fs @@ -470,10 +470,12 @@ let ParseInput // Call the appropriate parser - for signature files or implementation files if FSharpImplFileSuffixes |> List.exists (FileSystemUtils.checkSuffix fileName) then let impl = Parser.implementationFile lexer lexbuf - PostParseModuleImpls(defaultNamespace, fileName, isLastCompiland, impl, lexbuf, diagnosticOptions, Set identStore) + + PostParseModuleImpls(defaultNamespace, fileName, isLastCompiland, impl, lexbuf, diagnosticOptions, Set identStore), + Some lexbuf.SourceText elif FSharpSigFileSuffixes |> List.exists (FileSystemUtils.checkSuffix fileName) then let intfs = Parser.signatureFile lexer lexbuf - PostParseModuleSpecs(defaultNamespace, fileName, isLastCompiland, intfs, lexbuf, diagnosticOptions, Set identStore) + PostParseModuleSpecs(defaultNamespace, fileName, isLastCompiland, intfs, lexbuf, diagnosticOptions, Set identStore), None else if lexbuf.SupportsFeature LanguageFeature.MLCompatRevisions then error (Error(FSComp.SR.buildInvalidSourceFileExtensionUpdated fileName, rangeStartup)) else @@ -624,7 +626,7 @@ let ParseOneInputLexbuf (tcConfig: TcConfig, lexResourceManager, lexbuf, fileNam TestInteractionParserAndExit(tokenizer, lexbuf, tcConfig.exiter) // Parse the input - let res = + let res, sourceTextOpt = ParseInput( (fun _ -> tokenizer ()), tcConfig.diagnosticsOptions, @@ -641,13 +643,13 @@ let ParseOneInputLexbuf (tcConfig: TcConfig, lexResourceManager, lexbuf, fileNam if tcConfig.reportNumDecls then ReportParsingStatistics res - res) + res, sourceTextOpt) input with RecoverableException exn -> errorRecovery exn rangeStartup - EmptyParsedInput(fileName, isLastCompiland) + EmptyParsedInput(fileName, isLastCompiland), None let ValidSuffixes = FSharpSigFileSuffixes @ FSharpImplFileSuffixes @@ -669,6 +671,7 @@ let parseInputStreamAux // Parse the file drawing tokens from the lexbuf ParseOneInputLexbuf(tcConfig, lexResourceManager, lexbuf, fileName, isLastCompiland, diagnosticsLogger) + |> fst let parseInputSourceTextAux (tcConfig: TcConfig, lexResourceManager, fileName, isLastCompiland, diagnosticsLogger, sourceText: ISourceText) @@ -679,6 +682,7 @@ let parseInputSourceTextAux // Parse the file drawing tokens from the lexbuf ParseOneInputLexbuf(tcConfig, lexResourceManager, lexbuf, fileName, isLastCompiland, diagnosticsLogger) + |> fst let parseInputFileAux (tcConfig: TcConfig, lexResourceManager, fileName, isLastCompiland, diagnosticsLogger, retryLocked) = // Get a stream reader for the file @@ -719,7 +723,7 @@ let ParseOneInputFile (tcConfig: TcConfig, lexResourceManager, fileName, isLastC parseInputFileAux (tcConfig, lexResourceManager, fileName, isLastCompiland, diagnosticsLogger, retryLocked) with RecoverableException exn -> errorRecovery exn rangeStartup - EmptyParsedInput(fileName, isLastCompiland) + EmptyParsedInput(fileName, isLastCompiland), None /// Prepare to process inputs independently, e.g. partially in parallel. /// @@ -1224,7 +1228,8 @@ let CheckOneInput prefixPathOpt: LongIdent option, tcSink: TcResultsSink, tcState: TcState, - input: ParsedInput + input: ParsedInput, + sourceTextOpt: ISourceText option ) : Cancellable = cancellable { try @@ -1317,7 +1322,8 @@ let CheckOneInput tcState.tcsTcImplEnv, rootSigOpt, file, - tcConfig.diagnosticsOptions + tcConfig.diagnosticsOptions, + sourceTextOpt ) let tcState = @@ -1343,7 +1349,7 @@ let DiagnosticsLoggerForInput (tcConfig: TcConfig, oldLogger) = GetDiagnosticsLoggerFilteringByScopedNowarn(tcConfig.diagnosticsOptions, oldLogger) /// Typecheck a single file (or interactive entry into F# Interactive) -let CheckOneInputEntry (ctok, checkForErrors, tcConfig: TcConfig, tcImports, tcGlobals, prefixPathOpt) tcState input = +let CheckOneInputEntry (ctok, checkForErrors, tcConfig: TcConfig, tcImports, tcGlobals, prefixPathOpt) tcState (input, sourceTextOpt) = cancellable { // Equip loggers to locally filter w.r.t. scope pragmas in each input use _ = @@ -1353,7 +1359,18 @@ let CheckOneInputEntry (ctok, checkForErrors, tcConfig: TcConfig, tcImports, tcG RequireCompilationThread ctok - return! CheckOneInput(checkForErrors, tcConfig, tcImports, tcGlobals, prefixPathOpt, TcResultsSink.NoSink, tcState, input) + return! + CheckOneInput( + checkForErrors, + tcConfig, + tcImports, + tcGlobals, + prefixPathOpt, + TcResultsSink.NoSink, + tcState, + input, + sourceTextOpt + ) } |> Cancellable.runWithoutCancellation @@ -1372,7 +1389,7 @@ let CheckMultipleInputsFinish (results, tcState: TcState) = let CheckOneInputAndFinish (checkForErrors, tcConfig: TcConfig, tcImports, tcGlobals, prefixPathOpt, tcSink, tcState, input) = cancellable { - let! result, tcState = CheckOneInput(checkForErrors, tcConfig, tcImports, tcGlobals, prefixPathOpt, tcSink, tcState, input) + let! result, tcState = CheckOneInput(checkForErrors, tcConfig, tcImports, tcGlobals, prefixPathOpt, tcSink, tcState, input, None) let finishedResult = CheckMultipleInputsFinish([ result ], tcState) return finishedResult } @@ -1442,8 +1459,18 @@ let CheckOneInputWithCallback tcSink, tcState: TcState, input: ParsedInput, - _skipImplIfSigExists: bool): - (unit -> bool) * TcConfig * TcImports * TcGlobals * LongIdent option * TcResultsSink * TcState * ParsedInput * bool + _skipImplIfSigExists: bool, + sourceTextOpt: ISourceText option): + (unit -> bool) * + TcConfig * + TcImports * + TcGlobals * + LongIdent option * + TcResultsSink * + TcState * + ParsedInput * + bool * + ISourceText option ) : Cancellable> = cancellable { @@ -1538,7 +1565,8 @@ let CheckOneInputWithCallback tcState.tcsTcImplEnv, rootSigOpt, file, - tcConfig.diagnosticsOptions + tcConfig.diagnosticsOptions, + sourceTextOpt ) return @@ -1748,7 +1776,7 @@ let CheckMultipleInputsUsingGraphMode LongIdent option * TcState * (PhasedDiagnostic -> PhasedDiagnostic) * - ParsedInput list + (ParsedInput * ISourceText option) list ) : FinalFileResult list * TcState = use cts = new CancellationTokenSource() @@ -1756,7 +1784,7 @@ let CheckMultipleInputsUsingGraphMode let sourceFiles: FileInProject array = inputs |> List.toArray - |> Array.mapi (fun idx (input: ParsedInput) -> + |> Array.mapi (fun idx (input: ParsedInput, _) -> { Idx = idx FileName = input.FileName @@ -1815,7 +1843,7 @@ let CheckMultipleInputsUsingGraphMode let processFile (node: NodeToTypeCheck) - ((input, logger): ParsedInput * DiagnosticsLogger) + ((input, logger, sourceTextOpt): ParsedInput * DiagnosticsLogger * ISourceText option) ((currentTcState, _currentPriorErrors): State) : Finisher = @@ -1831,7 +1859,7 @@ let CheckMultipleInputsUsingGraphMode return! CheckOneInputWithCallback node - (checkForErrors2, tcConfig, tcImports, tcGlobals, prefixPathOpt, tcSink, currentTcState, input, false) + (checkForErrors2, tcConfig, tcImports, tcGlobals, prefixPathOpt, tcSink, currentTcState, input, false, sourceTextOpt) } |> Cancellable.runWithoutCancellation @@ -1851,18 +1879,18 @@ let CheckMultipleInputsUsingGraphMode let inputsWithLoggers = inputsWithLoggers |> List.toArray - |> Array.map (fun (input, oldLogger) -> + |> Array.map (fun ((input, sourceTextOpt), oldLogger) -> let logger = DiagnosticsLoggerForInput(tcConfig, oldLogger) - input, logger) + input, sourceTextOpt, logger) let processFile (node: NodeToTypeCheck) (state: State) : Finisher = match node with | NodeToTypeCheck.ArtificialImplFile idx -> - let parsedInput, _ = inputsWithLoggers[idx] + let parsedInput, _, _ = inputsWithLoggers[idx] processArtificialImplFile node parsedInput state | NodeToTypeCheck.PhysicalFile idx -> - let parsedInput, logger = inputsWithLoggers[idx] - processFile node (parsedInput, logger) state + let parsedInput, sourceTextOpt, logger = inputsWithLoggers[idx] + processFile node (parsedInput, logger, sourceTextOpt) state let state: State = tcState, priorErrors diff --git a/src/Compiler/Driver/ParseAndCheckInputs.fsi b/src/Compiler/Driver/ParseAndCheckInputs.fsi index 36f3493724c..a432403029c 100644 --- a/src/Compiler/Driver/ParseAndCheckInputs.fsi +++ b/src/Compiler/Driver/ParseAndCheckInputs.fsi @@ -74,7 +74,7 @@ val ParseInput: isLastCompiland: (bool * bool) * identCapture: bool * userOpName: string option -> - ParsedInput + ParsedInput * ISourceText option /// A general routine to process hash directives val ProcessMetaCommandsFromInput: @@ -114,7 +114,7 @@ val ParseOneInputFile: isLastCompiland: (bool * bool) * diagnosticsLogger: DiagnosticsLogger * retryLocked: bool -> - ParsedInput + ParsedInput * ISourceText option val ParseOneInputLexbuf: tcConfig: TcConfig * @@ -123,7 +123,7 @@ val ParseOneInputLexbuf: fileName: string * isLastCompiland: (bool * bool) * diagnosticsLogger: DiagnosticsLogger -> - ParsedInput + ParsedInput * ISourceText option val EmptyParsedInput: fileName: string * isLastCompiland: (bool * bool) -> ParsedInput @@ -134,7 +134,7 @@ val ParseInputFiles: sourceFiles: string list * diagnosticsLogger: DiagnosticsLogger * retryLocked: bool -> - (ParsedInput * string) list + ((ParsedInput * ISourceText option) * string) list /// Process collected directives val FinishPreprocessing: Lexbuf -> FSharpDiagnosticOptions -> bool -> range list -> unit @@ -182,7 +182,8 @@ val CheckOneInput: prefixPathOpt: LongIdent option * tcSink: NameResolution.TcResultsSink * tcState: TcState * - input: ParsedInput -> + input: ParsedInput * + sourceTextOpt: ISourceText option -> Cancellable<(TcEnv * TopAttribs * CheckedImplFile option * ModuleOrNamespaceType) * TcState> val CheckOneInputWithCallback: @@ -195,7 +196,8 @@ val CheckOneInputWithCallback: tcSink: TcResultsSink * tcState: TcState * input: ParsedInput * - _skipImplIfSigExists: bool -> + _skipImplIfSigExists: bool * + sourceTextOptOpt: ISourceText option -> Cancellable> val AddCheckResultsToTcState: @@ -238,7 +240,7 @@ val CheckClosedInputSet: prefixPathOpt: LongIdent option * tcState: TcState * eagerFormat: (PhasedDiagnostic -> PhasedDiagnostic) * - inputs: ParsedInput list -> + inputs: (ParsedInput * ISourceText option) list -> TcState * TopAttribs * CheckedImplFile list * TcEnv /// Check a single input and finish the checking diff --git a/src/Compiler/Driver/ScriptClosure.fs b/src/Compiler/Driver/ScriptClosure.fs index a9dd5442626..ac2141d6dc3 100644 --- a/src/Compiler/Driver/ScriptClosure.fs +++ b/src/Compiler/Driver/ScriptClosure.fs @@ -31,6 +31,7 @@ type LoadClosureInput = SyntaxTree: ParsedInput option ParseDiagnostics: (PhasedDiagnostic * FSharpDiagnosticSeverity) list MetaCommandDiagnostics: (PhasedDiagnostic * FSharpDiagnosticSeverity) list + SourceText: ISourceText option } [] @@ -92,7 +93,8 @@ module ScriptPreprocessClosure = range: range * parsedInput: ParsedInput option * parseDiagnostics: (PhasedDiagnostic * FSharpDiagnosticSeverity) list * - metaDiagnostics: (PhasedDiagnostic * FSharpDiagnosticSeverity) list + metaDiagnostics: (PhasedDiagnostic * FSharpDiagnosticSeverity) list * + sourceText: ISourceText option type Observed() = let seen = Dictionary<_, bool>() @@ -139,7 +141,9 @@ module ScriptPreprocessClosure = // The root compiland is last in the list of compilands. let isLastCompiland = (IsScript fileName, tcConfig.target.IsExe) + ParseOneInputLexbuf(tcConfig, lexResourceManager, lexbuf, fileName, isLastCompiland, diagnosticsLogger) + |> fst /// Create a TcConfig for load closure starting from a single .fsx file let CreateScriptTextTcConfig @@ -486,14 +490,14 @@ module ScriptPreprocessClosure = for subSource in ClosureSourceOfFilename(subFile, m, tcConfigResult.inputCodePage, false) do yield! processClosureSource subSource else - ClosureFile(subFile, m, None, [], []) + ClosureFile(subFile, m, None, [], [], None) - ClosureFile(fileName, m, Some parseResult, parseDiagnostics, diagnosticsLogger.Diagnostics) + ClosureFile(fileName, m, Some parseResult, parseDiagnostics, diagnosticsLogger.Diagnostics, Some sourceText) else // Don't traverse into .fs leafs. printfn "yielding non-script source %s" fileName - ClosureFile(fileName, m, None, [], []) + ClosureFile(fileName, m, None, [], [], None) ] let sources = closureSources |> List.collect processClosureSource @@ -505,7 +509,7 @@ module ScriptPreprocessClosure = /// Mark the last file as isLastCompiland. let MarkLastCompiland (tcConfig: TcConfig, lastClosureFile) = - let (ClosureFile(fileName, m, lastParsedInput, parseDiagnostics, metaDiagnostics)) = + let (ClosureFile(fileName, m, lastParsedInput, parseDiagnostics, metaDiagnostics, sourceText)) = lastClosureFile match lastParsedInput with @@ -520,7 +524,7 @@ module ScriptPreprocessClosure = ParsedImplFileInput(name, isScript, qualNameOfFile, hashDirectives, implFileFlags, isLastCompiland, trivia, identifiers) let lastClosureFileR = - ClosureFile(fileName, m, Some(ParsedInput.ImplFile lastParsedImplFileR), parseDiagnostics, metaDiagnostics) + ClosureFile(fileName, m, Some(ParsedInput.ImplFile lastParsedImplFileR), parseDiagnostics, metaDiagnostics, sourceText) lastClosureFileR | _ -> lastClosureFile @@ -538,12 +542,12 @@ module ScriptPreprocessClosure = // Get all source files. let sourceFiles = - [ for ClosureFile(fileName, m, _, _, _) in closureFiles -> (fileName, m) ] + [ for ClosureFile(fileName, m, _, _, _, _) in closureFiles -> (fileName, m) ] let sourceInputs = [ for closureFile in closureFiles -> - let (ClosureFile(fileName, _, input, parseDiagnostics, metaDiagnostics)) = + let (ClosureFile(fileName, _, input, parseDiagnostics, metaDiagnostics, sourceText)) = closureFile let closureInput: LoadClosureInput = @@ -552,6 +556,7 @@ module ScriptPreprocessClosure = SyntaxTree = input ParseDiagnostics = parseDiagnostics MetaCommandDiagnostics = metaDiagnostics + SourceText = sourceText } closureInput @@ -572,7 +577,7 @@ module ScriptPreprocessClosure = // Root errors and warnings - look at the last item in the closureFiles list let loadClosureRootDiagnostics, allRootDiagnostics = match List.rev closureFiles with - | ClosureFile(_, _, _, parseDiagnostics, metaDiagnostics) :: _ -> + | ClosureFile(_, _, _, parseDiagnostics, metaDiagnostics, _) :: _ -> (earlierDiagnostics @ metaDiagnostics @ resolutionDiagnostics), (parseDiagnostics @ earlierDiagnostics @ metaDiagnostics @ resolutionDiagnostics) | _ -> [], [] // When no file existed. diff --git a/src/Compiler/Driver/ScriptClosure.fsi b/src/Compiler/Driver/ScriptClosure.fsi index b54b9b2f0d0..c2984b10bb0 100644 --- a/src/Compiler/Driver/ScriptClosure.fsi +++ b/src/Compiler/Driver/ScriptClosure.fsi @@ -28,7 +28,9 @@ type LoadClosureInput = ParseDiagnostics: (PhasedDiagnostic * FSharpDiagnosticSeverity) list - MetaCommandDiagnostics: (PhasedDiagnostic * FSharpDiagnosticSeverity) list } + MetaCommandDiagnostics: (PhasedDiagnostic * FSharpDiagnosticSeverity) list + + SourceText: ISourceText option } [] type LoadClosure = diff --git a/src/Compiler/Driver/fsc.fs b/src/Compiler/Driver/fsc.fs index 2bea066e427..220f20ee70f 100644 --- a/src/Compiler/Driver/fsc.fs +++ b/src/Compiler/Driver/fsc.fs @@ -623,9 +623,9 @@ let main1 let inputs, _ = (Map.empty, inputs) - ||> List.mapFold (fun state (input, x) -> + ||> List.mapFold (fun state ((input, sourceTextOpt), x) -> let inputT, stateT = DeduplicateParsedInputModuleName state input - (inputT, x), stateT) + ((inputT, sourceTextOpt), x), stateT) // Print the AST if requested if tcConfig.printAst then @@ -642,7 +642,7 @@ let main1 let tcConfig = (tcConfig, inputs) - ||> List.fold (fun z (input, sourceFileDirectory) -> + ||> List.fold (fun z ((input, _), sourceFileDirectory) -> ApplyMetaCommandsFromInputToTcConfig(z, input, sourceFileDirectory, dependencyProvider)) let tcConfigP = TcConfigProvider.Constant tcConfig diff --git a/src/Compiler/FSComp.txt b/src/Compiler/FSComp.txt index 512e9b4dca7..94c1274bc82 100644 --- a/src/Compiler/FSComp.txt +++ b/src/Compiler/FSComp.txt @@ -1814,3 +1814,8 @@ featureAllowLetOrUseBangTypeAnnotationWithoutParens,"Allow let! and use! type an 3877,lexLineDirectiveMappingIsNotUnique,"The file '%s' was also pointed to in a line directive in '%s'. Proper warn directive application may not be possible." 3878,tcAttributeIsNotValidForUnionCaseWithFields,"This attribute is not valid for use on union cases with fields." featureReturnFromFinal,"Support for ReturnFromFinal/YieldFromFinal in computation expressions to enable tailcall optimization when available on the builder." +featureSupportCallerArgumentExpression,"Support `CallerArgumentExpression`" +3880,tcCallerArgumentExpressionSelfReferential,"The [] on this parameter will have no effect because it's self-referential." +3881,tcCallerArgumentExpressionHasInvalidParameterName,"The [] on this parameter will have no effect because it's applied with an invalid parameter name." +3882,tcCallerArgumentExpressionIsOverridden,"The [] on this parameter will have no effect because it's overridden by the [<%s>]." +3883,tcCallerArgumentExpressionWillNotBeApplied,"This usage blocks passing string representations of arguments to parameters annotated with []. The default values of these parameters will be passed. Only the usages like `Method(arguments)` can capture the string representation of arguments. You can disable this warning by using '#nowarn \"3883\"' or '--nowarn:3883'." \ No newline at end of file diff --git a/src/Compiler/Facilities/LanguageFeatures.fs b/src/Compiler/Facilities/LanguageFeatures.fs index 4b032db713f..9510909f3e0 100644 --- a/src/Compiler/Facilities/LanguageFeatures.fs +++ b/src/Compiler/Facilities/LanguageFeatures.fs @@ -105,6 +105,7 @@ type LanguageFeature = | ErrorOnInvalidDeclsInTypeDefinitions | AllowTypedLetUseAndBang | ReturnFromFinal + | SupportCallerArgumentExpression /// LanguageVersion management type LanguageVersion(versionText) = @@ -245,6 +246,7 @@ type LanguageVersion(versionText) = // F# preview (still preview in 10.0) LanguageFeature.FromEndSlicing, previewVersion // Unfinished features --- needs work + LanguageFeature.SupportCallerArgumentExpression, previewVersion ] static let defaultLanguageVersion = LanguageVersion("default") @@ -415,6 +417,7 @@ type LanguageVersion(versionText) = | LanguageFeature.ErrorOnInvalidDeclsInTypeDefinitions -> FSComp.SR.featureErrorOnInvalidDeclsInTypeDefinitions () | LanguageFeature.AllowTypedLetUseAndBang -> FSComp.SR.featureAllowLetOrUseBangTypeAnnotationWithoutParens () | LanguageFeature.ReturnFromFinal -> FSComp.SR.featureReturnFromFinal () + | LanguageFeature.SupportCallerArgumentExpression -> FSComp.SR.featureSupportCallerArgumentExpression () /// Get a version string associated with the given feature. static member GetFeatureVersionString feature = diff --git a/src/Compiler/Facilities/LanguageFeatures.fsi b/src/Compiler/Facilities/LanguageFeatures.fsi index 1217b83baf6..24364a2a1d5 100644 --- a/src/Compiler/Facilities/LanguageFeatures.fsi +++ b/src/Compiler/Facilities/LanguageFeatures.fsi @@ -96,6 +96,7 @@ type LanguageFeature = | ErrorOnInvalidDeclsInTypeDefinitions | AllowTypedLetUseAndBang | ReturnFromFinal + | SupportCallerArgumentExpression /// LanguageVersion management type LanguageVersion = diff --git a/src/Compiler/Facilities/prim-lexing.fs b/src/Compiler/Facilities/prim-lexing.fs index 72c4fa22f58..b92457b00bc 100644 --- a/src/Compiler/Facilities/prim-lexing.fs +++ b/src/Compiler/Facilities/prim-lexing.fs @@ -260,6 +260,7 @@ and [] internal LexBuffer<'Char> let mutable eof = false let mutable startPos = Position.Empty let mutable endPos = Position.Empty + let sourceStringBuilder = System.Text.StringBuilder(4096) // Throw away all the input besides the lexeme, which is placed at start of buffer let discardInput () = @@ -320,6 +321,9 @@ and [] internal LexBuffer<'Char> with get () = bufferAcceptAction and set v = bufferAcceptAction <- v + member val private SourceTextBuilder = sourceStringBuilder + member lexbuf.SourceText = lexbuf.SourceTextBuilder.ToString() |> SourceText.ofString + member lexbuf.RefillBuffer() = filler lexbuf static member LexemeString(lexbuf: LexBuffer) = @@ -354,6 +358,7 @@ and [] internal LexBuffer<'Char> (reportLibraryOnlyFeatures, langVersion, strictIndentation, f: 'Char[] * int * int -> int) : LexBuffer<'Char> = let extension = Array.zeroCreate 4096 + let isCharTy = typeof<'Char> = typeof let filler (lexBuffer: LexBuffer<'Char>) = let n = f (extension, 0, extension.Length) @@ -361,6 +366,10 @@ and [] internal LexBuffer<'Char> Array.blit extension 0 lexBuffer.Buffer lexBuffer.BufferScanPos n lexBuffer.BufferMaxScanLength <- lexBuffer.BufferScanLength + n + if isCharTy then + lexBuffer.SourceTextBuilder.Append(Unchecked.unbox extension, 0, n) + |> ignore + new LexBuffer<'Char>(filler, reportLibraryOnlyFeatures, langVersion, strictIndentation) // Important: This method takes ownership of the array @@ -370,6 +379,11 @@ and [] internal LexBuffer<'Char> lexBuffer.Buffer <- buffer lexBuffer.BufferMaxScanLength <- buffer.Length + + if typeof<'Char> = typeof then + lexBuffer.SourceTextBuilder.Append(Unchecked.unbox buffer, 0, buffer.Length) + |> ignore + lexBuffer // Important: this method does copy the array diff --git a/src/Compiler/Facilities/prim-lexing.fsi b/src/Compiler/Facilities/prim-lexing.fsi index c95a97a8d42..88e9986f80b 100644 --- a/src/Compiler/Facilities/prim-lexing.fsi +++ b/src/Compiler/Facilities/prim-lexing.fsi @@ -143,6 +143,8 @@ type internal LexBuffer<'Char> = member StrictIndentation: bool option + member SourceText: ISourceText + /// Logs a recoverable error if a language feature is unsupported, at the specified range. member CheckLanguageFeatureAndRecover: LanguageFeature -> range -> unit diff --git a/src/Compiler/Interactive/fsi.fs b/src/Compiler/Interactive/fsi.fs index a4202ddbb62..471c52ee6da 100644 --- a/src/Compiler/Interactive/fsi.fs +++ b/src/Compiler/Interactive/fsi.fs @@ -2187,7 +2187,7 @@ type internal FsiDynamicCompiler ctok, diagnosticsLogger: DiagnosticsLogger, istate: FsiDynamicCompilerState, - inputs: ParsedInput list, + inputs: (ParsedInput * ISourceText option) list, showTypes: bool, isIncrementalFragment: bool, isInteractiveItExpr: bool, @@ -2436,7 +2436,10 @@ type internal FsiDynamicCompiler member _.EvalParsedSourceFiles(ctok, diagnosticsLogger, istate, inputs, m) = let prefix = mkFragmentPath m nextFragmentId // Ensure the path includes the qualifying name - let inputs = inputs |> List.map (PrependPathToInput prefix) + let inputs = + inputs + |> List.map (fun (input, sourceTextOpt) -> PrependPathToInput prefix input, sourceTextOpt) + let isIncrementalFragment = false let istate, _, _ = @@ -2446,8 +2449,15 @@ type internal FsiDynamicCompiler /// Evaluate the given definitions and produce a new interactive state. member _.EvalParsedDefinitions - (ctok, diagnosticsLogger: DiagnosticsLogger, istate, showTypes, isInteractiveItExpr, defs: SynModuleDecl list) - = + ( + ctok, + diagnosticsLogger: DiagnosticsLogger, + istate, + showTypes, + isInteractiveItExpr, + defs: SynModuleDecl list, + ?sourceTextOpt: ISourceText + ) = let fileName = stdinMockFileName let m = @@ -2493,7 +2503,17 @@ type internal FsiDynamicCompiler let isIncrementalFragment = true let istate, tcEnvAtEndOfLastInput, declaredImpls = - ProcessInputs(ctok, diagnosticsLogger, istate, [ input ], showTypes, isIncrementalFragment, isInteractiveItExpr, prefix, m) + ProcessInputs( + ctok, + diagnosticsLogger, + istate, + [ input, sourceTextOpt ], + showTypes, + isIncrementalFragment, + isInteractiveItExpr, + prefix, + m + ) let tcState = istate.tcState @@ -2505,7 +2525,9 @@ type internal FsiDynamicCompiler processContents newState declaredImpls /// Evaluate the given expression and produce a new interactive state. - member fsiDynamicCompiler.EvalParsedExpression(ctok, diagnosticsLogger: DiagnosticsLogger, istate, expr: SynExpr, suppressItPrint) = + member fsiDynamicCompiler.EvalParsedExpression + (ctok, diagnosticsLogger: DiagnosticsLogger, istate, expr: SynExpr, suppressItPrint, sourceText) + = let tcConfig = TcConfig.Create(tcConfigB, validate = false) let itName = "it" @@ -2514,7 +2536,7 @@ type internal FsiDynamicCompiler // Evaluate the overall definitions. let istate = - fsiDynamicCompiler.EvalParsedDefinitions(ctok, diagnosticsLogger, istate, false, true, defs) + fsiDynamicCompiler.EvalParsedDefinitions(ctok, diagnosticsLogger, istate, false, true, defs, sourceText) |> fst // Snarf the type for 'it' via the binding match istate.tcState.TcEnvFromImpls.NameEnv.FindUnqualifiedItem itName with @@ -2881,17 +2903,19 @@ type internal FsiDynamicCompiler let parsedInput = match input.SyntaxTree with - | None -> ParseOneInputFile(tcConfig, lexResourceManager, input.FileName, (true, false), diagnosticsLogger, false) + | None -> + ParseOneInputFile(tcConfig, lexResourceManager, input.FileName, (true, false), diagnosticsLogger, false) + |> fst | Some parseTree -> parseTree - input.FileName, parsedInput) + input.FileName, (parsedInput, input.SourceText)) |> List.unzip diagnosticsLogger.AbortOnError(fsiConsoleOutput) let istate = (istate, sourceFiles, inputs) - |||> List.fold2 (fun istate sourceFile input -> + |||> List.fold2 (fun istate sourceFile (input, _) -> fsiDynamicCompiler.ProcessMetaCommandsFromParsedInputAsInteractiveCommands(ctok, istate, sourceFile, input)) let istate = fsiDynamicCompiler.ProcessDelayedReferences(ctok, istate) @@ -3607,7 +3631,7 @@ type FsiStdinLexerProvider [] type InteractionGroup = - | Definitions of defns: SynModuleDecl list * range: range + | Definitions of defns: SynModuleDecl list * range: range * sourceText: ISourceText | HashDirectives of hashDirective: ParsedHashDirective list @@ -3728,7 +3752,7 @@ type FsiInteractionProcessor | Some(ParsedScriptInteraction.Definitions([ SynModuleDecl.Expr(e, _) ], _)) -> let _state, status = - fsiDynamicCompiler.EvalParsedExpression(ctok, diagnosticsLogger, istate, e, true) + fsiDynamicCompiler.EvalParsedExpression(ctok, diagnosticsLogger, istate, e, true, lexbuf.SourceText) match status with | Completed(Some compStatus) -> @@ -3907,14 +3931,14 @@ type FsiInteractionProcessor loop istate action else match action with - | InteractionGroup.Definitions([], _) + | InteractionGroup.Definitions([], _, _) | InteractionGroup.HashDirectives [] -> istate, Completed None - | InteractionGroup.Definitions([ SynModuleDecl.Expr(expr, _) ], _) -> - fsiDynamicCompiler.EvalParsedExpression(ctok, diagnosticsLogger, istate, expr, false) + | InteractionGroup.Definitions([ SynModuleDecl.Expr(expr, _) ], _, sourceText) -> + fsiDynamicCompiler.EvalParsedExpression(ctok, diagnosticsLogger, istate, expr, false, sourceText) - | InteractionGroup.Definitions(defs, _) -> - fsiDynamicCompiler.EvalParsedDefinitions(ctok, diagnosticsLogger, istate, true, false, defs) + | InteractionGroup.Definitions(defs, _, sourceText) -> + fsiDynamicCompiler.EvalParsedDefinitions(ctok, diagnosticsLogger, istate, true, false, defs, sourceText) | InteractionGroup.HashDirectives(hash :: rest) -> let status = PartiallyProcessHashDirective(ctok, istate, hash, diagnosticsLogger) @@ -3950,7 +3974,8 @@ type FsiInteractionProcessor synInteraction, diagnosticsLogger: DiagnosticsLogger, lastResult: FsiValue option, - cancellationToken: CancellationToken + cancellationToken: CancellationToken, + sourceText ) = cancellationToken.ThrowIfCancellationRequested() @@ -4010,7 +4035,7 @@ type FsiInteractionProcessor | SynModuleDecl.Expr(expr, _) :: rest -> (rest |> List.rev) @ (fsiDynamicCompiler.BuildItBinding expr) | _ -> defsA - let group = InteractionGroup.Definitions(defsA, m) + let group = InteractionGroup.Definitions(defsA, m, sourceText) let others = ParsedScriptInteraction.Definitions(defsB, m) Some group, Some others, istate @@ -4020,7 +4045,7 @@ type FsiInteractionProcessor let status = ExecuteInteractionGroup(ctok, istate, group, diagnosticsLogger) ProcessStepStatus status lastResult (fun lastResult istate -> - ExecuteParsedInteractionInGroups(ctok, istate, others, diagnosticsLogger, lastResult, cancellationToken)) + ExecuteParsedInteractionInGroups(ctok, istate, others, diagnosticsLogger, lastResult, cancellationToken, sourceText)) /// Execute a single parsed interaction which may contain multiple items to be executed /// independently @@ -4031,10 +4056,11 @@ type FsiInteractionProcessor synInteraction, diagnosticsLogger: DiagnosticsLogger, lastResult: FsiValue option, - cancellationToken: CancellationToken + cancellationToken: CancellationToken, + sourceText ) = let status = - ExecuteParsedInteractionInGroups(ctok, istate, synInteraction, diagnosticsLogger, lastResult, cancellationToken) + ExecuteParsedInteractionInGroups(ctok, istate, synInteraction, diagnosticsLogger, lastResult, cancellationToken, sourceText) ProcessStepStatus status lastResult (fun lastResult istate -> let rec loop istate = @@ -4091,21 +4117,21 @@ type FsiInteractionProcessor stopProcessingRecovery e range0 istate, CompletedWithReportedError e - let ExecuteParsedInteractionOnMainThread (ctok, diagnosticsLogger, synInteraction, istate, cancellationToken) = + let ExecuteParsedInteractionOnMainThread (ctok, diagnosticsLogger, synInteraction, istate, cancellationToken, sourceText) = istate |> mainThreadProcessAction ctok (fun ctok istate -> - ExecuteParsedInteraction(ctok, istate, synInteraction, diagnosticsLogger, None, cancellationToken)) + ExecuteParsedInteraction(ctok, istate, synInteraction, diagnosticsLogger, None, cancellationToken, sourceText)) let ParseExpression (tokenizer: LexFilter.LexFilter) = reusingLexbufForParsing tokenizer.LexBuffer (fun () -> Parser.typedSequentialExprEOF (fun _ -> tokenizer.GetToken()) tokenizer.LexBuffer) - let ExecuteParsedExpressionOnMainThread (ctok, diagnosticsLogger, expr, istate) = + let ExecuteParsedExpressionOnMainThread (ctok, diagnosticsLogger, expr, istate, sourceText) = istate |> InteractiveCatch diagnosticsLogger (fun istate -> istate |> mainThreadProcessAction ctok (fun ctok istate -> - fsiDynamicCompiler.EvalParsedExpression(ctok, diagnosticsLogger, istate, expr, false))) + fsiDynamicCompiler.EvalParsedExpression(ctok, diagnosticsLogger, istate, expr, false, sourceText))) let commitResult (istate, result) = match result with @@ -4170,7 +4196,14 @@ type FsiInteractionProcessor let res = istate |> runCodeOnMainThread (fun ctok istate -> - ExecuteParsedInteractionOnMainThread(ctok, diagnosticsLogger, action, istate, cancellationToken)) + ExecuteParsedInteractionOnMainThread( + ctok, + diagnosticsLogger, + action, + istate, + cancellationToken, + tokenizer.LexBuffer.SourceText + )) if progress then fprintfn fsiConsoleOutput.Out "Just called runCodeOnMainThread, res = %O..." res @@ -4285,7 +4318,7 @@ type FsiInteractionProcessor currState |> InteractiveCatch diagnosticsLogger (fun istate -> let expr = ParseInteraction tcConfigB.diagnosticsOptions tokenizer - ExecuteParsedInteractionOnMainThread(ctok, diagnosticsLogger, expr, istate, cancellationToken)) + ExecuteParsedInteractionOnMainThread(ctok, diagnosticsLogger, expr, istate, cancellationToken, lexbuf.SourceText)) |> commitResult member this.EvalScript(ctok, scriptPath, diagnosticsLogger) = @@ -4319,7 +4352,7 @@ type FsiInteractionProcessor SynExprSequentialTrivia.Zero ) - ExecuteParsedExpressionOnMainThread(ctok, diagnosticsLogger, exprWithSeq, istate)) + ExecuteParsedExpressionOnMainThread(ctok, diagnosticsLogger, exprWithSeq, istate, lexbuf.SourceText)) |> commitResult member _.AddBoundValue(ctok, diagnosticsLogger, name, value: obj) = diff --git a/src/Compiler/Service/FSharpCheckerResults.fs b/src/Compiler/Service/FSharpCheckerResults.fs index 0609fd8c6ce..eb921f7f84a 100644 --- a/src/Compiler/Service/FSharpCheckerResults.fs +++ b/src/Compiler/Service/FSharpCheckerResults.fs @@ -3092,6 +3092,7 @@ module internal ParseAndCheckFile = identCapture, Some userOpName ) + |> fst with | :? OperationCanceledException -> reraise () | e -> diff --git a/src/Compiler/Service/IncrementalBuild.fs b/src/Compiler/Service/IncrementalBuild.fs index 6db19653f9a..41e3cf4e1b0 100644 --- a/src/Compiler/Service/IncrementalBuild.fs +++ b/src/Compiler/Service/IncrementalBuild.fs @@ -158,6 +158,7 @@ module IncrementalBuildSyntaxTree = ParseOneInputSourceText(tcConfig, lexResourceManager, fileName, isLastCompiland, diagnosticsLogger, sourceText) | TextContainer.OnDisk -> ParseOneInputFile(tcConfig, lexResourceManager, fileName, isLastCompiland, diagnosticsLogger, true) + |> fst fileParsed.Trigger fileName @@ -271,7 +272,7 @@ type BoundModel private ( tcGlobals, None, TcResultsSink.WithSink sink, - prevTcInfo.tcState, input ) + prevTcInfo.tcState, input, None ) |> Cancellable.toAsync fileChecked.Trigger fileName diff --git a/src/Compiler/Service/TransparentCompiler.fs b/src/Compiler/Service/TransparentCompiler.fs index 0c3f01d4a3a..405754add60 100644 --- a/src/Compiler/Service/TransparentCompiler.fs +++ b/src/Compiler/Service/TransparentCompiler.fs @@ -1430,7 +1430,8 @@ type internal TransparentCompiler TcResultsSink.WithSink sink, prevTcInfo.tcState, input, - true) + true, + None) |> Cancellable.toAsync //fileChecked.Trigger fileName diff --git a/src/Compiler/TypedTree/TcGlobals.fs b/src/Compiler/TypedTree/TcGlobals.fs index 9999b801606..5fa494f8537 100644 --- a/src/Compiler/TypedTree/TcGlobals.fs +++ b/src/Compiler/TypedTree/TcGlobals.fs @@ -1095,7 +1095,6 @@ type TcGlobals( // Adding an unnecessary "let" instead of inlining into a multi-line pipelined compute-once "member val" that is too complex for @dsyme let v_attribs_Unsupported = [ tryFindSysAttrib "System.Runtime.CompilerServices.ModuleInitializerAttribute" - tryFindSysAttrib "System.Runtime.CompilerServices.CallerArgumentExpressionAttribute" tryFindSysAttrib "System.Runtime.InteropServices.UnmanagedCallersOnlyAttribute" tryFindSysAttrib "System.Runtime.CompilerServices.CompilerFeatureRequiredAttribute" tryFindSysAttrib "System.Diagnostics.CodeAnalysis.SetsRequiredMembersAttribute" @@ -1509,6 +1508,7 @@ type TcGlobals( member val attrib_ExtensionAttribute = findSysAttrib "System.Runtime.CompilerServices.ExtensionAttribute" member val attrib_CallerLineNumberAttribute = findSysAttrib "System.Runtime.CompilerServices.CallerLineNumberAttribute" member val attrib_CallerFilePathAttribute = findSysAttrib "System.Runtime.CompilerServices.CallerFilePathAttribute" + member val attrib_CallerArgumentExpressionAttribute = tryFindSysAttrib "System.Runtime.CompilerServices.CallerArgumentExpressionAttribute" member val attrib_CallerMemberNameAttribute = findSysAttrib "System.Runtime.CompilerServices.CallerMemberNameAttribute" member val attrib_SkipLocalsInitAttribute = findSysAttrib "System.Runtime.CompilerServices.SkipLocalsInitAttribute" member val attrib_DecimalConstantAttribute = findSysAttrib "System.Runtime.CompilerServices.DecimalConstantAttribute" diff --git a/src/Compiler/TypedTree/TcGlobals.fsi b/src/Compiler/TypedTree/TcGlobals.fsi index f4b866d8fbc..f82c8efce9f 100644 --- a/src/Compiler/TypedTree/TcGlobals.fsi +++ b/src/Compiler/TypedTree/TcGlobals.fsi @@ -338,6 +338,8 @@ type internal TcGlobals = member attrib_CallerLineNumberAttribute: BuiltinAttribInfo + member attrib_CallerArgumentExpressionAttribute: BuiltinAttribInfo option + member attrib_CallerMemberNameAttribute: BuiltinAttribInfo member attrib_ClassAttribute: BuiltinAttribInfo diff --git a/src/Compiler/TypedTree/TypedTreeOps.fs b/src/Compiler/TypedTree/TypedTreeOps.fs index 3c5d2dcd20b..d7a21917f71 100644 --- a/src/Compiler/TypedTree/TypedTreeOps.fs +++ b/src/Compiler/TypedTree/TypedTreeOps.fs @@ -3522,12 +3522,25 @@ let HasILAttribute tref (attrs: ILAttributes) = let TryDecodeILAttribute tref (attrs: ILAttributes) = attrs.AsArray() |> Array.tryPick (fun x -> if isILAttrib tref x then Some(decodeILAttribData x) else None) +let TryDecodeILAttributeByName nm (attrs: ILAttributes) = + attrs.AsArray() |> Array.tryPick (fun x -> if isILAttribByName ([], nm) x then Some(decodeILAttribData x) else None) + // F# view of attributes (these get converted to AbsIL attributes in ilxgen) let IsMatchingFSharpAttribute g (AttribInfo(_, tcref)) (Attrib(tcref2, _, _, _, _, _, _)) = tyconRefEq g tcref tcref2 let HasFSharpAttribute g tref attrs = List.exists (IsMatchingFSharpAttribute g tref) attrs let TryFindFSharpAttribute g tref attrs = List.tryFind (IsMatchingFSharpAttribute g tref) attrs let TryFindFSharpAttributeOpt g tref attrs = match tref with None -> None | Some tref -> List.tryFind (IsMatchingFSharpAttribute g tref) attrs +let TryFindFSharpAttributeByName nm attrs = + let path, typeName = splitILTypeName nm + attrs + |> List.tryFind (fun (Attrib(tcref2, _, _, _, _, _, _)) -> + match tcref2.TryDeref with + | ValueNone -> false + | ValueSome x -> + x.CompilationPath.MangledPath = path && + x.CompiledName = typeName) + let HasFSharpAttributeOpt g trefOpt attrs = match trefOpt with Some tref -> List.exists (IsMatchingFSharpAttribute g tref) attrs | _ -> false let IsMatchingFSharpAttributeOpt g attrOpt (Attrib(tcref2, _, _, _, _, _, _)) = match attrOpt with Some (AttribInfo(_, tcref)) -> tyconRefEq g tcref tcref2 | _ -> false diff --git a/src/Compiler/TypedTree/TypedTreeOps.fsi b/src/Compiler/TypedTree/TypedTreeOps.fsi index ed847cc5839..3acfb64f694 100755 --- a/src/Compiler/TypedTree/TypedTreeOps.fsi +++ b/src/Compiler/TypedTree/TypedTreeOps.fsi @@ -2322,6 +2322,8 @@ val mkLdelem: TcGlobals -> range -> TType -> Expr -> Expr -> Expr val TryDecodeILAttribute: ILTypeRef -> ILAttributes -> (ILAttribElem list * ILAttributeNamedArg list) option +val TryDecodeILAttributeByName: nm: string -> ILAttributes -> (ILAttribElem list * ILAttributeNamedArg list) option + val IsILAttrib: BuiltinAttribInfo -> ILAttribute -> bool val TryFindILAttribute: BuiltinAttribInfo -> ILAttributes -> bool @@ -2336,6 +2338,8 @@ val HasFSharpAttribute: TcGlobals -> BuiltinAttribInfo -> Attribs -> bool val HasFSharpAttributeOpt: TcGlobals -> BuiltinAttribInfo option -> Attribs -> bool +val TryFindFSharpAttributeByName: nm: string -> Attribs -> Attrib option + val TryFindFSharpAttribute: TcGlobals -> BuiltinAttribInfo -> Attribs -> Attrib option val TryFindFSharpAttributeOpt: TcGlobals -> BuiltinAttribInfo option -> Attribs -> Attrib option diff --git a/src/Compiler/xlf/FSComp.txt.cs.xlf b/src/Compiler/xlf/FSComp.txt.cs.xlf index 244be90e142..3a5248aacc5 100644 --- a/src/Compiler/xlf/FSComp.txt.cs.xlf +++ b/src/Compiler/xlf/FSComp.txt.cs.xlf @@ -657,6 +657,11 @@ reprezentace struktury aktivních vzorů + + Support `CallerArgumentExpression` + Support `CallerArgumentExpression` + + Support ValueOption as valid type for optional member parameters Support ValueOption as valid type for optional member parameters @@ -1447,6 +1452,26 @@ Atributy nejde použít pro rozšíření typů. + + The [<CallerArgumentExpression>] on this parameter will have no effect because it's applied with an invalid parameter name. + The [<CallerArgumentExpression>] on this parameter will have no effect because it's applied with an invalid parameter name. + + + + The [<CallerArgumentExpression>] on this parameter will have no effect because it's overridden by the [<{0}>]. + The [<CallerArgumentExpression>] on this parameter will have no effect because it's overridden by the [<{0}>]. + + + + The [<CallerArgumentExpression>] on this parameter will have no effect because it's self-referential. + The [<CallerArgumentExpression>] on this parameter will have no effect because it's self-referential. + + + + This usage blocks passing string representations of arguments to parameters annotated with [<CallerArgumentExpression>]. The default values of these parameters will be passed. Only the usages like `Method(arguments)` can capture the string representation of arguments. You can disable this warning by using '#nowarn \"3883\"' or '--nowarn:3883'. + This usage blocks passing string representations of arguments to parameters annotated with [<CallerArgumentExpression>]. The default values of these parameters will be passed. Only the usages like `Method(arguments)` can capture the string representation of arguments. You can disable this warning by using '#nowarn \"3883\"' or '--nowarn:3883'. + + This copy-and-update record expression changes all fields of record type '{0}'. Consider using the record construction syntax instead. Tento výraz záznamu kopírování a aktualizace mění všechna pole typu záznamu '{0}'. Zvažte použití syntaxe konstrukce záznamu. diff --git a/src/Compiler/xlf/FSComp.txt.de.xlf b/src/Compiler/xlf/FSComp.txt.de.xlf index d1b1782d093..ca61d748198 100644 --- a/src/Compiler/xlf/FSComp.txt.de.xlf +++ b/src/Compiler/xlf/FSComp.txt.de.xlf @@ -657,6 +657,11 @@ Strukturdarstellung für aktive Muster + + Support `CallerArgumentExpression` + Support `CallerArgumentExpression` + + Support ValueOption as valid type for optional member parameters Support ValueOption as valid type for optional member parameters @@ -1447,6 +1452,26 @@ Attribute können nicht auf Typerweiterungen angewendet werden. + + The [<CallerArgumentExpression>] on this parameter will have no effect because it's applied with an invalid parameter name. + The [<CallerArgumentExpression>] on this parameter will have no effect because it's applied with an invalid parameter name. + + + + The [<CallerArgumentExpression>] on this parameter will have no effect because it's overridden by the [<{0}>]. + The [<CallerArgumentExpression>] on this parameter will have no effect because it's overridden by the [<{0}>]. + + + + The [<CallerArgumentExpression>] on this parameter will have no effect because it's self-referential. + The [<CallerArgumentExpression>] on this parameter will have no effect because it's self-referential. + + + + This usage blocks passing string representations of arguments to parameters annotated with [<CallerArgumentExpression>]. The default values of these parameters will be passed. Only the usages like `Method(arguments)` can capture the string representation of arguments. You can disable this warning by using '#nowarn \"3883\"' or '--nowarn:3883'. + This usage blocks passing string representations of arguments to parameters annotated with [<CallerArgumentExpression>]. The default values of these parameters will be passed. Only the usages like `Method(arguments)` can capture the string representation of arguments. You can disable this warning by using '#nowarn \"3883\"' or '--nowarn:3883'. + + This copy-and-update record expression changes all fields of record type '{0}'. Consider using the record construction syntax instead. Dieser Ausdruck zum Kopieren und Aktualisieren von Datensätzen ändert alle Felder des Datensatztyps "{0}". Erwägen Sie stattdessen die Verwendung der Datensatzerstellungssyntax. diff --git a/src/Compiler/xlf/FSComp.txt.es.xlf b/src/Compiler/xlf/FSComp.txt.es.xlf index cd311cc7fc5..6ddd4f152e4 100644 --- a/src/Compiler/xlf/FSComp.txt.es.xlf +++ b/src/Compiler/xlf/FSComp.txt.es.xlf @@ -657,6 +657,11 @@ representación de struct para modelos activos + + Support `CallerArgumentExpression` + Support `CallerArgumentExpression` + + Support ValueOption as valid type for optional member parameters Support ValueOption as valid type for optional member parameters @@ -1447,6 +1452,26 @@ Los atributos no se pueden aplicar a las extensiones de tipo. + + The [<CallerArgumentExpression>] on this parameter will have no effect because it's applied with an invalid parameter name. + The [<CallerArgumentExpression>] on this parameter will have no effect because it's applied with an invalid parameter name. + + + + The [<CallerArgumentExpression>] on this parameter will have no effect because it's overridden by the [<{0}>]. + The [<CallerArgumentExpression>] on this parameter will have no effect because it's overridden by the [<{0}>]. + + + + The [<CallerArgumentExpression>] on this parameter will have no effect because it's self-referential. + The [<CallerArgumentExpression>] on this parameter will have no effect because it's self-referential. + + + + This usage blocks passing string representations of arguments to parameters annotated with [<CallerArgumentExpression>]. The default values of these parameters will be passed. Only the usages like `Method(arguments)` can capture the string representation of arguments. You can disable this warning by using '#nowarn \"3883\"' or '--nowarn:3883'. + This usage blocks passing string representations of arguments to parameters annotated with [<CallerArgumentExpression>]. The default values of these parameters will be passed. Only the usages like `Method(arguments)` can capture the string representation of arguments. You can disable this warning by using '#nowarn \"3883\"' or '--nowarn:3883'. + + This copy-and-update record expression changes all fields of record type '{0}'. Consider using the record construction syntax instead. Esta expresión de copia y actualización de registros cambia todos los campos de tipo de registro "{0}". Es preferible utilizar la sintaxis de construcción de registros. diff --git a/src/Compiler/xlf/FSComp.txt.fr.xlf b/src/Compiler/xlf/FSComp.txt.fr.xlf index e05e9ecdf6c..fc6c45e2f2b 100644 --- a/src/Compiler/xlf/FSComp.txt.fr.xlf +++ b/src/Compiler/xlf/FSComp.txt.fr.xlf @@ -657,6 +657,11 @@ représentation de structure pour les modèles actifs + + Support `CallerArgumentExpression` + Support `CallerArgumentExpression` + + Support ValueOption as valid type for optional member parameters Support ValueOption as valid type for optional member parameters @@ -1447,6 +1452,26 @@ Impossible d'appliquer des attributs aux extensions de type. + + The [<CallerArgumentExpression>] on this parameter will have no effect because it's applied with an invalid parameter name. + The [<CallerArgumentExpression>] on this parameter will have no effect because it's applied with an invalid parameter name. + + + + The [<CallerArgumentExpression>] on this parameter will have no effect because it's overridden by the [<{0}>]. + The [<CallerArgumentExpression>] on this parameter will have no effect because it's overridden by the [<{0}>]. + + + + The [<CallerArgumentExpression>] on this parameter will have no effect because it's self-referential. + The [<CallerArgumentExpression>] on this parameter will have no effect because it's self-referential. + + + + This usage blocks passing string representations of arguments to parameters annotated with [<CallerArgumentExpression>]. The default values of these parameters will be passed. Only the usages like `Method(arguments)` can capture the string representation of arguments. You can disable this warning by using '#nowarn \"3883\"' or '--nowarn:3883'. + This usage blocks passing string representations of arguments to parameters annotated with [<CallerArgumentExpression>]. The default values of these parameters will be passed. Only the usages like `Method(arguments)` can capture the string representation of arguments. You can disable this warning by using '#nowarn \"3883\"' or '--nowarn:3883'. + + This copy-and-update record expression changes all fields of record type '{0}'. Consider using the record construction syntax instead. Cette expression d'enregistrement de copie et de mise à jour modifie tous les champs du type d'enregistrement '{0}'. Envisagez d'utiliser la syntaxe de construction d'enregistrement à la place. diff --git a/src/Compiler/xlf/FSComp.txt.it.xlf b/src/Compiler/xlf/FSComp.txt.it.xlf index a25fd816046..d9dfa50ed61 100644 --- a/src/Compiler/xlf/FSComp.txt.it.xlf +++ b/src/Compiler/xlf/FSComp.txt.it.xlf @@ -657,6 +657,11 @@ rappresentazione struct per criteri attivi + + Support `CallerArgumentExpression` + Support `CallerArgumentExpression` + + Support ValueOption as valid type for optional member parameters Support ValueOption as valid type for optional member parameters @@ -1447,6 +1452,26 @@ Gli attributi non possono essere applicati a estensioni di tipo. + + The [<CallerArgumentExpression>] on this parameter will have no effect because it's applied with an invalid parameter name. + The [<CallerArgumentExpression>] on this parameter will have no effect because it's applied with an invalid parameter name. + + + + The [<CallerArgumentExpression>] on this parameter will have no effect because it's overridden by the [<{0}>]. + The [<CallerArgumentExpression>] on this parameter will have no effect because it's overridden by the [<{0}>]. + + + + The [<CallerArgumentExpression>] on this parameter will have no effect because it's self-referential. + The [<CallerArgumentExpression>] on this parameter will have no effect because it's self-referential. + + + + This usage blocks passing string representations of arguments to parameters annotated with [<CallerArgumentExpression>]. The default values of these parameters will be passed. Only the usages like `Method(arguments)` can capture the string representation of arguments. You can disable this warning by using '#nowarn \"3883\"' or '--nowarn:3883'. + This usage blocks passing string representations of arguments to parameters annotated with [<CallerArgumentExpression>]. The default values of these parameters will be passed. Only the usages like `Method(arguments)` can capture the string representation of arguments. You can disable this warning by using '#nowarn \"3883\"' or '--nowarn:3883'. + + This copy-and-update record expression changes all fields of record type '{0}'. Consider using the record construction syntax instead. Questa espressione di record di copia e aggiornamento modifica tutti i campi del tipo di record '{0}'. Provare a usare la sintassi di costruzione dei record. diff --git a/src/Compiler/xlf/FSComp.txt.ja.xlf b/src/Compiler/xlf/FSComp.txt.ja.xlf index 87b7d40df1e..87260e50590 100644 --- a/src/Compiler/xlf/FSComp.txt.ja.xlf +++ b/src/Compiler/xlf/FSComp.txt.ja.xlf @@ -657,6 +657,11 @@ アクティブなパターンの構造体表現 + + Support `CallerArgumentExpression` + Support `CallerArgumentExpression` + + Support ValueOption as valid type for optional member parameters Support ValueOption as valid type for optional member parameters @@ -1447,6 +1452,26 @@ 属性を型拡張に適用することはできません。 + + The [<CallerArgumentExpression>] on this parameter will have no effect because it's applied with an invalid parameter name. + The [<CallerArgumentExpression>] on this parameter will have no effect because it's applied with an invalid parameter name. + + + + The [<CallerArgumentExpression>] on this parameter will have no effect because it's overridden by the [<{0}>]. + The [<CallerArgumentExpression>] on this parameter will have no effect because it's overridden by the [<{0}>]. + + + + The [<CallerArgumentExpression>] on this parameter will have no effect because it's self-referential. + The [<CallerArgumentExpression>] on this parameter will have no effect because it's self-referential. + + + + This usage blocks passing string representations of arguments to parameters annotated with [<CallerArgumentExpression>]. The default values of these parameters will be passed. Only the usages like `Method(arguments)` can capture the string representation of arguments. You can disable this warning by using '#nowarn \"3883\"' or '--nowarn:3883'. + This usage blocks passing string representations of arguments to parameters annotated with [<CallerArgumentExpression>]. The default values of these parameters will be passed. Only the usages like `Method(arguments)` can capture the string representation of arguments. You can disable this warning by using '#nowarn \"3883\"' or '--nowarn:3883'. + + This copy-and-update record expression changes all fields of record type '{0}'. Consider using the record construction syntax instead. この copy-and-update レコード式は、レコードの種類が '{0}' であるすべてのフィールドを変更します。代わりにレコード構築構文を使用することを検討してください。 diff --git a/src/Compiler/xlf/FSComp.txt.ko.xlf b/src/Compiler/xlf/FSComp.txt.ko.xlf index f2fe6e20f97..0065acab1d2 100644 --- a/src/Compiler/xlf/FSComp.txt.ko.xlf +++ b/src/Compiler/xlf/FSComp.txt.ko.xlf @@ -657,6 +657,11 @@ 활성 패턴에 대한 구조체 표현 + + Support `CallerArgumentExpression` + Support `CallerArgumentExpression` + + Support ValueOption as valid type for optional member parameters Support ValueOption as valid type for optional member parameters @@ -1447,6 +1452,26 @@ 형식 확장에 특성을 적용할 수 없습니다. + + The [<CallerArgumentExpression>] on this parameter will have no effect because it's applied with an invalid parameter name. + The [<CallerArgumentExpression>] on this parameter will have no effect because it's applied with an invalid parameter name. + + + + The [<CallerArgumentExpression>] on this parameter will have no effect because it's overridden by the [<{0}>]. + The [<CallerArgumentExpression>] on this parameter will have no effect because it's overridden by the [<{0}>]. + + + + The [<CallerArgumentExpression>] on this parameter will have no effect because it's self-referential. + The [<CallerArgumentExpression>] on this parameter will have no effect because it's self-referential. + + + + This usage blocks passing string representations of arguments to parameters annotated with [<CallerArgumentExpression>]. The default values of these parameters will be passed. Only the usages like `Method(arguments)` can capture the string representation of arguments. You can disable this warning by using '#nowarn \"3883\"' or '--nowarn:3883'. + This usage blocks passing string representations of arguments to parameters annotated with [<CallerArgumentExpression>]. The default values of these parameters will be passed. Only the usages like `Method(arguments)` can capture the string representation of arguments. You can disable this warning by using '#nowarn \"3883\"' or '--nowarn:3883'. + + This copy-and-update record expression changes all fields of record type '{0}'. Consider using the record construction syntax instead. 이 레코드 복사 및 업데이트 식은 '{0}' 레코드 형식의 모든 필드를 변경합니다. 레코드 생성 구문을 대신 사용하는 것이 좋습니다. diff --git a/src/Compiler/xlf/FSComp.txt.pl.xlf b/src/Compiler/xlf/FSComp.txt.pl.xlf index 23a194ff258..cdf5b6c595c 100644 --- a/src/Compiler/xlf/FSComp.txt.pl.xlf +++ b/src/Compiler/xlf/FSComp.txt.pl.xlf @@ -657,6 +657,11 @@ reprezentacja struktury aktywnych wzorców + + Support `CallerArgumentExpression` + Support `CallerArgumentExpression` + + Support ValueOption as valid type for optional member parameters Support ValueOption as valid type for optional member parameters @@ -1447,6 +1452,26 @@ Atrybutów nie można stosować do rozszerzeń typu. + + The [<CallerArgumentExpression>] on this parameter will have no effect because it's applied with an invalid parameter name. + The [<CallerArgumentExpression>] on this parameter will have no effect because it's applied with an invalid parameter name. + + + + The [<CallerArgumentExpression>] on this parameter will have no effect because it's overridden by the [<{0}>]. + The [<CallerArgumentExpression>] on this parameter will have no effect because it's overridden by the [<{0}>]. + + + + The [<CallerArgumentExpression>] on this parameter will have no effect because it's self-referential. + The [<CallerArgumentExpression>] on this parameter will have no effect because it's self-referential. + + + + This usage blocks passing string representations of arguments to parameters annotated with [<CallerArgumentExpression>]. The default values of these parameters will be passed. Only the usages like `Method(arguments)` can capture the string representation of arguments. You can disable this warning by using '#nowarn \"3883\"' or '--nowarn:3883'. + This usage blocks passing string representations of arguments to parameters annotated with [<CallerArgumentExpression>]. The default values of these parameters will be passed. Only the usages like `Method(arguments)` can capture the string representation of arguments. You can disable this warning by using '#nowarn \"3883\"' or '--nowarn:3883'. + + This copy-and-update record expression changes all fields of record type '{0}'. Consider using the record construction syntax instead. To wyrażenie rekordu kopiowania i aktualizacji zmienia wszystkie pola typu rekordu „{0}”. Zamiast tego rozważ użycie składni konstrukcji rekordu. diff --git a/src/Compiler/xlf/FSComp.txt.pt-BR.xlf b/src/Compiler/xlf/FSComp.txt.pt-BR.xlf index 503fc0f073f..3d8916389a4 100644 --- a/src/Compiler/xlf/FSComp.txt.pt-BR.xlf +++ b/src/Compiler/xlf/FSComp.txt.pt-BR.xlf @@ -657,6 +657,11 @@ representação estrutural para padrões ativos + + Support `CallerArgumentExpression` + Support `CallerArgumentExpression` + + Support ValueOption as valid type for optional member parameters Support ValueOption as valid type for optional member parameters @@ -1447,6 +1452,26 @@ Os atributos não podem ser aplicados às extensões de tipo. + + The [<CallerArgumentExpression>] on this parameter will have no effect because it's applied with an invalid parameter name. + The [<CallerArgumentExpression>] on this parameter will have no effect because it's applied with an invalid parameter name. + + + + The [<CallerArgumentExpression>] on this parameter will have no effect because it's overridden by the [<{0}>]. + The [<CallerArgumentExpression>] on this parameter will have no effect because it's overridden by the [<{0}>]. + + + + The [<CallerArgumentExpression>] on this parameter will have no effect because it's self-referential. + The [<CallerArgumentExpression>] on this parameter will have no effect because it's self-referential. + + + + This usage blocks passing string representations of arguments to parameters annotated with [<CallerArgumentExpression>]. The default values of these parameters will be passed. Only the usages like `Method(arguments)` can capture the string representation of arguments. You can disable this warning by using '#nowarn \"3883\"' or '--nowarn:3883'. + This usage blocks passing string representations of arguments to parameters annotated with [<CallerArgumentExpression>]. The default values of these parameters will be passed. Only the usages like `Method(arguments)` can capture the string representation of arguments. You can disable this warning by using '#nowarn \"3883\"' or '--nowarn:3883'. + + This copy-and-update record expression changes all fields of record type '{0}'. Consider using the record construction syntax instead. Essa expressão de registro copiar e atualizar altera todos os campos do tipo de registro '{0}'. Considere usar a sintaxe de construção de registro em vez disso. diff --git a/src/Compiler/xlf/FSComp.txt.ru.xlf b/src/Compiler/xlf/FSComp.txt.ru.xlf index 7013fb0bc83..a5ad9e67fe9 100644 --- a/src/Compiler/xlf/FSComp.txt.ru.xlf +++ b/src/Compiler/xlf/FSComp.txt.ru.xlf @@ -657,6 +657,11 @@ представление структуры для активных шаблонов + + Support `CallerArgumentExpression` + Support `CallerArgumentExpression` + + Support ValueOption as valid type for optional member parameters Support ValueOption as valid type for optional member parameters @@ -1447,6 +1452,26 @@ Атрибуты не могут быть применены к расширениям типа. + + The [<CallerArgumentExpression>] on this parameter will have no effect because it's applied with an invalid parameter name. + The [<CallerArgumentExpression>] on this parameter will have no effect because it's applied with an invalid parameter name. + + + + The [<CallerArgumentExpression>] on this parameter will have no effect because it's overridden by the [<{0}>]. + The [<CallerArgumentExpression>] on this parameter will have no effect because it's overridden by the [<{0}>]. + + + + The [<CallerArgumentExpression>] on this parameter will have no effect because it's self-referential. + The [<CallerArgumentExpression>] on this parameter will have no effect because it's self-referential. + + + + This usage blocks passing string representations of arguments to parameters annotated with [<CallerArgumentExpression>]. The default values of these parameters will be passed. Only the usages like `Method(arguments)` can capture the string representation of arguments. You can disable this warning by using '#nowarn \"3883\"' or '--nowarn:3883'. + This usage blocks passing string representations of arguments to parameters annotated with [<CallerArgumentExpression>]. The default values of these parameters will be passed. Only the usages like `Method(arguments)` can capture the string representation of arguments. You can disable this warning by using '#nowarn \"3883\"' or '--nowarn:3883'. + + This copy-and-update record expression changes all fields of record type '{0}'. Consider using the record construction syntax instead. Это выражение записи копирования и обновления изменяет все поля типа записи "{0}". Вместо этого можно использовать синтаксис конструкции записи. diff --git a/src/Compiler/xlf/FSComp.txt.tr.xlf b/src/Compiler/xlf/FSComp.txt.tr.xlf index 49d2a295b45..deb5c1a4ac4 100644 --- a/src/Compiler/xlf/FSComp.txt.tr.xlf +++ b/src/Compiler/xlf/FSComp.txt.tr.xlf @@ -657,6 +657,11 @@ etkin desenler için yapı gösterimi + + Support `CallerArgumentExpression` + Support `CallerArgumentExpression` + + Support ValueOption as valid type for optional member parameters Support ValueOption as valid type for optional member parameters @@ -1447,6 +1452,26 @@ Öznitelikler tür uzantılarına uygulanamaz. + + The [<CallerArgumentExpression>] on this parameter will have no effect because it's applied with an invalid parameter name. + The [<CallerArgumentExpression>] on this parameter will have no effect because it's applied with an invalid parameter name. + + + + The [<CallerArgumentExpression>] on this parameter will have no effect because it's overridden by the [<{0}>]. + The [<CallerArgumentExpression>] on this parameter will have no effect because it's overridden by the [<{0}>]. + + + + The [<CallerArgumentExpression>] on this parameter will have no effect because it's self-referential. + The [<CallerArgumentExpression>] on this parameter will have no effect because it's self-referential. + + + + This usage blocks passing string representations of arguments to parameters annotated with [<CallerArgumentExpression>]. The default values of these parameters will be passed. Only the usages like `Method(arguments)` can capture the string representation of arguments. You can disable this warning by using '#nowarn \"3883\"' or '--nowarn:3883'. + This usage blocks passing string representations of arguments to parameters annotated with [<CallerArgumentExpression>]. The default values of these parameters will be passed. Only the usages like `Method(arguments)` can capture the string representation of arguments. You can disable this warning by using '#nowarn \"3883\"' or '--nowarn:3883'. + + This copy-and-update record expression changes all fields of record type '{0}'. Consider using the record construction syntax instead. Bu kopyalama ve güncelleştirme kayıt ifadesi, '{0}' kayıt türündeki tüm alanları değiştirir. Bunun yerine kayıt oluşturma söz dizimini kullanmayı deneyin. diff --git a/src/Compiler/xlf/FSComp.txt.zh-Hans.xlf b/src/Compiler/xlf/FSComp.txt.zh-Hans.xlf index 3fc65eebc96..9bb07f10196 100644 --- a/src/Compiler/xlf/FSComp.txt.zh-Hans.xlf +++ b/src/Compiler/xlf/FSComp.txt.zh-Hans.xlf @@ -657,6 +657,11 @@ 活动模式的结构表示形式 + + Support `CallerArgumentExpression` + Support `CallerArgumentExpression` + + Support ValueOption as valid type for optional member parameters Support ValueOption as valid type for optional member parameters @@ -1447,6 +1452,26 @@ 属性不可应用于类型扩展。 + + The [<CallerArgumentExpression>] on this parameter will have no effect because it's applied with an invalid parameter name. + The [<CallerArgumentExpression>] on this parameter will have no effect because it's applied with an invalid parameter name. + + + + The [<CallerArgumentExpression>] on this parameter will have no effect because it's overridden by the [<{0}>]. + The [<CallerArgumentExpression>] on this parameter will have no effect because it's overridden by the [<{0}>]. + + + + The [<CallerArgumentExpression>] on this parameter will have no effect because it's self-referential. + The [<CallerArgumentExpression>] on this parameter will have no effect because it's self-referential. + + + + This usage blocks passing string representations of arguments to parameters annotated with [<CallerArgumentExpression>]. The default values of these parameters will be passed. Only the usages like `Method(arguments)` can capture the string representation of arguments. You can disable this warning by using '#nowarn \"3883\"' or '--nowarn:3883'. + This usage blocks passing string representations of arguments to parameters annotated with [<CallerArgumentExpression>]. The default values of these parameters will be passed. Only the usages like `Method(arguments)` can capture the string representation of arguments. You can disable this warning by using '#nowarn \"3883\"' or '--nowarn:3883'. + + This copy-and-update record expression changes all fields of record type '{0}'. Consider using the record construction syntax instead. 此复制和更新记录表达式更改记录类型“{0}”的所有字段。请考虑改用记录构造语法。 diff --git a/src/Compiler/xlf/FSComp.txt.zh-Hant.xlf b/src/Compiler/xlf/FSComp.txt.zh-Hant.xlf index 07fea0efd23..301f20022fc 100644 --- a/src/Compiler/xlf/FSComp.txt.zh-Hant.xlf +++ b/src/Compiler/xlf/FSComp.txt.zh-Hant.xlf @@ -657,6 +657,11 @@ 現用模式的結構表示法 + + Support `CallerArgumentExpression` + Support `CallerArgumentExpression` + + Support ValueOption as valid type for optional member parameters Support ValueOption as valid type for optional member parameters @@ -1447,6 +1452,26 @@ 屬性無法套用到類型延伸模組。 + + The [<CallerArgumentExpression>] on this parameter will have no effect because it's applied with an invalid parameter name. + The [<CallerArgumentExpression>] on this parameter will have no effect because it's applied with an invalid parameter name. + + + + The [<CallerArgumentExpression>] on this parameter will have no effect because it's overridden by the [<{0}>]. + The [<CallerArgumentExpression>] on this parameter will have no effect because it's overridden by the [<{0}>]. + + + + The [<CallerArgumentExpression>] on this parameter will have no effect because it's self-referential. + The [<CallerArgumentExpression>] on this parameter will have no effect because it's self-referential. + + + + This usage blocks passing string representations of arguments to parameters annotated with [<CallerArgumentExpression>]. The default values of these parameters will be passed. Only the usages like `Method(arguments)` can capture the string representation of arguments. You can disable this warning by using '#nowarn \"3883\"' or '--nowarn:3883'. + This usage blocks passing string representations of arguments to parameters annotated with [<CallerArgumentExpression>]. The default values of these parameters will be passed. Only the usages like `Method(arguments)` can capture the string representation of arguments. You can disable this warning by using '#nowarn \"3883\"' or '--nowarn:3883'. + + This copy-and-update record expression changes all fields of record type '{0}'. Consider using the record construction syntax instead. 此複製和更新記錄運算式將變更記錄類型為 '{0}' 的所有欄位。請考慮改用記錄建構語法。 diff --git a/tests/FSharp.Compiler.ComponentTests/Conformance/BasicGrammarElements/CustomAttributes/CallerArgumentExpression/Big expr test.fsx b/tests/FSharp.Compiler.ComponentTests/Conformance/BasicGrammarElements/CustomAttributes/CallerArgumentExpression/Big expr test.fsx new file mode 100644 index 00000000000..bc10f82f7ee --- /dev/null +++ b/tests/FSharp.Compiler.ComponentTests/Conformance/BasicGrammarElements/CustomAttributes/CallerArgumentExpression/Big expr test.fsx @@ -0,0 +1,20024 @@ +let assertEqual (a: string) (b: string) = + if a <> b then + failwithf "not equal: (%d length string) and (%d length string)" a.Length b.Length + +let res = + seq { + yield "ignore ()" + for _ in 1..19_999 do + yield " ignore ()" + yield " \"\"" + } + // The source code text that the compiler get uses the default newline character. + // See: https://learn.microsoft.com/en-us/dotnet/api/system.text.stringbuilder.appendline?view=net-9.0 + // and the implementation for FSharp.Compiler.Text.StringText.GetSubTextFromRange + |> String.concat System.Environment.NewLine + +open System.Runtime.CompilerServices + +type A() = + static member B (``ab c``, []?n) = + defaultValueArg n "no value" + +assertEqual res (A.B( + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + ignore () + "")) \ No newline at end of file diff --git a/tests/FSharp.Compiler.ComponentTests/Conformance/BasicGrammarElements/CustomAttributes/CallerArgumentExpression/CallerArgumentExpression.fs b/tests/FSharp.Compiler.ComponentTests/Conformance/BasicGrammarElements/CustomAttributes/CallerArgumentExpression/CallerArgumentExpression.fs new file mode 100644 index 00000000000..9cac8564f8c --- /dev/null +++ b/tests/FSharp.Compiler.ComponentTests/Conformance/BasicGrammarElements/CustomAttributes/CallerArgumentExpression/CallerArgumentExpression.fs @@ -0,0 +1,530 @@ +// Copyright (c) Microsoft Corporation. All Rights Reserved. See License.txt in the project root for license information. + +namespace Conformance.BasicGrammarElements + +open Xunit +open FSharp.Test.Compiler +open FSharp.Test + +module CustomAttributes_CallerArgumentExpression = + [] + let ``Can consume CallerArgumentExpression in BCL methods`` () = + let path = __SOURCE_DIRECTORY__ ++ "test script.fsx" + FsFromPath path + |> withLangVersionPreview + |> asExe + |> compileAndRun + |> shouldSucceed + |> ignore + + [] + let ``Can define methods using CallerArgumentExpression with C#-style optional arguments`` () = + FSharp """let assertEqual a b = if a <> b then failwithf "not equal: %A and %A" a b +open System.Runtime.CompilerServices +open System.Runtime.InteropServices +type A() = + static member aa ( + a, + []b: string, + []c: int, + []e: string) = + a,b,c,e + +let stringABC = "abc" +assertEqual (A.aa(stringABC)) ("abc", ".cctor", 13, "stringABC") +assertEqual (A.aa(a = stringABC)) ("abc", ".cctor", 14, "stringABC") + """ + |> withLangVersionPreview + |> asExe + |> compileAndRun + |> shouldSucceed + |> ignore + + [] + let ``Can define methods using CallerArgumentExpression with F#-style optional arguments`` () = + FSharp """let assertEqual a b = if a <> b then failwithf "not equal: %A and %A" a b +open System.Runtime.CompilerServices +open System.Runtime.InteropServices +type A() = + static member aa ( + a, + [] ?b: string, + [] ?c: int, + [] ?e: string) = + let b = defaultArg b "no value" + let c = defaultArg c 0 + let e = defaultArg e "no value" + a,b,c,e + +let stringABC = "abc" +assertEqual (A.aa(stringABC)) ("abc", ".cctor", 16, "stringABC") +assertEqual (A.aa(a = stringABC)) ("abc", ".cctor", 17, "stringABC") + """ + |> withLangVersionPreview + |> asExe + |> compileAndRun + |> shouldSucceed + |> ignore + + [] + let ``Can define methods using CallerArgumentExpression with F#-style optional arguments of voption`` () = + FSharp """let assertEqual a b = if a <> b then failwithf "not equal: %A and %A" a b +open System.Runtime.CompilerServices +open System.Runtime.InteropServices +type A() = + static member aa ( + a, + [] ?b: string, + [] ?c: int, + [] ?e: string) = + let b = defaultValueArg b "no value" + let c = defaultValueArg c 0 + let e = defaultValueArg e "no value" + a,b,c,e + +let stringABC = "abc" +assertEqual (A.aa(stringABC)) ("abc", ".cctor", 16, "stringABC") +assertEqual (A.aa(a = stringABC)) ("abc", ".cctor", 17, "stringABC") + """ + |> withLangVersionPreview + |> asExe + |> compileAndRun + |> shouldSucceed + |> ignore + + [] + let ``Can define in F# - with #line`` () = + FSharp """let assertEqual a b = if a <> b then failwithf "not equal: %A and %A" a b +open System.Runtime.CompilerServices +open System.Runtime.InteropServices + +let path = System.IO.Path.Combine(__SOURCE_DIRECTORY__, "test.fs") + +# 1 "test.fs" +type A() = + static member aa ( + a, + []e: string) = + a,e + + static member B (``ab c``, []?n) = + defaultArg n "no value" + +let stringABC = "abc" +assertEqual (A.aa(stringABC)) ("abc", "stringABC") +# 1 "test.fs" +assertEqual (A.aa(stringABC : string)) ("abc", "stringABC : string") +# 1 "test.fs" +assertEqual (A.aa(a = (stringABC : string))) ("abc", "(stringABC : string)") + + +A.B("abc" +#line 1 +: string) +|> assertEqual "\"abc\" +#line 1 +: string" + + +A.B((+) 1 +#line 1 + 123) +|> assertEqual "(+) 1 +#line 1 + 123" + + +A.B(#line 1 + (+) 1 + 123) +|> assertEqual "(+) 1 + 123" + """ + |> withLangVersionPreview + |> asExe + |> compileAndRun + |> shouldSucceed + |> ignore + + [] + let ``Can define methods using CallerArgumentExpression receiving special parameter names`` () = + FSharp """let assertEqual a b = if a <> b then failwithf "not equal: %A and %A" a b +open System.Runtime.CompilerServices + +type A() = + static member B (``ab c``, []?n) = + defaultArg n "no value" + +assertEqual (A.B("abc")) "\"abc\"" + """ + |> withLangVersionPreview + |> asExe + |> compileAndRun + |> shouldSucceed + |> ignore + + [] + let ``test Warns when cannot find the referenced parameter or self-referential`` () = + FSharp """let assertEqual a b = if a <> b then failwithf "not equal: %A and %A" a b +open System.Runtime.CompilerServices + +type A() = + static member A (``ab c``, []?n) = + defaultArg n "no value" + static member B (``ab c``, [] ?n) = + defaultArg n "no value" + """ + |> withLangVersionPreview + |> typecheck + |> shouldFail + |> withDiagnostics [ + (Warning 3881,Line 5, Col 65, Line 5, Col 66, "The [] on this parameter will have no effect because it's applied with an invalid parameter name.") + (Warning 3880,Line 7, Col 65 , Line 7, Col 66, "The [] on this parameter will have no effect because it's self-referential.") + ] + + [] + let ``test Warns when overridden by other caller infos`` () = + FSharp """let assertEqual a b = if a <> b then failwithf "not equal: %A and %A" a b +open System.Runtime.CompilerServices + +type A() = + static member B (a, [] ?n) = + defaultArg n "no value" + static member C (a, [] ?n) = + defaultArg n "no value" + static member D (a, [] ?n) = + defaultArg n "no value" + +let f () = + let filename = System.IO.Path.Combine(__SOURCE_DIRECTORY__, "test.fs") + #line 1 "test.fs" + A.B(1) |> assertEqual "f" + A.C(1) |> assertEqual filename + A.D(1) |> assertEqual filename +f() + """ + |> withLangVersionPreview + |> typecheck + |> shouldFail + |> withDiagnostics [ + (Warning 3882, Line 5, Col 75, Line 5, Col 76, "The [] on this parameter will have no effect because it's overridden by the [].") + (Warning 3882, Line 7, Col 73, Line 7, Col 74, "The [] on this parameter will have no effect because it's overridden by the [].") + (Warning 3206, Line 9, Col 55, Line 9, Col 71, "The CallerMemberNameAttribute applied to parameter 'n' will have no effect. It is overridden by the CallerFilePathAttribute.") + (Warning 3882, Line 9, Col 91, Line 9, Col 92, "The [] on this parameter will have no effect because it's overridden by the [].") + ] + + [] + let ``test Errors`` () = + FSharp """let assertEqual a b = if a <> b then failwithf "not equal: %A and %A" a b +open System.Runtime.CompilerServices +open System.Runtime.InteropServices + +type A() = + static member A (``ab c``, [] n) = + defaultArg n "no value" + static member B (``ab c``, []?n) = + defaultArg n 123 + static member C (``ab c``, [] n: int) = + n + """ + |> withLangVersionPreview + |> typecheck + |> shouldFail + |> withDiagnostics [ + (Error 1247,Line 6, Col 66, Line 6, Col 67, "'CallerArgumentExpression \"ab c\"' can only be applied to optional arguments") + (Error 1246,Line 8, Col 66, Line 8, Col 67, "'CallerArgumentExpression \"ab c\"' must be applied to an argument of type 'string', but has been applied to an argument of type 'int'") + (Error 1246,Line 10, Col 101, Line 10, Col 102, "'CallerArgumentExpression \"ab c\"' must be applied to an argument of type 'string', but has been applied to an argument of type 'int'") + ] + + [] + let ``User can define the CallerArgumentExpression`` () = + FSharp """namespace System.Runtime.CompilerServices + +open System + +[] +type CallerArgumentExpressionAttribute(parameterName: string) = + inherit Attribute() + + member val ParameterName = parameterName + +namespace global +module A = + let assertEqual a b = if a <> b then failwithf "not equal: %A and %A" a b + open System.Runtime.CompilerServices + + type A() = + static member B (``ab c``, []?n) = + defaultArg n "no value" + + A.B "abc" |> assertEqual "\"abc\"" + A.B ("abc": string) |> assertEqual "\"abc\": string" + A.B ("abc": (* comments *) string) |> assertEqual "\"abc\": (* comments *) string" +""" + |> withLangVersionPreview + |> asExe + |> compileAndRun + |> shouldSucceed + |> ignore + + [] + let ``Can use in Computation Expression`` = + FSharp """let assertEqual a b = if a <> b then failwithf "not equal: %A and %A" a b +open System.Runtime.CompilerServices +open System.Runtime.InteropServices + +type Builder() = + member self.Bind( + x, f, + [] ?exp : string, + [] ?exp2 : string) = + (f x, $"f={exp2.Value}, x={exp.Value}") + + member self.Return(x, [] ?exp : string) = + (x, $"x={exp.Value}") + +let b = Builder() +b { do! () } |> assertEqual (((), "x=do!"), "f=do!, x=()") +b { let! a = 123 in return a } |> assertEqual ((123, "x=a"), "f=return a, x=123") + +b { + let! a = 123 + let! b = 456 + return a + b +} |> assertEqual + (((579, "x=a + b"), "f=return a + b, x=456"), + "f=let! b = 456 + return a + b, x=123") +""" + |> withLangVersionPreview + |> asExe + |> compileAndRun + |> shouldSucceed + |> ignore + + [] + let ``Can use in Computation Expression 2`` () = + FSharp """namespace System.Runtime.CompilerServices + +open System + +[] +type CallerArgumentExpressionAttribute(parameterName: string) = + inherit Attribute() + + member val ParameterName = parameterName + +namespace global +module A = + let assertEqual a b = if a <> b then failwithf "not equal: %A and %A" a b + open System.Runtime.CompilerServices + + type A() = + static member B (``ab c``, []?n) = + defaultArg n "no value" + + async { return assertEqual(A.B "abc") "\"abc\"" } |> Async.RunSynchronously + """ + |> withLangVersionPreview + |> asExe + |> compileAndRun + |> shouldSucceed + |> ignore + + [] + let ``Can use with Delegate and Quotation`` = + FSharp """let assertEqual a b = if a <> b then failwithf "not equal: %A and %A" a b +open System.Runtime.CompilerServices +open System.Runtime.InteropServices + +type A = + delegate of + a: int * + [] ?expr: string * + [] expr2: string + -> string * string option +let a = A (fun a expr expr2 -> expr2, expr) +a.Invoke(123 - 7) |> assertEqual ("123 - 7", Some "123 - 7") + +open Microsoft.FSharp.Quotations.Patterns +match <@ a.Invoke(123 - 7) @> with +| Call(_, _, [_; Value (:? (string * string option) as value, _)]) -> assertEqual ("123 - 7", Some "123 - 7") value +| _ -> failwith "fail" +""" + |> withLangVersionPreview + |> asExe + |> compileAndRun + |> shouldSucceed + |> ignore + + [] + let ``Can use with Interface and Object Expression`` = + FSharp """let assertEqual a b = if a <> b then failwithf "not equal: %A and %A" a b +open System.Runtime.CompilerServices +open System.Runtime.InteropServices + +type Interface1 = + abstract member M: + a: int * + [] ?expr: string * + [] expr2: string + -> string * string option + +{new Interface1 with + member this.M(a, expr, expr2) = expr2, expr}.M(123 - 7) |> assertEqual ("123 - 7", Some "123 - 7") +""" + |> withLangVersionPreview + |> asExe + |> compileAndRun + |> shouldSucceed + |> ignore + + [] + let ``Only method calls with direct arguments will get the argument expression - test the warning`` () = + FSharp """module Lib +let assertEqual a b = if a <> b then failwithf "not equal: %A and %A" a b +open System.Runtime.CompilerServices +open System.Runtime.InteropServices + +type A() = + static member B (``ab c``, []n: string) = + n + +A.B "abc" |> assertEqual "\"abc\"" + +(A.B) "abc" |> assertEqual "no value" +"abc" |> A.B |> assertEqual "no value" +A.B <| "abc" |> assertEqual "no value" +let f = A.B +f "abc" |> assertEqual "no value" + """ + |> withLangVersionPreview + |> typecheck + |> shouldFail + |> withDiagnostics [ + (Information 3883, Line 12, Col 2, Line 12, Col 5, "This usage blocks passing string representations of arguments to parameters annotated with []. The default values of these parameters will be passed. Only the usages like `Method(arguments)` can capture the string representation of arguments. You can disable this warning by using '#nowarn \"3883\"' or '--nowarn:3883'.") + (Information 3883, Line 13, Col 10, Line 13, Col 13, "This usage blocks passing string representations of arguments to parameters annotated with []. The default values of these parameters will be passed. Only the usages like `Method(arguments)` can capture the string representation of arguments. You can disable this warning by using '#nowarn \"3883\"' or '--nowarn:3883'.") + (Information 3883, Line 14, Col 1, Line 14, Col 4, "This usage blocks passing string representations of arguments to parameters annotated with []. The default values of these parameters will be passed. Only the usages like `Method(arguments)` can capture the string representation of arguments. You can disable this warning by using '#nowarn \"3883\"' or '--nowarn:3883'.") + (Information 3883, Line 15, Col 9, Line 15, Col 12, "This usage blocks passing string representations of arguments to parameters annotated with []. The default values of these parameters will be passed. Only the usages like `Method(arguments)` can capture the string representation of arguments. You can disable this warning by using '#nowarn \"3883\"' or '--nowarn:3883'.") + ] + |> ignore + + [] + let ``Only method calls with direct arguments will get the argument expression`` () = + FSharp """module Lib +let assertEqual a b = if a <> b then failwithf "not equal: %A and %A" a b +open System.Runtime.CompilerServices +open System.Runtime.InteropServices + +type A() = + static member B (``ab c``, []n: string) = + n + +A.B "abc" |> assertEqual "\"abc\"" + +(A.B) "abc" |> assertEqual "no value" +"abc" |> A.B |> assertEqual "no value" +A.B <| "abc" |> assertEqual "no value" +let f = A.B +f "abc" |> assertEqual "no value" + """ + |> withLangVersionPreview + |> withOptions ["/nowarn:3883"] + |> asExe + |> compileAndRun + |> shouldSucceed + |> ignore + + (* ------------ C# Interop tests ------------- *) + [] + let ``C# can consume methods using CallerArgumentExpression receiving special parameter names`` () = + let fs = + FSharp """module Lib +let assertEqual a b = if a <> b then failwithf "not equal: %A and %A" a b +open System.Runtime.CompilerServices +open System.Runtime.InteropServices + +type A() = + static member B (``ab c``, []n: string) = + n + """ + |> withLangVersionPreview + + CSharp """Lib.assertEqual(Lib.A.B("abc"), "\"abc\"");""" + |> withName "CSLib" + |> withReferences [fs] + |> asExe + |> compileAndRun + |> shouldSucceed + |> ignore + + [] + let ``Can recognize CallerArgumentExpression defined in C#`` () = + let cs = + CSharp """using System.Runtime.CompilerServices; +public class AInCs +{ + public static string B(int param, [CallerArgumentExpression("param")] string expr = null) => expr; +} + +namespace System.Runtime.CompilerServices +{ + [AttributeUsage(AttributeTargets.Parameter)] + public sealed class CallerArgumentExpressionAttribute : Attribute + { + public CallerArgumentExpressionAttribute(string param) + { + Param = param; + } + + public string Param { get; } + } +} +""" + + FSharp """let assertEqual a b = if a <> b then failwithf "not equal: %A and %A" a b +open System.Runtime.CompilerServices + +type A() = + static member B (``ab c``, []?n) = + defaultArg n "no value" + +A.B "abc" |> assertEqual "\"abc\"" +AInCs.B (123 - 7) |> assertEqual "123 - 7" + """ + |> withLangVersionPreview + |> withReferences [cs] + |> asExe + |> compileAndRun + |> shouldSucceed + |> ignore + + (* ------------ FSI tests ------------- *) + + [] + let ``Check in fsi`` () = + let path = __SOURCE_DIRECTORY__ ++ "test script.fsx" + FsxFromPath path + |> withLangVersionPreview + |> runFsi + |> shouldSucceed + |> ignore + + + [] + let ``Check fsi #load`` () = + let path = __SOURCE_DIRECTORY__ ++ "test script.fsx" + Fsx $"""#load @"{path}" """ + |> withLangVersionPreview + |> runFsi + |> shouldSucceed + |> ignore + + [] + let ``Big expr test`` () = + let path = __SOURCE_DIRECTORY__ ++ "Big expr test.fsx" + FsFromPath path + |> withLangVersionPreview + |> runFsi + |> shouldSucceed + |> ignore diff --git a/tests/FSharp.Compiler.ComponentTests/Conformance/BasicGrammarElements/CustomAttributes/CallerArgumentExpression/test script.fsx b/tests/FSharp.Compiler.ComponentTests/Conformance/BasicGrammarElements/CustomAttributes/CallerArgumentExpression/test script.fsx new file mode 100644 index 00000000000..c2152fa6b3b --- /dev/null +++ b/tests/FSharp.Compiler.ComponentTests/Conformance/BasicGrammarElements/CustomAttributes/CallerArgumentExpression/test script.fsx @@ -0,0 +1,17 @@ +let assertEqual a b = if a <> b then failwithf "not equal: %A and %A" a b +try System.ArgumentException.ThrowIfNullOrWhiteSpace(Seq.init 50 (fun _ -> " ") + (* comment *) + |> String.concat " ") +with :? System.ArgumentException as ex -> + assertEqual true (ex.Message.Contains("(Parameter 'Seq.init 50 (fun _ -> \" \") + (* comment *) + |> String.concat \" \"")) + + +try System.ArgumentException.ThrowIfNullOrWhiteSpace(argument = (Seq.init 11 (fun _ -> " ") + (* comment *) + |> String.concat " ")) +with :? System.ArgumentException as ex -> + assertEqual true (ex.Message.Contains("(Parameter '(Seq.init 11 (fun _ -> \" \") + (* comment *) + |> String.concat \" \")")) \ No newline at end of file diff --git a/tests/FSharp.Compiler.ComponentTests/Conformance/Expressions/ApplicationExpressions/AssertExpression.fs b/tests/FSharp.Compiler.ComponentTests/Conformance/Expressions/ApplicationExpressions/AssertExpression.fs new file mode 100644 index 00000000000..d02e0ac22a0 --- /dev/null +++ b/tests/FSharp.Compiler.ComponentTests/Conformance/Expressions/ApplicationExpressions/AssertExpression.fs @@ -0,0 +1,28 @@ +// Copyright (c) Microsoft Corporation. All Rights Reserved. See License.txt in the project root for license information. + +namespace Conformance.Expressions + +open Xunit +open FSharp.Test +open FSharp.Test.Compiler + +module AssertExpression = + + let test (code: string) = + let msgShouldContains = code.[7..].Replace(@"\", @"\\").Replace("\"", "\\\"") + FSharp $"try +%s{code} +with ex -> if not(ex.Message.Contains \"%s{msgShouldContains}\") then reraise()" + |> withOptions ["--define:DEBUG"] + |> withLangVersionPreview + |> asExe + |> compileAndRun + |> shouldSucceed + + [] + let ``assert (1 = 2)`` () = + test "assert (1 = 2)" + + [] + let ``assert ("\n" = "\n\n")`` () = + test "assert (\"\\n\" = \"\\n\\n\")" diff --git a/tests/FSharp.Compiler.ComponentTests/ErrorMessages/UnsupportedAttributes.fs b/tests/FSharp.Compiler.ComponentTests/ErrorMessages/UnsupportedAttributes.fs index 3eb78de55b4..295e5115c49 100644 --- a/tests/FSharp.Compiler.ComponentTests/ErrorMessages/UnsupportedAttributes.fs +++ b/tests/FSharp.Compiler.ComponentTests/ErrorMessages/UnsupportedAttributes.fs @@ -15,7 +15,7 @@ open System.Runtime.CompilerServices let f (w, [] x : string) = () let [] g () = () type C() = - member _.F (w, [] x : string) = () + [] member _.G() = () """ @@ -23,13 +23,6 @@ type C() = |> typecheck |> shouldFail |> withResults [ - { Error = Warning 202 - Range = { StartLine = 3 - StartColumn = 13 - EndLine = 3 - EndColumn = 41 } - Message = - "This attribute is currently unsupported by the F# compiler. Applying it will not achieve its intended effect." } { Error = Warning 202 Range = { StartLine = 4 StartColumn = 7 @@ -37,13 +30,6 @@ type C() = EndColumn = 24 } Message = "This attribute is currently unsupported by the F# compiler. Applying it will not achieve its intended effect." } - { Error = Warning 202 - Range = { StartLine = 6 - StartColumn = 22 - EndLine = 6 - EndColumn = 82 } - Message = - "This attribute is currently unsupported by the F# compiler. Applying it will not achieve its intended effect." } { Error = Warning 202 Range = { StartLine = 7 StartColumn = 7 diff --git a/tests/FSharp.Compiler.ComponentTests/FSharp.Compiler.ComponentTests.fsproj b/tests/FSharp.Compiler.ComponentTests/FSharp.Compiler.ComponentTests.fsproj index 960057baf98..6120cf5d767 100644 --- a/tests/FSharp.Compiler.ComponentTests/FSharp.Compiler.ComponentTests.fsproj +++ b/tests/FSharp.Compiler.ComponentTests/FSharp.Compiler.ComponentTests.fsproj @@ -40,6 +40,7 @@ + @@ -84,6 +85,7 @@ + @@ -366,6 +368,7 @@ +