diff --git a/build-system/tasks/presubmit-checks.js b/build-system/tasks/presubmit-checks.js index 33bf7a0eb28d..6ac83ed403c8 100644 --- a/build-system/tasks/presubmit-checks.js +++ b/build-system/tasks/presubmit-checks.js @@ -1153,6 +1153,7 @@ const forbiddenTermsSrcInclusive = { 'testing/local-amp-chrome-extension/background.js', 'tools/errortracker/errortracker.go', 'tools/experiments/experiments.js', + 'validator/js/engine/htmlparser-interface.js', 'validator/js/engine/validator-in-browser.js', 'validator/js/engine/validator.js', 'validator/js/nodejs/index.js', diff --git a/validator/js/engine/htmlparser-interface.js b/validator/js/engine/htmlparser-interface.js index 5004c5668f5b..1ee0b2379551 100644 --- a/validator/js/engine/htmlparser-interface.js +++ b/validator/js/engine/htmlparser-interface.js @@ -73,7 +73,6 @@ const ParsedAttr = class { }; exports.ParsedAttr = ParsedAttr; - /** * An Html parser makes method calls with ParsedHtmlTags as arguments. */ @@ -208,12 +207,159 @@ const ParsedHtmlTag = class { this.attrs_ = newAttrs; } + /** + * Returns the value of a given attribute name. If it does not exist then + * returns null. + * @param {string} name + * @return {?string} + * @private + */ + getAttrValueOrNull_(name) { + return this.attrsByKey()[name] || null; + } + /** * @return {boolean} */ isEmpty() { return this.tagName_.length === 0; } + + /** + * Gets the name attribute for an extension script tag. + * @return {string} + * @private + */ + extensionScriptNameAttribute_() { + if (this.upperName() == 'SCRIPT') { + for (const attribute + of ['custom-element', 'custom-template', 'host-service']) { + if (attribute in this.attrsByKey()) { + return attribute; + } + } + } + return ''; + } + + /** + * Tests if this is an extension script tag. + * @return {boolean} + */ + isExtensionScript() { + return !!this.extensionScriptNameAttribute_(); + } + + /** + * Tests if this is an async script tag. + * @return {boolean} + * @private + */ + isAsyncScriptTag_() { + return this.upperName() == 'SCRIPT' && 'async' in this.attrsByKey() && + 'src' in this.attrsByKey(); + } + + /** + * Tests if this is the AMP runtime script tag. + * @return {boolean} + */ + isAmpRuntimeScript() { + const src = this.getAttrValueOrNull_('src'); + if (src === null) return false; + return this.isAsyncScriptTag_() && !this.isExtensionScript() && + src.startsWith('https://cdn.ampproject.org/') && + (src.endsWith('/v0.js') || src.endsWith('/v0.mjs') || + src.endsWith('/v0.mjs?f=sxg')); + } + + /** + * Tests if this is the LTS version script tag. + * @return {boolean} + */ + isLtsScriptTag() { + // Examples: + // https://cdn.ampproject.org/lts/v0.js + // https://cdn.ampproject.org/lts/v0/amp-ad-0.1.js + const src = this.getAttrValueOrNull_('src'); + if (src === null) return false; + const ltsScriptSrcRegex = new RegExp( + '^https://cdn\\.ampproject\\.org/lts/(v0|v0/amp-[a-z0-9-]*-[a-z0-9.]*)\\.js$', + 'i'); + return this.isAsyncScriptTag_() && ltsScriptSrcRegex.test(src); + } + + /** + * Tests if this is the module version script tag. + * @return {boolean} + */ + isModuleScriptTag() { + // Examples: + // https://cdn.ampproject.org/v0.mjs + // https://cdn.ampproject.org/v0/amp-ad-0.1.mjs + const type = this.getAttrValueOrNull_('type'); + if (type === null) return false; + const src = this.getAttrValueOrNull_('src'); + if (src === null) return false; + const moduleScriptSrcRegex = new RegExp( + '^https://cdn\\.ampproject\\.org/(v0|v0/amp-[a-z0-9-]*-[a-z0-9.]*)\\.mjs$', + 'i'); + return this.isAsyncScriptTag_() && (type == 'module') && + moduleScriptSrcRegex.test(src); + } + + /** + * Tests if this is the nomodule version script tag. + * @return {boolean} + */ + isNomoduleScriptTag() { + // Examples: + // https://cdn.ampproject.org/v0.js + // https://cdn.ampproject.org/v0/amp-ad-0.1.js + const src = this.getAttrValueOrNull_('src'); + if (src === null) return false; + const nomoduleScriptSrcRegex = new RegExp( + '^https://cdn\\.ampproject\\.org/(v0|v0/amp-[a-z0-9-]*-[a-z0-9.]*)\\.js$', + 'i'); + return this.isAsyncScriptTag_() && 'nomodule' in this.attrsByKey() && + nomoduleScriptSrcRegex.test(src); + } + + /** + * Tests if this is the module LTS version script tag. + * @return {boolean} + */ + isModuleLtsScriptTag() { + // Examples: + // https://cdn.ampproject.org/lts/v0.mjs + // https://cdn.ampproject.org/lts/v0/amp-ad-0.1.mjs + const type = this.getAttrValueOrNull_('type'); + if (type === null) return false; + const src = this.getAttrValueOrNull_('src'); + if (src === null) return false; + const moduleLtsScriptSrcRegex = new RegExp( + '^https://cdn\\.ampproject\\.org/lts/(v0|v0/amp-[a-z0-9-]*-[a-z0-9.]*)\\.mjs$', + 'i'); + return this.isAsyncScriptTag_() && (type == 'module') && + moduleLtsScriptSrcRegex.test(src); + } + + /** + * Tests if this is the nomodule LTS version script tag. + * @return {boolean} + */ + isNomoduleLtsScriptTag() { + // Examples: + // https://cdn.ampproject.org/lts/v0.js + // https://cdn.ampproject.org/lts/v0/amp-ad-0.1.js + const src = this.getAttrValueOrNull_('src'); + if (src === null) return false; + const nomoduleLtsScriptSrcRegex = new RegExp( + '^https://cdn\\.ampproject\\.org/lts/(v0|v0/amp-[a-z0-9-]*-[a-z0-9.]*)\\.js$', + 'i'); + return this.isAsyncScriptTag_() && 'nomodule' in this.attrsByKey() && + nomoduleLtsScriptSrcRegex.test(src); + } }; exports.ParsedHtmlTag = ParsedHtmlTag; diff --git a/validator/js/engine/validator.js b/validator/js/engine/validator.js index b731949f3765..150aa668db86 100644 --- a/validator/js/engine/validator.js +++ b/validator/js/engine/validator.js @@ -2749,86 +2749,19 @@ class ExtensionsContext { } } -// If any script in the page uses LTS, all scripts must use LTS. This is used -// to record when a script is seen and validate following script tags. +// If any script in the page uses a specific release version, then all scripts +// must use that specific release version. This is used to record the first seen +// script tag and ensure all following script tags follow the convention set by +// it. /** @enum {string} */ const ScriptReleaseVersion = { - UNKNOWN: 'UNKNOWN', - STANDARD: 'STANDARD', + UNKNOWN: 'unknown', + STANDARD: 'standard', LTS: 'LTS', + MODULE_NOMODULE: 'module/nomodule', + MODULE_NOMODULE_LTS: 'module/nomodule LTS', }; -/** - * Gets the name attribute for an extension script tag. - * @param {!parserInterface.ParsedHtmlTag} tag - * @return {string} - */ -function ExtensionScriptNameAttribute(tag) { - if (tag.upperName() == 'SCRIPT') { - for (const attribute - of ['custom-element', 'custom-template', 'host-service']) { - if (attribute in tag.attrsByKey()) { - return attribute; - } - } - } - return ''; -} - -/** - * Gets the extension name for an extension script tag. - * @param {!parserInterface.ParsedHtmlTag} tag - * @return {string} - */ -function ExtensionScriptName(tag) { - const nameAttr = ExtensionScriptNameAttribute(tag); - if (nameAttr) { - // Extension script names are required to be in lowercase by the - // validator, so we don't need to lowercase them here. - return tag.attrsByKey()[nameAttr] || ''; - } - return ''; -} - -/** - * Tests if a tag is an extension script tag. - * @param {!parserInterface.ParsedHtmlTag} tag - * @return {boolean} - */ -function IsExtensionScript(tag) { - return !!ExtensionScriptNameAttribute(tag); -} - -/** - * Tests if a tag is an async script tag. - * @param {!parserInterface.ParsedHtmlTag} tag - * @return {boolean} - */ -function IsAsyncScriptTag(tag) { - return tag.upperName() == 'SCRIPT' && 'async' in tag.attrsByKey() && - 'src' in tag.attrsByKey(); -} - -/** - * Tests if a tag is the AMP runtime script tag. - * @param {!parserInterface.ParsedHtmlTag} tag - * @return {boolean} - */ -function IsAmpRuntimeScript(tag) { - const src = tag.attrsByKey()['src'] || ''; - return IsAsyncScriptTag(tag) && !IsExtensionScript(tag) && - src.startsWith('https://cdn.ampproject.org/') && src.endsWith('/v0.js'); -} - -/** - * Tests if a URL is for the LTS version of a script. - * @param {string} url - * @return {boolean} - */ -function IsLtsScriptUrl(url) { - return url.startsWith('https://cdn.ampproject.org/lts/'); -} - /** * The Context keeps track of the line / column that the validator is * in, as well as the mandatory tag specs that have already been validated. @@ -3075,16 +3008,12 @@ class Context { /** * Record if this document contains a tag requesting the LTS runtime engine. * @param {!parserInterface.ParsedHtmlTag} parsedTag - * @param {!generated.ValidationResult} result * @private */ - recordScriptReleaseVersionFromTagResult_(parsedTag, result) { + recordScriptReleaseVersionFromTagResult_(parsedTag) { if (this.getScriptReleaseVersion() === ScriptReleaseVersion.UNKNOWN && - (IsExtensionScript(parsedTag) || IsAmpRuntimeScript(parsedTag))) { - const src = parsedTag.attrsByKey()['src'] || ''; - this.scriptReleaseVersion_ = IsLtsScriptUrl(src) ? - ScriptReleaseVersion.LTS : - ScriptReleaseVersion.STANDARD; + (parsedTag.isExtensionScript() || parsedTag.isAmpRuntimeScript())) { + this.scriptReleaseVersion_ = getScriptReleaseVersion(parsedTag); } } @@ -3113,8 +3042,7 @@ class Context { this.recordAttrRequiresExtension_(encounteredTag, tagResult); this.updateFromTagResult_(referencePointResult); this.updateFromTagResult_(tagResult); - this.recordScriptReleaseVersionFromTagResult_( - encounteredTag, tagResult.validationResult); + this.recordScriptReleaseVersionFromTagResult_(encounteredTag); this.addInlineStyleByteSize(tagResult.inlineStyleCssBytes); } @@ -4772,7 +4700,7 @@ function getExtensionNameAttribute(extensionSpec) { * @param {!generated.ValidationResult} result * @return {boolean} */ -function validateAttributeInExtension(tagSpec, context, attr, result) { +function validateAttrInExtension(tagSpec, context, attr, result) { asserts.assert(tagSpec.extensionSpec !== null); const {extensionSpec} = tagSpec; @@ -4791,7 +4719,7 @@ function validateAttributeInExtension(tagSpec, context, attr, result) { return true; } else if (attr.name === 'src') { const srcUrlRe = - /^https:\/\/cdn\.ampproject\.org(?:\/lts)?\/v0\/(amp-[a-z0-9-]*)-([a-z0-9.]*)\.js$/; + /^https:\/\/cdn\.ampproject\.org(?:\/lts)?\/v0\/(amp-[a-z0-9-]*)-([a-z0-9.]*)\.(?:m)?js(?:\?f=sxg)?$/; const reResult = srcUrlRe.exec(attr.value); // If the src URL matches this regex and the base name of the file matches // the extension, look to see if the version matches. @@ -4837,35 +4765,81 @@ function validateClassAttr(attr, tagSpec, context, result) { } } +/** + * @param {!parserInterface.ParsedHtmlTag} tag + * @return {!ScriptReleaseVersion} + */ +function getScriptReleaseVersion(tag) { + if (tag.isModuleLtsScriptTag() || tag.isNomoduleLtsScriptTag()) + return ScriptReleaseVersion.MODULE_NOMODULE_LTS; + if (tag.isModuleScriptTag() || tag.isNomoduleScriptTag()) + return ScriptReleaseVersion.MODULE_NOMODULE; + if (tag.isLtsScriptTag()) return ScriptReleaseVersion.LTS; + return ScriptReleaseVersion.STANDARD; +} + /** * Validates that LTS is used for either all script sources or none. - * @param {!parserInterface.ParsedAttr} srcAttr + * @param {!parserInterface.ParsedHtmlTag} tag * @param {!generated.TagSpec} tagSpec * @param {!Context} context * @param {!generated.ValidationResult} result */ -function validateScriptSrcAttr(srcAttr, tagSpec, context, result) { +function validateScriptSrcAttr(tag, tagSpec, context, result) { if (context.getScriptReleaseVersion() === ScriptReleaseVersion.UNKNOWN) return; - const scriptReleaseVersion = IsLtsScriptUrl(srcAttr.value) ? - ScriptReleaseVersion.LTS : - ScriptReleaseVersion.STANDARD; + const scriptReleaseVersion = getScriptReleaseVersion(tag); if (context.getScriptReleaseVersion() != scriptReleaseVersion) { const specName = tagSpec.extensionSpec !== null ? tagSpec.extensionSpec.name : tagSpec.specName; - context.addError( - scriptReleaseVersion == ScriptReleaseVersion.LTS ? - generated.ValidationError.Code.LTS_SCRIPT_AFTER_NON_LTS : - generated.ValidationError.Code.NON_LTS_SCRIPT_AFTER_LTS, - context.getLineCol(), - /*params=*/[specName], - 'https://amp.dev/documentation/guides-and-tutorials/learn/spec/' + - 'amphtml#required-markup', - result); + switch (context.getScriptReleaseVersion()) { + case ScriptReleaseVersion.LTS: + context.addError( + generated.ValidationError.Code.INCORRECT_SCRIPT_RELEASE_VERSION, + context.getLineCol(), + /*params=*/ + [specName, scriptReleaseVersion, context.getScriptReleaseVersion()], + 'https://amp.dev/documentation/guides-and-tutorials/learn/spec/' + + 'amphtml#required-markup', + result); + break; + case ScriptReleaseVersion.MODULE_NOMODULE: + context.addError( + generated.ValidationError.Code.INCORRECT_SCRIPT_RELEASE_VERSION, + context.getLineCol(), + /*params=*/ + [specName, scriptReleaseVersion, context.getScriptReleaseVersion()], + 'https://amp.dev/documentation/guides-and-tutorials/learn/spec/' + + 'amphtml#required-markup', + result); + break; + case ScriptReleaseVersion.MODULE_NOMODULE_LTS: + context.addError( + generated.ValidationError.Code.INCORRECT_SCRIPT_RELEASE_VERSION, + context.getLineCol(), + /*params=*/ + [specName, scriptReleaseVersion, context.getScriptReleaseVersion()], + 'https://amp.dev/documentation/guides-and-tutorials/learn/spec/' + + 'amphtml#required-markup', + result); + break; + case ScriptReleaseVersion.STANDARD: + context.addError( + generated.ValidationError.Code.INCORRECT_SCRIPT_RELEASE_VERSION, + context.getLineCol(), + /*params=*/ + [specName, scriptReleaseVersion, context.getScriptReleaseVersion()], + 'https://amp.dev/documentation/guides-and-tutorials/learn/spec/' + + 'amphtml#required-markup', + result); + break; + default: + break; + } } } @@ -5211,9 +5185,10 @@ function validateAttributes( // If |spec| is the runtime or an extension script, validate that LTS is // either used by all pages or no pages. if (attr.name == 'src' && - (IsExtensionScript(encounteredTag) || - IsAmpRuntimeScript(encounteredTag))) { - validateScriptSrcAttr(attr, spec, context, result.validationResult); + (encounteredTag.isExtensionScript() || + encounteredTag.isAmpRuntimeScript())) { + validateScriptSrcAttr( + encounteredTag, spec, context, result.validationResult); } if (!(attr.name in attrsByName)) { @@ -5240,7 +5215,7 @@ function validateAttributes( // this method. For 'src', we also keep track whether we validated it // this way, (seen_src_attr), since it's a mandatory attr. if (spec.extensionSpec !== null && - validateAttributeInExtension( + validateAttrInExtension( spec, context, attr, result.validationResult)) { if (attr.name === 'src') { seenExtensionSrcAttr = true; @@ -5933,6 +5908,9 @@ class ParsedValidatorRules { // For every tagspec that contains an ExtensionSpec, we add several // TagSpec fields corresponding to the data found in the ExtensionSpec. + // The addition of module/nomodule extensions happens in validator_gen_js.py + // and are built as proper JavaScript classes. They will also be expanded + // by this method. this.expandExtensionSpec_ = function() { const numTags = this.rules_.tags.length; for (let tagSpecId = 0; tagSpecId < numTags; ++tagSpecId) { @@ -6505,6 +6483,8 @@ class ParsedValidatorRules { // that has been validated, then move on to the next // alsoRequiresTagWarning. if (alsoRequiresTagspec.getSpec().extensionSpec !== null && + alsoRequiresTagspec.getSpec().specName.endsWith( + 'extension script') && this.hasValidatedAlternativeTagSpec( context, alsoRequiresTagspec.getSpec().extensionSpec.name)) { continue; diff --git a/validator/js/engine/validator_test.js b/validator/js/engine/validator_test.js index 0c4bd5b6949b..cc0d2c92d3d1 100644 --- a/validator/js/engine/validator_test.js +++ b/validator/js/engine/validator_test.js @@ -1747,7 +1747,7 @@ describe('ValidatorRulesMakeSense', () => { // it's sufficiently wrapped in private context inside the validator // that I don't see a way to call it. For now just gold the current // index. - expect(tagSpec.attrLists[0]).toEqual(20); + expect(tagSpec.attrLists[0]).toEqual(22); }); } @@ -1816,6 +1816,7 @@ describe('ValidatorRulesMakeSense', () => { tagSpec.cdata.cdataRegex !== null || tagSpec.cdata.mandatoryCdata !== null || tagSpec.cdata.maxBytes === -1 || + tagSpec.cdata.whitespaceOnly !== null || tagSpec.cdata.cssSpec.validateKeyframes) .toBe(true); }); diff --git a/validator/testdata/amp4ads_feature_tests/script_release_versions.html b/validator/testdata/amp4ads_feature_tests/script_release_versions.html new file mode 100644 index 000000000000..14c2347f918f --- /dev/null +++ b/validator/testdata/amp4ads_feature_tests/script_release_versions.html @@ -0,0 +1,51 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + Hello, world. + + diff --git a/validator/testdata/amp4ads_feature_tests/script_release_versions.out b/validator/testdata/amp4ads_feature_tests/script_release_versions.out new file mode 100644 index 000000000000..5f2b99b086ac --- /dev/null +++ b/validator/testdata/amp4ads_feature_tests/script_release_versions.out @@ -0,0 +1,74 @@ +FAIL +| +| +| +| +>> ^~~~~~~~~ +amp4ads_feature_tests/script_release_versions.html:26:0 The attribute 'transformed' may not appear in tag 'html'. (see https://amp.dev/documentation/guides-and-tutorials/learn/spec/amphtml#required-markup) +| +| +| +| +| +| +| +>> ^~~~~~~~~ +amp4ads_feature_tests/script_release_versions.html:33:2 Custom JavaScript is not allowed. (see https://amp.dev/documentation/guides-and-tutorials/learn/validation-workflow/validation_errors/#custom-javascript-is-not-allowed) +| +>> ^~~~~~~~~ +amp4ads_feature_tests/script_release_versions.html:34:2 Custom JavaScript is not allowed. (see https://amp.dev/documentation/guides-and-tutorials/learn/validation-workflow/validation_errors/#custom-javascript-is-not-allowed) +| +| +| +>> ^~~~~~~~~ +amp4ads_feature_tests/script_release_versions.html:37:2 Custom JavaScript is not allowed. (see https://amp.dev/documentation/guides-and-tutorials/learn/validation-workflow/validation_errors/#custom-javascript-is-not-allowed) +| +>> ^~~~~~~~~ +amp4ads_feature_tests/script_release_versions.html:38:2 The attribute 'nomodule' may not appear in tag 'amphtml engine script'. (see https://amp.dev/documentation/guides-and-tutorials/learn/spec/amphtml/#required-markup) +| +| +| +>> ^~~~~~~~~ +amp4ads_feature_tests/script_release_versions.html:41:2 The attribute 'type' in tag 'amp-analytics extension script' is set to the invalid value 'module'. (see https://amp.dev/documentation/components/amp-analytics) +| +>> ^~~~~~~~~ +amp4ads_feature_tests/script_release_versions.html:42:2 The attribute 'nomodule' may not appear in tag 'amp-analytics extension script'. (see https://amp.dev/documentation/components/amp-analytics) +| +| +| +>> ^~~~~~~~~ +amp4ads_feature_tests/script_release_versions.html:45:2 The script version for 'amp-audio' is a module/nomodule LTS version which mismatches with the first script on the page using the module/nomodule version. (see https://amp.dev/documentation/guides-and-tutorials/learn/spec/amphtml#required-markup) +>> ^~~~~~~~~ +amp4ads_feature_tests/script_release_versions.html:45:2 The attribute 'type' in tag 'amp-audio extension script' is set to the invalid value 'module'. (see https://amp.dev/documentation/components/amp-audio) +| +>> ^~~~~~~~~ +amp4ads_feature_tests/script_release_versions.html:46:2 The attribute 'nomodule' may not appear in tag 'amp-audio extension script'. (see https://amp.dev/documentation/components/amp-audio) +>> ^~~~~~~~~ +amp4ads_feature_tests/script_release_versions.html:46:2 The script version for 'amp-audio' is a module/nomodule LTS version which mismatches with the first script on the page using the module/nomodule version. (see https://amp.dev/documentation/guides-and-tutorials/learn/spec/amphtml#required-markup) +| +| +| Hello, world. +| +| diff --git a/validator/testdata/feature_tests/lts_extension_without_lts_runtime.html b/validator/testdata/feature_tests/lts_extension_without_lts_runtime.html index 35260f95cbce..2605dde0f77f 100644 --- a/validator/testdata/feature_tests/lts_extension_without_lts_runtime.html +++ b/validator/testdata/feature_tests/lts_extension_without_lts_runtime.html @@ -15,7 +15,6 @@ --> @@ -30,11 +29,9 @@ - + - + | @@ -31,13 +30,11 @@ FAIL | | | -| >> ^~~~~~~~~ -feature_tests/lts_extension_without_lts_runtime.html:33:2 'amp-ad' must use the non-LTS version to correspond with the first script in the page, which does not use LTS. (see https://amp.dev/documentation/guides-and-tutorials/learn/spec/amphtml#required-markup) -| src='https://cdn.ampproject.org/lts/v0/amp-ad-0.1.js'> +feature_tests/lts_extension_without_lts_runtime.html:32:2 The script version for 'amp-ad' is a LTS version which mismatches with the first script on the page using the standard version. (see https://amp.dev/documentation/guides-and-tutorials/learn/spec/amphtml#required-markup) | -| +| | | | @@ -28,11 +27,9 @@ - + - + diff --git a/validator/testdata/feature_tests/lts_runtime_after_extension.out b/validator/testdata/feature_tests/lts_runtime_after_extension.out index d9a095296e2d..4b16b00a24bc 100644 --- a/validator/testdata/feature_tests/lts_runtime_after_extension.out +++ b/validator/testdata/feature_tests/lts_runtime_after_extension.out @@ -16,7 +16,6 @@ FAIL | --> | @@ -29,13 +28,11 @@ FAIL | | | -| +| | -| >> ^~~~~~~~~ -feature_tests/lts_runtime_after_extension.html:34:2 'amp-font' must use the LTS version to correspond with the first script in the page, which uses LTS. (see https://amp.dev/documentation/guides-and-tutorials/learn/spec/amphtml#required-markup) -| src='https://cdn.ampproject.org/v0/amp-font-0.1.js'> +feature_tests/lts_runtime_after_extension.html:32:2 The script version for 'amp-font' is a standard version which mismatches with the first script on the page using the LTS version. (see https://amp.dev/documentation/guides-and-tutorials/learn/spec/amphtml#required-markup) | | | diff --git a/validator/testdata/feature_tests/lts_runtime_and_extensions.html b/validator/testdata/feature_tests/lts_runtime_and_extensions.html index 6e48522b9158..034f5927374c 100644 --- a/validator/testdata/feature_tests/lts_runtime_and_extensions.html +++ b/validator/testdata/feature_tests/lts_runtime_and_extensions.html @@ -15,7 +15,6 @@ --> @@ -30,11 +29,9 @@ - + - + | @@ -31,13 +30,11 @@ FAIL | | | -| >> ^~~~~~~~~ -feature_tests/lts_runtime_and_extensions.html:33:2 'amp-ad' must use the LTS version to correspond with the first script in the page, which uses LTS. (see https://amp.dev/documentation/guides-and-tutorials/learn/spec/amphtml#required-markup) -| src='https://cdn.ampproject.org/v0/amp-ad-0.1.js'> +feature_tests/lts_runtime_and_extensions.html:32:2 The script version for 'amp-ad' is a standard version which mismatches with the first script on the page using the LTS version. (see https://amp.dev/documentation/guides-and-tutorials/learn/spec/amphtml#required-markup) | -| +| | | | + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Hello, world. + + diff --git a/validator/testdata/transformed_feature_tests/first_script_lts.out b/validator/testdata/transformed_feature_tests/first_script_lts.out new file mode 100644 index 000000000000..570496330983 --- /dev/null +++ b/validator/testdata/transformed_feature_tests/first_script_lts.out @@ -0,0 +1,77 @@ +FAIL +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +>> ^~~~~~~~~ +transformed_feature_tests/first_script_lts.html:39:2 The script version for 'amp-analytics' is a standard version which mismatches with the first script on the page using the LTS version. (see https://amp.dev/documentation/guides-and-tutorials/learn/spec/amphtml#required-markup) +| +| +| +>> ^~~~~~~~~ +transformed_feature_tests/first_script_lts.html:42:2 The script version for 'amp-anim' is a module/nomodule version which mismatches with the first script on the page using the LTS version. (see https://amp.dev/documentation/guides-and-tutorials/learn/spec/amphtml#required-markup) +>> ^~~~~~~~~ +transformed_feature_tests/first_script_lts.html:42:2 The attribute 'type' in tag 'amp-anim extension script' is set to the invalid value 'module'. (see https://amp.dev/documentation/components/amp-anim) +| +| +| +>> ^~~~~~~~~ +transformed_feature_tests/first_script_lts.html:45:2 The attribute 'nomodule' may not appear in tag 'amp-anim extension script'. (see https://amp.dev/documentation/components/amp-anim) +>> ^~~~~~~~~ +transformed_feature_tests/first_script_lts.html:45:2 The script version for 'amp-anim' is a module/nomodule version which mismatches with the first script on the page using the LTS version. (see https://amp.dev/documentation/guides-and-tutorials/learn/spec/amphtml#required-markup) +| +| +| +>> ^~~~~~~~~ +transformed_feature_tests/first_script_lts.html:48:2 The script version for 'amp-audio' is a module/nomodule LTS version which mismatches with the first script on the page using the LTS version. (see https://amp.dev/documentation/guides-and-tutorials/learn/spec/amphtml#required-markup) +>> ^~~~~~~~~ +transformed_feature_tests/first_script_lts.html:48:2 The attribute 'type' in tag 'amp-audio extension script' is set to the invalid value 'module'. (see https://amp.dev/documentation/components/amp-audio) +| +| +| +>> ^~~~~~~~~ +transformed_feature_tests/first_script_lts.html:51:2 The attribute 'nomodule' may not appear in tag 'amp-audio extension script'. (see https://amp.dev/documentation/components/amp-audio) +>> ^~~~~~~~~ +transformed_feature_tests/first_script_lts.html:51:2 The script version for 'amp-audio' is a module/nomodule LTS version which mismatches with the first script on the page using the LTS version. (see https://amp.dev/documentation/guides-and-tutorials/learn/spec/amphtml#required-markup) +| +| +| +| +| Hello, world. +| +| diff --git a/validator/testdata/transformed_feature_tests/first_script_module.html b/validator/testdata/transformed_feature_tests/first_script_module.html new file mode 100644 index 000000000000..695a7491d831 --- /dev/null +++ b/validator/testdata/transformed_feature_tests/first_script_module.html @@ -0,0 +1,61 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Hello, world. + + diff --git a/validator/testdata/transformed_feature_tests/first_script_module.out b/validator/testdata/transformed_feature_tests/first_script_module.out new file mode 100644 index 000000000000..dc3c0b4bca78 --- /dev/null +++ b/validator/testdata/transformed_feature_tests/first_script_module.out @@ -0,0 +1,82 @@ +FAIL +| +| +| +| +| +| +| +| +| +| +| +>> ^~~~~~~~~ +transformed_feature_tests/first_script_module.html:33:2 Custom JavaScript is not allowed. (see https://amp.dev/documentation/guides-and-tutorials/learn/validation-workflow/validation_errors/#custom-javascript-is-not-allowed) +| +| +| +>> ^~~~~~~~~ +transformed_feature_tests/first_script_module.html:36:2 The attribute 'nomodule' may not appear in tag 'amphtml engine script'. (see https://amp.dev/documentation/guides-and-tutorials/learn/spec/amphtml/#required-markup) +| +| +| +>> ^~~~~~~~~ +transformed_feature_tests/first_script_module.html:39:2 The attribute 'type' in tag 'amp-ad extension script' is set to the invalid value 'module'. (see https://amp.dev/documentation/components/amp-ad) +| +| +| +>> ^~~~~~~~~ +transformed_feature_tests/first_script_module.html:42:2 The attribute 'nomodule' may not appear in tag 'amp-ad extension script'. (see https://amp.dev/documentation/components/amp-ad) +| +| +| +>> ^~~~~~~~~ +transformed_feature_tests/first_script_module.html:45:2 The script version for 'amp-analytics' is a standard version which mismatches with the first script on the page using the module/nomodule version. (see https://amp.dev/documentation/guides-and-tutorials/learn/spec/amphtml#required-markup) +| +| +| +>> ^~~~~~~~~ +transformed_feature_tests/first_script_module.html:48:2 The script version for 'amp-anim' is a LTS version which mismatches with the first script on the page using the module/nomodule version. (see https://amp.dev/documentation/guides-and-tutorials/learn/spec/amphtml#required-markup) +| +| +| +>> ^~~~~~~~~ +transformed_feature_tests/first_script_module.html:51:2 The script version for 'amp-audio' is a module/nomodule LTS version which mismatches with the first script on the page using the module/nomodule version. (see https://amp.dev/documentation/guides-and-tutorials/learn/spec/amphtml#required-markup) +>> ^~~~~~~~~ +transformed_feature_tests/first_script_module.html:51:2 The attribute 'type' in tag 'amp-audio extension script' is set to the invalid value 'module'. (see https://amp.dev/documentation/components/amp-audio) +| +| +| +>> ^~~~~~~~~ +transformed_feature_tests/first_script_module.html:54:2 The attribute 'nomodule' may not appear in tag 'amp-audio extension script'. (see https://amp.dev/documentation/components/amp-audio) +>> ^~~~~~~~~ +transformed_feature_tests/first_script_module.html:54:2 The script version for 'amp-audio' is a module/nomodule LTS version which mismatches with the first script on the page using the module/nomodule version. (see https://amp.dev/documentation/guides-and-tutorials/learn/spec/amphtml#required-markup) +| +| +| +| +| Hello, world. +| +| diff --git a/validator/testdata/transformed_feature_tests/first_script_module_lts.html b/validator/testdata/transformed_feature_tests/first_script_module_lts.html new file mode 100644 index 000000000000..72512466ba31 --- /dev/null +++ b/validator/testdata/transformed_feature_tests/first_script_module_lts.html @@ -0,0 +1,61 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Hello, world. + + diff --git a/validator/testdata/transformed_feature_tests/first_script_module_lts.out b/validator/testdata/transformed_feature_tests/first_script_module_lts.out new file mode 100644 index 000000000000..7eb7fae453db --- /dev/null +++ b/validator/testdata/transformed_feature_tests/first_script_module_lts.out @@ -0,0 +1,82 @@ +FAIL +| +| +| +| +| +| +| +| +| +| +| +>> ^~~~~~~~~ +transformed_feature_tests/first_script_module_lts.html:33:2 Custom JavaScript is not allowed. (see https://amp.dev/documentation/guides-and-tutorials/learn/validation-workflow/validation_errors/#custom-javascript-is-not-allowed) +| +| +| +>> ^~~~~~~~~ +transformed_feature_tests/first_script_module_lts.html:36:2 The attribute 'nomodule' may not appear in tag 'amphtml engine script'. (see https://amp.dev/documentation/guides-and-tutorials/learn/spec/amphtml/#required-markup) +| +| +| +>> ^~~~~~~~~ +transformed_feature_tests/first_script_module_lts.html:39:2 The attribute 'type' in tag 'amp-ad extension script' is set to the invalid value 'module'. (see https://amp.dev/documentation/components/amp-ad) +| +| +| +>> ^~~~~~~~~ +transformed_feature_tests/first_script_module_lts.html:42:2 The attribute 'nomodule' may not appear in tag 'amp-ad extension script'. (see https://amp.dev/documentation/components/amp-ad) +| +| +| +>> ^~~~~~~~~ +transformed_feature_tests/first_script_module_lts.html:45:2 The script version for 'amp-analytics' is a standard version which mismatches with the first script on the page using the module/nomodule LTS version. (see https://amp.dev/documentation/guides-and-tutorials/learn/spec/amphtml#required-markup) +| +| +| +>> ^~~~~~~~~ +transformed_feature_tests/first_script_module_lts.html:48:2 The script version for 'amp-anim' is a LTS version which mismatches with the first script on the page using the module/nomodule LTS version. (see https://amp.dev/documentation/guides-and-tutorials/learn/spec/amphtml#required-markup) +| +| +| +>> ^~~~~~~~~ +transformed_feature_tests/first_script_module_lts.html:51:2 The script version for 'amp-audio' is a module/nomodule version which mismatches with the first script on the page using the module/nomodule LTS version. (see https://amp.dev/documentation/guides-and-tutorials/learn/spec/amphtml#required-markup) +>> ^~~~~~~~~ +transformed_feature_tests/first_script_module_lts.html:51:2 The attribute 'type' in tag 'amp-audio extension script' is set to the invalid value 'module'. (see https://amp.dev/documentation/components/amp-audio) +| +| +| +>> ^~~~~~~~~ +transformed_feature_tests/first_script_module_lts.html:54:2 The attribute 'nomodule' may not appear in tag 'amp-audio extension script'. (see https://amp.dev/documentation/components/amp-audio) +>> ^~~~~~~~~ +transformed_feature_tests/first_script_module_lts.html:54:2 The script version for 'amp-audio' is a module/nomodule version which mismatches with the first script on the page using the module/nomodule LTS version. (see https://amp.dev/documentation/guides-and-tutorials/learn/spec/amphtml#required-markup) +| +| +| +| +| Hello, world. +| +| diff --git a/validator/testdata/transformed_feature_tests/first_script_nomodule.html b/validator/testdata/transformed_feature_tests/first_script_nomodule.html new file mode 100644 index 000000000000..c4937c45b01e --- /dev/null +++ b/validator/testdata/transformed_feature_tests/first_script_nomodule.html @@ -0,0 +1,61 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Hello, world. + + diff --git a/validator/testdata/transformed_feature_tests/first_script_nomodule.out b/validator/testdata/transformed_feature_tests/first_script_nomodule.out new file mode 100644 index 000000000000..aceb732ccd54 --- /dev/null +++ b/validator/testdata/transformed_feature_tests/first_script_nomodule.out @@ -0,0 +1,82 @@ +FAIL +| +| +| +| +| +| +| +| +| +| +| +>> ^~~~~~~~~ +transformed_feature_tests/first_script_nomodule.html:33:2 The attribute 'nomodule' may not appear in tag 'amphtml engine script'. (see https://amp.dev/documentation/guides-and-tutorials/learn/spec/amphtml/#required-markup) +| +| +| +>> ^~~~~~~~~ +transformed_feature_tests/first_script_nomodule.html:36:2 Custom JavaScript is not allowed. (see https://amp.dev/documentation/guides-and-tutorials/learn/validation-workflow/validation_errors/#custom-javascript-is-not-allowed) +| +| +| +>> ^~~~~~~~~ +transformed_feature_tests/first_script_nomodule.html:39:2 The attribute 'nomodule' may not appear in tag 'amp-ad extension script'. (see https://amp.dev/documentation/components/amp-ad) +| +| +| +>> ^~~~~~~~~ +transformed_feature_tests/first_script_nomodule.html:42:2 The attribute 'type' in tag 'amp-ad extension script' is set to the invalid value 'module'. (see https://amp.dev/documentation/components/amp-ad) +| +| +| +>> ^~~~~~~~~ +transformed_feature_tests/first_script_nomodule.html:45:2 The script version for 'amp-analytics' is a standard version which mismatches with the first script on the page using the module/nomodule version. (see https://amp.dev/documentation/guides-and-tutorials/learn/spec/amphtml#required-markup) +| +| +| +>> ^~~~~~~~~ +transformed_feature_tests/first_script_nomodule.html:48:2 The script version for 'amp-anim' is a LTS version which mismatches with the first script on the page using the module/nomodule version. (see https://amp.dev/documentation/guides-and-tutorials/learn/spec/amphtml#required-markup) +| +| +| +>> ^~~~~~~~~ +transformed_feature_tests/first_script_nomodule.html:51:2 The script version for 'amp-audio' is a module/nomodule LTS version which mismatches with the first script on the page using the module/nomodule version. (see https://amp.dev/documentation/guides-and-tutorials/learn/spec/amphtml#required-markup) +>> ^~~~~~~~~ +transformed_feature_tests/first_script_nomodule.html:51:2 The attribute 'type' in tag 'amp-audio extension script' is set to the invalid value 'module'. (see https://amp.dev/documentation/components/amp-audio) +| +| +| +>> ^~~~~~~~~ +transformed_feature_tests/first_script_nomodule.html:54:2 The attribute 'nomodule' may not appear in tag 'amp-audio extension script'. (see https://amp.dev/documentation/components/amp-audio) +>> ^~~~~~~~~ +transformed_feature_tests/first_script_nomodule.html:54:2 The script version for 'amp-audio' is a module/nomodule LTS version which mismatches with the first script on the page using the module/nomodule version. (see https://amp.dev/documentation/guides-and-tutorials/learn/spec/amphtml#required-markup) +| +| +| +| +| Hello, world. +| +| diff --git a/validator/testdata/transformed_feature_tests/first_script_nomodule_lts.html b/validator/testdata/transformed_feature_tests/first_script_nomodule_lts.html new file mode 100644 index 000000000000..32d6e3e11436 --- /dev/null +++ b/validator/testdata/transformed_feature_tests/first_script_nomodule_lts.html @@ -0,0 +1,61 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Hello, world. + + diff --git a/validator/testdata/transformed_feature_tests/first_script_nomodule_lts.out b/validator/testdata/transformed_feature_tests/first_script_nomodule_lts.out new file mode 100644 index 000000000000..5b4282790292 --- /dev/null +++ b/validator/testdata/transformed_feature_tests/first_script_nomodule_lts.out @@ -0,0 +1,82 @@ +FAIL +| +| +| +| +| +| +| +| +| +| +| +>> ^~~~~~~~~ +transformed_feature_tests/first_script_nomodule_lts.html:33:2 The attribute 'nomodule' may not appear in tag 'amphtml engine script'. (see https://amp.dev/documentation/guides-and-tutorials/learn/spec/amphtml/#required-markup) +| +| +| +>> ^~~~~~~~~ +transformed_feature_tests/first_script_nomodule_lts.html:36:2 Custom JavaScript is not allowed. (see https://amp.dev/documentation/guides-and-tutorials/learn/validation-workflow/validation_errors/#custom-javascript-is-not-allowed) +| +| +| +>> ^~~~~~~~~ +transformed_feature_tests/first_script_nomodule_lts.html:39:2 The attribute 'nomodule' may not appear in tag 'amp-ad extension script'. (see https://amp.dev/documentation/components/amp-ad) +| +| +| +>> ^~~~~~~~~ +transformed_feature_tests/first_script_nomodule_lts.html:42:2 The attribute 'type' in tag 'amp-ad extension script' is set to the invalid value 'module'. (see https://amp.dev/documentation/components/amp-ad) +| +| +| +>> ^~~~~~~~~ +transformed_feature_tests/first_script_nomodule_lts.html:45:2 The script version for 'amp-analytics' is a standard version which mismatches with the first script on the page using the module/nomodule LTS version. (see https://amp.dev/documentation/guides-and-tutorials/learn/spec/amphtml#required-markup) +| +| +| +>> ^~~~~~~~~ +transformed_feature_tests/first_script_nomodule_lts.html:48:2 The script version for 'amp-anim' is a LTS version which mismatches with the first script on the page using the module/nomodule LTS version. (see https://amp.dev/documentation/guides-and-tutorials/learn/spec/amphtml#required-markup) +| +| +| +>> ^~~~~~~~~ +transformed_feature_tests/first_script_nomodule_lts.html:51:2 The script version for 'amp-audio' is a module/nomodule version which mismatches with the first script on the page using the module/nomodule LTS version. (see https://amp.dev/documentation/guides-and-tutorials/learn/spec/amphtml#required-markup) +>> ^~~~~~~~~ +transformed_feature_tests/first_script_nomodule_lts.html:51:2 The attribute 'type' in tag 'amp-audio extension script' is set to the invalid value 'module'. (see https://amp.dev/documentation/components/amp-audio) +| +| +| +>> ^~~~~~~~~ +transformed_feature_tests/first_script_nomodule_lts.html:54:2 The attribute 'nomodule' may not appear in tag 'amp-audio extension script'. (see https://amp.dev/documentation/components/amp-audio) +>> ^~~~~~~~~ +transformed_feature_tests/first_script_nomodule_lts.html:54:2 The script version for 'amp-audio' is a module/nomodule version which mismatches with the first script on the page using the module/nomodule LTS version. (see https://amp.dev/documentation/guides-and-tutorials/learn/spec/amphtml#required-markup) +| +| +| +| +| Hello, world. +| +| diff --git a/validator/testdata/transformed_feature_tests/first_script_standard.html b/validator/testdata/transformed_feature_tests/first_script_standard.html new file mode 100644 index 000000000000..c76837c998ba --- /dev/null +++ b/validator/testdata/transformed_feature_tests/first_script_standard.html @@ -0,0 +1,58 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Hello, world. + + diff --git a/validator/testdata/transformed_feature_tests/first_script_standard.out b/validator/testdata/transformed_feature_tests/first_script_standard.out new file mode 100644 index 000000000000..86e5ba5e586a --- /dev/null +++ b/validator/testdata/transformed_feature_tests/first_script_standard.out @@ -0,0 +1,77 @@ +FAIL +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +>> ^~~~~~~~~ +transformed_feature_tests/first_script_standard.html:39:2 The script version for 'amp-analytics' is a LTS version which mismatches with the first script on the page using the standard version. (see https://amp.dev/documentation/guides-and-tutorials/learn/spec/amphtml#required-markup) +| +| +| +>> ^~~~~~~~~ +transformed_feature_tests/first_script_standard.html:42:2 The script version for 'amp-anim' is a module/nomodule version which mismatches with the first script on the page using the standard version. (see https://amp.dev/documentation/guides-and-tutorials/learn/spec/amphtml#required-markup) +>> ^~~~~~~~~ +transformed_feature_tests/first_script_standard.html:42:2 The attribute 'type' in tag 'amp-anim extension script' is set to the invalid value 'module'. (see https://amp.dev/documentation/components/amp-anim) +| +| +| +>> ^~~~~~~~~ +transformed_feature_tests/first_script_standard.html:45:2 The attribute 'nomodule' may not appear in tag 'amp-anim extension script'. (see https://amp.dev/documentation/components/amp-anim) +>> ^~~~~~~~~ +transformed_feature_tests/first_script_standard.html:45:2 The script version for 'amp-anim' is a module/nomodule version which mismatches with the first script on the page using the standard version. (see https://amp.dev/documentation/guides-and-tutorials/learn/spec/amphtml#required-markup) +| +| +| +>> ^~~~~~~~~ +transformed_feature_tests/first_script_standard.html:48:2 The script version for 'amp-audio' is a module/nomodule LTS version which mismatches with the first script on the page using the standard version. (see https://amp.dev/documentation/guides-and-tutorials/learn/spec/amphtml#required-markup) +>> ^~~~~~~~~ +transformed_feature_tests/first_script_standard.html:48:2 The attribute 'type' in tag 'amp-audio extension script' is set to the invalid value 'module'. (see https://amp.dev/documentation/components/amp-audio) +| +| +| +>> ^~~~~~~~~ +transformed_feature_tests/first_script_standard.html:51:2 The attribute 'nomodule' may not appear in tag 'amp-audio extension script'. (see https://amp.dev/documentation/components/amp-audio) +>> ^~~~~~~~~ +transformed_feature_tests/first_script_standard.html:51:2 The script version for 'amp-audio' is a module/nomodule LTS version which mismatches with the first script on the page using the standard version. (see https://amp.dev/documentation/guides-and-tutorials/learn/spec/amphtml#required-markup) +| +| +| +| +| Hello, world. +| +| diff --git a/validator/testdata/transformed_feature_tests/module_nomodule.html b/validator/testdata/transformed_feature_tests/module_nomodule.html new file mode 100644 index 000000000000..3912407cb5d6 --- /dev/null +++ b/validator/testdata/transformed_feature_tests/module_nomodule.html @@ -0,0 +1,46 @@ + + + + + + + + + + + + + + + + + + + + + Hello, world. + + + diff --git a/validator/testdata/transformed_feature_tests/module_nomodule.out b/validator/testdata/transformed_feature_tests/module_nomodule.out new file mode 100644 index 000000000000..59fc16189a82 --- /dev/null +++ b/validator/testdata/transformed_feature_tests/module_nomodule.out @@ -0,0 +1,55 @@ +FAIL +| +| +| +| +| +| +| +| +| +| +| +>> ^~~~~~~~~ +transformed_feature_tests/module_nomodule.html:33:2 Custom JavaScript is not allowed. (see https://amp.dev/documentation/guides-and-tutorials/learn/validation-workflow/validation_errors/#custom-javascript-is-not-allowed) +| +>> ^~~~~~~~~ +transformed_feature_tests/module_nomodule.html:34:2 The attribute 'nomodule' may not appear in tag 'amphtml engine script'. (see https://amp.dev/documentation/guides-and-tutorials/learn/spec/amphtml/#required-markup) +| +| +| +>> ^~~~~~~~~ +transformed_feature_tests/module_nomodule.html:37:2 The attribute 'type' in tag 'amp-ad extension script' is set to the invalid value 'module'. (see https://amp.dev/documentation/components/amp-ad) +| +>> ^~~~~~~~~ +transformed_feature_tests/module_nomodule.html:38:2 The attribute 'nomodule' may not appear in tag 'amp-ad extension script'. (see https://amp.dev/documentation/components/amp-ad) +| +| +| +| +| Hello, world. +| +| +| diff --git a/validator/testdata/transformed_feature_tests/module_nomodule_lts.html b/validator/testdata/transformed_feature_tests/module_nomodule_lts.html new file mode 100644 index 000000000000..8ee19711b047 --- /dev/null +++ b/validator/testdata/transformed_feature_tests/module_nomodule_lts.html @@ -0,0 +1,46 @@ + + + + + + + + + + + + + + + + + + + + + Hello, world. + + + diff --git a/validator/testdata/transformed_feature_tests/module_nomodule_lts.out b/validator/testdata/transformed_feature_tests/module_nomodule_lts.out new file mode 100644 index 000000000000..9dbb64d12065 --- /dev/null +++ b/validator/testdata/transformed_feature_tests/module_nomodule_lts.out @@ -0,0 +1,55 @@ +FAIL +| +| +| +| +| +| +| +| +| +| +| +>> ^~~~~~~~~ +transformed_feature_tests/module_nomodule_lts.html:33:2 Custom JavaScript is not allowed. (see https://amp.dev/documentation/guides-and-tutorials/learn/validation-workflow/validation_errors/#custom-javascript-is-not-allowed) +| +>> ^~~~~~~~~ +transformed_feature_tests/module_nomodule_lts.html:34:2 The attribute 'nomodule' may not appear in tag 'amphtml engine script'. (see https://amp.dev/documentation/guides-and-tutorials/learn/spec/amphtml/#required-markup) +| +| +| +>> ^~~~~~~~~ +transformed_feature_tests/module_nomodule_lts.html:37:2 The attribute 'type' in tag 'amp-ad extension script' is set to the invalid value 'module'. (see https://amp.dev/documentation/components/amp-ad) +| +>> ^~~~~~~~~ +transformed_feature_tests/module_nomodule_lts.html:38:2 The attribute 'nomodule' may not appear in tag 'amp-ad extension script'. (see https://amp.dev/documentation/components/amp-ad) +| +| +| +| +| Hello, world. +| +| +| diff --git a/validator/testdata/transformed_feature_tests/module_nomodule_lts_no_paired_module.html b/validator/testdata/transformed_feature_tests/module_nomodule_lts_no_paired_module.html new file mode 100644 index 000000000000..713fd4beafce --- /dev/null +++ b/validator/testdata/transformed_feature_tests/module_nomodule_lts_no_paired_module.html @@ -0,0 +1,44 @@ + + + + + + + + + + + + + + + + + + + Hello, world. + + + diff --git a/validator/testdata/transformed_feature_tests/module_nomodule_lts_no_paired_module.out b/validator/testdata/transformed_feature_tests/module_nomodule_lts_no_paired_module.out new file mode 100644 index 000000000000..91f57b38186f --- /dev/null +++ b/validator/testdata/transformed_feature_tests/module_nomodule_lts_no_paired_module.out @@ -0,0 +1,49 @@ +FAIL +| +| +| +| +| +| +| +| +| +| +| +>> ^~~~~~~~~ +transformed_feature_tests/module_nomodule_lts_no_paired_module.html:33:2 The attribute 'nomodule' may not appear in tag 'amphtml engine script'. (see https://amp.dev/documentation/guides-and-tutorials/learn/spec/amphtml/#required-markup) +| +| +| +>> ^~~~~~~~~ +transformed_feature_tests/module_nomodule_lts_no_paired_module.html:36:2 The attribute 'nomodule' may not appear in tag 'amp-ad extension script'. (see https://amp.dev/documentation/components/amp-ad) +| +| +| +| +| Hello, world. +| +| +| diff --git a/validator/testdata/transformed_feature_tests/module_nomodule_lts_no_paired_nomodule.html b/validator/testdata/transformed_feature_tests/module_nomodule_lts_no_paired_nomodule.html new file mode 100644 index 000000000000..33ef5828096e --- /dev/null +++ b/validator/testdata/transformed_feature_tests/module_nomodule_lts_no_paired_nomodule.html @@ -0,0 +1,44 @@ + + + + + + + + + + + + + + + + + + + Hello, world. + + + diff --git a/validator/testdata/transformed_feature_tests/module_nomodule_lts_no_paired_nomodule.out b/validator/testdata/transformed_feature_tests/module_nomodule_lts_no_paired_nomodule.out new file mode 100644 index 000000000000..c05d2f983d7d --- /dev/null +++ b/validator/testdata/transformed_feature_tests/module_nomodule_lts_no_paired_nomodule.out @@ -0,0 +1,51 @@ +FAIL +| +| +| +| +| +| +| +| +| +| +| +>> ^~~~~~~~~ +transformed_feature_tests/module_nomodule_lts_no_paired_nomodule.html:33:2 Custom JavaScript is not allowed. (see https://amp.dev/documentation/guides-and-tutorials/learn/validation-workflow/validation_errors/#custom-javascript-is-not-allowed) +| +| +| +>> ^~~~~~~~~ +transformed_feature_tests/module_nomodule_lts_no_paired_nomodule.html:36:2 The attribute 'type' in tag 'amp-ad extension script' is set to the invalid value 'module'. (see https://amp.dev/documentation/components/amp-ad) +| +| +| +| +| Hello, world. +| +| +| +>> ^~~~~~~~~ +transformed_feature_tests/module_nomodule_lts_no_paired_nomodule.html:44:6 The mandatory tag 'amphtml engine script' is missing or incorrect. (see https://amp.dev/documentation/guides-and-tutorials/learn/spec/amphtml/#required-markup) diff --git a/validator/testdata/transformed_feature_tests/module_nomodule_no_paired_module.html b/validator/testdata/transformed_feature_tests/module_nomodule_no_paired_module.html new file mode 100644 index 000000000000..c44be584c7c1 --- /dev/null +++ b/validator/testdata/transformed_feature_tests/module_nomodule_no_paired_module.html @@ -0,0 +1,44 @@ + + + + + + + + + + + + + + + + + + + Hello, world. + + + diff --git a/validator/testdata/transformed_feature_tests/module_nomodule_no_paired_module.out b/validator/testdata/transformed_feature_tests/module_nomodule_no_paired_module.out new file mode 100644 index 000000000000..b8b6a21ea742 --- /dev/null +++ b/validator/testdata/transformed_feature_tests/module_nomodule_no_paired_module.out @@ -0,0 +1,49 @@ +FAIL +| +| +| +| +| +| +| +| +| +| +| +>> ^~~~~~~~~ +transformed_feature_tests/module_nomodule_no_paired_module.html:33:2 The attribute 'nomodule' may not appear in tag 'amphtml engine script'. (see https://amp.dev/documentation/guides-and-tutorials/learn/spec/amphtml/#required-markup) +| +| +| +>> ^~~~~~~~~ +transformed_feature_tests/module_nomodule_no_paired_module.html:36:2 The attribute 'nomodule' may not appear in tag 'amp-ad extension script'. (see https://amp.dev/documentation/components/amp-ad) +| +| +| +| +| Hello, world. +| +| +| diff --git a/validator/testdata/transformed_feature_tests/module_nomodule_no_paired_nomodule.html b/validator/testdata/transformed_feature_tests/module_nomodule_no_paired_nomodule.html new file mode 100644 index 000000000000..2f2e150f83de --- /dev/null +++ b/validator/testdata/transformed_feature_tests/module_nomodule_no_paired_nomodule.html @@ -0,0 +1,44 @@ + + + + + + + + + + + + + + + + + + + Hello, world. + + + diff --git a/validator/testdata/transformed_feature_tests/module_nomodule_no_paired_nomodule.out b/validator/testdata/transformed_feature_tests/module_nomodule_no_paired_nomodule.out new file mode 100644 index 000000000000..172a33ffd5d3 --- /dev/null +++ b/validator/testdata/transformed_feature_tests/module_nomodule_no_paired_nomodule.out @@ -0,0 +1,51 @@ +FAIL +| +| +| +| +| +| +| +| +| +| +| +>> ^~~~~~~~~ +transformed_feature_tests/module_nomodule_no_paired_nomodule.html:33:2 Custom JavaScript is not allowed. (see https://amp.dev/documentation/guides-and-tutorials/learn/validation-workflow/validation_errors/#custom-javascript-is-not-allowed) +| +| +| +>> ^~~~~~~~~ +transformed_feature_tests/module_nomodule_no_paired_nomodule.html:36:2 The attribute 'type' in tag 'amp-ad extension script' is set to the invalid value 'module'. (see https://amp.dev/documentation/components/amp-ad) +| +| +| +| +| Hello, world. +| +| +| +>> ^~~~~~~~~ +transformed_feature_tests/module_nomodule_no_paired_nomodule.html:44:6 The mandatory tag 'amphtml engine script' is missing or incorrect. (see https://amp.dev/documentation/guides-and-tutorials/learn/spec/amphtml/#required-markup) diff --git a/validator/validator-main.protoascii b/validator/validator-main.protoascii index 16a6efa11a59..e9d884d28eb6 100644 --- a/validator/validator-main.protoascii +++ b/validator/validator-main.protoascii @@ -26,7 +26,7 @@ min_validator_revision_required: 475 # newer versions of the spec file. This is currently a Google internal # mechanism, validator.js does not use this facility. However, any # change to this file (validator-main.js) requires updating this revision id. -spec_file_revision: 1123 +spec_file_revision: 1125 styles_spec_url: "https://amp.dev/documentation/guides-and-tutorials/develop/style_and_layout/style_pages/" script_spec_url: "https://amp.dev/documentation/guides-and-tutorials/learn/validation-workflow/validation_errors/#custom-javascript-is-not-allowed" @@ -3856,6 +3856,46 @@ attr_lists: { value_casei: "text/javascript" } } +attr_lists: { + name: "amphtml-module-engine-attrs" + attrs: { + name: "async" + mandatory: true + value: "" + } + attrs: { + name: "crossorigin" + mandatory: true + value: "anonymous" + } + attrs: { + name: "type" + mandatory: true + value_casei: "module" + dispatch_key: NAME_VALUE_DISPATCH + } +} +attr_lists: { + name: "amphtml-nomodule-engine-attrs" + attrs: { + name: "async" + mandatory: true + value: "" + } + attrs: { + name: "crossorigin" + value: "anonymous" + } + attrs: { + name: "nomodule" + mandatory: true + value: "" + } + attrs: { + name: "type" + value_casei: "text/javascript" + } +} tags: { html_format: AMP tag_name: "SCRIPT" @@ -3883,9 +3923,9 @@ tags: { tags: { html_format: AMP tag_name: "SCRIPT" - spec_name: "amphtml engine v0.js lts script" - descriptive_name: "amphtml engine v0.js script" - mandatory_alternatives: "amphtml engine v0.js script" + spec_name: "amphtml engine script (LTS)" + descriptive_name: "amphtml engine script" + mandatory_alternatives: "amphtml engine script" unique: true mandatory_parent: "HEAD" attr_lists: "nonce-attr" @@ -3904,6 +3944,110 @@ tags: { } spec_url: "https://amp.dev/documentation/guides-and-tutorials/learn/spec/amphtml/#required-markup" } +# TODO(b/167681900): update documentation to cover these script release versions +# TODO(b/173803451): allow module/nomodule tagspecs. +#tags: { +# html_format: AMP +# enabled_by: "transformed" +# tag_name: "SCRIPT" +# spec_name: "amphtml module engine script" +# descriptive_name: "amphtml engine script" +# mandatory_alternatives: "amphtml engine script" +# unique: true +# mandatory_parent: "HEAD" +# satisfies: "amphtml module engine script" +# requires: "amphtml nomodule engine script" +# attr_lists: "nonce-attr" +# attr_lists: "amphtml-module-engine-attrs" +# attrs: { +# name: "src" +# mandatory: true +# value: "https://cdn.ampproject.org/v0.mjs" +# dispatch_key: NAME_VALUE_DISPATCH +# } +# cdata: { +# whitespace_only: true +# } +# spec_url: "https://amp.dev/documentation/guides-and-tutorials/learn/spec/amphtml/#required-markup" +#} +# TODO(b/167681900): update documentation to cover these script release versions +# TODO(b/173803451): allow module/nomodule tagspecs. +#tags: { +# html_format: AMP +# enabled_by: "transformed" +# tag_name: "SCRIPT" +# spec_name: "amphtml nomodule engine script" +# descriptive_name: "amphtml engine script" +# mandatory_alternatives: "amphtml engine script" +# unique: true +# mandatory_parent: "HEAD" +# satisfies: "amphtml nomodule engine script" +# requires: "amphtml module engine script" +# attr_lists: "nonce-attr" +# attr_lists: "amphtml-nomodule-engine-attrs" +# attrs: { +# name: "src" +# mandatory: true +# value: "https://cdn.ampproject.org/v0.js" +# dispatch_key: NAME_VALUE_DISPATCH +# } +# cdata: { +# whitespace_only: true +# } +# spec_url: "https://amp.dev/documentation/guides-and-tutorials/learn/spec/amphtml/#required-markup" +#} +# TODO(b/167681900): update documentation to cover these script release versions +# TODO(b/173803451): allow module/nomodule tagspecs. +#tags: { +# html_format: AMP +# enabled_by: "transformed" +# tag_name: "SCRIPT" +# spec_name: "amphtml module LTS engine script" +# descriptive_name: "amphtml engine script" +# mandatory_alternatives: "amphtml engine script" +# unique: true +# mandatory_parent: "HEAD" +# satisfies: "amphtml module LTS engine script" +# requires: "amphtml nomodule LTS engine script" +# attr_lists: "nonce-attr" +# attr_lists: "amphtml-module-engine-attrs" +# attrs: { +# name: "src" +# mandatory: true +# value: "https://cdn.ampproject.org/lts/v0.mjs" +# dispatch_key: NAME_VALUE_DISPATCH +# } +# cdata: { +# whitespace_only: true +# } +# spec_url: "https://amp.dev/documentation/guides-and-tutorials/learn/spec/amphtml/#required-markup" +#} +# TODO(b/167681900): update documentation to cover these script release versions +# TODO(b/173803451): allow module/nomodule tagspecs. +#tags: { +# html_format: AMP +# enabled_by: "transformed" +# tag_name: "SCRIPT" +# spec_name: "amphtml nomodule LTS engine script" +# descriptive_name: "amphtml engine script" +# mandatory_alternatives: "amphtml engine script" +# unique: true +# mandatory_parent: "HEAD" +# satisfies: "amphtml nomodule LTS engine script" +# requires: "amphtml module LTS engine script" +# attr_lists: "nonce-attr" +# attr_lists: "amphtml-nomodule-engine-attrs" +# attrs: { +# name: "src" +# mandatory: true +# value: "https://cdn.ampproject.org/lts/v0.js" +# dispatch_key: NAME_VALUE_DISPATCH +# } +# cdata: { +# whitespace_only: true +# } +# spec_url: "https://amp.dev/documentation/guides-and-tutorials/learn/spec/amphtml/#required-markup" +#} tags: { html_format: AMP4EMAIL tag_name: "SCRIPT" @@ -4518,8 +4662,7 @@ attr_lists: { } } -# AMP Extension attributes. These attributes are used in every AMP -# extension script tag +# AMP Extension attributes. attr_lists: { name: "common-extension-attrs" attrs: { @@ -5710,100 +5853,101 @@ error_specificity { code: WARNING_EXTENSION_UNUSED specificity: 16 } error_specificity { code: WARNING_EXTENSION_DEPRECATED_VERSION specificity: 17 } error_specificity { code: NON_LTS_SCRIPT_AFTER_LTS specificity: 18 } error_specificity { code: LTS_SCRIPT_AFTER_NON_LTS specificity: 19 } -error_specificity { code: DISALLOWED_TAG specificity: 20 } -error_specificity { code: DISALLOWED_ATTR specificity: 21 } -error_specificity { code: INVALID_ATTR_VALUE specificity: 22 } -error_specificity { code: DUPLICATE_ATTRIBUTE specificity: 23 } -error_specificity { code: ATTR_VALUE_REQUIRED_BY_LAYOUT specificity: 24 } -error_specificity { code: MANDATORY_ATTR_MISSING specificity: 25 } -error_specificity { code: MANDATORY_ONEOF_ATTR_MISSING specificity: 26 } -error_specificity { code: MANDATORY_ANYOF_ATTR_MISSING specificity: 27 } -error_specificity { code: ATTR_REQUIRED_BUT_MISSING specificity: 28 } -error_specificity { code: DUPLICATE_UNIQUE_TAG specificity: 29 } -error_specificity { code: DUPLICATE_UNIQUE_TAG_WARNING specificity: 30 } -error_specificity { code: STYLESHEET_TOO_LONG specificity: 31 } -error_specificity { code: STYLESHEET_AND_INLINE_STYLE_TOO_LONG specificity: 32 } -error_specificity { code: INLINE_STYLE_TOO_LONG specificity: 33 } -error_specificity { code: INLINE_SCRIPT_TOO_LONG specificity: 34 } -error_specificity { code: CSS_SYNTAX_INVALID_AT_RULE specificity: 35 } +error_specificity { code: INCORRECT_SCRIPT_RELEASE_VERSION specificity: 20 } +error_specificity { code: DISALLOWED_TAG specificity: 21 } +error_specificity { code: DISALLOWED_ATTR specificity: 22 } +error_specificity { code: INVALID_ATTR_VALUE specificity: 23 } +error_specificity { code: DUPLICATE_ATTRIBUTE specificity: 24 } +error_specificity { code: ATTR_VALUE_REQUIRED_BY_LAYOUT specificity: 25 } +error_specificity { code: MANDATORY_ATTR_MISSING specificity: 26 } +error_specificity { code: MANDATORY_ONEOF_ATTR_MISSING specificity: 27 } +error_specificity { code: MANDATORY_ANYOF_ATTR_MISSING specificity: 28 } +error_specificity { code: ATTR_REQUIRED_BUT_MISSING specificity: 29 } +error_specificity { code: DUPLICATE_UNIQUE_TAG specificity: 30 } +error_specificity { code: DUPLICATE_UNIQUE_TAG_WARNING specificity: 31 } +error_specificity { code: STYLESHEET_TOO_LONG specificity: 32 } +error_specificity { code: STYLESHEET_AND_INLINE_STYLE_TOO_LONG specificity: 33 } +error_specificity { code: INLINE_STYLE_TOO_LONG specificity: 34 } +error_specificity { code: INLINE_SCRIPT_TOO_LONG specificity: 35 } +error_specificity { code: CSS_SYNTAX_INVALID_AT_RULE specificity: 36 } error_specificity { - code: MANDATORY_PROPERTY_MISSING_FROM_ATTR_VALUE specificity: 36 -} -error_specificity { code: INVALID_PROPERTY_VALUE_IN_ATTR_VALUE specificity: 37 } -error_specificity { code: DISALLOWED_PROPERTY_IN_ATTR_VALUE specificity: 38 } -error_specificity { code: MUTUALLY_EXCLUSIVE_ATTRS specificity: 39 } -error_specificity { code: UNESCAPED_TEMPLATE_IN_ATTR_VALUE specificity: 40 } -error_specificity { code: TEMPLATE_PARTIAL_IN_ATTR_VALUE specificity: 41 } -error_specificity { code: TEMPLATE_IN_ATTR_NAME specificity: 42 } + code: MANDATORY_PROPERTY_MISSING_FROM_ATTR_VALUE specificity: 37 +} +error_specificity { code: INVALID_PROPERTY_VALUE_IN_ATTR_VALUE specificity: 38 } +error_specificity { code: DISALLOWED_PROPERTY_IN_ATTR_VALUE specificity: 39 } +error_specificity { code: MUTUALLY_EXCLUSIVE_ATTRS specificity: 40 } +error_specificity { code: UNESCAPED_TEMPLATE_IN_ATTR_VALUE specificity: 41 } +error_specificity { code: TEMPLATE_PARTIAL_IN_ATTR_VALUE specificity: 42 } +error_specificity { code: TEMPLATE_IN_ATTR_NAME specificity: 43 } error_specificity { - code: INCONSISTENT_UNITS_FOR_WIDTH_AND_HEIGHT specificity: 43 -} -error_specificity { code: MISSING_LAYOUT_ATTRIBUTES specificity: 44 } -error_specificity { code: IMPLIED_LAYOUT_INVALID specificity: 45 } -error_specificity { code: SPECIFIED_LAYOUT_INVALID specificity: 46 } -error_specificity { code: ATTR_DISALLOWED_BY_IMPLIED_LAYOUT specificity: 47 } -error_specificity { code: ATTR_DISALLOWED_BY_SPECIFIED_LAYOUT specificity: 48 } -error_specificity { code: DUPLICATE_DIMENSION specificity: 49 } -error_specificity { code: DISALLOWED_RELATIVE_URL specificity: 50 } -error_specificity { code: MISSING_URL specificity: 51 } -error_specificity { code: DISALLOWED_DOMAIN specificity: 52 } -error_specificity { code: INVALID_URL_PROTOCOL specificity: 53 } -error_specificity { code: INVALID_URL specificity: 54 } -error_specificity { code: DISALLOWED_STYLE_ATTR specificity: 55 } -error_specificity { code: CSS_SYNTAX_STRAY_TRAILING_BACKSLASH specificity: 56 } -error_specificity { code: CSS_SYNTAX_UNTERMINATED_COMMENT specificity: 57 } -error_specificity { code: CSS_SYNTAX_UNTERMINATED_STRING specificity: 58 } -error_specificity { code: CSS_SYNTAX_BAD_URL specificity: 59 } + code: INCONSISTENT_UNITS_FOR_WIDTH_AND_HEIGHT specificity: 44 +} +error_specificity { code: MISSING_LAYOUT_ATTRIBUTES specificity: 45 } +error_specificity { code: IMPLIED_LAYOUT_INVALID specificity: 46 } +error_specificity { code: SPECIFIED_LAYOUT_INVALID specificity: 47 } +error_specificity { code: ATTR_DISALLOWED_BY_IMPLIED_LAYOUT specificity: 48 } +error_specificity { code: ATTR_DISALLOWED_BY_SPECIFIED_LAYOUT specificity: 49 } +error_specificity { code: DUPLICATE_DIMENSION specificity: 50 } +error_specificity { code: DISALLOWED_RELATIVE_URL specificity: 51 } +error_specificity { code: MISSING_URL specificity: 52 } +error_specificity { code: DISALLOWED_DOMAIN specificity: 53 } +error_specificity { code: INVALID_URL_PROTOCOL specificity: 54 } +error_specificity { code: INVALID_URL specificity: 55 } +error_specificity { code: DISALLOWED_STYLE_ATTR specificity: 56 } +error_specificity { code: CSS_SYNTAX_STRAY_TRAILING_BACKSLASH specificity: 57 } +error_specificity { code: CSS_SYNTAX_UNTERMINATED_COMMENT specificity: 58 } +error_specificity { code: CSS_SYNTAX_UNTERMINATED_STRING specificity: 59 } +error_specificity { code: CSS_SYNTAX_BAD_URL specificity: 60 } error_specificity { - code: CSS_SYNTAX_EOF_IN_PRELUDE_OF_QUALIFIED_RULE specificity: 60 + code: CSS_SYNTAX_EOF_IN_PRELUDE_OF_QUALIFIED_RULE specificity: 61 } -error_specificity { code: CSS_SYNTAX_INVALID_DECLARATION specificity: 61 } -error_specificity { code: CSS_SYNTAX_INCOMPLETE_DECLARATION specificity: 62 } -error_specificity { code: CSS_SYNTAX_ERROR_IN_PSEUDO_SELECTOR specificity: 63 } -error_specificity { code: CSS_SYNTAX_MISSING_SELECTOR specificity: 64 } -error_specificity { code: CSS_SYNTAX_NOT_A_SELECTOR_START specificity: 65 } +error_specificity { code: CSS_SYNTAX_INVALID_DECLARATION specificity: 62 } +error_specificity { code: CSS_SYNTAX_INCOMPLETE_DECLARATION specificity: 63 } +error_specificity { code: CSS_SYNTAX_ERROR_IN_PSEUDO_SELECTOR specificity: 64 } +error_specificity { code: CSS_SYNTAX_MISSING_SELECTOR specificity: 65 } +error_specificity { code: CSS_SYNTAX_NOT_A_SELECTOR_START specificity: 66 } error_specificity { - code: CSS_SYNTAX_UNPARSED_INPUT_REMAINS_IN_SELECTOR specificity: 66 -} -error_specificity { code: CSS_SYNTAX_MISSING_URL specificity: 67 } -error_specificity { code: CSS_SYNTAX_DISALLOWED_DOMAIN specificity: 68 } -error_specificity { code: CSS_SYNTAX_INVALID_URL specificity: 69 } -error_specificity { code: CSS_SYNTAX_INVALID_URL_PROTOCOL specificity: 70 } -error_specificity { code: CSS_SYNTAX_DISALLOWED_RELATIVE_URL specificity: 71 } -error_specificity { code: INCORRECT_NUM_CHILD_TAGS specificity: 72 } -error_specificity { code: DISALLOWED_CHILD_TAG_NAME specificity: 73 } -error_specificity { code: DISALLOWED_FIRST_CHILD_TAG_NAME specificity: 74 } -error_specificity { code: CSS_SYNTAX_INVALID_ATTR_SELECTOR specificity: 75 } + code: CSS_SYNTAX_UNPARSED_INPUT_REMAINS_IN_SELECTOR specificity: 67 +} +error_specificity { code: CSS_SYNTAX_MISSING_URL specificity: 68 } +error_specificity { code: CSS_SYNTAX_DISALLOWED_DOMAIN specificity: 69 } +error_specificity { code: CSS_SYNTAX_INVALID_URL specificity: 70 } +error_specificity { code: CSS_SYNTAX_INVALID_URL_PROTOCOL specificity: 71 } +error_specificity { code: CSS_SYNTAX_DISALLOWED_RELATIVE_URL specificity: 72 } +error_specificity { code: INCORRECT_NUM_CHILD_TAGS specificity: 73 } +error_specificity { code: DISALLOWED_CHILD_TAG_NAME specificity: 74 } +error_specificity { code: DISALLOWED_FIRST_CHILD_TAG_NAME specificity: 75 } +error_specificity { code: CSS_SYNTAX_INVALID_ATTR_SELECTOR specificity: 76 } error_specificity { - code: CHILD_TAG_DOES_NOT_SATISFY_REFERENCE_POINT specificity: 76 + code: CHILD_TAG_DOES_NOT_SATISFY_REFERENCE_POINT specificity: 77 } -error_specificity { code: MANDATORY_REFERENCE_POINT_MISSING specificity: 77 } -error_specificity { code: DUPLICATE_REFERENCE_POINT specificity: 78 } -error_specificity { code: TAG_REFERENCE_POINT_CONFLICT specificity: 79 } +error_specificity { code: MANDATORY_REFERENCE_POINT_MISSING specificity: 78 } +error_specificity { code: DUPLICATE_REFERENCE_POINT specificity: 79 } +error_specificity { code: TAG_REFERENCE_POINT_CONFLICT specificity: 80 } error_specificity { code: CHILD_TAG_DOES_NOT_SATISFY_REFERENCE_POINT_SINGULAR - specificity: 80 + specificity: 81 } -error_specificity { code: CSS_SYNTAX_DISALLOWED_PROPERTY_VALUE specificity: 81 } +error_specificity { code: CSS_SYNTAX_DISALLOWED_PROPERTY_VALUE specificity: 82 } error_specificity { code: CSS_SYNTAX_DISALLOWED_PROPERTY_VALUE_WITH_HINT - specificity: 82 + specificity: 83 } error_specificity { code: CSS_SYNTAX_PROPERTY_DISALLOWED_WITHIN_AT_RULE - specificity: 83 + specificity: 84 } error_specificity { code: CSS_SYNTAX_PROPERTY_DISALLOWED_TOGETHER_WITH - specificity: 84 + specificity: 85 } error_specificity { code: CSS_SYNTAX_PROPERTY_REQUIRES_QUALIFICATION - specificity: 85 + specificity: 86 } error_specificity { code: BASE_TAG_MUST_PRECEED_ALL_URLS - specificity: 86 + specificity: 87 } error_specificity { code: DISALLOWED_SCRIPT_TAG specificity: 102 } error_specificity { code: GENERAL_DISALLOWED_TAG specificity: 103 } @@ -5932,7 +6076,11 @@ error_formats { "deprecated version. Please use a more recent version of this " "extension. This may become an error in the future." } - +error_formats { + code: INCORRECT_SCRIPT_RELEASE_VERSION + format: "The script version for '%1' is a %2 version which mismatches " + "with the first script on the page using the %3 version." +} error_formats { code: NON_LTS_SCRIPT_AFTER_LTS format: "'%1' must use the LTS version to correspond with the first script " @@ -5943,7 +6091,6 @@ error_formats { format: "'%1' must use the non-LTS version to correspond with the first " "script in the page, which does not use LTS." } - error_formats { code: ATTR_REQUIRED_BUT_MISSING format: "The attribute '%1' in tag '%2' is missing or incorrect, but " diff --git a/validator/validator.pb.go b/validator/validator.pb.go index 0d530b8419d2..c9662637d1af 100644 --- a/validator/validator.pb.go +++ b/validator/validator.pb.go @@ -18,7 +18,7 @@ var _ = math.Inf // is compatible with the proto package it is being compiled against. // A compilation error at this line likely means your copy of the // proto package needs to be updated. -const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package +const _ = proto.ProtoPackageIsVersion2 // please upgrade the proto package // These two fields specify that values from one AttrSpec refer to values from // another AttrSpec elsewhere on the page; validator will verify the @@ -525,7 +525,7 @@ func (ValidationError_Severity) EnumDescriptor() ([]byte, []int) { return fileDescriptor_bf1c6ec7c0d80dd5, []int{26, 0} } -// NEXT AVAILABLE TAG: 119 +// NEXT AVAILABLE TAG: 120 type ValidationError_Code int32 const ( @@ -540,6 +540,7 @@ const ( ValidationError_WARNING_EXTENSION_DEPRECATED_VERSION ValidationError_Code = 80 ValidationError_NON_LTS_SCRIPT_AFTER_LTS ValidationError_Code = 112 ValidationError_LTS_SCRIPT_AFTER_NON_LTS ValidationError_Code = 113 + ValidationError_INCORRECT_SCRIPT_RELEASE_VERSION ValidationError_Code = 119 ValidationError_ATTR_REQUIRED_BUT_MISSING ValidationError_Code = 61 ValidationError_DISALLOWED_TAG ValidationError_Code = 2 ValidationError_GENERAL_DISALLOWED_TAG ValidationError_Code = 51 @@ -659,6 +660,7 @@ var ValidationError_Code_name = map[int32]string{ 80: "WARNING_EXTENSION_DEPRECATED_VERSION", 112: "NON_LTS_SCRIPT_AFTER_LTS", 113: "LTS_SCRIPT_AFTER_NON_LTS", + 119: "INCORRECT_SCRIPT_RELEASE_VERSION", 61: "ATTR_REQUIRED_BUT_MISSING", 2: "DISALLOWED_TAG", 51: "GENERAL_DISALLOWED_TAG", @@ -776,6 +778,7 @@ var ValidationError_Code_value = map[string]int32{ "WARNING_EXTENSION_DEPRECATED_VERSION": 80, "NON_LTS_SCRIPT_AFTER_LTS": 112, "LTS_SCRIPT_AFTER_NON_LTS": 113, + "INCORRECT_SCRIPT_RELEASE_VERSION": 119, "ATTR_REQUIRED_BUT_MISSING": 61, "DISALLOWED_TAG": 2, "GENERAL_DISALLOWED_TAG": 51, @@ -3913,336 +3916,335 @@ func init() { proto.RegisterType((*ValidationResult)(nil), "amp.validator.ValidationResult") } -func init() { - proto.RegisterFile("validator.proto", fileDescriptor_bf1c6ec7c0d80dd5) -} +func init() { proto.RegisterFile("validator.proto", fileDescriptor_bf1c6ec7c0d80dd5) } var fileDescriptor_bf1c6ec7c0d80dd5 = []byte{ - // 5215 bytes of a gzipped FileDescriptorProto + // 5227 bytes of a gzipped FileDescriptorProto 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xcc, 0x5b, 0xdd, 0x76, 0xdc, 0x46, 0x72, 0x36, 0xff, 0x87, 0x45, 0x72, 0x08, 0x36, 0x29, 0x7a, 0xf4, 0x4f, 0xc1, 0xb2, 0x25, 0x5b, 0x6b, 0xda, 0xe6, 0x7a, 0x6d, 0xaf, 0xd6, 0x6b, 0x2f, 0x38, 0xd3, 0x14, 0x61, 0x61, 0x80, 0x51, 0x03, 0x43, 0x89, 0x9b, 0xec, 0x76, 0xa0, 0x99, 0x26, 0x85, 0xf5, 0xfc, 0x19, 0xc0, 0xd0, 0x62, - 0x6e, 0xf2, 0x10, 0x49, 0x6e, 0x72, 0x9f, 0x93, 0x17, 0xc8, 0x55, 0x72, 0x4e, 0x9e, 0x23, 0x79, - 0x87, 0x3c, 0x42, 0x4e, 0x4e, 0x4e, 0x75, 0xe3, 0x6f, 0x30, 0x43, 0x49, 0xd9, 0xdc, 0xe4, 0x4a, - 0x44, 0xd5, 0x57, 0xdd, 0xd5, 0xd5, 0xd5, 0x55, 0xd5, 0xd5, 0x23, 0xd8, 0xbc, 0xf0, 0x7b, 0x41, - 0xd7, 0x8f, 0x87, 0xe1, 0xfe, 0x28, 0x1c, 0xc6, 0x43, 0xb2, 0xe1, 0xf7, 0x47, 0xfb, 0x19, 0x51, - 0x17, 0xb0, 0x69, 0xc4, 0x71, 0xe8, 0x85, 0xc1, 0xf9, 0xb9, 0x08, 0xdd, 0x91, 0xe8, 0x90, 0xfb, - 0x50, 0x0d, 0xce, 0xf8, 0x85, 0xdf, 0x1b, 0x0b, 0x1e, 0x8a, 0x73, 0xf1, 0xba, 0x36, 0xb7, 0x37, - 0xf7, 0x70, 0x95, 0xad, 0x07, 0x67, 0x27, 0x48, 0x64, 0x48, 0x23, 0xbf, 0x00, 0xe2, 0xf7, 0xa2, - 0x21, 0x0f, 0xc5, 0x4f, 0xe3, 0x20, 0x14, 0x11, 0xf7, 0xe3, 0x38, 0xac, 0xcd, 0xef, 0x2d, 0x3c, - 0x5c, 0x65, 0x1a, 0x72, 0x58, 0xc2, 0xc0, 0xe1, 0xf5, 0x4b, 0x58, 0x6f, 0x85, 0xc3, 0x91, 0x08, - 0xe3, 0x4b, 0x39, 0x07, 0x81, 0xc5, 0x81, 0xdf, 0x17, 0xc9, 0xc8, 0xf2, 0x6f, 0x72, 0x0b, 0x56, - 0xfb, 0xfe, 0x40, 0xaa, 0x75, 0x59, 0x9b, 0xdf, 0x9b, 0x7b, 0x58, 0x61, 0x39, 0x81, 0xec, 0xc0, - 0x92, 0x54, 0xa9, 0xb6, 0x20, 0x45, 0xd4, 0x07, 0xb9, 0x07, 0xeb, 0x4a, 0xd1, 0xee, 0x70, 0xfc, - 0xb2, 0x27, 0x6a, 0x8b, 0x7b, 0x73, 0x0f, 0xe7, 0xd8, 0x9a, 0xa4, 0x35, 0x24, 0x49, 0x77, 0x40, - 0x2b, 0x4e, 0x6d, 0x05, 0x51, 0x4c, 0x7e, 0x03, 0x30, 0x52, 0xb4, 0x40, 0x44, 0xb5, 0xb9, 0xbd, - 0x85, 0x87, 0x6b, 0x07, 0x37, 0xf7, 0x27, 0x2c, 0xb3, 0x5f, 0x14, 0x62, 0x05, 0xb8, 0xfe, 0xd7, - 0xb0, 0xd2, 0x0e, 0x7b, 0x72, 0x19, 0x37, 0xa0, 0x22, 0xad, 0xda, 0x19, 0xf6, 0xe4, 0x28, 0xab, - 0x2c, 0xfb, 0x26, 0x8f, 0xa0, 0xea, 0xf7, 0x7a, 0xc3, 0x9f, 0x79, 0x28, 0x7a, 0x7e, 0x1c, 0x5c, - 0x08, 0xb5, 0xa6, 0xc7, 0x8b, 0x71, 0x38, 0x16, 0x6c, 0x43, 0xf2, 0x58, 0xc2, 0x22, 0x1f, 0xc1, - 0x9a, 0x02, 0x8b, 0xfe, 0x28, 0xbe, 0x94, 0x6b, 0xac, 0x3c, 0x5e, 0x3a, 0xf3, 0x7b, 0x91, 0x60, - 0x20, 0x39, 0x14, 0x19, 0xfa, 0x4f, 0x50, 0xad, 0x47, 0x51, 0x43, 0x74, 0x7a, 0x7e, 0xe8, 0xc7, - 0xc1, 0x70, 0x30, 0xd3, 0x92, 0x77, 0x41, 0x59, 0x80, 0x77, 0xfc, 0x48, 0x04, 0xc9, 0xa6, 0x80, - 0x24, 0xd5, 0x91, 0x42, 0x3e, 0x81, 0xad, 0xc2, 0xfe, 0x26, 0x30, 0x65, 0xd8, 0xcd, 0x8b, 0x6c, - 0x8f, 0x25, 0x56, 0xff, 0x87, 0x35, 0xa8, 0xe0, 0x1e, 0xca, 0x05, 0xdf, 0x06, 0x10, 0x03, 0xff, - 0x65, 0x4f, 0x74, 0xf9, 0xcb, 0xcb, 0xda, 0xfb, 0x72, 0xe0, 0xd5, 0x84, 0x72, 0x78, 0x89, 0x13, - 0x77, 0x83, 0x28, 0xe3, 0xd7, 0xd4, 0xc4, 0x29, 0xe9, 0xf0, 0x72, 0xa6, 0xb6, 0x8f, 0x60, 0xcb, - 0xef, 0xc5, 0x22, 0x1c, 0x48, 0x53, 0x70, 0xa4, 0x45, 0xb9, 0x23, 0x65, 0x0c, 0x1b, 0xe9, 0x93, - 0x4e, 0xb2, 0x50, 0x76, 0x92, 0x07, 0xb0, 0x99, 0x7d, 0xf0, 0xe1, 0x40, 0x0c, 0xcf, 0x6a, 0xeb, - 0x72, 0xa6, 0x6a, 0x46, 0x76, 0x90, 0x3a, 0x09, 0xf4, 0x07, 0x97, 0xc3, 0xb3, 0xda, 0xb5, 0x12, - 0xd0, 0x40, 0x6a, 0xee, 0x76, 0x8b, 0x52, 0xa1, 0xc4, 0xed, 0x4a, 0x06, 0x26, 0x53, 0x06, 0xce, - 0x00, 0xea, 0x00, 0x6d, 0xca, 0xb1, 0x21, 0x37, 0xed, 0xec, 0x1d, 0x58, 0x9a, 0xb9, 0x03, 0xe4, - 0x97, 0xb0, 0xaa, 0xb0, 0xe3, 0xb0, 0x57, 0xab, 0xee, 0xcd, 0x3d, 0x5c, 0x3b, 0xd8, 0x2d, 0x39, - 0x6b, 0xe2, 0x90, 0xac, 0x22, 0x81, 0xed, 0xb0, 0x47, 0x7e, 0x00, 0x4d, 0x09, 0x15, 0x1c, 0x7d, - 0x4d, 0xca, 0xde, 0x7d, 0x83, 0xa3, 0xe3, 0xe9, 0x48, 0x14, 0x68, 0x65, 0x72, 0x44, 0x87, 0x8d, - 0xf4, 0x94, 0x75, 0x78, 0x27, 0x8a, 0x6a, 0x37, 0xa5, 0xe1, 0xd3, 0x63, 0xd6, 0xa9, 0x47, 0x11, - 0xf9, 0x38, 0x5d, 0x10, 0x62, 0xa2, 0x8b, 0x73, 0x89, 0xbb, 0x25, 0x71, 0xd5, 0x14, 0xe7, 0x5e, - 0x9c, 0x23, 0xd4, 0x04, 0xcd, 0xef, 0x76, 0x93, 0x08, 0x13, 0x0f, 0x79, 0x24, 0xe2, 0xda, 0xf5, - 0xbd, 0xb9, 0x87, 0xd5, 0x83, 0xbd, 0x92, 0x6a, 0xa9, 0xdf, 0xed, 0xcb, 0xc0, 0xe3, 0x8a, 0x98, - 0x6d, 0xf8, 0xdd, 0xae, 0xfc, 0xf0, 0x86, 0xae, 0x88, 0xc9, 0x31, 0x28, 0x65, 0xd5, 0x66, 0xcb, - 0x91, 0x6e, 0xbc, 0xeb, 0x48, 0x52, 0x50, 0xba, 0x03, 0x8e, 0xf4, 0x0d, 0xac, 0xc4, 0x2a, 0x08, - 0xd6, 0x34, 0x69, 0xa6, 0x3b, 0x33, 0x46, 0x28, 0x84, 0x49, 0x96, 0xc2, 0xc9, 0x97, 0xb0, 0x8b, - 0x1e, 0x8e, 0x87, 0x54, 0x74, 0x27, 0xe2, 0xe6, 0xb2, 0xdc, 0xcf, 0x9d, 0x9c, 0x5b, 0x88, 0x9f, - 0x7b, 0xb0, 0xd6, 0x15, 0xa3, 0x50, 0x74, 0xe4, 0x31, 0xae, 0xad, 0x48, 0x68, 0x91, 0x84, 0x3e, - 0x5a, 0xf8, 0x94, 0x9b, 0x5f, 0x51, 0x3e, 0x5a, 0x20, 0xe3, 0x56, 0x1f, 0xc1, 0x66, 0x27, 0x8a, - 0x78, 0x37, 0x8f, 0x0a, 0xb5, 0x1d, 0x19, 0xd2, 0x6e, 0x97, 0x96, 0x30, 0x19, 0x3a, 0x58, 0xb5, - 0x33, 0x19, 0x4a, 0x4e, 0x61, 0xbd, 0x1b, 0x44, 0x23, 0x3f, 0xee, 0xbc, 0xe2, 0x3f, 0x8a, 0xcb, - 0xda, 0x86, 0xb4, 0xe4, 0x83, 0xab, 0x2c, 0xd9, 0x48, 0xb0, 0x4f, 0xc5, 0xa5, 0x77, 0x39, 0x12, - 0x8f, 0x37, 0x6c, 0xc7, 0xa6, 0xbc, 0x61, 0xba, 0x2d, 0xc3, 0xab, 0x1f, 0xb3, 0xb5, 0x6e, 0xce, - 0x27, 0xf7, 0xa0, 0x12, 0xf4, 0x47, 0xbd, 0xa0, 0x13, 0xc4, 0xb5, 0xad, 0x62, 0x70, 0xcb, 0xc8, - 0xe4, 0x53, 0x20, 0x59, 0x2e, 0x11, 0xaf, 0x63, 0x31, 0x88, 0x70, 0x21, 0xdb, 0xf2, 0x68, 0x6d, - 0xa5, 0x1c, 0x9a, 0x32, 0xc8, 0x0f, 0xb0, 0x95, 0xa7, 0x9e, 0x41, 0x47, 0x44, 0xf1, 0x30, 0xac, - 0xed, 0xca, 0x9d, 0x2b, 0x2f, 0xdb, 0x48, 0xd8, 0x4d, 0x3f, 0xfc, 0x51, 0x84, 0x4c, 0x4b, 0xe5, - 0x52, 0xba, 0x7e, 0x04, 0x95, 0xd4, 0x2d, 0xc8, 0x0e, 0x68, 0x6d, 0xfb, 0xa9, 0xed, 0x3c, 0xb7, - 0xf9, 0x89, 0x61, 0xb5, 0xa9, 0x4b, 0x3d, 0xed, 0x3d, 0xa2, 0xc1, 0xba, 0x47, 0x9b, 0x2d, 0xcb, - 0xf0, 0x28, 0x37, 0x1b, 0xae, 0x36, 0x47, 0x08, 0x54, 0x8d, 0x66, 0x8b, 0xbb, 0x75, 0x66, 0xb6, - 0x3c, 0x49, 0x9b, 0xd7, 0x47, 0xb0, 0x59, 0x32, 0x0a, 0xd9, 0x82, 0x49, 0xb3, 0x68, 0xef, 0x49, - 0x92, 0xd1, 0x2c, 0x90, 0xe6, 0xc8, 0xfb, 0xb0, 0x2d, 0x49, 0x72, 0xc6, 0x9c, 0x31, 0x4f, 0xee, - 0xc0, 0x8d, 0x02, 0xa3, 0x65, 0x30, 0x6a, 0x7b, 0x39, 0x7f, 0x41, 0x6f, 0xaa, 0xd8, 0x2c, 0x93, - 0xda, 0xac, 0xd8, 0xfa, 0x29, 0x2c, 0x61, 0x5e, 0x56, 0xf1, 0x74, 0xed, 0xe0, 0xfd, 0x2b, 0xf6, - 0x92, 0x29, 0x94, 0xfe, 0x6b, 0xd8, 0x6a, 0x88, 0xa8, 0x23, 0x06, 0x5d, 0x7f, 0x10, 0x7b, 0xfe, - 0xf9, 0x95, 0xe3, 0x6a, 0xb0, 0x10, 0xfb, 0xe7, 0x49, 0x94, 0xc6, 0x3f, 0xf5, 0x33, 0xd8, 0x2c, - 0xf8, 0xd2, 0x95, 0x82, 0xdf, 0xa3, 0xdb, 0xe7, 0x7e, 0x3a, 0xff, 0x2e, 0x7e, 0x5a, 0x94, 0xd0, - 0x9f, 0xc1, 0x4e, 0x23, 0x3b, 0x4f, 0xf5, 0x86, 0x1f, 0xfb, 0xea, 0x3c, 0xed, 0xc0, 0x52, 0xb1, - 0x58, 0x51, 0x1f, 0xe4, 0x03, 0xd8, 0x10, 0x61, 0x38, 0x0c, 0x79, 0x5f, 0x44, 0x91, 0x7f, 0xae, - 0x72, 0xf0, 0x2a, 0x5b, 0x97, 0xc4, 0xa6, 0xa2, 0xe9, 0x7d, 0xa8, 0x36, 0x45, 0x37, 0xf0, 0x9f, - 0x8d, 0x45, 0xa8, 0xca, 0x93, 0x4f, 0x61, 0x33, 0x88, 0xa2, 0x31, 0xba, 0x56, 0xc4, 0x25, 0x56, - 0x0e, 0x9b, 0x79, 0xed, 0x86, 0xe2, 0x1a, 0x11, 0x45, 0x1e, 0x2e, 0x34, 0xbe, 0x1c, 0x89, 0xc4, - 0x1c, 0xf2, 0x6f, 0x52, 0x83, 0x95, 0x33, 0xe1, 0xc7, 0xe3, 0x10, 0x2b, 0x16, 0x24, 0xa7, 0x9f, - 0xfa, 0xdf, 0xc0, 0xba, 0x2b, 0x7a, 0xa2, 0x13, 0x0f, 0x55, 0x4e, 0xfd, 0x10, 0xaa, 0x68, 0xfd, - 0xe0, 0xe5, 0x38, 0x56, 0xd9, 0x2f, 0x29, 0x25, 0x36, 0x32, 0x2a, 0xa6, 0x3e, 0x2c, 0x75, 0x46, - 0x91, 0x18, 0x77, 0x87, 0xbc, 0xd3, 0xf3, 0xa3, 0x34, 0x43, 0xae, 0x29, 0x5a, 0x1d, 0x49, 0x38, - 0x52, 0x02, 0x11, 0x3d, 0xd1, 0x17, 0x83, 0x38, 0x99, 0x7a, 0x43, 0x51, 0xa9, 0x22, 0xea, 0x01, - 0x80, 0x11, 0xb3, 0x71, 0x4f, 0x5c, 0x59, 0x8a, 0x3d, 0x01, 0xad, 0x8f, 0x16, 0xe1, 0x3f, 0xa1, - 0x49, 0x78, 0x34, 0x12, 0x1d, 0x99, 0x6c, 0xa7, 0xb7, 0x6a, 0xd2, 0x70, 0xac, 0xda, 0x9f, 0xf8, - 0xd6, 0xff, 0x79, 0x1e, 0x56, 0xea, 0x51, 0x24, 0x27, 0xfa, 0x0d, 0xac, 0xfb, 0x31, 0x0f, 0xc7, - 0x3d, 0xa1, 0x06, 0x54, 0x65, 0xd7, 0xf5, 0x29, 0x97, 0x4c, 0x35, 0x63, 0xe0, 0xe7, 0x5a, 0x7e, - 0x2c, 0xd3, 0x19, 0x62, 0x04, 0xf7, 0xfb, 0xa3, 0x2f, 0xfd, 0x6e, 0x24, 0xd3, 0x65, 0x85, 0xa5, - 0x15, 0xae, 0x30, 0x14, 0x19, 0x03, 0x49, 0x06, 0xfd, 0x51, 0x5c, 0x9e, 0x85, 0xb2, 0xa0, 0x58, - 0x96, 0xe0, 0xad, 0x94, 0xf3, 0x34, 0x65, 0xa8, 0x40, 0x9c, 0x7b, 0xe4, 0x8a, 0x32, 0x6b, 0x81, - 0x44, 0xf6, 0x61, 0x53, 0x15, 0x67, 0x41, 0x7f, 0x34, 0x0c, 0x63, 0x7f, 0x10, 0xcb, 0x40, 0x9c, - 0x79, 0x83, 0xaa, 0xf3, 0xcc, 0x94, 0x49, 0x7e, 0x07, 0x1b, 0x51, 0xb2, 0xc1, 0x6a, 0xa5, 0xab, - 0xd2, 0x74, 0xe5, 0x02, 0xb3, 0xe8, 0x04, 0x6c, 0x3d, 0x2a, 0x7c, 0xe9, 0xff, 0x3d, 0x0f, 0xab, - 0xf5, 0xae, 0x1f, 0xfb, 0x72, 0xed, 0x77, 0xb1, 0xe6, 0x79, 0xcd, 0x5f, 0x5e, 0xc6, 0xb2, 0x58, - 0x9d, 0x7b, 0xb8, 0xf4, 0x78, 0xfe, 0xd3, 0x03, 0x56, 0xe9, 0xfb, 0xaf, 0x0f, 0x91, 0x46, 0x1e, - 0x01, 0xc9, 0x00, 0x72, 0x46, 0x99, 0x2c, 0x94, 0xab, 0x6f, 0xa6, 0x28, 0x1c, 0x0a, 0xb3, 0xc5, - 0x44, 0xe9, 0xd3, 0xc1, 0x49, 0x92, 0xca, 0x2f, 0x2f, 0x7d, 0xe4, 0xd4, 0x58, 0xc3, 0x48, 0xf6, - 0x44, 0x32, 0x03, 0x49, 0x52, 0x47, 0xee, 0x0b, 0xa8, 0x60, 0xde, 0x91, 0x4b, 0x5c, 0x99, 0x59, - 0x96, 0x24, 0x5b, 0xcf, 0x56, 0x3a, 0x89, 0x0f, 0x3c, 0x80, 0xcd, 0x9f, 0x5f, 0x05, 0xb1, 0x88, - 0x46, 0x7e, 0x07, 0x93, 0x76, 0xef, 0x52, 0x99, 0x92, 0x55, 0x73, 0xb2, 0x33, 0xe8, 0x5d, 0x92, - 0xd3, 0x89, 0xa4, 0x5a, 0xd4, 0x63, 0x51, 0xba, 0xcd, 0x07, 0xa5, 0x99, 0x66, 0xc5, 0x84, 0x62, - 0xe6, 0xad, 0xe7, 0x6a, 0xeb, 0xb0, 0x91, 0xd4, 0x31, 0x89, 0x49, 0xd7, 0x54, 0x35, 0xd3, 0x95, - 0x85, 0x8c, 0xb4, 0x95, 0xfe, 0x1f, 0xf3, 0xb0, 0x6a, 0xf4, 0x47, 0x96, 0x7f, 0x39, 0x1c, 0xc7, - 0xc4, 0x82, 0xad, 0x68, 0x3c, 0xc2, 0xed, 0x15, 0x5d, 0xde, 0x93, 0x34, 0x75, 0x6b, 0xa8, 0x4e, - 0x15, 0x53, 0x99, 0xd0, 0xbe, 0xfa, 0x87, 0x69, 0x99, 0xa4, 0x22, 0x44, 0xe4, 0x00, 0xae, 0x75, - 0xc5, 0x59, 0x30, 0x10, 0x98, 0xb2, 0xcf, 0xfc, 0x71, 0x2f, 0xe6, 0x3f, 0x07, 0xdd, 0xf8, 0x55, - 0x72, 0xe7, 0xd9, 0x4e, 0x98, 0x0d, 0xc5, 0x7b, 0x8e, 0x2c, 0x59, 0x63, 0x94, 0x64, 0x5e, 0x89, - 0xe0, 0xfc, 0x55, 0x9c, 0xd4, 0xc0, 0x3b, 0x93, 0x42, 0xc7, 0x92, 0xa7, 0xff, 0xed, 0x1c, 0x2c, - 0x27, 0x4b, 0x58, 0x83, 0x95, 0x24, 0xad, 0x69, 0xef, 0x91, 0x0d, 0x58, 0xb5, 0x1d, 0xcc, 0x22, - 0x96, 0x71, 0xaa, 0xcd, 0x91, 0x55, 0x58, 0x3a, 0x32, 0x5f, 0xd0, 0x86, 0x36, 0x8f, 0x79, 0x4e, - 0xfe, 0xc9, 0x8f, 0xa9, 0xf9, 0xe4, 0xd8, 0xd3, 0x16, 0x48, 0x15, 0x80, 0x51, 0xb7, 0xe5, 0xd8, - 0xae, 0x79, 0x42, 0xb5, 0x45, 0x94, 0xad, 0x3b, 0xb6, 0x67, 0x98, 0x36, 0x65, 0xda, 0x12, 0xa9, - 0xc0, 0xe2, 0x91, 0x69, 0x59, 0xda, 0x32, 0x32, 0x8e, 0x2c, 0xfa, 0x82, 0x9b, 0x1e, 0x6d, 0x6a, - 0x2b, 0x72, 0x50, 0xab, 0x6d, 0x36, 0xb4, 0x0a, 0x72, 0x4c, 0xdb, 0x63, 0xa6, 0xed, 0x9a, 0x75, - 0x6d, 0x55, 0x1f, 0x43, 0x75, 0x32, 0x23, 0x93, 0x6f, 0x61, 0xb9, 0x2f, 0xff, 0x4a, 0x8c, 0x7a, - 0xff, 0x8d, 0x09, 0x7c, 0x3f, 0xc9, 0xe3, 0x89, 0x8c, 0xfe, 0x21, 0x2c, 0x27, 0xe3, 0x4c, 0x2c, - 0xb2, 0x0a, 0x60, 0xb4, 0x3d, 0xc7, 0xad, 0x33, 0xc7, 0xb2, 0xb4, 0x39, 0xfd, 0xbf, 0xe6, 0x60, - 0xbd, 0xfe, 0x2a, 0xe8, 0x75, 0x3d, 0xff, 0x3c, 0x89, 0x47, 0xb5, 0xfc, 0x20, 0x0c, 0xc6, 0x7d, - 0xde, 0x41, 0x2e, 0x8f, 0xfd, 0xf3, 0xfc, 0x94, 0x7d, 0xc1, 0xae, 0x65, 0x18, 0x7b, 0xdc, 0x4f, - 0xe5, 0x23, 0xf2, 0x18, 0x6e, 0x9c, 0x05, 0x61, 0x14, 0xe7, 0x42, 0x32, 0x74, 0x27, 0x97, 0x0e, - 0x15, 0x9b, 0x77, 0x25, 0x22, 0x95, 0xc1, 0x20, 0xae, 0x2e, 0x1f, 0x9f, 0xc1, 0xce, 0x4c, 0x29, - 0x15, 0xac, 0xb7, 0x3a, 0x53, 0x02, 0x87, 0x70, 0x2b, 0xd7, 0xb4, 0x1f, 0x0c, 0xca, 0xda, 0x2e, - 0x66, 0xda, 0xe6, 0x2b, 0x6a, 0x06, 0x83, 0xa2, 0xc2, 0xfa, 0x9f, 0xa0, 0xca, 0xc4, 0x99, 0x08, - 0xc5, 0xa0, 0x23, 0x5a, 0xc3, 0x60, 0x10, 0xe3, 0x39, 0x40, 0x05, 0x64, 0xbc, 0x28, 0x64, 0x80, - 0xb5, 0x58, 0xd9, 0xc7, 0x7e, 0xfb, 0x9d, 0x7c, 0x17, 0x96, 0xc7, 0x83, 0xe0, 0xa7, 0xe4, 0x52, - 0x5e, 0x61, 0xc9, 0x97, 0xfe, 0xf7, 0x8b, 0xb0, 0x91, 0x55, 0x6a, 0x57, 0x26, 0x99, 0x1a, 0xac, - 0x5c, 0x88, 0x30, 0x4a, 0xcb, 0x80, 0x55, 0x96, 0x7e, 0x62, 0x04, 0x4f, 0x4b, 0x5c, 0xac, 0xa8, - 0x13, 0x50, 0x62, 0x9e, 0x9c, 0x73, 0x92, 0xc0, 0x7d, 0xa8, 0x66, 0x05, 0x23, 0x97, 0x89, 0xb8, - 0x22, 0x2b, 0xd7, 0x4f, 0x4a, 0x6e, 0x34, 0xa1, 0x52, 0xfe, 0x25, 0x8b, 0xd7, 0x6a, 0xbd, 0xed, - 0x7a, 0x4e, 0x93, 0x53, 0x8b, 0x36, 0xa9, 0xed, 0xb1, 0x0d, 0x51, 0x64, 0x13, 0x0a, 0x37, 0x0b, - 0x1a, 0xa9, 0x6c, 0xd0, 0x1d, 0x63, 0xe5, 0xea, 0xc7, 0x69, 0x72, 0x49, 0xd3, 0xc1, 0xf5, 0x1c, - 0x69, 0x20, 0xb0, 0x91, 0xe1, 0x48, 0x17, 0xaa, 0x59, 0xd1, 0x3a, 0x96, 0xf5, 0xc8, 0x8a, 0xd4, - 0xf4, 0xab, 0x77, 0xd3, 0xb4, 0x8d, 0x22, 0x49, 0x5f, 0x05, 0x33, 0xf9, 0xe3, 0x25, 0xca, 0x98, - 0xc3, 0xd8, 0x46, 0x3a, 0xa8, 0x04, 0xe8, 0xcf, 0x0b, 0xd6, 0x97, 0xda, 0x4f, 0x9c, 0x0b, 0x02, - 0xa5, 0xb5, 0x6a, 0x73, 0x64, 0x1b, 0x36, 0x13, 0x5a, 0x5a, 0xe5, 0xaa, 0x58, 0x70, 0xec, 0xb8, - 0x1e, 0x77, 0x29, 0x3b, 0x31, 0xeb, 0x54, 0x5b, 0xd0, 0xbf, 0x83, 0xeb, 0x57, 0xea, 0x82, 0x07, - 0x5e, 0x6a, 0xa3, 0xcd, 0x91, 0x75, 0xa8, 0xd0, 0x17, 0xb4, 0xd9, 0xf2, 0x64, 0x4c, 0xa9, 0xc0, - 0x22, 0x96, 0xc0, 0xda, 0x82, 0xfe, 0x07, 0x80, 0xe3, 0xb8, 0xdf, 0x3b, 0x1a, 0x86, 0x7d, 0x3f, - 0xd6, 0x1d, 0x58, 0xac, 0x0f, 0xbb, 0x58, 0x4b, 0xae, 0xa7, 0x15, 0x77, 0xdd, 0x69, 0x50, 0xed, - 0x3d, 0xb2, 0x02, 0x0b, 0x46, 0xb3, 0xa5, 0xcd, 0xa1, 0xe2, 0x46, 0xb3, 0xf5, 0xa5, 0x81, 0xd5, - 0x35, 0x86, 0x11, 0xfc, 0xa0, 0x4d, 0xc3, 0xb4, 0xb4, 0x05, 0x14, 0xa3, 0x2f, 0x5a, 0x94, 0x99, - 0xb8, 0x06, 0xc3, 0xd2, 0x16, 0xf5, 0x7f, 0xdd, 0x80, 0x95, 0xf4, 0x70, 0x7f, 0x0f, 0x6b, 0xaf, - 0xe2, 0x7e, 0x8f, 0x9f, 0xc9, 0xb9, 0x6a, 0xd7, 0x64, 0x5c, 0x29, 0x5f, 0xe9, 0x72, 0x65, 0xf6, - 0x51, 0x13, 0x06, 0xaf, 0x32, 0x42, 0xa9, 0xd3, 0xf1, 0xc1, 0x5b, 0x3a, 0x1d, 0xf7, 0xa7, 0x3a, - 0x1d, 0xd7, 0xa1, 0x92, 0x1e, 0xef, 0xc4, 0xeb, 0x57, 0x62, 0x75, 0xa6, 0xc9, 0x4d, 0x58, 0xcd, - 0x0f, 0x9d, 0xca, 0xd2, 0x95, 0x28, 0x3d, 0x71, 0x1f, 0x83, 0xd6, 0x15, 0x51, 0x27, 0x0c, 0x46, - 0x59, 0x37, 0xa4, 0xf6, 0x40, 0x65, 0xf2, 0x02, 0x5d, 0x42, 0x0f, 0xa1, 0x82, 0xec, 0x2e, 0x0f, - 0xba, 0xb5, 0x7b, 0xd2, 0x8f, 0xca, 0x0b, 0x4c, 0xac, 0xb1, 0x8f, 0xf0, 0xae, 0xd9, 0x7d, 0xbc, - 0x62, 0x3b, 0xb8, 0x9f, 0x1e, 0x5b, 0x19, 0x28, 0x0a, 0xa9, 0x17, 0xcf, 0x8e, 0xcc, 0xe4, 0x37, - 0x65, 0x26, 0xbf, 0xf5, 0x26, 0x8f, 0x2c, 0x9c, 0x8e, 0xa4, 0x5c, 0x9e, 0x75, 0x75, 0xbb, 0x75, - 0xd5, 0xd5, 0xed, 0xcd, 0x3d, 0x9c, 0x5f, 0xc1, 0x6e, 0xa1, 0x35, 0x93, 0xf7, 0x7f, 0x54, 0x98, - 0x5b, 0x2d, 0x04, 0x64, 0xa3, 0xc0, 0x2c, 0xc4, 0xa2, 0xa5, 0x62, 0x2c, 0xc2, 0x9a, 0x58, 0xfd, - 0xc5, 0x7f, 0xf6, 0xc3, 0x41, 0x30, 0x38, 0x97, 0xad, 0x86, 0x0a, 0xdb, 0x50, 0xd4, 0xe7, 0x8a, - 0x88, 0x66, 0xcf, 0x67, 0x1d, 0xf9, 0x21, 0x16, 0xcf, 0xcb, 0x69, 0x01, 0x95, 0xd0, 0x5b, 0x92, - 0x8c, 0xab, 0x2d, 0xf6, 0x8e, 0x92, 0xab, 0xa7, 0x6a, 0xf1, 0x6c, 0x15, 0xda, 0x47, 0x8a, 0x41, - 0x9e, 0xc3, 0xc3, 0x69, 0x38, 0x8f, 0xc6, 0xe7, 0xe7, 0x22, 0x52, 0xc1, 0x24, 0x5b, 0x85, 0xec, - 0x3c, 0xac, 0xb2, 0x0f, 0xa7, 0x06, 0x71, 0x53, 0x74, 0x61, 0xc9, 0xe4, 0x33, 0xd8, 0x2e, 0x94, - 0x48, 0x99, 0x22, 0x1b, 0xd2, 0xec, 0x24, 0x67, 0x65, 0x9a, 0xec, 0xc3, 0x76, 0x37, 0xbb, 0xdd, - 0xc9, 0xe4, 0xd3, 0x0b, 0xa2, 0xb8, 0x76, 0x5b, 0x69, 0xde, 0x9d, 0xba, 0xf8, 0xfd, 0x1a, 0xae, - 0x4f, 0xb6, 0x78, 0x51, 0x24, 0xb5, 0xe2, 0xae, 0x4a, 0x71, 0xc5, 0x4e, 0xaf, 0xe7, 0x9f, 0xa7, - 0xe6, 0xbc, 0x05, 0xab, 0x91, 0x1f, 0x07, 0xd1, 0x59, 0x20, 0xa2, 0xb4, 0x4d, 0x98, 0x11, 0xc8, - 0x0d, 0xa8, 0xa4, 0x63, 0x26, 0x3d, 0xc2, 0xec, 0x1b, 0x79, 0xe2, 0x75, 0xa7, 0x37, 0xee, 0x8a, - 0xa8, 0xb6, 0xa7, 0x78, 0xe9, 0x77, 0xb9, 0x67, 0xb2, 0xf5, 0x4e, 0x3d, 0x13, 0x32, 0xb3, 0x67, - 0xf2, 0x2b, 0xd8, 0x16, 0xaf, 0x55, 0xe7, 0x41, 0x76, 0xae, 0x23, 0x55, 0x8c, 0xea, 0xc5, 0x40, - 0xbe, 0x95, 0x22, 0xf0, 0x9a, 0x1c, 0xc9, 0xb2, 0x34, 0xbb, 0x4f, 0xaf, 0xbc, 0xcb, 0x7d, 0x1a, - 0x83, 0x08, 0xfe, 0x21, 0xed, 0x1c, 0xd5, 0x2a, 0xca, 0x0e, 0x7e, 0x72, 0x61, 0x8f, 0xc8, 0x3e, - 0x2c, 0xa9, 0x02, 0x7c, 0x5d, 0x9e, 0xb9, 0x5a, 0xb9, 0x7a, 0x4e, 0x6f, 0x00, 0x4c, 0xc1, 0xc8, - 0x63, 0x80, 0x42, 0xd6, 0xdf, 0x9e, 0x79, 0xab, 0x28, 0x96, 0x38, 0x6c, 0xb5, 0x93, 0x15, 0x2c, - 0x5f, 0xc1, 0x76, 0x14, 0xbc, 0xec, 0x05, 0x83, 0xf3, 0x88, 0xe7, 0xbe, 0x51, 0xbb, 0x53, 0x5c, - 0x30, 0x49, 0x11, 0x79, 0x35, 0x4d, 0xbe, 0x86, 0x9d, 0xdc, 0x7d, 0x7b, 0x7e, 0x5a, 0xf1, 0xd4, - 0xee, 0x4e, 0x08, 0x66, 0x10, 0xcb, 0x4f, 0x2a, 0x1e, 0x72, 0x0c, 0x5a, 0x98, 0x16, 0x1c, 0x7c, - 0x84, 0x15, 0x47, 0x74, 0x45, 0x5b, 0x6a, 0xb2, 0x2e, 0x61, 0x9b, 0xe1, 0xc4, 0x77, 0x84, 0xa1, - 0x34, 0xbb, 0xd4, 0x80, 0x0a, 0xa5, 0x51, 0x72, 0x99, 0xf9, 0x1a, 0xc0, 0xef, 0x8f, 0x92, 0x9a, - 0x3c, 0xe9, 0x6f, 0xd6, 0xae, 0x2a, 0xc9, 0xd9, 0xaa, 0x9f, 0x95, 0xf4, 0xc7, 0x78, 0xde, 0xc3, - 0x1f, 0x79, 0xee, 0xf5, 0x51, 0xed, 0xa3, 0x77, 0xe9, 0x1e, 0x6d, 0xa2, 0x58, 0xde, 0x24, 0x89, - 0xf4, 0x23, 0x58, 0x49, 0xc2, 0x2b, 0xa6, 0xab, 0x24, 0xc0, 0x6a, 0xef, 0x91, 0x1a, 0xec, 0x58, - 0xa6, 0xfd, 0x94, 0x1f, 0x39, 0xb6, 0xc7, 0x5d, 0xef, 0xd4, 0xa2, 0xee, 0x31, 0xa5, 0x98, 0x6d, - 0x77, 0x40, 0x93, 0xdf, 0xdc, 0x68, 0xb6, 0xb8, 0xca, 0xbb, 0xda, 0xbc, 0xfe, 0xef, 0x73, 0xb0, - 0xd2, 0x18, 0x76, 0x66, 0x65, 0xaf, 0xb9, 0xff, 0x63, 0xf6, 0x9a, 0x7f, 0x4b, 0xf6, 0x5a, 0x98, - 0xca, 0x5e, 0x13, 0x57, 0xce, 0xc5, 0x77, 0xbe, 0x72, 0x2e, 0xcd, 0xbc, 0x72, 0xea, 0xff, 0xb2, - 0x02, 0xa0, 0xda, 0xc4, 0xff, 0x3f, 0x56, 0x57, 0x74, 0xa8, 0xc5, 0x49, 0x87, 0xfa, 0x0a, 0xdd, - 0x3d, 0x5d, 0x57, 0x10, 0x65, 0xe1, 0x8e, 0x4c, 0x04, 0x86, 0x74, 0x81, 0x66, 0x94, 0x06, 0xbc, - 0x09, 0x83, 0x2d, 0xcd, 0x30, 0xd8, 0x77, 0x70, 0x23, 0x1f, 0x78, 0x24, 0x42, 0x1e, 0x0c, 0x7a, - 0xc1, 0x40, 0xf0, 0x28, 0xbe, 0xec, 0x09, 0x99, 0x6a, 0x54, 0x05, 0xbf, 0x9b, 0x4a, 0xb4, 0x44, - 0x68, 0x4a, 0x88, 0x8b, 0x08, 0x72, 0x00, 0x64, 0x1c, 0xf6, 0x52, 0xc5, 0x06, 0x32, 0x22, 0x76, - 0x65, 0xf9, 0x98, 0x3e, 0x29, 0x69, 0xe3, 0xb0, 0xa7, 0xb4, 0x4a, 0xb8, 0x57, 0x6c, 0x52, 0x65, - 0x76, 0x5f, 0xa0, 0x05, 0xba, 0xaa, 0x6b, 0xfd, 0x5e, 0xaf, 0xd8, 0x4b, 0xe6, 0xc1, 0x40, 0x29, - 0x89, 0x51, 0x47, 0x9e, 0xbf, 0xcc, 0x0e, 0xb7, 0xa5, 0x80, 0xd1, 0xeb, 0x15, 0xba, 0x75, 0xe6, - 0x40, 0xea, 0xeb, 0xf9, 0xe7, 0x78, 0x69, 0x15, 0xaf, 0x47, 0xfe, 0x00, 0x4b, 0xf8, 0x41, 0x77, - 0x18, 0xf2, 0x51, 0x28, 0xce, 0x82, 0xd7, 0x42, 0x85, 0xae, 0x0a, 0xdb, 0x51, 0xdc, 0x13, 0xc9, - 0x6c, 0x25, 0xbc, 0x72, 0x87, 0x70, 0xed, 0x7f, 0xdb, 0x21, 0x24, 0x47, 0x98, 0x03, 0x72, 0xf5, - 0xa3, 0x8b, 0xf3, 0xda, 0xfa, 0x3b, 0xb5, 0xc3, 0x0b, 0x52, 0xee, 0xc5, 0xb9, 0xaa, 0xc4, 0xf2, - 0x71, 0x64, 0xae, 0x54, 0xc9, 0xb5, 0x38, 0xbe, 0xcc, 0x94, 0x9f, 0xc3, 0x4e, 0x19, 0x2a, 0xe7, - 0xad, 0x26, 0xb9, 0x78, 0x12, 0x8e, 0x83, 0x7f, 0x0b, 0xd5, 0xa0, 0xef, 0x9f, 0xcb, 0x37, 0x1d, - 0x55, 0x77, 0x6d, 0xbe, 0xf1, 0x61, 0x67, 0x5d, 0xa2, 0xd3, 0x77, 0xc7, 0xc7, 0xb0, 0x71, 0x36, - 0x1c, 0xc4, 0xb9, 0xb0, 0xf6, 0x46, 0xe1, 0x35, 0x04, 0xa7, 0xb2, 0x33, 0xba, 0x59, 0x5b, 0x6f, - 0xe8, 0x66, 0xe9, 0xff, 0xb9, 0x04, 0xd5, 0x93, 0x74, 0x48, 0x36, 0xee, 0x89, 0x88, 0x7c, 0x02, - 0x8b, 0xc9, 0x2d, 0x79, 0x61, 0xc6, 0xac, 0x69, 0xf2, 0x91, 0x18, 0xf2, 0xd5, 0x44, 0x0a, 0xbc, - 0x3a, 0x6d, 0xca, 0x97, 0xa7, 0x42, 0x6e, 0xa4, 0x70, 0x17, 0x6f, 0xba, 0x19, 0x88, 0x87, 0xe2, - 0x22, 0x90, 0x55, 0x6a, 0x52, 0x2a, 0x74, 0x55, 0x5c, 0x62, 0xb7, 0xfa, 0xc1, 0x20, 0xd7, 0x2f, - 0x01, 0x25, 0x25, 0x49, 0x97, 0x7c, 0x0e, 0x44, 0x3a, 0xfe, 0x59, 0xd0, 0x13, 0xd9, 0x10, 0x85, - 0xe3, 0xa6, 0x21, 0xf7, 0x28, 0xe8, 0x89, 0x54, 0x92, 0x7c, 0x02, 0x5b, 0xb1, 0xe8, 0x8f, 0x7a, - 0x7e, 0x2c, 0xa6, 0xce, 0x4c, 0xca, 0x48, 0xcf, 0xcc, 0x47, 0xb0, 0x29, 0x8f, 0x46, 0xe1, 0x74, - 0xa9, 0x3a, 0x70, 0x43, 0x91, 0x8b, 0x38, 0x59, 0xba, 0xe7, 0xb8, 0xad, 0x04, 0x27, 0xc9, 0x29, - 0xee, 0xfb, 0xb4, 0x5d, 0xad, 0x42, 0x63, 0x54, 0x5b, 0x95, 0xf6, 0xba, 0x51, 0x2e, 0xc6, 0x11, - 0xa3, 0x62, 0x61, 0xd2, 0xca, 0x56, 0x1f, 0x11, 0xb1, 0x60, 0x4b, 0x0d, 0x80, 0xf3, 0x04, 0x67, - 0x58, 0xbc, 0x5c, 0x4a, 0xa7, 0x9d, 0x7e, 0xf6, 0x93, 0x83, 0xb8, 0x39, 0x8c, 0x69, 0xa2, 0x44, - 0x21, 0xad, 0xd9, 0x05, 0xa3, 0x26, 0xc7, 0x2b, 0xbf, 0xb0, 0x4d, 0x3d, 0x1c, 0xcc, 0x2a, 0x29, - 0x1f, 0xc2, 0x42, 0x77, 0xd8, 0x91, 0xd7, 0xb1, 0x69, 0xc7, 0x49, 0xb2, 0x1f, 0x43, 0x08, 0x79, - 0x04, 0x0b, 0x9d, 0x28, 0x92, 0xef, 0x3f, 0xd3, 0x4d, 0xe2, 0x3c, 0x99, 0x30, 0x44, 0x11, 0x73, - 0xc6, 0x51, 0x55, 0xb5, 0xc6, 0x9d, 0x29, 0x2d, 0x27, 0x8e, 0xe2, 0xd4, 0x51, 0xd6, 0xef, 0xc3, - 0x86, 0xb4, 0x4c, 0xdd, 0x8f, 0xc5, 0xf9, 0x30, 0xbc, 0xd4, 0xb7, 0x93, 0x6b, 0x6a, 0xf1, 0x12, - 0xad, 0xff, 0xdb, 0x3d, 0xd8, 0x4c, 0x9c, 0x2e, 0x18, 0x0e, 0xd4, 0x2b, 0xc0, 0x0f, 0x50, 0x89, - 0xc4, 0x85, 0x08, 0xd1, 0xe4, 0xcb, 0x33, 0x9f, 0xce, 0x4a, 0x12, 0xfb, 0x6e, 0x02, 0x4f, 0xef, - 0xf1, 0x99, 0x3c, 0xf9, 0x1a, 0x16, 0x3b, 0xc3, 0xae, 0xba, 0x39, 0x56, 0xa7, 0x9a, 0x9d, 0xe5, - 0x71, 0x64, 0x82, 0x94, 0x02, 0xe4, 0x1a, 0x2c, 0x62, 0xce, 0x90, 0xd7, 0xca, 0xa5, 0xc7, 0x73, - 0x5f, 0x30, 0xf9, 0x49, 0x34, 0x58, 0xe8, 0x0c, 0x7b, 0xf2, 0xb2, 0xb5, 0xc4, 0xf0, 0xcf, 0x89, - 0x1c, 0xb8, 0x34, 0x99, 0x03, 0x77, 0x61, 0x79, 0xe4, 0x87, 0x7e, 0x3f, 0x4a, 0x9a, 0xe1, 0xc9, - 0x17, 0xf9, 0x2d, 0x54, 0x3a, 0x89, 0x55, 0x92, 0x0e, 0xcb, 0xbd, 0x59, 0x3e, 0x95, 0x5a, 0x4e, - 0xa9, 0x95, 0x89, 0x90, 0xc7, 0x70, 0x43, 0xb6, 0x71, 0xb1, 0x60, 0x0b, 0x05, 0x86, 0x17, 0x1e, - 0x8b, 0x28, 0x56, 0x2f, 0xa6, 0xb2, 0x47, 0xbe, 0xca, 0x76, 0x11, 0x61, 0xf4, 0x47, 0x4c, 0xf2, - 0x3d, 0x11, 0xc5, 0xf2, 0x61, 0x4e, 0xff, 0x06, 0x2a, 0xa9, 0xb1, 0x8a, 0x2f, 0x74, 0x2e, 0x3d, - 0xa1, 0xcc, 0xf4, 0x4e, 0xb5, 0xf7, 0x8a, 0xed, 0x87, 0x35, 0x58, 0x79, 0x6e, 0x30, 0xdb, 0xb4, - 0x9f, 0x68, 0x8b, 0xfa, 0xdf, 0xdd, 0xb9, 0xb2, 0xcd, 0x50, 0x83, 0x1d, 0xd3, 0x3e, 0x31, 0x2c, - 0xb3, 0xc1, 0x1b, 0x4e, 0xdd, 0x3b, 0x6d, 0x51, 0x7e, 0xec, 0x35, 0x2d, 0x6d, 0x48, 0xae, 0xc3, - 0xb5, 0xa6, 0x61, 0x37, 0x0c, 0xcf, 0x61, 0xa7, 0xdc, 0x33, 0x9e, 0xf0, 0xa6, 0xe9, 0xba, 0x38, - 0xde, 0x1c, 0xb9, 0x09, 0xef, 0x23, 0x81, 0xd1, 0x67, 0x6d, 0x93, 0xd1, 0x06, 0x3f, 0x3c, 0xcd, - 0x98, 0x35, 0xf2, 0x01, 0xdc, 0x4d, 0x66, 0xe6, 0x57, 0x81, 0x2c, 0xf2, 0x3e, 0x6c, 0x23, 0x93, - 0xbe, 0xa8, 0x5b, 0xed, 0x86, 0x62, 0x7a, 0xc6, 0x13, 0x4d, 0x90, 0x5b, 0x50, 0x4b, 0xa5, 0xe9, - 0x0b, 0x8f, 0xda, 0xae, 0xe9, 0xd8, 0xbc, 0x6d, 0xb7, 0x5d, 0xda, 0xd0, 0x1c, 0x5c, 0xf6, 0x14, - 0xd5, 0x23, 0x0f, 0xe1, 0xfe, 0xb4, 0x4c, 0x83, 0xb6, 0x18, 0xad, 0x1b, 0x1e, 0x6d, 0xf0, 0x13, - 0xca, 0x90, 0xa4, 0xb5, 0x70, 0x74, 0xdb, 0xb1, 0xb9, 0xe5, 0xb9, 0xe9, 0xa3, 0xa5, 0x71, 0xe4, - 0x51, 0x86, 0x04, 0x6d, 0x84, 0xdc, 0x29, 0x4e, 0x02, 0xd7, 0x7e, 0x22, 0xb7, 0xe1, 0xba, 0xe1, - 0x79, 0xac, 0xb0, 0xa0, 0xb6, 0x97, 0xad, 0xe8, 0xb7, 0x84, 0x40, 0xb5, 0x61, 0xba, 0x86, 0x65, - 0x39, 0xcf, 0x69, 0x43, 0x2e, 0x66, 0x9e, 0xdc, 0x80, 0xdd, 0x27, 0xd4, 0xa6, 0xcc, 0xb0, 0x78, - 0x89, 0xf7, 0x4b, 0x34, 0x6f, 0x81, 0x96, 0xcc, 0x89, 0xac, 0x17, 0x64, 0x1b, 0x36, 0x0b, 0x2c, - 0x9c, 0x54, 0x5b, 0x28, 0xe3, 0x55, 0xed, 0x8c, 0xac, 0x67, 0x64, 0x17, 0x48, 0xba, 0x87, 0x52, - 0x43, 0xf9, 0x50, 0xaa, 0x2d, 0xa2, 0x91, 0x1b, 0xed, 0x96, 0x65, 0xa2, 0x15, 0x24, 0xc7, 0x3c, - 0x6c, 0x7b, 0x54, 0xfb, 0x23, 0xb9, 0x07, 0xb7, 0x73, 0xe0, 0xc4, 0x0e, 0x59, 0xc6, 0xa9, 0xd3, - 0xf6, 0xb4, 0x9b, 0xb8, 0xda, 0x64, 0x6d, 0x09, 0x2d, 0x1f, 0xc0, 0xd5, 0x02, 0x5c, 0x99, 0xd9, - 0x6c, 0x59, 0x26, 0x6d, 0xa4, 0xec, 0x44, 0x03, 0x6d, 0x17, 0xcd, 0xe8, 0xb6, 0x68, 0xdd, 0x3c, - 0x9a, 0xc1, 0xbd, 0x81, 0x92, 0xb9, 0x5b, 0x49, 0x2d, 0x52, 0x1b, 0x2e, 0x91, 0x3d, 0xb8, 0x95, - 0xf3, 0x1c, 0x9b, 0x3a, 0x47, 0x93, 0x88, 0x5b, 0x93, 0x08, 0xc3, 0x3e, 0x2d, 0x23, 0x5e, 0x4d, - 0x2e, 0xba, 0x61, 0x36, 0x95, 0x3b, 0x68, 0xdf, 0xa2, 0xa7, 0xe7, 0x8c, 0xb6, 0x6d, 0x3e, 0x6b, - 0x53, 0x69, 0xef, 0x65, 0x1c, 0x74, 0x16, 0x87, 0xa7, 0x07, 0xa8, 0x89, 0x7e, 0xf7, 0x9c, 0x39, - 0xf6, 0x93, 0xf4, 0xf5, 0x19, 0xe5, 0x56, 0x70, 0xaa, 0xfc, 0x4e, 0xc3, 0x3d, 0xc7, 0xe1, 0x96, - 0x63, 0x3f, 0xd1, 0x0e, 0xd0, 0x21, 0x0b, 0x0c, 0xc3, 0x6e, 0x70, 0xd3, 0xb6, 0x4c, 0x9b, 0x26, - 0xdb, 0x96, 0x21, 0xcf, 0x70, 0x57, 0x67, 0xb3, 0xce, 0xa5, 0x89, 0x13, 0x56, 0xe2, 0x1c, 0x29, - 0xef, 0x02, 0x27, 0xc8, 0xcd, 0x50, 0x6f, 0x18, 0x9e, 0x91, 0x5a, 0x80, 0x3b, 0x8c, 0x9b, 0x76, - 0xdd, 0x61, 0x8c, 0xd6, 0x3d, 0x6d, 0x15, 0x8f, 0xaa, 0xe2, 0x9f, 0x98, 0x8e, 0x65, 0x78, 0xd4, - 0xe5, 0x0d, 0x6a, 0x9f, 0x5a, 0xa6, 0xeb, 0x69, 0x77, 0xc8, 0x7d, 0xd8, 0x43, 0xff, 0x7e, 0x7e, - 0x6c, 0x7a, 0xd4, 0x6d, 0x19, 0x75, 0x9a, 0x8c, 0x45, 0xed, 0xba, 0xd3, 0xb6, 0x3d, 0xca, 0x68, - 0x43, 0x63, 0x45, 0xf7, 0xfa, 0xc1, 0x75, 0x6c, 0x85, 0xd1, 0xfe, 0x24, 0xdd, 0x34, 0x3f, 0x64, - 0xd2, 0x17, 0xd7, 0xe4, 0x31, 0xc8, 0x89, 0x68, 0xa7, 0x75, 0xb2, 0x0f, 0x9f, 0xe4, 0xda, 0xb6, - 0x98, 0xd3, 0xa2, 0xcc, 0xcb, 0x82, 0x01, 0x3f, 0x62, 0x4e, 0xb3, 0xe8, 0xb7, 0x55, 0x5c, 0x5d, - 0x3a, 0x61, 0x86, 0x56, 0xae, 0x6a, 0xda, 0x45, 0xe4, 0x26, 0xd9, 0x84, 0xb5, 0x74, 0x98, 0x36, - 0xb3, 0xb4, 0x0f, 0x90, 0x90, 0x8a, 0x22, 0xe1, 0x7e, 0x31, 0xbe, 0xb5, 0x99, 0x85, 0xe3, 0x79, - 0x4e, 0xdd, 0xb1, 0xb4, 0x0f, 0xc9, 0x35, 0xd8, 0x2a, 0x1c, 0xa8, 0x86, 0xd3, 0x34, 0x4c, 0x5b, - 0xfb, 0x0e, 0x0d, 0x56, 0x20, 0x33, 0x6a, 0x19, 0x9e, 0x79, 0x42, 0xe5, 0x68, 0x5f, 0x90, 0x0f, - 0xe1, 0x5e, 0x81, 0x99, 0x29, 0x37, 0xa9, 0x96, 0x86, 0x27, 0xa0, 0xd9, 0xf6, 0xda, 0x86, 0x65, - 0x9d, 0xaa, 0x10, 0xe7, 0xe2, 0x10, 0x08, 0x71, 0xb5, 0x2d, 0xb4, 0x7a, 0xdb, 0xa6, 0x6e, 0xdd, - 0x68, 0xa1, 0x85, 0xb2, 0x5f, 0x54, 0x4c, 0x8c, 0x41, 0x88, 0x0e, 0x77, 0x32, 0x5e, 0xcb, 0x60, - 0x9e, 0x69, 0x58, 0x25, 0xcc, 0x36, 0x7a, 0xcf, 0x94, 0xbc, 0x6d, 0x34, 0xa9, 0xb6, 0x43, 0x1e, - 0xc1, 0x03, 0x74, 0x03, 0xdb, 0x35, 0x5d, 0x0f, 0x3d, 0xb6, 0x6d, 0x9b, 0x9e, 0xcb, 0x8f, 0x1c, - 0xc6, 0x9f, 0x9b, 0x0d, 0xef, 0x58, 0x3a, 0x65, 0xf2, 0xbe, 0x75, 0xad, 0xb4, 0x66, 0x74, 0x7d, - 0xc3, 0xae, 0x53, 0xd7, 0x73, 0x98, 0xf6, 0xbe, 0x5c, 0x4c, 0xb6, 0x7b, 0x96, 0xe1, 0x7a, 0xbc, - 0x7e, 0x6c, 0x5a, 0x6a, 0x6f, 0x4f, 0x27, 0x8f, 0xf3, 0x84, 0xe4, 0x5d, 0x5c, 0xe8, 0x6c, 0x1e, - 0x7f, 0x6e, 0x7a, 0xc7, 0xfc, 0xd8, 0xb4, 0x3d, 0x6d, 0x0f, 0x6d, 0x2a, 0x15, 0x2f, 0x68, 0x70, - 0x78, 0xca, 0x27, 0xa3, 0x8b, 0x76, 0x8f, 0x3c, 0x80, 0x0f, 0x66, 0xc0, 0xca, 0x81, 0x46, 0xd3, - 0x51, 0xdf, 0xec, 0x00, 0x70, 0xbb, 0xdd, 0xcc, 0xd5, 0x75, 0xb5, 0x6f, 0xf0, 0xac, 0xe7, 0xdc, - 0xa6, 0x69, 0x97, 0x11, 0x6d, 0x8c, 0x7c, 0x85, 0x39, 0x32, 0x96, 0x32, 0xec, 0xaf, 0x31, 0xbd, - 0x15, 0xd8, 0x47, 0x26, 0x2b, 0x1a, 0x44, 0x81, 0x1e, 0xcb, 0x88, 0x92, 0x83, 0x9a, 0x86, 0xdd, - 0x3e, 0x32, 0xea, 0x5e, 0x5b, 0x06, 0x59, 0xa7, 0x71, 0xaa, 0xfd, 0x0e, 0xcf, 0x44, 0x2e, 0xd5, - 0x70, 0xa8, 0xcb, 0x65, 0xd7, 0xc4, 0xf0, 0x4c, 0xf7, 0xe8, 0x94, 0x33, 0x7a, 0x44, 0x19, 0xb5, - 0xeb, 0x94, 0xb7, 0x1c, 0xb4, 0xd2, 0x21, 0x5a, 0x29, 0xb7, 0x65, 0x89, 0x9d, 0x45, 0xbf, 0xba, - 0x54, 0x3e, 0x0b, 0x65, 0xe5, 0x51, 0x1a, 0xb8, 0x23, 0x52, 0x4b, 0xc7, 0xe3, 0xd9, 0x6e, 0x3b, - 0xfc, 0xd8, 0x38, 0xa1, 0xdc, 0x35, 0x0f, 0x2d, 0xd3, 0x7e, 0xe2, 0x6a, 0xcf, 0x51, 0x7b, 0x95, - 0xb9, 0x27, 0x67, 0xa9, 0x3b, 0xf6, 0x91, 0x65, 0xd6, 0x3d, 0x8d, 0x92, 0xaf, 0xe1, 0x97, 0xef, - 0xae, 0x3d, 0x47, 0xdd, 0xda, 0x96, 0xc1, 0xb4, 0x23, 0xf4, 0xea, 0x43, 0xc3, 0x55, 0xe1, 0xb5, - 0xd9, 0x76, 0x3d, 0x8e, 0xa1, 0x82, 0x62, 0xf8, 0xb0, 0x2c, 0x3c, 0x63, 0xae, 0x66, 0x93, 0x3b, - 0x70, 0x23, 0x3d, 0xd4, 0x59, 0x6a, 0xca, 0xf2, 0xba, 0xe6, 0xe2, 0x0e, 0x14, 0x63, 0xfe, 0x2c, - 0x90, 0x2f, 0xa3, 0xbd, 0x53, 0x6f, 0x37, 0x65, 0xb4, 0x76, 0x1c, 0x5e, 0x77, 0x9a, 0x2d, 0x8b, - 0xbe, 0xd0, 0x4e, 0xb0, 0x06, 0xca, 0x22, 0x82, 0x77, 0xf4, 0x8d, 0xf6, 0x57, 0x72, 0xb7, 0x52, - 0xac, 0x6b, 0xfe, 0x9e, 0x72, 0xcb, 0x6c, 0x9a, 0x1e, 0x9e, 0x5c, 0x4a, 0x1b, 0xb4, 0xa1, 0xf5, - 0xc8, 0x16, 0x6c, 0x34, 0xe8, 0x09, 0x6f, 0x3a, 0x0d, 0xca, 0x1d, 0xdb, 0x3a, 0xd5, 0xfa, 0x18, - 0x15, 0x55, 0x4c, 0x72, 0xa9, 0xdc, 0x80, 0xa6, 0xfc, 0x35, 0xd2, 0x00, 0xb5, 0xaf, 0xbb, 0x2e, - 0x77, 0x4f, 0x6d, 0xcf, 0x78, 0xc1, 0xf3, 0xbc, 0xcc, 0x59, 0xdb, 0xa2, 0xda, 0x6d, 0xf4, 0xe3, - 0x02, 0xdf, 0xf5, 0x98, 0x71, 0xca, 0x3d, 0x66, 0x98, 0x68, 0x7c, 0x7e, 0x68, 0xd4, 0x9f, 0xba, - 0x96, 0xe1, 0x1e, 0x6b, 0x1f, 0xe1, 0x32, 0x0b, 0x40, 0x19, 0x8e, 0x9b, 0xa6, 0x2d, 0xc3, 0x6a, - 0xdd, 0x69, 0xca, 0x47, 0xab, 0x07, 0x68, 0xcf, 0xab, 0x40, 0xae, 0xc7, 0xd0, 0x27, 0x1e, 0xa2, - 0xa6, 0x05, 0xcc, 0xa1, 0xa1, 0x42, 0xe3, 0xc7, 0xe4, 0x33, 0x78, 0x54, 0xa0, 0x63, 0xb2, 0x35, - 0x6d, 0xdc, 0x0f, 0xac, 0xc8, 0xb8, 0x73, 0xc4, 0x9f, 0xb5, 0x0d, 0x4b, 0x9d, 0x2d, 0xa9, 0xfa, - 0x27, 0xa5, 0xc9, 0xb2, 0xb2, 0x91, 0xd6, 0x2d, 0x83, 0x19, 0x1e, 0xda, 0xfd, 0x11, 0xfa, 0xe9, - 0x04, 0x46, 0xd9, 0x1d, 0x53, 0x71, 0x01, 0xf6, 0x8b, 0x92, 0x15, 0x64, 0xd1, 0x2a, 0x67, 0x77, - 0x69, 0xbb, 0xe1, 0x70, 0x97, 0x5a, 0xb4, 0x8e, 0x31, 0xe4, 0x53, 0x72, 0x17, 0x6e, 0x16, 0x80, - 0xe9, 0x96, 0x67, 0x80, 0xfd, 0x92, 0x99, 0xa4, 0x67, 0x67, 0x6c, 0xee, 0x7a, 0x06, 0xf3, 0xb4, - 0xcf, 0xc8, 0x17, 0xf0, 0xe9, 0x84, 0x99, 0x5a, 0x06, 0x73, 0x29, 0x66, 0xe5, 0x56, 0xdb, 0xe3, - 0x8c, 0x62, 0xe8, 0x77, 0x71, 0xfe, 0x6c, 0xdc, 0xcf, 0x31, 0xb0, 0xcd, 0x98, 0x18, 0x2d, 0xf7, - 0x65, 0x89, 0x57, 0x4c, 0x38, 0xbf, 0x2a, 0xe9, 0x33, 0x33, 0xf7, 0x7c, 0x85, 0x1e, 0x57, 0x00, - 0x4d, 0xa7, 0xa1, 0xef, 0xc9, 0x47, 0xa0, 0xcf, 0x46, 0x4c, 0x64, 0xa4, 0xaf, 0xf1, 0x44, 0xcf, - 0x74, 0x37, 0x8f, 0xe5, 0x8b, 0xf9, 0x4d, 0xc9, 0x8a, 0xe5, 0xe4, 0xaa, 0xfd, 0xbe, 0x34, 0xdd, - 0x54, 0xf6, 0xb5, 0x1d, 0x59, 0x31, 0xf0, 0x92, 0x21, 0x27, 0x3d, 0x84, 0x1f, 0x1b, 0x18, 0x07, - 0x8a, 0x3b, 0xed, 0x6a, 0x7f, 0x41, 0x7e, 0x07, 0xdf, 0xce, 0x5e, 0x49, 0x49, 0x5a, 0x86, 0x83, - 0x43, 0x4c, 0x64, 0xae, 0xd9, 0xa0, 0xfc, 0x29, 0x3d, 0x3d, 0x62, 0x18, 0x4d, 0xff, 0x92, 0x1c, - 0xc0, 0xfe, 0xec, 0x11, 0x52, 0xcc, 0x94, 0xcc, 0x1f, 0x4a, 0x76, 0x69, 0x1a, 0xd6, 0x91, 0xc3, - 0x9a, 0x18, 0x8b, 0x69, 0xc3, 0x34, 0xf8, 0xb3, 0x36, 0x65, 0xa7, 0xda, 0xcb, 0x12, 0xaa, 0x18, - 0xb2, 0x25, 0x0c, 0xaf, 0x43, 0x5a, 0xa7, 0xe4, 0xac, 0x53, 0xa8, 0x23, 0x6a, 0x60, 0x68, 0xd7, - 0xba, 0x57, 0x03, 0x27, 0xf7, 0x23, 0xbc, 0x7a, 0x77, 0x93, 0x03, 0x50, 0xb7, 0x0c, 0xd7, 0xd5, - 0x22, 0xac, 0x84, 0xde, 0x88, 0x4b, 0x5f, 0xaf, 0xe3, 0x37, 0x20, 0x27, 0x2a, 0x28, 0xed, 0x49, - 0xc9, 0x41, 0x0b, 0x48, 0xb3, 0xd9, 0x72, 0x98, 0x67, 0xd8, 0x9e, 0x36, 0x4e, 0x3d, 0x1c, 0x43, - 0xa0, 0x8b, 0xc5, 0x8b, 0x75, 0xca, 0x6d, 0xea, 0x7a, 0xb4, 0xa1, 0xfd, 0x78, 0xf5, 0x76, 0x94, - 0x8a, 0xb5, 0x3c, 0xc9, 0x1f, 0x97, 0xfc, 0x26, 0x03, 0x16, 0x84, 0x11, 0x2d, 0x6b, 0x18, 0x15, - 0x6d, 0x4c, 0xf2, 0x39, 0xfc, 0xe2, 0x2d, 0x22, 0x9e, 0xf3, 0x84, 0x7a, 0xc7, 0x54, 0x95, 0x13, - 0xda, 0x0f, 0x32, 0xa7, 0xce, 0x90, 0x48, 0xf2, 0x83, 0x9b, 0x3a, 0x5c, 0x5d, 0x05, 0xa1, 0xa7, - 0x7a, 0x1f, 0xb4, 0x72, 0x03, 0xe8, 0xcf, 0x6f, 0x3a, 0xec, 0xc1, 0x5a, 0xb1, 0xdf, 0x24, 0x7b, - 0x0f, 0xac, 0x48, 0xd2, 0xff, 0x08, 0x6b, 0x85, 0xa6, 0xd5, 0x9f, 0x3f, 0xd3, 0x2e, 0x2c, 0x27, - 0xaf, 0x06, 0xea, 0xdd, 0x3c, 0xf9, 0xd2, 0xff, 0x00, 0x5b, 0xe9, 0x2f, 0x78, 0x5b, 0xe1, 0x30, - 0xe9, 0xe4, 0x1d, 0xc0, 0x42, 0x24, 0xe2, 0x64, 0x92, 0xb7, 0xff, 0x20, 0x1c, 0xc1, 0xf9, 0xef, - 0xfd, 0xe7, 0x0b, 0xff, 0xcd, 0x44, 0xff, 0xa7, 0x39, 0xd8, 0xce, 0x70, 0x85, 0xdf, 0x3c, 0x7c, - 0x07, 0xab, 0xa3, 0x74, 0x3a, 0x39, 0xcf, 0x74, 0x5b, 0x6c, 0x4a, 0x2d, 0x96, 0x8b, 0x90, 0x16, - 0xec, 0xa8, 0x76, 0x5d, 0x70, 0xc6, 0xc7, 0x83, 0xf4, 0x81, 0xb4, 0x2b, 0x27, 0x9f, 0xee, 0x5d, - 0x95, 0xec, 0xc2, 0x88, 0x94, 0x35, 0xcf, 0xda, 0xb9, 0xa4, 0xfe, 0x8f, 0x8b, 0xa0, 0xe5, 0x38, - 0x26, 0xa2, 0x71, 0x0f, 0xd5, 0x5c, 0x8e, 0x62, 0x3f, 0x1e, 0x47, 0x72, 0xe0, 0xea, 0xc1, 0x47, - 0x57, 0x0e, 0xac, 0x04, 0xf6, 0x5d, 0x89, 0x66, 0x89, 0x14, 0xf9, 0x0a, 0x96, 0xe5, 0x54, 0x69, - 0xc7, 0xf7, 0x6d, 0x8a, 0x25, 0x68, 0xf2, 0x45, 0xf6, 0x4b, 0xcc, 0x42, 0xff, 0x56, 0x35, 0xa1, - 0x64, 0xf3, 0x75, 0xeb, 0xa2, 0xdc, 0xb7, 0xbd, 0xa2, 0x5f, 0xbb, 0xf8, 0x86, 0x7e, 0xed, 0x01, - 0x6c, 0xc7, 0xa1, 0x3f, 0x88, 0xd0, 0x13, 0x44, 0x98, 0xfd, 0x5a, 0x48, 0xb5, 0x78, 0xe7, 0x3e, - 0x67, 0xa4, 0xc0, 0x4d, 0x7f, 0x31, 0xf4, 0x00, 0x36, 0xe3, 0xcb, 0x91, 0xe0, 0x41, 0x57, 0x0c, - 0xe2, 0xe0, 0x2c, 0x10, 0x61, 0x6d, 0x49, 0xb6, 0xba, 0xaa, 0x48, 0x36, 0x33, 0x2a, 0x61, 0xb0, - 0xa3, 0x7e, 0xd0, 0x1f, 0x89, 0x98, 0x67, 0xfb, 0x96, 0xf6, 0xb1, 0xdf, 0xbe, 0xd7, 0xe4, 0xa2, - 0x4c, 0x8a, 0xc8, 0x0b, 0xd8, 0xcd, 0xc7, 0x0c, 0x73, 0x6f, 0x52, 0x0f, 0xc4, 0x6b, 0x07, 0xfa, - 0x15, 0xa3, 0x16, 0x1c, 0x8f, 0xed, 0x5c, 0x4c, 0x13, 0x23, 0xfd, 0x63, 0x58, 0x56, 0x3b, 0x37, - 0xf9, 0x8b, 0x9f, 0x0a, 0x2c, 0xb6, 0x30, 0xa6, 0xce, 0xc9, 0x5f, 0xeb, 0x19, 0xa6, 0xa5, 0xcd, - 0xff, 0x4f, 0x00, 0x00, 0x00, 0xff, 0xff, 0xf8, 0xff, 0x96, 0x92, 0x18, 0x36, 0x00, 0x00, + 0x6e, 0xf2, 0x10, 0x39, 0xb9, 0xc9, 0x7d, 0x4e, 0x5e, 0x20, 0x57, 0x9b, 0x17, 0x49, 0xee, 0x73, + 0x99, 0x47, 0xc8, 0xc9, 0xc9, 0xa9, 0x6e, 0xfc, 0x0d, 0x66, 0x28, 0x29, 0x9b, 0x9b, 0x5c, 0x89, + 0xa8, 0xfa, 0xaa, 0xbb, 0xba, 0xba, 0xba, 0xaa, 0xba, 0x7a, 0x04, 0x9b, 0x17, 0x7e, 0x2f, 0xe8, + 0xfa, 0xf1, 0x30, 0xdc, 0x1f, 0x85, 0xc3, 0x78, 0x48, 0x36, 0xfc, 0xfe, 0x68, 0x3f, 0x23, 0xea, + 0x02, 0x36, 0x8d, 0x38, 0x0e, 0xbd, 0x30, 0x38, 0x3f, 0x17, 0xa1, 0x3b, 0x12, 0x1d, 0x72, 0x1f, + 0xaa, 0xc1, 0x19, 0xbf, 0xf0, 0x7b, 0x63, 0xc1, 0x43, 0x71, 0x2e, 0x5e, 0xd7, 0xe6, 0xf6, 0xe6, + 0x1e, 0xae, 0xb2, 0xf5, 0xe0, 0xec, 0x04, 0x89, 0x0c, 0x69, 0xe4, 0x17, 0x40, 0xfc, 0x5e, 0x34, + 0xe4, 0xa1, 0xf8, 0x69, 0x1c, 0x84, 0x22, 0xe2, 0x7e, 0x1c, 0x87, 0xb5, 0xf9, 0xbd, 0x85, 0x87, + 0xab, 0x4c, 0x43, 0x0e, 0x4b, 0x18, 0x38, 0xbc, 0x7e, 0x09, 0xeb, 0xad, 0x70, 0x38, 0x12, 0x61, + 0x7c, 0x29, 0xe7, 0x20, 0xb0, 0x38, 0xf0, 0xfb, 0x22, 0x19, 0x59, 0xfe, 0x4d, 0x6e, 0xc1, 0x6a, + 0xdf, 0x1f, 0x48, 0xb5, 0x2e, 0x6b, 0xf3, 0x7b, 0x73, 0x0f, 0x2b, 0x2c, 0x27, 0x90, 0x1d, 0x58, + 0x92, 0x2a, 0xd5, 0x16, 0xa4, 0x88, 0xfa, 0x20, 0xf7, 0x60, 0x5d, 0x29, 0xda, 0x1d, 0x8e, 0x5f, + 0xf6, 0x44, 0x6d, 0x71, 0x6f, 0xee, 0xe1, 0x1c, 0x5b, 0x93, 0xb4, 0x86, 0x24, 0xe9, 0x0e, 0x68, + 0xc5, 0xa9, 0xad, 0x20, 0x8a, 0xc9, 0x6f, 0x00, 0x46, 0x8a, 0x16, 0x88, 0xa8, 0x36, 0xb7, 0xb7, + 0xf0, 0x70, 0xed, 0xe0, 0xe6, 0xfe, 0x84, 0x65, 0xf6, 0x8b, 0x42, 0xac, 0x00, 0xd7, 0xff, 0x16, + 0x56, 0xda, 0x61, 0x4f, 0x2e, 0xe3, 0x06, 0x54, 0xa4, 0x55, 0x3b, 0xc3, 0x9e, 0x1c, 0x65, 0x95, + 0x65, 0xdf, 0xe4, 0x11, 0x54, 0xfd, 0x5e, 0x6f, 0xf8, 0x33, 0x0f, 0x45, 0xcf, 0x8f, 0x83, 0x0b, + 0xa1, 0xd6, 0xf4, 0x78, 0x31, 0x0e, 0xc7, 0x82, 0x6d, 0x48, 0x1e, 0x4b, 0x58, 0xe4, 0x23, 0x58, + 0x53, 0x60, 0xd1, 0x1f, 0xc5, 0x97, 0x72, 0x8d, 0x95, 0xc7, 0x4b, 0x67, 0x7e, 0x2f, 0x12, 0x0c, + 0x24, 0x87, 0x22, 0x43, 0xff, 0x09, 0xaa, 0xf5, 0x28, 0x6a, 0x88, 0x4e, 0xcf, 0x0f, 0xfd, 0x38, + 0x18, 0x0e, 0x66, 0x5a, 0xf2, 0x2e, 0x28, 0x0b, 0xf0, 0x8e, 0x1f, 0x89, 0x20, 0xd9, 0x14, 0x90, + 0xa4, 0x3a, 0x52, 0xc8, 0x27, 0xb0, 0x55, 0xd8, 0xdf, 0x04, 0xa6, 0x0c, 0xbb, 0x79, 0x91, 0xed, + 0xb1, 0xc4, 0xea, 0xff, 0xb8, 0x06, 0x15, 0xdc, 0x43, 0xb9, 0xe0, 0xdb, 0x00, 0x62, 0xe0, 0xbf, + 0xec, 0x89, 0x2e, 0x7f, 0x79, 0x59, 0x7b, 0x5f, 0x0e, 0xbc, 0x9a, 0x50, 0x0e, 0x2f, 0x71, 0xe2, + 0x6e, 0x10, 0x65, 0xfc, 0x9a, 0x9a, 0x38, 0x25, 0x1d, 0x5e, 0xce, 0xd4, 0xf6, 0x11, 0x6c, 0xf9, + 0xbd, 0x58, 0x84, 0x03, 0x69, 0x0a, 0x8e, 0xb4, 0x28, 0x77, 0xa4, 0x8c, 0x61, 0x23, 0x7d, 0xd2, + 0x49, 0x16, 0xca, 0x4e, 0xf2, 0x00, 0x36, 0xb3, 0x0f, 0x3e, 0x1c, 0x88, 0xe1, 0x59, 0x6d, 0x5d, + 0xce, 0x54, 0xcd, 0xc8, 0x0e, 0x52, 0x27, 0x81, 0xfe, 0xe0, 0x72, 0x78, 0x56, 0xbb, 0x56, 0x02, + 0x1a, 0x48, 0xcd, 0xdd, 0x6e, 0x51, 0x2a, 0x94, 0xb8, 0x5d, 0xc9, 0xc0, 0x64, 0xca, 0xc0, 0x19, + 0x40, 0x1d, 0xa0, 0x4d, 0x39, 0x36, 0xe4, 0xa6, 0x9d, 0xbd, 0x03, 0x4b, 0x33, 0x77, 0x80, 0xfc, + 0x12, 0x56, 0x15, 0x76, 0x1c, 0xf6, 0x6a, 0xd5, 0xbd, 0xb9, 0x87, 0x6b, 0x07, 0xbb, 0x25, 0x67, + 0x4d, 0x1c, 0x92, 0x55, 0x24, 0xb0, 0x1d, 0xf6, 0xc8, 0x0f, 0xa0, 0x29, 0xa1, 0x82, 0xa3, 0xaf, + 0x49, 0xd9, 0xbb, 0x6f, 0x70, 0x74, 0x3c, 0x1d, 0x89, 0x02, 0xad, 0x4c, 0x8e, 0xe8, 0xb0, 0x91, + 0x9e, 0xb2, 0x0e, 0xef, 0x44, 0x51, 0xed, 0xa6, 0x34, 0x7c, 0x7a, 0xcc, 0x3a, 0xf5, 0x28, 0x22, + 0x1f, 0xa7, 0x0b, 0x42, 0x4c, 0x74, 0x71, 0x2e, 0x71, 0xb7, 0x24, 0xae, 0x9a, 0xe2, 0xdc, 0x8b, + 0x73, 0x84, 0x9a, 0xa0, 0xf9, 0xdd, 0x6e, 0x12, 0x61, 0xe2, 0x21, 0x8f, 0x44, 0x5c, 0xbb, 0xbe, + 0x37, 0xf7, 0xb0, 0x7a, 0xb0, 0x57, 0x52, 0x2d, 0xf5, 0xbb, 0x7d, 0x19, 0x78, 0x5c, 0x11, 0xb3, + 0x0d, 0xbf, 0xdb, 0x95, 0x1f, 0xde, 0xd0, 0x15, 0x31, 0x39, 0x06, 0xa5, 0xac, 0xda, 0x6c, 0x39, + 0xd2, 0x8d, 0x77, 0x1d, 0x49, 0x0a, 0x4a, 0x77, 0xc0, 0x91, 0xbe, 0x81, 0x95, 0x58, 0x05, 0xc1, + 0x9a, 0x26, 0xcd, 0x74, 0x67, 0xc6, 0x08, 0x85, 0x30, 0xc9, 0x52, 0x38, 0xf9, 0x12, 0x76, 0xd1, + 0xc3, 0xf1, 0x90, 0x8a, 0xee, 0x44, 0xdc, 0x5c, 0x96, 0xfb, 0xb9, 0x93, 0x73, 0x0b, 0xf1, 0x73, + 0x0f, 0xd6, 0xba, 0x62, 0x14, 0x8a, 0x8e, 0x3c, 0xc6, 0xb5, 0x15, 0x09, 0x2d, 0x92, 0xd0, 0x47, + 0x0b, 0x9f, 0x72, 0xf3, 0x2b, 0xca, 0x47, 0x0b, 0x64, 0xdc, 0xea, 0x23, 0xd8, 0xec, 0x44, 0x11, + 0xef, 0xe6, 0x51, 0xa1, 0xb6, 0x23, 0x43, 0xda, 0xed, 0xd2, 0x12, 0x26, 0x43, 0x07, 0xab, 0x76, + 0x26, 0x43, 0xc9, 0x29, 0xac, 0x77, 0x83, 0x68, 0xe4, 0xc7, 0x9d, 0x57, 0xfc, 0x47, 0x71, 0x59, + 0xdb, 0x90, 0x96, 0x7c, 0x70, 0x95, 0x25, 0x1b, 0x09, 0xf6, 0xa9, 0xb8, 0xf4, 0x2e, 0x47, 0xe2, + 0xf1, 0x86, 0xed, 0xd8, 0x94, 0x37, 0x4c, 0xb7, 0x65, 0x78, 0xf5, 0x63, 0xb6, 0xd6, 0xcd, 0xf9, + 0xe4, 0x1e, 0x54, 0x82, 0xfe, 0xa8, 0x17, 0x74, 0x82, 0xb8, 0xb6, 0x55, 0x0c, 0x6e, 0x19, 0x99, + 0x7c, 0x0a, 0x24, 0xcb, 0x25, 0xe2, 0x75, 0x2c, 0x06, 0x11, 0x2e, 0x64, 0x5b, 0x1e, 0xad, 0xad, + 0x94, 0x43, 0x53, 0x06, 0xf9, 0x01, 0xb6, 0xf2, 0xd4, 0x33, 0xe8, 0x88, 0x28, 0x1e, 0x86, 0xb5, + 0x5d, 0xb9, 0x73, 0xe5, 0x65, 0x1b, 0x09, 0xbb, 0xe9, 0x87, 0x3f, 0x8a, 0x90, 0x69, 0xa9, 0x5c, + 0x4a, 0xd7, 0x8f, 0xa0, 0x92, 0xba, 0x05, 0xd9, 0x01, 0xad, 0x6d, 0x3f, 0xb5, 0x9d, 0xe7, 0x36, + 0x3f, 0x31, 0xac, 0x36, 0x75, 0xa9, 0xa7, 0xbd, 0x47, 0x34, 0x58, 0xf7, 0x68, 0xb3, 0x65, 0x19, + 0x1e, 0xe5, 0x66, 0xc3, 0xd5, 0xe6, 0x08, 0x81, 0xaa, 0xd1, 0x6c, 0x71, 0xb7, 0xce, 0xcc, 0x96, + 0x27, 0x69, 0xf3, 0xfa, 0x08, 0x36, 0x4b, 0x46, 0x21, 0x5b, 0x30, 0x69, 0x16, 0xed, 0x3d, 0x49, + 0x32, 0x9a, 0x05, 0xd2, 0x1c, 0x79, 0x1f, 0xb6, 0x25, 0x49, 0xce, 0x98, 0x33, 0xe6, 0xc9, 0x1d, + 0xb8, 0x51, 0x60, 0xb4, 0x0c, 0x46, 0x6d, 0x2f, 0xe7, 0x2f, 0xe8, 0x4d, 0x15, 0x9b, 0x65, 0x52, + 0x9b, 0x15, 0x5b, 0x3f, 0x85, 0x25, 0xcc, 0xcb, 0x2a, 0x9e, 0xae, 0x1d, 0xbc, 0x7f, 0xc5, 0x5e, + 0x32, 0x85, 0xd2, 0x7f, 0x0d, 0x5b, 0x0d, 0x11, 0x75, 0xc4, 0xa0, 0xeb, 0x0f, 0x62, 0xcf, 0x3f, + 0xbf, 0x72, 0x5c, 0x0d, 0x16, 0x62, 0xff, 0x3c, 0x89, 0xd2, 0xf8, 0xa7, 0x7e, 0x06, 0x9b, 0x05, + 0x5f, 0xba, 0x52, 0xf0, 0x7b, 0x74, 0xfb, 0xdc, 0x4f, 0xe7, 0xdf, 0xc5, 0x4f, 0x8b, 0x12, 0xfa, + 0x33, 0xd8, 0x69, 0x64, 0xe7, 0xa9, 0xde, 0xf0, 0x63, 0x5f, 0x9d, 0xa7, 0x1d, 0x58, 0x2a, 0x16, + 0x2b, 0xea, 0x83, 0x7c, 0x00, 0x1b, 0x22, 0x0c, 0x87, 0x21, 0xef, 0x8b, 0x28, 0xf2, 0xcf, 0x55, + 0x0e, 0x5e, 0x65, 0xeb, 0x92, 0xd8, 0x54, 0x34, 0xbd, 0x0f, 0xd5, 0xa6, 0xe8, 0x06, 0xfe, 0xb3, + 0xb1, 0x08, 0x55, 0x79, 0xf2, 0x29, 0x6c, 0x06, 0x51, 0x34, 0x46, 0xd7, 0x8a, 0xb8, 0xc4, 0xca, + 0x61, 0x33, 0xaf, 0xdd, 0x50, 0x5c, 0x23, 0xa2, 0xc8, 0xc3, 0x85, 0xc6, 0x97, 0x23, 0x91, 0x98, + 0x43, 0xfe, 0x4d, 0x6a, 0xb0, 0x72, 0x26, 0xfc, 0x78, 0x1c, 0x62, 0xc5, 0x82, 0xe4, 0xf4, 0x53, + 0xff, 0x3b, 0x58, 0x77, 0x45, 0x4f, 0x74, 0xe2, 0xa1, 0xca, 0xa9, 0x1f, 0x42, 0x15, 0xad, 0x1f, + 0xbc, 0x1c, 0xc7, 0x2a, 0xfb, 0x25, 0xa5, 0xc4, 0x46, 0x46, 0xc5, 0xd4, 0x87, 0xa5, 0xce, 0x28, + 0x12, 0xe3, 0xee, 0x90, 0x77, 0x7a, 0x7e, 0x94, 0x66, 0xc8, 0x35, 0x45, 0xab, 0x23, 0x09, 0x47, + 0x4a, 0x20, 0xa2, 0x27, 0xfa, 0x62, 0x10, 0x27, 0x53, 0x6f, 0x28, 0x2a, 0x55, 0x44, 0x3d, 0x00, + 0x30, 0x62, 0x36, 0xee, 0x89, 0x2b, 0x4b, 0xb1, 0x27, 0xa0, 0xf5, 0xd1, 0x22, 0xfc, 0x27, 0x34, + 0x09, 0x8f, 0x46, 0xa2, 0x23, 0x93, 0xed, 0xf4, 0x56, 0x4d, 0x1a, 0x8e, 0x55, 0xfb, 0x13, 0xdf, + 0xfa, 0xbf, 0xcc, 0xc3, 0x4a, 0x3d, 0x8a, 0xe4, 0x44, 0xbf, 0x81, 0x75, 0x3f, 0xe6, 0xe1, 0xb8, + 0x27, 0xd4, 0x80, 0xaa, 0xec, 0xba, 0x3e, 0xe5, 0x92, 0xa9, 0x66, 0x0c, 0xfc, 0x5c, 0xcb, 0x8f, + 0x65, 0x3a, 0x43, 0x8c, 0xe0, 0x7e, 0x7f, 0xf4, 0xa5, 0xdf, 0x8d, 0x64, 0xba, 0xac, 0xb0, 0xb4, + 0xc2, 0x15, 0x86, 0x22, 0x63, 0x20, 0xc9, 0xa0, 0x3f, 0x8a, 0xcb, 0xb3, 0x50, 0x16, 0x14, 0xcb, + 0x12, 0xbc, 0x95, 0x72, 0x9e, 0xa6, 0x0c, 0x15, 0x88, 0x73, 0x8f, 0x5c, 0x51, 0x66, 0x2d, 0x90, + 0xc8, 0x3e, 0x6c, 0xaa, 0xe2, 0x2c, 0xe8, 0x8f, 0x86, 0x61, 0xec, 0x0f, 0x62, 0x19, 0x88, 0x33, + 0x6f, 0x50, 0x75, 0x9e, 0x99, 0x32, 0xc9, 0xef, 0x60, 0x23, 0x4a, 0x36, 0x58, 0xad, 0x74, 0x55, + 0x9a, 0xae, 0x5c, 0x60, 0x16, 0x9d, 0x80, 0xad, 0x47, 0x85, 0x2f, 0xfd, 0xbf, 0xe7, 0x61, 0xb5, + 0xde, 0xf5, 0x63, 0x5f, 0xae, 0xfd, 0x2e, 0xd6, 0x3c, 0xaf, 0xf9, 0xcb, 0xcb, 0x58, 0x16, 0xab, + 0x73, 0x0f, 0x97, 0x1e, 0xcf, 0x7f, 0x7a, 0xc0, 0x2a, 0x7d, 0xff, 0xf5, 0x21, 0xd2, 0xc8, 0x23, + 0x20, 0x19, 0x40, 0xce, 0x28, 0x93, 0x85, 0x72, 0xf5, 0xcd, 0x14, 0x85, 0x43, 0x61, 0xb6, 0x98, + 0x28, 0x7d, 0x3a, 0x38, 0x49, 0x52, 0xf9, 0xe5, 0xa5, 0x8f, 0x9c, 0x1a, 0x6b, 0x18, 0xc9, 0x9e, + 0x48, 0x66, 0x20, 0x49, 0xea, 0xc8, 0x7d, 0x01, 0x15, 0xcc, 0x3b, 0x72, 0x89, 0x2b, 0x33, 0xcb, + 0x92, 0x64, 0xeb, 0xd9, 0x4a, 0x27, 0xf1, 0x81, 0x07, 0xb0, 0xf9, 0xf3, 0xab, 0x20, 0x16, 0xd1, + 0xc8, 0xef, 0x60, 0xd2, 0xee, 0x5d, 0x2a, 0x53, 0xb2, 0x6a, 0x4e, 0x76, 0x06, 0xbd, 0x4b, 0x72, + 0x3a, 0x91, 0x54, 0x8b, 0x7a, 0x2c, 0x4a, 0xb7, 0xf9, 0xa0, 0x34, 0xd3, 0xac, 0x98, 0x50, 0xcc, + 0xbc, 0xf5, 0x5c, 0x6d, 0x1d, 0x36, 0x92, 0x3a, 0x26, 0x31, 0xe9, 0x9a, 0xaa, 0x66, 0xba, 0xb2, + 0x90, 0x91, 0xb6, 0xd2, 0xff, 0x7d, 0x1e, 0x56, 0x8d, 0xfe, 0xc8, 0xf2, 0x2f, 0x87, 0xe3, 0x98, + 0x58, 0xb0, 0x15, 0x8d, 0x47, 0xb8, 0xbd, 0xa2, 0xcb, 0x7b, 0x92, 0xa6, 0x6e, 0x0d, 0xd5, 0xa9, + 0x62, 0x2a, 0x13, 0xda, 0x57, 0xff, 0x30, 0x2d, 0x93, 0x54, 0x84, 0x88, 0x1c, 0xc0, 0xb5, 0xae, + 0x38, 0x0b, 0x06, 0x02, 0x53, 0xf6, 0x99, 0x3f, 0xee, 0xc5, 0xfc, 0xe7, 0xa0, 0x1b, 0xbf, 0x4a, + 0xee, 0x3c, 0xdb, 0x09, 0xb3, 0xa1, 0x78, 0xcf, 0x91, 0x25, 0x6b, 0x8c, 0x92, 0xcc, 0x2b, 0x11, + 0x9c, 0xbf, 0x8a, 0x93, 0x1a, 0x78, 0x67, 0x52, 0xe8, 0x58, 0xf2, 0xf4, 0xbf, 0x9f, 0x83, 0xe5, + 0x64, 0x09, 0x6b, 0xb0, 0x92, 0xa4, 0x35, 0xed, 0x3d, 0xb2, 0x01, 0xab, 0xb6, 0x83, 0x59, 0xc4, + 0x32, 0x4e, 0xb5, 0x39, 0xb2, 0x0a, 0x4b, 0x47, 0xe6, 0x0b, 0xda, 0xd0, 0xe6, 0x31, 0xcf, 0xc9, + 0x3f, 0xf9, 0x31, 0x35, 0x9f, 0x1c, 0x7b, 0xda, 0x02, 0xa9, 0x02, 0x30, 0xea, 0xb6, 0x1c, 0xdb, + 0x35, 0x4f, 0xa8, 0xb6, 0x88, 0xb2, 0x75, 0xc7, 0xf6, 0x0c, 0xd3, 0xa6, 0x4c, 0x5b, 0x22, 0x15, + 0x58, 0x3c, 0x32, 0x2d, 0x4b, 0x5b, 0x46, 0xc6, 0x91, 0x45, 0x5f, 0x70, 0xd3, 0xa3, 0x4d, 0x6d, + 0x45, 0x0e, 0x6a, 0xb5, 0xcd, 0x86, 0x56, 0x41, 0x8e, 0x69, 0x7b, 0xcc, 0xb4, 0x5d, 0xb3, 0xae, + 0xad, 0xea, 0x63, 0xa8, 0x4e, 0x66, 0x64, 0xf2, 0x2d, 0x2c, 0xf7, 0xe5, 0x5f, 0x89, 0x51, 0xef, + 0xbf, 0x31, 0x81, 0xef, 0x27, 0x79, 0x3c, 0x91, 0xd1, 0x3f, 0x84, 0xe5, 0x64, 0x9c, 0x89, 0x45, + 0x56, 0x01, 0x8c, 0xb6, 0xe7, 0xb8, 0x75, 0xe6, 0x58, 0x96, 0x36, 0xa7, 0xff, 0xd7, 0x1c, 0xac, + 0xd7, 0x5f, 0x05, 0xbd, 0xae, 0xe7, 0x9f, 0x27, 0xf1, 0xa8, 0x96, 0x1f, 0x84, 0xc1, 0xb8, 0xcf, + 0x3b, 0xc8, 0xe5, 0xb1, 0x7f, 0x9e, 0x9f, 0xb2, 0x2f, 0xd8, 0xb5, 0x0c, 0x63, 0x8f, 0xfb, 0xa9, + 0x7c, 0x44, 0x1e, 0xc3, 0x8d, 0xb3, 0x20, 0x8c, 0xe2, 0x5c, 0x48, 0x86, 0xee, 0xe4, 0xd2, 0xa1, + 0x62, 0xf3, 0xae, 0x44, 0xa4, 0x32, 0x18, 0xc4, 0xd5, 0xe5, 0xe3, 0x33, 0xd8, 0x99, 0x29, 0xa5, + 0x82, 0xf5, 0x56, 0x67, 0x4a, 0xe0, 0x10, 0x6e, 0xe5, 0x9a, 0xf6, 0x83, 0x41, 0x59, 0xdb, 0xc5, + 0x4c, 0xdb, 0x7c, 0x45, 0xcd, 0x60, 0x50, 0x54, 0x58, 0xff, 0x13, 0x54, 0x99, 0x38, 0x13, 0xa1, + 0x18, 0x74, 0x44, 0x6b, 0x18, 0x0c, 0x62, 0x3c, 0x07, 0xa8, 0x80, 0x8c, 0x17, 0x85, 0x0c, 0xb0, + 0x16, 0x2b, 0xfb, 0xd8, 0x6f, 0xbf, 0x93, 0xef, 0xc2, 0xf2, 0x78, 0x10, 0xfc, 0x94, 0x5c, 0xca, + 0x2b, 0x2c, 0xf9, 0xd2, 0xff, 0x61, 0x11, 0x36, 0xb2, 0x4a, 0xed, 0xca, 0x24, 0x53, 0x83, 0x95, + 0x0b, 0x11, 0x46, 0x69, 0x19, 0xb0, 0xca, 0xd2, 0x4f, 0x8c, 0xe0, 0x69, 0x89, 0x8b, 0x15, 0x75, + 0x02, 0x4a, 0xcc, 0x93, 0x73, 0x4e, 0x12, 0xb8, 0x0f, 0xd5, 0xac, 0x60, 0xe4, 0x32, 0x11, 0x57, + 0x64, 0xe5, 0xfa, 0x49, 0xc9, 0x8d, 0x26, 0x54, 0xca, 0xbf, 0x64, 0xf1, 0x5a, 0xad, 0xb7, 0x5d, + 0xcf, 0x69, 0x72, 0x6a, 0xd1, 0x26, 0xb5, 0x3d, 0xb6, 0x21, 0x8a, 0x6c, 0x42, 0xe1, 0x66, 0x41, + 0x23, 0x95, 0x0d, 0xba, 0x63, 0xac, 0x5c, 0xfd, 0x38, 0x4d, 0x2e, 0x69, 0x3a, 0xb8, 0x9e, 0x23, + 0x0d, 0x04, 0x36, 0x32, 0x1c, 0xe9, 0x42, 0x35, 0x2b, 0x5a, 0xc7, 0xb2, 0x1e, 0x59, 0x91, 0x9a, + 0x7e, 0xf5, 0x6e, 0x9a, 0xb6, 0x51, 0x24, 0xe9, 0xab, 0x60, 0x26, 0x7f, 0xbc, 0x44, 0x19, 0x73, + 0x18, 0xdb, 0x48, 0x07, 0x95, 0x00, 0xfd, 0x79, 0xc1, 0xfa, 0x52, 0xfb, 0x89, 0x73, 0x41, 0xa0, + 0xb4, 0x56, 0x6d, 0x8e, 0x6c, 0xc3, 0x66, 0x42, 0x4b, 0xab, 0x5c, 0x15, 0x0b, 0x8e, 0x1d, 0xd7, + 0xe3, 0x2e, 0x65, 0x27, 0x66, 0x9d, 0x6a, 0x0b, 0xfa, 0x77, 0x70, 0xfd, 0x4a, 0x5d, 0xf0, 0xc0, + 0x4b, 0x6d, 0xb4, 0x39, 0xb2, 0x0e, 0x15, 0xfa, 0x82, 0x36, 0x5b, 0x9e, 0x8c, 0x29, 0x15, 0x58, + 0xc4, 0x12, 0x58, 0x5b, 0xd0, 0xff, 0x00, 0x70, 0x1c, 0xf7, 0x7b, 0x47, 0xc3, 0xb0, 0xef, 0xc7, + 0xba, 0x03, 0x8b, 0xf5, 0x61, 0x17, 0x6b, 0xc9, 0xf5, 0xb4, 0xe2, 0xae, 0x3b, 0x0d, 0xaa, 0xbd, + 0x47, 0x56, 0x60, 0xc1, 0x68, 0xb6, 0xb4, 0x39, 0x54, 0xdc, 0x68, 0xb6, 0xbe, 0x34, 0xb0, 0xba, + 0xc6, 0x30, 0x82, 0x1f, 0xb4, 0x69, 0x98, 0x96, 0xb6, 0x80, 0x62, 0xf4, 0x45, 0x8b, 0x32, 0x13, + 0xd7, 0x60, 0x58, 0xda, 0xa2, 0xfe, 0xaf, 0x1b, 0xb0, 0x92, 0x1e, 0xee, 0xef, 0x61, 0xed, 0x55, + 0xdc, 0xef, 0xf1, 0x33, 0x39, 0x57, 0xed, 0x9a, 0x8c, 0x2b, 0xe5, 0x2b, 0x5d, 0xae, 0xcc, 0x3e, + 0x6a, 0xc2, 0xe0, 0x55, 0x46, 0x28, 0x75, 0x3a, 0x3e, 0x78, 0x4b, 0xa7, 0xe3, 0xfe, 0x54, 0xa7, + 0xe3, 0x3a, 0x54, 0xd2, 0xe3, 0x9d, 0x78, 0xfd, 0x4a, 0xac, 0xce, 0x34, 0xb9, 0x09, 0xab, 0xf9, + 0xa1, 0x53, 0x59, 0xba, 0x12, 0xa5, 0x27, 0xee, 0x63, 0xd0, 0xba, 0x22, 0xea, 0x84, 0xc1, 0x28, + 0xeb, 0x86, 0xd4, 0x1e, 0xa8, 0x4c, 0x5e, 0xa0, 0x4b, 0xe8, 0x21, 0x54, 0x90, 0xdd, 0xe5, 0x41, + 0xb7, 0x76, 0x4f, 0xfa, 0x51, 0x79, 0x81, 0x89, 0x35, 0xf6, 0x11, 0xde, 0x35, 0xbb, 0x8f, 0x57, + 0x6c, 0x07, 0xf7, 0xd3, 0x63, 0x2b, 0x03, 0x45, 0x21, 0xf5, 0xe2, 0xd9, 0x91, 0x99, 0xfc, 0xa6, + 0xcc, 0xe4, 0xb7, 0xde, 0xe4, 0x91, 0x85, 0xd3, 0x91, 0x94, 0xcb, 0xb3, 0xae, 0x6e, 0xb7, 0xae, + 0xba, 0xba, 0xbd, 0xb9, 0x87, 0xf3, 0x2b, 0xd8, 0x2d, 0xb4, 0x66, 0xf2, 0xfe, 0x8f, 0x0a, 0x73, + 0xab, 0x85, 0x80, 0x6c, 0x14, 0x98, 0x85, 0x58, 0xb4, 0x54, 0x8c, 0x45, 0x58, 0x13, 0xab, 0xbf, + 0xf8, 0xcf, 0x7e, 0x38, 0x08, 0x06, 0xe7, 0xb2, 0xd5, 0x50, 0x61, 0x1b, 0x8a, 0xfa, 0x5c, 0x11, + 0xd1, 0xec, 0xf9, 0xac, 0x23, 0x3f, 0xc4, 0xe2, 0x79, 0x39, 0x2d, 0xa0, 0x12, 0x7a, 0x4b, 0x92, + 0x71, 0xb5, 0xc5, 0xde, 0x51, 0x72, 0xf5, 0x54, 0x2d, 0x9e, 0xad, 0x42, 0xfb, 0x48, 0x31, 0xc8, + 0x73, 0x78, 0x38, 0x0d, 0xe7, 0xd1, 0xf8, 0xfc, 0x5c, 0x44, 0x2a, 0x98, 0x64, 0xab, 0x90, 0x9d, + 0x87, 0x55, 0xf6, 0xe1, 0xd4, 0x20, 0x6e, 0x8a, 0x2e, 0x2c, 0x99, 0x7c, 0x06, 0xdb, 0x85, 0x12, + 0x29, 0x53, 0x64, 0x43, 0x9a, 0x9d, 0xe4, 0xac, 0x4c, 0x93, 0x7d, 0xd8, 0xee, 0x66, 0xb7, 0x3b, + 0x99, 0x7c, 0x7a, 0x41, 0x14, 0xd7, 0x6e, 0x2b, 0xcd, 0xbb, 0x53, 0x17, 0xbf, 0x5f, 0xc3, 0xf5, + 0xc9, 0x16, 0x2f, 0x8a, 0xa4, 0x56, 0xdc, 0x55, 0x29, 0xae, 0xd8, 0xe9, 0xf5, 0xfc, 0xf3, 0xd4, + 0x9c, 0xb7, 0x60, 0x35, 0xf2, 0xe3, 0x20, 0x3a, 0x0b, 0x44, 0x94, 0xb6, 0x09, 0x33, 0x02, 0xb9, + 0x01, 0x95, 0x74, 0xcc, 0xa4, 0x47, 0x98, 0x7d, 0x23, 0x4f, 0xbc, 0xee, 0xf4, 0xc6, 0x5d, 0x11, + 0xd5, 0xf6, 0x14, 0x2f, 0xfd, 0x2e, 0xf7, 0x4c, 0xb6, 0xde, 0xa9, 0x67, 0x42, 0x66, 0xf6, 0x4c, + 0x7e, 0x05, 0xdb, 0xe2, 0xb5, 0xea, 0x3c, 0xc8, 0xce, 0x75, 0xa4, 0x8a, 0x51, 0xbd, 0x18, 0xc8, + 0xb7, 0x52, 0x04, 0x5e, 0x93, 0x23, 0x59, 0x96, 0x66, 0xf7, 0xe9, 0x95, 0x77, 0xb9, 0x4f, 0x63, + 0x10, 0xc1, 0x3f, 0xa4, 0x9d, 0xa3, 0x5a, 0x45, 0xd9, 0xc1, 0x4f, 0x2e, 0xec, 0x11, 0xd9, 0x87, + 0x25, 0x55, 0x80, 0xaf, 0xcb, 0x33, 0x57, 0x2b, 0x57, 0xcf, 0xe9, 0x0d, 0x80, 0x29, 0x18, 0x79, + 0x0c, 0x50, 0xc8, 0xfa, 0xdb, 0x33, 0x6f, 0x15, 0xc5, 0x12, 0x87, 0xad, 0x76, 0xb2, 0x82, 0xe5, + 0x2b, 0xd8, 0x8e, 0x82, 0x97, 0xbd, 0x60, 0x70, 0x1e, 0xf1, 0xdc, 0x37, 0x6a, 0x77, 0x8a, 0x0b, + 0x26, 0x29, 0x22, 0xaf, 0xa6, 0xc9, 0xd7, 0xb0, 0x93, 0xbb, 0x6f, 0xcf, 0x4f, 0x2b, 0x9e, 0xda, + 0xdd, 0x09, 0xc1, 0x0c, 0x62, 0xf9, 0x49, 0xc5, 0x43, 0x8e, 0x41, 0x0b, 0xd3, 0x82, 0x83, 0x8f, + 0xb0, 0xe2, 0x88, 0xae, 0x68, 0x4b, 0x4d, 0xd6, 0x25, 0x6c, 0x33, 0x9c, 0xf8, 0x8e, 0x30, 0x94, + 0x66, 0x97, 0x1a, 0x50, 0xa1, 0x34, 0x4a, 0x2e, 0x33, 0x5f, 0x03, 0xf8, 0xfd, 0x51, 0x52, 0x93, + 0x27, 0xfd, 0xcd, 0xda, 0x55, 0x25, 0x39, 0x5b, 0xf5, 0xb3, 0x92, 0xfe, 0x18, 0xcf, 0x7b, 0xf8, + 0x23, 0xcf, 0xbd, 0x3e, 0xaa, 0x7d, 0xf4, 0x2e, 0xdd, 0xa3, 0x4d, 0x14, 0xcb, 0x9b, 0x24, 0x91, + 0x7e, 0x04, 0x2b, 0x49, 0x78, 0xc5, 0x74, 0x95, 0x04, 0x58, 0xed, 0x3d, 0x52, 0x83, 0x1d, 0xcb, + 0xb4, 0x9f, 0xf2, 0x23, 0xc7, 0xf6, 0xb8, 0xeb, 0x9d, 0x5a, 0xd4, 0x3d, 0xa6, 0x14, 0xb3, 0xed, + 0x0e, 0x68, 0xf2, 0x9b, 0x1b, 0xcd, 0x16, 0x57, 0x79, 0x57, 0x9b, 0xd7, 0xff, 0x6d, 0x0e, 0x56, + 0x1a, 0xc3, 0xce, 0xac, 0xec, 0x35, 0xf7, 0x7f, 0xcc, 0x5e, 0xf3, 0x6f, 0xc9, 0x5e, 0x0b, 0x53, + 0xd9, 0x6b, 0xe2, 0xca, 0xb9, 0xf8, 0xce, 0x57, 0xce, 0xa5, 0x99, 0x57, 0x4e, 0xfd, 0xcf, 0x2b, + 0x00, 0xaa, 0x4d, 0xfc, 0xff, 0x63, 0x75, 0x45, 0x87, 0x5a, 0x9c, 0x74, 0xa8, 0xaf, 0xd0, 0xdd, + 0xd3, 0x75, 0x05, 0x51, 0x16, 0xee, 0xc8, 0x44, 0x60, 0x48, 0x17, 0x68, 0x46, 0x69, 0xc0, 0x9b, + 0x30, 0xd8, 0xd2, 0x0c, 0x83, 0x7d, 0x07, 0x37, 0xf2, 0x81, 0x47, 0x22, 0xe4, 0xc1, 0xa0, 0x17, + 0x0c, 0x04, 0x8f, 0xe2, 0xcb, 0x9e, 0x90, 0xa9, 0x46, 0x55, 0xf0, 0xbb, 0xa9, 0x44, 0x4b, 0x84, + 0xa6, 0x84, 0xb8, 0x88, 0x20, 0x07, 0x40, 0xc6, 0x61, 0x2f, 0x55, 0x6c, 0x20, 0x23, 0x62, 0x57, + 0x96, 0x8f, 0xe9, 0x93, 0x92, 0x36, 0x0e, 0x7b, 0x4a, 0xab, 0x84, 0x7b, 0xc5, 0x26, 0x55, 0x66, + 0xf7, 0x05, 0x5a, 0xa0, 0xab, 0xba, 0xd6, 0xef, 0xf5, 0x8a, 0xbd, 0x64, 0x1e, 0x0c, 0x94, 0x92, + 0x18, 0x75, 0xe4, 0xf9, 0xcb, 0xec, 0x70, 0x5b, 0x0a, 0x18, 0xbd, 0x5e, 0xa1, 0x5b, 0x67, 0x0e, + 0xa4, 0xbe, 0x9e, 0x7f, 0x8e, 0x97, 0x56, 0xf1, 0x7a, 0xe4, 0x0f, 0xb0, 0x84, 0x1f, 0x74, 0x87, + 0x21, 0x1f, 0x85, 0xe2, 0x2c, 0x78, 0x2d, 0x54, 0xe8, 0xaa, 0xb0, 0x1d, 0xc5, 0x3d, 0x91, 0xcc, + 0x56, 0xc2, 0x2b, 0x77, 0x08, 0xd7, 0xfe, 0xb7, 0x1d, 0x42, 0x72, 0x84, 0x39, 0x20, 0x57, 0x3f, + 0xba, 0x38, 0xaf, 0xad, 0xbf, 0x53, 0x3b, 0xbc, 0x20, 0xe5, 0x5e, 0x9c, 0xab, 0x4a, 0x2c, 0x1f, + 0x47, 0xe6, 0x4a, 0x95, 0x5c, 0x8b, 0xe3, 0xcb, 0x4c, 0xf9, 0x39, 0xec, 0x94, 0xa1, 0x72, 0xde, + 0x6a, 0x92, 0x8b, 0x27, 0xe1, 0x38, 0xf8, 0xb7, 0x50, 0x0d, 0xfa, 0xfe, 0xb9, 0x7c, 0xd3, 0x51, + 0x75, 0xd7, 0xe6, 0x1b, 0x1f, 0x76, 0xd6, 0x25, 0x3a, 0x7d, 0x77, 0x7c, 0x0c, 0x1b, 0x67, 0xc3, + 0x41, 0x9c, 0x0b, 0x6b, 0x6f, 0x14, 0x5e, 0x43, 0x70, 0x2a, 0x3b, 0xa3, 0x9b, 0xb5, 0xf5, 0x86, + 0x6e, 0x96, 0xfe, 0x9f, 0x4b, 0x50, 0x3d, 0x49, 0x87, 0x64, 0xe3, 0x9e, 0x88, 0xc8, 0x27, 0xb0, + 0x98, 0xdc, 0x92, 0x17, 0x66, 0xcc, 0x9a, 0x26, 0x1f, 0x89, 0x21, 0x5f, 0x4d, 0xa4, 0xc0, 0xab, + 0xd3, 0xa6, 0x7c, 0x79, 0x2a, 0xe4, 0x46, 0x0a, 0x77, 0xf1, 0xa6, 0x9b, 0x81, 0x78, 0x28, 0x2e, + 0x02, 0x59, 0xa5, 0x26, 0xa5, 0x42, 0x57, 0xc5, 0x25, 0x76, 0xab, 0x1f, 0x0c, 0x72, 0xfd, 0x12, + 0x50, 0x52, 0x92, 0x74, 0xc9, 0xe7, 0x40, 0xa4, 0xe3, 0x9f, 0x05, 0x3d, 0x91, 0x0d, 0x51, 0x38, + 0x6e, 0x1a, 0x72, 0x8f, 0x82, 0x9e, 0x48, 0x25, 0xc9, 0x27, 0xb0, 0x15, 0x8b, 0xfe, 0xa8, 0xe7, + 0xc7, 0x62, 0xea, 0xcc, 0xa4, 0x8c, 0xf4, 0xcc, 0x7c, 0x04, 0x9b, 0xf2, 0x68, 0x14, 0x4e, 0x97, + 0xaa, 0x03, 0x37, 0x14, 0xb9, 0x88, 0x93, 0xa5, 0x7b, 0x8e, 0xdb, 0x4a, 0x70, 0x92, 0x9c, 0xe2, + 0xbe, 0x4f, 0xdb, 0xd5, 0x2a, 0x34, 0x46, 0xb5, 0x55, 0x69, 0xaf, 0x1b, 0xe5, 0x62, 0x1c, 0x31, + 0x2a, 0x16, 0x26, 0xad, 0x6c, 0xf5, 0x11, 0x11, 0x0b, 0xb6, 0xd4, 0x00, 0x38, 0x4f, 0x70, 0x86, + 0xc5, 0xcb, 0xa5, 0x74, 0xda, 0xe9, 0x67, 0x3f, 0x39, 0x88, 0x9b, 0xc3, 0x98, 0x26, 0x4a, 0x14, + 0xd2, 0x9a, 0x5d, 0x30, 0x6a, 0x72, 0xbc, 0xf2, 0x0b, 0xdb, 0xd4, 0xc3, 0xc1, 0xac, 0x92, 0xf2, + 0x21, 0x2c, 0x74, 0x87, 0x1d, 0x79, 0x1d, 0x9b, 0x76, 0x9c, 0x24, 0xfb, 0x31, 0x84, 0x90, 0x47, + 0xb0, 0xd0, 0x89, 0x22, 0xf9, 0xfe, 0x33, 0xdd, 0x24, 0xce, 0x93, 0x09, 0x43, 0x14, 0x31, 0x67, + 0x1c, 0x55, 0x55, 0x6b, 0xdc, 0x99, 0xd2, 0x72, 0xe2, 0x28, 0x4e, 0x1d, 0x65, 0xfd, 0x3e, 0x6c, + 0x48, 0xcb, 0xd4, 0xfd, 0x58, 0x9c, 0x0f, 0xc3, 0x4b, 0x7d, 0x3b, 0xb9, 0xa6, 0x16, 0x2f, 0xd1, + 0xfa, 0x7f, 0xdc, 0x83, 0xcd, 0xc4, 0xe9, 0x82, 0xe1, 0x40, 0xbd, 0x02, 0xfc, 0x00, 0x95, 0x48, + 0x5c, 0x88, 0x10, 0x4d, 0xbe, 0x3c, 0xf3, 0xe9, 0xac, 0x24, 0xb1, 0xef, 0x26, 0xf0, 0xf4, 0x1e, + 0x9f, 0xc9, 0x93, 0xaf, 0x61, 0xb1, 0x33, 0xec, 0xaa, 0x9b, 0x63, 0x75, 0xaa, 0xd9, 0x59, 0x1e, + 0x47, 0x26, 0x48, 0x29, 0x40, 0xae, 0xc1, 0x22, 0xe6, 0x0c, 0x79, 0xad, 0x5c, 0x7a, 0x3c, 0xf7, + 0x05, 0x93, 0x9f, 0x44, 0x83, 0x85, 0xce, 0xb0, 0x27, 0x2f, 0x5b, 0x4b, 0x0c, 0xff, 0x9c, 0xc8, + 0x81, 0x4b, 0x93, 0x39, 0x70, 0x17, 0x96, 0x47, 0x7e, 0xe8, 0xf7, 0xa3, 0xa4, 0x19, 0x9e, 0x7c, + 0x91, 0xdf, 0x42, 0xa5, 0x93, 0x58, 0x25, 0xe9, 0xb0, 0xdc, 0x9b, 0xe5, 0x53, 0xa9, 0xe5, 0x94, + 0x5a, 0x99, 0x08, 0x79, 0x0c, 0x37, 0x64, 0x1b, 0x17, 0x0b, 0xb6, 0x50, 0x60, 0x78, 0xe1, 0xb1, + 0x88, 0x62, 0xf5, 0x62, 0x2a, 0x7b, 0xe4, 0xab, 0x6c, 0x17, 0x11, 0x46, 0x7f, 0xc4, 0x24, 0xdf, + 0x13, 0x51, 0x2c, 0x1f, 0xe6, 0xf4, 0x6f, 0xa0, 0x92, 0x1a, 0xab, 0xf8, 0x42, 0xe7, 0xd2, 0x13, + 0xca, 0x4c, 0xef, 0x54, 0x7b, 0xaf, 0xd8, 0x7e, 0x58, 0x83, 0x95, 0xe7, 0x06, 0xb3, 0x4d, 0xfb, + 0x89, 0xb6, 0xa8, 0xff, 0xf9, 0xce, 0x95, 0x6d, 0x86, 0x1a, 0xec, 0x98, 0xf6, 0x89, 0x61, 0x99, + 0x0d, 0xde, 0x70, 0xea, 0xde, 0x69, 0x8b, 0xf2, 0x63, 0xaf, 0x69, 0x69, 0x43, 0x72, 0x1d, 0xae, + 0x35, 0x0d, 0xbb, 0x61, 0x78, 0x0e, 0x3b, 0xe5, 0x9e, 0xf1, 0x84, 0x37, 0x4d, 0xd7, 0xc5, 0xf1, + 0xe6, 0xc8, 0x4d, 0x78, 0x1f, 0x09, 0x8c, 0x3e, 0x6b, 0x9b, 0x8c, 0x36, 0xf8, 0xe1, 0x69, 0xc6, + 0xac, 0x91, 0x0f, 0xe0, 0x6e, 0x32, 0x33, 0xbf, 0x0a, 0x64, 0x91, 0xf7, 0x61, 0x1b, 0x99, 0xf4, + 0x45, 0xdd, 0x6a, 0x37, 0x14, 0xd3, 0x33, 0x9e, 0x68, 0x82, 0xdc, 0x82, 0x5a, 0x2a, 0x4d, 0x5f, + 0x78, 0xd4, 0x76, 0x4d, 0xc7, 0xe6, 0x6d, 0xbb, 0xed, 0xd2, 0x86, 0xe6, 0xe0, 0xb2, 0xa7, 0xa8, + 0x1e, 0x79, 0x08, 0xf7, 0xa7, 0x65, 0x1a, 0xb4, 0xc5, 0x68, 0xdd, 0xf0, 0x68, 0x83, 0x9f, 0x50, + 0x86, 0x24, 0xad, 0x85, 0xa3, 0xdb, 0x8e, 0xcd, 0x2d, 0xcf, 0x4d, 0x1f, 0x2d, 0x8d, 0x23, 0x8f, + 0x32, 0x24, 0x68, 0x23, 0xe4, 0x4e, 0x71, 0x12, 0xb8, 0xf6, 0x13, 0xb9, 0x0f, 0x7b, 0xa6, 0x5d, + 0x77, 0x18, 0xa3, 0x75, 0x2f, 0xc5, 0x30, 0x6a, 0x51, 0xc3, 0xa5, 0xd9, 0x0c, 0x3f, 0x93, 0xdb, + 0x70, 0xdd, 0xf0, 0x3c, 0x56, 0x58, 0x76, 0xdb, 0xcb, 0xd6, 0xfd, 0x5b, 0x42, 0xa0, 0xda, 0x30, + 0x5d, 0xc3, 0xb2, 0x9c, 0xe7, 0xb4, 0x21, 0x97, 0x3c, 0x4f, 0x6e, 0xc0, 0xee, 0x13, 0x6a, 0x53, + 0x66, 0x58, 0xbc, 0xc4, 0xfb, 0x25, 0x6e, 0x42, 0x81, 0x96, 0xcc, 0x8a, 0xac, 0x17, 0x64, 0x1b, + 0x36, 0x0b, 0x2c, 0x9c, 0x54, 0x5b, 0x28, 0xe3, 0x55, 0x85, 0x8d, 0xac, 0x67, 0x64, 0x17, 0x48, + 0xba, 0xd3, 0x52, 0x43, 0xf9, 0x9c, 0xaa, 0x2d, 0xe2, 0x56, 0x34, 0xda, 0x2d, 0xcb, 0x44, 0x5b, + 0x49, 0x8e, 0x79, 0xd8, 0xf6, 0xa8, 0xf6, 0x47, 0x72, 0x0f, 0x6e, 0xe7, 0xc0, 0x89, 0x7d, 0xb4, + 0x8c, 0x53, 0xa7, 0xed, 0x69, 0x37, 0x71, 0xb5, 0xc9, 0xda, 0x12, 0x5a, 0x3e, 0x80, 0xab, 0x05, + 0xb8, 0x32, 0xb3, 0xd9, 0xb2, 0x4c, 0xda, 0x48, 0xd9, 0x89, 0x06, 0xda, 0x2e, 0x1a, 0xdb, 0x6d, + 0xd1, 0xba, 0x79, 0x34, 0x83, 0x7b, 0x03, 0x25, 0x73, 0xe7, 0x93, 0x5a, 0xa4, 0x36, 0x5c, 0x22, + 0x7b, 0x70, 0x2b, 0xe7, 0x39, 0x36, 0x75, 0x8e, 0x26, 0x11, 0xb7, 0x26, 0x11, 0x86, 0x7d, 0x5a, + 0x46, 0xbc, 0x9a, 0x5c, 0x74, 0xc3, 0x6c, 0x2a, 0xa7, 0xd1, 0xbe, 0xc5, 0xf3, 0x90, 0x33, 0xda, + 0xb6, 0xf9, 0xac, 0x4d, 0xa5, 0xbd, 0x97, 0x71, 0xd0, 0x59, 0x1c, 0x9e, 0x1e, 0xb3, 0x26, 0x7a, + 0xe7, 0x73, 0xe6, 0xd8, 0x4f, 0xd2, 0x37, 0x6a, 0x94, 0x5b, 0xc1, 0xa9, 0xf2, 0x9b, 0x0f, 0xf7, + 0x1c, 0x87, 0x5b, 0x8e, 0xfd, 0x44, 0x3b, 0x40, 0xb7, 0x2d, 0x30, 0x0c, 0xbb, 0xc1, 0x4d, 0xdb, + 0x32, 0x6d, 0x9a, 0x6c, 0x5b, 0x86, 0x3c, 0xc3, 0x5d, 0x9d, 0xcd, 0x3a, 0x97, 0x26, 0x4e, 0x58, + 0x89, 0x73, 0xa4, 0xbc, 0x0b, 0x9c, 0x20, 0x37, 0x43, 0xbd, 0x61, 0x78, 0x46, 0x6a, 0x01, 0xee, + 0x30, 0x9e, 0x39, 0xb3, 0xb6, 0x8a, 0x07, 0x5a, 0xf1, 0x4f, 0x4c, 0xc7, 0x32, 0x3c, 0xea, 0xf2, + 0x06, 0xb5, 0x4f, 0x2d, 0xd3, 0xf5, 0xb4, 0x3b, 0xe8, 0xf8, 0x78, 0x0a, 0x9e, 0x1f, 0x9b, 0x1e, + 0x75, 0x5b, 0x46, 0x9d, 0x26, 0x63, 0x51, 0xbb, 0xee, 0xb4, 0x6d, 0x8f, 0x32, 0xda, 0xd0, 0x58, + 0xd1, 0xbd, 0x7e, 0x70, 0x1d, 0x5b, 0x61, 0xb4, 0x3f, 0x49, 0x37, 0xcd, 0x8f, 0xa2, 0xf4, 0xc5, + 0x35, 0x79, 0x0c, 0x72, 0x22, 0xda, 0x69, 0x9d, 0xec, 0xc3, 0x27, 0xb9, 0xb6, 0x2d, 0xe6, 0xb4, + 0x28, 0xf3, 0xb2, 0x90, 0xc1, 0x8f, 0x98, 0xd3, 0x2c, 0xfa, 0x6d, 0x15, 0x57, 0x97, 0x4e, 0x98, + 0xa1, 0x95, 0xab, 0x9a, 0x76, 0x11, 0xb9, 0x49, 0x36, 0x61, 0x2d, 0x1d, 0xa6, 0xcd, 0x2c, 0xed, + 0x03, 0x24, 0xa4, 0xa2, 0x48, 0xb8, 0x5f, 0x8c, 0x82, 0x6d, 0x66, 0xe1, 0x78, 0x9e, 0x53, 0x77, + 0x2c, 0xed, 0x43, 0x72, 0x0d, 0xb6, 0x0a, 0x07, 0xaa, 0xe1, 0x34, 0x0d, 0xd3, 0xd6, 0xbe, 0x43, + 0x83, 0x15, 0xc8, 0x8c, 0x5a, 0x86, 0x67, 0x9e, 0x50, 0x39, 0xda, 0x17, 0xe4, 0x43, 0xb8, 0x57, + 0x60, 0x66, 0xca, 0x4d, 0xaa, 0xa5, 0xe1, 0x09, 0x68, 0xb6, 0xbd, 0xb6, 0x61, 0x59, 0xa7, 0x2a, + 0x10, 0xba, 0x38, 0x04, 0x42, 0x5c, 0x6d, 0x0b, 0xad, 0xde, 0xb6, 0xa9, 0x5b, 0x37, 0x5a, 0x68, + 0xa1, 0xec, 0x77, 0x17, 0x13, 0x63, 0x10, 0xa2, 0xc3, 0x9d, 0x8c, 0xd7, 0x32, 0x98, 0x67, 0x1a, + 0x56, 0x09, 0xb3, 0x8d, 0xde, 0x33, 0x25, 0x6f, 0x1b, 0x4d, 0xaa, 0xed, 0x90, 0x47, 0xf0, 0x00, + 0xdd, 0xc0, 0x76, 0x4d, 0xd7, 0x43, 0x8f, 0x6d, 0xdb, 0xa6, 0xe7, 0xf2, 0x23, 0x87, 0xf1, 0xe7, + 0x66, 0xc3, 0x3b, 0x96, 0x4e, 0x99, 0xbc, 0x82, 0x5d, 0x2b, 0xad, 0x19, 0x5d, 0xdf, 0xb0, 0xeb, + 0xd4, 0xf5, 0x1c, 0xa6, 0xbd, 0x2f, 0x17, 0x93, 0xed, 0x9e, 0x65, 0xb8, 0x1e, 0xaf, 0x1f, 0x9b, + 0x96, 0xda, 0xdb, 0xd3, 0xc9, 0xe3, 0x3c, 0x21, 0x79, 0x17, 0x17, 0x3a, 0x9b, 0xc7, 0x9f, 0x9b, + 0xde, 0x31, 0x3f, 0x36, 0x6d, 0x4f, 0xdb, 0x43, 0x9b, 0x4a, 0xc5, 0x0b, 0x1a, 0x1c, 0x9e, 0xf2, + 0xc9, 0xe8, 0xa2, 0xdd, 0x23, 0x0f, 0xe0, 0x83, 0x19, 0xb0, 0x72, 0xa0, 0xd1, 0x74, 0xd4, 0x37, + 0x8f, 0xe6, 0x76, 0xbb, 0x99, 0xab, 0xeb, 0x6a, 0xdf, 0xe0, 0x59, 0xcf, 0xb9, 0x4d, 0xd3, 0x2e, + 0x23, 0xda, 0x18, 0xf9, 0x0a, 0x73, 0x64, 0x2c, 0x65, 0xd8, 0x5f, 0x63, 0x12, 0x2c, 0xb0, 0x8f, + 0x4c, 0x56, 0x34, 0x88, 0x02, 0x3d, 0x96, 0x11, 0x25, 0x07, 0x35, 0x0d, 0xbb, 0x7d, 0x64, 0xd4, + 0xbd, 0xb6, 0x0c, 0xb2, 0x4e, 0xe3, 0x54, 0xfb, 0x1d, 0x9e, 0x89, 0x5c, 0xaa, 0xe1, 0x50, 0x97, + 0xcb, 0xde, 0x8a, 0xe1, 0x99, 0xee, 0xd1, 0x29, 0x67, 0xf4, 0x88, 0x32, 0x6a, 0xd7, 0x29, 0x6f, + 0x39, 0x68, 0xa5, 0x43, 0xb4, 0x52, 0x6e, 0xcb, 0x12, 0x3b, 0x8b, 0x7e, 0x75, 0xa9, 0x7c, 0x16, + 0xca, 0xca, 0xa3, 0x34, 0x70, 0x47, 0xa4, 0x96, 0x8e, 0xc7, 0xb3, 0xdd, 0x76, 0xf8, 0xb1, 0x71, + 0x42, 0xb9, 0x6b, 0x1e, 0x5a, 0xa6, 0xfd, 0xc4, 0xd5, 0x9e, 0xa3, 0xf6, 0x2a, 0xbf, 0x4f, 0xce, + 0x52, 0x77, 0xec, 0x23, 0xcb, 0xac, 0x7b, 0x1a, 0x25, 0x5f, 0xc3, 0x2f, 0xdf, 0x5d, 0x7b, 0x8e, + 0xba, 0xb5, 0x2d, 0x83, 0x69, 0x47, 0xe8, 0xd5, 0x87, 0x98, 0x56, 0x65, 0xd5, 0xd1, 0x76, 0x3d, + 0x8e, 0xa1, 0x82, 0x62, 0xf8, 0xb0, 0x2c, 0x3c, 0x63, 0xae, 0x66, 0x93, 0x3b, 0x70, 0x23, 0x3d, + 0xd4, 0x59, 0x6a, 0xca, 0xb2, 0xbf, 0xe6, 0xe2, 0x0e, 0x14, 0x63, 0xfe, 0x2c, 0x90, 0x2f, 0xa3, + 0xbd, 0x53, 0x6f, 0x37, 0x65, 0xb4, 0x76, 0x1c, 0x5e, 0x77, 0x9a, 0x2d, 0x8b, 0xbe, 0xd0, 0x4e, + 0xb0, 0x52, 0xca, 0x22, 0x82, 0x77, 0xf4, 0x8d, 0xf6, 0x37, 0x72, 0xb7, 0x52, 0xac, 0x6b, 0xfe, + 0x9e, 0x72, 0xcb, 0x6c, 0x9a, 0x1e, 0x9e, 0x5c, 0x4a, 0x1b, 0xb4, 0xa1, 0xf5, 0xc8, 0x16, 0x6c, + 0x34, 0xe8, 0x09, 0x6f, 0x3a, 0x0d, 0xca, 0x1d, 0xdb, 0x3a, 0xd5, 0xfa, 0x18, 0x15, 0x55, 0x4c, + 0x72, 0xa9, 0xdc, 0x80, 0xa6, 0xfc, 0xcd, 0xd2, 0x00, 0xb5, 0xaf, 0xbb, 0x2e, 0x77, 0x4f, 0x6d, + 0xcf, 0x78, 0xc1, 0xf3, 0xbc, 0xcc, 0x59, 0xdb, 0xa2, 0xda, 0x6d, 0xf4, 0xe3, 0x02, 0xdf, 0xf5, + 0x98, 0x71, 0xca, 0x3d, 0x66, 0x98, 0x68, 0x7c, 0x7e, 0x68, 0xd4, 0x9f, 0xba, 0x96, 0xe1, 0x1e, + 0x6b, 0x1f, 0xe1, 0x32, 0x0b, 0x40, 0x19, 0x8e, 0x9b, 0xa6, 0x2d, 0xc3, 0x6a, 0xdd, 0x69, 0xca, + 0xa7, 0xad, 0x07, 0x68, 0xcf, 0xab, 0x40, 0xae, 0xc7, 0xd0, 0x27, 0x1e, 0xa2, 0xa6, 0x05, 0xcc, + 0xa1, 0xa1, 0x42, 0xe3, 0xc7, 0xe4, 0x33, 0x78, 0x54, 0xa0, 0x63, 0xb2, 0x35, 0x6d, 0xdc, 0x0f, + 0xac, 0xdb, 0xb8, 0x73, 0xc4, 0x9f, 0xb5, 0x0d, 0x4b, 0x9d, 0x2d, 0xa9, 0xfa, 0x27, 0xa5, 0xc9, + 0xb2, 0xe2, 0x92, 0xd6, 0x2d, 0x83, 0x19, 0x1e, 0xda, 0xfd, 0x11, 0xfa, 0xe9, 0x04, 0x46, 0xd9, + 0x1d, 0x53, 0x71, 0x01, 0xf6, 0x8b, 0x92, 0x15, 0x64, 0x69, 0x2b, 0x67, 0x77, 0x69, 0xbb, 0xe1, + 0x70, 0x97, 0x5a, 0xb4, 0x8e, 0x31, 0xe4, 0x53, 0x72, 0x17, 0x6e, 0x16, 0x80, 0xe9, 0x96, 0x67, + 0x80, 0xfd, 0x92, 0x99, 0xa4, 0x67, 0x67, 0x6c, 0xee, 0x7a, 0x06, 0xf3, 0xb4, 0xcf, 0xc8, 0x17, + 0xf0, 0xe9, 0x84, 0x99, 0x5a, 0x06, 0x73, 0x29, 0x66, 0xe5, 0x56, 0x1b, 0x4b, 0x3d, 0x0c, 0xfd, + 0x2e, 0xce, 0x9f, 0x8d, 0xfb, 0x39, 0x06, 0xb6, 0x19, 0x13, 0xa3, 0xe5, 0xbe, 0x2c, 0xf1, 0x8a, + 0x09, 0xe7, 0x57, 0x25, 0x7d, 0x66, 0xe6, 0x9e, 0xaf, 0xd0, 0xe3, 0x0a, 0xa0, 0xe9, 0x34, 0xf4, + 0x3d, 0xf9, 0x08, 0xf4, 0xd9, 0x88, 0x89, 0x8c, 0xf4, 0x35, 0x9e, 0xe8, 0x99, 0xee, 0xe6, 0xb1, + 0x7c, 0x31, 0xbf, 0x29, 0x59, 0xb1, 0x9c, 0x5c, 0xb5, 0xdf, 0x97, 0xa6, 0x9b, 0xca, 0xbe, 0xb6, + 0x23, 0x2b, 0x06, 0x5e, 0x32, 0xe4, 0xa4, 0x87, 0xf0, 0x63, 0x03, 0xe3, 0x40, 0x71, 0xa7, 0x5d, + 0xed, 0xaf, 0xc8, 0xef, 0xe0, 0xdb, 0xd9, 0x2b, 0x29, 0x49, 0xcb, 0x70, 0x70, 0x88, 0x89, 0xcc, + 0x35, 0x1b, 0x94, 0x3f, 0xa5, 0xa7, 0x47, 0x0c, 0xa3, 0xe9, 0x5f, 0x93, 0x03, 0xd8, 0x9f, 0x3d, + 0x42, 0x8a, 0x99, 0x92, 0xf9, 0x43, 0xc9, 0x2e, 0x4d, 0xc3, 0x3a, 0x72, 0x58, 0x13, 0x63, 0x31, + 0x6d, 0x98, 0x06, 0x7f, 0xd6, 0xa6, 0xec, 0x54, 0x7b, 0x59, 0x42, 0x15, 0x43, 0xb6, 0x84, 0xe1, + 0xa5, 0x49, 0xeb, 0x94, 0x9c, 0x75, 0x0a, 0x75, 0x44, 0x0d, 0x0c, 0xed, 0x5a, 0xf7, 0x6a, 0xe0, + 0xe4, 0x7e, 0x84, 0x57, 0xef, 0x6e, 0x72, 0x00, 0xea, 0x96, 0xe1, 0xba, 0x5a, 0x84, 0x95, 0xd0, + 0x1b, 0x71, 0xe9, 0x1b, 0x77, 0xfc, 0x06, 0xe4, 0x44, 0x05, 0xa5, 0x3d, 0x29, 0x39, 0x68, 0x01, + 0x69, 0x36, 0x5b, 0x0e, 0xf3, 0x0c, 0xdb, 0xd3, 0xc6, 0xa9, 0x87, 0x63, 0x08, 0x74, 0xb1, 0x78, + 0xb1, 0x4e, 0xb9, 0x4d, 0x5d, 0x8f, 0x36, 0xb4, 0x1f, 0xaf, 0xde, 0x8e, 0x52, 0xb1, 0x96, 0x27, + 0xf9, 0xe3, 0x92, 0xdf, 0x64, 0xc0, 0x82, 0x30, 0xa2, 0x65, 0x0d, 0xa3, 0xa2, 0x8d, 0x49, 0x3e, + 0x87, 0x5f, 0xbc, 0x45, 0xc4, 0x73, 0x9e, 0x50, 0xef, 0x98, 0xaa, 0x72, 0x42, 0xfb, 0x41, 0xe6, + 0xd4, 0x19, 0x12, 0x49, 0x7e, 0x70, 0x53, 0x87, 0xab, 0xab, 0x20, 0xf4, 0x54, 0xef, 0x83, 0x56, + 0x6e, 0x13, 0xfd, 0xe5, 0xad, 0x89, 0x3d, 0x58, 0x2b, 0x76, 0xa5, 0x64, 0x87, 0x82, 0x15, 0x49, + 0xfa, 0x1f, 0x61, 0xad, 0xd0, 0xda, 0xfa, 0xcb, 0x67, 0xda, 0x85, 0xe5, 0xe4, 0x6d, 0x41, 0xbd, + 0xae, 0x27, 0x5f, 0xfa, 0x1f, 0x60, 0x2b, 0xfd, 0x9d, 0x6f, 0x2b, 0x1c, 0x26, 0xfd, 0xbe, 0x03, + 0x58, 0x88, 0x44, 0x9c, 0x4c, 0xf2, 0xf6, 0x9f, 0x8d, 0x23, 0x38, 0xff, 0x5f, 0x01, 0xf3, 0x85, + 0xff, 0x8c, 0xa2, 0xff, 0xf3, 0x1c, 0x6c, 0x67, 0xb8, 0xc2, 0x2f, 0x23, 0xbe, 0x83, 0xd5, 0x51, + 0x3a, 0x9d, 0x9c, 0x67, 0xba, 0x79, 0x36, 0xa5, 0x16, 0xcb, 0x45, 0x48, 0x0b, 0x76, 0x54, 0x53, + 0x2f, 0x38, 0xe3, 0xe3, 0x41, 0xfa, 0x8c, 0xda, 0x95, 0x93, 0x4f, 0x77, 0xb8, 0x4a, 0x76, 0x61, + 0x44, 0xca, 0x9a, 0x67, 0xed, 0x5c, 0x52, 0xff, 0xa7, 0x45, 0xd0, 0x72, 0x1c, 0x13, 0xd1, 0xb8, + 0x87, 0x6a, 0x2e, 0x47, 0xb1, 0x1f, 0x8f, 0x23, 0x39, 0x70, 0xf5, 0xe0, 0xa3, 0x2b, 0x07, 0x56, + 0x02, 0xfb, 0xae, 0x44, 0xb3, 0x44, 0x8a, 0x7c, 0x05, 0xcb, 0x72, 0xaa, 0xb4, 0x2f, 0xfc, 0x36, + 0xc5, 0x12, 0x34, 0xf9, 0x22, 0xfb, 0xbd, 0x66, 0xa1, 0xcb, 0xab, 0x5a, 0x55, 0xb2, 0x45, 0xbb, + 0x75, 0x51, 0xee, 0xee, 0x5e, 0xd1, 0xd5, 0x5d, 0x7c, 0x43, 0x57, 0xf7, 0x00, 0xb6, 0xe3, 0xd0, + 0x1f, 0x44, 0xe8, 0x09, 0x22, 0xcc, 0x7e, 0x53, 0xa4, 0x1a, 0xc1, 0x73, 0x9f, 0x33, 0x52, 0xe0, + 0xa6, 0xbf, 0x2b, 0x7a, 0x00, 0x9b, 0xf1, 0xe5, 0x48, 0xf0, 0xa0, 0x2b, 0x06, 0x71, 0x70, 0x16, + 0x88, 0xb0, 0xb6, 0x24, 0x1b, 0x62, 0x55, 0x24, 0x9b, 0x19, 0x95, 0x30, 0xd8, 0x51, 0x3f, 0xfb, + 0x8f, 0x44, 0xcc, 0xb3, 0x7d, 0x4b, 0xbb, 0xdd, 0x6f, 0xdf, 0x6b, 0x72, 0x51, 0x26, 0x45, 0xe4, + 0x05, 0xec, 0xe6, 0x63, 0x86, 0xb9, 0x37, 0xa9, 0x67, 0xe4, 0xb5, 0x03, 0xfd, 0x8a, 0x51, 0x0b, + 0x8e, 0xc7, 0x76, 0x2e, 0xa6, 0x89, 0x91, 0xfe, 0x31, 0x2c, 0xab, 0x9d, 0x9b, 0xfc, 0x5d, 0x50, + 0x05, 0x16, 0x5b, 0x18, 0x53, 0xe7, 0xe4, 0x6f, 0xfa, 0x0c, 0xd3, 0xd2, 0xe6, 0xff, 0x27, 0x00, + 0x00, 0xff, 0xff, 0x13, 0xa1, 0x26, 0x93, 0x3e, 0x36, 0x00, 0x00, } diff --git a/validator/validator.proto b/validator/validator.proto index d1b46e0fcea3..88e9b464a5d4 100644 --- a/validator/validator.proto +++ b/validator/validator.proto @@ -851,7 +851,7 @@ message ValidationError { // DO NOT REASSIGN the previously used values 2, 3. } optional Severity severity = 6 [default = ERROR]; - // NEXT AVAILABLE TAG: 119 + // NEXT AVAILABLE TAG: 120 enum Code { UNKNOWN_CODE = 0; INVALID_DOCTYPE_HTML = 111; @@ -864,6 +864,7 @@ message ValidationError { WARNING_EXTENSION_DEPRECATED_VERSION = 80; NON_LTS_SCRIPT_AFTER_LTS = 112; LTS_SCRIPT_AFTER_NON_LTS = 113; + INCORRECT_SCRIPT_RELEASE_VERSION = 119; ATTR_REQUIRED_BUT_MISSING = 61; DISALLOWED_TAG = 2; GENERAL_DISALLOWED_TAG = 51; diff --git a/validator/validator_gen_js.py b/validator/validator_gen_js.py index 538726385622..e9b4d618ea5f 100644 --- a/validator/validator_gen_js.py +++ b/validator/validator_gen_js.py @@ -31,10 +31,16 @@ sync. """ +import copy import hashlib import json import os +# If true, then script versions for module and nomdule are allowed +# in AMP documents. This gating should be temporary and removed +# after necessary transformers are in place. See b/173803451. +ALLOW_MODULE_NOMODULE = False + def UnderscoreToCamelCase(under_score): """Helper function which converts under_score names to camelCase. @@ -808,6 +814,63 @@ def GenerateValidatorGeneratedJs(specfile, validator_pb2, generate_proto_only, del rules.tags[:] rules.tags.extend(filtered_rules) + # TODO(b/173803451): allow module/nomodule tagspecs. + # Add module/nomodule tagspecs for AMP ExtensionSpec tagspecs. + if ALLOW_MODULE_NOMODULE: + additional_tagspecs = [] + for t in rules.tags: + if t.extension_spec and t.extension_spec.name: + if validator_pb2.HtmlFormat.Code.Value('AMP') in t.html_format: + tagspec = copy.deepcopy(t) + # Reset html_format to AMP + del tagspec.html_format[:] + tagspec.html_format.extend( + [validator_pb2.HtmlFormat.Code.Value('AMP')]) + # Reset enabled_by to transformed + del tagspec.enabled_by[:] + tagspec.enabled_by.extend(['transformed']) + + # Generate needed attr specs + crossorigin_attrspec = validator_pb2.AttrSpec() + crossorigin_attrspec.name = 'crossorigin' + crossorigin_attrspec.value.extend(['anonymous']) + crossorigin_attrspec.mandatory = True + nomodule_attrspec = validator_pb2.AttrSpec() + nomodule_attrspec.name = 'nomodule' + nomodule_attrspec.value.extend(['']) + nomodule_attrspec.mandatory = True + type_attrspec = validator_pb2.AttrSpec() + type_attrspec.name = 'type' + type_attrspec.value.extend(['module']) + type_attrspec.mandatory = True + type_attrspec.dispatch_key = type_attrspec.NAME_VALUE_DISPATCH + + # Create module and nomodule extension tagspecs with spec_names + module_tagspec = copy.deepcopy(tagspec) + module_tagspec.spec_name = tagspec.extension_spec.name + ( + ' module extension script') + nomodule_tagspec = copy.deepcopy(tagspec) + nomodule_tagspec.spec_name = tagspec.extension_spec.name + ( + ' nomodule extension script') + + # Module extension specifics + # Add requires/satisfies pair for module/nomodule + module_tagspec.requires.extend([nomodule_tagspec.spec_name]) + module_tagspec.satisfies.extend([module_tagspec.spec_name]) + # Add attr specs + module_tagspec.attrs.extend([crossorigin_attrspec, type_attrspec]) + + # Nomodule extension specifics + # Add requires/satisfies pair for module/nomodule + nomodule_tagspec.requires.extend([module_tagspec.spec_name]) + nomodule_tagspec.satisfies.extend([nomodule_tagspec.spec_name]) + # Add attr specs + nomodule_tagspec.attrs.extend([nomodule_attrspec]) + + # Add tag specs + additional_tagspecs.extend([module_tagspec, nomodule_tagspec]) + rules.tags.extend(additional_tagspecs) + registry = MessageRegistry() # Register the tagspecs so they have ids 0 - rules.tags.length. This means