| {{# def.definitions }} | 
| {{# def.errors }} | 
| {{# def.missing }} | 
| {{# def.setupKeyword }} | 
| {{# def.$data }} | 
|   | 
| {{ var $vSchema = 'schema' + $lvl; }} | 
|   | 
| {{## def.setupLoop: | 
|   {{? !$isData }} | 
|     var {{=$vSchema}} = validate.schema{{=$schemaPath}}; | 
|   {{?}} | 
|   | 
|   {{ | 
|     var $i = 'i' + $lvl | 
|       , $propertyPath = 'schema' + $lvl + '[' + $i + ']' | 
|       , $missingProperty = '\' + ' + $propertyPath + ' + \''; | 
|     if (it.opts._errorDataPathProperty) { | 
|       it.errorPath = it.util.getPathExpr($currentErrorPath, $propertyPath, it.opts.jsonPointers); | 
|     } | 
|   }} | 
| #}} | 
|   | 
|   | 
| {{## def.isRequiredOwnProperty: | 
|   Object.prototype.hasOwnProperty.call({{=$data}}, {{=$vSchema}}[{{=$i}}]) | 
| #}} | 
|   | 
|   | 
| {{? !$isData }} | 
|   {{? $schema.length < it.opts.loopRequired && | 
|       it.schema.properties && Object.keys(it.schema.properties).length }} | 
|     {{ var $required = []; }} | 
|     {{~ $schema:$property }} | 
|       {{ var $propertySch = it.schema.properties[$property]; }} | 
|       {{? !($propertySch && {{# def.nonEmptySchema:$propertySch}}) }} | 
|         {{ $required[$required.length] = $property; }} | 
|       {{?}} | 
|     {{~}} | 
|   {{??}} | 
|     {{ var $required = $schema; }} | 
|   {{?}} | 
| {{?}} | 
|   | 
|   | 
| {{? $isData || $required.length }} | 
|   {{ | 
|     var $currentErrorPath = it.errorPath | 
|       , $loopRequired = $isData || $required.length >= it.opts.loopRequired | 
|       , $ownProperties = it.opts.ownProperties; | 
|   }} | 
|   | 
|   {{? $breakOnError }} | 
|     var missing{{=$lvl}}; | 
|     {{? $loopRequired }} | 
|       {{# def.setupLoop }} | 
|       var {{=$valid}} = true; | 
|   | 
|       {{?$isData}}{{# def.check$dataIsArray }}{{?}} | 
|   | 
|       for (var {{=$i}} = 0; {{=$i}} < {{=$vSchema}}.length; {{=$i}}++) { | 
|         {{=$valid}} = {{=$data}}[{{=$vSchema}}[{{=$i}}]] !== undefined | 
|                       {{? $ownProperties }} | 
|                         && {{# def.isRequiredOwnProperty }} | 
|                       {{?}}; | 
|         if (!{{=$valid}}) break; | 
|       } | 
|   | 
|       {{? $isData }}  }  {{?}} | 
|   | 
|       {{# def.checkError:'required' }} | 
|       else { | 
|     {{??}} | 
|       if ({{# def.checkMissingProperty:$required }}) { | 
|         {{# def.errorMissingProperty:'required' }} | 
|       } else { | 
|     {{?}} | 
|   {{??}} | 
|     {{? $loopRequired }} | 
|       {{# def.setupLoop }} | 
|       {{? $isData }} | 
|         if ({{=$vSchema}} && !Array.isArray({{=$vSchema}})) { | 
|           {{# def.addError:'required' }} | 
|         } else if ({{=$vSchema}} !== undefined) { | 
|       {{?}} | 
|   | 
|       for (var {{=$i}} = 0; {{=$i}} < {{=$vSchema}}.length; {{=$i}}++) { | 
|         if ({{=$data}}[{{=$vSchema}}[{{=$i}}]] === undefined | 
|             {{? $ownProperties }} | 
|               || !{{# def.isRequiredOwnProperty }} | 
|             {{?}}) { | 
|           {{# def.addError:'required' }} | 
|         } | 
|       } | 
|   | 
|       {{? $isData }}  }  {{?}} | 
|     {{??}} | 
|       {{~ $required:$propertyKey }} | 
|         {{# def.allErrorsMissingProperty:'required' }} | 
|       {{~}} | 
|     {{?}} | 
|   {{?}} | 
|   | 
|   {{ it.errorPath = $currentErrorPath; }} | 
|   | 
| {{?? $breakOnError }} | 
|   if (true) { | 
| {{?}} |