<?xml version="1.0" encoding="UTF-8" ?>
<!-- created at 2025-12-19 11:32:34 -->
<UANodeSet xmlns="http://opcfoundation.org/UA/2011/03/UANodeSet.xsd" xmlns:uax="http://opcfoundation.org/UA/2008/02/Types.xsd">
	<Extensions>
		<atvise Version="3.13"/>
	</Extensions>
	<NamespaceUris>
		<Uri>http://www.atvise.com/atServer/UA/</Uri>
	</NamespaceUris>
	<Aliases>
		<!-- data types -->
		<Alias Alias="Boolean">i=1</Alias>
		<Alias Alias="SByte">i=2</Alias>
		<Alias Alias="Byte">i=3</Alias>
		<Alias Alias="Int16">i=4</Alias>
		<Alias Alias="UInt16">i=5</Alias>
		<Alias Alias="Int32">i=6</Alias>
		<Alias Alias="UInt32">i=7</Alias>
		<Alias Alias="Int64">i=8</Alias>
		<Alias Alias="UInt64">i=9</Alias>
		<Alias Alias="Float">i=10</Alias>
		<Alias Alias="Double">i=11</Alias>
		<Alias Alias="String">i=12</Alias>
		<Alias Alias="DateTime">i=13</Alias>
		<Alias Alias="ByteString">i=15</Alias>
		<Alias Alias="XmlElement">i=16</Alias>
		<Alias Alias="NodeId">i=17</Alias>
		<Alias Alias="LocalizedText">i=21</Alias>
		<!-- references -->
		<Alias Alias="Organizes">i=35</Alias>
		<Alias Alias="HasEventSource">i=36</Alias>
		<Alias Alias="HasModellingRule">i=37</Alias>
		<Alias Alias="HasTypeDefinition">i=40</Alias>
		<Alias Alias="HasSubtype">i=45</Alias>
		<Alias Alias="HasProperty">i=46</Alias>
		<Alias Alias="HasComponent">i=47</Alias>
		<Alias Alias="HasNotifier">i=48</Alias>
		<Alias Alias="HasCondition">i=9006</Alias>
		<Alias Alias="HasHistoricalConfiguration">i=56</Alias>
		<!-- types -->
		<Alias Alias="BaseDataType">i=24</Alias>
		<Alias Alias="BaseObjectType">i=58</Alias>
		<Alias Alias="FolderType">i=61</Alias>
		<Alias Alias="BaseVariableType">i=62</Alias>
		<Alias Alias="BaseDataVariableType">i=63</Alias>
		<Alias Alias="PropertyType">i=68</Alias>
		<Alias Alias="AlarmConditionStateType">ns=1;i=1001</Alias>
		<!-- modelling rules -->
		<Alias Alias="New">i=78</Alias>
		<Alias Alias="Shared">i=79</Alias>
		<Alias Alias="SharedExclusive">i=336</Alias>
		<!-- other -->
		<Alias Alias="Server">i=2253</Alias>
		<Alias Alias="Objects">i=85</Alias>
	</Aliases>
	<UAObject NodeId="ns=1;s=SYSTEM" BrowseName="1:SYSTEM">
		<DisplayName Locale="en">SYSTEM</DisplayName>
		<Description Locale="en">SYSTEM</Description>
		<References>
			<Reference ReferenceType="HasComponent" IsForward="false">Objects</Reference>
			<Reference ReferenceType="HasTypeDefinition">FolderType</Reference>
		</References>
		<Extensions>
			<atvise ExportedNodeId="ns=1;s=SYSTEM.LIBRARY.PROJECT.RESOURCES/QRCodeScanner/alignpat.js" ExportedBrowseName="1:alignpat.js" Upstream="true"/>
		</Extensions>
	</UAObject>
	<UAObject NodeId="ns=1;s=SYSTEM.LIBRARY" BrowseName="1:LIBRARY">
		<DisplayName Locale="en">LIBRARY</DisplayName>
		<Description Locale="en">LIBRARY</Description>
		<References>
			<Reference ReferenceType="HasComponent" IsForward="false">ns=1;s=SYSTEM</Reference>
			<Reference ReferenceType="HasTypeDefinition">FolderType</Reference>
		</References>
		<Extensions>
			<atvise Upstream="true"/>
		</Extensions>
	</UAObject>
	<UAObject NodeId="ns=1;s=SYSTEM.LIBRARY.PROJECT" BrowseName="1:PROJECT">
		<DisplayName Locale="en">PROJECT</DisplayName>
		<Description Locale="en">PROJECT</Description>
		<References>
			<Reference ReferenceType="HasComponent" IsForward="false">ns=1;s=SYSTEM.LIBRARY</Reference>
			<Reference ReferenceType="HasTypeDefinition">FolderType</Reference>
		</References>
		<Extensions>
			<atvise Upstream="true"/>
		</Extensions>
	</UAObject>
	<UAObject NodeId="ns=1;s=SYSTEM.LIBRARY.PROJECT.RESOURCES" BrowseName="1:RESOURCES">
		<DisplayName Locale="en">RESOURCES</DisplayName>
		<Description Locale="en">RESOURCES</Description>
		<References>
			<Reference ReferenceType="HasComponent" IsForward="false">ns=1;s=SYSTEM.LIBRARY.PROJECT</Reference>
			<Reference ReferenceType="HasTypeDefinition">FolderType</Reference>
		</References>
		<Extensions>
			<atvise Upstream="true"/>
		</Extensions>
	</UAObject>
	<UAObject NodeId="ns=1;s=SYSTEM.LIBRARY.PROJECT.RESOURCES/QRCodeScanner" BrowseName="1:QRCodeScanner">
		<DisplayName Locale="en">QRCodeScanner</DisplayName>
		<Description Locale="en">QRCodeScanner</Description>
		<References>
			<Reference ReferenceType="HasComponent" IsForward="false">ns=1;s=SYSTEM.LIBRARY.PROJECT.RESOURCES</Reference>
			<Reference ReferenceType="HasTypeDefinition">FolderType</Reference>
		</References>
		<Extensions>
			<atvise Upstream="true"/>
		</Extensions>
	</UAObject>
	<UAVariable NodeId="ns=1;s=SYSTEM.LIBRARY.PROJECT.RESOURCES/QRCodeScanner/alignpat.js" BrowseName="1:alignpat.js" DataType="ByteString" AccessLevel="103" UserAccessLevel="103" Historizing="true">
		<DisplayName Locale="en">alignpat.js</DisplayName>
		<Description Locale="en">alignpat.js</Description>
		<References>
			<Reference ReferenceType="HasComponent" IsForward="false">ns=1;s=SYSTEM.LIBRARY.PROJECT.RESOURCES/QRCodeScanner</Reference>
			<Reference ReferenceType="HasTypeDefinition">ns=1;s=VariableTypes.ATVISE.Resource.Javascript</Reference>
			<Reference ReferenceType="HasProperty">ns=1;s=VariableTypes.ATVISE.Resource.Javascript.Compress</Reference>
		</References>
		<Value>
			<uax:ByteString>LyoNCiAgUG9ydGVkIHRvIEphdmFTY3JpcHQgYnkgTGF6YXIgTGFzemxvIDIwMTEgDQogIA0KICBsYXphcnNvZnRAZ21haWwuY29tLCB3d3cubGF6YXJzb2Z0LmluZm8NCiAgDQoqLw0KDQovKg0KKg0KKiBDb3B5cmlnaHQgMjAwNyBaWGluZyBhdXRob3JzDQoqDQoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOw0KKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuDQoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KKg0KKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KKg0KKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KKi8NCg0KDQpmdW5jdGlvbiBBbGlnbm1lbnRQYXR0ZXJuKHBvc1gsIHBvc1ksICBlc3RpbWF0ZWRNb2R1bGVTaXplKQ0Kew0KCXRoaXMueD1wb3NYOw0KCXRoaXMueT1wb3NZOw0KCXRoaXMuY291bnQgPSAxOw0KCXRoaXMuZXN0aW1hdGVkTW9kdWxlU2l6ZSA9IGVzdGltYXRlZE1vZHVsZVNpemU7DQoJDQoJdGhpcy5fX2RlZmluZUdldHRlcl9fKCJFc3RpbWF0ZWRNb2R1bGVTaXplIiwgZnVuY3Rpb24oKQ0KCXsNCgkJcmV0dXJuIHRoaXMuZXN0aW1hdGVkTW9kdWxlU2l6ZTsNCgl9KTsgDQoJdGhpcy5fX2RlZmluZUdldHRlcl9fKCJDb3VudCIsIGZ1bmN0aW9uKCkNCgl7DQoJCXJldHVybiB0aGlzLmNvdW50Ow0KCX0pOw0KCXRoaXMuX19kZWZpbmVHZXR0ZXJfXygiWCIsIGZ1bmN0aW9uKCkNCgl7DQoJCXJldHVybiBNYXRoLmZsb29yKHRoaXMueCk7DQoJfSk7DQoJdGhpcy5fX2RlZmluZUdldHRlcl9fKCJZIiwgZnVuY3Rpb24oKQ0KCXsNCgkJcmV0dXJuIE1hdGguZmxvb3IodGhpcy55KTsNCgl9KTsNCgl0aGlzLmluY3JlbWVudENvdW50ID0gZnVuY3Rpb24oKQ0KCXsNCgkJdGhpcy5jb3VudCsrOw0KCX0NCgl0aGlzLmFib3V0RXF1YWxzPWZ1bmN0aW9uKCBtb2R1bGVTaXplLCAgaSwgIGopDQoJCXsNCgkJCWlmIChNYXRoLmFicyhpIC0gdGhpcy55KSA8PSBtb2R1bGVTaXplICYmIE1hdGguYWJzKGogLSB0aGlzLngpIDw9IG1vZHVsZVNpemUpDQoJCQl7DQoJCQkJdmFyIG1vZHVsZVNpemVEaWZmID0gTWF0aC5hYnMobW9kdWxlU2l6ZSAtIHRoaXMuZXN0aW1hdGVkTW9kdWxlU2l6ZSk7DQoJCQkJcmV0dXJuIG1vZHVsZVNpemVEaWZmIDw9IDEuMCB8fCBtb2R1bGVTaXplRGlmZiAvIHRoaXMuZXN0aW1hdGVkTW9kdWxlU2l6ZSA8PSAxLjA7DQoJCQl9DQoJCQlyZXR1cm4gZmFsc2U7DQoJCX0NCgkNCn0NCg0KZnVuY3Rpb24gQWxpZ25tZW50UGF0dGVybkZpbmRlciggaW1hZ2UsICBzdGFydFgsICBzdGFydFksICB3aWR0aCwgIGhlaWdodCwgIG1vZHVsZVNpemUsICByZXN1bHRQb2ludENhbGxiYWNrKQ0Kew0KCXRoaXMuaW1hZ2UgPSBpbWFnZTsNCgl0aGlzLnBvc3NpYmxlQ2VudGVycyA9IG5ldyBBcnJheSgpOw0KCXRoaXMuc3RhcnRYID0gc3RhcnRYOw0KCXRoaXMuc3RhcnRZID0gc3RhcnRZOw0KCXRoaXMud2lkdGggPSB3aWR0aDsNCgl0aGlzLmhlaWdodCA9IGhlaWdodDsNCgl0aGlzLm1vZHVsZVNpemUgPSBtb2R1bGVTaXplOw0KCXRoaXMuY3Jvc3NDaGVja1N0YXRlQ291bnQgPSBuZXcgQXJyYXkoMCwwLDApOw0KCXRoaXMucmVzdWx0UG9pbnRDYWxsYmFjayA9IHJlc3VsdFBvaW50Q2FsbGJhY2s7DQoJDQoJdGhpcy5jZW50ZXJGcm9tRW5kPWZ1bmN0aW9uKHN0YXRlQ291bnQsICBlbmQpDQoJCXsNCgkJCXJldHVybiAgKGVuZCAtIHN0YXRlQ291bnRbMl0pIC0gc3RhdGVDb3VudFsxXSAvIDIuMDsNCgkJfQ0KCXRoaXMuZm91bmRQYXR0ZXJuQ3Jvc3MgPSBmdW5jdGlvbihzdGF0ZUNvdW50KQ0KCQl7DQoJCQl2YXIgbW9kdWxlU2l6ZSA9IHRoaXMubW9kdWxlU2l6ZTsNCgkJCXZhciBtYXhWYXJpYW5jZSA9IG1vZHVsZVNpemUgLyAyLjA7DQoJCQlmb3IgKHZhciBpID0gMDsgaSA8IDM7IGkrKykNCgkJCXsNCgkJCQlpZiAoTWF0aC5hYnMobW9kdWxlU2l6ZSAtIHN0YXRlQ291bnRbaV0pID49IG1heFZhcmlhbmNlKQ0KCQkJCXsNCgkJCQkJcmV0dXJuIGZhbHNlOw0KCQkJCX0NCgkJCX0NCgkJCXJldHVybiB0cnVlOw0KCQl9DQoNCgl0aGlzLmNyb3NzQ2hlY2tWZXJ0aWNhbD1mdW5jdGlvbiggc3RhcnRJLCAgY2VudGVySiwgIG1heENvdW50LCAgb3JpZ2luYWxTdGF0ZUNvdW50VG90YWwpDQoJCXsNCgkJCXZhciBpbWFnZSA9IHRoaXMuaW1hZ2U7DQoJCQkNCgkJCXZhciBtYXhJID0gcXJjb2RlLmhlaWdodDsNCgkJCXZhciBzdGF0ZUNvdW50ID0gdGhpcy5jcm9zc0NoZWNrU3RhdGVDb3VudDsNCgkJCXN0YXRlQ291bnRbMF0gPSAwOw0KCQkJc3RhdGVDb3VudFsxXSA9IDA7DQoJCQlzdGF0ZUNvdW50WzJdID0gMDsNCgkJCQ0KCQkJLy8gU3RhcnQgY291bnRpbmcgdXAgZnJvbSBjZW50ZXINCgkJCXZhciBpID0gc3RhcnRJOw0KCQkJd2hpbGUgKGkgPj0gMCAmJiBpbWFnZVtjZW50ZXJKICsgaSpxcmNvZGUud2lkdGhdICYmIHN0YXRlQ291bnRbMV0gPD0gbWF4Q291bnQpDQoJCQl7DQoJCQkJc3RhdGVDb3VudFsxXSsrOw0KCQkJCWktLTsNCgkJCX0NCgkJCS8vIElmIGFscmVhZHkgdG9vIG1hbnkgbW9kdWxlcyBpbiB0aGlzIHN0YXRlIG9yIHJhbiBvZmYgdGhlIGVkZ2U6DQoJCQlpZiAoaSA8IDAgfHwgc3RhdGVDb3VudFsxXSA+IG1heENvdW50KQ0KCQkJew0KCQkJCXJldHVybiBOYU47DQoJCQl9DQoJCQl3aGlsZSAoaSA+PSAwICYmICFpbWFnZVtjZW50ZXJKICsgaSpxcmNvZGUud2lkdGhdICYmIHN0YXRlQ291bnRbMF0gPD0gbWF4Q291bnQpDQoJCQl7DQoJCQkJc3RhdGVDb3VudFswXSsrOw0KCQkJCWktLTsNCgkJCX0NCgkJCWlmIChzdGF0ZUNvdW50WzBdID4gbWF4Q291bnQpDQoJCQl7DQoJCQkJcmV0dXJuIE5hTjsNCgkJCX0NCgkJCQ0KCQkJLy8gTm93IGFsc28gY291bnQgZG93biBmcm9tIGNlbnRlcg0KCQkJaSA9IHN0YXJ0SSArIDE7DQoJCQl3aGlsZSAoaSA8IG1heEkgJiYgaW1hZ2VbY2VudGVySiArIGkqcXJjb2RlLndpZHRoXSAmJiBzdGF0ZUNvdW50WzFdIDw9IG1heENvdW50KQ0KCQkJew0KCQkJCXN0YXRlQ291bnRbMV0rKzsNCgkJCQlpKys7DQoJCQl9DQoJCQlpZiAoaSA9PSBtYXhJIHx8IHN0YXRlQ291bnRbMV0gPiBtYXhDb3VudCkNCgkJCXsNCgkJCQlyZXR1cm4gTmFOOw0KCQkJfQ0KCQkJd2hpbGUgKGkgPCBtYXhJICYmICFpbWFnZVtjZW50ZXJKICsgaSpxcmNvZGUud2lkdGhdICYmIHN0YXRlQ291bnRbMl0gPD0gbWF4Q291bnQpDQoJCQl7DQoJCQkJc3RhdGVDb3VudFsyXSsrOw0KCQkJCWkrKzsNCgkJCX0NCgkJCWlmIChzdGF0ZUNvdW50WzJdID4gbWF4Q291bnQpDQoJCQl7DQoJCQkJcmV0dXJuIE5hTjsNCgkJCX0NCgkJCQ0KCQkJdmFyIHN0YXRlQ291bnRUb3RhbCA9IHN0YXRlQ291bnRbMF0gKyBzdGF0ZUNvdW50WzFdICsgc3RhdGVDb3VudFsyXTsNCgkJCWlmICg1ICogTWF0aC5hYnMoc3RhdGVDb3VudFRvdGFsIC0gb3JpZ2luYWxTdGF0ZUNvdW50VG90YWwpID49IDIgKiBvcmlnaW5hbFN0YXRlQ291bnRUb3RhbCkNCgkJCXsNCgkJCQlyZXR1cm4gTmFOOw0KCQkJfQ0KCQkJDQoJCQlyZXR1cm4gdGhpcy5mb3VuZFBhdHRlcm5Dcm9zcyhzdGF0ZUNvdW50KT90aGlzLmNlbnRlckZyb21FbmQoc3RhdGVDb3VudCwgaSk6TmFOOw0KCQl9DQoJCQ0KCXRoaXMuaGFuZGxlUG9zc2libGVDZW50ZXI9ZnVuY3Rpb24oIHN0YXRlQ291bnQsICBpLCAgaikNCgkJew0KCQkJdmFyIHN0YXRlQ291bnRUb3RhbCA9IHN0YXRlQ291bnRbMF0gKyBzdGF0ZUNvdW50WzFdICsgc3RhdGVDb3VudFsyXTsNCgkJCXZhciBjZW50ZXJKID0gdGhpcy5jZW50ZXJGcm9tRW5kKHN0YXRlQ291bnQsIGopOw0KCQkJdmFyIGNlbnRlckkgPSB0aGlzLmNyb3NzQ2hlY2tWZXJ0aWNhbChpLCBNYXRoLmZsb29yIChjZW50ZXJKKSwgMiAqIHN0YXRlQ291bnRbMV0sIHN0YXRlQ291bnRUb3RhbCk7DQoJCQlpZiAoIWlzTmFOKGNlbnRlckkpKQ0KCQkJew0KCQkJCXZhciBlc3RpbWF0ZWRNb2R1bGVTaXplID0gKHN0YXRlQ291bnRbMF0gKyBzdGF0ZUNvdW50WzFdICsgc3RhdGVDb3VudFsyXSkgLyAzLjA7DQoJCQkJdmFyIG1heCA9IHRoaXMucG9zc2libGVDZW50ZXJzLmxlbmd0aDsNCgkJCQlmb3IgKHZhciBpbmRleCA9IDA7IGluZGV4IDwgbWF4OyBpbmRleCsrKQ0KCQkJCXsNCgkJCQkJdmFyIGNlbnRlciA9ICB0aGlzLnBvc3NpYmxlQ2VudGVyc1tpbmRleF07DQoJCQkJCS8vIExvb2sgZm9yIGFib3V0IHRoZSBzYW1lIGNlbnRlciBhbmQgbW9kdWxlIHNpemU6DQoJCQkJCWlmIChjZW50ZXIuYWJvdXRFcXVhbHMoZXN0aW1hdGVkTW9kdWxlU2l6ZSwgY2VudGVySSwgY2VudGVySikpDQoJCQkJCXsNCgkJCQkJCXJldHVybiBuZXcgQWxpZ25tZW50UGF0dGVybihjZW50ZXJKLCBjZW50ZXJJLCBlc3RpbWF0ZWRNb2R1bGVTaXplKTsNCgkJCQkJfQ0KCQkJCX0NCgkJCQkvLyBIYWRuJ3QgZm91bmQgdGhpcyBiZWZvcmU7IHNhdmUgaXQNCgkJCQl2YXIgcG9pbnQgPSBuZXcgQWxpZ25tZW50UGF0dGVybihjZW50ZXJKLCBjZW50ZXJJLCBlc3RpbWF0ZWRNb2R1bGVTaXplKTsNCgkJCQl0aGlzLnBvc3NpYmxlQ2VudGVycy5wdXNoKHBvaW50KTsNCgkJCQlpZiAodGhpcy5yZXN1bHRQb2ludENhbGxiYWNrICE9IG51bGwpDQoJCQkJew0KCQkJCQl0aGlzLnJlc3VsdFBvaW50Q2FsbGJhY2suZm91bmRQb3NzaWJsZVJlc3VsdFBvaW50KHBvaW50KTsNCgkJCQl9DQoJCQl9DQoJCQlyZXR1cm4gbnVsbDsNCgkJfQ0KCQkNCgl0aGlzLmZpbmQgPSBmdW5jdGlvbigpDQoJew0KCQkJdmFyIHN0YXJ0WCA9IHRoaXMuc3RhcnRYOw0KCQkJdmFyIGhlaWdodCA9IHRoaXMuaGVpZ2h0Ow0KCQkJdmFyIG1heEogPSBzdGFydFggKyB3aWR0aDsNCgkJCXZhciBtaWRkbGVJID0gc3RhcnRZICsgKGhlaWdodCA+PiAxKTsNCgkJCS8vIFdlIGFyZSBsb29raW5nIGZvciBibGFjay93aGl0ZS9ibGFjayBtb2R1bGVzIGluIDE6MToxIHJhdGlvOw0KCQkJLy8gdGhpcyB0cmFja3MgdGhlIG51bWJlciBvZiBibGFjay93aGl0ZS9ibGFjayBtb2R1bGVzIHNlZW4gc28gZmFyDQoJCQl2YXIgc3RhdGVDb3VudCA9IG5ldyBBcnJheSgwLDAsMCk7DQoJCQlmb3IgKHZhciBpR2VuID0gMDsgaUdlbiA8IGhlaWdodDsgaUdlbisrKQ0KCQkJew0KCQkJCS8vIFNlYXJjaCBmcm9tIG1pZGRsZSBvdXR3YXJkcw0KCQkJCXZhciBpID0gbWlkZGxlSSArICgoaUdlbiAmIDB4MDEpID09IDA/KChpR2VuICsgMSkgPj4gMSk6LSAoKGlHZW4gKyAxKSA+PiAxKSk7DQoJCQkJc3RhdGVDb3VudFswXSA9IDA7DQoJCQkJc3RhdGVDb3VudFsxXSA9IDA7DQoJCQkJc3RhdGVDb3VudFsyXSA9IDA7DQoJCQkJdmFyIGogPSBzdGFydFg7DQoJCQkJLy8gQnVybiBvZmYgbGVhZGluZyB3aGl0ZSBwaXhlbHMgYmVmb3JlIGFueXRoaW5nIGVsc2U7IGlmIHdlIHN0YXJ0IGluIHRoZSBtaWRkbGUgb2YNCgkJCQkvLyBhIHdoaXRlIHJ1biwgaXQgZG9lc24ndCBtYWtlIHNlbnNlIHRvIGNvdW50IGl0cyBsZW5ndGgsIHNpbmNlIHdlIGRvbid0IGtub3cgaWYgdGhlDQoJCQkJLy8gd2hpdGUgcnVuIGNvbnRpbnVlZCB0byB0aGUgbGVmdCBvZiB0aGUgc3RhcnQgcG9pbnQNCgkJCQl3aGlsZSAoaiA8IG1heEogJiYgIWltYWdlW2ogKyBxcmNvZGUud2lkdGgqIGldKQ0KCQkJCXsNCgkJCQkJaisrOw0KCQkJCX0NCgkJCQl2YXIgY3VycmVudFN0YXRlID0gMDsNCgkJCQl3aGlsZSAoaiA8IG1heEopDQoJCQkJew0KCQkJCQlpZiAoaW1hZ2VbaiArIGkqcXJjb2RlLndpZHRoXSkNCgkJCQkJew0KCQkJCQkJLy8gQmxhY2sgcGl4ZWwNCgkJCQkJCWlmIChjdXJyZW50U3RhdGUgPT0gMSkNCgkJCQkJCXsNCgkJCQkJCQkvLyBDb3VudGluZyBibGFjayBwaXhlbHMNCgkJCQkJCQlzdGF0ZUNvdW50W2N1cnJlbnRTdGF0ZV0rKzsNCgkJCQkJCX0NCgkJCQkJCWVsc2UNCgkJCQkJCXsNCgkJCQkJCQkvLyBDb3VudGluZyB3aGl0ZSBwaXhlbHMNCgkJCQkJCQlpZiAoY3VycmVudFN0YXRlID09IDIpDQoJCQkJCQkJew0KCQkJCQkJCQkvLyBBIHdpbm5lcj8NCgkJCQkJCQkJaWYgKHRoaXMuZm91bmRQYXR0ZXJuQ3Jvc3Moc3RhdGVDb3VudCkpDQoJCQkJCQkJCXsNCgkJCQkJCQkJCS8vIFllcw0KCQkJCQkJCQkJdmFyIGNvbmZpcm1lZCA9IHRoaXMuaGFuZGxlUG9zc2libGVDZW50ZXIoc3RhdGVDb3VudCwgaSwgaik7DQoJCQkJCQkJCQlpZiAoY29uZmlybWVkICE9IG51bGwpDQoJCQkJCQkJCQl7DQoJCQkJCQkJCQkJcmV0dXJuIGNvbmZpcm1lZDsNCgkJCQkJCQkJCX0NCgkJCQkJCQkJfQ0KCQkJCQkJCQlzdGF0ZUNvdW50WzBdID0gc3RhdGVDb3VudFsyXTsNCgkJCQkJCQkJc3RhdGVDb3VudFsxXSA9IDE7DQoJCQkJCQkJCXN0YXRlQ291bnRbMl0gPSAwOw0KCQkJCQkJCQljdXJyZW50U3RhdGUgPSAxOw0KCQkJCQkJCX0NCgkJCQkJCQllbHNlDQoJCQkJCQkJew0KCQkJCQkJCQlzdGF0ZUNvdW50WysrY3VycmVudFN0YXRlXSsrOw0KCQkJCQkJCX0NCgkJCQkJCX0NCgkJCQkJfQ0KCQkJCQllbHNlDQoJCQkJCXsNCgkJCQkJCS8vIFdoaXRlIHBpeGVsDQoJCQkJCQlpZiAoY3VycmVudFN0YXRlID09IDEpDQoJCQkJCQl7DQoJCQkJCQkJLy8gQ291bnRpbmcgYmxhY2sgcGl4ZWxzDQoJCQkJCQkJY3VycmVudFN0YXRlKys7DQoJCQkJCQl9DQoJCQkJCQlzdGF0ZUNvdW50W2N1cnJlbnRTdGF0ZV0rKzsNCgkJCQkJfQ0KCQkJCQlqKys7DQoJCQkJfQ0KCQkJCWlmICh0aGlzLmZvdW5kUGF0dGVybkNyb3NzKHN0YXRlQ291bnQpKQ0KCQkJCXsNCgkJCQkJdmFyIGNvbmZpcm1lZCA9IHRoaXMuaGFuZGxlUG9zc2libGVDZW50ZXIoc3RhdGVDb3VudCwgaSwgbWF4Sik7DQoJCQkJCWlmIChjb25maXJtZWQgIT0gbnVsbCkNCgkJCQkJew0KCQkJCQkJcmV0dXJuIGNvbmZpcm1lZDsNCgkJCQkJfQ0KCQkJCX0NCgkJCX0NCgkJCQ0KCQkJLy8gSG1tLCBub3RoaW5nIHdlIHNhdyB3YXMgb2JzZXJ2ZWQgYW5kIGNvbmZpcm1lZCB0d2ljZS4gSWYgd2UgaGFkDQoJCQkvLyBhbnkgZ3Vlc3MgYXQgYWxsLCByZXR1cm4gaXQuDQoJCQlpZiAoISh0aGlzLnBvc3NpYmxlQ2VudGVycy5sZW5ndGggPT0gMCkpDQoJCQl7DQoJCQkJcmV0dXJuICB0aGlzLnBvc3NpYmxlQ2VudGVyc1swXTsNCgkJCX0NCgkJCQ0KCQkJdGhyb3cgIkNvdWxkbid0IGZpbmQgZW5vdWdoIGFsaWdubWVudCBwYXR0ZXJucyI7DQoJCX0NCgkNCn0=</uax:ByteString>
		</Value>
	</UAVariable>
	<UAObject NodeId="ns=1;s=SYSTEM" BrowseName="1:SYSTEM">
		<DisplayName Locale="en">SYSTEM</DisplayName>
		<Description Locale="en">SYSTEM</Description>
		<References>
			<Reference ReferenceType="HasComponent" IsForward="false">Objects</Reference>
			<Reference ReferenceType="HasTypeDefinition">FolderType</Reference>
		</References>
		<Extensions>
			<atvise ExportedNodeId="ns=1;s=SYSTEM.LIBRARY.PROJECT.RESOURCES/QRCodeScanner/bitmat.js" ExportedBrowseName="1:bitmat.js" Upstream="true"/>
		</Extensions>
	</UAObject>
	<UAObject NodeId="ns=1;s=SYSTEM.LIBRARY" BrowseName="1:LIBRARY">
		<DisplayName Locale="en">LIBRARY</DisplayName>
		<Description Locale="en">LIBRARY</Description>
		<References>
			<Reference ReferenceType="HasComponent" IsForward="false">ns=1;s=SYSTEM</Reference>
			<Reference ReferenceType="HasTypeDefinition">FolderType</Reference>
		</References>
		<Extensions>
			<atvise Upstream="true"/>
		</Extensions>
	</UAObject>
	<UAObject NodeId="ns=1;s=SYSTEM.LIBRARY.PROJECT" BrowseName="1:PROJECT">
		<DisplayName Locale="en">PROJECT</DisplayName>
		<Description Locale="en">PROJECT</Description>
		<References>
			<Reference ReferenceType="HasComponent" IsForward="false">ns=1;s=SYSTEM.LIBRARY</Reference>
			<Reference ReferenceType="HasTypeDefinition">FolderType</Reference>
		</References>
		<Extensions>
			<atvise Upstream="true"/>
		</Extensions>
	</UAObject>
	<UAObject NodeId="ns=1;s=SYSTEM.LIBRARY.PROJECT.RESOURCES" BrowseName="1:RESOURCES">
		<DisplayName Locale="en">RESOURCES</DisplayName>
		<Description Locale="en">RESOURCES</Description>
		<References>
			<Reference ReferenceType="HasComponent" IsForward="false">ns=1;s=SYSTEM.LIBRARY.PROJECT</Reference>
			<Reference ReferenceType="HasTypeDefinition">FolderType</Reference>
		</References>
		<Extensions>
			<atvise Upstream="true"/>
		</Extensions>
	</UAObject>
	<UAObject NodeId="ns=1;s=SYSTEM.LIBRARY.PROJECT.RESOURCES/QRCodeScanner" BrowseName="1:QRCodeScanner">
		<DisplayName Locale="en">QRCodeScanner</DisplayName>
		<Description Locale="en">QRCodeScanner</Description>
		<References>
			<Reference ReferenceType="HasComponent" IsForward="false">ns=1;s=SYSTEM.LIBRARY.PROJECT.RESOURCES</Reference>
			<Reference ReferenceType="HasTypeDefinition">FolderType</Reference>
		</References>
		<Extensions>
			<atvise Upstream="true"/>
		</Extensions>
	</UAObject>
	<UAVariable NodeId="ns=1;s=SYSTEM.LIBRARY.PROJECT.RESOURCES/QRCodeScanner/bitmat.js" BrowseName="1:bitmat.js" DataType="ByteString" AccessLevel="103" UserAccessLevel="103" Historizing="true">
		<DisplayName Locale="en">bitmat.js</DisplayName>
		<Description Locale="en">bitmat.js</Description>
		<References>
			<Reference ReferenceType="HasComponent" IsForward="false">ns=1;s=SYSTEM.LIBRARY.PROJECT.RESOURCES/QRCodeScanner</Reference>
			<Reference ReferenceType="HasTypeDefinition">ns=1;s=VariableTypes.ATVISE.Resource.Javascript</Reference>
			<Reference ReferenceType="HasProperty">ns=1;s=VariableTypes.ATVISE.Resource.Javascript.Compress</Reference>
		</References>
		<Value>
			<uax:ByteString>LyoNCiAgUG9ydGVkIHRvIEphdmFTY3JpcHQgYnkgTGF6YXIgTGFzemxvIDIwMTEgDQogIA0KICBsYXphcnNvZnRAZ21haWwuY29tLCB3d3cubGF6YXJzb2Z0LmluZm8NCiAgDQoqLw0KDQovKg0KKg0KKiBDb3B5cmlnaHQgMjAwNyBaWGluZyBhdXRob3JzDQoqDQoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOw0KKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuDQoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KKg0KKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KKg0KKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KKi8NCg0KDQpmdW5jdGlvbiBCaXRNYXRyaXgoIHdpZHRoLCAgaGVpZ2h0KQ0Kew0KCWlmKCFoZWlnaHQpDQoJCWhlaWdodD13aWR0aDsNCglpZiAod2lkdGggPCAxIHx8IGhlaWdodCA8IDEpDQoJew0KCQl0aHJvdyAiQm90aCBkaW1lbnNpb25zIG11c3QgYmUgZ3JlYXRlciB0aGFuIDAiOw0KCX0NCgl0aGlzLndpZHRoID0gd2lkdGg7DQoJdGhpcy5oZWlnaHQgPSBoZWlnaHQ7DQoJdmFyIHJvd1NpemUgPSB3aWR0aCA+PiA1Ow0KCWlmICgod2lkdGggJiAweDFmKSAhPSAwKQ0KCXsNCgkJcm93U2l6ZSsrOw0KCX0NCgl0aGlzLnJvd1NpemUgPSByb3dTaXplOw0KCXRoaXMuYml0cyA9IG5ldyBBcnJheShyb3dTaXplICogaGVpZ2h0KTsNCglmb3IodmFyIGk9MDtpPHRoaXMuYml0cy5sZW5ndGg7aSsrKQ0KCQl0aGlzLmJpdHNbaV09MDsNCgkNCgl0aGlzLl9fZGVmaW5lR2V0dGVyX18oIldpZHRoIiwgZnVuY3Rpb24oKQ0KCXsNCgkJcmV0dXJuIHRoaXMud2lkdGg7DQoJfSk7DQoJdGhpcy5fX2RlZmluZUdldHRlcl9fKCJIZWlnaHQiLCBmdW5jdGlvbigpDQoJew0KCQlyZXR1cm4gdGhpcy5oZWlnaHQ7DQoJfSk7DQoJdGhpcy5fX2RlZmluZUdldHRlcl9fKCJEaW1lbnNpb24iLCBmdW5jdGlvbigpDQoJew0KCQlpZiAodGhpcy53aWR0aCAhPSB0aGlzLmhlaWdodCkNCgkJew0KCQkJdGhyb3cgIkNhbid0IGNhbGwgZ2V0RGltZW5zaW9uKCkgb24gYSBub24tc3F1YXJlIG1hdHJpeCI7DQoJCX0NCgkJcmV0dXJuIHRoaXMud2lkdGg7DQoJfSk7DQoJDQoJdGhpcy5nZXRfUmVuYW1lZD1mdW5jdGlvbiggeCwgIHkpDQoJCXsNCgkJCXZhciBvZmZzZXQgPSB5ICogdGhpcy5yb3dTaXplICsgKHggPj4gNSk7DQoJCQlyZXR1cm4gKChVUlNoaWZ0KHRoaXMuYml0c1tvZmZzZXRdLCAoeCAmIDB4MWYpKSkgJiAxKSAhPSAwOw0KCQl9DQoJdGhpcy5zZXRfUmVuYW1lZD1mdW5jdGlvbiggeCwgIHkpDQoJCXsNCgkJCXZhciBvZmZzZXQgPSB5ICogdGhpcy5yb3dTaXplICsgKHggPj4gNSk7DQoJCQl0aGlzLmJpdHNbb2Zmc2V0XSB8PSAxIDw8ICh4ICYgMHgxZik7DQoJCX0NCgl0aGlzLmZsaXA9ZnVuY3Rpb24oIHgsICB5KQ0KCQl7DQoJCQl2YXIgb2Zmc2V0ID0geSAqIHRoaXMucm93U2l6ZSArICh4ID4+IDUpOw0KCQkJdGhpcy5iaXRzW29mZnNldF0gXj0gMSA8PCAoeCAmIDB4MWYpOw0KCQl9DQoJdGhpcy5jbGVhcj1mdW5jdGlvbigpDQoJCXsNCgkJCXZhciBtYXggPSB0aGlzLmJpdHMubGVuZ3RoOw0KCQkJZm9yICh2YXIgaSA9IDA7IGkgPCBtYXg7IGkrKykNCgkJCXsNCgkJCQl0aGlzLmJpdHNbaV0gPSAwOw0KCQkJfQ0KCQl9DQoJdGhpcy5zZXRSZWdpb249ZnVuY3Rpb24oIGxlZnQsICB0b3AsICB3aWR0aCwgIGhlaWdodCkNCgkJew0KCQkJaWYgKHRvcCA8IDAgfHwgbGVmdCA8IDApDQoJCQl7DQoJCQkJdGhyb3cgIkxlZnQgYW5kIHRvcCBtdXN0IGJlIG5vbm5lZ2F0aXZlIjsNCgkJCX0NCgkJCWlmIChoZWlnaHQgPCAxIHx8IHdpZHRoIDwgMSkNCgkJCXsNCgkJCQl0aHJvdyAiSGVpZ2h0IGFuZCB3aWR0aCBtdXN0IGJlIGF0IGxlYXN0IDEiOw0KCQkJfQ0KCQkJdmFyIHJpZ2h0ID0gbGVmdCArIHdpZHRoOw0KCQkJdmFyIGJvdHRvbSA9IHRvcCArIGhlaWdodDsNCgkJCWlmIChib3R0b20gPiB0aGlzLmhlaWdodCB8fCByaWdodCA+IHRoaXMud2lkdGgpDQoJCQl7DQoJCQkJdGhyb3cgIlRoZSByZWdpb24gbXVzdCBmaXQgaW5zaWRlIHRoZSBtYXRyaXgiOw0KCQkJfQ0KCQkJZm9yICh2YXIgeSA9IHRvcDsgeSA8IGJvdHRvbTsgeSsrKQ0KCQkJew0KCQkJCXZhciBvZmZzZXQgPSB5ICogdGhpcy5yb3dTaXplOw0KCQkJCWZvciAodmFyIHggPSBsZWZ0OyB4IDwgcmlnaHQ7IHgrKykNCgkJCQl7DQoJCQkJCXRoaXMuYml0c1tvZmZzZXQgKyAoeCA+PiA1KV0gfD0gMSA8PCAoeCAmIDB4MWYpOw0KCQkJCX0NCgkJCX0NCgkJfQ0KfQ==</uax:ByteString>
		</Value>
	</UAVariable>
	<UAObject NodeId="ns=1;s=SYSTEM" BrowseName="1:SYSTEM">
		<DisplayName Locale="en">SYSTEM</DisplayName>
		<Description Locale="en">SYSTEM</Description>
		<References>
			<Reference ReferenceType="HasComponent" IsForward="false">Objects</Reference>
			<Reference ReferenceType="HasTypeDefinition">FolderType</Reference>
		</References>
		<Extensions>
			<atvise ExportedNodeId="ns=1;s=SYSTEM.LIBRARY.PROJECT.RESOURCES/QRCodeScanner/bmparser.js" ExportedBrowseName="1:bmparser.js" Upstream="true"/>
		</Extensions>
	</UAObject>
	<UAObject NodeId="ns=1;s=SYSTEM.LIBRARY" BrowseName="1:LIBRARY">
		<DisplayName Locale="en">LIBRARY</DisplayName>
		<Description Locale="en">LIBRARY</Description>
		<References>
			<Reference ReferenceType="HasComponent" IsForward="false">ns=1;s=SYSTEM</Reference>
			<Reference ReferenceType="HasTypeDefinition">FolderType</Reference>
		</References>
		<Extensions>
			<atvise Upstream="true"/>
		</Extensions>
	</UAObject>
	<UAObject NodeId="ns=1;s=SYSTEM.LIBRARY.PROJECT" BrowseName="1:PROJECT">
		<DisplayName Locale="en">PROJECT</DisplayName>
		<Description Locale="en">PROJECT</Description>
		<References>
			<Reference ReferenceType="HasComponent" IsForward="false">ns=1;s=SYSTEM.LIBRARY</Reference>
			<Reference ReferenceType="HasTypeDefinition">FolderType</Reference>
		</References>
		<Extensions>
			<atvise Upstream="true"/>
		</Extensions>
	</UAObject>
	<UAObject NodeId="ns=1;s=SYSTEM.LIBRARY.PROJECT.RESOURCES" BrowseName="1:RESOURCES">
		<DisplayName Locale="en">RESOURCES</DisplayName>
		<Description Locale="en">RESOURCES</Description>
		<References>
			<Reference ReferenceType="HasComponent" IsForward="false">ns=1;s=SYSTEM.LIBRARY.PROJECT</Reference>
			<Reference ReferenceType="HasTypeDefinition">FolderType</Reference>
		</References>
		<Extensions>
			<atvise Upstream="true"/>
		</Extensions>
	</UAObject>
	<UAObject NodeId="ns=1;s=SYSTEM.LIBRARY.PROJECT.RESOURCES/QRCodeScanner" BrowseName="1:QRCodeScanner">
		<DisplayName Locale="en">QRCodeScanner</DisplayName>
		<Description Locale="en">QRCodeScanner</Description>
		<References>
			<Reference ReferenceType="HasComponent" IsForward="false">ns=1;s=SYSTEM.LIBRARY.PROJECT.RESOURCES</Reference>
			<Reference ReferenceType="HasTypeDefinition">FolderType</Reference>
		</References>
		<Extensions>
			<atvise Upstream="true"/>
		</Extensions>
	</UAObject>
	<UAVariable NodeId="ns=1;s=SYSTEM.LIBRARY.PROJECT.RESOURCES/QRCodeScanner/bmparser.js" BrowseName="1:bmparser.js" DataType="ByteString" AccessLevel="103" UserAccessLevel="103" Historizing="true">
		<DisplayName Locale="en">bmparser.js</DisplayName>
		<Description Locale="en">bmparser.js</Description>
		<References>
			<Reference ReferenceType="HasComponent" IsForward="false">ns=1;s=SYSTEM.LIBRARY.PROJECT.RESOURCES/QRCodeScanner</Reference>
			<Reference ReferenceType="HasTypeDefinition">ns=1;s=VariableTypes.ATVISE.Resource.Javascript</Reference>
			<Reference ReferenceType="HasProperty">ns=1;s=VariableTypes.ATVISE.Resource.Javascript.Compress</Reference>
		</References>
		<Value>
			<uax:ByteString>LyoNCiAgUG9ydGVkIHRvIEphdmFTY3JpcHQgYnkgTGF6YXIgTGFzemxvIDIwMTEgDQogIA0KICBsYXphcnNvZnRAZ21haWwuY29tLCB3d3cubGF6YXJzb2Z0LmluZm8NCiAgDQoqLw0KDQovKg0KKg0KKiBDb3B5cmlnaHQgMjAwNyBaWGluZyBhdXRob3JzDQoqDQoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOw0KKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuDQoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KKg0KKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KKg0KKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KKi8NCg0KDQpmdW5jdGlvbiBCaXRNYXRyaXhQYXJzZXIoYml0TWF0cml4KQ0Kew0KCXZhciBkaW1lbnNpb24gPSBiaXRNYXRyaXguRGltZW5zaW9uOw0KCWlmIChkaW1lbnNpb24gPCAyMSB8fCAoZGltZW5zaW9uICYgMHgwMykgIT0gMSkNCgl7DQoJCXRocm93ICJFcnJvciBCaXRNYXRyaXhQYXJzZXIiOw0KCX0NCgl0aGlzLmJpdE1hdHJpeCA9IGJpdE1hdHJpeDsNCgl0aGlzLnBhcnNlZFZlcnNpb24gPSBudWxsOw0KCXRoaXMucGFyc2VkRm9ybWF0SW5mbyA9IG51bGw7DQoJDQoJdGhpcy5jb3B5Qml0PWZ1bmN0aW9uKCBpLCAgaiwgIHZlcnNpb25CaXRzKQ0KCXsNCgkJcmV0dXJuIHRoaXMuYml0TWF0cml4LmdldF9SZW5hbWVkKGksIGopPyh2ZXJzaW9uQml0cyA8PCAxKSB8IDB4MTp2ZXJzaW9uQml0cyA8PCAxOw0KCX0NCgkNCgl0aGlzLnJlYWRGb3JtYXRJbmZvcm1hdGlvbj1mdW5jdGlvbigpDQoJew0KCQkJaWYgKHRoaXMucGFyc2VkRm9ybWF0SW5mbyAhPSBudWxsKQ0KCQkJew0KCQkJCXJldHVybiB0aGlzLnBhcnNlZEZvcm1hdEluZm87DQoJCQl9DQoJCQkNCgkJCS8vIFJlYWQgdG9wLWxlZnQgZm9ybWF0IGluZm8gYml0cw0KCQkJdmFyIGZvcm1hdEluZm9CaXRzID0gMDsNCgkJCWZvciAodmFyIGkgPSAwOyBpIDwgNjsgaSsrKQ0KCQkJew0KCQkJCWZvcm1hdEluZm9CaXRzID0gdGhpcy5jb3B5Qml0KGksIDgsIGZvcm1hdEluZm9CaXRzKTsNCgkJCX0NCgkJCS8vIC4uIGFuZCBza2lwIGEgYml0IGluIHRoZSB0aW1pbmcgcGF0dGVybiAuLi4NCgkJCWZvcm1hdEluZm9CaXRzID0gdGhpcy5jb3B5Qml0KDcsIDgsIGZvcm1hdEluZm9CaXRzKTsNCgkJCWZvcm1hdEluZm9CaXRzID0gdGhpcy5jb3B5Qml0KDgsIDgsIGZvcm1hdEluZm9CaXRzKTsNCgkJCWZvcm1hdEluZm9CaXRzID0gdGhpcy5jb3B5Qml0KDgsIDcsIGZvcm1hdEluZm9CaXRzKTsNCgkJCS8vIC4uIGFuZCBza2lwIGEgYml0IGluIHRoZSB0aW1pbmcgcGF0dGVybiAuLi4NCgkJCWZvciAodmFyIGogPSA1OyBqID49IDA7IGotLSkNCgkJCXsNCgkJCQlmb3JtYXRJbmZvQml0cyA9IHRoaXMuY29weUJpdCg4LCBqLCBmb3JtYXRJbmZvQml0cyk7DQoJCQl9DQoJCQkNCgkJCXRoaXMucGFyc2VkRm9ybWF0SW5mbyA9IEZvcm1hdEluZm9ybWF0aW9uLmRlY29kZUZvcm1hdEluZm9ybWF0aW9uKGZvcm1hdEluZm9CaXRzKTsNCgkJCWlmICh0aGlzLnBhcnNlZEZvcm1hdEluZm8gIT0gbnVsbCkNCgkJCXsNCgkJCQlyZXR1cm4gdGhpcy5wYXJzZWRGb3JtYXRJbmZvOw0KCQkJfQ0KCQkJDQoJCQkvLyBIbW0sIGZhaWxlZC4gVHJ5IHRoZSB0b3AtcmlnaHQvYm90dG9tLWxlZnQgcGF0dGVybg0KCQkJdmFyIGRpbWVuc2lvbiA9IHRoaXMuYml0TWF0cml4LkRpbWVuc2lvbjsNCgkJCWZvcm1hdEluZm9CaXRzID0gMDsNCgkJCXZhciBpTWluID0gZGltZW5zaW9uIC0gODsNCgkJCWZvciAodmFyIGkgPSBkaW1lbnNpb24gLSAxOyBpID49IGlNaW47IGktLSkNCgkJCXsNCgkJCQlmb3JtYXRJbmZvQml0cyA9IHRoaXMuY29weUJpdChpLCA4LCBmb3JtYXRJbmZvQml0cyk7DQoJCQl9DQoJCQlmb3IgKHZhciBqID0gZGltZW5zaW9uIC0gNzsgaiA8IGRpbWVuc2lvbjsgaisrKQ0KCQkJew0KCQkJCWZvcm1hdEluZm9CaXRzID0gdGhpcy5jb3B5Qml0KDgsIGosIGZvcm1hdEluZm9CaXRzKTsNCgkJCX0NCgkJCQ0KCQkJdGhpcy5wYXJzZWRGb3JtYXRJbmZvID0gRm9ybWF0SW5mb3JtYXRpb24uZGVjb2RlRm9ybWF0SW5mb3JtYXRpb24oZm9ybWF0SW5mb0JpdHMpOw0KCQkJaWYgKHRoaXMucGFyc2VkRm9ybWF0SW5mbyAhPSBudWxsKQ0KCQkJew0KCQkJCXJldHVybiB0aGlzLnBhcnNlZEZvcm1hdEluZm87DQoJCQl9DQoJCQl0aHJvdyAiRXJyb3IgcmVhZEZvcm1hdEluZm9ybWF0aW9uIjsJDQoJfQ0KCXRoaXMucmVhZFZlcnNpb249ZnVuY3Rpb24oKQ0KCQl7DQoJCQkNCgkJCWlmICh0aGlzLnBhcnNlZFZlcnNpb24gIT0gbnVsbCkNCgkJCXsNCgkJCQlyZXR1cm4gdGhpcy5wYXJzZWRWZXJzaW9uOw0KCQkJfQ0KCQkJDQoJCQl2YXIgZGltZW5zaW9uID0gdGhpcy5iaXRNYXRyaXguRGltZW5zaW9uOw0KCQkJDQoJCQl2YXIgcHJvdmlzaW9uYWxWZXJzaW9uID0gKGRpbWVuc2lvbiAtIDE3KSA+PiAyOw0KCQkJaWYgKHByb3Zpc2lvbmFsVmVyc2lvbiA8PSA2KQ0KCQkJew0KCQkJCXJldHVybiBWZXJzaW9uLmdldFZlcnNpb25Gb3JOdW1iZXIocHJvdmlzaW9uYWxWZXJzaW9uKTsNCgkJCX0NCgkJCQ0KCQkJLy8gUmVhZCB0b3AtcmlnaHQgdmVyc2lvbiBpbmZvOiAzIHdpZGUgYnkgNiB0YWxsDQoJCQl2YXIgdmVyc2lvbkJpdHMgPSAwOw0KCQkJdmFyIGlqTWluID0gZGltZW5zaW9uIC0gMTE7DQoJCQlmb3IgKHZhciBqID0gNTsgaiA+PSAwOyBqLS0pDQoJCQl7DQoJCQkJZm9yICh2YXIgaSA9IGRpbWVuc2lvbiAtIDk7IGkgPj0gaWpNaW47IGktLSkNCgkJCQl7DQoJCQkJCXZlcnNpb25CaXRzID0gdGhpcy5jb3B5Qml0KGksIGosIHZlcnNpb25CaXRzKTsNCgkJCQl9DQoJCQl9DQoJCQkNCgkJCXRoaXMucGFyc2VkVmVyc2lvbiA9IFZlcnNpb24uZGVjb2RlVmVyc2lvbkluZm9ybWF0aW9uKHZlcnNpb25CaXRzKTsNCgkJCWlmICh0aGlzLnBhcnNlZFZlcnNpb24gIT0gbnVsbCAmJiB0aGlzLnBhcnNlZFZlcnNpb24uRGltZW5zaW9uRm9yVmVyc2lvbiA9PSBkaW1lbnNpb24pDQoJCQl7DQoJCQkJcmV0dXJuIHRoaXMucGFyc2VkVmVyc2lvbjsNCgkJCX0NCgkJCQ0KCQkJLy8gSG1tLCBmYWlsZWQuIFRyeSBib3R0b20gbGVmdDogNiB3aWRlIGJ5IDMgdGFsbA0KCQkJdmVyc2lvbkJpdHMgPSAwOw0KCQkJZm9yICh2YXIgaSA9IDU7IGkgPj0gMDsgaS0tKQ0KCQkJew0KCQkJCWZvciAodmFyIGogPSBkaW1lbnNpb24gLSA5OyBqID49IGlqTWluOyBqLS0pDQoJCQkJew0KCQkJCQl2ZXJzaW9uQml0cyA9IHRoaXMuY29weUJpdChpLCBqLCB2ZXJzaW9uQml0cyk7DQoJCQkJfQ0KCQkJfQ0KCQkJDQoJCQl0aGlzLnBhcnNlZFZlcnNpb24gPSBWZXJzaW9uLmRlY29kZVZlcnNpb25JbmZvcm1hdGlvbih2ZXJzaW9uQml0cyk7DQoJCQlpZiAodGhpcy5wYXJzZWRWZXJzaW9uICE9IG51bGwgJiYgdGhpcy5wYXJzZWRWZXJzaW9uLkRpbWVuc2lvbkZvclZlcnNpb24gPT0gZGltZW5zaW9uKQ0KCQkJew0KCQkJCXJldHVybiB0aGlzLnBhcnNlZFZlcnNpb247DQoJCQl9DQoJCQl0aHJvdyAiRXJyb3IgcmVhZFZlcnNpb24iOw0KCQl9DQoJdGhpcy5yZWFkQ29kZXdvcmRzPWZ1bmN0aW9uKCkNCgkJew0KCQkJDQoJCQl2YXIgZm9ybWF0SW5mbyA9IHRoaXMucmVhZEZvcm1hdEluZm9ybWF0aW9uKCk7DQoJCQl2YXIgdmVyc2lvbiA9IHRoaXMucmVhZFZlcnNpb24oKTsNCgkJCQ0KCQkJLy8gR2V0IHRoZSBkYXRhIG1hc2sgZm9yIHRoZSBmb3JtYXQgdXNlZCBpbiB0aGlzIFFSIENvZGUuIFRoaXMgd2lsbCBleGNsdWRlDQoJCQkvLyBzb21lIGJpdHMgZnJvbSByZWFkaW5nIGFzIHdlIHdpbmQgdGhyb3VnaCB0aGUgYml0IG1hdHJpeC4NCgkJCXZhciBkYXRhTWFzayA9IERhdGFNYXNrLmZvclJlZmVyZW5jZSggZm9ybWF0SW5mby5EYXRhTWFzayk7DQoJCQl2YXIgZGltZW5zaW9uID0gdGhpcy5iaXRNYXRyaXguRGltZW5zaW9uOw0KCQkJZGF0YU1hc2sudW5tYXNrQml0TWF0cml4KHRoaXMuYml0TWF0cml4LCBkaW1lbnNpb24pOw0KCQkJDQoJCQl2YXIgZnVuY3Rpb25QYXR0ZXJuID0gdmVyc2lvbi5idWlsZEZ1bmN0aW9uUGF0dGVybigpOw0KCQkJDQoJCQl2YXIgcmVhZGluZ1VwID0gdHJ1ZTsNCgkJCXZhciByZXN1bHQgPSBuZXcgQXJyYXkodmVyc2lvbi5Ub3RhbENvZGV3b3Jkcyk7DQoJCQl2YXIgcmVzdWx0T2Zmc2V0ID0gMDsNCgkJCXZhciBjdXJyZW50Qnl0ZSA9IDA7DQoJCQl2YXIgYml0c1JlYWQgPSAwOw0KCQkJLy8gUmVhZCBjb2x1bW5zIGluIHBhaXJzLCBmcm9tIHJpZ2h0IHRvIGxlZnQNCgkJCWZvciAodmFyIGogPSBkaW1lbnNpb24gLSAxOyBqID4gMDsgaiAtPSAyKQ0KCQkJew0KCQkJCWlmIChqID09IDYpDQoJCQkJew0KCQkJCQkvLyBTa2lwIHdob2xlIGNvbHVtbiB3aXRoIHZlcnRpY2FsIGFsaWdubWVudCBwYXR0ZXJuOw0KCQkJCQkvLyBzYXZlcyB0aW1lIGFuZCBtYWtlcyB0aGUgb3RoZXIgY29kZSBwcm9jZWVkIG1vcmUgY2xlYW5seQ0KCQkJCQlqLS07DQoJCQkJfQ0KCQkJCS8vIFJlYWQgYWx0ZXJuYXRpbmdseSBmcm9tIGJvdHRvbSB0byB0b3AgdGhlbiB0b3AgdG8gYm90dG9tDQoJCQkJZm9yICh2YXIgY291bnQgPSAwOyBjb3VudCA8IGRpbWVuc2lvbjsgY291bnQrKykNCgkJCQl7DQoJCQkJCXZhciBpID0gcmVhZGluZ1VwP2RpbWVuc2lvbiAtIDEgLSBjb3VudDpjb3VudDsNCgkJCQkJZm9yICh2YXIgY29sID0gMDsgY29sIDwgMjsgY29sKyspDQoJCQkJCXsNCgkJCQkJCS8vIElnbm9yZSBiaXRzIGNvdmVyZWQgYnkgdGhlIGZ1bmN0aW9uIHBhdHRlcm4NCgkJCQkJCWlmICghZnVuY3Rpb25QYXR0ZXJuLmdldF9SZW5hbWVkKGogLSBjb2wsIGkpKQ0KCQkJCQkJew0KCQkJCQkJCS8vIFJlYWQgYSBiaXQNCgkJCQkJCQliaXRzUmVhZCsrOw0KCQkJCQkJCWN1cnJlbnRCeXRlIDw8PSAxOw0KCQkJCQkJCWlmICh0aGlzLmJpdE1hdHJpeC5nZXRfUmVuYW1lZChqIC0gY29sLCBpKSkNCgkJCQkJCQl7DQoJCQkJCQkJCWN1cnJlbnRCeXRlIHw9IDE7DQoJCQkJCQkJfQ0KCQkJCQkJCS8vIElmIHdlJ3ZlIG1hZGUgYSB3aG9sZSBieXRlLCBzYXZlIGl0IG9mZg0KCQkJCQkJCWlmIChiaXRzUmVhZCA9PSA4KQ0KCQkJCQkJCXsNCgkJCQkJCQkJcmVzdWx0W3Jlc3VsdE9mZnNldCsrXSA9ICBjdXJyZW50Qnl0ZTsNCgkJCQkJCQkJYml0c1JlYWQgPSAwOw0KCQkJCQkJCQljdXJyZW50Qnl0ZSA9IDA7DQoJCQkJCQkJfQ0KCQkJCQkJfQ0KCQkJCQl9DQoJCQkJfQ0KCQkJCXJlYWRpbmdVcCBePSB0cnVlOyAvLyByZWFkaW5nVXAgPSAhcmVhZGluZ1VwOyAvLyBzd2l0Y2ggZGlyZWN0aW9ucw0KCQkJfQ0KCQkJaWYgKHJlc3VsdE9mZnNldCAhPSB2ZXJzaW9uLlRvdGFsQ29kZXdvcmRzKQ0KCQkJew0KCQkJCXRocm93ICJFcnJvciByZWFkQ29kZXdvcmRzIjsNCgkJCX0NCgkJCXJldHVybiByZXN1bHQ7DQoJCX0NCn0=</uax:ByteString>
		</Value>
	</UAVariable>
	<UAObject NodeId="ns=1;s=SYSTEM" BrowseName="1:SYSTEM">
		<DisplayName Locale="en">SYSTEM</DisplayName>
		<Description Locale="en">SYSTEM</Description>
		<References>
			<Reference ReferenceType="HasComponent" IsForward="false">Objects</Reference>
			<Reference ReferenceType="HasTypeDefinition">FolderType</Reference>
		</References>
		<Extensions>
			<atvise ExportedNodeId="ns=1;s=SYSTEM.LIBRARY.PROJECT.RESOURCES/QRCodeScanner/datablock.js" ExportedBrowseName="1:datablock.js" Upstream="true"/>
		</Extensions>
	</UAObject>
	<UAObject NodeId="ns=1;s=SYSTEM.LIBRARY" BrowseName="1:LIBRARY">
		<DisplayName Locale="en">LIBRARY</DisplayName>
		<Description Locale="en">LIBRARY</Description>
		<References>
			<Reference ReferenceType="HasComponent" IsForward="false">ns=1;s=SYSTEM</Reference>
			<Reference ReferenceType="HasTypeDefinition">FolderType</Reference>
		</References>
		<Extensions>
			<atvise Upstream="true"/>
		</Extensions>
	</UAObject>
	<UAObject NodeId="ns=1;s=SYSTEM.LIBRARY.PROJECT" BrowseName="1:PROJECT">
		<DisplayName Locale="en">PROJECT</DisplayName>
		<Description Locale="en">PROJECT</Description>
		<References>
			<Reference ReferenceType="HasComponent" IsForward="false">ns=1;s=SYSTEM.LIBRARY</Reference>
			<Reference ReferenceType="HasTypeDefinition">FolderType</Reference>
		</References>
		<Extensions>
			<atvise Upstream="true"/>
		</Extensions>
	</UAObject>
	<UAObject NodeId="ns=1;s=SYSTEM.LIBRARY.PROJECT.RESOURCES" BrowseName="1:RESOURCES">
		<DisplayName Locale="en">RESOURCES</DisplayName>
		<Description Locale="en">RESOURCES</Description>
		<References>
			<Reference ReferenceType="HasComponent" IsForward="false">ns=1;s=SYSTEM.LIBRARY.PROJECT</Reference>
			<Reference ReferenceType="HasTypeDefinition">FolderType</Reference>
		</References>
		<Extensions>
			<atvise Upstream="true"/>
		</Extensions>
	</UAObject>
	<UAObject NodeId="ns=1;s=SYSTEM.LIBRARY.PROJECT.RESOURCES/QRCodeScanner" BrowseName="1:QRCodeScanner">
		<DisplayName Locale="en">QRCodeScanner</DisplayName>
		<Description Locale="en">QRCodeScanner</Description>
		<References>
			<Reference ReferenceType="HasComponent" IsForward="false">ns=1;s=SYSTEM.LIBRARY.PROJECT.RESOURCES</Reference>
			<Reference ReferenceType="HasTypeDefinition">FolderType</Reference>
		</References>
		<Extensions>
			<atvise Upstream="true"/>
		</Extensions>
	</UAObject>
	<UAVariable NodeId="ns=1;s=SYSTEM.LIBRARY.PROJECT.RESOURCES/QRCodeScanner/datablock.js" BrowseName="1:datablock.js" DataType="ByteString" AccessLevel="103" UserAccessLevel="103" Historizing="true">
		<DisplayName Locale="en">datablock.js</DisplayName>
		<Description Locale="en">datablock.js</Description>
		<References>
			<Reference ReferenceType="HasComponent" IsForward="false">ns=1;s=SYSTEM.LIBRARY.PROJECT.RESOURCES/QRCodeScanner</Reference>
			<Reference ReferenceType="HasTypeDefinition">ns=1;s=VariableTypes.ATVISE.Resource.Javascript</Reference>
			<Reference ReferenceType="HasProperty">ns=1;s=VariableTypes.ATVISE.Resource.Javascript.Compress</Reference>
		</References>
		<Value>
			<uax:ByteString>LyoNCiAgUG9ydGVkIHRvIEphdmFTY3JpcHQgYnkgTGF6YXIgTGFzemxvIDIwMTEgDQogIA0KICBsYXphcnNvZnRAZ21haWwuY29tLCB3d3cubGF6YXJzb2Z0LmluZm8NCiAgDQoqLw0KDQovKg0KKg0KKiBDb3B5cmlnaHQgMjAwNyBaWGluZyBhdXRob3JzDQoqDQoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOw0KKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuDQoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KKg0KKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KKg0KKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KKi8NCg0KDQpmdW5jdGlvbiBEYXRhQmxvY2sobnVtRGF0YUNvZGV3b3JkcywgIGNvZGV3b3JkcykNCnsNCgl0aGlzLm51bURhdGFDb2Rld29yZHMgPSBudW1EYXRhQ29kZXdvcmRzOw0KCXRoaXMuY29kZXdvcmRzID0gY29kZXdvcmRzOw0KCQ0KCXRoaXMuX19kZWZpbmVHZXR0ZXJfXygiTnVtRGF0YUNvZGV3b3JkcyIsIGZ1bmN0aW9uKCkNCgl7DQoJCXJldHVybiB0aGlzLm51bURhdGFDb2Rld29yZHM7DQoJfSk7DQoJdGhpcy5fX2RlZmluZUdldHRlcl9fKCJDb2Rld29yZHMiLCBmdW5jdGlvbigpDQoJew0KCQlyZXR1cm4gdGhpcy5jb2Rld29yZHM7DQoJfSk7DQp9CQ0KCQ0KRGF0YUJsb2NrLmdldERhdGFCbG9ja3M9ZnVuY3Rpb24ocmF3Q29kZXdvcmRzLCAgdmVyc2lvbiwgIGVjTGV2ZWwpDQp7DQoJDQoJaWYgKHJhd0NvZGV3b3Jkcy5sZW5ndGggIT0gdmVyc2lvbi5Ub3RhbENvZGV3b3JkcykNCgl7DQoJCXRocm93ICJBcmd1bWVudEV4Y2VwdGlvbiI7DQoJfQ0KCQ0KCS8vIEZpZ3VyZSBvdXQgdGhlIG51bWJlciBhbmQgc2l6ZSBvZiBkYXRhIGJsb2NrcyB1c2VkIGJ5IHRoaXMgdmVyc2lvbiBhbmQNCgkvLyBlcnJvciBjb3JyZWN0aW9uIGxldmVsDQoJdmFyIGVjQmxvY2tzID0gdmVyc2lvbi5nZXRFQ0Jsb2Nrc0ZvckxldmVsKGVjTGV2ZWwpOw0KCQ0KCS8vIEZpcnN0IGNvdW50IHRoZSB0b3RhbCBudW1iZXIgb2YgZGF0YSBibG9ja3MNCgl2YXIgdG90YWxCbG9ja3MgPSAwOw0KCXZhciBlY0Jsb2NrQXJyYXkgPSBlY0Jsb2Nrcy5nZXRFQ0Jsb2NrcygpOw0KCWZvciAodmFyIGkgPSAwOyBpIDwgZWNCbG9ja0FycmF5Lmxlbmd0aDsgaSsrKQ0KCXsNCgkJdG90YWxCbG9ja3MgKz0gZWNCbG9ja0FycmF5W2ldLkNvdW50Ow0KCX0NCgkNCgkvLyBOb3cgZXN0YWJsaXNoIERhdGFCbG9ja3Mgb2YgdGhlIGFwcHJvcHJpYXRlIHNpemUgYW5kIG51bWJlciBvZiBkYXRhIGNvZGV3b3Jkcw0KCXZhciByZXN1bHQgPSBuZXcgQXJyYXkodG90YWxCbG9ja3MpOw0KCXZhciBudW1SZXN1bHRCbG9ja3MgPSAwOw0KCWZvciAodmFyIGogPSAwOyBqIDwgZWNCbG9ja0FycmF5Lmxlbmd0aDsgaisrKQ0KCXsNCgkJdmFyIGVjQmxvY2sgPSBlY0Jsb2NrQXJyYXlbal07DQoJCWZvciAodmFyIGkgPSAwOyBpIDwgZWNCbG9jay5Db3VudDsgaSsrKQ0KCQl7DQoJCQl2YXIgbnVtRGF0YUNvZGV3b3JkcyA9IGVjQmxvY2suRGF0YUNvZGV3b3JkczsNCgkJCXZhciBudW1CbG9ja0NvZGV3b3JkcyA9IGVjQmxvY2tzLkVDQ29kZXdvcmRzUGVyQmxvY2sgKyBudW1EYXRhQ29kZXdvcmRzOw0KCQkJcmVzdWx0W251bVJlc3VsdEJsb2NrcysrXSA9IG5ldyBEYXRhQmxvY2sobnVtRGF0YUNvZGV3b3JkcywgbmV3IEFycmF5KG51bUJsb2NrQ29kZXdvcmRzKSk7DQoJCX0NCgl9DQoJDQoJLy8gQWxsIGJsb2NrcyBoYXZlIHRoZSBzYW1lIGFtb3VudCBvZiBkYXRhLCBleGNlcHQgdGhhdCB0aGUgbGFzdCBuDQoJLy8gKHdoZXJlIG4gbWF5IGJlIDApIGhhdmUgMSBtb3JlIGJ5dGUuIEZpZ3VyZSBvdXQgd2hlcmUgdGhlc2Ugc3RhcnQuDQoJdmFyIHNob3J0ZXJCbG9ja3NUb3RhbENvZGV3b3JkcyA9IHJlc3VsdFswXS5jb2Rld29yZHMubGVuZ3RoOw0KCXZhciBsb25nZXJCbG9ja3NTdGFydEF0ID0gcmVzdWx0Lmxlbmd0aCAtIDE7DQoJd2hpbGUgKGxvbmdlckJsb2Nrc1N0YXJ0QXQgPj0gMCkNCgl7DQoJCXZhciBudW1Db2Rld29yZHMgPSByZXN1bHRbbG9uZ2VyQmxvY2tzU3RhcnRBdF0uY29kZXdvcmRzLmxlbmd0aDsNCgkJaWYgKG51bUNvZGV3b3JkcyA9PSBzaG9ydGVyQmxvY2tzVG90YWxDb2Rld29yZHMpDQoJCXsNCgkJCWJyZWFrOw0KCQl9DQoJCWxvbmdlckJsb2Nrc1N0YXJ0QXQtLTsNCgl9DQoJbG9uZ2VyQmxvY2tzU3RhcnRBdCsrOw0KCQ0KCXZhciBzaG9ydGVyQmxvY2tzTnVtRGF0YUNvZGV3b3JkcyA9IHNob3J0ZXJCbG9ja3NUb3RhbENvZGV3b3JkcyAtIGVjQmxvY2tzLkVDQ29kZXdvcmRzUGVyQmxvY2s7DQoJLy8gVGhlIGxhc3QgZWxlbWVudHMgb2YgcmVzdWx0IG1heSBiZSAxIGVsZW1lbnQgbG9uZ2VyOw0KCS8vIGZpcnN0IGZpbGwgb3V0IGFzIG1hbnkgZWxlbWVudHMgYXMgYWxsIG9mIHRoZW0gaGF2ZQ0KCXZhciByYXdDb2Rld29yZHNPZmZzZXQgPSAwOw0KCWZvciAodmFyIGkgPSAwOyBpIDwgc2hvcnRlckJsb2Nrc051bURhdGFDb2Rld29yZHM7IGkrKykNCgl7DQoJCWZvciAodmFyIGogPSAwOyBqIDwgbnVtUmVzdWx0QmxvY2tzOyBqKyspDQoJCXsNCgkJCXJlc3VsdFtqXS5jb2Rld29yZHNbaV0gPSByYXdDb2Rld29yZHNbcmF3Q29kZXdvcmRzT2Zmc2V0KytdOw0KCQl9DQoJfQ0KCS8vIEZpbGwgb3V0IHRoZSBsYXN0IGRhdGEgYmxvY2sgaW4gdGhlIGxvbmdlciBvbmVzDQoJZm9yICh2YXIgaiA9IGxvbmdlckJsb2Nrc1N0YXJ0QXQ7IGogPCBudW1SZXN1bHRCbG9ja3M7IGorKykNCgl7DQoJCXJlc3VsdFtqXS5jb2Rld29yZHNbc2hvcnRlckJsb2Nrc051bURhdGFDb2Rld29yZHNdID0gcmF3Q29kZXdvcmRzW3Jhd0NvZGV3b3Jkc09mZnNldCsrXTsNCgl9DQoJLy8gTm93IGFkZCBpbiBlcnJvciBjb3JyZWN0aW9uIGJsb2Nrcw0KCXZhciBtYXggPSByZXN1bHRbMF0uY29kZXdvcmRzLmxlbmd0aDsNCglmb3IgKHZhciBpID0gc2hvcnRlckJsb2Nrc051bURhdGFDb2Rld29yZHM7IGkgPCBtYXg7IGkrKykNCgl7DQoJCWZvciAodmFyIGogPSAwOyBqIDwgbnVtUmVzdWx0QmxvY2tzOyBqKyspDQoJCXsNCgkJCXZhciBpT2Zmc2V0ID0gaiA8IGxvbmdlckJsb2Nrc1N0YXJ0QXQ/aTppICsgMTsNCgkJCXJlc3VsdFtqXS5jb2Rld29yZHNbaU9mZnNldF0gPSByYXdDb2Rld29yZHNbcmF3Q29kZXdvcmRzT2Zmc2V0KytdOw0KCQl9DQoJfQ0KCXJldHVybiByZXN1bHQ7DQp9DQo=</uax:ByteString>
		</Value>
	</UAVariable>
	<UAObject NodeId="ns=1;s=SYSTEM" BrowseName="1:SYSTEM">
		<DisplayName Locale="en">SYSTEM</DisplayName>
		<Description Locale="en">SYSTEM</Description>
		<References>
			<Reference ReferenceType="HasComponent" IsForward="false">Objects</Reference>
			<Reference ReferenceType="HasTypeDefinition">FolderType</Reference>
		</References>
		<Extensions>
			<atvise ExportedNodeId="ns=1;s=SYSTEM.LIBRARY.PROJECT.RESOURCES/QRCodeScanner/databr.js" ExportedBrowseName="1:databr.js" Upstream="true"/>
		</Extensions>
	</UAObject>
	<UAObject NodeId="ns=1;s=SYSTEM.LIBRARY" BrowseName="1:LIBRARY">
		<DisplayName Locale="en">LIBRARY</DisplayName>
		<Description Locale="en">LIBRARY</Description>
		<References>
			<Reference ReferenceType="HasComponent" IsForward="false">ns=1;s=SYSTEM</Reference>
			<Reference ReferenceType="HasTypeDefinition">FolderType</Reference>
		</References>
		<Extensions>
			<atvise Upstream="true"/>
		</Extensions>
	</UAObject>
	<UAObject NodeId="ns=1;s=SYSTEM.LIBRARY.PROJECT" BrowseName="1:PROJECT">
		<DisplayName Locale="en">PROJECT</DisplayName>
		<Description Locale="en">PROJECT</Description>
		<References>
			<Reference ReferenceType="HasComponent" IsForward="false">ns=1;s=SYSTEM.LIBRARY</Reference>
			<Reference ReferenceType="HasTypeDefinition">FolderType</Reference>
		</References>
		<Extensions>
			<atvise Upstream="true"/>
		</Extensions>
	</UAObject>
	<UAObject NodeId="ns=1;s=SYSTEM.LIBRARY.PROJECT.RESOURCES" BrowseName="1:RESOURCES">
		<DisplayName Locale="en">RESOURCES</DisplayName>
		<Description Locale="en">RESOURCES</Description>
		<References>
			<Reference ReferenceType="HasComponent" IsForward="false">ns=1;s=SYSTEM.LIBRARY.PROJECT</Reference>
			<Reference ReferenceType="HasTypeDefinition">FolderType</Reference>
		</References>
		<Extensions>
			<atvise Upstream="true"/>
		</Extensions>
	</UAObject>
	<UAObject NodeId="ns=1;s=SYSTEM.LIBRARY.PROJECT.RESOURCES/QRCodeScanner" BrowseName="1:QRCodeScanner">
		<DisplayName Locale="en">QRCodeScanner</DisplayName>
		<Description Locale="en">QRCodeScanner</Description>
		<References>
			<Reference ReferenceType="HasComponent" IsForward="false">ns=1;s=SYSTEM.LIBRARY.PROJECT.RESOURCES</Reference>
			<Reference ReferenceType="HasTypeDefinition">FolderType</Reference>
		</References>
		<Extensions>
			<atvise Upstream="true"/>
		</Extensions>
	</UAObject>
	<UAVariable NodeId="ns=1;s=SYSTEM.LIBRARY.PROJECT.RESOURCES/QRCodeScanner/databr.js" BrowseName="1:databr.js" DataType="ByteString" AccessLevel="103" UserAccessLevel="103" Historizing="true">
		<DisplayName Locale="en">databr.js</DisplayName>
		<Description Locale="en">databr.js</Description>
		<References>
			<Reference ReferenceType="HasComponent" IsForward="false">ns=1;s=SYSTEM.LIBRARY.PROJECT.RESOURCES/QRCodeScanner</Reference>
			<Reference ReferenceType="HasTypeDefinition">ns=1;s=VariableTypes.ATVISE.Resource.Javascript</Reference>
			<Reference ReferenceType="HasProperty">ns=1;s=VariableTypes.ATVISE.Resource.Javascript.Compress</Reference>
		</References>
		<Value>
			<uax:ByteString>LyoNCiAgUG9ydGVkIHRvIEphdmFTY3JpcHQgYnkgTGF6YXIgTGFzemxvIDIwMTEgDQogIA0KICBsYXphcnNvZnRAZ21haWwuY29tLCB3d3cubGF6YXJzb2Z0LmluZm8NCiAgDQoqLw0KDQovKg0KKg0KKiBDb3B5cmlnaHQgMjAwNyBaWGluZyBhdXRob3JzDQoqDQoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOw0KKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuDQoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KKg0KKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KKg0KKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KKi8NCg0KDQpmdW5jdGlvbiBRUkNvZGVEYXRhQmxvY2tSZWFkZXIoYmxvY2tzLCAgdmVyc2lvbiwgIG51bUVycm9yQ29ycmVjdGlvbkNvZGUpDQp7DQoJdGhpcy5ibG9ja1BvaW50ZXIgPSAwOw0KCXRoaXMuYml0UG9pbnRlciA9IDc7DQoJdGhpcy5kYXRhTGVuZ3RoID0gMDsNCgl0aGlzLmJsb2NrcyA9IGJsb2NrczsNCgl0aGlzLm51bUVycm9yQ29ycmVjdGlvbkNvZGUgPSBudW1FcnJvckNvcnJlY3Rpb25Db2RlOw0KCWlmICh2ZXJzaW9uIDw9IDkpDQoJCXRoaXMuZGF0YUxlbmd0aE1vZGUgPSAwOw0KCWVsc2UgaWYgKHZlcnNpb24gPj0gMTAgJiYgdmVyc2lvbiA8PSAyNikNCgkJdGhpcy5kYXRhTGVuZ3RoTW9kZSA9IDE7DQoJZWxzZSBpZiAodmVyc2lvbiA+PSAyNyAmJiB2ZXJzaW9uIDw9IDQwKQ0KCQl0aGlzLmRhdGFMZW5ndGhNb2RlID0gMjsNCgkJDQoJdGhpcy5nZXROZXh0Qml0cyA9IGZ1bmN0aW9uKCBudW1CaXRzKQ0KCQl7CQkJDQoJCQl2YXIgYml0cyA9IDA7DQoJCQlpZiAobnVtQml0cyA8IHRoaXMuYml0UG9pbnRlciArIDEpDQoJCQl7DQoJCQkJLy8gbmV4dCB3b3JkIGZpdHMgaW50byBjdXJyZW50IGRhdGEgYmxvY2sNCgkJCQl2YXIgbWFzayA9IDA7DQoJCQkJZm9yICh2YXIgaSA9IDA7IGkgPCBudW1CaXRzOyBpKyspDQoJCQkJew0KCQkJCQltYXNrICs9ICgxIDw8IGkpOw0KCQkJCX0NCgkJCQltYXNrIDw8PSAodGhpcy5iaXRQb2ludGVyIC0gbnVtQml0cyArIDEpOw0KCQkJCQ0KCQkJCWJpdHMgPSAodGhpcy5ibG9ja3NbdGhpcy5ibG9ja1BvaW50ZXJdICYgbWFzaykgPj4gKHRoaXMuYml0UG9pbnRlciAtIG51bUJpdHMgKyAxKTsNCgkJCQl0aGlzLmJpdFBvaW50ZXIgLT0gbnVtQml0czsNCgkJCQlyZXR1cm4gYml0czsNCgkJCX0NCgkJCWVsc2UgaWYgKG51bUJpdHMgPCB0aGlzLmJpdFBvaW50ZXIgKyAxICsgOCkNCgkJCXsNCgkJCQkvLyBuZXh0IHdvcmQgY3Jvc3NlcyAyIGRhdGEgYmxvY2tzDQoJCQkJdmFyIG1hc2sxID0gMDsNCgkJCQlmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuYml0UG9pbnRlciArIDE7IGkrKykNCgkJCQl7DQoJCQkJCW1hc2sxICs9ICgxIDw8IGkpOw0KCQkJCX0NCgkJCQliaXRzID0gKHRoaXMuYmxvY2tzW3RoaXMuYmxvY2tQb2ludGVyXSAmIG1hc2sxKSA8PCAobnVtQml0cyAtICh0aGlzLmJpdFBvaW50ZXIgKyAxKSk7DQogICAgICAgICAgICAgICAgdGhpcy5ibG9ja1BvaW50ZXIrKzsNCgkJCQliaXRzICs9ICgodGhpcy5ibG9ja3NbdGhpcy5ibG9ja1BvaW50ZXJdKSA+PiAoOCAtIChudW1CaXRzIC0gKHRoaXMuYml0UG9pbnRlciArIDEpKSkpOw0KCQkJCQ0KCQkJCXRoaXMuYml0UG9pbnRlciA9IHRoaXMuYml0UG9pbnRlciAtIG51bUJpdHMgJSA4Ow0KCQkJCWlmICh0aGlzLmJpdFBvaW50ZXIgPCAwKQ0KCQkJCXsNCgkJCQkJdGhpcy5iaXRQb2ludGVyID0gOCArIHRoaXMuYml0UG9pbnRlcjsNCgkJCQl9DQoJCQkJcmV0dXJuIGJpdHM7DQoJCQl9DQoJCQllbHNlIGlmIChudW1CaXRzIDwgdGhpcy5iaXRQb2ludGVyICsgMSArIDE2KQ0KCQkJew0KCQkJCS8vIG5leHQgd29yZCBjcm9zc2VzIDMgZGF0YSBibG9ja3MNCgkJCQl2YXIgbWFzazEgPSAwOyAvLyBtYXNrIG9mIGZpcnN0IGJsb2NrDQoJCQkJdmFyIG1hc2szID0gMDsgLy8gbWFzayBvZiAzcmQgYmxvY2sNCgkJCQkvL2JpdFBvaW50ZXIgKyAxIDogbnVtYmVyIG9mIGJpdHMgb2YgdGhlIDFzdCBibG9jaw0KCQkJCS8vOCA6IG51bWJlciBvZiB0aGUgMm5kIGJsb2NrIChub3RlIHRoYXQgdXNlIGFscmVhZHkgOGJpdHMgYmVjYXVzZSBuZXh0IHdvcmQgdXNlcyAzIGRhdGEgYmxvY2tzKQ0KCQkJCS8vbnVtQml0cyAtIChiaXRQb2ludGVyICsgMSArIDgpIDogbnVtYmVyIG9mIGJpdHMgb2YgdGhlIDNyZCBibG9jayANCgkJCQlmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuYml0UG9pbnRlciArIDE7IGkrKykNCgkJCQl7DQoJCQkJCW1hc2sxICs9ICgxIDw8IGkpOw0KCQkJCX0NCgkJCQl2YXIgYml0c0ZpcnN0QmxvY2sgPSAodGhpcy5ibG9ja3NbdGhpcy5ibG9ja1BvaW50ZXJdICYgbWFzazEpIDw8IChudW1CaXRzIC0gKHRoaXMuYml0UG9pbnRlciArIDEpKTsNCgkJCQl0aGlzLmJsb2NrUG9pbnRlcisrOw0KCQkJCQ0KCQkJCXZhciBiaXRzU2Vjb25kQmxvY2sgPSB0aGlzLmJsb2Nrc1t0aGlzLmJsb2NrUG9pbnRlcl0gPDwgKG51bUJpdHMgLSAodGhpcy5iaXRQb2ludGVyICsgMSArIDgpKTsNCgkJCQl0aGlzLmJsb2NrUG9pbnRlcisrOw0KCQkJCQ0KCQkJCWZvciAodmFyIGkgPSAwOyBpIDwgbnVtQml0cyAtICh0aGlzLmJpdFBvaW50ZXIgKyAxICsgOCk7IGkrKykNCgkJCQl7DQoJCQkJCW1hc2szICs9ICgxIDw8IGkpOw0KCQkJCX0NCgkJCQltYXNrMyA8PD0gOCAtIChudW1CaXRzIC0gKHRoaXMuYml0UG9pbnRlciArIDEgKyA4KSk7DQoJCQkJdmFyIGJpdHNUaGlyZEJsb2NrID0gKHRoaXMuYmxvY2tzW3RoaXMuYmxvY2tQb2ludGVyXSAmIG1hc2szKSA+PiAoOCAtIChudW1CaXRzIC0gKHRoaXMuYml0UG9pbnRlciArIDEgKyA4KSkpOw0KCQkJCQ0KCQkJCWJpdHMgPSBiaXRzRmlyc3RCbG9jayArIGJpdHNTZWNvbmRCbG9jayArIGJpdHNUaGlyZEJsb2NrOw0KCQkJCXRoaXMuYml0UG9pbnRlciA9IHRoaXMuYml0UG9pbnRlciAtIChudW1CaXRzIC0gOCkgJSA4Ow0KCQkJCWlmICh0aGlzLmJpdFBvaW50ZXIgPCAwKQ0KCQkJCXsNCgkJCQkJdGhpcy5iaXRQb2ludGVyID0gOCArIHRoaXMuYml0UG9pbnRlcjsNCgkJCQl9DQoJCQkJcmV0dXJuIGJpdHM7DQoJCQl9DQoJCQllbHNlDQoJCQl7DQoJCQkJcmV0dXJuIDA7DQoJCQl9DQoJCX0NCgl0aGlzLk5leHRNb2RlPWZ1bmN0aW9uKCkNCgl7DQoJCWlmICgodGhpcy5ibG9ja1BvaW50ZXIgPiB0aGlzLmJsb2Nrcy5sZW5ndGggLSB0aGlzLm51bUVycm9yQ29ycmVjdGlvbkNvZGUgLSAyKSkNCgkJCXJldHVybiAwOw0KCQllbHNlDQoJCQlyZXR1cm4gdGhpcy5nZXROZXh0Qml0cyg0KTsNCgl9DQoJdGhpcy5nZXREYXRhTGVuZ3RoPWZ1bmN0aW9uKCBtb2RlSW5kaWNhdG9yKQ0KCQl7DQoJCQl2YXIgaW5kZXggPSAwOw0KCQkJd2hpbGUgKHRydWUpDQoJCQl7DQoJCQkJaWYgKChtb2RlSW5kaWNhdG9yID4+IGluZGV4KSA9PSAxKQ0KCQkJCQlicmVhazsNCgkJCQlpbmRleCsrOw0KCQkJfQ0KCQkJDQoJCQlyZXR1cm4gdGhpcy5nZXROZXh0Qml0cyhxcmNvZGUuc2l6ZU9mRGF0YUxlbmd0aEluZm9bdGhpcy5kYXRhTGVuZ3RoTW9kZV1baW5kZXhdKTsNCgkJfQ0KCXRoaXMuZ2V0Um9tYW5BbmRGaWd1cmVTdHJpbmc9ZnVuY3Rpb24oIGRhdGFMZW5ndGgpDQoJCXsNCgkJCXZhciBsZW5ndGggPSBkYXRhTGVuZ3RoOw0KCQkJdmFyIGludERhdGEgPSAwOw0KCQkJdmFyIHN0ckRhdGEgPSAiIjsNCgkJCXZhciB0YWJsZVJvbWFuQW5kRmlndXJlID0gbmV3IEFycmF5KCcwJywgJzEnLCAnMicsICczJywgJzQnLCAnNScsICc2JywgJzcnLCAnOCcsICc5JywgJ0EnLCAnQicsICdDJywgJ0QnLCAnRScsICdGJywgJ0cnLCAnSCcsICdJJywgJ0onLCAnSycsICdMJywgJ00nLCAnTicsICdPJywgJ1AnLCAnUScsICdSJywgJ1MnLCAnVCcsICdVJywgJ1YnLCAnVycsICdYJywgJ1knLCAnWicsICcgJywgJyQnLCAnJScsICcqJywgJysnLCAnLScsICcuJywgJy8nLCAnOicpOw0KCQkJZG8gDQoJCQl7DQoJCQkJaWYgKGxlbmd0aCA+IDEpDQoJCQkJew0KCQkJCQlpbnREYXRhID0gdGhpcy5nZXROZXh0Qml0cygxMSk7DQoJCQkJCXZhciBmaXJzdExldHRlciA9IE1hdGguZmxvb3IoaW50RGF0YSAvIDQ1KTsNCgkJCQkJdmFyIHNlY29uZExldHRlciA9IGludERhdGEgJSA0NTsNCgkJCQkJc3RyRGF0YSArPSB0YWJsZVJvbWFuQW5kRmlndXJlW2ZpcnN0TGV0dGVyXTsNCgkJCQkJc3RyRGF0YSArPSB0YWJsZVJvbWFuQW5kRmlndXJlW3NlY29uZExldHRlcl07DQoJCQkJCWxlbmd0aCAtPSAyOw0KCQkJCX0NCgkJCQllbHNlIGlmIChsZW5ndGggPT0gMSkNCgkJCQl7DQoJCQkJCWludERhdGEgPSB0aGlzLmdldE5leHRCaXRzKDYpOw0KCQkJCQlzdHJEYXRhICs9IHRhYmxlUm9tYW5BbmRGaWd1cmVbaW50RGF0YV07DQoJCQkJCWxlbmd0aCAtPSAxOw0KCQkJCX0NCgkJCX0NCgkJCXdoaWxlIChsZW5ndGggPiAwKTsNCgkJCQ0KCQkJcmV0dXJuIHN0ckRhdGE7DQoJCX0NCgl0aGlzLmdldEZpZ3VyZVN0cmluZz1mdW5jdGlvbiggZGF0YUxlbmd0aCkNCgkJew0KCQkJdmFyIGxlbmd0aCA9IGRhdGFMZW5ndGg7DQoJCQl2YXIgaW50RGF0YSA9IDA7DQoJCQl2YXIgc3RyRGF0YSA9ICIiOw0KCQkJZG8gDQoJCQl7DQoJCQkJaWYgKGxlbmd0aCA+PSAzKQ0KCQkJCXsNCgkJCQkJaW50RGF0YSA9IHRoaXMuZ2V0TmV4dEJpdHMoMTApOw0KCQkJCQlpZiAoaW50RGF0YSA8IDEwMCkNCgkJCQkJCXN0ckRhdGEgKz0gIjAiOw0KCQkJCQlpZiAoaW50RGF0YSA8IDEwKQ0KCQkJCQkJc3RyRGF0YSArPSAiMCI7DQoJCQkJCWxlbmd0aCAtPSAzOw0KCQkJCX0NCgkJCQllbHNlIGlmIChsZW5ndGggPT0gMikNCgkJCQl7DQoJCQkJCWludERhdGEgPSB0aGlzLmdldE5leHRCaXRzKDcpOw0KCQkJCQlpZiAoaW50RGF0YSA8IDEwKQ0KCQkJCQkJc3RyRGF0YSArPSAiMCI7DQoJCQkJCWxlbmd0aCAtPSAyOw0KCQkJCX0NCgkJCQllbHNlIGlmIChsZW5ndGggPT0gMSkNCgkJCQl7DQoJCQkJCWludERhdGEgPSB0aGlzLmdldE5leHRCaXRzKDQpOw0KCQkJCQlsZW5ndGggLT0gMTsNCgkJCQl9DQoJCQkJc3RyRGF0YSArPSBpbnREYXRhOw0KCQkJfQ0KCQkJd2hpbGUgKGxlbmd0aCA+IDApOw0KCQkJDQoJCQlyZXR1cm4gc3RyRGF0YTsNCgkJfQ0KCXRoaXMuZ2V0OGJpdEJ5dGVBcnJheT1mdW5jdGlvbiggZGF0YUxlbmd0aCkNCgkJew0KCQkJdmFyIGxlbmd0aCA9IGRhdGFMZW5ndGg7DQoJCQl2YXIgaW50RGF0YSA9IDA7DQoJCQl2YXIgb3V0cHV0ID0gbmV3IEFycmF5KCk7DQoJCQkNCgkJCWRvIA0KCQkJew0KCQkJCWludERhdGEgPSB0aGlzLmdldE5leHRCaXRzKDgpOw0KCQkJCW91dHB1dC5wdXNoKCBpbnREYXRhKTsNCgkJCQlsZW5ndGgtLTsNCgkJCX0NCgkJCXdoaWxlIChsZW5ndGggPiAwKTsNCgkJCXJldHVybiBvdXRwdXQ7DQoJCX0NCiAgICB0aGlzLmdldEthbmppU3RyaW5nPWZ1bmN0aW9uKCBkYXRhTGVuZ3RoKQ0KCQl7DQoJCQl2YXIgbGVuZ3RoID0gZGF0YUxlbmd0aDsNCgkJCXZhciBpbnREYXRhID0gMDsNCgkJCXZhciB1bmljb2RlU3RyaW5nID0gIiI7DQoJCQlkbyANCgkJCXsNCgkJCQlpbnREYXRhID0gdGhpcy5nZXROZXh0Qml0cygxMyk7DQoJCQkJdmFyIGxvd2VyQnl0ZSA9IGludERhdGEgJSAweEMwOw0KCQkJCXZhciBoaWdoZXJCeXRlID0gaW50RGF0YSAvIDB4QzA7DQoJCQkJDQoJCQkJdmFyIHRlbXBXb3JkID0gKGhpZ2hlckJ5dGUgPDwgOCkgKyBsb3dlckJ5dGU7DQoJCQkJdmFyIHNoaWZ0amlzV29yZCA9IDA7DQoJCQkJaWYgKHRlbXBXb3JkICsgMHg4MTQwIDw9IDB4OUZGQykNCgkJCQl7DQoJCQkJCS8vIGJldHdlZW4gODE0MCAtIDlGRkMgb24gU2hpZnRfSklTIGNoYXJhY3RlciBzZXQNCgkJCQkJc2hpZnRqaXNXb3JkID0gdGVtcFdvcmQgKyAweDgxNDA7DQoJCQkJfQ0KCQkJCWVsc2UNCgkJCQl7DQoJCQkJCS8vIGJldHdlZW4gRTA0MCAtIEVCQkYgb24gU2hpZnRfSklTIGNoYXJhY3RlciBzZXQNCgkJCQkJc2hpZnRqaXNXb3JkID0gdGVtcFdvcmQgKyAweEMxNDA7DQoJCQkJfQ0KCQkJCQ0KCQkJCS8vdmFyIHRlbXBCeXRlID0gbmV3IEFycmF5KDAsMCk7DQoJCQkJLy90ZW1wQnl0ZVswXSA9IChzYnl0ZSkgKHNoaWZ0amlzV29yZCA+PiA4KTsNCgkJCQkvL3RlbXBCeXRlWzFdID0gKHNieXRlKSAoc2hpZnRqaXNXb3JkICYgMHhGRik7DQoJCQkJLy91bmljb2RlU3RyaW5nICs9IG5ldyBTdHJpbmcoU3lzdGVtVXRpbHMuVG9DaGFyQXJyYXkoU3lzdGVtVXRpbHMuVG9CeXRlQXJyYXkodGVtcEJ5dGUpKSk7DQogICAgICAgICAgICAgICAgdW5pY29kZVN0cmluZyArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKHNoaWZ0amlzV29yZCk7DQoJCQkJbGVuZ3RoLS07DQoJCQl9DQoJCQl3aGlsZSAobGVuZ3RoID4gMCk7DQoJCQkNCgkJCQ0KCQkJcmV0dXJuIHVuaWNvZGVTdHJpbmc7DQoJCX0NCg0KCXRoaXMucGFyc2VFQ0lWYWx1ZSA9IGZ1bmN0aW9uICgpDQoJew0KCQl2YXIgaW50RGF0YSA9IDA7DQoJCXZhciBmaXJzdEJ5dGUgPSB0aGlzLmdldE5leHRCaXRzKDgpOw0KCQlpZiAoKGZpcnN0Qnl0ZSAmIDB4ODApID09IDApIHsNCgkJCWludERhdGEgPSBmaXJzdEJ5dGUgJiAweDdGOw0KCQl9DQoJCWlmICgoZmlyc3RCeXRlICYgMHhDMCkgPT0gMHg4MCkgew0KCQkJLy8gdHdvIGJ5dGVzDQoJCQl2YXIgc2Vjb25kQnl0ZSA9IHRoaXMuZ2V0TmV4dEJpdHMoOCk7DQoJCQlpbnREYXRhID0gKChmaXJzdEJ5dGUgJiAweDNGKSA8PCA4KSB8IHNlY29uZEJ5dGU7DQoJCX0NCgkJaWYgKChmaXJzdEJ5dGUgJiAweEUwKSA9PSAweEMwKSB7DQoJCQkvLyB0aHJlZSBieXRlcw0KCQkJdmFyIHNlY29uZFRoaXJkQnl0ZXMgPSB0aGlzLmdldE5leHRCaXRzKDgpOzsNCgkJCWludERhdGEgPSAoKGZpcnN0Qnl0ZSAmIDB4MUYpIDw8IDE2KSB8IHNlY29uZFRoaXJkQnl0ZXM7DQoJCX0NCgkJcmV0dXJuIGludERhdGE7DQoJfQ0KDQoJdGhpcy5fX2RlZmluZUdldHRlcl9fKCJEYXRhQnl0ZSIsIGZ1bmN0aW9uKCkNCgl7DQoJCXZhciBvdXRwdXQgPSBuZXcgQXJyYXkoKTsNCgkJdmFyIE1PREVfTlVNQkVSID0gMTsNCgkgICAgdmFyIE1PREVfUk9NQU5fQU5EX05VTUJFUiA9IDI7DQoJICAgIHZhciBNT0RFXzhCSVRfQllURSA9IDQ7DQoJCXZhciBNT0RFX0VDSSA9IDc7DQoJICAgIHZhciBNT0RFX0tBTkpJID0gODsNCgkJZG8gDQoJCQkJCXsNCgkJCQkJCXZhciBtb2RlID0gdGhpcy5OZXh0TW9kZSgpOw0KCQkJCQkJLy9jYW52YXMucHJpbnRsbigibW9kZTogIiArIG1vZGUpOw0KCQkJCQkJaWYgKG1vZGUgPT0gMCkNCgkJCQkJCXsNCgkJCQkJCQlpZiAob3V0cHV0Lmxlbmd0aCA+IDApDQoJCQkJCQkJCWJyZWFrOw0KCQkJCQkJCWVsc2UNCgkJCQkJCQkJdGhyb3cgIkVtcHR5IGRhdGEgYmxvY2siOw0KCQkJCQkJfQ0KCQkJCQkJaWYgKG1vZGUgIT0gTU9ERV9OVU1CRVIgJiYgbW9kZSAhPSBNT0RFX1JPTUFOX0FORF9OVU1CRVIgJiYgbW9kZSAhPSBNT0RFXzhCSVRfQllURSAmJiBtb2RlICE9IE1PREVfS0FOSkkgJiYgbW9kZSAhPSBNT0RFX0VDSSkNCgkJCQkJCXsNCgkJCQkJCQl0aHJvdyAiSW52YWxpZCBtb2RlOiAiICsgbW9kZSArICIgaW4gKGJsb2NrOiIgKyB0aGlzLmJsb2NrUG9pbnRlciArICIgYml0OiIgKyB0aGlzLmJpdFBvaW50ZXIgKyAiKSI7DQoJCQkJCQl9DQoNCgkJCQkJCWlmKG1vZGUgPT0gTU9ERV9FQ0kpDQoJCQkJCQl7DQoJCQkJCQkJdmFyIHRlbXBfc2J5dGVBcnJheTMgPSB0aGlzLnBhcnNlRUNJVmFsdWUoKTsNCgkJCQkJCQkvL291dHB1dC5wdXNoKHRlbXBfc2J5dGVBcnJheTMpOw0KCQkJCQkJfQ0KCQkJCQkJZWxzZQ0KCQkJCQkJew0KDQoJCQkJCQkJdmFyIGRhdGFMZW5ndGggPSB0aGlzLmdldERhdGFMZW5ndGgobW9kZSk7DQoJCQkJCQkJaWYgKGRhdGFMZW5ndGggPCAxKQ0KCQkJCQkJCQl0aHJvdyAiSW52YWxpZCBkYXRhIGxlbmd0aDogIiArIGRhdGFMZW5ndGg7DQoJCQkJCQkJc3dpdGNoIChtb2RlKQ0KCQkJCQkJCXsNCgkJCQkJCQkJDQoJCQkJCQkJCWNhc2UgTU9ERV9OVU1CRVI6IA0KCQkJCQkJCQkJdmFyIHRlbXBfc3RyID0gdGhpcy5nZXRGaWd1cmVTdHJpbmcoZGF0YUxlbmd0aCk7DQoJCQkJCQkJCQl2YXIgdGEgPSBuZXcgQXJyYXkodGVtcF9zdHIubGVuZ3RoKTsNCgkJCQkJCQkJCWZvcih2YXIgaj0wO2o8dGVtcF9zdHIubGVuZ3RoO2orKykNCgkJCQkJCQkJCQl0YVtqXT10ZW1wX3N0ci5jaGFyQ29kZUF0KGopOw0KCQkJCQkJCQkJb3V0cHV0LnB1c2godGEpOw0KCQkJCQkJCQkJYnJlYWs7DQoJCQkJCQkJCQ0KCQkJCQkJCQljYXNlIE1PREVfUk9NQU5fQU5EX05VTUJFUjogDQoJCQkJCQkJCQl2YXIgdGVtcF9zdHIgPSB0aGlzLmdldFJvbWFuQW5kRmlndXJlU3RyaW5nKGRhdGFMZW5ndGgpOw0KCQkJCQkJCQkJdmFyIHRhID0gbmV3IEFycmF5KHRlbXBfc3RyLmxlbmd0aCk7DQoJCQkJCQkJCQlmb3IodmFyIGo9MDtqPHRlbXBfc3RyLmxlbmd0aDtqKyspDQoJCQkJCQkJCQkJdGFbal09dGVtcF9zdHIuY2hhckNvZGVBdChqKTsNCgkJCQkJCQkJCW91dHB1dC5wdXNoKHRhICk7DQoJCQkJCQkJCQlicmVhazsNCgkJCQkJCQkJDQoJCQkJCQkJCWNhc2UgTU9ERV84QklUX0JZVEU6IA0KCQkJCQkJCQkJdmFyIHRlbXBfc2J5dGVBcnJheTMgPSB0aGlzLmdldDhiaXRCeXRlQXJyYXkoZGF0YUxlbmd0aCk7DQoJCQkJCQkJCQlvdXRwdXQucHVzaCh0ZW1wX3NieXRlQXJyYXkzKTsNCgkJCQkJCQkJCWJyZWFrOw0KCQkJCQkJCQkNCgkJCQkJCQkJY2FzZSBNT0RFX0tBTkpJOiANCgkJCQkJCQkJCXZhciB0ZW1wX3N0ciA9IHRoaXMuZ2V0S2FuamlTdHJpbmcoZGF0YUxlbmd0aCk7DQoJCQkJCQkJCQlvdXRwdXQucHVzaCh0ZW1wX3N0cik7DQoJCQkJCQkJCQlicmVhazsNCgkJCQkJCQl9DQoJCQkJCQl9DQoJCQkJCX0NCgkJCQkJd2hpbGUgKHRydWUpOw0KCQlyZXR1cm4gb3V0cHV0Ow0KCX0pOw0KfQ0K</uax:ByteString>
		</Value>
	</UAVariable>
	<UAObject NodeId="ns=1;s=SYSTEM" BrowseName="1:SYSTEM">
		<DisplayName Locale="en">SYSTEM</DisplayName>
		<Description Locale="en">SYSTEM</Description>
		<References>
			<Reference ReferenceType="HasComponent" IsForward="false">Objects</Reference>
			<Reference ReferenceType="HasTypeDefinition">FolderType</Reference>
		</References>
		<Extensions>
			<atvise ExportedNodeId="ns=1;s=SYSTEM.LIBRARY.PROJECT.RESOURCES/QRCodeScanner/datamask.js" ExportedBrowseName="1:datamask.js" Upstream="true"/>
		</Extensions>
	</UAObject>
	<UAObject NodeId="ns=1;s=SYSTEM.LIBRARY" BrowseName="1:LIBRARY">
		<DisplayName Locale="en">LIBRARY</DisplayName>
		<Description Locale="en">LIBRARY</Description>
		<References>
			<Reference ReferenceType="HasComponent" IsForward="false">ns=1;s=SYSTEM</Reference>
			<Reference ReferenceType="HasTypeDefinition">FolderType</Reference>
		</References>
		<Extensions>
			<atvise Upstream="true"/>
		</Extensions>
	</UAObject>
	<UAObject NodeId="ns=1;s=SYSTEM.LIBRARY.PROJECT" BrowseName="1:PROJECT">
		<DisplayName Locale="en">PROJECT</DisplayName>
		<Description Locale="en">PROJECT</Description>
		<References>
			<Reference ReferenceType="HasComponent" IsForward="false">ns=1;s=SYSTEM.LIBRARY</Reference>
			<Reference ReferenceType="HasTypeDefinition">FolderType</Reference>
		</References>
		<Extensions>
			<atvise Upstream="true"/>
		</Extensions>
	</UAObject>
	<UAObject NodeId="ns=1;s=SYSTEM.LIBRARY.PROJECT.RESOURCES" BrowseName="1:RESOURCES">
		<DisplayName Locale="en">RESOURCES</DisplayName>
		<Description Locale="en">RESOURCES</Description>
		<References>
			<Reference ReferenceType="HasComponent" IsForward="false">ns=1;s=SYSTEM.LIBRARY.PROJECT</Reference>
			<Reference ReferenceType="HasTypeDefinition">FolderType</Reference>
		</References>
		<Extensions>
			<atvise Upstream="true"/>
		</Extensions>
	</UAObject>
	<UAObject NodeId="ns=1;s=SYSTEM.LIBRARY.PROJECT.RESOURCES/QRCodeScanner" BrowseName="1:QRCodeScanner">
		<DisplayName Locale="en">QRCodeScanner</DisplayName>
		<Description Locale="en">QRCodeScanner</Description>
		<References>
			<Reference ReferenceType="HasComponent" IsForward="false">ns=1;s=SYSTEM.LIBRARY.PROJECT.RESOURCES</Reference>
			<Reference ReferenceType="HasTypeDefinition">FolderType</Reference>
		</References>
		<Extensions>
			<atvise Upstream="true"/>
		</Extensions>
	</UAObject>
	<UAVariable NodeId="ns=1;s=SYSTEM.LIBRARY.PROJECT.RESOURCES/QRCodeScanner/datamask.js" BrowseName="1:datamask.js" DataType="ByteString" AccessLevel="103" UserAccessLevel="103" Historizing="true">
		<DisplayName Locale="en">datamask.js</DisplayName>
		<Description Locale="en">datamask.js</Description>
		<References>
			<Reference ReferenceType="HasComponent" IsForward="false">ns=1;s=SYSTEM.LIBRARY.PROJECT.RESOURCES/QRCodeScanner</Reference>
			<Reference ReferenceType="HasTypeDefinition">ns=1;s=VariableTypes.ATVISE.Resource.Javascript</Reference>
			<Reference ReferenceType="HasProperty">ns=1;s=VariableTypes.ATVISE.Resource.Javascript.Compress</Reference>
		</References>
		<Value>
			<uax:ByteString>LyoNCiAgUG9ydGVkIHRvIEphdmFTY3JpcHQgYnkgTGF6YXIgTGFzemxvIDIwMTEgDQogIA0KICBsYXphcnNvZnRAZ21haWwuY29tLCB3d3cubGF6YXJzb2Z0LmluZm8NCiAgDQoqLw0KDQovKg0KKg0KKiBDb3B5cmlnaHQgMjAwNyBaWGluZyBhdXRob3JzDQoqDQoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOw0KKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuDQoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KKg0KKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KKg0KKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KKi8NCg0KDQp2YXIgRGF0YU1hc2sgPSB7fTsNCg0KRGF0YU1hc2suZm9yUmVmZXJlbmNlID0gZnVuY3Rpb24ocmVmZXJlbmNlKQ0Kew0KCWlmIChyZWZlcmVuY2UgPCAwIHx8IHJlZmVyZW5jZSA+IDcpDQoJew0KCQl0aHJvdyAiU3lzdGVtLkFyZ3VtZW50RXhjZXB0aW9uIjsNCgl9DQoJcmV0dXJuIERhdGFNYXNrLkRBVEFfTUFTS1NbcmVmZXJlbmNlXTsNCn0NCg0KZnVuY3Rpb24gRGF0YU1hc2swMDAoKQ0Kew0KCXRoaXMudW5tYXNrQml0TWF0cml4PWZ1bmN0aW9uKGJpdHMsICBkaW1lbnNpb24pDQoJew0KCQlmb3IgKHZhciBpID0gMDsgaSA8IGRpbWVuc2lvbjsgaSsrKQ0KCQl7DQoJCQlmb3IgKHZhciBqID0gMDsgaiA8IGRpbWVuc2lvbjsgaisrKQ0KCQkJew0KCQkJCWlmICh0aGlzLmlzTWFza2VkKGksIGopKQ0KCQkJCXsNCgkJCQkJYml0cy5mbGlwKGosIGkpOw0KCQkJCX0NCgkJCX0NCgkJfQ0KCX0NCgl0aGlzLmlzTWFza2VkPWZ1bmN0aW9uKCBpLCAgaikNCgl7DQoJCXJldHVybiAoKGkgKyBqKSAmIDB4MDEpID09IDA7DQoJfQ0KfQ0KDQpmdW5jdGlvbiBEYXRhTWFzazAwMSgpDQp7DQoJdGhpcy51bm1hc2tCaXRNYXRyaXg9ZnVuY3Rpb24oYml0cywgIGRpbWVuc2lvbikNCgl7DQoJCWZvciAodmFyIGkgPSAwOyBpIDwgZGltZW5zaW9uOyBpKyspDQoJCXsNCgkJCWZvciAodmFyIGogPSAwOyBqIDwgZGltZW5zaW9uOyBqKyspDQoJCQl7DQoJCQkJaWYgKHRoaXMuaXNNYXNrZWQoaSwgaikpDQoJCQkJew0KCQkJCQliaXRzLmZsaXAoaiwgaSk7DQoJCQkJfQ0KCQkJfQ0KCQl9DQoJfQ0KCXRoaXMuaXNNYXNrZWQ9ZnVuY3Rpb24oIGksICBqKQ0KCXsNCgkJcmV0dXJuIChpICYgMHgwMSkgPT0gMDsNCgl9DQp9DQoNCmZ1bmN0aW9uIERhdGFNYXNrMDEwKCkNCnsNCgl0aGlzLnVubWFza0JpdE1hdHJpeD1mdW5jdGlvbihiaXRzLCAgZGltZW5zaW9uKQ0KCXsNCgkJZm9yICh2YXIgaSA9IDA7IGkgPCBkaW1lbnNpb247IGkrKykNCgkJew0KCQkJZm9yICh2YXIgaiA9IDA7IGogPCBkaW1lbnNpb247IGorKykNCgkJCXsNCgkJCQlpZiAodGhpcy5pc01hc2tlZChpLCBqKSkNCgkJCQl7DQoJCQkJCWJpdHMuZmxpcChqLCBpKTsNCgkJCQl9DQoJCQl9DQoJCX0NCgl9DQoJdGhpcy5pc01hc2tlZD1mdW5jdGlvbiggaSwgIGopDQoJew0KCQlyZXR1cm4gaiAlIDMgPT0gMDsNCgl9DQp9DQoNCmZ1bmN0aW9uIERhdGFNYXNrMDExKCkNCnsNCgl0aGlzLnVubWFza0JpdE1hdHJpeD1mdW5jdGlvbihiaXRzLCAgZGltZW5zaW9uKQ0KCXsNCgkJZm9yICh2YXIgaSA9IDA7IGkgPCBkaW1lbnNpb247IGkrKykNCgkJew0KCQkJZm9yICh2YXIgaiA9IDA7IGogPCBkaW1lbnNpb247IGorKykNCgkJCXsNCgkJCQlpZiAodGhpcy5pc01hc2tlZChpLCBqKSkNCgkJCQl7DQoJCQkJCWJpdHMuZmxpcChqLCBpKTsNCgkJCQl9DQoJCQl9DQoJCX0NCgl9DQoJdGhpcy5pc01hc2tlZD1mdW5jdGlvbiggaSwgIGopDQoJew0KCQlyZXR1cm4gKGkgKyBqKSAlIDMgPT0gMDsNCgl9DQp9DQoNCmZ1bmN0aW9uIERhdGFNYXNrMTAwKCkNCnsNCgl0aGlzLnVubWFza0JpdE1hdHJpeD1mdW5jdGlvbihiaXRzLCAgZGltZW5zaW9uKQ0KCXsNCgkJZm9yICh2YXIgaSA9IDA7IGkgPCBkaW1lbnNpb247IGkrKykNCgkJew0KCQkJZm9yICh2YXIgaiA9IDA7IGogPCBkaW1lbnNpb247IGorKykNCgkJCXsNCgkJCQlpZiAodGhpcy5pc01hc2tlZChpLCBqKSkNCgkJCQl7DQoJCQkJCWJpdHMuZmxpcChqLCBpKTsNCgkJCQl9DQoJCQl9DQoJCX0NCgl9DQoJdGhpcy5pc01hc2tlZD1mdW5jdGlvbiggaSwgIGopDQoJew0KCQlyZXR1cm4gKCgoVVJTaGlmdChpLCAxKSkgKyAoaiAvIDMpKSAmIDB4MDEpID09IDA7DQoJfQ0KfQ0KDQpmdW5jdGlvbiBEYXRhTWFzazEwMSgpDQp7DQoJdGhpcy51bm1hc2tCaXRNYXRyaXg9ZnVuY3Rpb24oYml0cywgIGRpbWVuc2lvbikNCgl7DQoJCWZvciAodmFyIGkgPSAwOyBpIDwgZGltZW5zaW9uOyBpKyspDQoJCXsNCgkJCWZvciAodmFyIGogPSAwOyBqIDwgZGltZW5zaW9uOyBqKyspDQoJCQl7DQoJCQkJaWYgKHRoaXMuaXNNYXNrZWQoaSwgaikpDQoJCQkJew0KCQkJCQliaXRzLmZsaXAoaiwgaSk7DQoJCQkJfQ0KCQkJfQ0KCQl9DQoJfQ0KCXRoaXMuaXNNYXNrZWQ9ZnVuY3Rpb24oIGksICBqKQ0KCXsNCgkJdmFyIHRlbXAgPSBpICogajsNCgkJcmV0dXJuICh0ZW1wICYgMHgwMSkgKyAodGVtcCAlIDMpID09IDA7DQoJfQ0KfQ0KDQpmdW5jdGlvbiBEYXRhTWFzazExMCgpDQp7DQoJdGhpcy51bm1hc2tCaXRNYXRyaXg9ZnVuY3Rpb24oYml0cywgIGRpbWVuc2lvbikNCgl7DQoJCWZvciAodmFyIGkgPSAwOyBpIDwgZGltZW5zaW9uOyBpKyspDQoJCXsNCgkJCWZvciAodmFyIGogPSAwOyBqIDwgZGltZW5zaW9uOyBqKyspDQoJCQl7DQoJCQkJaWYgKHRoaXMuaXNNYXNrZWQoaSwgaikpDQoJCQkJew0KCQkJCQliaXRzLmZsaXAoaiwgaSk7DQoJCQkJfQ0KCQkJfQ0KCQl9DQoJfQ0KCXRoaXMuaXNNYXNrZWQ9ZnVuY3Rpb24oIGksICBqKQ0KCXsNCgkJdmFyIHRlbXAgPSBpICogajsNCgkJcmV0dXJuICgoKHRlbXAgJiAweDAxKSArICh0ZW1wICUgMykpICYgMHgwMSkgPT0gMDsNCgl9DQp9DQpmdW5jdGlvbiBEYXRhTWFzazExMSgpDQp7DQoJdGhpcy51bm1hc2tCaXRNYXRyaXg9ZnVuY3Rpb24oYml0cywgIGRpbWVuc2lvbikNCgl7DQoJCWZvciAodmFyIGkgPSAwOyBpIDwgZGltZW5zaW9uOyBpKyspDQoJCXsNCgkJCWZvciAodmFyIGogPSAwOyBqIDwgZGltZW5zaW9uOyBqKyspDQoJCQl7DQoJCQkJaWYgKHRoaXMuaXNNYXNrZWQoaSwgaikpDQoJCQkJew0KCQkJCQliaXRzLmZsaXAoaiwgaSk7DQoJCQkJfQ0KCQkJfQ0KCQl9DQoJfQ0KCXRoaXMuaXNNYXNrZWQ9ZnVuY3Rpb24oIGksICBqKQ0KCXsNCgkJcmV0dXJuICgoKChpICsgaikgJiAweDAxKSArICgoaSAqIGopICUgMykpICYgMHgwMSkgPT0gMDsNCgl9DQp9DQoNCkRhdGFNYXNrLkRBVEFfTUFTS1MgPSBuZXcgQXJyYXkobmV3IERhdGFNYXNrMDAwKCksIG5ldyBEYXRhTWFzazAwMSgpLCBuZXcgRGF0YU1hc2swMTAoKSwgbmV3IERhdGFNYXNrMDExKCksIG5ldyBEYXRhTWFzazEwMCgpLCBuZXcgRGF0YU1hc2sxMDEoKSwgbmV3IERhdGFNYXNrMTEwKCksIG5ldyBEYXRhTWFzazExMSgpKTsNCg0K</uax:ByteString>
		</Value>
	</UAVariable>
	<UAObject NodeId="ns=1;s=SYSTEM" BrowseName="1:SYSTEM">
		<DisplayName Locale="en">SYSTEM</DisplayName>
		<Description Locale="en">SYSTEM</Description>
		<References>
			<Reference ReferenceType="HasComponent" IsForward="false">Objects</Reference>
			<Reference ReferenceType="HasTypeDefinition">FolderType</Reference>
		</References>
		<Extensions>
			<atvise ExportedNodeId="ns=1;s=SYSTEM.LIBRARY.PROJECT.RESOURCES/QRCodeScanner/decoder.js" ExportedBrowseName="1:decoder.js" Upstream="true"/>
		</Extensions>
	</UAObject>
	<UAObject NodeId="ns=1;s=SYSTEM.LIBRARY" BrowseName="1:LIBRARY">
		<DisplayName Locale="en">LIBRARY</DisplayName>
		<Description Locale="en">LIBRARY</Description>
		<References>
			<Reference ReferenceType="HasComponent" IsForward="false">ns=1;s=SYSTEM</Reference>
			<Reference ReferenceType="HasTypeDefinition">FolderType</Reference>
		</References>
		<Extensions>
			<atvise Upstream="true"/>
		</Extensions>
	</UAObject>
	<UAObject NodeId="ns=1;s=SYSTEM.LIBRARY.PROJECT" BrowseName="1:PROJECT">
		<DisplayName Locale="en">PROJECT</DisplayName>
		<Description Locale="en">PROJECT</Description>
		<References>
			<Reference ReferenceType="HasComponent" IsForward="false">ns=1;s=SYSTEM.LIBRARY</Reference>
			<Reference ReferenceType="HasTypeDefinition">FolderType</Reference>
		</References>
		<Extensions>
			<atvise Upstream="true"/>
		</Extensions>
	</UAObject>
	<UAObject NodeId="ns=1;s=SYSTEM.LIBRARY.PROJECT.RESOURCES" BrowseName="1:RESOURCES">
		<DisplayName Locale="en">RESOURCES</DisplayName>
		<Description Locale="en">RESOURCES</Description>
		<References>
			<Reference ReferenceType="HasComponent" IsForward="false">ns=1;s=SYSTEM.LIBRARY.PROJECT</Reference>
			<Reference ReferenceType="HasTypeDefinition">FolderType</Reference>
		</References>
		<Extensions>
			<atvise Upstream="true"/>
		</Extensions>
	</UAObject>
	<UAObject NodeId="ns=1;s=SYSTEM.LIBRARY.PROJECT.RESOURCES/QRCodeScanner" BrowseName="1:QRCodeScanner">
		<DisplayName Locale="en">QRCodeScanner</DisplayName>
		<Description Locale="en">QRCodeScanner</Description>
		<References>
			<Reference ReferenceType="HasComponent" IsForward="false">ns=1;s=SYSTEM.LIBRARY.PROJECT.RESOURCES</Reference>
			<Reference ReferenceType="HasTypeDefinition">FolderType</Reference>
		</References>
		<Extensions>
			<atvise Upstream="true"/>
		</Extensions>
	</UAObject>
	<UAVariable NodeId="ns=1;s=SYSTEM.LIBRARY.PROJECT.RESOURCES/QRCodeScanner/decoder.js" BrowseName="1:decoder.js" DataType="ByteString" AccessLevel="103" UserAccessLevel="103" Historizing="true">
		<DisplayName Locale="en">decoder.js</DisplayName>
		<Description Locale="en">decoder.js</Description>
		<References>
			<Reference ReferenceType="HasComponent" IsForward="false">ns=1;s=SYSTEM.LIBRARY.PROJECT.RESOURCES/QRCodeScanner</Reference>
			<Reference ReferenceType="HasTypeDefinition">ns=1;s=VariableTypes.ATVISE.Resource.Javascript</Reference>
			<Reference ReferenceType="HasProperty">ns=1;s=VariableTypes.ATVISE.Resource.Javascript.Compress</Reference>
		</References>
		<Value>
			<uax:ByteString>LyoNCiAgUG9ydGVkIHRvIEphdmFTY3JpcHQgYnkgTGF6YXIgTGFzemxvIDIwMTEgDQogIA0KICBsYXphcnNvZnRAZ21haWwuY29tLCB3d3cubGF6YXJzb2Z0LmluZm8NCiAgDQoqLw0KDQovKg0KKg0KKiBDb3B5cmlnaHQgMjAwNyBaWGluZyBhdXRob3JzDQoqDQoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOw0KKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuDQoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KKg0KKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KKg0KKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KKi8NCg0KDQp2YXIgRGVjb2Rlcj17fTsNCkRlY29kZXIucnNEZWNvZGVyID0gbmV3IFJlZWRTb2xvbW9uRGVjb2RlcihHRjI1Ni5RUl9DT0RFX0ZJRUxEKTsNCg0KRGVjb2Rlci5jb3JyZWN0RXJyb3JzPWZ1bmN0aW9uKCBjb2Rld29yZEJ5dGVzLCAgbnVtRGF0YUNvZGV3b3JkcykNCnsNCgl2YXIgbnVtQ29kZXdvcmRzID0gY29kZXdvcmRCeXRlcy5sZW5ndGg7DQoJLy8gRmlyc3QgcmVhZCBpbnRvIGFuIGFycmF5IG9mIGludHMNCgl2YXIgY29kZXdvcmRzSW50cyA9IG5ldyBBcnJheShudW1Db2Rld29yZHMpOw0KCWZvciAodmFyIGkgPSAwOyBpIDwgbnVtQ29kZXdvcmRzOyBpKyspDQoJew0KCQljb2Rld29yZHNJbnRzW2ldID0gY29kZXdvcmRCeXRlc1tpXSAmIDB4RkY7DQoJfQ0KCXZhciBudW1FQ0NvZGV3b3JkcyA9IGNvZGV3b3JkQnl0ZXMubGVuZ3RoIC0gbnVtRGF0YUNvZGV3b3JkczsNCgl0cnkNCgl7DQoJCURlY29kZXIucnNEZWNvZGVyLmRlY29kZShjb2Rld29yZHNJbnRzLCBudW1FQ0NvZGV3b3Jkcyk7DQoJCS8vdmFyIGNvcnJlY3RvciA9IG5ldyBSZWVkU29sb21vbihjb2Rld29yZHNJbnRzLCBudW1FQ0NvZGV3b3Jkcyk7DQoJCS8vY29ycmVjdG9yLmNvcnJlY3QoKTsNCgl9DQoJY2F0Y2ggKCByc2UpDQoJew0KCQl0aHJvdyByc2U7DQoJfQ0KCS8vIENvcHkgYmFjayBpbnRvIGFycmF5IG9mIGJ5dGVzIC0tIG9ubHkgbmVlZCB0byB3b3JyeSBhYm91dCB0aGUgYnl0ZXMgdGhhdCB3ZXJlIGRhdGENCgkvLyBXZSBkb24ndCBjYXJlIGFib3V0IGVycm9ycyBpbiB0aGUgZXJyb3ItY29ycmVjdGlvbiBjb2Rld29yZHMNCglmb3IgKHZhciBpID0gMDsgaSA8IG51bURhdGFDb2Rld29yZHM7IGkrKykNCgl7DQoJCWNvZGV3b3JkQnl0ZXNbaV0gPSAgY29kZXdvcmRzSW50c1tpXTsNCgl9DQp9DQoNCkRlY29kZXIuZGVjb2RlPWZ1bmN0aW9uKGJpdHMpDQp7DQoJdmFyIHBhcnNlciA9IG5ldyBCaXRNYXRyaXhQYXJzZXIoYml0cyk7DQoJdmFyIHZlcnNpb24gPSBwYXJzZXIucmVhZFZlcnNpb24oKTsNCgl2YXIgZWNMZXZlbCA9IHBhcnNlci5yZWFkRm9ybWF0SW5mb3JtYXRpb24oKS5FcnJvckNvcnJlY3Rpb25MZXZlbDsNCgkNCgkvLyBSZWFkIGNvZGV3b3Jkcw0KCXZhciBjb2Rld29yZHMgPSBwYXJzZXIucmVhZENvZGV3b3JkcygpOw0KDQoJLy8gU2VwYXJhdGUgaW50byBkYXRhIGJsb2Nrcw0KCXZhciBkYXRhQmxvY2tzID0gRGF0YUJsb2NrLmdldERhdGFCbG9ja3MoY29kZXdvcmRzLCB2ZXJzaW9uLCBlY0xldmVsKTsNCgkNCgkvLyBDb3VudCB0b3RhbCBudW1iZXIgb2YgZGF0YSBieXRlcw0KCXZhciB0b3RhbEJ5dGVzID0gMDsNCglmb3IgKHZhciBpID0gMDsgaSA8IGRhdGFCbG9ja3MubGVuZ3RoOyBpKyspDQoJew0KCQl0b3RhbEJ5dGVzICs9IGRhdGFCbG9ja3NbaV0uTnVtRGF0YUNvZGV3b3JkczsNCgl9DQoJdmFyIHJlc3VsdEJ5dGVzID0gbmV3IEFycmF5KHRvdGFsQnl0ZXMpOw0KCXZhciByZXN1bHRPZmZzZXQgPSAwOw0KCQ0KCS8vIEVycm9yLWNvcnJlY3QgYW5kIGNvcHkgZGF0YSBibG9ja3MgdG9nZXRoZXIgaW50byBhIHN0cmVhbSBvZiBieXRlcw0KCWZvciAodmFyIGogPSAwOyBqIDwgZGF0YUJsb2Nrcy5sZW5ndGg7IGorKykNCgl7DQoJCXZhciBkYXRhQmxvY2sgPSBkYXRhQmxvY2tzW2pdOw0KCQl2YXIgY29kZXdvcmRCeXRlcyA9IGRhdGFCbG9jay5Db2Rld29yZHM7DQoJCXZhciBudW1EYXRhQ29kZXdvcmRzID0gZGF0YUJsb2NrLk51bURhdGFDb2Rld29yZHM7DQoJCURlY29kZXIuY29ycmVjdEVycm9ycyhjb2Rld29yZEJ5dGVzLCBudW1EYXRhQ29kZXdvcmRzKTsNCgkJZm9yICh2YXIgaSA9IDA7IGkgPCBudW1EYXRhQ29kZXdvcmRzOyBpKyspDQoJCXsNCgkJCXJlc3VsdEJ5dGVzW3Jlc3VsdE9mZnNldCsrXSA9IGNvZGV3b3JkQnl0ZXNbaV07DQoJCX0NCgl9DQoJDQoJLy8gRGVjb2RlIHRoZSBjb250ZW50cyBvZiB0aGF0IHN0cmVhbSBvZiBieXRlcw0KCXZhciByZWFkZXIgPSBuZXcgUVJDb2RlRGF0YUJsb2NrUmVhZGVyKHJlc3VsdEJ5dGVzLCB2ZXJzaW9uLlZlcnNpb25OdW1iZXIsIGVjTGV2ZWwuQml0cyk7DQoJcmV0dXJuIHJlYWRlcjsNCgkvL3JldHVybiBEZWNvZGVkQml0U3RyZWFtUGFyc2VyLmRlY29kZShyZXN1bHRCeXRlcywgdmVyc2lvbiwgZWNMZXZlbCk7DQp9DQo=</uax:ByteString>
		</Value>
	</UAVariable>
	<UAObject NodeId="ns=1;s=SYSTEM" BrowseName="1:SYSTEM">
		<DisplayName Locale="en">SYSTEM</DisplayName>
		<Description Locale="en">SYSTEM</Description>
		<References>
			<Reference ReferenceType="HasComponent" IsForward="false">Objects</Reference>
			<Reference ReferenceType="HasTypeDefinition">FolderType</Reference>
		</References>
		<Extensions>
			<atvise ExportedNodeId="ns=1;s=SYSTEM.LIBRARY.PROJECT.RESOURCES/QRCodeScanner/detector.js" ExportedBrowseName="1:detector.js" Upstream="true"/>
		</Extensions>
	</UAObject>
	<UAObject NodeId="ns=1;s=SYSTEM.LIBRARY" BrowseName="1:LIBRARY">
		<DisplayName Locale="en">LIBRARY</DisplayName>
		<Description Locale="en">LIBRARY</Description>
		<References>
			<Reference ReferenceType="HasComponent" IsForward="false">ns=1;s=SYSTEM</Reference>
			<Reference ReferenceType="HasTypeDefinition">FolderType</Reference>
		</References>
		<Extensions>
			<atvise Upstream="true"/>
		</Extensions>
	</UAObject>
	<UAObject NodeId="ns=1;s=SYSTEM.LIBRARY.PROJECT" BrowseName="1:PROJECT">
		<DisplayName Locale="en">PROJECT</DisplayName>
		<Description Locale="en">PROJECT</Description>
		<References>
			<Reference ReferenceType="HasComponent" IsForward="false">ns=1;s=SYSTEM.LIBRARY</Reference>
			<Reference ReferenceType="HasTypeDefinition">FolderType</Reference>
		</References>
		<Extensions>
			<atvise Upstream="true"/>
		</Extensions>
	</UAObject>
	<UAObject NodeId="ns=1;s=SYSTEM.LIBRARY.PROJECT.RESOURCES" BrowseName="1:RESOURCES">
		<DisplayName Locale="en">RESOURCES</DisplayName>
		<Description Locale="en">RESOURCES</Description>
		<References>
			<Reference ReferenceType="HasComponent" IsForward="false">ns=1;s=SYSTEM.LIBRARY.PROJECT</Reference>
			<Reference ReferenceType="HasTypeDefinition">FolderType</Reference>
		</References>
		<Extensions>
			<atvise Upstream="true"/>
		</Extensions>
	</UAObject>
	<UAObject NodeId="ns=1;s=SYSTEM.LIBRARY.PROJECT.RESOURCES/QRCodeScanner" BrowseName="1:QRCodeScanner">
		<DisplayName Locale="en">QRCodeScanner</DisplayName>
		<Description Locale="en">QRCodeScanner</Description>
		<References>
			<Reference ReferenceType="HasComponent" IsForward="false">ns=1;s=SYSTEM.LIBRARY.PROJECT.RESOURCES</Reference>
			<Reference ReferenceType="HasTypeDefinition">FolderType</Reference>
		</References>
		<Extensions>
			<atvise Upstream="true"/>
		</Extensions>
	</UAObject>
	<UAVariable NodeId="ns=1;s=SYSTEM.LIBRARY.PROJECT.RESOURCES/QRCodeScanner/detector.js" BrowseName="1:detector.js" DataType="ByteString" AccessLevel="103" UserAccessLevel="103" Historizing="true">
		<DisplayName Locale="en">detector.js</DisplayName>
		<Description Locale="en">detector.js</Description>
		<References>
			<Reference ReferenceType="HasComponent" IsForward="false">ns=1;s=SYSTEM.LIBRARY.PROJECT.RESOURCES/QRCodeScanner</Reference>
			<Reference ReferenceType="HasTypeDefinition">ns=1;s=VariableTypes.ATVISE.Resource.Javascript</Reference>
			<Reference ReferenceType="HasProperty">ns=1;s=VariableTypes.ATVISE.Resource.Javascript.Compress</Reference>
		</References>
		<Value>
			<uax:ByteString>LyoNCiAgUG9ydGVkIHRvIEphdmFTY3JpcHQgYnkgTGF6YXIgTGFzemxvIDIwMTEgDQogIA0KICBsYXphcnNvZnRAZ21haWwuY29tLCB3d3cubGF6YXJzb2Z0LmluZm8NCiAgDQoqLw0KDQovKg0KKg0KKiBDb3B5cmlnaHQgMjAwNyBaWGluZyBhdXRob3JzDQoqDQoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOw0KKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuDQoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KKg0KKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KKg0KKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KKi8NCg0KDQpmdW5jdGlvbiBQZXJzcGVjdGl2ZVRyYW5zZm9ybSggYTExLCAgYTIxLCAgYTMxLCAgYTEyLCAgYTIyLCAgYTMyLCAgYTEzLCAgYTIzLCAgYTMzKQ0Kew0KCXRoaXMuYTExID0gYTExOw0KCXRoaXMuYTEyID0gYTEyOw0KCXRoaXMuYTEzID0gYTEzOw0KCXRoaXMuYTIxID0gYTIxOw0KCXRoaXMuYTIyID0gYTIyOw0KCXRoaXMuYTIzID0gYTIzOw0KCXRoaXMuYTMxID0gYTMxOw0KCXRoaXMuYTMyID0gYTMyOw0KCXRoaXMuYTMzID0gYTMzOw0KCXRoaXMudHJhbnNmb3JtUG9pbnRzMT1mdW5jdGlvbiggcG9pbnRzKQ0KCQl7DQoJCQl2YXIgbWF4ID0gcG9pbnRzLmxlbmd0aDsNCgkJCXZhciBhMTEgPSB0aGlzLmExMTsNCgkJCXZhciBhMTIgPSB0aGlzLmExMjsNCgkJCXZhciBhMTMgPSB0aGlzLmExMzsNCgkJCXZhciBhMjEgPSB0aGlzLmEyMTsNCgkJCXZhciBhMjIgPSB0aGlzLmEyMjsNCgkJCXZhciBhMjMgPSB0aGlzLmEyMzsNCgkJCXZhciBhMzEgPSB0aGlzLmEzMTsNCgkJCXZhciBhMzIgPSB0aGlzLmEzMjsNCgkJCXZhciBhMzMgPSB0aGlzLmEzMzsNCgkJCWZvciAodmFyIGkgPSAwOyBpIDwgbWF4OyBpICs9IDIpDQoJCQl7DQoJCQkJdmFyIHggPSBwb2ludHNbaV07DQoJCQkJdmFyIHkgPSBwb2ludHNbaSArIDFdOw0KCQkJCXZhciBkZW5vbWluYXRvciA9IGExMyAqIHggKyBhMjMgKiB5ICsgYTMzOw0KCQkJCXBvaW50c1tpXSA9IChhMTEgKiB4ICsgYTIxICogeSArIGEzMSkgLyBkZW5vbWluYXRvcjsNCgkJCQlwb2ludHNbaSArIDFdID0gKGExMiAqIHggKyBhMjIgKiB5ICsgYTMyKSAvIGRlbm9taW5hdG9yOw0KCQkJfQ0KCQl9DQoJdGhpcy4gdHJhbnNmb3JtUG9pbnRzMj1mdW5jdGlvbih4VmFsdWVzLCB5VmFsdWVzKQ0KCQl7DQoJCQl2YXIgbiA9IHhWYWx1ZXMubGVuZ3RoOw0KCQkJZm9yICh2YXIgaSA9IDA7IGkgPCBuOyBpKyspDQoJCQl7DQoJCQkJdmFyIHggPSB4VmFsdWVzW2ldOw0KCQkJCXZhciB5ID0geVZhbHVlc1tpXTsNCgkJCQl2YXIgZGVub21pbmF0b3IgPSB0aGlzLmExMyAqIHggKyB0aGlzLmEyMyAqIHkgKyB0aGlzLmEzMzsNCgkJCQl4VmFsdWVzW2ldID0gKHRoaXMuYTExICogeCArIHRoaXMuYTIxICogeSArIHRoaXMuYTMxKSAvIGRlbm9taW5hdG9yOw0KCQkJCXlWYWx1ZXNbaV0gPSAodGhpcy5hMTIgKiB4ICsgdGhpcy5hMjIgKiB5ICsgdGhpcy5hMzIpIC8gZGVub21pbmF0b3I7DQoJCQl9DQoJCX0NCg0KCXRoaXMuYnVpbGRBZGpvaW50PWZ1bmN0aW9uKCkNCgkJew0KCQkJLy8gQWRqb2ludCBpcyB0aGUgdHJhbnNwb3NlIG9mIHRoZSBjb2ZhY3RvciBtYXRyaXg6DQoJCQlyZXR1cm4gbmV3IFBlcnNwZWN0aXZlVHJhbnNmb3JtKHRoaXMuYTIyICogdGhpcy5hMzMgLSB0aGlzLmEyMyAqIHRoaXMuYTMyLCB0aGlzLmEyMyAqIHRoaXMuYTMxIC0gdGhpcy5hMjEgKiB0aGlzLmEzMywgdGhpcy5hMjEgKiB0aGlzLmEzMiAtIHRoaXMuYTIyICogdGhpcy5hMzEsIHRoaXMuYTEzICogdGhpcy5hMzIgLSB0aGlzLmExMiAqIHRoaXMuYTMzLCB0aGlzLmExMSAqIHRoaXMuYTMzIC0gdGhpcy5hMTMgKiB0aGlzLmEzMSwgdGhpcy5hMTIgKiB0aGlzLmEzMSAtIHRoaXMuYTExICogdGhpcy5hMzIsIHRoaXMuYTEyICogdGhpcy5hMjMgLSB0aGlzLmExMyAqIHRoaXMuYTIyLCB0aGlzLmExMyAqIHRoaXMuYTIxIC0gdGhpcy5hMTEgKiB0aGlzLmEyMywgdGhpcy5hMTEgKiB0aGlzLmEyMiAtIHRoaXMuYTEyICogdGhpcy5hMjEpOw0KCQl9DQoJdGhpcy50aW1lcz1mdW5jdGlvbiggb3RoZXIpDQoJCXsNCgkJCXJldHVybiBuZXcgUGVyc3BlY3RpdmVUcmFuc2Zvcm0odGhpcy5hMTEgKiBvdGhlci5hMTEgKyB0aGlzLmEyMSAqIG90aGVyLmExMiArIHRoaXMuYTMxICogb3RoZXIuYTEzLCB0aGlzLmExMSAqIG90aGVyLmEyMSArIHRoaXMuYTIxICogb3RoZXIuYTIyICsgdGhpcy5hMzEgKiBvdGhlci5hMjMsIHRoaXMuYTExICogb3RoZXIuYTMxICsgdGhpcy5hMjEgKiBvdGhlci5hMzIgKyB0aGlzLmEzMSAqIG90aGVyLmEzMywgdGhpcy5hMTIgKiBvdGhlci5hMTEgKyB0aGlzLmEyMiAqIG90aGVyLmExMiArIHRoaXMuYTMyICogb3RoZXIuYTEzLCB0aGlzLmExMiAqIG90aGVyLmEyMSArIHRoaXMuYTIyICogb3RoZXIuYTIyICsgdGhpcy5hMzIgKiBvdGhlci5hMjMsIHRoaXMuYTEyICogb3RoZXIuYTMxICsgdGhpcy5hMjIgKiBvdGhlci5hMzIgKyB0aGlzLmEzMiAqIG90aGVyLmEzMywgdGhpcy5hMTMgKiBvdGhlci5hMTEgKyB0aGlzLmEyMyAqIG90aGVyLmExMiArdGhpcy5hMzMgKiBvdGhlci5hMTMsIHRoaXMuYTEzICogb3RoZXIuYTIxICsgdGhpcy5hMjMgKiBvdGhlci5hMjIgKyB0aGlzLmEzMyAqIG90aGVyLmEyMywgdGhpcy5hMTMgKiBvdGhlci5hMzEgKyB0aGlzLmEyMyAqIG90aGVyLmEzMiArIHRoaXMuYTMzICogb3RoZXIuYTMzKTsNCgkJfQ0KDQp9DQoNClBlcnNwZWN0aXZlVHJhbnNmb3JtLnF1YWRyaWxhdGVyYWxUb1F1YWRyaWxhdGVyYWw9ZnVuY3Rpb24oIHgwLCAgeTAsICB4MSwgIHkxLCAgeDIsICB5MiwgIHgzLCAgeTMsICB4MHAsICB5MHAsICB4MXAsICB5MXAsICB4MnAsICB5MnAsICB4M3AsICB5M3ApDQp7DQoJDQoJdmFyIHFUb1MgPSB0aGlzLnF1YWRyaWxhdGVyYWxUb1NxdWFyZSh4MCwgeTAsIHgxLCB5MSwgeDIsIHkyLCB4MywgeTMpOw0KCXZhciBzVG9RID0gdGhpcy5zcXVhcmVUb1F1YWRyaWxhdGVyYWwoeDBwLCB5MHAsIHgxcCwgeTFwLCB4MnAsIHkycCwgeDNwLCB5M3ApOw0KCXJldHVybiBzVG9RLnRpbWVzKHFUb1MpOw0KfQ0KDQpQZXJzcGVjdGl2ZVRyYW5zZm9ybS5zcXVhcmVUb1F1YWRyaWxhdGVyYWw9ZnVuY3Rpb24oIHgwLCAgeTAsICB4MSwgIHkxLCAgeDIsICB5MiwgIHgzLCAgeTMpDQp7DQoJdmFyIGR5MiA9IHkzIC0geTI7DQoJdmFyIGR5MyA9IHkwIC0geTEgKyB5MiAtIHkzOw0KCWlmIChkeTIgPT0gMC4wICYmIGR5MyA9PSAwLjApDQoJew0KCQlyZXR1cm4gbmV3IFBlcnNwZWN0aXZlVHJhbnNmb3JtKHgxIC0geDAsIHgyIC0geDEsIHgwLCB5MSAtIHkwLCB5MiAtIHkxLCB5MCwgMC4wLCAwLjAsIDEuMCk7DQoJfQ0KCWVsc2UNCgl7DQoJCXZhciBkeDEgPSB4MSAtIHgyOw0KCQl2YXIgZHgyID0geDMgLSB4MjsNCgkJdmFyIGR4MyA9IHgwIC0geDEgKyB4MiAtIHgzOw0KCQl2YXIgZHkxID0geTEgLSB5MjsNCgkJdmFyIGRlbm9taW5hdG9yID0gZHgxICogZHkyIC0gZHgyICogZHkxOw0KCQl2YXIgYTEzID0gKGR4MyAqIGR5MiAtIGR4MiAqIGR5MykgLyBkZW5vbWluYXRvcjsNCgkJdmFyIGEyMyA9IChkeDEgKiBkeTMgLSBkeDMgKiBkeTEpIC8gZGVub21pbmF0b3I7DQoJCXJldHVybiBuZXcgUGVyc3BlY3RpdmVUcmFuc2Zvcm0oeDEgLSB4MCArIGExMyAqIHgxLCB4MyAtIHgwICsgYTIzICogeDMsIHgwLCB5MSAtIHkwICsgYTEzICogeTEsIHkzIC0geTAgKyBhMjMgKiB5MywgeTAsIGExMywgYTIzLCAxLjApOw0KCX0NCn0NCg0KUGVyc3BlY3RpdmVUcmFuc2Zvcm0ucXVhZHJpbGF0ZXJhbFRvU3F1YXJlPWZ1bmN0aW9uKCB4MCwgIHkwLCAgeDEsICB5MSwgIHgyLCAgeTIsICB4MywgIHkzKQ0Kew0KCS8vIEhlcmUsIHRoZSBhZGpvaW50IHNlcnZlcyBhcyB0aGUgaW52ZXJzZToNCglyZXR1cm4gdGhpcy5zcXVhcmVUb1F1YWRyaWxhdGVyYWwoeDAsIHkwLCB4MSwgeTEsIHgyLCB5MiwgeDMsIHkzKS5idWlsZEFkam9pbnQoKTsNCn0NCg0KZnVuY3Rpb24gRGV0ZWN0b3JSZXN1bHQoYml0cywgIHBvaW50cykNCnsNCgl0aGlzLmJpdHMgPSBiaXRzOw0KCXRoaXMucG9pbnRzID0gcG9pbnRzOw0KfQ0KDQoNCmZ1bmN0aW9uIERldGVjdG9yKGltYWdlKQ0Kew0KCXRoaXMuaW1hZ2U9aW1hZ2U7DQoJdGhpcy5yZXN1bHRQb2ludENhbGxiYWNrID0gbnVsbDsNCgkNCgl0aGlzLnNpemVPZkJsYWNrV2hpdGVCbGFja1J1bj1mdW5jdGlvbiggZnJvbVgsICBmcm9tWSwgIHRvWCwgIHRvWSkNCgkJew0KCQkJLy8gTWlsZCB2YXJpYW50IG9mIEJyZXNlbmhhbSdzIGFsZ29yaXRobTsNCgkJCS8vIHNlZSBodHRwOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0JyZXNlbmhhbSdzX2xpbmVfYWxnb3JpdGhtDQoJCQl2YXIgc3RlZXAgPSBNYXRoLmFicyh0b1kgLSBmcm9tWSkgPiBNYXRoLmFicyh0b1ggLSBmcm9tWCk7DQoJCQlpZiAoc3RlZXApDQoJCQl7DQoJCQkJdmFyIHRlbXAgPSBmcm9tWDsNCgkJCQlmcm9tWCA9IGZyb21ZOw0KCQkJCWZyb21ZID0gdGVtcDsNCgkJCQl0ZW1wID0gdG9YOw0KCQkJCXRvWCA9IHRvWTsNCgkJCQl0b1kgPSB0ZW1wOw0KCQkJfQ0KCQkJDQoJCQl2YXIgZHggPSBNYXRoLmFicyh0b1ggLSBmcm9tWCk7DQoJCQl2YXIgZHkgPSBNYXRoLmFicyh0b1kgLSBmcm9tWSk7DQoJCQl2YXIgZXJyb3IgPSAtIGR4ID4+IDE7DQoJCQl2YXIgeXN0ZXAgPSBmcm9tWSA8IHRvWT8xOi0gMTsNCgkJCXZhciB4c3RlcCA9IGZyb21YIDwgdG9YPzE6LSAxOw0KCQkJdmFyIHN0YXRlID0gMDsgLy8gSW4gYmxhY2sgcGl4ZWxzLCBsb29raW5nIGZvciB3aGl0ZSwgZmlyc3Qgb3Igc2Vjb25kIHRpbWUNCgkJCWZvciAodmFyIHggPSBmcm9tWCwgeSA9IGZyb21ZOyB4ICE9IHRvWDsgeCArPSB4c3RlcCkNCgkJCXsNCgkJCQkNCgkJCQl2YXIgcmVhbFggPSBzdGVlcD95Ong7DQoJCQkJdmFyIHJlYWxZID0gc3RlZXA/eDp5Ow0KCQkJCWlmIChzdGF0ZSA9PSAxKQ0KCQkJCXsNCgkJCQkJLy8gSW4gd2hpdGUgcGl4ZWxzLCBsb29raW5nIGZvciBibGFjaw0KCQkJCQlpZiAodGhpcy5pbWFnZVtyZWFsWCArIHJlYWxZKnFyY29kZS53aWR0aF0pDQoJCQkJCXsNCgkJCQkJCXN0YXRlKys7DQoJCQkJCX0NCgkJCQl9DQoJCQkJZWxzZQ0KCQkJCXsNCgkJCQkJaWYgKCF0aGlzLmltYWdlW3JlYWxYICsgcmVhbFkqcXJjb2RlLndpZHRoXSkNCgkJCQkJew0KCQkJCQkJc3RhdGUrKzsNCgkJCQkJfQ0KCQkJCX0NCgkJCQkNCgkJCQlpZiAoc3RhdGUgPT0gMykNCgkJCQl7DQoJCQkJCS8vIEZvdW5kIGJsYWNrLCB3aGl0ZSwgYmxhY2ssIGFuZCBzdHVtYmxlZCBiYWNrIG9udG8gd2hpdGU7IGRvbmUNCgkJCQkJdmFyIGRpZmZYID0geCAtIGZyb21YOw0KCQkJCQl2YXIgZGlmZlkgPSB5IC0gZnJvbVk7DQoJCQkJCXJldHVybiAgTWF0aC5zcXJ0KCAoZGlmZlggKiBkaWZmWCArIGRpZmZZICogZGlmZlkpKTsNCgkJCQl9DQoJCQkJZXJyb3IgKz0gZHk7DQoJCQkJaWYgKGVycm9yID4gMCkNCgkJCQl7DQoJCQkJCWlmICh5ID09IHRvWSkNCgkJCQkJew0KCQkJCQkJYnJlYWs7DQoJCQkJCX0NCgkJCQkJeSArPSB5c3RlcDsNCgkJCQkJZXJyb3IgLT0gZHg7DQoJCQkJfQ0KCQkJfQ0KCQkJdmFyIGRpZmZYMiA9IHRvWCAtIGZyb21YOw0KCQkJdmFyIGRpZmZZMiA9IHRvWSAtIGZyb21ZOw0KCQkJcmV0dXJuICBNYXRoLnNxcnQoIChkaWZmWDIgKiBkaWZmWDIgKyBkaWZmWTIgKiBkaWZmWTIpKTsNCgkJfQ0KDQoJDQoJdGhpcy5zaXplT2ZCbGFja1doaXRlQmxhY2tSdW5Cb3RoV2F5cz1mdW5jdGlvbiggZnJvbVgsICBmcm9tWSwgIHRvWCwgIHRvWSkNCgkJew0KCQkJDQoJCQl2YXIgcmVzdWx0ID0gdGhpcy5zaXplT2ZCbGFja1doaXRlQmxhY2tSdW4oZnJvbVgsIGZyb21ZLCB0b1gsIHRvWSk7DQoJCQkNCgkJCS8vIE5vdyBjb3VudCBvdGhlciB3YXkgLS0gZG9uJ3QgcnVuIG9mZiBpbWFnZSB0aG91Z2ggb2YgY291cnNlDQoJCQl2YXIgc2NhbGUgPSAxLjA7DQoJCQl2YXIgb3RoZXJUb1ggPSBmcm9tWCAtICh0b1ggLSBmcm9tWCk7DQoJCQlpZiAob3RoZXJUb1ggPCAwKQ0KCQkJew0KCQkJCXNjYWxlID0gIGZyb21YIC8gIChmcm9tWCAtIG90aGVyVG9YKTsNCgkJCQlvdGhlclRvWCA9IDA7DQoJCQl9DQoJCQllbHNlIGlmIChvdGhlclRvWCA+PSBxcmNvZGUud2lkdGgpDQoJCQl7DQoJCQkJc2NhbGUgPSAgKHFyY29kZS53aWR0aCAtIDEgLSBmcm9tWCkgLyAgKG90aGVyVG9YIC0gZnJvbVgpOw0KCQkJCW90aGVyVG9YID0gcXJjb2RlLndpZHRoIC0gMTsNCgkJCX0NCgkJCXZhciBvdGhlclRvWSA9IE1hdGguZmxvb3IgKGZyb21ZIC0gKHRvWSAtIGZyb21ZKSAqIHNjYWxlKTsNCgkJCQ0KCQkJc2NhbGUgPSAxLjA7DQoJCQlpZiAob3RoZXJUb1kgPCAwKQ0KCQkJew0KCQkJCXNjYWxlID0gIGZyb21ZIC8gIChmcm9tWSAtIG90aGVyVG9ZKTsNCgkJCQlvdGhlclRvWSA9IDA7DQoJCQl9DQoJCQllbHNlIGlmIChvdGhlclRvWSA+PSBxcmNvZGUuaGVpZ2h0KQ0KCQkJew0KCQkJCXNjYWxlID0gIChxcmNvZGUuaGVpZ2h0IC0gMSAtIGZyb21ZKSAvICAob3RoZXJUb1kgLSBmcm9tWSk7DQoJCQkJb3RoZXJUb1kgPSBxcmNvZGUuaGVpZ2h0IC0gMTsNCgkJCX0NCgkJCW90aGVyVG9YID0gTWF0aC5mbG9vciAoZnJvbVggKyAob3RoZXJUb1ggLSBmcm9tWCkgKiBzY2FsZSk7DQoJCQkNCgkJCXJlc3VsdCArPSB0aGlzLnNpemVPZkJsYWNrV2hpdGVCbGFja1J1bihmcm9tWCwgZnJvbVksIG90aGVyVG9YLCBvdGhlclRvWSk7DQoJCQlyZXR1cm4gcmVzdWx0IC0gMS4wOyAvLyAtMSBiZWNhdXNlIHdlIGNvdW50ZWQgdGhlIG1pZGRsZSBwaXhlbCB0d2ljZQ0KCQl9DQoJCQ0KDQoJDQoJdGhpcy5jYWxjdWxhdGVNb2R1bGVTaXplT25lV2F5PWZ1bmN0aW9uKCBwYXR0ZXJuLCAgb3RoZXJQYXR0ZXJuKQ0KCQl7DQoJCQl2YXIgbW9kdWxlU2l6ZUVzdDEgPSB0aGlzLnNpemVPZkJsYWNrV2hpdGVCbGFja1J1bkJvdGhXYXlzKE1hdGguZmxvb3IoIHBhdHRlcm4uWCksIE1hdGguZmxvb3IoIHBhdHRlcm4uWSksIE1hdGguZmxvb3IoIG90aGVyUGF0dGVybi5YKSwgTWF0aC5mbG9vcihvdGhlclBhdHRlcm4uWSkpOw0KCQkJdmFyIG1vZHVsZVNpemVFc3QyID0gdGhpcy5zaXplT2ZCbGFja1doaXRlQmxhY2tSdW5Cb3RoV2F5cyhNYXRoLmZsb29yKG90aGVyUGF0dGVybi5YKSwgTWF0aC5mbG9vcihvdGhlclBhdHRlcm4uWSksIE1hdGguZmxvb3IoIHBhdHRlcm4uWCksIE1hdGguZmxvb3IocGF0dGVybi5ZKSk7DQoJCQlpZiAoaXNOYU4obW9kdWxlU2l6ZUVzdDEpKQ0KCQkJew0KCQkJCXJldHVybiBtb2R1bGVTaXplRXN0MiAvIDcuMDsNCgkJCX0NCgkJCWlmIChpc05hTihtb2R1bGVTaXplRXN0MikpDQoJCQl7DQoJCQkJcmV0dXJuIG1vZHVsZVNpemVFc3QxIC8gNy4wOw0KCQkJfQ0KCQkJLy8gQXZlcmFnZSB0aGVtLCBhbmQgZGl2aWRlIGJ5IDcgc2luY2Ugd2UndmUgY291bnRlZCB0aGUgd2lkdGggb2YgMyBibGFjayBtb2R1bGVzLA0KCQkJLy8gYW5kIDEgd2hpdGUgYW5kIDEgYmxhY2sgbW9kdWxlIG9uIGVpdGhlciBzaWRlLiBFcmdvLCBkaXZpZGUgc3VtIGJ5IDE0Lg0KCQkJcmV0dXJuIChtb2R1bGVTaXplRXN0MSArIG1vZHVsZVNpemVFc3QyKSAvIDE0LjA7DQoJCX0NCg0KCQ0KCXRoaXMuY2FsY3VsYXRlTW9kdWxlU2l6ZT1mdW5jdGlvbiggdG9wTGVmdCwgIHRvcFJpZ2h0LCAgYm90dG9tTGVmdCkNCgkJew0KCQkJLy8gVGFrZSB0aGUgYXZlcmFnZQ0KCQkJcmV0dXJuICh0aGlzLmNhbGN1bGF0ZU1vZHVsZVNpemVPbmVXYXkodG9wTGVmdCwgdG9wUmlnaHQpICsgdGhpcy5jYWxjdWxhdGVNb2R1bGVTaXplT25lV2F5KHRvcExlZnQsIGJvdHRvbUxlZnQpKSAvIDIuMDsNCgkJfQ0KDQoJdGhpcy5kaXN0YW5jZT1mdW5jdGlvbiggcGF0dGVybjEsICBwYXR0ZXJuMikNCgl7DQoJCXZhciB4RGlmZiA9IHBhdHRlcm4xLlggLSBwYXR0ZXJuMi5YOw0KCQl2YXIgeURpZmYgPSBwYXR0ZXJuMS5ZIC0gcGF0dGVybjIuWTsNCgkJcmV0dXJuICBNYXRoLnNxcnQoICh4RGlmZiAqIHhEaWZmICsgeURpZmYgKiB5RGlmZikpOw0KCX0NCgl0aGlzLmNvbXB1dGVEaW1lbnNpb249ZnVuY3Rpb24oIHRvcExlZnQsICB0b3BSaWdodCwgIGJvdHRvbUxlZnQsICBtb2R1bGVTaXplKQ0KCQl7DQoJCQkNCgkJCXZhciB0bHRyQ2VudGVyc0RpbWVuc2lvbiA9IE1hdGgucm91bmQodGhpcy5kaXN0YW5jZSh0b3BMZWZ0LCB0b3BSaWdodCkgLyBtb2R1bGVTaXplKTsNCgkJCXZhciB0bGJsQ2VudGVyc0RpbWVuc2lvbiA9IE1hdGgucm91bmQodGhpcy5kaXN0YW5jZSh0b3BMZWZ0LCBib3R0b21MZWZ0KSAvIG1vZHVsZVNpemUpOw0KCQkJdmFyIGRpbWVuc2lvbiA9ICgodGx0ckNlbnRlcnNEaW1lbnNpb24gKyB0bGJsQ2VudGVyc0RpbWVuc2lvbikgPj4gMSkgKyA3Ow0KCQkJc3dpdGNoIChkaW1lbnNpb24gJiAweDAzKQ0KCQkJew0KCQkJCQ0KCQkJCS8vIG1vZCA0DQoJCQkJY2FzZSAwOiANCgkJCQkJZGltZW5zaW9uKys7DQoJCQkJCWJyZWFrOw0KCQkJCQkvLyAxPyBkbyBub3RoaW5nDQoJCQkJDQoJCQkJY2FzZSAyOiANCgkJCQkJZGltZW5zaW9uLS07DQoJCQkJCWJyZWFrOw0KCQkJCQ0KCQkJCWNhc2UgMzogDQoJCQkJCXRocm93ICJFcnJvciI7DQoJCQkJfQ0KCQkJcmV0dXJuIGRpbWVuc2lvbjsNCgkJfQ0KDQoJdGhpcy5maW5kQWxpZ25tZW50SW5SZWdpb249ZnVuY3Rpb24oIG92ZXJhbGxFc3RNb2R1bGVTaXplLCAgZXN0QWxpZ25tZW50WCwgIGVzdEFsaWdubWVudFksICBhbGxvd2FuY2VGYWN0b3IpDQoJCXsNCgkJCS8vIExvb2sgZm9yIGFuIGFsaWdubWVudCBwYXR0ZXJuICgzIG1vZHVsZXMgaW4gc2l6ZSkgYXJvdW5kIHdoZXJlIGl0DQoJCQkvLyBzaG91bGQgYmUNCgkJCXZhciBhbGxvd2FuY2UgPSBNYXRoLmZsb29yIChhbGxvd2FuY2VGYWN0b3IgKiBvdmVyYWxsRXN0TW9kdWxlU2l6ZSk7DQoJCQl2YXIgYWxpZ25tZW50QXJlYUxlZnRYID0gTWF0aC5tYXgoMCwgZXN0QWxpZ25tZW50WCAtIGFsbG93YW5jZSk7DQoJCQl2YXIgYWxpZ25tZW50QXJlYVJpZ2h0WCA9IE1hdGgubWluKHFyY29kZS53aWR0aCAtIDEsIGVzdEFsaWdubWVudFggKyBhbGxvd2FuY2UpOw0KCQkJaWYgKGFsaWdubWVudEFyZWFSaWdodFggLSBhbGlnbm1lbnRBcmVhTGVmdFggPCBvdmVyYWxsRXN0TW9kdWxlU2l6ZSAqIDMpDQoJCQl7DQoJCQkJdGhyb3cgIkVycm9yIjsNCgkJCX0NCgkJCQ0KCQkJdmFyIGFsaWdubWVudEFyZWFUb3BZID0gTWF0aC5tYXgoMCwgZXN0QWxpZ25tZW50WSAtIGFsbG93YW5jZSk7DQoJCQl2YXIgYWxpZ25tZW50QXJlYUJvdHRvbVkgPSBNYXRoLm1pbihxcmNvZGUuaGVpZ2h0IC0gMSwgZXN0QWxpZ25tZW50WSArIGFsbG93YW5jZSk7DQoJCQkNCgkJCXZhciBhbGlnbm1lbnRGaW5kZXIgPSBuZXcgQWxpZ25tZW50UGF0dGVybkZpbmRlcih0aGlzLmltYWdlLCBhbGlnbm1lbnRBcmVhTGVmdFgsIGFsaWdubWVudEFyZWFUb3BZLCBhbGlnbm1lbnRBcmVhUmlnaHRYIC0gYWxpZ25tZW50QXJlYUxlZnRYLCBhbGlnbm1lbnRBcmVhQm90dG9tWSAtIGFsaWdubWVudEFyZWFUb3BZLCBvdmVyYWxsRXN0TW9kdWxlU2l6ZSwgdGhpcy5yZXN1bHRQb2ludENhbGxiYWNrKTsNCgkJCXJldHVybiBhbGlnbm1lbnRGaW5kZXIuZmluZCgpOw0KCQl9DQoJCQ0KCXRoaXMuY3JlYXRlVHJhbnNmb3JtPWZ1bmN0aW9uKCB0b3BMZWZ0LCAgdG9wUmlnaHQsICBib3R0b21MZWZ0LCBhbGlnbm1lbnRQYXR0ZXJuLCBkaW1lbnNpb24pDQoJCXsNCgkJCXZhciBkaW1NaW51c1RocmVlID0gIGRpbWVuc2lvbiAtIDMuNTsNCgkJCXZhciBib3R0b21SaWdodFg7DQoJCQl2YXIgYm90dG9tUmlnaHRZOw0KCQkJdmFyIHNvdXJjZUJvdHRvbVJpZ2h0WDsNCgkJCXZhciBzb3VyY2VCb3R0b21SaWdodFk7DQoJCQlpZiAoYWxpZ25tZW50UGF0dGVybiAhPSBudWxsKQ0KCQkJew0KCQkJCWJvdHRvbVJpZ2h0WCA9IGFsaWdubWVudFBhdHRlcm4uWDsNCgkJCQlib3R0b21SaWdodFkgPSBhbGlnbm1lbnRQYXR0ZXJuLlk7DQoJCQkJc291cmNlQm90dG9tUmlnaHRYID0gc291cmNlQm90dG9tUmlnaHRZID0gZGltTWludXNUaHJlZSAtIDMuMDsNCgkJCX0NCgkJCWVsc2UNCgkJCXsNCgkJCQkvLyBEb24ndCBoYXZlIGFuIGFsaWdubWVudCBwYXR0ZXJuLCBqdXN0IG1ha2UgdXAgdGhlIGJvdHRvbS1yaWdodCBwb2ludA0KCQkJCWJvdHRvbVJpZ2h0WCA9ICh0b3BSaWdodC5YIC0gdG9wTGVmdC5YKSArIGJvdHRvbUxlZnQuWDsNCgkJCQlib3R0b21SaWdodFkgPSAodG9wUmlnaHQuWSAtIHRvcExlZnQuWSkgKyBib3R0b21MZWZ0Llk7DQoJCQkJc291cmNlQm90dG9tUmlnaHRYID0gc291cmNlQm90dG9tUmlnaHRZID0gZGltTWludXNUaHJlZTsNCgkJCX0NCgkJCQ0KCQkJdmFyIHRyYW5zZm9ybSA9IFBlcnNwZWN0aXZlVHJhbnNmb3JtLnF1YWRyaWxhdGVyYWxUb1F1YWRyaWxhdGVyYWwoMy41LCAzLjUsIGRpbU1pbnVzVGhyZWUsIDMuNSwgc291cmNlQm90dG9tUmlnaHRYLCBzb3VyY2VCb3R0b21SaWdodFksIDMuNSwgZGltTWludXNUaHJlZSwgdG9wTGVmdC5YLCB0b3BMZWZ0LlksIHRvcFJpZ2h0LlgsIHRvcFJpZ2h0LlksIGJvdHRvbVJpZ2h0WCwgYm90dG9tUmlnaHRZLCBib3R0b21MZWZ0LlgsIGJvdHRvbUxlZnQuWSk7DQoJCQkNCgkJCXJldHVybiB0cmFuc2Zvcm07DQoJCX0JCQ0KCQ0KCXRoaXMuc2FtcGxlR3JpZD1mdW5jdGlvbiggaW1hZ2UsICB0cmFuc2Zvcm0sICBkaW1lbnNpb24pDQoJCXsNCgkJCQ0KCQkJdmFyIHNhbXBsZXIgPSBHcmlkU2FtcGxlcjsNCgkJCXJldHVybiBzYW1wbGVyLnNhbXBsZUdyaWQzKGltYWdlLCBkaW1lbnNpb24sIHRyYW5zZm9ybSk7DQoJCX0NCgkNCgl0aGlzLnByb2Nlc3NGaW5kZXJQYXR0ZXJuSW5mbyA9IGZ1bmN0aW9uKCBpbmZvKQ0KCQl7DQoJCQkNCgkJCXZhciB0b3BMZWZ0ID0gaW5mby5Ub3BMZWZ0Ow0KCQkJdmFyIHRvcFJpZ2h0ID0gaW5mby5Ub3BSaWdodDsNCgkJCXZhciBib3R0b21MZWZ0ID0gaW5mby5Cb3R0b21MZWZ0Ow0KCQkJDQoJCQl2YXIgbW9kdWxlU2l6ZSA9IHRoaXMuY2FsY3VsYXRlTW9kdWxlU2l6ZSh0b3BMZWZ0LCB0b3BSaWdodCwgYm90dG9tTGVmdCk7DQoJCQlpZiAobW9kdWxlU2l6ZSA8IDEuMCkNCgkJCXsNCgkJCQl0aHJvdyAiRXJyb3IiOw0KCQkJfQ0KCQkJdmFyIGRpbWVuc2lvbiA9IHRoaXMuY29tcHV0ZURpbWVuc2lvbih0b3BMZWZ0LCB0b3BSaWdodCwgYm90dG9tTGVmdCwgbW9kdWxlU2l6ZSk7DQoJCQl2YXIgcHJvdmlzaW9uYWxWZXJzaW9uID0gVmVyc2lvbi5nZXRQcm92aXNpb25hbFZlcnNpb25Gb3JEaW1lbnNpb24oZGltZW5zaW9uKTsNCgkJCXZhciBtb2R1bGVzQmV0d2VlbkZQQ2VudGVycyA9IHByb3Zpc2lvbmFsVmVyc2lvbi5EaW1lbnNpb25Gb3JWZXJzaW9uIC0gNzsNCgkJCQ0KCQkJdmFyIGFsaWdubWVudFBhdHRlcm4gPSBudWxsOw0KCQkJLy8gQW55dGhpbmcgYWJvdmUgdmVyc2lvbiAxIGhhcyBhbiBhbGlnbm1lbnQgcGF0dGVybg0KCQkJaWYgKHByb3Zpc2lvbmFsVmVyc2lvbi5BbGlnbm1lbnRQYXR0ZXJuQ2VudGVycy5sZW5ndGggPiAwKQ0KCQkJew0KCQkJCQ0KCQkJCS8vIEd1ZXNzIHdoZXJlIGEgImJvdHRvbSByaWdodCIgZmluZGVyIHBhdHRlcm4gd291bGQgaGF2ZSBiZWVuDQoJCQkJdmFyIGJvdHRvbVJpZ2h0WCA9IHRvcFJpZ2h0LlggLSB0b3BMZWZ0LlggKyBib3R0b21MZWZ0Llg7DQoJCQkJdmFyIGJvdHRvbVJpZ2h0WSA9IHRvcFJpZ2h0LlkgLSB0b3BMZWZ0LlkgKyBib3R0b21MZWZ0Llk7DQoJCQkJDQoJCQkJLy8gRXN0aW1hdGUgdGhhdCBhbGlnbm1lbnQgcGF0dGVybiBpcyBjbG9zZXIgYnkgMyBtb2R1bGVzDQoJCQkJLy8gZnJvbSAiYm90dG9tIHJpZ2h0IiB0byBrbm93biB0b3AgbGVmdCBsb2NhdGlvbg0KCQkJCXZhciBjb3JyZWN0aW9uVG9Ub3BMZWZ0ID0gMS4wIC0gMy4wIC8gIG1vZHVsZXNCZXR3ZWVuRlBDZW50ZXJzOw0KCQkJCXZhciBlc3RBbGlnbm1lbnRYID0gTWF0aC5mbG9vciAodG9wTGVmdC5YICsgY29ycmVjdGlvblRvVG9wTGVmdCAqIChib3R0b21SaWdodFggLSB0b3BMZWZ0LlgpKTsNCgkJCQl2YXIgZXN0QWxpZ25tZW50WSA9IE1hdGguZmxvb3IgKHRvcExlZnQuWSArIGNvcnJlY3Rpb25Ub1RvcExlZnQgKiAoYm90dG9tUmlnaHRZIC0gdG9wTGVmdC5ZKSk7DQoJCQkJDQoJCQkJLy8gS2luZCBvZiBhcmJpdHJhcnkgLS0gZXhwYW5kIHNlYXJjaCByYWRpdXMgYmVmb3JlIGdpdmluZyB1cA0KCQkJCWZvciAodmFyIGkgPSA0OyBpIDw9IDE2OyBpIDw8PSAxKQ0KCQkJCXsNCgkJCQkJLy90cnkNCgkJCQkJLy97DQoJCQkJCQlhbGlnbm1lbnRQYXR0ZXJuID0gdGhpcy5maW5kQWxpZ25tZW50SW5SZWdpb24obW9kdWxlU2l6ZSwgZXN0QWxpZ25tZW50WCwgZXN0QWxpZ25tZW50WSwgIGkpOw0KCQkJCQkJYnJlYWs7DQoJCQkJCS8vfQ0KCQkJCQkvL2NhdGNoIChyZSkNCgkJCQkJLy97DQoJCQkJCQkvLyB0cnkgbmV4dCByb3VuZA0KCQkJCQkvL30NCgkJCQl9DQoJCQkJLy8gSWYgd2UgZGlkbid0IGZpbmQgYWxpZ25tZW50IHBhdHRlcm4uLi4gd2VsbCB0cnkgYW55d2F5IHdpdGhvdXQgaXQNCgkJCX0NCgkJCQ0KCQkJdmFyIHRyYW5zZm9ybSA9IHRoaXMuY3JlYXRlVHJhbnNmb3JtKHRvcExlZnQsIHRvcFJpZ2h0LCBib3R0b21MZWZ0LCBhbGlnbm1lbnRQYXR0ZXJuLCBkaW1lbnNpb24pOw0KCQkJDQoJCQl2YXIgYml0cyA9IHRoaXMuc2FtcGxlR3JpZCh0aGlzLmltYWdlLCB0cmFuc2Zvcm0sIGRpbWVuc2lvbik7DQoJCQkNCgkJCXZhciBwb2ludHM7DQoJCQlpZiAoYWxpZ25tZW50UGF0dGVybiA9PSBudWxsKQ0KCQkJew0KCQkJCXBvaW50cyA9IG5ldyBBcnJheShib3R0b21MZWZ0LCB0b3BMZWZ0LCB0b3BSaWdodCk7DQoJCQl9DQoJCQllbHNlDQoJCQl7DQoJCQkJcG9pbnRzID0gbmV3IEFycmF5KGJvdHRvbUxlZnQsIHRvcExlZnQsIHRvcFJpZ2h0LCBhbGlnbm1lbnRQYXR0ZXJuKTsNCgkJCX0NCgkJCXJldHVybiBuZXcgRGV0ZWN0b3JSZXN1bHQoYml0cywgcG9pbnRzKTsNCgkJfQ0KCQkNCg0KCQ0KCXRoaXMuZGV0ZWN0PWZ1bmN0aW9uKCkNCgl7DQoJCXZhciBpbmZvID0gIG5ldyBGaW5kZXJQYXR0ZXJuRmluZGVyKCkuZmluZEZpbmRlclBhdHRlcm4odGhpcy5pbWFnZSk7DQoJCQkNCgkJcmV0dXJuIHRoaXMucHJvY2Vzc0ZpbmRlclBhdHRlcm5JbmZvKGluZm8pOyANCgl9DQp9</uax:ByteString>
		</Value>
	</UAVariable>
	<UAObject NodeId="ns=1;s=SYSTEM" BrowseName="1:SYSTEM">
		<DisplayName Locale="en">SYSTEM</DisplayName>
		<Description Locale="en">SYSTEM</Description>
		<References>
			<Reference ReferenceType="HasComponent" IsForward="false">Objects</Reference>
			<Reference ReferenceType="HasTypeDefinition">FolderType</Reference>
		</References>
		<Extensions>
			<atvise ExportedNodeId="ns=1;s=SYSTEM.LIBRARY.PROJECT.RESOURCES/QRCodeScanner/errorlevel.js" ExportedBrowseName="1:errorlevel.js" Upstream="true"/>
		</Extensions>
	</UAObject>
	<UAObject NodeId="ns=1;s=SYSTEM.LIBRARY" BrowseName="1:LIBRARY">
		<DisplayName Locale="en">LIBRARY</DisplayName>
		<Description Locale="en">LIBRARY</Description>
		<References>
			<Reference ReferenceType="HasComponent" IsForward="false">ns=1;s=SYSTEM</Reference>
			<Reference ReferenceType="HasTypeDefinition">FolderType</Reference>
		</References>
		<Extensions>
			<atvise Upstream="true"/>
		</Extensions>
	</UAObject>
	<UAObject NodeId="ns=1;s=SYSTEM.LIBRARY.PROJECT" BrowseName="1:PROJECT">
		<DisplayName Locale="en">PROJECT</DisplayName>
		<Description Locale="en">PROJECT</Description>
		<References>
			<Reference ReferenceType="HasComponent" IsForward="false">ns=1;s=SYSTEM.LIBRARY</Reference>
			<Reference ReferenceType="HasTypeDefinition">FolderType</Reference>
		</References>
		<Extensions>
			<atvise Upstream="true"/>
		</Extensions>
	</UAObject>
	<UAObject NodeId="ns=1;s=SYSTEM.LIBRARY.PROJECT.RESOURCES" BrowseName="1:RESOURCES">
		<DisplayName Locale="en">RESOURCES</DisplayName>
		<Description Locale="en">RESOURCES</Description>
		<References>
			<Reference ReferenceType="HasComponent" IsForward="false">ns=1;s=SYSTEM.LIBRARY.PROJECT</Reference>
			<Reference ReferenceType="HasTypeDefinition">FolderType</Reference>
		</References>
		<Extensions>
			<atvise Upstream="true"/>
		</Extensions>
	</UAObject>
	<UAObject NodeId="ns=1;s=SYSTEM.LIBRARY.PROJECT.RESOURCES/QRCodeScanner" BrowseName="1:QRCodeScanner">
		<DisplayName Locale="en">QRCodeScanner</DisplayName>
		<Description Locale="en">QRCodeScanner</Description>
		<References>
			<Reference ReferenceType="HasComponent" IsForward="false">ns=1;s=SYSTEM.LIBRARY.PROJECT.RESOURCES</Reference>
			<Reference ReferenceType="HasTypeDefinition">FolderType</Reference>
		</References>
		<Extensions>
			<atvise Upstream="true"/>
		</Extensions>
	</UAObject>
	<UAVariable NodeId="ns=1;s=SYSTEM.LIBRARY.PROJECT.RESOURCES/QRCodeScanner/errorlevel.js" BrowseName="1:errorlevel.js" DataType="ByteString" AccessLevel="103" UserAccessLevel="103" Historizing="true">
		<DisplayName Locale="en">errorlevel.js</DisplayName>
		<Description Locale="en">errorlevel.js</Description>
		<References>
			<Reference ReferenceType="HasComponent" IsForward="false">ns=1;s=SYSTEM.LIBRARY.PROJECT.RESOURCES/QRCodeScanner</Reference>
			<Reference ReferenceType="HasTypeDefinition">ns=1;s=VariableTypes.ATVISE.Resource.Javascript</Reference>
			<Reference ReferenceType="HasProperty">ns=1;s=VariableTypes.ATVISE.Resource.Javascript.Compress</Reference>
		</References>
		<Value>
			<uax:ByteString>LyoNCiAgUG9ydGVkIHRvIEphdmFTY3JpcHQgYnkgTGF6YXIgTGFzemxvIDIwMTEgDQogIA0KICBsYXphcnNvZnRAZ21haWwuY29tLCB3d3cubGF6YXJzb2Z0LmluZm8NCiAgDQoqLw0KDQovKg0KKg0KKiBDb3B5cmlnaHQgMjAwNyBaWGluZyBhdXRob3JzDQoqDQoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOw0KKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuDQoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KKg0KKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KKg0KKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KKi8NCg0KDQpmdW5jdGlvbiBFcnJvckNvcnJlY3Rpb25MZXZlbChvcmRpbmFsLCAgYml0cywgbmFtZSkNCnsNCgl0aGlzLm9yZGluYWxfUmVuYW1lZF9GaWVsZCA9IG9yZGluYWw7DQoJdGhpcy5iaXRzID0gYml0czsNCgl0aGlzLm5hbWUgPSBuYW1lOw0KCXRoaXMuX19kZWZpbmVHZXR0ZXJfXygiQml0cyIsIGZ1bmN0aW9uKCkNCgl7DQoJCXJldHVybiB0aGlzLmJpdHM7DQoJfSk7DQoJdGhpcy5fX2RlZmluZUdldHRlcl9fKCJOYW1lIiwgZnVuY3Rpb24oKQ0KCXsNCgkJcmV0dXJuIHRoaXMubmFtZTsNCgl9KTsNCgl0aGlzLm9yZGluYWw9ZnVuY3Rpb24oKQ0KCXsNCgkJcmV0dXJuIHRoaXMub3JkaW5hbF9SZW5hbWVkX0ZpZWxkOw0KCX0NCn0NCg0KRXJyb3JDb3JyZWN0aW9uTGV2ZWwuZm9yQml0cz1mdW5jdGlvbiggYml0cykNCnsNCglpZiAoYml0cyA8IDAgfHwgYml0cyA+PSBGT1JfQklUUy5sZW5ndGgpDQoJew0KCQl0aHJvdyAiQXJndW1lbnRFeGNlcHRpb24iOw0KCX0NCglyZXR1cm4gRk9SX0JJVFNbYml0c107DQp9DQoNCnZhciBMID0gbmV3IEVycm9yQ29ycmVjdGlvbkxldmVsKDAsIDB4MDEsICJMIik7DQp2YXIgTSA9IG5ldyBFcnJvckNvcnJlY3Rpb25MZXZlbCgxLCAweDAwLCAiTSIpOw0KdmFyIFEgPSBuZXcgRXJyb3JDb3JyZWN0aW9uTGV2ZWwoMiwgMHgwMywgIlEiKTsNCnZhciBIID0gbmV3IEVycm9yQ29ycmVjdGlvbkxldmVsKDMsIDB4MDIsICJIIik7DQp2YXIgRk9SX0JJVFMgPSBuZXcgQXJyYXkoIE0sIEwsIEgsIFEpOw==</uax:ByteString>
		</Value>
	</UAVariable>
	<UAObject NodeId="ns=1;s=SYSTEM" BrowseName="1:SYSTEM">
		<DisplayName Locale="en">SYSTEM</DisplayName>
		<Description Locale="en">SYSTEM</Description>
		<References>
			<Reference ReferenceType="HasComponent" IsForward="false">Objects</Reference>
			<Reference ReferenceType="HasTypeDefinition">FolderType</Reference>
		</References>
		<Extensions>
			<atvise ExportedNodeId="ns=1;s=SYSTEM.LIBRARY.PROJECT.RESOURCES/QRCodeScanner/findpat.js" ExportedBrowseName="1:findpat.js" Upstream="true"/>
		</Extensions>
	</UAObject>
	<UAObject NodeId="ns=1;s=SYSTEM.LIBRARY" BrowseName="1:LIBRARY">
		<DisplayName Locale="en">LIBRARY</DisplayName>
		<Description Locale="en">LIBRARY</Description>
		<References>
			<Reference ReferenceType="HasComponent" IsForward="false">ns=1;s=SYSTEM</Reference>
			<Reference ReferenceType="HasTypeDefinition">FolderType</Reference>
		</References>
		<Extensions>
			<atvise Upstream="true"/>
		</Extensions>
	</UAObject>
	<UAObject NodeId="ns=1;s=SYSTEM.LIBRARY.PROJECT" BrowseName="1:PROJECT">
		<DisplayName Locale="en">PROJECT</DisplayName>
		<Description Locale="en">PROJECT</Description>
		<References>
			<Reference ReferenceType="HasComponent" IsForward="false">ns=1;s=SYSTEM.LIBRARY</Reference>
			<Reference ReferenceType="HasTypeDefinition">FolderType</Reference>
		</References>
		<Extensions>
			<atvise Upstream="true"/>
		</Extensions>
	</UAObject>
	<UAObject NodeId="ns=1;s=SYSTEM.LIBRARY.PROJECT.RESOURCES" BrowseName="1:RESOURCES">
		<DisplayName Locale="en">RESOURCES</DisplayName>
		<Description Locale="en">RESOURCES</Description>
		<References>
			<Reference ReferenceType="HasComponent" IsForward="false">ns=1;s=SYSTEM.LIBRARY.PROJECT</Reference>
			<Reference ReferenceType="HasTypeDefinition">FolderType</Reference>
		</References>
		<Extensions>
			<atvise Upstream="true"/>
		</Extensions>
	</UAObject>
	<UAObject NodeId="ns=1;s=SYSTEM.LIBRARY.PROJECT.RESOURCES/QRCodeScanner" BrowseName="1:QRCodeScanner">
		<DisplayName Locale="en">QRCodeScanner</DisplayName>
		<Description Locale="en">QRCodeScanner</Description>
		<References>
			<Reference ReferenceType="HasComponent" IsForward="false">ns=1;s=SYSTEM.LIBRARY.PROJECT.RESOURCES</Reference>
			<Reference ReferenceType="HasTypeDefinition">FolderType</Reference>
		</References>
		<Extensions>
			<atvise Upstream="true"/>
		</Extensions>
	</UAObject>
	<UAVariable NodeId="ns=1;s=SYSTEM.LIBRARY.PROJECT.RESOURCES/QRCodeScanner/findpat.js" BrowseName="1:findpat.js" DataType="ByteString" AccessLevel="103" UserAccessLevel="103" Historizing="true">
		<DisplayName Locale="en">findpat.js</DisplayName>
		<Description Locale="en">findpat.js</Description>
		<References>
			<Reference ReferenceType="HasComponent" IsForward="false">ns=1;s=SYSTEM.LIBRARY.PROJECT.RESOURCES/QRCodeScanner</Reference>
			<Reference ReferenceType="HasTypeDefinition">ns=1;s=VariableTypes.ATVISE.Resource.Javascript</Reference>
			<Reference ReferenceType="HasProperty">ns=1;s=VariableTypes.ATVISE.Resource.Javascript.Compress</Reference>
		</References>
		<Value>
			<uax:ByteString>LyoNCiAgUG9ydGVkIHRvIEphdmFTY3JpcHQgYnkgTGF6YXIgTGFzemxvIDIwMTEgDQogIA0KICBsYXphcnNvZnRAZ21haWwuY29tLCB3d3cubGF6YXJzb2Z0LmluZm8NCiAgDQoqLw0KDQovKg0KKg0KKiBDb3B5cmlnaHQgMjAwNyBaWGluZyBhdXRob3JzDQoqDQoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOw0KKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuDQoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KKg0KKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KKg0KKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KKi8NCg0KDQp2YXIgTUlOX1NLSVAgPSAzOw0KdmFyIE1BWF9NT0RVTEVTID0gNTc7DQp2YXIgSU5URUdFUl9NQVRIX1NISUZUID0gODsNCnZhciBDRU5URVJfUVVPUlVNID0gMjsNCg0KcXJjb2RlLm9yZGVyQmVzdFBhdHRlcm5zPWZ1bmN0aW9uKHBhdHRlcm5zKQ0KCQl7DQoJCQkNCgkJCWZ1bmN0aW9uIGRpc3RhbmNlKCBwYXR0ZXJuMSwgIHBhdHRlcm4yKQ0KCQkJew0KCQkJCXZhciB4RGlmZiA9IHBhdHRlcm4xLlggLSBwYXR0ZXJuMi5YOw0KCQkJCXZhciB5RGlmZiA9IHBhdHRlcm4xLlkgLSBwYXR0ZXJuMi5ZOw0KCQkJCXJldHVybiAgTWF0aC5zcXJ0KCAoeERpZmYgKiB4RGlmZiArIHlEaWZmICogeURpZmYpKTsNCgkJCX0NCgkJCQ0KCQkJLy8vIDxzdW1tYXJ5PiBSZXR1cm5zIHRoZSB6IGNvbXBvbmVudCBvZiB0aGUgY3Jvc3MgcHJvZHVjdCBiZXR3ZWVuIHZlY3RvcnMgQkMgYW5kIEJBLjwvc3VtbWFyeT4NCgkJCWZ1bmN0aW9uIGNyb3NzUHJvZHVjdFooIHBvaW50QSwgIHBvaW50QiwgIHBvaW50QykNCgkJCXsNCgkJCQl2YXIgYlggPSBwb2ludEIueDsNCgkJCQl2YXIgYlkgPSBwb2ludEIueTsNCgkJCQlyZXR1cm4gKChwb2ludEMueCAtIGJYKSAqIChwb2ludEEueSAtIGJZKSkgLSAoKHBvaW50Qy55IC0gYlkpICogKHBvaW50QS54IC0gYlgpKTsNCgkJCX0NCg0KCQkJDQoJCQkvLyBGaW5kIGRpc3RhbmNlcyBiZXR3ZWVuIHBhdHRlcm4gY2VudGVycw0KCQkJdmFyIHplcm9PbmVEaXN0YW5jZSA9IGRpc3RhbmNlKHBhdHRlcm5zWzBdLCBwYXR0ZXJuc1sxXSk7DQoJCQl2YXIgb25lVHdvRGlzdGFuY2UgPSBkaXN0YW5jZShwYXR0ZXJuc1sxXSwgcGF0dGVybnNbMl0pOw0KCQkJdmFyIHplcm9Ud29EaXN0YW5jZSA9IGRpc3RhbmNlKHBhdHRlcm5zWzBdLCBwYXR0ZXJuc1syXSk7DQoJCQkNCgkJCXZhciBwb2ludEEsIHBvaW50QiwgcG9pbnRDOw0KCQkJLy8gQXNzdW1lIG9uZSBjbG9zZXN0IHRvIG90aGVyIHR3byBpcyBCOyBBIGFuZCBDIHdpbGwganVzdCBiZSBndWVzc2VzIGF0IGZpcnN0DQoJCQlpZiAob25lVHdvRGlzdGFuY2UgPj0gemVyb09uZURpc3RhbmNlICYmIG9uZVR3b0Rpc3RhbmNlID49IHplcm9Ud29EaXN0YW5jZSkNCgkJCXsNCgkJCQlwb2ludEIgPSBwYXR0ZXJuc1swXTsNCgkJCQlwb2ludEEgPSBwYXR0ZXJuc1sxXTsNCgkJCQlwb2ludEMgPSBwYXR0ZXJuc1syXTsNCgkJCX0NCgkJCWVsc2UgaWYgKHplcm9Ud29EaXN0YW5jZSA+PSBvbmVUd29EaXN0YW5jZSAmJiB6ZXJvVHdvRGlzdGFuY2UgPj0gemVyb09uZURpc3RhbmNlKQ0KCQkJew0KCQkJCXBvaW50QiA9IHBhdHRlcm5zWzFdOw0KCQkJCXBvaW50QSA9IHBhdHRlcm5zWzBdOw0KCQkJCXBvaW50QyA9IHBhdHRlcm5zWzJdOw0KCQkJfQ0KCQkJZWxzZQ0KCQkJew0KCQkJCXBvaW50QiA9IHBhdHRlcm5zWzJdOw0KCQkJCXBvaW50QSA9IHBhdHRlcm5zWzBdOw0KCQkJCXBvaW50QyA9IHBhdHRlcm5zWzFdOw0KCQkJfQ0KCQkJDQoJCQkvLyBVc2UgY3Jvc3MgcHJvZHVjdCB0byBmaWd1cmUgb3V0IHdoZXRoZXIgQSBhbmQgQyBhcmUgY29ycmVjdCBvciBmbGlwcGVkLg0KCQkJLy8gVGhpcyBhc2tzIHdoZXRoZXIgQkMgeCBCQSBoYXMgYSBwb3NpdGl2ZSB6IGNvbXBvbmVudCwgd2hpY2ggaXMgdGhlIGFycmFuZ2VtZW50DQoJCQkvLyB3ZSB3YW50IGZvciBBLCBCLCBDLiBJZiBpdCdzIG5lZ2F0aXZlLCB0aGVuIHdlJ3ZlIGdvdCBpdCBmbGlwcGVkIGFyb3VuZCBhbmQNCgkJCS8vIHNob3VsZCBzd2FwIEEgYW5kIEMuDQoJCQlpZiAoY3Jvc3NQcm9kdWN0Wihwb2ludEEsIHBvaW50QiwgcG9pbnRDKSA8IDAuMCkNCgkJCXsNCgkJCQl2YXIgdGVtcCA9IHBvaW50QTsNCgkJCQlwb2ludEEgPSBwb2ludEM7DQoJCQkJcG9pbnRDID0gdGVtcDsNCgkJCX0NCgkJCQ0KCQkJcGF0dGVybnNbMF0gPSBwb2ludEE7DQoJCQlwYXR0ZXJuc1sxXSA9IHBvaW50QjsNCgkJCXBhdHRlcm5zWzJdID0gcG9pbnRDOw0KCQl9DQoNCg0KZnVuY3Rpb24gRmluZGVyUGF0dGVybihwb3NYLCBwb3NZLCAgZXN0aW1hdGVkTW9kdWxlU2l6ZSkNCnsNCgl0aGlzLng9cG9zWDsNCgl0aGlzLnk9cG9zWTsNCgl0aGlzLmNvdW50ID0gMTsNCgl0aGlzLmVzdGltYXRlZE1vZHVsZVNpemUgPSBlc3RpbWF0ZWRNb2R1bGVTaXplOw0KCQ0KCXRoaXMuX19kZWZpbmVHZXR0ZXJfXygiRXN0aW1hdGVkTW9kdWxlU2l6ZSIsIGZ1bmN0aW9uKCkNCgl7DQoJCXJldHVybiB0aGlzLmVzdGltYXRlZE1vZHVsZVNpemU7DQoJfSk7IA0KCXRoaXMuX19kZWZpbmVHZXR0ZXJfXygiQ291bnQiLCBmdW5jdGlvbigpDQoJew0KCQlyZXR1cm4gdGhpcy5jb3VudDsNCgl9KTsNCgl0aGlzLl9fZGVmaW5lR2V0dGVyX18oIlgiLCBmdW5jdGlvbigpDQoJew0KCQlyZXR1cm4gdGhpcy54Ow0KCX0pOw0KCXRoaXMuX19kZWZpbmVHZXR0ZXJfXygiWSIsIGZ1bmN0aW9uKCkNCgl7DQoJCXJldHVybiB0aGlzLnk7DQoJfSk7DQoJdGhpcy5pbmNyZW1lbnRDb3VudCA9IGZ1bmN0aW9uKCkNCgl7DQoJCXRoaXMuY291bnQrKzsNCgl9DQoJdGhpcy5hYm91dEVxdWFscz1mdW5jdGlvbiggbW9kdWxlU2l6ZSwgIGksICBqKQ0KCQl7DQoJCQlpZiAoTWF0aC5hYnMoaSAtIHRoaXMueSkgPD0gbW9kdWxlU2l6ZSAmJiBNYXRoLmFicyhqIC0gdGhpcy54KSA8PSBtb2R1bGVTaXplKQ0KCQkJew0KCQkJCXZhciBtb2R1bGVTaXplRGlmZiA9IE1hdGguYWJzKG1vZHVsZVNpemUgLSB0aGlzLmVzdGltYXRlZE1vZHVsZVNpemUpOw0KCQkJCXJldHVybiBtb2R1bGVTaXplRGlmZiA8PSAxLjAgfHwgbW9kdWxlU2l6ZURpZmYgLyB0aGlzLmVzdGltYXRlZE1vZHVsZVNpemUgPD0gMS4wOw0KCQkJfQ0KCQkJcmV0dXJuIGZhbHNlOw0KCQl9DQoJDQp9DQoNCmZ1bmN0aW9uIEZpbmRlclBhdHRlcm5JbmZvKHBhdHRlcm5DZW50ZXJzKQ0Kew0KCXRoaXMuYm90dG9tTGVmdCA9IHBhdHRlcm5DZW50ZXJzWzBdOw0KCXRoaXMudG9wTGVmdCA9IHBhdHRlcm5DZW50ZXJzWzFdOw0KCXRoaXMudG9wUmlnaHQgPSBwYXR0ZXJuQ2VudGVyc1syXTsNCgl0aGlzLl9fZGVmaW5lR2V0dGVyX18oIkJvdHRvbUxlZnQiLCBmdW5jdGlvbigpDQoJew0KCQlyZXR1cm4gdGhpcy5ib3R0b21MZWZ0Ow0KCX0pOyANCgl0aGlzLl9fZGVmaW5lR2V0dGVyX18oIlRvcExlZnQiLCBmdW5jdGlvbigpDQoJew0KCQlyZXR1cm4gdGhpcy50b3BMZWZ0Ow0KCX0pOyANCgl0aGlzLl9fZGVmaW5lR2V0dGVyX18oIlRvcFJpZ2h0IiwgZnVuY3Rpb24oKQ0KCXsNCgkJcmV0dXJuIHRoaXMudG9wUmlnaHQ7DQoJfSk7IA0KfQ0KDQpmdW5jdGlvbiBGaW5kZXJQYXR0ZXJuRmluZGVyKCkNCnsNCgl0aGlzLmltYWdlPW51bGw7DQoJdGhpcy5wb3NzaWJsZUNlbnRlcnMgPSBbXTsNCgl0aGlzLmhhc1NraXBwZWQgPSBmYWxzZTsNCgl0aGlzLmNyb3NzQ2hlY2tTdGF0ZUNvdW50ID0gbmV3IEFycmF5KDAsMCwwLDAsMCk7DQoJdGhpcy5yZXN1bHRQb2ludENhbGxiYWNrID0gbnVsbDsNCgkNCgl0aGlzLl9fZGVmaW5lR2V0dGVyX18oIkNyb3NzQ2hlY2tTdGF0ZUNvdW50IiwgZnVuY3Rpb24oKQ0KCXsNCgkJdGhpcy5jcm9zc0NoZWNrU3RhdGVDb3VudFswXSA9IDA7DQoJCXRoaXMuY3Jvc3NDaGVja1N0YXRlQ291bnRbMV0gPSAwOw0KCQl0aGlzLmNyb3NzQ2hlY2tTdGF0ZUNvdW50WzJdID0gMDsNCgkJdGhpcy5jcm9zc0NoZWNrU3RhdGVDb3VudFszXSA9IDA7DQoJCXRoaXMuY3Jvc3NDaGVja1N0YXRlQ291bnRbNF0gPSAwOw0KCQlyZXR1cm4gdGhpcy5jcm9zc0NoZWNrU3RhdGVDb3VudDsNCgl9KTsgDQoJDQoJdGhpcy5mb3VuZFBhdHRlcm5Dcm9zcz1mdW5jdGlvbiggc3RhdGVDb3VudCkNCgkJew0KCQkJdmFyIHRvdGFsTW9kdWxlU2l6ZSA9IDA7DQoJCQlmb3IgKHZhciBpID0gMDsgaSA8IDU7IGkrKykNCgkJCXsNCgkJCQl2YXIgY291bnQgPSBzdGF0ZUNvdW50W2ldOw0KCQkJCWlmIChjb3VudCA9PSAwKQ0KCQkJCXsNCgkJCQkJcmV0dXJuIGZhbHNlOw0KCQkJCX0NCgkJCQl0b3RhbE1vZHVsZVNpemUgKz0gY291bnQ7DQoJCQl9DQoJCQlpZiAodG90YWxNb2R1bGVTaXplIDwgNykNCgkJCXsNCgkJCQlyZXR1cm4gZmFsc2U7DQoJCQl9DQoJCQl2YXIgbW9kdWxlU2l6ZSA9IE1hdGguZmxvb3IoKHRvdGFsTW9kdWxlU2l6ZSA8PCBJTlRFR0VSX01BVEhfU0hJRlQpIC8gNyk7DQoJCQl2YXIgbWF4VmFyaWFuY2UgPSBNYXRoLmZsb29yKG1vZHVsZVNpemUgLyAyKTsNCgkJCS8vIEFsbG93IGxlc3MgdGhhbiA1MCUgdmFyaWFuY2UgZnJvbSAxLTEtMy0xLTEgcHJvcG9ydGlvbnMNCgkJCXJldHVybiBNYXRoLmFicyhtb2R1bGVTaXplIC0gKHN0YXRlQ291bnRbMF0gPDwgSU5URUdFUl9NQVRIX1NISUZUKSkgPCBtYXhWYXJpYW5jZSAmJiBNYXRoLmFicyhtb2R1bGVTaXplIC0gKHN0YXRlQ291bnRbMV0gPDwgSU5URUdFUl9NQVRIX1NISUZUKSkgPCBtYXhWYXJpYW5jZSAmJiBNYXRoLmFicygzICogbW9kdWxlU2l6ZSAtIChzdGF0ZUNvdW50WzJdIDw8IElOVEVHRVJfTUFUSF9TSElGVCkpIDwgMyAqIG1heFZhcmlhbmNlICYmIE1hdGguYWJzKG1vZHVsZVNpemUgLSAoc3RhdGVDb3VudFszXSA8PCBJTlRFR0VSX01BVEhfU0hJRlQpKSA8IG1heFZhcmlhbmNlICYmIE1hdGguYWJzKG1vZHVsZVNpemUgLSAoc3RhdGVDb3VudFs0XSA8PCBJTlRFR0VSX01BVEhfU0hJRlQpKSA8IG1heFZhcmlhbmNlOw0KCQl9DQoJdGhpcy5jZW50ZXJGcm9tRW5kPWZ1bmN0aW9uKCBzdGF0ZUNvdW50LCAgZW5kKQ0KCQl7DQoJCQlyZXR1cm4gIChlbmQgLSBzdGF0ZUNvdW50WzRdIC0gc3RhdGVDb3VudFszXSkgLSBzdGF0ZUNvdW50WzJdIC8gMi4wOw0KCQl9DQoJdGhpcy5jcm9zc0NoZWNrVmVydGljYWw9ZnVuY3Rpb24oIHN0YXJ0SSwgIGNlbnRlckosICBtYXhDb3VudCwgIG9yaWdpbmFsU3RhdGVDb3VudFRvdGFsKQ0KCQl7DQoJCQl2YXIgaW1hZ2UgPSB0aGlzLmltYWdlOw0KCQkJDQoJCQl2YXIgbWF4SSA9IHFyY29kZS5oZWlnaHQ7DQoJCQl2YXIgc3RhdGVDb3VudCA9IHRoaXMuQ3Jvc3NDaGVja1N0YXRlQ291bnQ7DQoJCQkNCgkJCS8vIFN0YXJ0IGNvdW50aW5nIHVwIGZyb20gY2VudGVyDQoJCQl2YXIgaSA9IHN0YXJ0STsNCgkJCXdoaWxlIChpID49IDAgJiYgaW1hZ2VbY2VudGVySiArIGkqcXJjb2RlLndpZHRoXSkNCgkJCXsNCgkJCQlzdGF0ZUNvdW50WzJdKys7DQoJCQkJaS0tOw0KCQkJfQ0KCQkJaWYgKGkgPCAwKQ0KCQkJew0KCQkJCXJldHVybiBOYU47DQoJCQl9DQoJCQl3aGlsZSAoaSA+PSAwICYmICFpbWFnZVtjZW50ZXJKICtpKnFyY29kZS53aWR0aF0gJiYgc3RhdGVDb3VudFsxXSA8PSBtYXhDb3VudCkNCgkJCXsNCgkJCQlzdGF0ZUNvdW50WzFdKys7DQoJCQkJaS0tOw0KCQkJfQ0KCQkJLy8gSWYgYWxyZWFkeSB0b28gbWFueSBtb2R1bGVzIGluIHRoaXMgc3RhdGUgb3IgcmFuIG9mZiB0aGUgZWRnZToNCgkJCWlmIChpIDwgMCB8fCBzdGF0ZUNvdW50WzFdID4gbWF4Q291bnQpDQoJCQl7DQoJCQkJcmV0dXJuIE5hTjsNCgkJCX0NCgkJCXdoaWxlIChpID49IDAgJiYgaW1hZ2VbY2VudGVySiArIGkqcXJjb2RlLndpZHRoXSAmJiBzdGF0ZUNvdW50WzBdIDw9IG1heENvdW50KQ0KCQkJew0KCQkJCXN0YXRlQ291bnRbMF0rKzsNCgkJCQlpLS07DQoJCQl9DQoJCQlpZiAoc3RhdGVDb3VudFswXSA+IG1heENvdW50KQ0KCQkJew0KCQkJCXJldHVybiBOYU47DQoJCQl9DQoJCQkNCgkJCS8vIE5vdyBhbHNvIGNvdW50IGRvd24gZnJvbSBjZW50ZXINCgkJCWkgPSBzdGFydEkgKyAxOw0KCQkJd2hpbGUgKGkgPCBtYXhJICYmIGltYWdlW2NlbnRlckogK2kqcXJjb2RlLndpZHRoXSkNCgkJCXsNCgkJCQlzdGF0ZUNvdW50WzJdKys7DQoJCQkJaSsrOw0KCQkJfQ0KCQkJaWYgKGkgPT0gbWF4SSkNCgkJCXsNCgkJCQlyZXR1cm4gTmFOOw0KCQkJfQ0KCQkJd2hpbGUgKGkgPCBtYXhJICYmICFpbWFnZVtjZW50ZXJKICsgaSpxcmNvZGUud2lkdGhdICYmIHN0YXRlQ291bnRbM10gPCBtYXhDb3VudCkNCgkJCXsNCgkJCQlzdGF0ZUNvdW50WzNdKys7DQoJCQkJaSsrOw0KCQkJfQ0KCQkJaWYgKGkgPT0gbWF4SSB8fCBzdGF0ZUNvdW50WzNdID49IG1heENvdW50KQ0KCQkJew0KCQkJCXJldHVybiBOYU47DQoJCQl9DQoJCQl3aGlsZSAoaSA8IG1heEkgJiYgaW1hZ2VbY2VudGVySiArIGkqcXJjb2RlLndpZHRoXSAmJiBzdGF0ZUNvdW50WzRdIDwgbWF4Q291bnQpDQoJCQl7DQoJCQkJc3RhdGVDb3VudFs0XSsrOw0KCQkJCWkrKzsNCgkJCX0NCgkJCWlmIChzdGF0ZUNvdW50WzRdID49IG1heENvdW50KQ0KCQkJew0KCQkJCXJldHVybiBOYU47DQoJCQl9DQoJCQkNCgkJCS8vIElmIHdlIGZvdW5kIGEgZmluZGVyLXBhdHRlcm4tbGlrZSBzZWN0aW9uLCBidXQgaXRzIHNpemUgaXMgbW9yZSB0aGFuIDQwJSBkaWZmZXJlbnQgdGhhbg0KCQkJLy8gdGhlIG9yaWdpbmFsLCBhc3N1bWUgaXQncyBhIGZhbHNlIHBvc2l0aXZlDQoJCQl2YXIgc3RhdGVDb3VudFRvdGFsID0gc3RhdGVDb3VudFswXSArIHN0YXRlQ291bnRbMV0gKyBzdGF0ZUNvdW50WzJdICsgc3RhdGVDb3VudFszXSArIHN0YXRlQ291bnRbNF07DQoJCQlpZiAoNSAqIE1hdGguYWJzKHN0YXRlQ291bnRUb3RhbCAtIG9yaWdpbmFsU3RhdGVDb3VudFRvdGFsKSA+PSAyICogb3JpZ2luYWxTdGF0ZUNvdW50VG90YWwpDQoJCQl7DQoJCQkJcmV0dXJuIE5hTjsNCgkJCX0NCgkJCQ0KCQkJcmV0dXJuIHRoaXMuZm91bmRQYXR0ZXJuQ3Jvc3Moc3RhdGVDb3VudCk/dGhpcy5jZW50ZXJGcm9tRW5kKHN0YXRlQ291bnQsIGkpOk5hTjsNCgkJfQ0KCXRoaXMuY3Jvc3NDaGVja0hvcml6b250YWw9ZnVuY3Rpb24oIHN0YXJ0SiwgIGNlbnRlckksICBtYXhDb3VudCwgb3JpZ2luYWxTdGF0ZUNvdW50VG90YWwpDQoJCXsNCgkJCXZhciBpbWFnZSA9IHRoaXMuaW1hZ2U7DQoJCQkNCgkJCXZhciBtYXhKID0gcXJjb2RlLndpZHRoOw0KCQkJdmFyIHN0YXRlQ291bnQgPSB0aGlzLkNyb3NzQ2hlY2tTdGF0ZUNvdW50Ow0KCQkJDQoJCQl2YXIgaiA9IHN0YXJ0SjsNCgkJCXdoaWxlIChqID49IDAgJiYgaW1hZ2VbaisgY2VudGVySSpxcmNvZGUud2lkdGhdKQ0KCQkJew0KCQkJCXN0YXRlQ291bnRbMl0rKzsNCgkJCQlqLS07DQoJCQl9DQoJCQlpZiAoaiA8IDApDQoJCQl7DQoJCQkJcmV0dXJuIE5hTjsNCgkJCX0NCgkJCXdoaWxlIChqID49IDAgJiYgIWltYWdlW2orIGNlbnRlckkqcXJjb2RlLndpZHRoXSAmJiBzdGF0ZUNvdW50WzFdIDw9IG1heENvdW50KQ0KCQkJew0KCQkJCXN0YXRlQ291bnRbMV0rKzsNCgkJCQlqLS07DQoJCQl9DQoJCQlpZiAoaiA8IDAgfHwgc3RhdGVDb3VudFsxXSA+IG1heENvdW50KQ0KCQkJew0KCQkJCXJldHVybiBOYU47DQoJCQl9DQoJCQl3aGlsZSAoaiA+PSAwICYmIGltYWdlW2orIGNlbnRlckkqcXJjb2RlLndpZHRoXSAmJiBzdGF0ZUNvdW50WzBdIDw9IG1heENvdW50KQ0KCQkJew0KCQkJCXN0YXRlQ291bnRbMF0rKzsNCgkJCQlqLS07DQoJCQl9DQoJCQlpZiAoc3RhdGVDb3VudFswXSA+IG1heENvdW50KQ0KCQkJew0KCQkJCXJldHVybiBOYU47DQoJCQl9DQoJCQkNCgkJCWogPSBzdGFydEogKyAxOw0KCQkJd2hpbGUgKGogPCBtYXhKICYmIGltYWdlW2orIGNlbnRlckkqcXJjb2RlLndpZHRoXSkNCgkJCXsNCgkJCQlzdGF0ZUNvdW50WzJdKys7DQoJCQkJaisrOw0KCQkJfQ0KCQkJaWYgKGogPT0gbWF4SikNCgkJCXsNCgkJCQlyZXR1cm4gTmFOOw0KCQkJfQ0KCQkJd2hpbGUgKGogPCBtYXhKICYmICFpbWFnZVtqKyBjZW50ZXJJKnFyY29kZS53aWR0aF0gJiYgc3RhdGVDb3VudFszXSA8IG1heENvdW50KQ0KCQkJew0KCQkJCXN0YXRlQ291bnRbM10rKzsNCgkJCQlqKys7DQoJCQl9DQoJCQlpZiAoaiA9PSBtYXhKIHx8IHN0YXRlQ291bnRbM10gPj0gbWF4Q291bnQpDQoJCQl7DQoJCQkJcmV0dXJuIE5hTjsNCgkJCX0NCgkJCXdoaWxlIChqIDwgbWF4SiAmJiBpbWFnZVtqKyBjZW50ZXJJKnFyY29kZS53aWR0aF0gJiYgc3RhdGVDb3VudFs0XSA8IG1heENvdW50KQ0KCQkJew0KCQkJCXN0YXRlQ291bnRbNF0rKzsNCgkJCQlqKys7DQoJCQl9DQoJCQlpZiAoc3RhdGVDb3VudFs0XSA+PSBtYXhDb3VudCkNCgkJCXsNCgkJCQlyZXR1cm4gTmFOOw0KCQkJfQ0KCQkJDQoJCQkvLyBJZiB3ZSBmb3VuZCBhIGZpbmRlci1wYXR0ZXJuLWxpa2Ugc2VjdGlvbiwgYnV0IGl0cyBzaXplIGlzIHNpZ25pZmljYW50bHkgZGlmZmVyZW50IHRoYW4NCgkJCS8vIHRoZSBvcmlnaW5hbCwgYXNzdW1lIGl0J3MgYSBmYWxzZSBwb3NpdGl2ZQ0KCQkJdmFyIHN0YXRlQ291bnRUb3RhbCA9IHN0YXRlQ291bnRbMF0gKyBzdGF0ZUNvdW50WzFdICsgc3RhdGVDb3VudFsyXSArIHN0YXRlQ291bnRbM10gKyBzdGF0ZUNvdW50WzRdOw0KCQkJaWYgKDUgKiBNYXRoLmFicyhzdGF0ZUNvdW50VG90YWwgLSBvcmlnaW5hbFN0YXRlQ291bnRUb3RhbCkgPj0gb3JpZ2luYWxTdGF0ZUNvdW50VG90YWwpDQoJCQl7DQoJCQkJcmV0dXJuIE5hTjsNCgkJCX0NCgkJCQ0KCQkJcmV0dXJuIHRoaXMuZm91bmRQYXR0ZXJuQ3Jvc3Moc3RhdGVDb3VudCk/dGhpcy5jZW50ZXJGcm9tRW5kKHN0YXRlQ291bnQsIGopOk5hTjsNCgkJfQ0KCXRoaXMuaGFuZGxlUG9zc2libGVDZW50ZXI9ZnVuY3Rpb24oIHN0YXRlQ291bnQsICBpLCAgaikNCgkJew0KCQkJdmFyIHN0YXRlQ291bnRUb3RhbCA9IHN0YXRlQ291bnRbMF0gKyBzdGF0ZUNvdW50WzFdICsgc3RhdGVDb3VudFsyXSArIHN0YXRlQ291bnRbM10gKyBzdGF0ZUNvdW50WzRdOw0KCQkJdmFyIGNlbnRlckogPSB0aGlzLmNlbnRlckZyb21FbmQoc3RhdGVDb3VudCwgaik7IC8vZmxvYXQNCgkJCXZhciBjZW50ZXJJID0gdGhpcy5jcm9zc0NoZWNrVmVydGljYWwoaSwgTWF0aC5mbG9vciggY2VudGVySiksIHN0YXRlQ291bnRbMl0sIHN0YXRlQ291bnRUb3RhbCk7IC8vZmxvYXQNCgkJCWlmICghaXNOYU4oY2VudGVySSkpDQoJCQl7DQoJCQkJLy8gUmUtY3Jvc3MgY2hlY2sNCgkJCQljZW50ZXJKID0gdGhpcy5jcm9zc0NoZWNrSG9yaXpvbnRhbChNYXRoLmZsb29yKCBjZW50ZXJKKSwgTWF0aC5mbG9vciggY2VudGVySSksIHN0YXRlQ291bnRbMl0sIHN0YXRlQ291bnRUb3RhbCk7DQoJCQkJaWYgKCFpc05hTihjZW50ZXJKKSkNCgkJCQl7DQoJCQkJCXZhciBlc3RpbWF0ZWRNb2R1bGVTaXplID0gICBzdGF0ZUNvdW50VG90YWwgLyA3LjA7DQoJCQkJCXZhciBmb3VuZCA9IGZhbHNlOw0KCQkJCQl2YXIgbWF4ID0gdGhpcy5wb3NzaWJsZUNlbnRlcnMubGVuZ3RoOw0KCQkJCQlmb3IgKHZhciBpbmRleCA9IDA7IGluZGV4IDwgbWF4OyBpbmRleCsrKQ0KCQkJCQl7DQoJCQkJCQl2YXIgY2VudGVyID0gdGhpcy5wb3NzaWJsZUNlbnRlcnNbaW5kZXhdOw0KCQkJCQkJLy8gTG9vayBmb3IgYWJvdXQgdGhlIHNhbWUgY2VudGVyIGFuZCBtb2R1bGUgc2l6ZToNCgkJCQkJCWlmIChjZW50ZXIuYWJvdXRFcXVhbHMoZXN0aW1hdGVkTW9kdWxlU2l6ZSwgY2VudGVySSwgY2VudGVySikpDQoJCQkJCQl7DQoJCQkJCQkJY2VudGVyLmluY3JlbWVudENvdW50KCk7DQoJCQkJCQkJZm91bmQgPSB0cnVlOw0KCQkJCQkJCWJyZWFrOw0KCQkJCQkJfQ0KCQkJCQl9DQoJCQkJCWlmICghZm91bmQpDQoJCQkJCXsNCgkJCQkJCXZhciBwb2ludCA9IG5ldyBGaW5kZXJQYXR0ZXJuKGNlbnRlckosIGNlbnRlckksIGVzdGltYXRlZE1vZHVsZVNpemUpOw0KCQkJCQkJdGhpcy5wb3NzaWJsZUNlbnRlcnMucHVzaChwb2ludCk7DQoJCQkJCQlpZiAodGhpcy5yZXN1bHRQb2ludENhbGxiYWNrICE9IG51bGwpDQoJCQkJCQl7DQoJCQkJCQkJdGhpcy5yZXN1bHRQb2ludENhbGxiYWNrLmZvdW5kUG9zc2libGVSZXN1bHRQb2ludChwb2ludCk7DQoJCQkJCQl9DQoJCQkJCX0NCgkJCQkJcmV0dXJuIHRydWU7DQoJCQkJfQ0KCQkJfQ0KCQkJcmV0dXJuIGZhbHNlOw0KCQl9DQoJCQ0KCXRoaXMuc2VsZWN0QmVzdFBhdHRlcm5zPWZ1bmN0aW9uKCkNCgkJew0KCQkJDQoJCQl2YXIgc3RhcnRTaXplID0gdGhpcy5wb3NzaWJsZUNlbnRlcnMubGVuZ3RoOw0KCQkJaWYgKHN0YXJ0U2l6ZSA8IDMpDQoJCQl7DQoJCQkJLy8gQ291bGRuJ3QgZmluZCBlbm91Z2ggZmluZGVyIHBhdHRlcm5zDQoJCQkJdGhyb3cgIkNvdWxkbid0IGZpbmQgZW5vdWdoIGZpbmRlciBwYXR0ZXJucyAoZm91bmQgIiArIHN0YXJ0U2l6ZSArICIpIg0KCQkJfQ0KCQkJDQoJCQkvLyBGaWx0ZXIgb3V0bGllciBwb3NzaWJpbGl0aWVzIHdob3NlIG1vZHVsZSBzaXplIGlzIHRvbyBkaWZmZXJlbnQNCgkJCWlmIChzdGFydFNpemUgPiAzKQ0KCQkJew0KCQkJCS8vIEJ1dCB3ZSBjYW4gb25seSBhZmZvcmQgdG8gZG8gc28gaWYgd2UgaGF2ZSBhdCBsZWFzdCA0IHBvc3NpYmlsaXRpZXMgdG8gY2hvb3NlIGZyb20NCgkJCQl2YXIgdG90YWxNb2R1bGVTaXplID0gMC4wOw0KICAgICAgICAgICAgICAgIHZhciBzcXVhcmUgPSAwLjA7DQoJCQkJZm9yICh2YXIgaSA9IDA7IGkgPCBzdGFydFNpemU7IGkrKykNCgkJCQl7DQoJCQkJCS8vdG90YWxNb2R1bGVTaXplICs9ICB0aGlzLnBvc3NpYmxlQ2VudGVyc1tpXS5Fc3RpbWF0ZWRNb2R1bGVTaXplOw0KICAgICAgICAgICAgICAgICAgICB2YXIJY2VudGVyVmFsdWU9dGhpcy5wb3NzaWJsZUNlbnRlcnNbaV0uRXN0aW1hdGVkTW9kdWxlU2l6ZTsNCgkJCQkJdG90YWxNb2R1bGVTaXplICs9IGNlbnRlclZhbHVlOw0KCQkJCQlzcXVhcmUgKz0gKGNlbnRlclZhbHVlICogY2VudGVyVmFsdWUpOw0KCQkJCX0NCgkJCQl2YXIgYXZlcmFnZSA9IHRvdGFsTW9kdWxlU2l6ZSAvICBzdGFydFNpemU7DQogICAgICAgICAgICAgICAgdGhpcy5wb3NzaWJsZUNlbnRlcnMuc29ydChmdW5jdGlvbihjZW50ZXIxLGNlbnRlcjIpIHsNCgkJCQkgICAgICB2YXIgZEE9TWF0aC5hYnMoY2VudGVyMi5Fc3RpbWF0ZWRNb2R1bGVTaXplIC0gYXZlcmFnZSk7DQoJCQkJICAgICAgdmFyIGRCPU1hdGguYWJzKGNlbnRlcjEuRXN0aW1hdGVkTW9kdWxlU2l6ZSAtIGF2ZXJhZ2UpOw0KCQkJCSAgICAgIGlmIChkQSA8IGRCKSB7DQoJCQkJICAgIAkgIHJldHVybiAoLTEpOw0KCQkJCSAgICAgIH0gZWxzZSBpZiAoZEEgPT0gZEIpIHsNCgkJCQkgICAgCSAgcmV0dXJuIDA7DQoJCQkJICAgICAgfSBlbHNlIHsNCgkJCQkgICAgCSAgcmV0dXJuIDE7DQoJCQkJICAgICAgfQ0KCQkJCQl9KTsNCg0KCQkJCXZhciBzdGREZXYgPSBNYXRoLnNxcnQoc3F1YXJlIC8gc3RhcnRTaXplIC0gYXZlcmFnZSAqIGF2ZXJhZ2UpOw0KCQkJCXZhciBsaW1pdCA9IE1hdGgubWF4KDAuMiAqIGF2ZXJhZ2UsIHN0ZERldik7DQoJCQkJLy9mb3IgKHZhciBpID0gMDsgaSA8IHRoaXMucG9zc2libGVDZW50ZXJzLmxlbmd0aCAmJiB0aGlzLnBvc3NpYmxlQ2VudGVycy5sZW5ndGggPiAzOyBpKyspDQoJCQkJZm9yICh2YXIgaSA9IHRoaXMucG9zc2libGVDZW50ZXJzLmxlbmd0aCAtIDE7IGkgPj0gMCA7IGktLSkNCgkJCQl7DQoJCQkJCXZhciBwYXR0ZXJuID0gIHRoaXMucG9zc2libGVDZW50ZXJzW2ldOw0KCQkJCQkvL2lmIChNYXRoLmFicyhwYXR0ZXJuLkVzdGltYXRlZE1vZHVsZVNpemUgLSBhdmVyYWdlKSA+IDAuMiAqIGF2ZXJhZ2UpDQogICAgICAgICAgICAgICAgICAgIGlmIChNYXRoLmFicyhwYXR0ZXJuLkVzdGltYXRlZE1vZHVsZVNpemUgLSBhdmVyYWdlKSA+IGxpbWl0KQ0KCQkJCQl7DQoJCQkJCQkvL3RoaXMucG9zc2libGVDZW50ZXJzLnJlbW92ZShpKTsNCgkJCQkJCXRoaXMucG9zc2libGVDZW50ZXJzLnNwbGljZShpLDEpOw0KCQkJCQkJLy9pLS07DQoJCQkJCX0NCgkJCQl9DQoJCQl9DQoJCQkNCgkJCWlmICh0aGlzLnBvc3NpYmxlQ2VudGVycy5sZW5ndGggPiAzKQ0KCQkJew0KCQkJCS8vIFRocm93IGF3YXkgYWxsIGJ1dCB0aG9zZSBmaXJzdCBzaXplIGNhbmRpZGF0ZSBwb2ludHMgd2UgZm91bmQuDQoJCQkJdGhpcy5wb3NzaWJsZUNlbnRlcnMuc29ydChmdW5jdGlvbihhLCBiKXsNCgkJCQkJaWYgKGEuY291bnQgPiBiLmNvdW50KXtyZXR1cm4gLTE7fQ0KCQkJCQlpZiAoYS5jb3VudCA8IGIuY291bnQpe3JldHVybiAxO30NCgkJCQkJcmV0dXJuIDA7DQoJCQkJfSk7DQoJCQl9DQoJCQkNCgkJCXJldHVybiBuZXcgQXJyYXkoIHRoaXMucG9zc2libGVDZW50ZXJzWzBdLCAgdGhpcy5wb3NzaWJsZUNlbnRlcnNbMV0sICB0aGlzLnBvc3NpYmxlQ2VudGVyc1syXSk7DQoJCX0NCgkJDQoJdGhpcy5maW5kUm93U2tpcD1mdW5jdGlvbigpDQoJCXsNCgkJCXZhciBtYXggPSB0aGlzLnBvc3NpYmxlQ2VudGVycy5sZW5ndGg7DQoJCQlpZiAobWF4IDw9IDEpDQoJCQl7DQoJCQkJcmV0dXJuIDA7DQoJCQl9DQoJCQl2YXIgZmlyc3RDb25maXJtZWRDZW50ZXIgPSBudWxsOw0KCQkJZm9yICh2YXIgaSA9IDA7IGkgPCBtYXg7IGkrKykNCgkJCXsNCgkJCQl2YXIgY2VudGVyID0gIHRoaXMucG9zc2libGVDZW50ZXJzW2ldOw0KCQkJCWlmIChjZW50ZXIuQ291bnQgPj0gQ0VOVEVSX1FVT1JVTSkNCgkJCQl7DQoJCQkJCWlmIChmaXJzdENvbmZpcm1lZENlbnRlciA9PSBudWxsKQ0KCQkJCQl7DQoJCQkJCQlmaXJzdENvbmZpcm1lZENlbnRlciA9IGNlbnRlcjsNCgkJCQkJfQ0KCQkJCQllbHNlDQoJCQkJCXsNCgkJCQkJCS8vIFdlIGhhdmUgdHdvIGNvbmZpcm1lZCBjZW50ZXJzDQoJCQkJCQkvLyBIb3cgZmFyIGRvd24gY2FuIHdlIHNraXAgYmVmb3JlIHJlc3VtaW5nIGxvb2tpbmcgZm9yIHRoZSBuZXh0DQoJCQkJCQkvLyBwYXR0ZXJuPyBJbiB0aGUgd29yc3QgY2FzZSwgb25seSB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZQ0KCQkJCQkJLy8gZGlmZmVyZW5jZSBpbiB0aGUgeCAvIHkgY29vcmRpbmF0ZXMgb2YgdGhlIHR3byBjZW50ZXJzLg0KCQkJCQkJLy8gVGhpcyBpcyB0aGUgY2FzZSB3aGVyZSB5b3UgZmluZCB0b3AgbGVmdCBsYXN0Lg0KCQkJCQkJdGhpcy5oYXNTa2lwcGVkID0gdHJ1ZTsNCgkJCQkJCXJldHVybiBNYXRoLmZsb29yICgoTWF0aC5hYnMoZmlyc3RDb25maXJtZWRDZW50ZXIuWCAtIGNlbnRlci5YKSAtIE1hdGguYWJzKGZpcnN0Q29uZmlybWVkQ2VudGVyLlkgLSBjZW50ZXIuWSkpIC8gMik7DQoJCQkJCX0NCgkJCQl9DQoJCQl9DQoJCQlyZXR1cm4gMDsNCgkJfQ0KCQ0KCXRoaXMuaGF2ZU11bHRpcGx5Q29uZmlybWVkQ2VudGVycz1mdW5jdGlvbigpDQoJCXsNCgkJCXZhciBjb25maXJtZWRDb3VudCA9IDA7DQoJCQl2YXIgdG90YWxNb2R1bGVTaXplID0gMC4wOw0KCQkJdmFyIG1heCA9IHRoaXMucG9zc2libGVDZW50ZXJzLmxlbmd0aDsNCgkJCWZvciAodmFyIGkgPSAwOyBpIDwgbWF4OyBpKyspDQoJCQl7DQoJCQkJdmFyIHBhdHRlcm4gPSAgdGhpcy5wb3NzaWJsZUNlbnRlcnNbaV07DQoJCQkJaWYgKHBhdHRlcm4uQ291bnQgPj0gQ0VOVEVSX1FVT1JVTSkNCgkJCQl7DQoJCQkJCWNvbmZpcm1lZENvdW50Kys7DQoJCQkJCXRvdGFsTW9kdWxlU2l6ZSArPSBwYXR0ZXJuLkVzdGltYXRlZE1vZHVsZVNpemU7DQoJCQkJfQ0KCQkJfQ0KCQkJaWYgKGNvbmZpcm1lZENvdW50IDwgMykNCgkJCXsNCgkJCQlyZXR1cm4gZmFsc2U7DQoJCQl9DQoJCQkvLyBPSywgd2UgaGF2ZSBhdCBsZWFzdCAzIGNvbmZpcm1lZCBjZW50ZXJzLCBidXQsIGl0J3MgcG9zc2libGUgdGhhdCBvbmUgaXMgYSAiZmFsc2UgcG9zaXRpdmUiDQoJCQkvLyBhbmQgdGhhdCB3ZSBuZWVkIHRvIGtlZXAgbG9va2luZy4gV2UgZGV0ZWN0IHRoaXMgYnkgYXNraW5nIGlmIHRoZSBlc3RpbWF0ZWQgbW9kdWxlIHNpemVzDQoJCQkvLyB2YXJ5IHRvbyBtdWNoLiBXZSBhcmJpdHJhcmlseSBzYXkgdGhhdCB3aGVuIHRoZSB0b3RhbCBkZXZpYXRpb24gZnJvbSBhdmVyYWdlIGV4Y2VlZHMNCgkJCS8vIDUlIG9mIHRoZSB0b3RhbCBtb2R1bGUgc2l6ZSBlc3RpbWF0ZXMsIGl0J3MgdG9vIG11Y2guDQoJCQl2YXIgYXZlcmFnZSA9IHRvdGFsTW9kdWxlU2l6ZSAvIG1heDsNCgkJCXZhciB0b3RhbERldmlhdGlvbiA9IDAuMDsNCgkJCWZvciAodmFyIGkgPSAwOyBpIDwgbWF4OyBpKyspDQoJCQl7DQoJCQkJcGF0dGVybiA9IHRoaXMucG9zc2libGVDZW50ZXJzW2ldOw0KCQkJCXRvdGFsRGV2aWF0aW9uICs9IE1hdGguYWJzKHBhdHRlcm4uRXN0aW1hdGVkTW9kdWxlU2l6ZSAtIGF2ZXJhZ2UpOw0KCQkJfQ0KCQkJcmV0dXJuIHRvdGFsRGV2aWF0aW9uIDw9IDAuMDUgKiB0b3RhbE1vZHVsZVNpemU7DQoJCX0NCgkJDQoJdGhpcy5maW5kRmluZGVyUGF0dGVybiA9IGZ1bmN0aW9uKGltYWdlKXsNCgkJdmFyIHRyeUhhcmRlciA9IGZhbHNlOw0KCQl0aGlzLmltYWdlPWltYWdlOw0KCQl2YXIgbWF4SSA9IHFyY29kZS5oZWlnaHQ7DQoJCXZhciBtYXhKID0gcXJjb2RlLndpZHRoOw0KCQl2YXIgaVNraXAgPSBNYXRoLmZsb29yKCgzICogbWF4SSkgLyAoNCAqIE1BWF9NT0RVTEVTKSk7DQoJCWlmIChpU2tpcCA8IE1JTl9TS0lQIHx8IHRyeUhhcmRlcikNCgkJew0KCQkJCWlTa2lwID0gTUlOX1NLSVA7DQoJCX0NCgkJDQoJCXZhciBkb25lID0gZmFsc2U7DQoJCXZhciBzdGF0ZUNvdW50ID0gbmV3IEFycmF5KDUpOw0KCQlmb3IgKHZhciBpID0gaVNraXAgLSAxOyBpIDwgbWF4SSAmJiAhZG9uZTsgaSArPSBpU2tpcCkNCgkJew0KCQkJLy8gR2V0IGEgcm93IG9mIGJsYWNrL3doaXRlIHZhbHVlcw0KCQkJc3RhdGVDb3VudFswXSA9IDA7DQoJCQlzdGF0ZUNvdW50WzFdID0gMDsNCgkJCXN0YXRlQ291bnRbMl0gPSAwOw0KCQkJc3RhdGVDb3VudFszXSA9IDA7DQoJCQlzdGF0ZUNvdW50WzRdID0gMDsNCgkJCXZhciBjdXJyZW50U3RhdGUgPSAwOw0KCQkJZm9yICh2YXIgaiA9IDA7IGogPCBtYXhKOyBqKyspDQoJCQl7DQoJCQkJaWYgKGltYWdlW2oraSpxcmNvZGUud2lkdGhdICkNCgkJCQl7DQoJCQkJCS8vIEJsYWNrIHBpeGVsDQoJCQkJCWlmICgoY3VycmVudFN0YXRlICYgMSkgPT0gMSkNCgkJCQkJew0KCQkJCQkJLy8gQ291bnRpbmcgd2hpdGUgcGl4ZWxzDQoJCQkJCQljdXJyZW50U3RhdGUrKzsNCgkJCQkJfQ0KCQkJCQlzdGF0ZUNvdW50W2N1cnJlbnRTdGF0ZV0rKzsNCgkJCQl9DQoJCQkJZWxzZQ0KCQkJCXsNCgkJCQkJLy8gV2hpdGUgcGl4ZWwNCgkJCQkJaWYgKChjdXJyZW50U3RhdGUgJiAxKSA9PSAwKQ0KCQkJCQl7DQoJCQkJCQkvLyBDb3VudGluZyBibGFjayBwaXhlbHMNCgkJCQkJCWlmIChjdXJyZW50U3RhdGUgPT0gNCkNCgkJCQkJCXsNCgkJCQkJCQkvLyBBIHdpbm5lcj8NCgkJCQkJCQlpZiAodGhpcy5mb3VuZFBhdHRlcm5Dcm9zcyhzdGF0ZUNvdW50KSkNCgkJCQkJCQl7DQoJCQkJCQkJCS8vIFllcw0KCQkJCQkJCQl2YXIgY29uZmlybWVkID0gdGhpcy5oYW5kbGVQb3NzaWJsZUNlbnRlcihzdGF0ZUNvdW50LCBpLCBqKTsNCgkJCQkJCQkJaWYgKGNvbmZpcm1lZCkNCgkJCQkJCQkJew0KCQkJCQkJCQkJLy8gU3RhcnQgZXhhbWluaW5nIGV2ZXJ5IG90aGVyIGxpbmUuIENoZWNraW5nIGVhY2ggbGluZSB0dXJuZWQgb3V0IHRvIGJlIHRvbw0KCQkJCQkJCQkJLy8gZXhwZW5zaXZlIGFuZCBkaWRuJ3QgaW1wcm92ZSBwZXJmb3JtYW5jZS4NCgkJCQkJCQkJCWlTa2lwID0gMjsNCgkJCQkJCQkJCWlmICh0aGlzLmhhc1NraXBwZWQpDQoJCQkJCQkJCQl7DQoJCQkJCQkJCQkJZG9uZSA9IHRoaXMuaGF2ZU11bHRpcGx5Q29uZmlybWVkQ2VudGVycygpOw0KCQkJCQkJCQkJfQ0KCQkJCQkJCQkJZWxzZQ0KCQkJCQkJCQkJew0KCQkJCQkJCQkJCXZhciByb3dTa2lwID0gdGhpcy5maW5kUm93U2tpcCgpOw0KCQkJCQkJCQkJCWlmIChyb3dTa2lwID4gc3RhdGVDb3VudFsyXSkNCgkJCQkJCQkJCQl7DQoJCQkJCQkJCQkJCS8vIFNraXAgcm93cyBiZXR3ZWVuIHJvdyBvZiBsb3dlciBjb25maXJtZWQgY2VudGVyDQoJCQkJCQkJCQkJCS8vIGFuZCB0b3Agb2YgcHJlc3VtZWQgdGhpcmQgY29uZmlybWVkIGNlbnRlcg0KCQkJCQkJCQkJCQkvLyBidXQgYmFjayB1cCBhIGJpdCB0byBnZXQgYSBmdWxsIGNoYW5jZSBvZiBkZXRlY3RpbmcNCgkJCQkJCQkJCQkJLy8gaXQsIGVudGlyZSB3aWR0aCBvZiBjZW50ZXIgb2YgZmluZGVyIHBhdHRlcm4NCgkJCQkJCQkJCQkJDQoJCQkJCQkJCQkJCS8vIFNraXAgYnkgcm93U2tpcCwgYnV0IGJhY2sgb2ZmIGJ5IHN0YXRlQ291bnRbMl0gKHNpemUgb2YgbGFzdCBjZW50ZXINCgkJCQkJCQkJCQkJLy8gb2YgcGF0dGVybiB3ZSBzYXcpIHRvIGJlIGNvbnNlcnZhdGl2ZSwgYW5kIGFsc28gYmFjayBvZmYgYnkgaVNraXAgd2hpY2gNCgkJCQkJCQkJCQkJLy8gaXMgYWJvdXQgdG8gYmUgcmUtYWRkZWQNCgkJCQkJCQkJCQkJaSArPSByb3dTa2lwIC0gc3RhdGVDb3VudFsyXSAtIGlTa2lwOw0KCQkJCQkJCQkJCQlqID0gbWF4SiAtIDE7DQoJCQkJCQkJCQkJfQ0KCQkJCQkJCQkJfQ0KCQkJCQkJCQl9DQoJCQkJCQkJCWVsc2UNCgkJCQkJCQkJew0KCQkJCQkJCQkJLy8gQWR2YW5jZSB0byBuZXh0IGJsYWNrIHBpeGVsDQoJCQkJCQkJCQlkbyANCgkJCQkJCQkJCXsNCgkJCQkJCQkJCQlqKys7DQoJCQkJCQkJCQl9DQoJCQkJCQkJCQl3aGlsZSAoaiA8IG1heEogJiYgIWltYWdlW2ogKyBpKnFyY29kZS53aWR0aF0pOw0KCQkJCQkJCQkJai0tOyAvLyBiYWNrIHVwIHRvIHRoYXQgbGFzdCB3aGl0ZSBwaXhlbA0KCQkJCQkJCQl9DQoJCQkJCQkJCS8vIENsZWFyIHN0YXRlIHRvIHN0YXJ0IGxvb2tpbmcgYWdhaW4NCgkJCQkJCQkJY3VycmVudFN0YXRlID0gMDsNCgkJCQkJCQkJc3RhdGVDb3VudFswXSA9IDA7DQoJCQkJCQkJCXN0YXRlQ291bnRbMV0gPSAwOw0KCQkJCQkJCQlzdGF0ZUNvdW50WzJdID0gMDsNCgkJCQkJCQkJc3RhdGVDb3VudFszXSA9IDA7DQoJCQkJCQkJCXN0YXRlQ291bnRbNF0gPSAwOw0KCQkJCQkJCX0NCgkJCQkJCQllbHNlDQoJCQkJCQkJew0KCQkJCQkJCQkvLyBObywgc2hpZnQgY291bnRzIGJhY2sgYnkgdHdvDQoJCQkJCQkJCXN0YXRlQ291bnRbMF0gPSBzdGF0ZUNvdW50WzJdOw0KCQkJCQkJCQlzdGF0ZUNvdW50WzFdID0gc3RhdGVDb3VudFszXTsNCgkJCQkJCQkJc3RhdGVDb3VudFsyXSA9IHN0YXRlQ291bnRbNF07DQoJCQkJCQkJCXN0YXRlQ291bnRbM10gPSAxOw0KCQkJCQkJCQlzdGF0ZUNvdW50WzRdID0gMDsNCgkJCQkJCQkJY3VycmVudFN0YXRlID0gMzsNCgkJCQkJCQl9DQoJCQkJCQl9DQoJCQkJCQllbHNlDQoJCQkJCQl7DQoJCQkJCQkJc3RhdGVDb3VudFsrK2N1cnJlbnRTdGF0ZV0rKzsNCgkJCQkJCX0NCgkJCQkJfQ0KCQkJCQllbHNlDQoJCQkJCXsNCgkJCQkJCS8vIENvdW50aW5nIHdoaXRlIHBpeGVscw0KCQkJCQkJc3RhdGVDb3VudFtjdXJyZW50U3RhdGVdKys7DQoJCQkJCX0NCgkJCQl9DQoJCQl9DQoJCQlpZiAodGhpcy5mb3VuZFBhdHRlcm5Dcm9zcyhzdGF0ZUNvdW50KSkNCgkJCXsNCgkJCQl2YXIgY29uZmlybWVkID0gdGhpcy5oYW5kbGVQb3NzaWJsZUNlbnRlcihzdGF0ZUNvdW50LCBpLCBtYXhKKTsNCgkJCQlpZiAoY29uZmlybWVkKQ0KCQkJCXsNCgkJCQkJaVNraXAgPSBzdGF0ZUNvdW50WzBdOw0KCQkJCQlpZiAodGhpcy5oYXNTa2lwcGVkKQ0KCQkJCQl7DQoJCQkJCQkvLyBGb3VuZCBhIHRoaXJkIG9uZQ0KCQkJCQkJZG9uZSA9IHRoaXMuaGF2ZU11bHRpcGx5Q29uZmlybWVkQ2VudGVycygpOw0KCQkJCQl9DQoJCQkJfQ0KCQkJfQ0KCQl9DQoJCQ0KCQl2YXIgcGF0dGVybkluZm8gPSB0aGlzLnNlbGVjdEJlc3RQYXR0ZXJucygpOw0KCQlxcmNvZGUub3JkZXJCZXN0UGF0dGVybnMocGF0dGVybkluZm8pOw0KCQkNCgkJcmV0dXJuIG5ldyBGaW5kZXJQYXR0ZXJuSW5mbyhwYXR0ZXJuSW5mbyk7DQoJfTsNCn0=</uax:ByteString>
		</Value>
	</UAVariable>
	<UAObject NodeId="ns=1;s=SYSTEM" BrowseName="1:SYSTEM">
		<DisplayName Locale="en">SYSTEM</DisplayName>
		<Description Locale="en">SYSTEM</Description>
		<References>
			<Reference ReferenceType="HasComponent" IsForward="false">Objects</Reference>
			<Reference ReferenceType="HasTypeDefinition">FolderType</Reference>
		</References>
		<Extensions>
			<atvise ExportedNodeId="ns=1;s=SYSTEM.LIBRARY.PROJECT.RESOURCES/QRCodeScanner/formatinf.js" ExportedBrowseName="1:formatinf.js" Upstream="true"/>
		</Extensions>
	</UAObject>
	<UAObject NodeId="ns=1;s=SYSTEM.LIBRARY" BrowseName="1:LIBRARY">
		<DisplayName Locale="en">LIBRARY</DisplayName>
		<Description Locale="en">LIBRARY</Description>
		<References>
			<Reference ReferenceType="HasComponent" IsForward="false">ns=1;s=SYSTEM</Reference>
			<Reference ReferenceType="HasTypeDefinition">FolderType</Reference>
		</References>
		<Extensions>
			<atvise Upstream="true"/>
		</Extensions>
	</UAObject>
	<UAObject NodeId="ns=1;s=SYSTEM.LIBRARY.PROJECT" BrowseName="1:PROJECT">
		<DisplayName Locale="en">PROJECT</DisplayName>
		<Description Locale="en">PROJECT</Description>
		<References>
			<Reference ReferenceType="HasComponent" IsForward="false">ns=1;s=SYSTEM.LIBRARY</Reference>
			<Reference ReferenceType="HasTypeDefinition">FolderType</Reference>
		</References>
		<Extensions>
			<atvise Upstream="true"/>
		</Extensions>
	</UAObject>
	<UAObject NodeId="ns=1;s=SYSTEM.LIBRARY.PROJECT.RESOURCES" BrowseName="1:RESOURCES">
		<DisplayName Locale="en">RESOURCES</DisplayName>
		<Description Locale="en">RESOURCES</Description>
		<References>
			<Reference ReferenceType="HasComponent" IsForward="false">ns=1;s=SYSTEM.LIBRARY.PROJECT</Reference>
			<Reference ReferenceType="HasTypeDefinition">FolderType</Reference>
		</References>
		<Extensions>
			<atvise Upstream="true"/>
		</Extensions>
	</UAObject>
	<UAObject NodeId="ns=1;s=SYSTEM.LIBRARY.PROJECT.RESOURCES/QRCodeScanner" BrowseName="1:QRCodeScanner">
		<DisplayName Locale="en">QRCodeScanner</DisplayName>
		<Description Locale="en">QRCodeScanner</Description>
		<References>
			<Reference ReferenceType="HasComponent" IsForward="false">ns=1;s=SYSTEM.LIBRARY.PROJECT.RESOURCES</Reference>
			<Reference ReferenceType="HasTypeDefinition">FolderType</Reference>
		</References>
		<Extensions>
			<atvise Upstream="true"/>
		</Extensions>
	</UAObject>
	<UAVariable NodeId="ns=1;s=SYSTEM.LIBRARY.PROJECT.RESOURCES/QRCodeScanner/formatinf.js" BrowseName="1:formatinf.js" DataType="ByteString" AccessLevel="103" UserAccessLevel="103" Historizing="true">
		<DisplayName Locale="en">formatinf.js</DisplayName>
		<Description Locale="en">formatinf.js</Description>
		<References>
			<Reference ReferenceType="HasComponent" IsForward="false">ns=1;s=SYSTEM.LIBRARY.PROJECT.RESOURCES/QRCodeScanner</Reference>
			<Reference ReferenceType="HasTypeDefinition">ns=1;s=VariableTypes.ATVISE.Resource.Javascript</Reference>
			<Reference ReferenceType="HasProperty">ns=1;s=VariableTypes.ATVISE.Resource.Javascript.Compress</Reference>
		</References>
		<Value>
			<uax:ByteString>LyoNCiAgUG9ydGVkIHRvIEphdmFTY3JpcHQgYnkgTGF6YXIgTGFzemxvIDIwMTEgDQogIA0KICBsYXphcnNvZnRAZ21haWwuY29tLCB3d3cubGF6YXJzb2Z0LmluZm8NCiAgDQoqLw0KDQovKg0KKg0KKiBDb3B5cmlnaHQgMjAwNyBaWGluZyBhdXRob3JzDQoqDQoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOw0KKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuDQoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KKg0KKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KKg0KKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KKi8NCg0KDQp2YXIgRk9STUFUX0lORk9fTUFTS19RUiA9IDB4NTQxMjsNCnZhciBGT1JNQVRfSU5GT19ERUNPREVfTE9PS1VQID0gbmV3IEFycmF5KG5ldyBBcnJheSgweDU0MTIsIDB4MDApLCBuZXcgQXJyYXkoMHg1MTI1LCAweDAxKSwgbmV3IEFycmF5KDB4NUU3QywgMHgwMiksIG5ldyBBcnJheSgweDVCNEIsIDB4MDMpLCBuZXcgQXJyYXkoMHg0NUY5LCAweDA0KSwgbmV3IEFycmF5KDB4NDBDRSwgMHgwNSksIG5ldyBBcnJheSgweDRGOTcsIDB4MDYpLCBuZXcgQXJyYXkoMHg0QUEwLCAweDA3KSwgbmV3IEFycmF5KDB4NzdDNCwgMHgwOCksIG5ldyBBcnJheSgweDcyRjMsIDB4MDkpLCBuZXcgQXJyYXkoMHg3REFBLCAweDBBKSwgbmV3IEFycmF5KDB4Nzg5RCwgMHgwQiksIG5ldyBBcnJheSgweDY2MkYsIDB4MEMpLCBuZXcgQXJyYXkoMHg2MzE4LCAweDBEKSwgbmV3IEFycmF5KDB4NkM0MSwgMHgwRSksIG5ldyBBcnJheSgweDY5NzYsIDB4MEYpLCBuZXcgQXJyYXkoMHgxNjg5LCAweDEwKSwgbmV3IEFycmF5KDB4MTNCRSwgMHgxMSksIG5ldyBBcnJheSgweDFDRTcsIDB4MTIpLCBuZXcgQXJyYXkoMHgxOUQwLCAweDEzKSwgbmV3IEFycmF5KDB4MDc2MiwgMHgxNCksIG5ldyBBcnJheSgweDAyNTUsIDB4MTUpLCBuZXcgQXJyYXkoMHgwRDBDLCAweDE2KSwgbmV3IEFycmF5KDB4MDgzQiwgMHgxNyksIG5ldyBBcnJheSgweDM1NUYsIDB4MTgpLCBuZXcgQXJyYXkoMHgzMDY4LCAweDE5KSwgbmV3IEFycmF5KDB4M0YzMSwgMHgxQSksIG5ldyBBcnJheSgweDNBMDYsIDB4MUIpLCBuZXcgQXJyYXkoMHgyNEI0LCAweDFDKSwgbmV3IEFycmF5KDB4MjE4MywgMHgxRCksIG5ldyBBcnJheSgweDJFREEsIDB4MUUpLCBuZXcgQXJyYXkoMHgyQkVELCAweDFGKSk7DQp2YXIgQklUU19TRVRfSU5fSEFMRl9CWVRFID0gbmV3IEFycmF5KDAsIDEsIDEsIDIsIDEsIDIsIDIsIDMsIDEsIDIsIDIsIDMsIDIsIDMsIDMsIDQpOw0KDQoNCmZ1bmN0aW9uIEZvcm1hdEluZm9ybWF0aW9uKGZvcm1hdEluZm8pDQp7DQoJdGhpcy5lcnJvckNvcnJlY3Rpb25MZXZlbCA9IEVycm9yQ29ycmVjdGlvbkxldmVsLmZvckJpdHMoKGZvcm1hdEluZm8gPj4gMykgJiAweDAzKTsNCgl0aGlzLmRhdGFNYXNrID0gIChmb3JtYXRJbmZvICYgMHgwNyk7DQoNCgl0aGlzLl9fZGVmaW5lR2V0dGVyX18oIkVycm9yQ29ycmVjdGlvbkxldmVsIiwgZnVuY3Rpb24oKQ0KCXsNCgkJcmV0dXJuIHRoaXMuZXJyb3JDb3JyZWN0aW9uTGV2ZWw7DQoJfSk7DQoJdGhpcy5fX2RlZmluZUdldHRlcl9fKCJEYXRhTWFzayIsIGZ1bmN0aW9uKCkNCgl7DQoJCXJldHVybiB0aGlzLmRhdGFNYXNrOw0KCX0pOw0KCXRoaXMuR2V0SGFzaENvZGU9ZnVuY3Rpb24oKQ0KCXsNCgkJcmV0dXJuICh0aGlzLmVycm9yQ29ycmVjdGlvbkxldmVsLm9yZGluYWwoKSA8PCAzKSB8ICB0aGlzLmRhdGFNYXNrOw0KCX0NCgl0aGlzLkVxdWFscz1mdW5jdGlvbiggbykNCgl7DQoJCXZhciBvdGhlciA9ICBvOw0KCQlyZXR1cm4gdGhpcy5lcnJvckNvcnJlY3Rpb25MZXZlbCA9PSBvdGhlci5lcnJvckNvcnJlY3Rpb25MZXZlbCAmJiB0aGlzLmRhdGFNYXNrID09IG90aGVyLmRhdGFNYXNrOw0KCX0NCn0NCg0KRm9ybWF0SW5mb3JtYXRpb24ubnVtQml0c0RpZmZlcmluZz1mdW5jdGlvbiggYSwgIGIpDQp7DQoJYSBePSBiOyAvLyBhIG5vdyBoYXMgYSAxIGJpdCBleGFjdGx5IHdoZXJlIGl0cyBiaXQgZGlmZmVycyB3aXRoIGIncw0KCS8vIENvdW50IGJpdHMgc2V0IHF1aWNrbHkgd2l0aCBhIHNlcmllcyBvZiBsb29rdXBzOg0KCXJldHVybiBCSVRTX1NFVF9JTl9IQUxGX0JZVEVbYSAmIDB4MEZdICsgQklUU19TRVRfSU5fSEFMRl9CWVRFWyhVUlNoaWZ0KGEsIDQpICYgMHgwRildICsgQklUU19TRVRfSU5fSEFMRl9CWVRFWyhVUlNoaWZ0KGEsIDgpICYgMHgwRildICsgQklUU19TRVRfSU5fSEFMRl9CWVRFWyhVUlNoaWZ0KGEsIDEyKSAmIDB4MEYpXSArIEJJVFNfU0VUX0lOX0hBTEZfQllURVsoVVJTaGlmdChhLCAxNikgJiAweDBGKV0gKyBCSVRTX1NFVF9JTl9IQUxGX0JZVEVbKFVSU2hpZnQoYSwgMjApICYgMHgwRildICsgQklUU19TRVRfSU5fSEFMRl9CWVRFWyhVUlNoaWZ0KGEsIDI0KSAmIDB4MEYpXSArIEJJVFNfU0VUX0lOX0hBTEZfQllURVsoVVJTaGlmdChhLCAyOCkgJiAweDBGKV07DQp9DQoNCkZvcm1hdEluZm9ybWF0aW9uLmRlY29kZUZvcm1hdEluZm9ybWF0aW9uPWZ1bmN0aW9uKCBtYXNrZWRGb3JtYXRJbmZvKQ0Kew0KCXZhciBmb3JtYXRJbmZvID0gRm9ybWF0SW5mb3JtYXRpb24uZG9EZWNvZGVGb3JtYXRJbmZvcm1hdGlvbihtYXNrZWRGb3JtYXRJbmZvKTsNCglpZiAoZm9ybWF0SW5mbyAhPSBudWxsKQ0KCXsNCgkJcmV0dXJuIGZvcm1hdEluZm87DQoJfQ0KCS8vIFNob3VsZCByZXR1cm4gbnVsbCwgYnV0LCBzb21lIFFSIGNvZGVzIGFwcGFyZW50bHkNCgkvLyBkbyBub3QgbWFzayB0aGlzIGluZm8uIFRyeSBhZ2FpbiBieSBhY3R1YWxseSBtYXNraW5nIHRoZSBwYXR0ZXJuDQoJLy8gZmlyc3QNCglyZXR1cm4gRm9ybWF0SW5mb3JtYXRpb24uZG9EZWNvZGVGb3JtYXRJbmZvcm1hdGlvbihtYXNrZWRGb3JtYXRJbmZvIF4gRk9STUFUX0lORk9fTUFTS19RUik7DQp9DQpGb3JtYXRJbmZvcm1hdGlvbi5kb0RlY29kZUZvcm1hdEluZm9ybWF0aW9uPWZ1bmN0aW9uKCBtYXNrZWRGb3JtYXRJbmZvKQ0Kew0KCS8vIEZpbmQgdGhlIGludCBpbiBGT1JNQVRfSU5GT19ERUNPREVfTE9PS1VQIHdpdGggZmV3ZXN0IGJpdHMgZGlmZmVyaW5nDQoJdmFyIGJlc3REaWZmZXJlbmNlID0gMHhmZmZmZmZmZjsNCgl2YXIgYmVzdEZvcm1hdEluZm8gPSAwOw0KCWZvciAodmFyIGkgPSAwOyBpIDwgRk9STUFUX0lORk9fREVDT0RFX0xPT0tVUC5sZW5ndGg7IGkrKykNCgl7DQoJCXZhciBkZWNvZGVJbmZvID0gRk9STUFUX0lORk9fREVDT0RFX0xPT0tVUFtpXTsNCgkJdmFyIHRhcmdldEluZm8gPSBkZWNvZGVJbmZvWzBdOw0KCQlpZiAodGFyZ2V0SW5mbyA9PSBtYXNrZWRGb3JtYXRJbmZvKQ0KCQl7DQoJCQkvLyBGb3VuZCBhbiBleGFjdCBtYXRjaA0KCQkJcmV0dXJuIG5ldyBGb3JtYXRJbmZvcm1hdGlvbihkZWNvZGVJbmZvWzFdKTsNCgkJfQ0KCQl2YXIgYml0c0RpZmZlcmVuY2UgPSB0aGlzLm51bUJpdHNEaWZmZXJpbmcobWFza2VkRm9ybWF0SW5mbywgdGFyZ2V0SW5mbyk7DQoJCWlmIChiaXRzRGlmZmVyZW5jZSA8IGJlc3REaWZmZXJlbmNlKQ0KCQl7DQoJCQliZXN0Rm9ybWF0SW5mbyA9IGRlY29kZUluZm9bMV07DQoJCQliZXN0RGlmZmVyZW5jZSA9IGJpdHNEaWZmZXJlbmNlOw0KCQl9DQoJfQ0KCS8vIEhhbW1pbmcgZGlzdGFuY2Ugb2YgdGhlIDMyIG1hc2tlZCBjb2RlcyBpcyA3LCBieSBjb25zdHJ1Y3Rpb24sIHNvIDw9IDMgYml0cw0KCS8vIGRpZmZlcmluZyBtZWFucyB3ZSBmb3VuZCBhIG1hdGNoDQoJaWYgKGJlc3REaWZmZXJlbmNlIDw9IDMpDQoJew0KCQlyZXR1cm4gbmV3IEZvcm1hdEluZm9ybWF0aW9uKGJlc3RGb3JtYXRJbmZvKTsNCgl9DQoJcmV0dXJuIG51bGw7DQp9DQoNCgkJ</uax:ByteString>
		</Value>
	</UAVariable>
	<UAObject NodeId="ns=1;s=SYSTEM" BrowseName="1:SYSTEM">
		<DisplayName Locale="en">SYSTEM</DisplayName>
		<Description Locale="en">SYSTEM</Description>
		<References>
			<Reference ReferenceType="HasComponent" IsForward="false">Objects</Reference>
			<Reference ReferenceType="HasTypeDefinition">FolderType</Reference>
		</References>
		<Extensions>
			<atvise ExportedNodeId="ns=1;s=SYSTEM.LIBRARY.PROJECT.RESOURCES/QRCodeScanner/gf256.js" ExportedBrowseName="1:gf256.js" Upstream="true"/>
		</Extensions>
	</UAObject>
	<UAObject NodeId="ns=1;s=SYSTEM.LIBRARY" BrowseName="1:LIBRARY">
		<DisplayName Locale="en">LIBRARY</DisplayName>
		<Description Locale="en">LIBRARY</Description>
		<References>
			<Reference ReferenceType="HasComponent" IsForward="false">ns=1;s=SYSTEM</Reference>
			<Reference ReferenceType="HasTypeDefinition">FolderType</Reference>
		</References>
		<Extensions>
			<atvise Upstream="true"/>
		</Extensions>
	</UAObject>
	<UAObject NodeId="ns=1;s=SYSTEM.LIBRARY.PROJECT" BrowseName="1:PROJECT">
		<DisplayName Locale="en">PROJECT</DisplayName>
		<Description Locale="en">PROJECT</Description>
		<References>
			<Reference ReferenceType="HasComponent" IsForward="false">ns=1;s=SYSTEM.LIBRARY</Reference>
			<Reference ReferenceType="HasTypeDefinition">FolderType</Reference>
		</References>
		<Extensions>
			<atvise Upstream="true"/>
		</Extensions>
	</UAObject>
	<UAObject NodeId="ns=1;s=SYSTEM.LIBRARY.PROJECT.RESOURCES" BrowseName="1:RESOURCES">
		<DisplayName Locale="en">RESOURCES</DisplayName>
		<Description Locale="en">RESOURCES</Description>
		<References>
			<Reference ReferenceType="HasComponent" IsForward="false">ns=1;s=SYSTEM.LIBRARY.PROJECT</Reference>
			<Reference ReferenceType="HasTypeDefinition">FolderType</Reference>
		</References>
		<Extensions>
			<atvise Upstream="true"/>
		</Extensions>
	</UAObject>
	<UAObject NodeId="ns=1;s=SYSTEM.LIBRARY.PROJECT.RESOURCES/QRCodeScanner" BrowseName="1:QRCodeScanner">
		<DisplayName Locale="en">QRCodeScanner</DisplayName>
		<Description Locale="en">QRCodeScanner</Description>
		<References>
			<Reference ReferenceType="HasComponent" IsForward="false">ns=1;s=SYSTEM.LIBRARY.PROJECT.RESOURCES</Reference>
			<Reference ReferenceType="HasTypeDefinition">FolderType</Reference>
		</References>
		<Extensions>
			<atvise Upstream="true"/>
		</Extensions>
	</UAObject>
	<UAVariable NodeId="ns=1;s=SYSTEM.LIBRARY.PROJECT.RESOURCES/QRCodeScanner/gf256.js" BrowseName="1:gf256.js" DataType="ByteString" AccessLevel="103" UserAccessLevel="103" Historizing="true">
		<DisplayName Locale="en">gf256.js</DisplayName>
		<Description Locale="en">gf256.js</Description>
		<References>
			<Reference ReferenceType="HasComponent" IsForward="false">ns=1;s=SYSTEM.LIBRARY.PROJECT.RESOURCES/QRCodeScanner</Reference>
			<Reference ReferenceType="HasTypeDefinition">ns=1;s=VariableTypes.ATVISE.Resource.Javascript</Reference>
			<Reference ReferenceType="HasProperty">ns=1;s=VariableTypes.ATVISE.Resource.Javascript.Compress</Reference>
		</References>
		<Value>
			<uax:ByteString>LyoNCiAgUG9ydGVkIHRvIEphdmFTY3JpcHQgYnkgTGF6YXIgTGFzemxvIDIwMTEgDQogIA0KICBsYXphcnNvZnRAZ21haWwuY29tLCB3d3cubGF6YXJzb2Z0LmluZm8NCiAgDQoqLw0KDQovKg0KKg0KKiBDb3B5cmlnaHQgMjAwNyBaWGluZyBhdXRob3JzDQoqDQoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOw0KKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuDQoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KKg0KKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KKg0KKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KKi8NCg0KDQpmdW5jdGlvbiBHRjI1NiggcHJpbWl0aXZlKQ0Kew0KCXRoaXMuZXhwVGFibGUgPSBuZXcgQXJyYXkoMjU2KTsNCgl0aGlzLmxvZ1RhYmxlID0gbmV3IEFycmF5KDI1Nik7DQoJdmFyIHggPSAxOw0KCWZvciAodmFyIGkgPSAwOyBpIDwgMjU2OyBpKyspDQoJew0KCQl0aGlzLmV4cFRhYmxlW2ldID0geDsNCgkJeCA8PD0gMTsgLy8geCA9IHggKiAyOyB3ZSdyZSBhc3N1bWluZyB0aGUgZ2VuZXJhdG9yIGFscGhhIGlzIDINCgkJaWYgKHggPj0gMHgxMDApDQoJCXsNCgkJCXggXj0gcHJpbWl0aXZlOw0KCQl9DQoJfQ0KCWZvciAodmFyIGkgPSAwOyBpIDwgMjU1OyBpKyspDQoJew0KCQl0aGlzLmxvZ1RhYmxlW3RoaXMuZXhwVGFibGVbaV1dID0gaTsNCgl9DQoJLy8gbG9nVGFibGVbMF0gPT0gMCBidXQgdGhpcyBzaG91bGQgbmV2ZXIgYmUgdXNlZA0KCXZhciBhdDA9bmV3IEFycmF5KDEpO2F0MFswXT0wOw0KCXRoaXMuemVybyA9IG5ldyBHRjI1NlBvbHkodGhpcywgbmV3IEFycmF5KGF0MCkpOw0KCXZhciBhdDE9bmV3IEFycmF5KDEpO2F0MVswXT0xOw0KCXRoaXMub25lID0gbmV3IEdGMjU2UG9seSh0aGlzLCBuZXcgQXJyYXkoYXQxKSk7DQoJDQoJdGhpcy5fX2RlZmluZUdldHRlcl9fKCJaZXJvIiwgZnVuY3Rpb24oKQ0KCXsNCgkJcmV0dXJuIHRoaXMuemVybzsNCgl9KTsNCgl0aGlzLl9fZGVmaW5lR2V0dGVyX18oIk9uZSIsIGZ1bmN0aW9uKCkNCgl7DQoJCXJldHVybiB0aGlzLm9uZTsNCgl9KTsNCgl0aGlzLmJ1aWxkTW9ub21pYWw9ZnVuY3Rpb24oIGRlZ3JlZSwgIGNvZWZmaWNpZW50KQ0KCQl7DQoJCQlpZiAoZGVncmVlIDwgMCkNCgkJCXsNCgkJCQl0aHJvdyAiU3lzdGVtLkFyZ3VtZW50RXhjZXB0aW9uIjsNCgkJCX0NCgkJCWlmIChjb2VmZmljaWVudCA9PSAwKQ0KCQkJew0KCQkJCXJldHVybiB0aGlzLnplcm87DQoJCQl9DQoJCQl2YXIgY29lZmZpY2llbnRzID0gbmV3IEFycmF5KGRlZ3JlZSArIDEpOw0KCQkJZm9yKHZhciBpPTA7aTxjb2VmZmljaWVudHMubGVuZ3RoO2krKyljb2VmZmljaWVudHNbaV09MDsNCgkJCWNvZWZmaWNpZW50c1swXSA9IGNvZWZmaWNpZW50Ow0KCQkJcmV0dXJuIG5ldyBHRjI1NlBvbHkodGhpcywgY29lZmZpY2llbnRzKTsNCgkJfQ0KCXRoaXMuZXhwPWZ1bmN0aW9uKCBhKQ0KCQl7DQoJCQlyZXR1cm4gdGhpcy5leHBUYWJsZVthXTsNCgkJfQ0KCXRoaXMubG9nPWZ1bmN0aW9uKCBhKQ0KCQl7DQoJCQlpZiAoYSA9PSAwKQ0KCQkJew0KCQkJCXRocm93ICJTeXN0ZW0uQXJndW1lbnRFeGNlcHRpb24iOw0KCQkJfQ0KCQkJcmV0dXJuIHRoaXMubG9nVGFibGVbYV07DQoJCX0NCgl0aGlzLmludmVyc2U9ZnVuY3Rpb24oIGEpDQoJCXsNCgkJCWlmIChhID09IDApDQoJCQl7DQoJCQkJdGhyb3cgIlN5c3RlbS5Bcml0aG1ldGljRXhjZXB0aW9uIjsNCgkJCX0NCgkJCXJldHVybiB0aGlzLmV4cFRhYmxlWzI1NSAtIHRoaXMubG9nVGFibGVbYV1dOw0KCQl9DQoJdGhpcy5tdWx0aXBseT1mdW5jdGlvbiggYSwgIGIpDQoJCXsNCgkJCWlmIChhID09IDAgfHwgYiA9PSAwKQ0KCQkJew0KCQkJCXJldHVybiAwOw0KCQkJfQ0KCQkJaWYgKGEgPT0gMSkNCgkJCXsNCgkJCQlyZXR1cm4gYjsNCgkJCX0NCgkJCWlmIChiID09IDEpDQoJCQl7DQoJCQkJcmV0dXJuIGE7DQoJCQl9DQoJCQlyZXR1cm4gdGhpcy5leHBUYWJsZVsodGhpcy5sb2dUYWJsZVthXSArIHRoaXMubG9nVGFibGVbYl0pICUgMjU1XTsNCgkJfQkJDQp9DQoNCkdGMjU2LlFSX0NPREVfRklFTEQgPSBuZXcgR0YyNTYoMHgwMTFEKTsNCkdGMjU2LkRBVEFfTUFUUklYX0ZJRUxEID0gbmV3IEdGMjU2KDB4MDEyRCk7DQoNCkdGMjU2LmFkZE9yU3VidHJhY3Q9ZnVuY3Rpb24oIGEsICBiKQ0Kew0KCXJldHVybiBhIF4gYjsNCn0=</uax:ByteString>
		</Value>
	</UAVariable>
	<UAObject NodeId="ns=1;s=SYSTEM" BrowseName="1:SYSTEM">
		<DisplayName Locale="en">SYSTEM</DisplayName>
		<Description Locale="en">SYSTEM</Description>
		<References>
			<Reference ReferenceType="HasComponent" IsForward="false">Objects</Reference>
			<Reference ReferenceType="HasTypeDefinition">FolderType</Reference>
		</References>
		<Extensions>
			<atvise ExportedNodeId="ns=1;s=SYSTEM.LIBRARY.PROJECT.RESOURCES/QRCodeScanner/gf256poly.js" ExportedBrowseName="1:gf256poly.js" Upstream="true"/>
		</Extensions>
	</UAObject>
	<UAObject NodeId="ns=1;s=SYSTEM.LIBRARY" BrowseName="1:LIBRARY">
		<DisplayName Locale="en">LIBRARY</DisplayName>
		<Description Locale="en">LIBRARY</Description>
		<References>
			<Reference ReferenceType="HasComponent" IsForward="false">ns=1;s=SYSTEM</Reference>
			<Reference ReferenceType="HasTypeDefinition">FolderType</Reference>
		</References>
		<Extensions>
			<atvise Upstream="true"/>
		</Extensions>
	</UAObject>
	<UAObject NodeId="ns=1;s=SYSTEM.LIBRARY.PROJECT" BrowseName="1:PROJECT">
		<DisplayName Locale="en">PROJECT</DisplayName>
		<Description Locale="en">PROJECT</Description>
		<References>
			<Reference ReferenceType="HasComponent" IsForward="false">ns=1;s=SYSTEM.LIBRARY</Reference>
			<Reference ReferenceType="HasTypeDefinition">FolderType</Reference>
		</References>
		<Extensions>
			<atvise Upstream="true"/>
		</Extensions>
	</UAObject>
	<UAObject NodeId="ns=1;s=SYSTEM.LIBRARY.PROJECT.RESOURCES" BrowseName="1:RESOURCES">
		<DisplayName Locale="en">RESOURCES</DisplayName>
		<Description Locale="en">RESOURCES</Description>
		<References>
			<Reference ReferenceType="HasComponent" IsForward="false">ns=1;s=SYSTEM.LIBRARY.PROJECT</Reference>
			<Reference ReferenceType="HasTypeDefinition">FolderType</Reference>
		</References>
		<Extensions>
			<atvise Upstream="true"/>
		</Extensions>
	</UAObject>
	<UAObject NodeId="ns=1;s=SYSTEM.LIBRARY.PROJECT.RESOURCES/QRCodeScanner" BrowseName="1:QRCodeScanner">
		<DisplayName Locale="en">QRCodeScanner</DisplayName>
		<Description Locale="en">QRCodeScanner</Description>
		<References>
			<Reference ReferenceType="HasComponent" IsForward="false">ns=1;s=SYSTEM.LIBRARY.PROJECT.RESOURCES</Reference>
			<Reference ReferenceType="HasTypeDefinition">FolderType</Reference>
		</References>
		<Extensions>
			<atvise Upstream="true"/>
		</Extensions>
	</UAObject>
	<UAVariable NodeId="ns=1;s=SYSTEM.LIBRARY.PROJECT.RESOURCES/QRCodeScanner/gf256poly.js" BrowseName="1:gf256poly.js" DataType="ByteString" AccessLevel="103" UserAccessLevel="103" Historizing="true">
		<DisplayName Locale="en">gf256poly.js</DisplayName>
		<Description Locale="en">gf256poly.js</Description>
		<References>
			<Reference ReferenceType="HasComponent" IsForward="false">ns=1;s=SYSTEM.LIBRARY.PROJECT.RESOURCES/QRCodeScanner</Reference>
			<Reference ReferenceType="HasTypeDefinition">ns=1;s=VariableTypes.ATVISE.Resource.Javascript</Reference>
			<Reference ReferenceType="HasProperty">ns=1;s=VariableTypes.ATVISE.Resource.Javascript.Compress</Reference>
		</References>
		<Value>
			<uax:ByteString>LyoNCiAgUG9ydGVkIHRvIEphdmFTY3JpcHQgYnkgTGF6YXIgTGFzemxvIDIwMTEgDQogIA0KICBsYXphcnNvZnRAZ21haWwuY29tLCB3d3cubGF6YXJzb2Z0LmluZm8NCiAgDQoqLw0KDQovKg0KKg0KKiBDb3B5cmlnaHQgMjAwNyBaWGluZyBhdXRob3JzDQoqDQoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOw0KKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuDQoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KKg0KKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KKg0KKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KKi8NCg0KDQpmdW5jdGlvbiBHRjI1NlBvbHkoZmllbGQsICBjb2VmZmljaWVudHMpDQp7DQoJaWYgKGNvZWZmaWNpZW50cyA9PSBudWxsIHx8IGNvZWZmaWNpZW50cy5sZW5ndGggPT0gMCkNCgl7DQoJCXRocm93ICJTeXN0ZW0uQXJndW1lbnRFeGNlcHRpb24iOw0KCX0NCgl0aGlzLmZpZWxkID0gZmllbGQ7DQoJdmFyIGNvZWZmaWNpZW50c0xlbmd0aCA9IGNvZWZmaWNpZW50cy5sZW5ndGg7DQoJaWYgKGNvZWZmaWNpZW50c0xlbmd0aCA+IDEgJiYgY29lZmZpY2llbnRzWzBdID09IDApDQoJew0KCQkvLyBMZWFkaW5nIHRlcm0gbXVzdCBiZSBub24temVybyBmb3IgYW55dGhpbmcgZXhjZXB0IHRoZSBjb25zdGFudCBwb2x5bm9taWFsICIwIg0KCQl2YXIgZmlyc3ROb25aZXJvID0gMTsNCgkJd2hpbGUgKGZpcnN0Tm9uWmVybyA8IGNvZWZmaWNpZW50c0xlbmd0aCAmJiBjb2VmZmljaWVudHNbZmlyc3ROb25aZXJvXSA9PSAwKQ0KCQl7DQoJCQlmaXJzdE5vblplcm8rKzsNCgkJfQ0KCQlpZiAoZmlyc3ROb25aZXJvID09IGNvZWZmaWNpZW50c0xlbmd0aCkNCgkJew0KCQkJdGhpcy5jb2VmZmljaWVudHMgPSBmaWVsZC5aZXJvLmNvZWZmaWNpZW50czsNCgkJfQ0KCQllbHNlDQoJCXsNCgkJCXRoaXMuY29lZmZpY2llbnRzID0gbmV3IEFycmF5KGNvZWZmaWNpZW50c0xlbmd0aCAtIGZpcnN0Tm9uWmVybyk7DQoJCQlmb3IodmFyIGk9MDtpPHRoaXMuY29lZmZpY2llbnRzLmxlbmd0aDtpKyspdGhpcy5jb2VmZmljaWVudHNbaV09MDsNCgkJCS8vQXJyYXkuQ29weShjb2VmZmljaWVudHMsIGZpcnN0Tm9uWmVybywgdGhpcy5jb2VmZmljaWVudHMsIDAsIHRoaXMuY29lZmZpY2llbnRzLmxlbmd0aCk7DQoJCQlmb3IodmFyIGNpPTA7Y2k8dGhpcy5jb2VmZmljaWVudHMubGVuZ3RoO2NpKyspdGhpcy5jb2VmZmljaWVudHNbY2ldPWNvZWZmaWNpZW50c1tmaXJzdE5vblplcm8rY2ldOw0KCQl9DQoJfQ0KCWVsc2UNCgl7DQoJCXRoaXMuY29lZmZpY2llbnRzID0gY29lZmZpY2llbnRzOw0KCX0NCgkNCgl0aGlzLl9fZGVmaW5lR2V0dGVyX18oIlplcm8iLCBmdW5jdGlvbigpDQoJew0KCQlyZXR1cm4gdGhpcy5jb2VmZmljaWVudHNbMF0gPT0gMDsNCgl9KTsNCgl0aGlzLl9fZGVmaW5lR2V0dGVyX18oIkRlZ3JlZSIsIGZ1bmN0aW9uKCkNCgl7DQoJCXJldHVybiB0aGlzLmNvZWZmaWNpZW50cy5sZW5ndGggLSAxOw0KCX0pOw0KCXRoaXMuX19kZWZpbmVHZXR0ZXJfXygiQ29lZmZpY2llbnRzIiwgZnVuY3Rpb24oKQ0KCXsNCgkJcmV0dXJuIHRoaXMuY29lZmZpY2llbnRzOw0KCX0pOw0KCQ0KCXRoaXMuZ2V0Q29lZmZpY2llbnQ9ZnVuY3Rpb24oIGRlZ3JlZSkNCgl7DQoJCXJldHVybiB0aGlzLmNvZWZmaWNpZW50c1t0aGlzLmNvZWZmaWNpZW50cy5sZW5ndGggLSAxIC0gZGVncmVlXTsNCgl9DQoJDQoJdGhpcy5ldmFsdWF0ZUF0PWZ1bmN0aW9uKCBhKQ0KCXsNCgkJaWYgKGEgPT0gMCkNCgkJew0KCQkJLy8gSnVzdCByZXR1cm4gdGhlIHheMCBjb2VmZmljaWVudA0KCQkJcmV0dXJuIHRoaXMuZ2V0Q29lZmZpY2llbnQoMCk7DQoJCX0NCgkJdmFyIHNpemUgPSB0aGlzLmNvZWZmaWNpZW50cy5sZW5ndGg7DQoJCWlmIChhID09IDEpDQoJCXsNCgkJCS8vIEp1c3QgdGhlIHN1bSBvZiB0aGUgY29lZmZpY2llbnRzDQoJCQl2YXIgcmVzdWx0ID0gMDsNCgkJCWZvciAodmFyIGkgPSAwOyBpIDwgc2l6ZTsgaSsrKQ0KCQkJew0KCQkJCXJlc3VsdCA9IEdGMjU2LmFkZE9yU3VidHJhY3QocmVzdWx0LCB0aGlzLmNvZWZmaWNpZW50c1tpXSk7DQoJCQl9DQoJCQlyZXR1cm4gcmVzdWx0Ow0KCQl9DQoJCXZhciByZXN1bHQyID0gdGhpcy5jb2VmZmljaWVudHNbMF07DQoJCWZvciAodmFyIGkgPSAxOyBpIDwgc2l6ZTsgaSsrKQ0KCQl7DQoJCQlyZXN1bHQyID0gR0YyNTYuYWRkT3JTdWJ0cmFjdCh0aGlzLmZpZWxkLm11bHRpcGx5KGEsIHJlc3VsdDIpLCB0aGlzLmNvZWZmaWNpZW50c1tpXSk7DQoJCX0NCgkJcmV0dXJuIHJlc3VsdDI7DQoJfQ0KCQ0KCXRoaXMuYWRkT3JTdWJ0cmFjdD1mdW5jdGlvbiggb3RoZXIpDQoJCXsNCgkJCWlmICh0aGlzLmZpZWxkICE9IG90aGVyLmZpZWxkKQ0KCQkJew0KCQkJCXRocm93ICJHRjI1NlBvbHlzIGRvIG5vdCBoYXZlIHNhbWUgR0YyNTYgZmllbGQiOw0KCQkJfQ0KCQkJaWYgKHRoaXMuWmVybykNCgkJCXsNCgkJCQlyZXR1cm4gb3RoZXI7DQoJCQl9DQoJCQlpZiAob3RoZXIuWmVybykNCgkJCXsNCgkJCQlyZXR1cm4gdGhpczsNCgkJCX0NCgkJCQ0KCQkJdmFyIHNtYWxsZXJDb2VmZmljaWVudHMgPSB0aGlzLmNvZWZmaWNpZW50czsNCgkJCXZhciBsYXJnZXJDb2VmZmljaWVudHMgPSBvdGhlci5jb2VmZmljaWVudHM7DQoJCQlpZiAoc21hbGxlckNvZWZmaWNpZW50cy5sZW5ndGggPiBsYXJnZXJDb2VmZmljaWVudHMubGVuZ3RoKQ0KCQkJew0KCQkJCXZhciB0ZW1wID0gc21hbGxlckNvZWZmaWNpZW50czsNCgkJCQlzbWFsbGVyQ29lZmZpY2llbnRzID0gbGFyZ2VyQ29lZmZpY2llbnRzOw0KCQkJCWxhcmdlckNvZWZmaWNpZW50cyA9IHRlbXA7DQoJCQl9DQoJCQl2YXIgc3VtRGlmZiA9IG5ldyBBcnJheShsYXJnZXJDb2VmZmljaWVudHMubGVuZ3RoKTsNCgkJCXZhciBsZW5ndGhEaWZmID0gbGFyZ2VyQ29lZmZpY2llbnRzLmxlbmd0aCAtIHNtYWxsZXJDb2VmZmljaWVudHMubGVuZ3RoOw0KCQkJLy8gQ29weSBoaWdoLW9yZGVyIHRlcm1zIG9ubHkgZm91bmQgaW4gaGlnaGVyLWRlZ3JlZSBwb2x5bm9taWFsJ3MgY29lZmZpY2llbnRzDQoJCQkvL0FycmF5LkNvcHkobGFyZ2VyQ29lZmZpY2llbnRzLCAwLCBzdW1EaWZmLCAwLCBsZW5ndGhEaWZmKTsNCgkJCWZvcih2YXIgY2k9MDtjaTxsZW5ndGhEaWZmO2NpKyspc3VtRGlmZltjaV09bGFyZ2VyQ29lZmZpY2llbnRzW2NpXTsNCgkJCQ0KCQkJZm9yICh2YXIgaSA9IGxlbmd0aERpZmY7IGkgPCBsYXJnZXJDb2VmZmljaWVudHMubGVuZ3RoOyBpKyspDQoJCQl7DQoJCQkJc3VtRGlmZltpXSA9IEdGMjU2LmFkZE9yU3VidHJhY3Qoc21hbGxlckNvZWZmaWNpZW50c1tpIC0gbGVuZ3RoRGlmZl0sIGxhcmdlckNvZWZmaWNpZW50c1tpXSk7DQoJCQl9DQoJCQkNCgkJCXJldHVybiBuZXcgR0YyNTZQb2x5KGZpZWxkLCBzdW1EaWZmKTsNCgl9DQoJdGhpcy5tdWx0aXBseTE9ZnVuY3Rpb24oIG90aGVyKQ0KCQl7DQoJCQlpZiAodGhpcy5maWVsZCE9b3RoZXIuZmllbGQpDQoJCQl7DQoJCQkJdGhyb3cgIkdGMjU2UG9seXMgZG8gbm90IGhhdmUgc2FtZSBHRjI1NiBmaWVsZCI7DQoJCQl9DQoJCQlpZiAodGhpcy5aZXJvIHx8IG90aGVyLlplcm8pDQoJCQl7DQoJCQkJcmV0dXJuIHRoaXMuZmllbGQuWmVybzsNCgkJCX0NCgkJCXZhciBhQ29lZmZpY2llbnRzID0gdGhpcy5jb2VmZmljaWVudHM7DQoJCQl2YXIgYUxlbmd0aCA9IGFDb2VmZmljaWVudHMubGVuZ3RoOw0KCQkJdmFyIGJDb2VmZmljaWVudHMgPSBvdGhlci5jb2VmZmljaWVudHM7DQoJCQl2YXIgYkxlbmd0aCA9IGJDb2VmZmljaWVudHMubGVuZ3RoOw0KCQkJdmFyIHByb2R1Y3QgPSBuZXcgQXJyYXkoYUxlbmd0aCArIGJMZW5ndGggLSAxKTsNCgkJCWZvciAodmFyIGkgPSAwOyBpIDwgYUxlbmd0aDsgaSsrKQ0KCQkJew0KCQkJCXZhciBhQ29lZmYgPSBhQ29lZmZpY2llbnRzW2ldOw0KCQkJCWZvciAodmFyIGogPSAwOyBqIDwgYkxlbmd0aDsgaisrKQ0KCQkJCXsNCgkJCQkJcHJvZHVjdFtpICsgal0gPSBHRjI1Ni5hZGRPclN1YnRyYWN0KHByb2R1Y3RbaSArIGpdLCB0aGlzLmZpZWxkLm11bHRpcGx5KGFDb2VmZiwgYkNvZWZmaWNpZW50c1tqXSkpOw0KCQkJCX0NCgkJCX0NCgkJCXJldHVybiBuZXcgR0YyNTZQb2x5KHRoaXMuZmllbGQsIHByb2R1Y3QpOw0KCQl9DQoJdGhpcy5tdWx0aXBseTI9ZnVuY3Rpb24oIHNjYWxhcikNCgkJew0KCQkJaWYgKHNjYWxhciA9PSAwKQ0KCQkJew0KCQkJCXJldHVybiB0aGlzLmZpZWxkLlplcm87DQoJCQl9DQoJCQlpZiAoc2NhbGFyID09IDEpDQoJCQl7DQoJCQkJcmV0dXJuIHRoaXM7DQoJCQl9DQoJCQl2YXIgc2l6ZSA9IHRoaXMuY29lZmZpY2llbnRzLmxlbmd0aDsNCgkJCXZhciBwcm9kdWN0ID0gbmV3IEFycmF5KHNpemUpOw0KCQkJZm9yICh2YXIgaSA9IDA7IGkgPCBzaXplOyBpKyspDQoJCQl7DQoJCQkJcHJvZHVjdFtpXSA9IHRoaXMuZmllbGQubXVsdGlwbHkodGhpcy5jb2VmZmljaWVudHNbaV0sIHNjYWxhcik7DQoJCQl9DQoJCQlyZXR1cm4gbmV3IEdGMjU2UG9seSh0aGlzLmZpZWxkLCBwcm9kdWN0KTsNCgkJfQ0KCXRoaXMubXVsdGlwbHlCeU1vbm9taWFsPWZ1bmN0aW9uKCBkZWdyZWUsICBjb2VmZmljaWVudCkNCgkJew0KCQkJaWYgKGRlZ3JlZSA8IDApDQoJCQl7DQoJCQkJdGhyb3cgIlN5c3RlbS5Bcmd1bWVudEV4Y2VwdGlvbiI7DQoJCQl9DQoJCQlpZiAoY29lZmZpY2llbnQgPT0gMCkNCgkJCXsNCgkJCQlyZXR1cm4gdGhpcy5maWVsZC5aZXJvOw0KCQkJfQ0KCQkJdmFyIHNpemUgPSB0aGlzLmNvZWZmaWNpZW50cy5sZW5ndGg7DQoJCQl2YXIgcHJvZHVjdCA9IG5ldyBBcnJheShzaXplICsgZGVncmVlKTsNCgkJCWZvcih2YXIgaT0wO2k8cHJvZHVjdC5sZW5ndGg7aSsrKXByb2R1Y3RbaV09MDsNCgkJCWZvciAodmFyIGkgPSAwOyBpIDwgc2l6ZTsgaSsrKQ0KCQkJew0KCQkJCXByb2R1Y3RbaV0gPSB0aGlzLmZpZWxkLm11bHRpcGx5KHRoaXMuY29lZmZpY2llbnRzW2ldLCBjb2VmZmljaWVudCk7DQoJCQl9DQoJCQlyZXR1cm4gbmV3IEdGMjU2UG9seSh0aGlzLmZpZWxkLCBwcm9kdWN0KTsNCgkJfQ0KCXRoaXMuZGl2aWRlPWZ1bmN0aW9uKCBvdGhlcikNCgkJew0KCQkJaWYgKHRoaXMuZmllbGQhPW90aGVyLmZpZWxkKQ0KCQkJew0KCQkJCXRocm93ICJHRjI1NlBvbHlzIGRvIG5vdCBoYXZlIHNhbWUgR0YyNTYgZmllbGQiOw0KCQkJfQ0KCQkJaWYgKG90aGVyLlplcm8pDQoJCQl7DQoJCQkJdGhyb3cgIkRpdmlkZSBieSAwIjsNCgkJCX0NCgkJCQ0KCQkJdmFyIHF1b3RpZW50ID0gdGhpcy5maWVsZC5aZXJvOw0KCQkJdmFyIHJlbWFpbmRlciA9IHRoaXM7DQoJCQkNCgkJCXZhciBkZW5vbWluYXRvckxlYWRpbmdUZXJtID0gb3RoZXIuZ2V0Q29lZmZpY2llbnQob3RoZXIuRGVncmVlKTsNCgkJCXZhciBpbnZlcnNlRGVub21pbmF0b3JMZWFkaW5nVGVybSA9IHRoaXMuZmllbGQuaW52ZXJzZShkZW5vbWluYXRvckxlYWRpbmdUZXJtKTsNCgkJCQ0KCQkJd2hpbGUgKHJlbWFpbmRlci5EZWdyZWUgPj0gb3RoZXIuRGVncmVlICYmICFyZW1haW5kZXIuWmVybykNCgkJCXsNCgkJCQl2YXIgZGVncmVlRGlmZmVyZW5jZSA9IHJlbWFpbmRlci5EZWdyZWUgLSBvdGhlci5EZWdyZWU7DQoJCQkJdmFyIHNjYWxlID0gdGhpcy5maWVsZC5tdWx0aXBseShyZW1haW5kZXIuZ2V0Q29lZmZpY2llbnQocmVtYWluZGVyLkRlZ3JlZSksIGludmVyc2VEZW5vbWluYXRvckxlYWRpbmdUZXJtKTsNCgkJCQl2YXIgdGVybSA9IG90aGVyLm11bHRpcGx5QnlNb25vbWlhbChkZWdyZWVEaWZmZXJlbmNlLCBzY2FsZSk7DQoJCQkJdmFyIGl0ZXJhdGlvblF1b3RpZW50ID0gdGhpcy5maWVsZC5idWlsZE1vbm9taWFsKGRlZ3JlZURpZmZlcmVuY2UsIHNjYWxlKTsNCgkJCQlxdW90aWVudCA9IHF1b3RpZW50LmFkZE9yU3VidHJhY3QoaXRlcmF0aW9uUXVvdGllbnQpOw0KCQkJCXJlbWFpbmRlciA9IHJlbWFpbmRlci5hZGRPclN1YnRyYWN0KHRlcm0pOw0KCQkJfQ0KCQkJDQoJCQlyZXR1cm4gbmV3IEFycmF5KHF1b3RpZW50LCByZW1haW5kZXIpOw0KCQl9DQp9</uax:ByteString>
		</Value>
	</UAVariable>
	<UAObject NodeId="ns=1;s=SYSTEM" BrowseName="1:SYSTEM">
		<DisplayName Locale="en">SYSTEM</DisplayName>
		<Description Locale="en">SYSTEM</Description>
		<References>
			<Reference ReferenceType="HasComponent" IsForward="false">Objects</Reference>
			<Reference ReferenceType="HasTypeDefinition">FolderType</Reference>
		</References>
		<Extensions>
			<atvise ExportedNodeId="ns=1;s=SYSTEM.LIBRARY.PROJECT.RESOURCES/QRCodeScanner/grid.js" ExportedBrowseName="1:grid.js" Upstream="true"/>
		</Extensions>
	</UAObject>
	<UAObject NodeId="ns=1;s=SYSTEM.LIBRARY" BrowseName="1:LIBRARY">
		<DisplayName Locale="en">LIBRARY</DisplayName>
		<Description Locale="en">LIBRARY</Description>
		<References>
			<Reference ReferenceType="HasComponent" IsForward="false">ns=1;s=SYSTEM</Reference>
			<Reference ReferenceType="HasTypeDefinition">FolderType</Reference>
		</References>
		<Extensions>
			<atvise Upstream="true"/>
		</Extensions>
	</UAObject>
	<UAObject NodeId="ns=1;s=SYSTEM.LIBRARY.PROJECT" BrowseName="1:PROJECT">
		<DisplayName Locale="en">PROJECT</DisplayName>
		<Description Locale="en">PROJECT</Description>
		<References>
			<Reference ReferenceType="HasComponent" IsForward="false">ns=1;s=SYSTEM.LIBRARY</Reference>
			<Reference ReferenceType="HasTypeDefinition">FolderType</Reference>
		</References>
		<Extensions>
			<atvise Upstream="true"/>
		</Extensions>
	</UAObject>
	<UAObject NodeId="ns=1;s=SYSTEM.LIBRARY.PROJECT.RESOURCES" BrowseName="1:RESOURCES">
		<DisplayName Locale="en">RESOURCES</DisplayName>
		<Description Locale="en">RESOURCES</Description>
		<References>
			<Reference ReferenceType="HasComponent" IsForward="false">ns=1;s=SYSTEM.LIBRARY.PROJECT</Reference>
			<Reference ReferenceType="HasTypeDefinition">FolderType</Reference>
		</References>
		<Extensions>
			<atvise Upstream="true"/>
		</Extensions>
	</UAObject>
	<UAObject NodeId="ns=1;s=SYSTEM.LIBRARY.PROJECT.RESOURCES/QRCodeScanner" BrowseName="1:QRCodeScanner">
		<DisplayName Locale="en">QRCodeScanner</DisplayName>
		<Description Locale="en">QRCodeScanner</Description>
		<References>
			<Reference ReferenceType="HasComponent" IsForward="false">ns=1;s=SYSTEM.LIBRARY.PROJECT.RESOURCES</Reference>
			<Reference ReferenceType="HasTypeDefinition">FolderType</Reference>
		</References>
		<Extensions>
			<atvise Upstream="true"/>
		</Extensions>
	</UAObject>
	<UAVariable NodeId="ns=1;s=SYSTEM.LIBRARY.PROJECT.RESOURCES/QRCodeScanner/grid.js" BrowseName="1:grid.js" DataType="ByteString" AccessLevel="103" UserAccessLevel="103" Historizing="true">
		<DisplayName Locale="en">grid.js</DisplayName>
		<Description Locale="en">grid.js</Description>
		<References>
			<Reference ReferenceType="HasComponent" IsForward="false">ns=1;s=SYSTEM.LIBRARY.PROJECT.RESOURCES/QRCodeScanner</Reference>
			<Reference ReferenceType="HasTypeDefinition">ns=1;s=VariableTypes.ATVISE.Resource.Javascript</Reference>
			<Reference ReferenceType="HasProperty">ns=1;s=VariableTypes.ATVISE.Resource.Javascript.Compress</Reference>
		</References>
		<Value>
			<uax:ByteString>LyoNCiAgUG9ydGVkIHRvIEphdmFTY3JpcHQgYnkgTGF6YXIgTGFzemxvIDIwMTEgDQogIA0KICBsYXphcnNvZnRAZ21haWwuY29tLCB3d3cubGF6YXJzb2Z0LmluZm8NCiAgDQoqLw0KDQovKg0KKg0KKiBDb3B5cmlnaHQgMjAwNyBaWGluZyBhdXRob3JzDQoqDQoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOw0KKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuDQoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KKg0KKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KKg0KKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KKi8NCg0KDQp2YXIgR3JpZFNhbXBsZXIgPSB7fTsNCg0KR3JpZFNhbXBsZXIuY2hlY2tBbmROdWRnZVBvaW50cz1mdW5jdGlvbiggaW1hZ2UsICBwb2ludHMpDQoJCXsNCgkJCXZhciB3aWR0aCA9IHFyY29kZS53aWR0aDsNCgkJCXZhciBoZWlnaHQgPSBxcmNvZGUuaGVpZ2h0Ow0KCQkJLy8gQ2hlY2sgYW5kIG51ZGdlIHBvaW50cyBmcm9tIHN0YXJ0IHVudGlsIHdlIHNlZSBzb21lIHRoYXQgYXJlIE9LOg0KCQkJdmFyIG51ZGdlZCA9IHRydWU7DQoJCQlmb3IgKHZhciBvZmZzZXQgPSAwOyBvZmZzZXQgPCBwb2ludHMubGVuZ3RoICYmIG51ZGdlZDsgb2Zmc2V0ICs9IDIpDQoJCQl7DQoJCQkJdmFyIHggPSBNYXRoLmZsb29yIChwb2ludHNbb2Zmc2V0XSk7DQoJCQkJdmFyIHkgPSBNYXRoLmZsb29yKCBwb2ludHNbb2Zmc2V0ICsgMV0pOw0KCQkJCWlmICh4IDwgLSAxIHx8IHggPiB3aWR0aCB8fCB5IDwgLSAxIHx8IHkgPiBoZWlnaHQpDQoJCQkJew0KCQkJCQl0aHJvdyAiRXJyb3IuY2hlY2tBbmROdWRnZVBvaW50cyAiOw0KCQkJCX0NCgkJCQludWRnZWQgPSBmYWxzZTsNCgkJCQlpZiAoeCA9PSAtIDEpDQoJCQkJew0KCQkJCQlwb2ludHNbb2Zmc2V0XSA9IDAuMDsNCgkJCQkJbnVkZ2VkID0gdHJ1ZTsNCgkJCQl9DQoJCQkJZWxzZSBpZiAoeCA9PSB3aWR0aCkNCgkJCQl7DQoJCQkJCXBvaW50c1tvZmZzZXRdID0gd2lkdGggLSAxOw0KCQkJCQludWRnZWQgPSB0cnVlOw0KCQkJCX0NCgkJCQlpZiAoeSA9PSAtIDEpDQoJCQkJew0KCQkJCQlwb2ludHNbb2Zmc2V0ICsgMV0gPSAwLjA7DQoJCQkJCW51ZGdlZCA9IHRydWU7DQoJCQkJfQ0KCQkJCWVsc2UgaWYgKHkgPT0gaGVpZ2h0KQ0KCQkJCXsNCgkJCQkJcG9pbnRzW29mZnNldCArIDFdID0gaGVpZ2h0IC0gMTsNCgkJCQkJbnVkZ2VkID0gdHJ1ZTsNCgkJCQl9DQoJCQl9DQoJCQkvLyBDaGVjayBhbmQgbnVkZ2UgcG9pbnRzIGZyb20gZW5kOg0KCQkJbnVkZ2VkID0gdHJ1ZTsNCgkJCWZvciAodmFyIG9mZnNldCA9IHBvaW50cy5sZW5ndGggLSAyOyBvZmZzZXQgPj0gMCAmJiBudWRnZWQ7IG9mZnNldCAtPSAyKQ0KCQkJew0KCQkJCXZhciB4ID0gTWF0aC5mbG9vciggcG9pbnRzW29mZnNldF0pOw0KCQkJCXZhciB5ID0gTWF0aC5mbG9vciggcG9pbnRzW29mZnNldCArIDFdKTsNCgkJCQlpZiAoeCA8IC0gMSB8fCB4ID4gd2lkdGggfHwgeSA8IC0gMSB8fCB5ID4gaGVpZ2h0KQ0KCQkJCXsNCgkJCQkJdGhyb3cgIkVycm9yLmNoZWNrQW5kTnVkZ2VQb2ludHMgIjsNCgkJCQl9DQoJCQkJbnVkZ2VkID0gZmFsc2U7DQoJCQkJaWYgKHggPT0gLSAxKQ0KCQkJCXsNCgkJCQkJcG9pbnRzW29mZnNldF0gPSAwLjA7DQoJCQkJCW51ZGdlZCA9IHRydWU7DQoJCQkJfQ0KCQkJCWVsc2UgaWYgKHggPT0gd2lkdGgpDQoJCQkJew0KCQkJCQlwb2ludHNbb2Zmc2V0XSA9IHdpZHRoIC0gMTsNCgkJCQkJbnVkZ2VkID0gdHJ1ZTsNCgkJCQl9DQoJCQkJaWYgKHkgPT0gLSAxKQ0KCQkJCXsNCgkJCQkJcG9pbnRzW29mZnNldCArIDFdID0gMC4wOw0KCQkJCQludWRnZWQgPSB0cnVlOw0KCQkJCX0NCgkJCQllbHNlIGlmICh5ID09IGhlaWdodCkNCgkJCQl7DQoJCQkJCXBvaW50c1tvZmZzZXQgKyAxXSA9IGhlaWdodCAtIDE7DQoJCQkJCW51ZGdlZCA9IHRydWU7DQoJCQkJfQ0KCQkJfQ0KCQl9DQoJDQoNCg0KR3JpZFNhbXBsZXIuc2FtcGxlR3JpZDM9ZnVuY3Rpb24oIGltYWdlLCAgZGltZW5zaW9uLCAgdHJhbnNmb3JtKQ0KCQl7DQoJCQl2YXIgYml0cyA9IG5ldyBCaXRNYXRyaXgoZGltZW5zaW9uKTsNCgkJCXZhciBwb2ludHMgPSBuZXcgQXJyYXkoZGltZW5zaW9uIDw8IDEpOw0KCQkJZm9yICh2YXIgeSA9IDA7IHkgPCBkaW1lbnNpb247IHkrKykNCgkJCXsNCgkJCQl2YXIgbWF4ID0gcG9pbnRzLmxlbmd0aDsNCgkJCQl2YXIgaVZhbHVlID0gIHkgKyAwLjU7DQoJCQkJZm9yICh2YXIgeCA9IDA7IHggPCBtYXg7IHggKz0gMikNCgkJCQl7DQoJCQkJCXBvaW50c1t4XSA9ICAoeCA+PiAxKSArIDAuNTsNCgkJCQkJcG9pbnRzW3ggKyAxXSA9IGlWYWx1ZTsNCgkJCQl9DQoJCQkJdHJhbnNmb3JtLnRyYW5zZm9ybVBvaW50czEocG9pbnRzKTsNCgkJCQkvLyBRdWljayBjaGVjayB0byBzZWUgaWYgcG9pbnRzIHRyYW5zZm9ybWVkIHRvIHNvbWV0aGluZyBpbnNpZGUgdGhlIGltYWdlOw0KCQkJCS8vIHN1ZmZpY2llbnQgdG8gY2hlY2sgdGhlIGVuZHBvaW50cw0KCQkJCUdyaWRTYW1wbGVyLmNoZWNrQW5kTnVkZ2VQb2ludHMoaW1hZ2UsIHBvaW50cyk7DQoJCQkJdHJ5DQoJCQkJew0KCQkJCQlmb3IgKHZhciB4ID0gMDsgeCA8IG1heDsgeCArPSAyKQ0KCQkJCQl7DQoJCQkJCQkvL3ZhciB4cG9pbnQgPSAoTWF0aC5mbG9vciggcG9pbnRzW3hdKSAqIDQpICsgKE1hdGguZmxvb3IoIHBvaW50c1t4ICsgMV0pICogcXJjb2RlLndpZHRoICogNCk7DQogICAgICAgICAgICAgICAgICAgICAgICB2YXIgYml0ID0gaW1hZ2VbTWF0aC5mbG9vciggcG9pbnRzW3hdKSsgcXJjb2RlLndpZHRoKiBNYXRoLmZsb29yKCBwb2ludHNbeCArIDFdKV07DQoJCQkJCQkvL3FyY29kZS5pbWFnZWRhdGEuZGF0YVt4cG9pbnRdID0gYml0PzI1NTowOw0KCQkJCQkJLy9xcmNvZGUuaW1hZ2VkYXRhLmRhdGFbeHBvaW50KzFdID0gYml0PzI1NTowOw0KCQkJCQkJLy9xcmNvZGUuaW1hZ2VkYXRhLmRhdGFbeHBvaW50KzJdID0gMDsNCgkJCQkJCS8vcXJjb2RlLmltYWdlZGF0YS5kYXRhW3hwb2ludCszXSA9IDI1NTsNCgkJCQkJCS8vYml0c1t4ID4+IDFdWyB5XT1iaXQ7DQoJCQkJCQlpZihiaXQpDQoJCQkJCQkJYml0cy5zZXRfUmVuYW1lZCh4ID4+IDEsIHkpOw0KCQkJCQl9DQoJCQkJfQ0KCQkJCWNhdGNoICggYWlvb2JlKQ0KCQkJCXsNCgkJCQkJLy8gVGhpcyBmZWVscyB3cm9uZywgYnV0LCBzb21ldGltZXMgaWYgdGhlIGZpbmRlciBwYXR0ZXJucyBhcmUgbWlzaWRlbnRpZmllZCwgdGhlIHJlc3VsdGluZw0KCQkJCQkvLyB0cmFuc2Zvcm0gZ2V0cyAidHdpc3RlZCIgc3VjaCB0aGF0IGl0IG1hcHMgYSBzdHJhaWdodCBsaW5lIG9mIHBvaW50cyB0byBhIHNldCBvZiBwb2ludHMNCgkJCQkJLy8gd2hvc2UgZW5kcG9pbnRzIGFyZSBpbiBib3VuZHMsIGJ1dCBvdGhlcnMgYXJlIG5vdC4gVGhlcmUgaXMgcHJvYmFibHkgc29tZSBtYXRoZW1hdGljYWwNCgkJCQkJLy8gd2F5IHRvIGRldGVjdCB0aGlzIGFib3V0IHRoZSB0cmFuc2Zvcm1hdGlvbiB0aGF0IEkgZG9uJ3Qga25vdyB5ZXQuDQoJCQkJCS8vIFRoaXMgcmVzdWx0cyBpbiBhbiB1Z2x5IHJ1bnRpbWUgZXhjZXB0aW9uIGRlc3BpdGUgb3VyIGNsZXZlciBjaGVja3MgYWJvdmUgLS0gY2FuJ3QgaGF2ZQ0KCQkJCQkvLyB0aGF0LiBXZSBjb3VsZCBjaGVjayBlYWNoIHBvaW50J3MgY29vcmRpbmF0ZXMgYnV0IHRoYXQgZmVlbHMgZHVwbGljYXRpdmUuIFdlIHNldHRsZSBmb3INCgkJCQkJLy8gY2F0Y2hpbmcgYW5kIHdyYXBwaW5nIEFycmF5SW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbi4NCgkJCQkJdGhyb3cgIkVycm9yLmNoZWNrQW5kTnVkZ2VQb2ludHMiOw0KCQkJCX0NCgkJCX0NCgkJCXJldHVybiBiaXRzOw0KCQl9DQoNCkdyaWRTYW1wbGVyLnNhbXBsZUdyaWR4PWZ1bmN0aW9uKCBpbWFnZSwgIGRpbWVuc2lvbiwgIHAxVG9YLCAgcDFUb1ksICBwMlRvWCwgIHAyVG9ZLCAgcDNUb1gsICBwM1RvWSwgIHA0VG9YLCAgcDRUb1ksICBwMUZyb21YLCAgcDFGcm9tWSwgIHAyRnJvbVgsICBwMkZyb21ZLCAgcDNGcm9tWCwgIHAzRnJvbVksICBwNEZyb21YLCAgcDRGcm9tWSkNCnsNCgl2YXIgdHJhbnNmb3JtID0gUGVyc3BlY3RpdmVUcmFuc2Zvcm0ucXVhZHJpbGF0ZXJhbFRvUXVhZHJpbGF0ZXJhbChwMVRvWCwgcDFUb1ksIHAyVG9YLCBwMlRvWSwgcDNUb1gsIHAzVG9ZLCBwNFRvWCwgcDRUb1ksIHAxRnJvbVgsIHAxRnJvbVksIHAyRnJvbVgsIHAyRnJvbVksIHAzRnJvbVgsIHAzRnJvbVksIHA0RnJvbVgsIHA0RnJvbVkpOw0KCQkJDQoJcmV0dXJuIEdyaWRTYW1wbGVyLnNhbXBsZUdyaWQzKGltYWdlLCBkaW1lbnNpb24sIHRyYW5zZm9ybSk7DQp9</uax:ByteString>
		</Value>
	</UAVariable>
	<UAObject NodeId="ns=1;s=SYSTEM" BrowseName="1:SYSTEM">
		<DisplayName Locale="en">SYSTEM</DisplayName>
		<Description Locale="en">SYSTEM</Description>
		<References>
			<Reference ReferenceType="HasComponent" IsForward="false">Objects</Reference>
			<Reference ReferenceType="HasTypeDefinition">FolderType</Reference>
		</References>
		<Extensions>
			<atvise ExportedNodeId="ns=1;s=SYSTEM.LIBRARY.PROJECT.RESOURCES/QRCodeScanner/qrcode.js" ExportedBrowseName="1:qrcode.js" Upstream="true"/>
		</Extensions>
	</UAObject>
	<UAObject NodeId="ns=1;s=SYSTEM.LIBRARY" BrowseName="1:LIBRARY">
		<DisplayName Locale="en">LIBRARY</DisplayName>
		<Description Locale="en">LIBRARY</Description>
		<References>
			<Reference ReferenceType="HasComponent" IsForward="false">ns=1;s=SYSTEM</Reference>
			<Reference ReferenceType="HasTypeDefinition">FolderType</Reference>
		</References>
		<Extensions>
			<atvise Upstream="true"/>
		</Extensions>
	</UAObject>
	<UAObject NodeId="ns=1;s=SYSTEM.LIBRARY.PROJECT" BrowseName="1:PROJECT">
		<DisplayName Locale="en">PROJECT</DisplayName>
		<Description Locale="en">PROJECT</Description>
		<References>
			<Reference ReferenceType="HasComponent" IsForward="false">ns=1;s=SYSTEM.LIBRARY</Reference>
			<Reference ReferenceType="HasTypeDefinition">FolderType</Reference>
		</References>
		<Extensions>
			<atvise Upstream="true"/>
		</Extensions>
	</UAObject>
	<UAObject NodeId="ns=1;s=SYSTEM.LIBRARY.PROJECT.RESOURCES" BrowseName="1:RESOURCES">
		<DisplayName Locale="en">RESOURCES</DisplayName>
		<Description Locale="en">RESOURCES</Description>
		<References>
			<Reference ReferenceType="HasComponent" IsForward="false">ns=1;s=SYSTEM.LIBRARY.PROJECT</Reference>
			<Reference ReferenceType="HasTypeDefinition">FolderType</Reference>
		</References>
		<Extensions>
			<atvise Upstream="true"/>
		</Extensions>
	</UAObject>
	<UAObject NodeId="ns=1;s=SYSTEM.LIBRARY.PROJECT.RESOURCES/QRCodeScanner" BrowseName="1:QRCodeScanner">
		<DisplayName Locale="en">QRCodeScanner</DisplayName>
		<Description Locale="en">QRCodeScanner</Description>
		<References>
			<Reference ReferenceType="HasComponent" IsForward="false">ns=1;s=SYSTEM.LIBRARY.PROJECT.RESOURCES</Reference>
			<Reference ReferenceType="HasTypeDefinition">FolderType</Reference>
		</References>
		<Extensions>
			<atvise Upstream="true"/>
		</Extensions>
	</UAObject>
	<UAVariable NodeId="ns=1;s=SYSTEM.LIBRARY.PROJECT.RESOURCES/QRCodeScanner/qrcode.js" BrowseName="1:qrcode.js" DataType="ByteString" AccessLevel="103" UserAccessLevel="103" Historizing="true">
		<DisplayName Locale="en">qrcode.js</DisplayName>
		<Description Locale="en">qrcode.js</Description>
		<References>
			<Reference ReferenceType="HasComponent" IsForward="false">ns=1;s=SYSTEM.LIBRARY.PROJECT.RESOURCES/QRCodeScanner</Reference>
			<Reference ReferenceType="HasTypeDefinition">ns=1;s=VariableTypes.ATVISE.Resource.Javascript</Reference>
			<Reference ReferenceType="HasProperty">ns=1;s=VariableTypes.ATVISE.Resource.Javascript.Compress</Reference>
		</References>
		<Value>
			<uax:ByteString>LyoKICAgQ29weXJpZ2h0IDIwMTEgTGF6YXIgTGFzemxvIChsYXphcnNvZnRAZ21haWwuY29tLCB3d3cubGF6YXJzb2Z0LmluZm8pCiAgIAogICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgogICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKCiAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKCiAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCiAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiovCgoKdmFyIHFyY29kZSA9IHt9OwpxcmNvZGUuaW1hZ2VkYXRhID0gbnVsbDsKcXJjb2RlLndpZHRoID0gMDsKcXJjb2RlLmhlaWdodCA9IDA7CnFyY29kZS5xckNvZGVTeW1ib2wgPSBudWxsOwpxcmNvZGUuZGVidWcgPSBmYWxzZTsKcXJjb2RlLm1heEltZ1NpemUgPSAxMDI0KjEwMjQ7CgpxcmNvZGUuc2l6ZU9mRGF0YUxlbmd0aEluZm8gPSAgWyAgWyAxMCwgOSwgOCwgOCBdLCAgWyAxMiwgMTEsIDE2LCAxMCBdLCAgWyAxNCwgMTMsIDE2LCAxMiBdIF07CgpxcmNvZGUuY2FsbGJhY2sgPSBudWxsOwoKcXJjb2RlLnZpZFN1Y2Nlc3MgPSBmdW5jdGlvbiAoc3RyZWFtKSAKewogICAgcXJjb2RlLmxvY2Fsc3RyZWFtID0gc3RyZWFtOwogICAgaWYocXJjb2RlLndlYmtpdCkKICAgICAgICBxcmNvZGUudmlkZW8uc3JjID0gd2luZG93LndlYmtpdFVSTC5jcmVhdGVPYmplY3RVUkwoc3RyZWFtKTsKICAgIGVsc2UKICAgIGlmKHFyY29kZS5tb3opCiAgICB7CiAgICAgICAgcXJjb2RlLnZpZGVvLm1velNyY09iamVjdCA9IHN0cmVhbTsKICAgICAgICBxcmNvZGUudmlkZW8ucGxheSgpOwogICAgfQogICAgZWxzZQogICAgICAgIHFyY29kZS52aWRlby5zcmMgPSBzdHJlYW07CiAgICAKICAgIHFyY29kZS5nVU09dHJ1ZTsKICAgIAogICAgcXJjb2RlLmNhbnZhc19xcjIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdjYW52YXMnKTsKICAgIHFyY29kZS5jYW52YXNfcXIyLmlkID0gInFyLWNhbnZhcyI7CiAgICBxcmNvZGUucXJjb250ZXh0MiA9IHFyY29kZS5jYW52YXNfcXIyLmdldENvbnRleHQoJzJkJyk7CiAgICBxcmNvZGUuY2FudmFzX3FyMi53aWR0aCA9IHFyY29kZS52aWRlby52aWRlb1dpZHRoOwogICAgcXJjb2RlLmNhbnZhc19xcjIuaGVpZ2h0ID0gcXJjb2RlLnZpZGVvLnZpZGVvSGVpZ2h0OwogICAgc2V0VGltZW91dChxcmNvZGUuY2FwdHVyZVRvQ2FudmFzLCA1MDApOwp9CiAgICAgICAgCnFyY29kZS52aWRFcnJvciA9IGZ1bmN0aW9uKGVycm9yKQp7CiAgICBxcmNvZGUuZ1VNPWZhbHNlOwogICAgcmV0dXJuOwp9CgpxcmNvZGUuY2FwdHVyZVRvQ2FudmFzID0gZnVuY3Rpb24oKQp7CiAgICBpZihxcmNvZGUuZ1VNKQogICAgewogICAgICAgIHRyeXsKICAgICAgICAgICAgaWYocXJjb2RlLnZpZGVvLnZpZGVvV2lkdGggPT0gMCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgc2V0VGltZW91dChxcmNvZGUuY2FwdHVyZVRvQ2FudmFzLCA1MDApOwogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcXJjb2RlLmNhbnZhc19xcjIud2lkdGggPSBxcmNvZGUudmlkZW8udmlkZW9XaWR0aDsKICAgICAgICAgICAgICAgIHFyY29kZS5jYW52YXNfcXIyLmhlaWdodCA9IHFyY29kZS52aWRlby52aWRlb0hlaWdodDsKICAgICAgICAgICAgfQogICAgICAgICAgICBxcmNvZGUucXJjb250ZXh0Mi5kcmF3SW1hZ2UocXJjb2RlLnZpZGVvLDAsMCk7CiAgICAgICAgICAgIHRyeXsKICAgICAgICAgICAgICAgIHFyY29kZS5kZWNvZGUoKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBjYXRjaChlKXsgICAgICAgCiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhlKTsKICAgICAgICAgICAgICAgIHNldFRpbWVvdXQocXJjb2RlLmNhcHR1cmVUb0NhbnZhcywgNTAwKTsKICAgICAgICAgICAgfTsKICAgICAgICB9CiAgICAgICAgY2F0Y2goZSl7ICAgICAgIAogICAgICAgICAgICAgICAgY29uc29sZS5sb2coZSk7CiAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KHFyY29kZS5jYXB0dXJlVG9DYW52YXMsIDUwMCk7CiAgICAgICAgfTsKICAgIH0KfQoKcXJjb2RlLnNldFdlYmNhbSA9IGZ1bmN0aW9uKHZpZGVvSWQpCnsKICAgIHZhciBuPW5hdmlnYXRvcjsKICAgIHFyY29kZS52aWRlbz1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh2aWRlb0lkKTsKCiAgICB2YXIgb3B0aW9ucyA9IHRydWU7CiAgICBpZihuYXZpZ2F0b3IubWVkaWFEZXZpY2VzICYmIG5hdmlnYXRvci5tZWRpYURldmljZXMuZW51bWVyYXRlRGV2aWNlcykKICAgIHsKICAgICAgICB0cnl7CiAgICAgICAgICAgIG5hdmlnYXRvci5tZWRpYURldmljZXMuZW51bWVyYXRlRGV2aWNlcygpCiAgICAgICAgICAgIC50aGVuKGZ1bmN0aW9uKGRldmljZXMpIHsKICAgICAgICAgICAgICBkZXZpY2VzLmZvckVhY2goZnVuY3Rpb24oZGV2aWNlKSB7CiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygiZGViMSIpOwogICAgICAgICAgICAgICAgaWYgKGRldmljZS5raW5kID09PSAndmlkZW9pbnB1dCcpIHsKICAgICAgICAgICAgICAgICAgaWYoZGV2aWNlLmxhYmVsLnRvTG93ZXJDYXNlKCkuc2VhcmNoKCJiYWNrIikgPi0xKQogICAgICAgICAgICAgICAgICAgIG9wdGlvbnM9W3snc291cmNlSWQnOiBkZXZpY2UuZGV2aWNlSWR9XSA7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhkZXZpY2Uua2luZCArICI6ICIgKyBkZXZpY2UubGFiZWwgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIiBpZCA9ICIgKyBkZXZpY2UuZGV2aWNlSWQpOwogICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9KQogICAgICAgICAgICAKICAgICAgICB9CiAgICAgICAgY2F0Y2goZSkKICAgICAgICB7CiAgICAgICAgICAgIGNvbnNvbGUubG9nKGUpOwogICAgICAgIH0KICAgIH0KICAgIGVsc2V7CiAgICAgICAgY29uc29sZS5sb2coIm5vIG5hdmlnYXRvci5tZWRpYURldmljZXMuZW51bWVyYXRlRGV2aWNlcyIgKTsKICAgIH0KICAgIAogICAgaWYobi5nZXRVc2VyTWVkaWEpCiAgICAgICAgbi5nZXRVc2VyTWVkaWEoe3ZpZGVvOiBvcHRpb25zLCBhdWRpbzogZmFsc2V9LCBxcmNvZGUudmlkU3VjY2VzcywgcXJjb2RlLnZpZEVycm9yKTsKICAgIGVsc2UKICAgIGlmKG4ud2Via2l0R2V0VXNlck1lZGlhKQogICAgewogICAgICAgIHFyY29kZS53ZWJraXQ9dHJ1ZTsKICAgICAgICBuLndlYmtpdEdldFVzZXJNZWRpYSh7dmlkZW86b3B0aW9ucywgYXVkaW86IGZhbHNlfSwgcXJjb2RlLnZpZFN1Y2Nlc3MsIHFyY29kZS52aWRFcnJvcik7CiAgICB9CiAgICBlbHNlCiAgICBpZihuLm1vekdldFVzZXJNZWRpYSkKICAgIHsKICAgICAgICBxcmNvZGUubW96PXRydWU7CiAgICAgICAgbi5tb3pHZXRVc2VyTWVkaWEoe3ZpZGVvOiBvcHRpb25zLCBhdWRpbzogZmFsc2V9LCBxcmNvZGUudmlkU3VjY2VzcywgcXJjb2RlLnZpZEVycm9yKTsKICAgIH0KfQoKcXJjb2RlLmRlY29kZSA9IGZ1bmN0aW9uKHNyYyl7CiAgICAKICAgIGlmKGFyZ3VtZW50cy5sZW5ndGg9PTApCiAgICB7CgogICAgICAgIGlmKHFyY29kZS5jYW52YXNfcXIyKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIGNhbnZhc19xciA9IHFyY29kZS5jYW52YXNfcXIyOwogICAgICAgICAgICB2YXIgY29udGV4dCA9IHFyY29kZS5xcmNvbnRleHQyOwogICAgICAgIH0gCiAgICAgICAgLy8gQWRkb24gQ2VydGVjIC0tPiBDYW52YXMgaW4gZm9yZWlnbiBvYmplY3Qgd29udCBiZSBkZXRlY3RlZCAtLT4gdXNlIGRpcmVjdCByZWZlcmVuY2UgcGFzc2VkIHRvIHFyY29kZSBvYmplY3QKICAgICAgICBlbHNlIGlmIChxcmNvZGUuY3VzdG9tQ2FudmFzKSB7CiAgICAgICAgICAgIHZhciBjYW52YXNfcXIgPSBxcmNvZGUuY3VzdG9tQ2FudmFzOwogICAgICAgICAgICB2YXIgY29udGV4dCA9IGNhbnZhc19xci5nZXRDb250ZXh0KCcyZCcpOwogICAgICAgIH0gCgkJLy8gRW5kIG9mIEFkZG9uCgkJZWxzZSB7CiAgICAgICAgICAgIHZhciBjYW52YXNfcXIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgicXItY2FudmFzIik7CiAgICAgICAgICAgIHZhciBjb250ZXh0ID0gY2FudmFzX3FyLmdldENvbnRleHQoJzJkJyk7CiAgICAgICAgfQogICAgICAgIHFyY29kZS53aWR0aCA9IGNhbnZhc19xci53aWR0aDsKICAgICAgICBxcmNvZGUuaGVpZ2h0ID0gY2FudmFzX3FyLmhlaWdodDsKICAgICAgICBxcmNvZGUuaW1hZ2VkYXRhID0gY29udGV4dC5nZXRJbWFnZURhdGEoMCwgMCwgcXJjb2RlLndpZHRoLCBxcmNvZGUuaGVpZ2h0KTsKICAgICAgICBxcmNvZGUucmVzdWx0ID0gcXJjb2RlLnByb2Nlc3MoY29udGV4dCk7CiAgICAgICAgaWYocXJjb2RlLmNhbGxiYWNrIT1udWxsKQogICAgICAgICAgICBxcmNvZGUuY2FsbGJhY2socXJjb2RlLnJlc3VsdCk7CiAgICAgICAgcmV0dXJuIHFyY29kZS5yZXN1bHQ7CiAgICB9CiAgICBlbHNlCiAgICB7CiAgICAgICAgdmFyIGltYWdlID0gbmV3IEltYWdlKCk7CiAgICAgICAgaW1hZ2UuY3Jvc3NPcmlnaW4gPSAiQW5vbnltb3VzIjsKICAgICAgICBpbWFnZS5vbmxvYWQ9ZnVuY3Rpb24oKSB7CgogICAgICAgICAgICAvL3ZhciBjYW52YXNfcXIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgicXItY2FudmFzIik7CiAgICAgICAgICAgIHZhciBjYW52YXNfb3V0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoIm91dC1jYW52YXMiKTsKICAgICAgICAgICAgaWYoY2FudmFzX291dCE9bnVsbCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIG91dGN0eCA9IGNhbnZhc19vdXQuZ2V0Q29udGV4dCgnMmQnKTsKICAgICAgICAgICAgICAgIG91dGN0eC5jbGVhclJlY3QoMCwgMCwgMzIwLCAyNDApOwogICAgICAgICAgICAgICAgb3V0Y3R4LmRyYXdJbWFnZShpbWFnZSwgMCwgMCwgMzIwLCAyNDApOwogICAgICAgICAgICB9CgogICAgICAgICAgICB2YXIgY2FudmFzX3FyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnY2FudmFzJyk7CiAgICAgICAgICAgIHZhciBjb250ZXh0ID0gY2FudmFzX3FyLmdldENvbnRleHQoJzJkJyk7CiAgICAgICAgICAgIHZhciBuaGVpZ2h0ID0gaW1hZ2UuaGVpZ2h0OwogICAgICAgICAgICB2YXIgbndpZHRoID0gaW1hZ2Uud2lkdGg7CiAgICAgICAgICAgIGlmKGltYWdlLndpZHRoKmltYWdlLmhlaWdodD5xcmNvZGUubWF4SW1nU2l6ZSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIGlyID0gaW1hZ2Uud2lkdGggLyBpbWFnZS5oZWlnaHQ7CiAgICAgICAgICAgICAgICBuaGVpZ2h0ID0gTWF0aC5zcXJ0KHFyY29kZS5tYXhJbWdTaXplL2lyKTsKICAgICAgICAgICAgICAgIG53aWR0aD1pcipuaGVpZ2h0OwogICAgICAgICAgICB9CgogICAgICAgICAgICBjYW52YXNfcXIud2lkdGggPSBud2lkdGg7CiAgICAgICAgICAgIGNhbnZhc19xci5oZWlnaHQgPSBuaGVpZ2h0OwogICAgICAgICAgICAKICAgICAgICAgICAgY29udGV4dC5kcmF3SW1hZ2UoaW1hZ2UsIDAsIDAsIGNhbnZhc19xci53aWR0aCwgY2FudmFzX3FyLmhlaWdodCApOwogICAgICAgICAgICBxcmNvZGUud2lkdGggPSBjYW52YXNfcXIud2lkdGg7CiAgICAgICAgICAgIHFyY29kZS5oZWlnaHQgPSBjYW52YXNfcXIuaGVpZ2h0OwogICAgICAgICAgICB0cnl7CiAgICAgICAgICAgICAgICBxcmNvZGUuaW1hZ2VkYXRhID0gY29udGV4dC5nZXRJbWFnZURhdGEoMCwgMCwgY2FudmFzX3FyLndpZHRoLCBjYW52YXNfcXIuaGVpZ2h0KTsKICAgICAgICAgICAgfWNhdGNoKGUpewogICAgICAgICAgICAgICAgcXJjb2RlLnJlc3VsdCA9ICJDcm9zcyBkb21haW4gaW1hZ2UgcmVhZGluZyBub3Qgc3VwcG9ydGVkIGluIHlvdXIgYnJvd3NlciEgU2F2ZSBpdCB0byB5b3VyIGNvbXB1dGVyIHRoZW4gZHJhZyBhbmQgZHJvcCB0aGUgZmlsZSEiOwogICAgICAgICAgICAgICAgaWYocXJjb2RlLmNhbGxiYWNrIT1udWxsKQogICAgICAgICAgICAgICAgICAgIHFyY29kZS5jYWxsYmFjayhxcmNvZGUucmVzdWx0KTsKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQogICAgICAgICAgICAKICAgICAgICAgICAgdHJ5CiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHFyY29kZS5yZXN1bHQgPSBxcmNvZGUucHJvY2Vzcyhjb250ZXh0KTsKICAgICAgICAgICAgfQogICAgICAgICAgICBjYXRjaChlKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhlKTsKICAgICAgICAgICAgICAgIHFyY29kZS5yZXN1bHQgPSAiZXJyb3IgZGVjb2RpbmcgUVIgQ29kZSI7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYocXJjb2RlLmNhbGxiYWNrIT1udWxsKQogICAgICAgICAgICAgICAgcXJjb2RlLmNhbGxiYWNrKHFyY29kZS5yZXN1bHQpOwogICAgICAgIH0KICAgICAgICBpbWFnZS5vbmVycm9yID0gZnVuY3Rpb24gKCkKICAgICAgICB7CiAgICAgICAgICAgIGlmKHFyY29kZS5jYWxsYmFjayE9bnVsbCkgCiAgICAgICAgICAgICAgICBxcmNvZGUuY2FsbGJhY2soIkZhaWxlZCB0byBsb2FkIHRoZSBpbWFnZSIpOwogICAgICAgIH0KCiAgICAgICAgaW1hZ2Uuc3JjID0gc3JjOwogICAgfQp9CgpxcmNvZGUuaXNVcmwgPSBmdW5jdGlvbihzKQp7CiAgICB2YXIgcmVnZXhwID0gLyhmdHB8aHR0cHxodHRwcyk6XC9cLyhcdys6ezAsMX1cdypAKT8oXFMrKSg6WzAtOV0rKT8oXC98XC8oW1x3IyE6Lj8rPSYlQCFcLVwvXSkpPy87CiAgICByZXR1cm4gcmVnZXhwLnRlc3Qocyk7Cn0KCnFyY29kZS5kZWNvZGVfdXJsID0gZnVuY3Rpb24gKHMpCnsKICB2YXIgZXNjYXBlZCA9ICIiOwogIHRyeXsKICAgIGVzY2FwZWQgPSBlc2NhcGUoIHMgKTsKICB9CiAgY2F0Y2goZSkKICB7CiAgICBjb25zb2xlLmxvZyhlKTsKICAgIGVzY2FwZWQgPSBzOwogIH0KICB2YXIgcmV0ID0gIiI7CiAgdHJ5ewogICAgcmV0ID0gZGVjb2RlVVJJQ29tcG9uZW50KCBlc2NhcGVkICk7CiAgfQogIGNhdGNoKGUpCiAgewogICAgY29uc29sZS5sb2coZSk7CiAgICByZXQgPSBlc2NhcGVkOwogIH0KICByZXR1cm4gcmV0Owp9CgpxcmNvZGUuZGVjb2RlX3V0ZjggPSBmdW5jdGlvbiAoIHMgKQp7CiAgICBpZihxcmNvZGUuaXNVcmwocykpCiAgICAgICAgcmV0dXJuIHFyY29kZS5kZWNvZGVfdXJsKHMpOwogICAgZWxzZQogICAgICAgIHJldHVybiBzOwp9CgpxcmNvZGUucHJvY2VzcyA9IGZ1bmN0aW9uKGN0eCl7CiAgICAKICAgIHZhciBzdGFydCA9IG5ldyBEYXRlKCkuZ2V0VGltZSgpOwoKICAgIHZhciBpbWFnZSA9IHFyY29kZS5ncmF5U2NhbGVUb0JpdG1hcChxcmNvZGUuZ3JheXNjYWxlKCkpOwogICAgLy92YXIgaW1hZ2UgPSBxcmNvZGUuYmluYXJpemUoMTI4KTsKICAgIAogICAgaWYocXJjb2RlLmRlYnVnKQogICAgewogICAgICAgIGZvciAodmFyIHkgPSAwOyB5IDwgcXJjb2RlLmhlaWdodDsgeSsrKQogICAgICAgIHsKICAgICAgICAgICAgZm9yICh2YXIgeCA9IDA7IHggPCBxcmNvZGUud2lkdGg7IHgrKykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIHBvaW50ID0gKHggKiA0KSArICh5ICogcXJjb2RlLndpZHRoICogNCk7CiAgICAgICAgICAgICAgICBxcmNvZGUuaW1hZ2VkYXRhLmRhdGFbcG9pbnRdID0gaW1hZ2VbeCt5KnFyY29kZS53aWR0aF0/MDowOwogICAgICAgICAgICAgICAgcXJjb2RlLmltYWdlZGF0YS5kYXRhW3BvaW50KzFdID0gaW1hZ2VbeCt5KnFyY29kZS53aWR0aF0/MDowOwogICAgICAgICAgICAgICAgcXJjb2RlLmltYWdlZGF0YS5kYXRhW3BvaW50KzJdID0gaW1hZ2VbeCt5KnFyY29kZS53aWR0aF0/MjU1OjA7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgY3R4LnB1dEltYWdlRGF0YShxcmNvZGUuaW1hZ2VkYXRhLCAwLCAwKTsKICAgIH0KICAgIAogICAgLy92YXIgZmluZGVyUGF0dGVybkluZm8gPSBuZXcgRmluZGVyUGF0dGVybkZpbmRlcigpLmZpbmRGaW5kZXJQYXR0ZXJuKGltYWdlKTsKICAgIAogICAgdmFyIGRldGVjdG9yID0gbmV3IERldGVjdG9yKGltYWdlKTsKCiAgICB2YXIgcVJDb2RlTWF0cml4ID0gZGV0ZWN0b3IuZGV0ZWN0KCk7CiAgICAKICAgIGlmKHFyY29kZS5kZWJ1ZykKICAgIHsKICAgICAgICBmb3IgKHZhciB5ID0gMDsgeSA8IHFSQ29kZU1hdHJpeC5iaXRzLkhlaWdodDsgeSsrKQogICAgICAgIHsKICAgICAgICAgICAgZm9yICh2YXIgeCA9IDA7IHggPCBxUkNvZGVNYXRyaXguYml0cy5XaWR0aDsgeCsrKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgcG9pbnQgPSAoeCAqIDQqMikgKyAoeSoyICogcXJjb2RlLndpZHRoICogNCk7CiAgICAgICAgICAgICAgICBxcmNvZGUuaW1hZ2VkYXRhLmRhdGFbcG9pbnRdID0gcVJDb2RlTWF0cml4LmJpdHMuZ2V0X1JlbmFtZWQoeCx5KT8wOjA7CiAgICAgICAgICAgICAgICBxcmNvZGUuaW1hZ2VkYXRhLmRhdGFbcG9pbnQrMV0gPSBxUkNvZGVNYXRyaXguYml0cy5nZXRfUmVuYW1lZCh4LHkpPzA6MDsKICAgICAgICAgICAgICAgIHFyY29kZS5pbWFnZWRhdGEuZGF0YVtwb2ludCsyXSA9IHFSQ29kZU1hdHJpeC5iaXRzLmdldF9SZW5hbWVkKHgseSk/MjU1OjA7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgY3R4LnB1dEltYWdlRGF0YShxcmNvZGUuaW1hZ2VkYXRhLCAwLCAwKTsKICAgIH0KICAgIAogICAgCiAgICB2YXIgcmVhZGVyID0gRGVjb2Rlci5kZWNvZGUocVJDb2RlTWF0cml4LmJpdHMpOwogICAgdmFyIGRhdGEgPSByZWFkZXIuRGF0YUJ5dGU7CiAgICB2YXIgc3RyPSIiOwogICAgZm9yKHZhciBpPTA7aTxkYXRhLmxlbmd0aDtpKyspCiAgICB7CiAgICAgICAgZm9yKHZhciBqPTA7ajxkYXRhW2ldLmxlbmd0aDtqKyspCiAgICAgICAgICAgIHN0cis9U3RyaW5nLmZyb21DaGFyQ29kZShkYXRhW2ldW2pdKTsKICAgIH0KICAgIAogICAgdmFyIGVuZCA9IG5ldyBEYXRlKCkuZ2V0VGltZSgpOwogICAgdmFyIHRpbWUgPSBlbmQgLSBzdGFydDsKICAgIC8vY29uc29sZS5sb2codGltZSk7CgogICAgcmV0dXJuIHFyY29kZS5kZWNvZGVfdXRmOChzdHIpOwogICAgLy9hbGVydCgiVGltZToiICsgdGltZSArICIgQ29kZTogIitzdHIpOwp9CgpxcmNvZGUuZ2V0UGl4ZWwgPSBmdW5jdGlvbih4LHkpewogICAgaWYgKHFyY29kZS53aWR0aCA8IHgpIHsKICAgICAgICB0aHJvdyAicG9pbnQgZXJyb3IiOwogICAgfQogICAgaWYgKHFyY29kZS5oZWlnaHQgPCB5KSB7CiAgICAgICAgdGhyb3cgInBvaW50IGVycm9yIjsKICAgIH0KICAgIHZhciBwb2ludCA9ICh4ICogNCkgKyAoeSAqIHFyY29kZS53aWR0aCAqIDQpOwogICAgdmFyIHAgPSAocXJjb2RlLmltYWdlZGF0YS5kYXRhW3BvaW50XSozMyArIHFyY29kZS5pbWFnZWRhdGEuZGF0YVtwb2ludCArIDFdKjM0ICsgcXJjb2RlLmltYWdlZGF0YS5kYXRhW3BvaW50ICsgMl0qMzMpLzEwMDsKICAgIHJldHVybiBwOwp9CgpxcmNvZGUuYmluYXJpemUgPSBmdW5jdGlvbih0aCl7CiAgICB2YXIgcmV0ID0gbmV3IEFycmF5KHFyY29kZS53aWR0aCpxcmNvZGUuaGVpZ2h0KTsKICAgIGZvciAodmFyIHkgPSAwOyB5IDwgcXJjb2RlLmhlaWdodDsgeSsrKQogICAgewogICAgICAgIGZvciAodmFyIHggPSAwOyB4IDwgcXJjb2RlLndpZHRoOyB4KyspCiAgICAgICAgewogICAgICAgICAgICB2YXIgZ3JheSA9IHFyY29kZS5nZXRQaXhlbCh4LCB5KTsKICAgICAgICAgICAgCiAgICAgICAgICAgIHJldFt4K3kqcXJjb2RlLndpZHRoXSA9IGdyYXk8PXRoP3RydWU6ZmFsc2U7CiAgICAgICAgfQogICAgfQogICAgcmV0dXJuIHJldDsKfQoKcXJjb2RlLmdldE1pZGRsZUJyaWdodG5lc3NQZXJBcmVhPWZ1bmN0aW9uKGltYWdlKQp7CiAgICB2YXIgbnVtU3FydEFyZWEgPSA0OwogICAgLy9vYnRhaW4gbWlkZGxlIGJyaWdodG5lc3MoKG1pbiArIG1heCkgLyAyKSBwZXIgYXJlYQogICAgdmFyIGFyZWFXaWR0aCA9IE1hdGguZmxvb3IocXJjb2RlLndpZHRoIC8gbnVtU3FydEFyZWEpOwogICAgdmFyIGFyZWFIZWlnaHQgPSBNYXRoLmZsb29yKHFyY29kZS5oZWlnaHQgLyBudW1TcXJ0QXJlYSk7CiAgICB2YXIgbWlubWF4ID0gbmV3IEFycmF5KG51bVNxcnRBcmVhKTsKICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbnVtU3FydEFyZWE7IGkrKykKICAgIHsKICAgICAgICBtaW5tYXhbaV0gPSBuZXcgQXJyYXkobnVtU3FydEFyZWEpOwogICAgICAgIGZvciAodmFyIGkyID0gMDsgaTIgPCBudW1TcXJ0QXJlYTsgaTIrKykKICAgICAgICB7CiAgICAgICAgICAgIG1pbm1heFtpXVtpMl0gPSBuZXcgQXJyYXkoMCwwKTsKICAgICAgICB9CiAgICB9CiAgICBmb3IgKHZhciBheSA9IDA7IGF5IDwgbnVtU3FydEFyZWE7IGF5KyspCiAgICB7CiAgICAgICAgZm9yICh2YXIgYXggPSAwOyBheCA8IG51bVNxcnRBcmVhOyBheCsrKQogICAgICAgIHsKICAgICAgICAgICAgbWlubWF4W2F4XVtheV1bMF0gPSAweEZGOwogICAgICAgICAgICBmb3IgKHZhciBkeSA9IDA7IGR5IDwgYXJlYUhlaWdodDsgZHkrKykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgZm9yICh2YXIgZHggPSAwOyBkeCA8IGFyZWFXaWR0aDsgZHgrKykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2YXIgdGFyZ2V0ID0gaW1hZ2VbYXJlYVdpZHRoICogYXggKyBkeCsoYXJlYUhlaWdodCAqIGF5ICsgZHkpKnFyY29kZS53aWR0aF07CiAgICAgICAgICAgICAgICAgICAgaWYgKHRhcmdldCA8IG1pbm1heFtheF1bYXldWzBdKQogICAgICAgICAgICAgICAgICAgICAgICBtaW5tYXhbYXhdW2F5XVswXSA9IHRhcmdldDsKICAgICAgICAgICAgICAgICAgICBpZiAodGFyZ2V0ID4gbWlubWF4W2F4XVtheV1bMV0pCiAgICAgICAgICAgICAgICAgICAgICAgIG1pbm1heFtheF1bYXldWzFdID0gdGFyZ2V0OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIC8vbWlubWF4W2F4XVtheV1bMF0gPSAobWlubWF4W2F4XVtheV1bMF0gKyBtaW5tYXhbYXhdW2F5XVsxXSkgLyAyOwogICAgICAgIH0KICAgIH0KICAgIHZhciBtaWRkbGUgPSBuZXcgQXJyYXkobnVtU3FydEFyZWEpOwogICAgZm9yICh2YXIgaTMgPSAwOyBpMyA8IG51bVNxcnRBcmVhOyBpMysrKQogICAgewogICAgICAgIG1pZGRsZVtpM10gPSBuZXcgQXJyYXkobnVtU3FydEFyZWEpOwogICAgfQogICAgZm9yICh2YXIgYXkgPSAwOyBheSA8IG51bVNxcnRBcmVhOyBheSsrKQogICAgewogICAgICAgIGZvciAodmFyIGF4ID0gMDsgYXggPCBudW1TcXJ0QXJlYTsgYXgrKykKICAgICAgICB7CiAgICAgICAgICAgIG1pZGRsZVtheF1bYXldID0gTWF0aC5mbG9vcigobWlubWF4W2F4XVtheV1bMF0gKyBtaW5tYXhbYXhdW2F5XVsxXSkgLyAyKTsKICAgICAgICAgICAgLy9Db25zb2xlLm91dC5wcmludChtaWRkbGVbYXhdW2F5XSArICIsIik7CiAgICAgICAgfQogICAgICAgIC8vQ29uc29sZS5vdXQucHJpbnRsbigiIik7CiAgICB9CiAgICAvL0NvbnNvbGUub3V0LnByaW50bG4oIiIpOwogICAgCiAgICByZXR1cm4gbWlkZGxlOwp9CgpxcmNvZGUuZ3JheVNjYWxlVG9CaXRtYXA9ZnVuY3Rpb24oZ3JheVNjYWxlKQp7CiAgICB2YXIgbWlkZGxlID0gcXJjb2RlLmdldE1pZGRsZUJyaWdodG5lc3NQZXJBcmVhKGdyYXlTY2FsZSk7CiAgICB2YXIgc3FydE51bUFyZWEgPSBtaWRkbGUubGVuZ3RoOwogICAgdmFyIGFyZWFXaWR0aCA9IE1hdGguZmxvb3IocXJjb2RlLndpZHRoIC8gc3FydE51bUFyZWEpOwogICAgdmFyIGFyZWFIZWlnaHQgPSBNYXRoLmZsb29yKHFyY29kZS5oZWlnaHQgLyBzcXJ0TnVtQXJlYSk7CgogICAgdmFyIGJ1ZmYgPSBuZXcgQXJyYXlCdWZmZXIocXJjb2RlLndpZHRoKnFyY29kZS5oZWlnaHQpOwogICAgdmFyIGJpdG1hcCA9IG5ldyBVaW50OEFycmF5KGJ1ZmYpOwoKICAgIC8vdmFyIGJpdG1hcCA9IG5ldyBBcnJheShxcmNvZGUuaGVpZ2h0KnFyY29kZS53aWR0aCk7CiAgICAKICAgIGZvciAodmFyIGF5ID0gMDsgYXkgPCBzcXJ0TnVtQXJlYTsgYXkrKykKICAgIHsKICAgICAgICBmb3IgKHZhciBheCA9IDA7IGF4IDwgc3FydE51bUFyZWE7IGF4KyspCiAgICAgICAgewogICAgICAgICAgICBmb3IgKHZhciBkeSA9IDA7IGR5IDwgYXJlYUhlaWdodDsgZHkrKykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgZm9yICh2YXIgZHggPSAwOyBkeCA8IGFyZWFXaWR0aDsgZHgrKykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBiaXRtYXBbYXJlYVdpZHRoICogYXggKyBkeCsgKGFyZWFIZWlnaHQgKiBheSArIGR5KSpxcmNvZGUud2lkdGhdID0gKGdyYXlTY2FsZVthcmVhV2lkdGggKiBheCArIGR4KyAoYXJlYUhlaWdodCAqIGF5ICsgZHkpKnFyY29kZS53aWR0aF0gPCBtaWRkbGVbYXhdW2F5XSk/dHJ1ZTpmYWxzZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgIHJldHVybiBiaXRtYXA7Cn0KCnFyY29kZS5ncmF5c2NhbGUgPSBmdW5jdGlvbigpCnsKICAgIHZhciBidWZmID0gbmV3IEFycmF5QnVmZmVyKHFyY29kZS53aWR0aCpxcmNvZGUuaGVpZ2h0KTsKICAgIHZhciByZXQgPSBuZXcgVWludDhBcnJheShidWZmKTsKICAgIC8vdmFyIHJldCA9IG5ldyBBcnJheShxcmNvZGUud2lkdGgqcXJjb2RlLmhlaWdodCk7CiAgICAKICAgIGZvciAodmFyIHkgPSAwOyB5IDwgcXJjb2RlLmhlaWdodDsgeSsrKQogICAgewogICAgICAgIGZvciAodmFyIHggPSAwOyB4IDwgcXJjb2RlLndpZHRoOyB4KyspCiAgICAgICAgewogICAgICAgICAgICB2YXIgZ3JheSA9IHFyY29kZS5nZXRQaXhlbCh4LCB5KTsKICAgICAgICAgICAgCiAgICAgICAgICAgIHJldFt4K3kqcXJjb2RlLndpZHRoXSA9IGdyYXk7CiAgICAgICAgfQogICAgfQogICAgcmV0dXJuIHJldDsKfQoKCgoKZnVuY3Rpb24gVVJTaGlmdCggbnVtYmVyLCAgYml0cykKewogICAgaWYgKG51bWJlciA+PSAwKQogICAgICAgIHJldHVybiBudW1iZXIgPj4gYml0czsKICAgIGVsc2UKICAgICAgICByZXR1cm4gKG51bWJlciA+PiBiaXRzKSArICgyIDw8IH5iaXRzKTsKfQoK</uax:ByteString>
		</Value>
	</UAVariable>
	<UAObject NodeId="ns=1;s=SYSTEM" BrowseName="1:SYSTEM">
		<DisplayName Locale="en">SYSTEM</DisplayName>
		<Description Locale="en">SYSTEM</Description>
		<References>
			<Reference ReferenceType="HasComponent" IsForward="false">Objects</Reference>
			<Reference ReferenceType="HasTypeDefinition">FolderType</Reference>
		</References>
		<Extensions>
			<atvise ExportedNodeId="ns=1;s=SYSTEM.LIBRARY.PROJECT.RESOURCES/QRCodeScanner/rsdecoder.js" ExportedBrowseName="1:rsdecoder.js" Upstream="true"/>
		</Extensions>
	</UAObject>
	<UAObject NodeId="ns=1;s=SYSTEM.LIBRARY" BrowseName="1:LIBRARY">
		<DisplayName Locale="en">LIBRARY</DisplayName>
		<Description Locale="en">LIBRARY</Description>
		<References>
			<Reference ReferenceType="HasComponent" IsForward="false">ns=1;s=SYSTEM</Reference>
			<Reference ReferenceType="HasTypeDefinition">FolderType</Reference>
		</References>
		<Extensions>
			<atvise Upstream="true"/>
		</Extensions>
	</UAObject>
	<UAObject NodeId="ns=1;s=SYSTEM.LIBRARY.PROJECT" BrowseName="1:PROJECT">
		<DisplayName Locale="en">PROJECT</DisplayName>
		<Description Locale="en">PROJECT</Description>
		<References>
			<Reference ReferenceType="HasComponent" IsForward="false">ns=1;s=SYSTEM.LIBRARY</Reference>
			<Reference ReferenceType="HasTypeDefinition">FolderType</Reference>
		</References>
		<Extensions>
			<atvise Upstream="true"/>
		</Extensions>
	</UAObject>
	<UAObject NodeId="ns=1;s=SYSTEM.LIBRARY.PROJECT.RESOURCES" BrowseName="1:RESOURCES">
		<DisplayName Locale="en">RESOURCES</DisplayName>
		<Description Locale="en">RESOURCES</Description>
		<References>
			<Reference ReferenceType="HasComponent" IsForward="false">ns=1;s=SYSTEM.LIBRARY.PROJECT</Reference>
			<Reference ReferenceType="HasTypeDefinition">FolderType</Reference>
		</References>
		<Extensions>
			<atvise Upstream="true"/>
		</Extensions>
	</UAObject>
	<UAObject NodeId="ns=1;s=SYSTEM.LIBRARY.PROJECT.RESOURCES/QRCodeScanner" BrowseName="1:QRCodeScanner">
		<DisplayName Locale="en">QRCodeScanner</DisplayName>
		<Description Locale="en">QRCodeScanner</Description>
		<References>
			<Reference ReferenceType="HasComponent" IsForward="false">ns=1;s=SYSTEM.LIBRARY.PROJECT.RESOURCES</Reference>
			<Reference ReferenceType="HasTypeDefinition">FolderType</Reference>
		</References>
		<Extensions>
			<atvise Upstream="true"/>
		</Extensions>
	</UAObject>
	<UAVariable NodeId="ns=1;s=SYSTEM.LIBRARY.PROJECT.RESOURCES/QRCodeScanner/rsdecoder.js" BrowseName="1:rsdecoder.js" DataType="ByteString" AccessLevel="103" UserAccessLevel="103" Historizing="true">
		<DisplayName Locale="en">rsdecoder.js</DisplayName>
		<Description Locale="en">rsdecoder.js</Description>
		<References>
			<Reference ReferenceType="HasComponent" IsForward="false">ns=1;s=SYSTEM.LIBRARY.PROJECT.RESOURCES/QRCodeScanner</Reference>
			<Reference ReferenceType="HasTypeDefinition">ns=1;s=VariableTypes.ATVISE.Resource.Javascript</Reference>
			<Reference ReferenceType="HasProperty">ns=1;s=VariableTypes.ATVISE.Resource.Javascript.Compress</Reference>
		</References>
		<Value>
			<uax:ByteString>LyoNCiAgUG9ydGVkIHRvIEphdmFTY3JpcHQgYnkgTGF6YXIgTGFzemxvIDIwMTEgDQogIA0KICBsYXphcnNvZnRAZ21haWwuY29tLCB3d3cubGF6YXJzb2Z0LmluZm8NCiAgDQoqLw0KDQovKg0KKg0KKiBDb3B5cmlnaHQgMjAwNyBaWGluZyBhdXRob3JzDQoqDQoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOw0KKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuDQoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KKg0KKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KKg0KKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KKi8NCg0KDQpmdW5jdGlvbiBSZWVkU29sb21vbkRlY29kZXIoZmllbGQpDQp7DQoJdGhpcy5maWVsZCA9IGZpZWxkOw0KCXRoaXMuZGVjb2RlPWZ1bmN0aW9uKHJlY2VpdmVkLCAgdHdvUykNCgl7DQoJCQl2YXIgcG9seSA9IG5ldyBHRjI1NlBvbHkodGhpcy5maWVsZCwgcmVjZWl2ZWQpOw0KCQkJdmFyIHN5bmRyb21lQ29lZmZpY2llbnRzID0gbmV3IEFycmF5KHR3b1MpOw0KCQkJZm9yKHZhciBpPTA7aTxzeW5kcm9tZUNvZWZmaWNpZW50cy5sZW5ndGg7aSsrKXN5bmRyb21lQ29lZmZpY2llbnRzW2ldPTA7DQoJCQl2YXIgZGF0YU1hdHJpeCA9IGZhbHNlOy8vdGhpcy5maWVsZC5FcXVhbHMoR0YyNTYuREFUQV9NQVRSSVhfRklFTEQpOw0KCQkJdmFyIG5vRXJyb3IgPSB0cnVlOw0KCQkJZm9yICh2YXIgaSA9IDA7IGkgPCB0d29TOyBpKyspDQoJCQl7DQoJCQkJLy8gVGhhbmtzIHRvIHNhbmZvcmRzcXVpcmVzIGZvciB0aGlzIGZpeDoNCgkJCQl2YXIgZXZhbHUgPSBwb2x5LmV2YWx1YXRlQXQodGhpcy5maWVsZC5leHAoZGF0YU1hdHJpeD9pICsgMTppKSk7DQoJCQkJc3luZHJvbWVDb2VmZmljaWVudHNbc3luZHJvbWVDb2VmZmljaWVudHMubGVuZ3RoIC0gMSAtIGldID0gZXZhbHU7DQoJCQkJaWYgKGV2YWx1ICE9IDApDQoJCQkJew0KCQkJCQlub0Vycm9yID0gZmFsc2U7DQoJCQkJfQ0KCQkJfQ0KCQkJaWYgKG5vRXJyb3IpDQoJCQl7DQoJCQkJcmV0dXJuIDsNCgkJCX0NCgkJCXZhciBzeW5kcm9tZSA9IG5ldyBHRjI1NlBvbHkodGhpcy5maWVsZCwgc3luZHJvbWVDb2VmZmljaWVudHMpOw0KCQkJdmFyIHNpZ21hT21lZ2EgPSB0aGlzLnJ1bkV1Y2xpZGVhbkFsZ29yaXRobSh0aGlzLmZpZWxkLmJ1aWxkTW9ub21pYWwodHdvUywgMSksIHN5bmRyb21lLCB0d29TKTsNCgkJCXZhciBzaWdtYSA9IHNpZ21hT21lZ2FbMF07DQoJCQl2YXIgb21lZ2EgPSBzaWdtYU9tZWdhWzFdOw0KCQkJdmFyIGVycm9yTG9jYXRpb25zID0gdGhpcy5maW5kRXJyb3JMb2NhdGlvbnMoc2lnbWEpOw0KCQkJdmFyIGVycm9yTWFnbml0dWRlcyA9IHRoaXMuZmluZEVycm9yTWFnbml0dWRlcyhvbWVnYSwgZXJyb3JMb2NhdGlvbnMsIGRhdGFNYXRyaXgpOw0KCQkJZm9yICh2YXIgaSA9IDA7IGkgPCBlcnJvckxvY2F0aW9ucy5sZW5ndGg7IGkrKykNCgkJCXsNCgkJCQl2YXIgcG9zaXRpb24gPSByZWNlaXZlZC5sZW5ndGggLSAxIC0gdGhpcy5maWVsZC5sb2coZXJyb3JMb2NhdGlvbnNbaV0pOw0KCQkJCWlmIChwb3NpdGlvbiA8IDApDQoJCQkJew0KCQkJCQl0aHJvdyAiUmVlZFNvbG9tb25FeGNlcHRpb24gQmFkIGVycm9yIGxvY2F0aW9uIjsNCgkJCQl9DQoJCQkJcmVjZWl2ZWRbcG9zaXRpb25dID0gR0YyNTYuYWRkT3JTdWJ0cmFjdChyZWNlaXZlZFtwb3NpdGlvbl0sIGVycm9yTWFnbml0dWRlc1tpXSk7DQoJCQl9DQoJfQ0KCQ0KCXRoaXMucnVuRXVjbGlkZWFuQWxnb3JpdGhtPWZ1bmN0aW9uKCBhLCAgYiwgIFIpDQoJCXsNCgkJCS8vIEFzc3VtZSBhJ3MgZGVncmVlIGlzID49IGIncw0KCQkJaWYgKGEuRGVncmVlIDwgYi5EZWdyZWUpDQoJCQl7DQoJCQkJdmFyIHRlbXAgPSBhOw0KCQkJCWEgPSBiOw0KCQkJCWIgPSB0ZW1wOw0KCQkJfQ0KCQkJDQoJCQl2YXIgckxhc3QgPSBhOw0KCQkJdmFyIHIgPSBiOw0KCQkJdmFyIHNMYXN0ID0gdGhpcy5maWVsZC5PbmU7DQoJCQl2YXIgcyA9IHRoaXMuZmllbGQuWmVybzsNCgkJCXZhciB0TGFzdCA9IHRoaXMuZmllbGQuWmVybzsNCgkJCXZhciB0ID0gdGhpcy5maWVsZC5PbmU7DQoJCQkNCgkJCS8vIFJ1biBFdWNsaWRlYW4gYWxnb3JpdGhtIHVudGlsIHIncyBkZWdyZWUgaXMgbGVzcyB0aGFuIFIvMg0KCQkJd2hpbGUgKHIuRGVncmVlID49IE1hdGguZmxvb3IoUiAvIDIpKQ0KCQkJew0KCQkJCXZhciByTGFzdExhc3QgPSByTGFzdDsNCgkJCQl2YXIgc0xhc3RMYXN0ID0gc0xhc3Q7DQoJCQkJdmFyIHRMYXN0TGFzdCA9IHRMYXN0Ow0KCQkJCXJMYXN0ID0gcjsNCgkJCQlzTGFzdCA9IHM7DQoJCQkJdExhc3QgPSB0Ow0KCQkJCQ0KCQkJCS8vIERpdmlkZSByTGFzdExhc3QgYnkgckxhc3QsIHdpdGggcXVvdGllbnQgaW4gcSBhbmQgcmVtYWluZGVyIGluIHINCgkJCQlpZiAockxhc3QuWmVybykNCgkJCQl7DQoJCQkJCS8vIE9vcHMsIEV1Y2xpZGVhbiBhbGdvcml0aG0gYWxyZWFkeSB0ZXJtaW5hdGVkPw0KCQkJCQl0aHJvdyAicl97aS0xfSB3YXMgemVybyI7DQoJCQkJfQ0KCQkJCXIgPSByTGFzdExhc3Q7DQoJCQkJdmFyIHEgPSB0aGlzLmZpZWxkLlplcm87DQoJCQkJdmFyIGRlbm9taW5hdG9yTGVhZGluZ1Rlcm0gPSByTGFzdC5nZXRDb2VmZmljaWVudChyTGFzdC5EZWdyZWUpOw0KCQkJCXZhciBkbHRJbnZlcnNlID0gdGhpcy5maWVsZC5pbnZlcnNlKGRlbm9taW5hdG9yTGVhZGluZ1Rlcm0pOw0KCQkJCXdoaWxlIChyLkRlZ3JlZSA+PSByTGFzdC5EZWdyZWUgJiYgIXIuWmVybykNCgkJCQl7DQoJCQkJCXZhciBkZWdyZWVEaWZmID0gci5EZWdyZWUgLSByTGFzdC5EZWdyZWU7DQoJCQkJCXZhciBzY2FsZSA9IHRoaXMuZmllbGQubXVsdGlwbHkoci5nZXRDb2VmZmljaWVudChyLkRlZ3JlZSksIGRsdEludmVyc2UpOw0KCQkJCQlxID0gcS5hZGRPclN1YnRyYWN0KHRoaXMuZmllbGQuYnVpbGRNb25vbWlhbChkZWdyZWVEaWZmLCBzY2FsZSkpOw0KCQkJCQlyID0gci5hZGRPclN1YnRyYWN0KHJMYXN0Lm11bHRpcGx5QnlNb25vbWlhbChkZWdyZWVEaWZmLCBzY2FsZSkpOw0KCQkJCQkvL3IuRVhFKCk7DQoJCQkJfQ0KCQkJCQ0KCQkJCXMgPSBxLm11bHRpcGx5MShzTGFzdCkuYWRkT3JTdWJ0cmFjdChzTGFzdExhc3QpOw0KCQkJCXQgPSBxLm11bHRpcGx5MSh0TGFzdCkuYWRkT3JTdWJ0cmFjdCh0TGFzdExhc3QpOw0KCQkJfQ0KCQkJDQoJCQl2YXIgc2lnbWFUaWxkZUF0WmVybyA9IHQuZ2V0Q29lZmZpY2llbnQoMCk7DQoJCQlpZiAoc2lnbWFUaWxkZUF0WmVybyA9PSAwKQ0KCQkJew0KCQkJCXRocm93ICJSZWVkU29sb21vbkV4Y2VwdGlvbiBzaWdtYVRpbGRlKDApIHdhcyB6ZXJvIjsNCgkJCX0NCgkJCQ0KCQkJdmFyIGludmVyc2UgPSB0aGlzLmZpZWxkLmludmVyc2Uoc2lnbWFUaWxkZUF0WmVybyk7DQoJCQl2YXIgc2lnbWEgPSB0Lm11bHRpcGx5MihpbnZlcnNlKTsNCgkJCXZhciBvbWVnYSA9IHIubXVsdGlwbHkyKGludmVyc2UpOw0KCQkJcmV0dXJuIG5ldyBBcnJheShzaWdtYSwgb21lZ2EpOw0KCQl9DQoJdGhpcy5maW5kRXJyb3JMb2NhdGlvbnM9ZnVuY3Rpb24oIGVycm9yTG9jYXRvcikNCgkJew0KCQkJLy8gVGhpcyBpcyBhIGRpcmVjdCBhcHBsaWNhdGlvbiBvZiBDaGllbidzIHNlYXJjaA0KCQkJdmFyIG51bUVycm9ycyA9IGVycm9yTG9jYXRvci5EZWdyZWU7DQoJCQlpZiAobnVtRXJyb3JzID09IDEpDQoJCQl7DQoJCQkJLy8gc2hvcnRjdXQNCgkJCQlyZXR1cm4gbmV3IEFycmF5KGVycm9yTG9jYXRvci5nZXRDb2VmZmljaWVudCgxKSk7DQoJCQl9DQoJCQl2YXIgcmVzdWx0ID0gbmV3IEFycmF5KG51bUVycm9ycyk7DQoJCQl2YXIgZSA9IDA7DQoJCQlmb3IgKHZhciBpID0gMTsgaSA8IDI1NiAmJiBlIDwgbnVtRXJyb3JzOyBpKyspDQoJCQl7DQoJCQkJaWYgKGVycm9yTG9jYXRvci5ldmFsdWF0ZUF0KGkpID09IDApDQoJCQkJew0KCQkJCQlyZXN1bHRbZV0gPSB0aGlzLmZpZWxkLmludmVyc2UoaSk7DQoJCQkJCWUrKzsNCgkJCQl9DQoJCQl9DQoJCQlpZiAoZSAhPSBudW1FcnJvcnMpDQoJCQl7DQoJCQkJdGhyb3cgIkVycm9yIGxvY2F0b3IgZGVncmVlIGRvZXMgbm90IG1hdGNoIG51bWJlciBvZiByb290cyI7DQoJCQl9DQoJCQlyZXR1cm4gcmVzdWx0Ow0KCQl9DQoJdGhpcy5maW5kRXJyb3JNYWduaXR1ZGVzPWZ1bmN0aW9uKCBlcnJvckV2YWx1YXRvciwgIGVycm9yTG9jYXRpb25zLCAgZGF0YU1hdHJpeCkNCgkJew0KCQkJLy8gVGhpcyBpcyBkaXJlY3RseSBhcHBseWluZyBGb3JuZXkncyBGb3JtdWxhDQoJCQl2YXIgcyA9IGVycm9yTG9jYXRpb25zLmxlbmd0aDsNCgkJCXZhciByZXN1bHQgPSBuZXcgQXJyYXkocyk7DQoJCQlmb3IgKHZhciBpID0gMDsgaSA8IHM7IGkrKykNCgkJCXsNCgkJCQl2YXIgeGlJbnZlcnNlID0gdGhpcy5maWVsZC5pbnZlcnNlKGVycm9yTG9jYXRpb25zW2ldKTsNCgkJCQl2YXIgZGVub21pbmF0b3IgPSAxOw0KCQkJCWZvciAodmFyIGogPSAwOyBqIDwgczsgaisrKQ0KCQkJCXsNCgkJCQkJaWYgKGkgIT0gaikNCgkJCQkJew0KCQkJCQkJZGVub21pbmF0b3IgPSB0aGlzLmZpZWxkLm11bHRpcGx5KGRlbm9taW5hdG9yLCBHRjI1Ni5hZGRPclN1YnRyYWN0KDEsIHRoaXMuZmllbGQubXVsdGlwbHkoZXJyb3JMb2NhdGlvbnNbal0sIHhpSW52ZXJzZSkpKTsNCgkJCQkJfQ0KCQkJCX0NCgkJCQlyZXN1bHRbaV0gPSB0aGlzLmZpZWxkLm11bHRpcGx5KGVycm9yRXZhbHVhdG9yLmV2YWx1YXRlQXQoeGlJbnZlcnNlKSwgdGhpcy5maWVsZC5pbnZlcnNlKGRlbm9taW5hdG9yKSk7DQoJCQkJLy8gVGhhbmtzIHRvIHNhbmZvcmRzcXVpcmVzIGZvciB0aGlzIGZpeDoNCgkJCQlpZiAoZGF0YU1hdHJpeCkNCgkJCQl7DQoJCQkJCXJlc3VsdFtpXSA9IHRoaXMuZmllbGQubXVsdGlwbHkocmVzdWx0W2ldLCB4aUludmVyc2UpOw0KCQkJCX0NCgkJCX0NCgkJCXJldHVybiByZXN1bHQ7DQoJCX0NCn0=</uax:ByteString>
		</Value>
	</UAVariable>
	<UAObject NodeId="ns=1;s=SYSTEM" BrowseName="1:SYSTEM">
		<DisplayName Locale="en">SYSTEM</DisplayName>
		<Description Locale="en">SYSTEM</Description>
		<References>
			<Reference ReferenceType="HasComponent" IsForward="false">Objects</Reference>
			<Reference ReferenceType="HasTypeDefinition">FolderType</Reference>
		</References>
		<Extensions>
			<atvise ExportedNodeId="ns=1;s=SYSTEM.LIBRARY.PROJECT.RESOURCES/QRCodeScanner/test.html" ExportedBrowseName="1:test.html" Upstream="true"/>
		</Extensions>
	</UAObject>
	<UAObject NodeId="ns=1;s=SYSTEM.LIBRARY" BrowseName="1:LIBRARY">
		<DisplayName Locale="en">LIBRARY</DisplayName>
		<Description Locale="en">LIBRARY</Description>
		<References>
			<Reference ReferenceType="HasComponent" IsForward="false">ns=1;s=SYSTEM</Reference>
			<Reference ReferenceType="HasTypeDefinition">FolderType</Reference>
		</References>
		<Extensions>
			<atvise Upstream="true"/>
		</Extensions>
	</UAObject>
	<UAObject NodeId="ns=1;s=SYSTEM.LIBRARY.PROJECT" BrowseName="1:PROJECT">
		<DisplayName Locale="en">PROJECT</DisplayName>
		<Description Locale="en">PROJECT</Description>
		<References>
			<Reference ReferenceType="HasComponent" IsForward="false">ns=1;s=SYSTEM.LIBRARY</Reference>
			<Reference ReferenceType="HasTypeDefinition">FolderType</Reference>
		</References>
		<Extensions>
			<atvise Upstream="true"/>
		</Extensions>
	</UAObject>
	<UAObject NodeId="ns=1;s=SYSTEM.LIBRARY.PROJECT.RESOURCES" BrowseName="1:RESOURCES">
		<DisplayName Locale="en">RESOURCES</DisplayName>
		<Description Locale="en">RESOURCES</Description>
		<References>
			<Reference ReferenceType="HasComponent" IsForward="false">ns=1;s=SYSTEM.LIBRARY.PROJECT</Reference>
			<Reference ReferenceType="HasTypeDefinition">FolderType</Reference>
		</References>
		<Extensions>
			<atvise Upstream="true"/>
		</Extensions>
	</UAObject>
	<UAObject NodeId="ns=1;s=SYSTEM.LIBRARY.PROJECT.RESOURCES/QRCodeScanner" BrowseName="1:QRCodeScanner">
		<DisplayName Locale="en">QRCodeScanner</DisplayName>
		<Description Locale="en">QRCodeScanner</Description>
		<References>
			<Reference ReferenceType="HasComponent" IsForward="false">ns=1;s=SYSTEM.LIBRARY.PROJECT.RESOURCES</Reference>
			<Reference ReferenceType="HasTypeDefinition">FolderType</Reference>
		</References>
		<Extensions>
			<atvise Upstream="true"/>
		</Extensions>
	</UAObject>
	<UAVariable NodeId="ns=1;s=SYSTEM.LIBRARY.PROJECT.RESOURCES/QRCodeScanner/test.html" BrowseName="1:test.html" DataType="ByteString" AccessLevel="103" UserAccessLevel="103" Historizing="true">
		<DisplayName Locale="en">test.html</DisplayName>
		<Description Locale="en">test.html</Description>
		<References>
			<Reference ReferenceType="HasComponent" IsForward="false">ns=1;s=SYSTEM.LIBRARY.PROJECT.RESOURCES/QRCodeScanner</Reference>
			<Reference ReferenceType="HasTypeDefinition">ns=1;s=VariableTypes.ATVISE.Resource.Html</Reference>
			<Reference ReferenceType="HasProperty">ns=1;s=VariableTypes.ATVISE.Resource.Html.Compress</Reference>
		</References>
		<Value>
			<uax:ByteString>PGh0bWw+CjxoZWFkPgoJCTwhLS1jb2RlIGluc2VydGVkIGJ5IGF0dmlzZS0tPgoJCTxzY3JpcHQgc3JjPSIvd2VibWkuanMiIHR5cGU9InRleHQvamF2YXNjcmlwdCI+PC9zY3JpcHQ+Cgo8dGl0bGU+UVJDT0RFPC90aXRsZT4KCjxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+Cjwvc3R5bGU+CgoKPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0iL1FSQ29kZVNjYW5uZXIvZ3JpZC5qcyI+PC9zY3JpcHQ+CjxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9Ii9RUkNvZGVTY2FubmVyL3ZlcnNpb24uanMiPjwvc2NyaXB0Pgo8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSIvUVJDb2RlU2Nhbm5lci9kZXRlY3Rvci5qcyI+PC9zY3JpcHQ+CjxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9Ii9RUkNvZGVTY2FubmVyL2Zvcm1hdGluZi5qcyI+PC9zY3JpcHQ+CjxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9Ii9RUkNvZGVTY2FubmVyL2Vycm9ybGV2ZWwuanMiPjwvc2NyaXB0Pgo8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSIvUVJDb2RlU2Nhbm5lci9iaXRtYXQuanMiPjwvc2NyaXB0Pgo8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSIvUVJDb2RlU2Nhbm5lci9kYXRhYmxvY2suanMiPjwvc2NyaXB0Pgo8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSIvUVJDb2RlU2Nhbm5lci9ibXBhcnNlci5qcyI+PC9zY3JpcHQ+CjxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9Ii9RUkNvZGVTY2FubmVyL2RhdGFtYXNrLmpzIj48L3NjcmlwdD4KPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0iL1FSQ29kZVNjYW5uZXIvcnNkZWNvZGVyLmpzIj48L3NjcmlwdD4KPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0iL1FSQ29kZVNjYW5uZXIvZ2YyNTZwb2x5LmpzIj48L3NjcmlwdD4KPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0iL1FSQ29kZVNjYW5uZXIvZ2YyNTYuanMiPjwvc2NyaXB0Pgo8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSIvUVJDb2RlU2Nhbm5lci9kZWNvZGVyLmpzIj48L3NjcmlwdD4KPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0iL1FSQ29kZVNjYW5uZXIvcXJjb2RlLmpzIj48L3NjcmlwdD4KPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0iL1FSQ29kZVNjYW5uZXIvZmluZHBhdC5qcyI+PC9zY3JpcHQ+CjxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9Ii9RUkNvZGVTY2FubmVyL2FsaWducGF0LmpzIj48L3NjcmlwdD4KPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0iL1FSQ29kZVNjYW5uZXIvZGF0YWJyLmpzIj48L3NjcmlwdD4KCjxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KZGVidWdnZXI7CnZhciBnQ3R4ID0gbnVsbDsKCXZhciBnQ2FudmFzID0gbnVsbDsKCgl2YXIgaW1hZ2VEYXRhID0gbnVsbDsKCXZhciBpaT0wOwoJdmFyIGpqPTA7Cgl2YXIgYz0wOwoJCgkKZnVuY3Rpb24gZHJhZ2VudGVyKGUpIHsKICBlLnN0b3BQcm9wYWdhdGlvbigpOwogIGUucHJldmVudERlZmF1bHQoKTsKfQoKZnVuY3Rpb24gZHJhZ292ZXIoZSkgewogIGUuc3RvcFByb3BhZ2F0aW9uKCk7CiAgZS5wcmV2ZW50RGVmYXVsdCgpOwp9CmZ1bmN0aW9uIGRyb3AoZSkgewogIGUuc3RvcFByb3BhZ2F0aW9uKCk7CiAgZS5wcmV2ZW50RGVmYXVsdCgpOwoKICB2YXIgZHQgPSBlLmRhdGFUcmFuc2ZlcjsKICB2YXIgZmlsZXMgPSBkdC5maWxlczsKCiAgaGFuZGxlRmlsZXMoZmlsZXMpOwp9CgpmdW5jdGlvbiBoYW5kbGVGaWxlcyhmKQp7Cgl2YXIgbz1bXTsKCWZvcih2YXIgaSA9MDtpPGYubGVuZ3RoO2krKykKCXsKCSAgdmFyIHJlYWRlciA9IG5ldyBGaWxlUmVhZGVyKCk7CgogICAgICByZWFkZXIub25sb2FkID0gKGZ1bmN0aW9uKHRoZUZpbGUpIHsKICAgICAgICByZXR1cm4gZnVuY3Rpb24oZSkgewogICAgICAgICAgcXJjb2RlLmRlY29kZShlLnRhcmdldC5yZXN1bHQpOwogICAgICAgIH07CiAgICAgIH0pKGZbaV0pOwoKICAgICAgLy8gUmVhZCBpbiB0aGUgaW1hZ2UgZmlsZSBhcyBhIGRhdGEgVVJMLgogICAgICByZWFkZXIucmVhZEFzRGF0YVVSTChmW2ldKTsJfQp9CgkKZnVuY3Rpb24gcmVhZChhKQp7CglhbGVydChhKTsKfQkKCQpmdW5jdGlvbiBsb2FkKCkKewoJaW5pdENhbnZhcyg2NDAsNDgwKTsKCXFyY29kZS5jYWxsYmFjayA9IHJlYWQ7CglxcmNvZGUuZGVjb2RlKCJtZXFydGh1bWIucG5nIik7Cn0KCmZ1bmN0aW9uIGluaXRDYW52YXMod3csaGgpCgl7CgkJZ0NhbnZhcyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJxci1jYW52YXMiKTsKCQlnQ2FudmFzLmFkZEV2ZW50TGlzdGVuZXIoImRyYWdlbnRlciIsIGRyYWdlbnRlciwgZmFsc2UpOyAgCgkJZ0NhbnZhcy5hZGRFdmVudExpc3RlbmVyKCJkcmFnb3ZlciIsIGRyYWdvdmVyLCBmYWxzZSk7ICAKCQlnQ2FudmFzLmFkZEV2ZW50TGlzdGVuZXIoImRyb3AiLCBkcm9wLCBmYWxzZSk7CgkJdmFyIHcgPSB3dzsKCQl2YXIgaCA9IGhoOwoJCWdDYW52YXMuc3R5bGUud2lkdGggPSB3ICsgInB4IjsKCQlnQ2FudmFzLnN0eWxlLmhlaWdodCA9IGggKyAicHgiOwoJCWdDYW52YXMud2lkdGggPSB3OwoJCWdDYW52YXMuaGVpZ2h0ID0gaDsKCQlnQ3R4ID0gZ0NhbnZhcy5nZXRDb250ZXh0KCIyZCIpOwoJCWdDdHguY2xlYXJSZWN0KDAsIDAsIHcsIGgpOwoJCWltYWdlRGF0YSA9IGdDdHguZ2V0SW1hZ2VEYXRhKCAwLDAsMzIwLDI0MCk7Cgl9CgoJZnVuY3Rpb24gcGFzc0xpbmUoc3RyaW5nUGl4ZWxzKSB7IAoJCS8vYSA9IChpbnRWYWwgPj4gMjQpICYgMHhmZjsKCgkJdmFyIGNvbGwgPSBzdHJpbmdQaXhlbHMuc3BsaXQoIi0iKTsKCQoJCWZvcih2YXIgaT0wO2k8MzIwO2krKykgeyAKCQkJdmFyIGludFZhbCA9IHBhcnNlSW50KGNvbGxbaV0pOwoJCQlyID0gKGludFZhbCA+PiAxNikgJiAweGZmOwoJCQlnID0gKGludFZhbCA+PiA4KSAmIDB4ZmY7CgkJCWIgPSAoaW50VmFsICkgJiAweGZmOwoJCQlpbWFnZURhdGEuZGF0YVtjKzBdPXI7CgkJCWltYWdlRGF0YS5kYXRhW2MrMV09ZzsKCQkJaW1hZ2VEYXRhLmRhdGFbYysyXT1iOwoJCQlpbWFnZURhdGEuZGF0YVtjKzNdPTI1NTsKCQkJYys9NDsKCQl9IAoKCQlpZihjPj0zMjAqMjQwKjQpIHsgCgkJCWM9MDsKICAgICAgCQkJZ0N0eC5wdXRJbWFnZURhdGEoaW1hZ2VEYXRhLCAwLDApOwoJCX0gCiAJfSAKCiAgICAgICAgZnVuY3Rpb24gY2FwdHVyZVRvQ2FudmFzKCkgewoJCWZsYXNoID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImVtYmVkZmxhc2giKTsKCQlmbGFzaC5jY0NhcHR1cmUoKTsKCQlxcmNvZGUuZGVjb2RlKCk7CiAgICAgICAgfQo8L3NjcmlwdD4KCjwvaGVhZD4KCjxib2R5IG9ubG9hZD0ibG9hZCgpIj4KICAgIDxkaXYgY2xhc3M9ImNvbnRhaW5lciI+CgkKICAJPG9iamVjdCAgaWQ9ImllbWJlZGZsYXNoIiBjbGFzc2lkPSJjbHNpZDpkMjdjZGI2ZS1hZTZkLTExY2YtOTZiOC00NDQ1NTM1NDAwMDAiIGNvZGViYXNlPSJodHRwOi8vZG93bmxvYWQubWFjcm9tZWRpYS5jb20vcHViL3Nob2Nrd2F2ZS9jYWJzL2ZsYXNoL3N3Zmxhc2guY2FiI3ZlcnNpb249NywwLDAsMCIgd2lkdGg9IjMyMCIgaGVpZ2h0PSIyNDAiPgogIAkJPHBhcmFtIG5hbWU9Im1vdmllIiB2YWx1ZT0iY2FtY2FudmFzLnN3ZiIgLz4KICAJCTxwYXJhbSBuYW1lPSJxdWFsaXR5IiB2YWx1ZT0iaGlnaCIgLz4KCQk8cGFyYW0gbmFtZT0iYWxsb3dTY3JpcHRBY2Nlc3MiIHZhbHVlPSJhbHdheXMiIC8+CiAgCQk8ZW1iZWQgIGFsbG93U2NyaXB0QWNjZXNzPSJhbHdheXMiICBpZD0iZW1iZWRmbGFzaCIgc3JjPSJjYW1jYW52YXMuc3dmIiBxdWFsaXR5PSJoaWdoIiB3aWR0aD0iMzIwIiBoZWlnaHQ9IjI0MCIgdHlwZT0iYXBwbGljYXRpb24veC1zaG9ja3dhdmUtZmxhc2giIHBsdWdpbnNwYWdlPSJodHRwOi8vd3d3Lm1hY3JvbWVkaWEuY29tL2dvL2dldGZsYXNocGxheWVyIiBtYXlzY3JpcHQ9InRydWUiICAvPgogICAgPC9vYmplY3Q+CgkKICAgIDwvZGl2Pgo8YnV0dG9uIG9uY2xpY2s9ImNhcHR1cmVUb0NhbnZhcygpIj5DYXB0dXJlPC9idXR0b24+PGJyPgo8Y2FudmFzIGlkPSJxci1jYW52YXMiIHdpZHRoPSI2NDAiIGhlaWdodD0iNDgwIj48L2NhbnZhcz4KPC9ib2R5PgoKPC9odG1sPg==</uax:ByteString>
		</Value>
	</UAVariable>
	<UAObject NodeId="ns=1;s=SYSTEM" BrowseName="1:SYSTEM">
		<DisplayName Locale="en">SYSTEM</DisplayName>
		<Description Locale="en">SYSTEM</Description>
		<References>
			<Reference ReferenceType="HasComponent" IsForward="false">Objects</Reference>
			<Reference ReferenceType="HasTypeDefinition">FolderType</Reference>
		</References>
		<Extensions>
			<atvise ExportedNodeId="ns=1;s=SYSTEM.LIBRARY.PROJECT.RESOURCES/QRCodeScanner/version.js" ExportedBrowseName="1:version.js" Upstream="true"/>
		</Extensions>
	</UAObject>
	<UAObject NodeId="ns=1;s=SYSTEM.LIBRARY" BrowseName="1:LIBRARY">
		<DisplayName Locale="en">LIBRARY</DisplayName>
		<Description Locale="en">LIBRARY</Description>
		<References>
			<Reference ReferenceType="HasComponent" IsForward="false">ns=1;s=SYSTEM</Reference>
			<Reference ReferenceType="HasTypeDefinition">FolderType</Reference>
		</References>
		<Extensions>
			<atvise Upstream="true"/>
		</Extensions>
	</UAObject>
	<UAObject NodeId="ns=1;s=SYSTEM.LIBRARY.PROJECT" BrowseName="1:PROJECT">
		<DisplayName Locale="en">PROJECT</DisplayName>
		<Description Locale="en">PROJECT</Description>
		<References>
			<Reference ReferenceType="HasComponent" IsForward="false">ns=1;s=SYSTEM.LIBRARY</Reference>
			<Reference ReferenceType="HasTypeDefinition">FolderType</Reference>
		</References>
		<Extensions>
			<atvise Upstream="true"/>
		</Extensions>
	</UAObject>
	<UAObject NodeId="ns=1;s=SYSTEM.LIBRARY.PROJECT.RESOURCES" BrowseName="1:RESOURCES">
		<DisplayName Locale="en">RESOURCES</DisplayName>
		<Description Locale="en">RESOURCES</Description>
		<References>
			<Reference ReferenceType="HasComponent" IsForward="false">ns=1;s=SYSTEM.LIBRARY.PROJECT</Reference>
			<Reference ReferenceType="HasTypeDefinition">FolderType</Reference>
		</References>
		<Extensions>
			<atvise Upstream="true"/>
		</Extensions>
	</UAObject>
	<UAObject NodeId="ns=1;s=SYSTEM.LIBRARY.PROJECT.RESOURCES/QRCodeScanner" BrowseName="1:QRCodeScanner">
		<DisplayName Locale="en">QRCodeScanner</DisplayName>
		<Description Locale="en">QRCodeScanner</Description>
		<References>
			<Reference ReferenceType="HasComponent" IsForward="false">ns=1;s=SYSTEM.LIBRARY.PROJECT.RESOURCES</Reference>
			<Reference ReferenceType="HasTypeDefinition">FolderType</Reference>
		</References>
		<Extensions>
			<atvise Upstream="true"/>
		</Extensions>
	</UAObject>
	<UAVariable NodeId="ns=1;s=SYSTEM.LIBRARY.PROJECT.RESOURCES/QRCodeScanner/version.js" BrowseName="1:version.js" DataType="ByteString" AccessLevel="103" UserAccessLevel="103" Historizing="true">
		<DisplayName Locale="en">version.js</DisplayName>
		<Description Locale="en">version.js</Description>
		<References>
			<Reference ReferenceType="HasComponent" IsForward="false">ns=1;s=SYSTEM.LIBRARY.PROJECT.RESOURCES/QRCodeScanner</Reference>
			<Reference ReferenceType="HasTypeDefinition">ns=1;s=VariableTypes.ATVISE.Resource.Javascript</Reference>
			<Reference ReferenceType="HasProperty">ns=1;s=VariableTypes.ATVISE.Resource.Javascript.Compress</Reference>
		</References>
		<Value>
			<uax:ByteString>LyoNCiAgUG9ydGVkIHRvIEphdmFTY3JpcHQgYnkgTGF6YXIgTGFzemxvIDIwMTEgDQogIA0KICBsYXphcnNvZnRAZ21haWwuY29tLCB3d3cubGF6YXJzb2Z0LmluZm8NCiAgDQoqLw0KDQovKg0KKg0KKiBDb3B5cmlnaHQgMjAwNyBaWGluZyBhdXRob3JzDQoqDQoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOw0KKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuDQoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KKg0KKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KKg0KKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KKi8NCg0KDQoNCmZ1bmN0aW9uIEVDQihjb3VudCwgIGRhdGFDb2Rld29yZHMpDQp7DQoJdGhpcy5jb3VudCA9IGNvdW50Ow0KCXRoaXMuZGF0YUNvZGV3b3JkcyA9IGRhdGFDb2Rld29yZHM7DQoJDQoJdGhpcy5fX2RlZmluZUdldHRlcl9fKCJDb3VudCIsIGZ1bmN0aW9uKCkNCgl7DQoJCXJldHVybiB0aGlzLmNvdW50Ow0KCX0pOw0KCXRoaXMuX19kZWZpbmVHZXR0ZXJfXygiRGF0YUNvZGV3b3JkcyIsIGZ1bmN0aW9uKCkNCgl7DQoJCXJldHVybiB0aGlzLmRhdGFDb2Rld29yZHM7DQoJfSk7DQp9DQoNCmZ1bmN0aW9uIEVDQmxvY2tzKCBlY0NvZGV3b3Jkc1BlckJsb2NrLCAgZWNCbG9ja3MxLCAgZWNCbG9ja3MyKQ0Kew0KCXRoaXMuZWNDb2Rld29yZHNQZXJCbG9jayA9IGVjQ29kZXdvcmRzUGVyQmxvY2s7DQoJaWYoZWNCbG9ja3MyKQ0KCQl0aGlzLmVjQmxvY2tzID0gbmV3IEFycmF5KGVjQmxvY2tzMSwgZWNCbG9ja3MyKTsNCgllbHNlDQoJCXRoaXMuZWNCbG9ja3MgPSBuZXcgQXJyYXkoZWNCbG9ja3MxKTsNCgkNCgl0aGlzLl9fZGVmaW5lR2V0dGVyX18oIkVDQ29kZXdvcmRzUGVyQmxvY2siLCBmdW5jdGlvbigpDQoJew0KCQlyZXR1cm4gdGhpcy5lY0NvZGV3b3Jkc1BlckJsb2NrOw0KCX0pOw0KCQ0KCXRoaXMuX19kZWZpbmVHZXR0ZXJfXygiVG90YWxFQ0NvZGV3b3JkcyIsIGZ1bmN0aW9uKCkNCgl7DQoJCXJldHVybiAgdGhpcy5lY0NvZGV3b3Jkc1BlckJsb2NrICogdGhpcy5OdW1CbG9ja3M7DQoJfSk7DQoJDQoJdGhpcy5fX2RlZmluZUdldHRlcl9fKCJOdW1CbG9ja3MiLCBmdW5jdGlvbigpDQoJew0KCQl2YXIgdG90YWwgPSAwOw0KCQlmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuZWNCbG9ja3MubGVuZ3RoOyBpKyspDQoJCXsNCgkJCXRvdGFsICs9IHRoaXMuZWNCbG9ja3NbaV0ubGVuZ3RoOw0KCQl9DQoJCXJldHVybiB0b3RhbDsNCgl9KTsNCgkNCgl0aGlzLmdldEVDQmxvY2tzPWZ1bmN0aW9uKCkNCgkJCXsNCgkJCQlyZXR1cm4gdGhpcy5lY0Jsb2NrczsNCgkJCX0NCn0NCg0KZnVuY3Rpb24gVmVyc2lvbiggdmVyc2lvbk51bWJlciwgIGFsaWdubWVudFBhdHRlcm5DZW50ZXJzLCAgZWNCbG9ja3MxLCAgZWNCbG9ja3MyLCAgZWNCbG9ja3MzLCAgZWNCbG9ja3M0KQ0Kew0KCXRoaXMudmVyc2lvbk51bWJlciA9IHZlcnNpb25OdW1iZXI7DQoJdGhpcy5hbGlnbm1lbnRQYXR0ZXJuQ2VudGVycyA9IGFsaWdubWVudFBhdHRlcm5DZW50ZXJzOw0KCXRoaXMuZWNCbG9ja3MgPSBuZXcgQXJyYXkoZWNCbG9ja3MxLCBlY0Jsb2NrczIsIGVjQmxvY2tzMywgZWNCbG9ja3M0KTsNCgkNCgl2YXIgdG90YWwgPSAwOw0KCXZhciBlY0NvZGV3b3JkcyA9IGVjQmxvY2tzMS5FQ0NvZGV3b3Jkc1BlckJsb2NrOw0KCXZhciBlY2JBcnJheSA9IGVjQmxvY2tzMS5nZXRFQ0Jsb2NrcygpOw0KCWZvciAodmFyIGkgPSAwOyBpIDwgZWNiQXJyYXkubGVuZ3RoOyBpKyspDQoJew0KCQl2YXIgZWNCbG9jayA9IGVjYkFycmF5W2ldOw0KCQl0b3RhbCArPSBlY0Jsb2NrLkNvdW50ICogKGVjQmxvY2suRGF0YUNvZGV3b3JkcyArIGVjQ29kZXdvcmRzKTsNCgl9DQoJdGhpcy50b3RhbENvZGV3b3JkcyA9IHRvdGFsOw0KCQ0KCXRoaXMuX19kZWZpbmVHZXR0ZXJfXygiVmVyc2lvbk51bWJlciIsIGZ1bmN0aW9uKCkNCgl7DQoJCXJldHVybiAgdGhpcy52ZXJzaW9uTnVtYmVyOw0KCX0pOw0KCQ0KCXRoaXMuX19kZWZpbmVHZXR0ZXJfXygiQWxpZ25tZW50UGF0dGVybkNlbnRlcnMiLCBmdW5jdGlvbigpDQoJew0KCQlyZXR1cm4gIHRoaXMuYWxpZ25tZW50UGF0dGVybkNlbnRlcnM7DQoJfSk7DQoJdGhpcy5fX2RlZmluZUdldHRlcl9fKCJUb3RhbENvZGV3b3JkcyIsIGZ1bmN0aW9uKCkNCgl7DQoJCXJldHVybiAgdGhpcy50b3RhbENvZGV3b3JkczsNCgl9KTsNCgl0aGlzLl9fZGVmaW5lR2V0dGVyX18oIkRpbWVuc2lvbkZvclZlcnNpb24iLCBmdW5jdGlvbigpDQoJew0KCQlyZXR1cm4gIDE3ICsgNCAqIHRoaXMudmVyc2lvbk51bWJlcjsNCgl9KTsNCgkNCgl0aGlzLmJ1aWxkRnVuY3Rpb25QYXR0ZXJuPWZ1bmN0aW9uKCkNCgkJew0KCQkJdmFyIGRpbWVuc2lvbiA9IHRoaXMuRGltZW5zaW9uRm9yVmVyc2lvbjsNCgkJCXZhciBiaXRNYXRyaXggPSBuZXcgQml0TWF0cml4KGRpbWVuc2lvbik7DQoJCQkNCgkJCS8vIFRvcCBsZWZ0IGZpbmRlciBwYXR0ZXJuICsgc2VwYXJhdG9yICsgZm9ybWF0DQoJCQliaXRNYXRyaXguc2V0UmVnaW9uKDAsIDAsIDksIDkpOw0KCQkJLy8gVG9wIHJpZ2h0IGZpbmRlciBwYXR0ZXJuICsgc2VwYXJhdG9yICsgZm9ybWF0DQoJCQliaXRNYXRyaXguc2V0UmVnaW9uKGRpbWVuc2lvbiAtIDgsIDAsIDgsIDkpOw0KCQkJLy8gQm90dG9tIGxlZnQgZmluZGVyIHBhdHRlcm4gKyBzZXBhcmF0b3IgKyBmb3JtYXQNCgkJCWJpdE1hdHJpeC5zZXRSZWdpb24oMCwgZGltZW5zaW9uIC0gOCwgOSwgOCk7DQoJCQkNCgkJCS8vIEFsaWdubWVudCBwYXR0ZXJucw0KCQkJdmFyIG1heCA9IHRoaXMuYWxpZ25tZW50UGF0dGVybkNlbnRlcnMubGVuZ3RoOw0KCQkJZm9yICh2YXIgeCA9IDA7IHggPCBtYXg7IHgrKykNCgkJCXsNCgkJCQl2YXIgaSA9IHRoaXMuYWxpZ25tZW50UGF0dGVybkNlbnRlcnNbeF0gLSAyOw0KCQkJCWZvciAodmFyIHkgPSAwOyB5IDwgbWF4OyB5KyspDQoJCQkJew0KCQkJCQlpZiAoKHggPT0gMCAmJiAoeSA9PSAwIHx8IHkgPT0gbWF4IC0gMSkpIHx8ICh4ID09IG1heCAtIDEgJiYgeSA9PSAwKSkNCgkJCQkJew0KCQkJCQkJLy8gTm8gYWxpZ25tZW50IHBhdHRlcm5zIG5lYXIgdGhlIHRocmVlIGZpbmRlciBwYXRlcm5zDQoJCQkJCQljb250aW51ZTsNCgkJCQkJfQ0KCQkJCQliaXRNYXRyaXguc2V0UmVnaW9uKHRoaXMuYWxpZ25tZW50UGF0dGVybkNlbnRlcnNbeV0gLSAyLCBpLCA1LCA1KTsNCgkJCQl9DQoJCQl9DQoJCQkNCgkJCS8vIFZlcnRpY2FsIHRpbWluZyBwYXR0ZXJuDQoJCQliaXRNYXRyaXguc2V0UmVnaW9uKDYsIDksIDEsIGRpbWVuc2lvbiAtIDE3KTsNCgkJCS8vIEhvcml6b250YWwgdGltaW5nIHBhdHRlcm4NCgkJCWJpdE1hdHJpeC5zZXRSZWdpb24oOSwgNiwgZGltZW5zaW9uIC0gMTcsIDEpOw0KCQkJDQoJCQlpZiAodGhpcy52ZXJzaW9uTnVtYmVyID4gNikNCgkJCXsNCgkJCQkvLyBWZXJzaW9uIGluZm8sIHRvcCByaWdodA0KCQkJCWJpdE1hdHJpeC5zZXRSZWdpb24oZGltZW5zaW9uIC0gMTEsIDAsIDMsIDYpOw0KCQkJCS8vIFZlcnNpb24gaW5mbywgYm90dG9tIGxlZnQNCgkJCQliaXRNYXRyaXguc2V0UmVnaW9uKDAsIGRpbWVuc2lvbiAtIDExLCA2LCAzKTsNCgkJCX0NCgkJCQ0KCQkJcmV0dXJuIGJpdE1hdHJpeDsNCgkJfQ0KCXRoaXMuZ2V0RUNCbG9ja3NGb3JMZXZlbD1mdW5jdGlvbiggZWNMZXZlbCkNCgl7DQoJCXJldHVybiB0aGlzLmVjQmxvY2tzW2VjTGV2ZWwub3JkaW5hbCgpXTsNCgl9DQp9DQoNClZlcnNpb24uVkVSU0lPTl9ERUNPREVfSU5GTyA9IG5ldyBBcnJheSgweDA3Qzk0LCAweDA4NUJDLCAweDA5QTk5LCAweDBBNEQzLCAweDBCQkY2LCAweDBDNzYyLCAweDBEODQ3LCAweDBFNjBELCAweDBGOTI4LCAweDEwQjc4LCAweDExNDVELCAweDEyQTE3LCAweDEzNTMyLCAweDE0OUE2LCAweDE1NjgzLCAweDE2OEM5LCAweDE3N0VDLCAweDE4RUM0LCAweDE5MUUxLCAweDFBRkFCLCAweDFCMDhFLCAweDFDQzFBLCAweDFEMzNGLCAweDFFRDc1LCAweDFGMjUwLCAweDIwOUQ1LCAweDIxNkYwLCAweDIyOEJBLCAweDIzNzlGLCAweDI0QjBCLCAweDI1NDJFLCAweDI2QTY0LCAweDI3NTQxLCAweDI4QzY5KTsNCg0KVmVyc2lvbi5WRVJTSU9OUyA9IGJ1aWxkVmVyc2lvbnMoKTsNCg0KVmVyc2lvbi5nZXRWZXJzaW9uRm9yTnVtYmVyPWZ1bmN0aW9uKCB2ZXJzaW9uTnVtYmVyKQ0Kew0KCWlmICh2ZXJzaW9uTnVtYmVyIDwgMSB8fCB2ZXJzaW9uTnVtYmVyID4gNDApDQoJew0KCQl0aHJvdyAiQXJndW1lbnRFeGNlcHRpb24iOw0KCX0NCglyZXR1cm4gVmVyc2lvbi5WRVJTSU9OU1t2ZXJzaW9uTnVtYmVyIC0gMV07DQp9DQoNClZlcnNpb24uZ2V0UHJvdmlzaW9uYWxWZXJzaW9uRm9yRGltZW5zaW9uPWZ1bmN0aW9uKGRpbWVuc2lvbikNCnsNCglpZiAoZGltZW5zaW9uICUgNCAhPSAxKQ0KCXsNCgkJdGhyb3cgIkVycm9yIGdldFByb3Zpc2lvbmFsVmVyc2lvbkZvckRpbWVuc2lvbiI7DQoJfQ0KCXRyeQ0KCXsNCgkJcmV0dXJuIFZlcnNpb24uZ2V0VmVyc2lvbkZvck51bWJlcigoZGltZW5zaW9uIC0gMTcpID4+IDIpOw0KCX0NCgljYXRjaCAoIGlhZSkNCgl7DQoJCXRocm93ICJFcnJvciBnZXRWZXJzaW9uRm9yTnVtYmVyIjsNCgl9DQp9DQoNClZlcnNpb24uZGVjb2RlVmVyc2lvbkluZm9ybWF0aW9uPWZ1bmN0aW9uKCB2ZXJzaW9uQml0cykNCnsNCgl2YXIgYmVzdERpZmZlcmVuY2UgPSAweGZmZmZmZmZmOw0KCXZhciBiZXN0VmVyc2lvbiA9IDA7DQoJZm9yICh2YXIgaSA9IDA7IGkgPCBWZXJzaW9uLlZFUlNJT05fREVDT0RFX0lORk8ubGVuZ3RoOyBpKyspDQoJew0KCQl2YXIgdGFyZ2V0VmVyc2lvbiA9IFZlcnNpb24uVkVSU0lPTl9ERUNPREVfSU5GT1tpXTsNCgkJLy8gRG8gdGhlIHZlcnNpb24gaW5mbyBiaXRzIG1hdGNoIGV4YWN0bHk/IGRvbmUuDQoJCWlmICh0YXJnZXRWZXJzaW9uID09IHZlcnNpb25CaXRzKQ0KCQl7DQoJCQlyZXR1cm4gdGhpcy5nZXRWZXJzaW9uRm9yTnVtYmVyKGkgKyA3KTsNCgkJfQ0KCQkvLyBPdGhlcndpc2Ugc2VlIGlmIHRoaXMgaXMgdGhlIGNsb3Nlc3QgdG8gYSByZWFsIHZlcnNpb24gaW5mbyBiaXQgc3RyaW5nDQoJCS8vIHdlIGhhdmUgc2VlbiBzbyBmYXINCgkJdmFyIGJpdHNEaWZmZXJlbmNlID0gRm9ybWF0SW5mb3JtYXRpb24ubnVtQml0c0RpZmZlcmluZyh2ZXJzaW9uQml0cywgdGFyZ2V0VmVyc2lvbik7DQoJCWlmIChiaXRzRGlmZmVyZW5jZSA8IGJlc3REaWZmZXJlbmNlKQ0KCQl7DQoJCQliZXN0VmVyc2lvbiA9IGkgKyA3Ow0KCQkJYmVzdERpZmZlcmVuY2UgPSBiaXRzRGlmZmVyZW5jZTsNCgkJfQ0KCX0NCgkvLyBXZSBjYW4gdG9sZXJhdGUgdXAgdG8gMyBiaXRzIG9mIGVycm9yIHNpbmNlIG5vIHR3byB2ZXJzaW9uIGluZm8gY29kZXdvcmRzIHdpbGwNCgkvLyBkaWZmZXIgaW4gbGVzcyB0aGFuIDQgYml0cy4NCglpZiAoYmVzdERpZmZlcmVuY2UgPD0gMykNCgl7DQoJCXJldHVybiB0aGlzLmdldFZlcnNpb25Gb3JOdW1iZXIoYmVzdFZlcnNpb24pOw0KCX0NCgkvLyBJZiB3ZSBkaWRuJ3QgZmluZCBhIGNsb3NlIGVub3VnaCBtYXRjaCwgZmFpbA0KCXJldHVybiBudWxsOw0KfQ0KDQpmdW5jdGlvbiBidWlsZFZlcnNpb25zKCkNCnsNCglyZXR1cm4gbmV3IEFycmF5KG5ldyBWZXJzaW9uKDEsIG5ldyBBcnJheSgpLCBuZXcgRUNCbG9ja3MoNywgbmV3IEVDQigxLCAxOSkpLCBuZXcgRUNCbG9ja3MoMTAsIG5ldyBFQ0IoMSwgMTYpKSwgbmV3IEVDQmxvY2tzKDEzLCBuZXcgRUNCKDEsIDEzKSksIG5ldyBFQ0Jsb2NrcygxNywgbmV3IEVDQigxLCA5KSkpLCANCgluZXcgVmVyc2lvbigyLCBuZXcgQXJyYXkoNiwgMTgpLCBuZXcgRUNCbG9ja3MoMTAsIG5ldyBFQ0IoMSwgMzQpKSwgbmV3IEVDQmxvY2tzKDE2LCBuZXcgRUNCKDEsIDI4KSksIG5ldyBFQ0Jsb2NrcygyMiwgbmV3IEVDQigxLCAyMikpLCBuZXcgRUNCbG9ja3MoMjgsIG5ldyBFQ0IoMSwgMTYpKSksIA0KCW5ldyBWZXJzaW9uKDMsIG5ldyBBcnJheSg2LCAyMiksIG5ldyBFQ0Jsb2NrcygxNSwgbmV3IEVDQigxLCA1NSkpLCBuZXcgRUNCbG9ja3MoMjYsIG5ldyBFQ0IoMSwgNDQpKSwgbmV3IEVDQmxvY2tzKDE4LCBuZXcgRUNCKDIsIDE3KSksIG5ldyBFQ0Jsb2NrcygyMiwgbmV3IEVDQigyLCAxMykpKSwgDQoJbmV3IFZlcnNpb24oNCwgbmV3IEFycmF5KDYsIDI2KSwgbmV3IEVDQmxvY2tzKDIwLCBuZXcgRUNCKDEsIDgwKSksIG5ldyBFQ0Jsb2NrcygxOCwgbmV3IEVDQigyLCAzMikpLCBuZXcgRUNCbG9ja3MoMjYsIG5ldyBFQ0IoMiwgMjQpKSwgbmV3IEVDQmxvY2tzKDE2LCBuZXcgRUNCKDQsIDkpKSksIA0KCW5ldyBWZXJzaW9uKDUsIG5ldyBBcnJheSg2LCAzMCksIG5ldyBFQ0Jsb2NrcygyNiwgbmV3IEVDQigxLCAxMDgpKSwgbmV3IEVDQmxvY2tzKDI0LCBuZXcgRUNCKDIsIDQzKSksIG5ldyBFQ0Jsb2NrcygxOCwgbmV3IEVDQigyLCAxNSksIG5ldyBFQ0IoMiwgMTYpKSwgbmV3IEVDQmxvY2tzKDIyLCBuZXcgRUNCKDIsIDExKSwgbmV3IEVDQigyLCAxMikpKSwgDQoJbmV3IFZlcnNpb24oNiwgbmV3IEFycmF5KDYsIDM0KSwgbmV3IEVDQmxvY2tzKDE4LCBuZXcgRUNCKDIsIDY4KSksIG5ldyBFQ0Jsb2NrcygxNiwgbmV3IEVDQig0LCAyNykpLCBuZXcgRUNCbG9ja3MoMjQsIG5ldyBFQ0IoNCwgMTkpKSwgbmV3IEVDQmxvY2tzKDI4LCBuZXcgRUNCKDQsIDE1KSkpLCANCgluZXcgVmVyc2lvbig3LCBuZXcgQXJyYXkoNiwgMjIsIDM4KSwgbmV3IEVDQmxvY2tzKDIwLCBuZXcgRUNCKDIsIDc4KSksIG5ldyBFQ0Jsb2NrcygxOCwgbmV3IEVDQig0LCAzMSkpLCBuZXcgRUNCbG9ja3MoMTgsIG5ldyBFQ0IoMiwgMTQpLCBuZXcgRUNCKDQsIDE1KSksIG5ldyBFQ0Jsb2NrcygyNiwgbmV3IEVDQig0LCAxMyksIG5ldyBFQ0IoMSwgMTQpKSksIA0KCW5ldyBWZXJzaW9uKDgsIG5ldyBBcnJheSg2LCAyNCwgNDIpLCBuZXcgRUNCbG9ja3MoMjQsIG5ldyBFQ0IoMiwgOTcpKSwgbmV3IEVDQmxvY2tzKDIyLCBuZXcgRUNCKDIsIDM4KSwgbmV3IEVDQigyLCAzOSkpLCBuZXcgRUNCbG9ja3MoMjIsIG5ldyBFQ0IoNCwgMTgpLCBuZXcgRUNCKDIsIDE5KSksIG5ldyBFQ0Jsb2NrcygyNiwgbmV3IEVDQig0LCAxNCksIG5ldyBFQ0IoMiwgMTUpKSksIA0KCW5ldyBWZXJzaW9uKDksIG5ldyBBcnJheSg2LCAyNiwgNDYpLCBuZXcgRUNCbG9ja3MoMzAsIG5ldyBFQ0IoMiwgMTE2KSksIG5ldyBFQ0Jsb2NrcygyMiwgbmV3IEVDQigzLCAzNiksIG5ldyBFQ0IoMiwgMzcpKSwgbmV3IEVDQmxvY2tzKDIwLCBuZXcgRUNCKDQsIDE2KSwgbmV3IEVDQig0LCAxNykpLCBuZXcgRUNCbG9ja3MoMjQsIG5ldyBFQ0IoNCwgMTIpLCBuZXcgRUNCKDQsIDEzKSkpLCANCgluZXcgVmVyc2lvbigxMCwgbmV3IEFycmF5KDYsIDI4LCA1MCksIG5ldyBFQ0Jsb2NrcygxOCwgbmV3IEVDQigyLCA2OCksIG5ldyBFQ0IoMiwgNjkpKSwgbmV3IEVDQmxvY2tzKDI2LCBuZXcgRUNCKDQsIDQzKSwgbmV3IEVDQigxLCA0NCkpLCBuZXcgRUNCbG9ja3MoMjQsIG5ldyBFQ0IoNiwgMTkpLCBuZXcgRUNCKDIsIDIwKSksIG5ldyBFQ0Jsb2NrcygyOCwgbmV3IEVDQig2LCAxNSksIG5ldyBFQ0IoMiwgMTYpKSksIA0KCW5ldyBWZXJzaW9uKDExLCBuZXcgQXJyYXkoNiwgMzAsIDU0KSwgbmV3IEVDQmxvY2tzKDIwLCBuZXcgRUNCKDQsIDgxKSksIG5ldyBFQ0Jsb2NrcygzMCwgbmV3IEVDQigxLCA1MCksIG5ldyBFQ0IoNCwgNTEpKSwgbmV3IEVDQmxvY2tzKDI4LCBuZXcgRUNCKDQsIDIyKSwgbmV3IEVDQig0LCAyMykpLCBuZXcgRUNCbG9ja3MoMjQsIG5ldyBFQ0IoMywgMTIpLCBuZXcgRUNCKDgsIDEzKSkpLCANCgluZXcgVmVyc2lvbigxMiwgbmV3IEFycmF5KDYsIDMyLCA1OCksIG5ldyBFQ0Jsb2NrcygyNCwgbmV3IEVDQigyLCA5MiksIG5ldyBFQ0IoMiwgOTMpKSwgbmV3IEVDQmxvY2tzKDIyLCBuZXcgRUNCKDYsIDM2KSwgbmV3IEVDQigyLCAzNykpLCBuZXcgRUNCbG9ja3MoMjYsIG5ldyBFQ0IoNCwgMjApLCBuZXcgRUNCKDYsIDIxKSksIG5ldyBFQ0Jsb2NrcygyOCwgbmV3IEVDQig3LCAxNCksIG5ldyBFQ0IoNCwgMTUpKSksIA0KCW5ldyBWZXJzaW9uKDEzLCBuZXcgQXJyYXkoNiwgMzQsIDYyKSwgbmV3IEVDQmxvY2tzKDI2LCBuZXcgRUNCKDQsIDEwNykpLCBuZXcgRUNCbG9ja3MoMjIsIG5ldyBFQ0IoOCwgMzcpLCBuZXcgRUNCKDEsIDM4KSksIG5ldyBFQ0Jsb2NrcygyNCwgbmV3IEVDQig4LCAyMCksIG5ldyBFQ0IoNCwgMjEpKSwgbmV3IEVDQmxvY2tzKDIyLCBuZXcgRUNCKDEyLCAxMSksIG5ldyBFQ0IoNCwgMTIpKSksIA0KCW5ldyBWZXJzaW9uKDE0LCBuZXcgQXJyYXkoNiwgMjYsIDQ2LCA2NiksIG5ldyBFQ0Jsb2NrcygzMCwgbmV3IEVDQigzLCAxMTUpLCBuZXcgRUNCKDEsIDExNikpLCBuZXcgRUNCbG9ja3MoMjQsIG5ldyBFQ0IoNCwgNDApLCBuZXcgRUNCKDUsIDQxKSksIG5ldyBFQ0Jsb2NrcygyMCwgbmV3IEVDQigxMSwgMTYpLCBuZXcgRUNCKDUsIDE3KSksIG5ldyBFQ0Jsb2NrcygyNCwgbmV3IEVDQigxMSwgMTIpLCBuZXcgRUNCKDUsIDEzKSkpLCANCgluZXcgVmVyc2lvbigxNSwgbmV3IEFycmF5KDYsIDI2LCA0OCwgNzApLCBuZXcgRUNCbG9ja3MoMjIsIG5ldyBFQ0IoNSwgODcpLCBuZXcgRUNCKDEsIDg4KSksIG5ldyBFQ0Jsb2NrcygyNCwgbmV3IEVDQig1LCA0MSksIG5ldyBFQ0IoNSwgNDIpKSwgbmV3IEVDQmxvY2tzKDMwLCBuZXcgRUNCKDUsIDI0KSwgbmV3IEVDQig3LCAyNSkpLCBuZXcgRUNCbG9ja3MoMjQsIG5ldyBFQ0IoMTEsIDEyKSwgbmV3IEVDQig3LCAxMykpKSwgDQoJbmV3IFZlcnNpb24oMTYsIG5ldyBBcnJheSg2LCAyNiwgNTAsIDc0KSwgbmV3IEVDQmxvY2tzKDI0LCBuZXcgRUNCKDUsIDk4KSwgbmV3IEVDQigxLCA5OSkpLCBuZXcgRUNCbG9ja3MoMjgsIG5ldyBFQ0IoNywgNDUpLCBuZXcgRUNCKDMsIDQ2KSksIG5ldyBFQ0Jsb2NrcygyNCwgbmV3IEVDQigxNSwgMTkpLCBuZXcgRUNCKDIsIDIwKSksIG5ldyBFQ0Jsb2NrcygzMCwgbmV3IEVDQigzLCAxNSksIG5ldyBFQ0IoMTMsIDE2KSkpLCANCgluZXcgVmVyc2lvbigxNywgbmV3IEFycmF5KDYsIDMwLCA1NCwgNzgpLCBuZXcgRUNCbG9ja3MoMjgsIG5ldyBFQ0IoMSwgMTA3KSwgbmV3IEVDQig1LCAxMDgpKSwgbmV3IEVDQmxvY2tzKDI4LCBuZXcgRUNCKDEwLCA0NiksIG5ldyBFQ0IoMSwgNDcpKSwgbmV3IEVDQmxvY2tzKDI4LCBuZXcgRUNCKDEsIDIyKSwgbmV3IEVDQigxNSwgMjMpKSwgbmV3IEVDQmxvY2tzKDI4LCBuZXcgRUNCKDIsIDE0KSwgbmV3IEVDQigxNywgMTUpKSksIA0KCW5ldyBWZXJzaW9uKDE4LCBuZXcgQXJyYXkoNiwgMzAsIDU2LCA4MiksIG5ldyBFQ0Jsb2NrcygzMCwgbmV3IEVDQig1LCAxMjApLCBuZXcgRUNCKDEsIDEyMSkpLCBuZXcgRUNCbG9ja3MoMjYsIG5ldyBFQ0IoOSwgNDMpLCBuZXcgRUNCKDQsIDQ0KSksIG5ldyBFQ0Jsb2NrcygyOCwgbmV3IEVDQigxNywgMjIpLCBuZXcgRUNCKDEsIDIzKSksIG5ldyBFQ0Jsb2NrcygyOCwgbmV3IEVDQigyLCAxNCksIG5ldyBFQ0IoMTksIDE1KSkpLCANCgluZXcgVmVyc2lvbigxOSwgbmV3IEFycmF5KDYsIDMwLCA1OCwgODYpLCBuZXcgRUNCbG9ja3MoMjgsIG5ldyBFQ0IoMywgMTEzKSwgbmV3IEVDQig0LCAxMTQpKSwgbmV3IEVDQmxvY2tzKDI2LCBuZXcgRUNCKDMsIDQ0KSwgbmV3IEVDQigxMSwgNDUpKSwgbmV3IEVDQmxvY2tzKDI2LCBuZXcgRUNCKDE3LCAyMSksIG5ldyBFQ0IoNCwgMjIpKSwgbmV3IEVDQmxvY2tzKDI2LCBuZXcgRUNCKDksIDEzKSwgbmV3IEVDQigxNiwgMTQpKSksIA0KCW5ldyBWZXJzaW9uKDIwLCBuZXcgQXJyYXkoNiwgMzQsIDYyLCA5MCksIG5ldyBFQ0Jsb2NrcygyOCwgbmV3IEVDQigzLCAxMDcpLCBuZXcgRUNCKDUsIDEwOCkpLCBuZXcgRUNCbG9ja3MoMjYsIG5ldyBFQ0IoMywgNDEpLCBuZXcgRUNCKDEzLCA0MikpLCBuZXcgRUNCbG9ja3MoMzAsIG5ldyBFQ0IoMTUsIDI0KSwgbmV3IEVDQig1LCAyNSkpLCBuZXcgRUNCbG9ja3MoMjgsIG5ldyBFQ0IoMTUsIDE1KSwgbmV3IEVDQigxMCwgMTYpKSksIA0KCW5ldyBWZXJzaW9uKDIxLCBuZXcgQXJyYXkoNiwgMjgsIDUwLCA3MiwgOTQpLCBuZXcgRUNCbG9ja3MoMjgsIG5ldyBFQ0IoNCwgMTE2KSwgbmV3IEVDQig0LCAxMTcpKSwgbmV3IEVDQmxvY2tzKDI2LCBuZXcgRUNCKDE3LCA0MikpLCBuZXcgRUNCbG9ja3MoMjgsIG5ldyBFQ0IoMTcsIDIyKSwgbmV3IEVDQig2LCAyMykpLCBuZXcgRUNCbG9ja3MoMzAsIG5ldyBFQ0IoMTksIDE2KSwgbmV3IEVDQig2LCAxNykpKSwgDQoJbmV3IFZlcnNpb24oMjIsIG5ldyBBcnJheSg2LCAyNiwgNTAsIDc0LCA5OCksIG5ldyBFQ0Jsb2NrcygyOCwgbmV3IEVDQigyLCAxMTEpLCBuZXcgRUNCKDcsIDExMikpLCBuZXcgRUNCbG9ja3MoMjgsIG5ldyBFQ0IoMTcsIDQ2KSksIG5ldyBFQ0Jsb2NrcygzMCwgbmV3IEVDQig3LCAyNCksIG5ldyBFQ0IoMTYsIDI1KSksIG5ldyBFQ0Jsb2NrcygyNCwgbmV3IEVDQigzNCwgMTMpKSksIA0KCW5ldyBWZXJzaW9uKDIzLCBuZXcgQXJyYXkoNiwgMzAsIDU0LCA3NCwgMTAyKSwgbmV3IEVDQmxvY2tzKDMwLCBuZXcgRUNCKDQsIDEyMSksIG5ldyBFQ0IoNSwgMTIyKSksIG5ldyBFQ0Jsb2NrcygyOCwgbmV3IEVDQig0LCA0NyksIG5ldyBFQ0IoMTQsIDQ4KSksIG5ldyBFQ0Jsb2NrcygzMCwgbmV3IEVDQigxMSwgMjQpLCBuZXcgRUNCKDE0LCAyNSkpLCBuZXcgRUNCbG9ja3MoMzAsIG5ldyBFQ0IoMTYsIDE1KSwgbmV3IEVDQigxNCwgMTYpKSksIA0KCW5ldyBWZXJzaW9uKDI0LCBuZXcgQXJyYXkoNiwgMjgsIDU0LCA4MCwgMTA2KSwgbmV3IEVDQmxvY2tzKDMwLCBuZXcgRUNCKDYsIDExNyksIG5ldyBFQ0IoNCwgMTE4KSksIG5ldyBFQ0Jsb2NrcygyOCwgbmV3IEVDQig2LCA0NSksIG5ldyBFQ0IoMTQsIDQ2KSksIG5ldyBFQ0Jsb2NrcygzMCwgbmV3IEVDQigxMSwgMjQpLCBuZXcgRUNCKDE2LCAyNSkpLCBuZXcgRUNCbG9ja3MoMzAsIG5ldyBFQ0IoMzAsIDE2KSwgbmV3IEVDQigyLCAxNykpKSwgDQoJbmV3IFZlcnNpb24oMjUsIG5ldyBBcnJheSg2LCAzMiwgNTgsIDg0LCAxMTApLCBuZXcgRUNCbG9ja3MoMjYsIG5ldyBFQ0IoOCwgMTA2KSwgbmV3IEVDQig0LCAxMDcpKSwgbmV3IEVDQmxvY2tzKDI4LCBuZXcgRUNCKDgsIDQ3KSwgbmV3IEVDQigxMywgNDgpKSwgbmV3IEVDQmxvY2tzKDMwLCBuZXcgRUNCKDcsIDI0KSwgbmV3IEVDQigyMiwgMjUpKSwgbmV3IEVDQmxvY2tzKDMwLCBuZXcgRUNCKDIyLCAxNSksIG5ldyBFQ0IoMTMsIDE2KSkpLCANCgluZXcgVmVyc2lvbigyNiwgbmV3IEFycmF5KDYsIDMwLCA1OCwgODYsIDExNCksIG5ldyBFQ0Jsb2NrcygyOCwgbmV3IEVDQigxMCwgMTE0KSwgbmV3IEVDQigyLCAxMTUpKSwgbmV3IEVDQmxvY2tzKDI4LCBuZXcgRUNCKDE5LCA0NiksIG5ldyBFQ0IoNCwgNDcpKSwgbmV3IEVDQmxvY2tzKDI4LCBuZXcgRUNCKDI4LCAyMiksIG5ldyBFQ0IoNiwgMjMpKSwgbmV3IEVDQmxvY2tzKDMwLCBuZXcgRUNCKDMzLCAxNiksIG5ldyBFQ0IoNCwgMTcpKSksIA0KCW5ldyBWZXJzaW9uKDI3LCBuZXcgQXJyYXkoNiwgMzQsIDYyLCA5MCwgMTE4KSwgbmV3IEVDQmxvY2tzKDMwLCBuZXcgRUNCKDgsIDEyMiksIG5ldyBFQ0IoNCwgMTIzKSksIG5ldyBFQ0Jsb2NrcygyOCwgbmV3IEVDQigyMiwgNDUpLCBuZXcgRUNCKDMsIDQ2KSksIG5ldyBFQ0Jsb2NrcygzMCwgbmV3IEVDQig4LCAyMyksIG5ldyBFQ0IoMjYsIDI0KSksIG5ldyBFQ0Jsb2NrcygzMCwgbmV3IEVDQigxMiwgMTUpLCAJCW5ldyBFQ0IoMjgsIDE2KSkpLA0KCW5ldyBWZXJzaW9uKDI4LCBuZXcgQXJyYXkoNiwgMjYsIDUwLCA3NCwgOTgsIDEyMiksIG5ldyBFQ0Jsb2NrcygzMCwgbmV3IEVDQigzLCAxMTcpLCBuZXcgRUNCKDEwLCAxMTgpKSwgbmV3IEVDQmxvY2tzKDI4LCBuZXcgRUNCKDMsIDQ1KSwgbmV3IEVDQigyMywgNDYpKSwgbmV3IEVDQmxvY2tzKDMwLCBuZXcgRUNCKDQsIDI0KSwgbmV3IEVDQigzMSwgMjUpKSwgbmV3IEVDQmxvY2tzKDMwLCBuZXcgRUNCKDExLCAxNSksIG5ldyBFQ0IoMzEsIDE2KSkpLCANCgluZXcgVmVyc2lvbigyOSwgbmV3IEFycmF5KDYsIDMwLCA1NCwgNzgsIDEwMiwgMTI2KSwgbmV3IEVDQmxvY2tzKDMwLCBuZXcgRUNCKDcsIDExNiksIG5ldyBFQ0IoNywgMTE3KSksIG5ldyBFQ0Jsb2NrcygyOCwgbmV3IEVDQigyMSwgNDUpLCBuZXcgRUNCKDcsIDQ2KSksIG5ldyBFQ0Jsb2NrcygzMCwgbmV3IEVDQigxLCAyMyksIG5ldyBFQ0IoMzcsIDI0KSksIG5ldyBFQ0Jsb2NrcygzMCwgbmV3IEVDQigxOSwgMTUpLCBuZXcgRUNCKDI2LCAxNikpKSwgDQoJbmV3IFZlcnNpb24oMzAsIG5ldyBBcnJheSg2LCAyNiwgNTIsIDc4LCAxMDQsIDEzMCksIG5ldyBFQ0Jsb2NrcygzMCwgbmV3IEVDQig1LCAxMTUpLCBuZXcgRUNCKDEwLCAxMTYpKSwgbmV3IEVDQmxvY2tzKDI4LCBuZXcgRUNCKDE5LCA0NyksIG5ldyBFQ0IoMTAsIDQ4KSksIG5ldyBFQ0Jsb2NrcygzMCwgbmV3IEVDQigxNSwgMjQpLCBuZXcgRUNCKDI1LCAyNSkpLCBuZXcgRUNCbG9ja3MoMzAsIG5ldyBFQ0IoMjMsIDE1KSwgbmV3IEVDQigyNSwgMTYpKSksIA0KCW5ldyBWZXJzaW9uKDMxLCBuZXcgQXJyYXkoNiwgMzAsIDU2LCA4MiwgMTA4LCAxMzQpLCBuZXcgRUNCbG9ja3MoMzAsIG5ldyBFQ0IoMTMsIDExNSksIG5ldyBFQ0IoMywgMTE2KSksIG5ldyBFQ0Jsb2NrcygyOCwgbmV3IEVDQigyLCA0NiksIG5ldyBFQ0IoMjksIDQ3KSksIG5ldyBFQ0Jsb2NrcygzMCwgbmV3IEVDQig0MiwgMjQpLCBuZXcgRUNCKDEsIDI1KSksIG5ldyBFQ0Jsb2NrcygzMCwgbmV3IEVDQigyMywgMTUpLCBuZXcgRUNCKDI4LCAxNikpKSwgDQoJbmV3IFZlcnNpb24oMzIsIG5ldyBBcnJheSg2LCAzNCwgNjAsIDg2LCAxMTIsIDEzOCksIG5ldyBFQ0Jsb2NrcygzMCwgbmV3IEVDQigxNywgMTE1KSksIG5ldyBFQ0Jsb2NrcygyOCwgbmV3IEVDQigxMCwgNDYpLCBuZXcgRUNCKDIzLCA0NykpLCBuZXcgRUNCbG9ja3MoMzAsIG5ldyBFQ0IoMTAsIDI0KSwgbmV3IEVDQigzNSwgMjUpKSwgbmV3IEVDQmxvY2tzKDMwLCBuZXcgRUNCKDE5LCAxNSksIG5ldyBFQ0IoMzUsIDE2KSkpLCANCgluZXcgVmVyc2lvbigzMywgbmV3IEFycmF5KDYsIDMwLCA1OCwgODYsIDExNCwgMTQyKSwgbmV3IEVDQmxvY2tzKDMwLCBuZXcgRUNCKDE3LCAxMTUpLCBuZXcgRUNCKDEsIDExNikpLCBuZXcgRUNCbG9ja3MoMjgsIG5ldyBFQ0IoMTQsIDQ2KSwgbmV3IEVDQigyMSwgNDcpKSwgbmV3IEVDQmxvY2tzKDMwLCBuZXcgRUNCKDI5LCAyNCksIG5ldyBFQ0IoMTksIDI1KSksIG5ldyBFQ0Jsb2NrcygzMCwgbmV3IEVDQigxMSwgMTUpLCBuZXcgRUNCKDQ2LCAxNikpKSwgDQoJbmV3IFZlcnNpb24oMzQsIG5ldyBBcnJheSg2LCAzNCwgNjIsIDkwLCAxMTgsIDE0NiksIG5ldyBFQ0Jsb2NrcygzMCwgbmV3IEVDQigxMywgMTE1KSwgbmV3IEVDQig2LCAxMTYpKSwgbmV3IEVDQmxvY2tzKDI4LCBuZXcgRUNCKDE0LCA0NiksIG5ldyBFQ0IoMjMsIDQ3KSksIG5ldyBFQ0Jsb2NrcygzMCwgbmV3IEVDQig0NCwgMjQpLCBuZXcgRUNCKDcsIDI1KSksIG5ldyBFQ0Jsb2NrcygzMCwgbmV3IEVDQig1OSwgMTYpLCBuZXcgRUNCKDEsIDE3KSkpLCANCgluZXcgVmVyc2lvbigzNSwgbmV3IEFycmF5KDYsIDMwLCA1NCwgNzgsIDEwMiwgMTI2LCAxNTApLCBuZXcgRUNCbG9ja3MoMzAsIG5ldyBFQ0IoMTIsIDEyMSksIG5ldyBFQ0IoNywgMTIyKSksIG5ldyBFQ0Jsb2NrcygyOCwgbmV3IEVDQigxMiwgNDcpLCBuZXcgRUNCKDI2LCA0OCkpLCBuZXcgRUNCbG9ja3MoMzAsIG5ldyBFQ0IoMzksIDI0KSwgbmV3IEVDQigxNCwgMjUpKSxuZXcgRUNCbG9ja3MoMzAsIG5ldyBFQ0IoMjIsIDE1KSwgbmV3IEVDQig0MSwgMTYpKSksIA0KCW5ldyBWZXJzaW9uKDM2LCBuZXcgQXJyYXkoNiwgMjQsIDUwLCA3NiwgMTAyLCAxMjgsIDE1NCksIG5ldyBFQ0Jsb2NrcygzMCwgbmV3IEVDQig2LCAxMjEpLCBuZXcgRUNCKDE0LCAxMjIpKSwgbmV3IEVDQmxvY2tzKDI4LCBuZXcgRUNCKDYsIDQ3KSwgbmV3IEVDQigzNCwgNDgpKSwgbmV3IEVDQmxvY2tzKDMwLCBuZXcgRUNCKDQ2LCAyNCksIG5ldyBFQ0IoMTAsIDI1KSksIG5ldyBFQ0Jsb2NrcygzMCwgbmV3IEVDQigyLCAxNSksIG5ldyBFQ0IoNjQsIDE2KSkpLCANCgluZXcgVmVyc2lvbigzNywgbmV3IEFycmF5KDYsIDI4LCA1NCwgODAsIDEwNiwgMTMyLCAxNTgpLCBuZXcgRUNCbG9ja3MoMzAsIG5ldyBFQ0IoMTcsIDEyMiksIG5ldyBFQ0IoNCwgMTIzKSksIG5ldyBFQ0Jsb2NrcygyOCwgbmV3IEVDQigyOSwgNDYpLCBuZXcgRUNCKDE0LCA0NykpLCBuZXcgRUNCbG9ja3MoMzAsIG5ldyBFQ0IoNDksIDI0KSwgbmV3IEVDQigxMCwgMjUpKSwgbmV3IEVDQmxvY2tzKDMwLCBuZXcgRUNCKDI0LCAxNSksIG5ldyBFQ0IoNDYsIDE2KSkpLCANCgluZXcgVmVyc2lvbigzOCwgbmV3IEFycmF5KDYsIDMyLCA1OCwgODQsIDExMCwgMTM2LCAxNjIpLCBuZXcgRUNCbG9ja3MoMzAsIG5ldyBFQ0IoNCwgMTIyKSwgbmV3IEVDQigxOCwgMTIzKSksIG5ldyBFQ0Jsb2NrcygyOCwgbmV3IEVDQigxMywgNDYpLCBuZXcgRUNCKDMyLCA0NykpLCBuZXcgRUNCbG9ja3MoMzAsIG5ldyBFQ0IoNDgsIDI0KSwgbmV3IEVDQigxNCwgMjUpKSwgbmV3IEVDQmxvY2tzKDMwLCBuZXcgRUNCKDQyLCAxNSksIG5ldyBFQ0IoMzIsIDE2KSkpLCANCgluZXcgVmVyc2lvbigzOSwgbmV3IEFycmF5KDYsIDI2LCA1NCwgODIsIDExMCwgMTM4LCAxNjYpLCBuZXcgRUNCbG9ja3MoMzAsIG5ldyBFQ0IoMjAsIDExNyksIG5ldyBFQ0IoNCwgMTE4KSksIG5ldyBFQ0Jsb2NrcygyOCwgbmV3IEVDQig0MCwgNDcpLCBuZXcgRUNCKDcsIDQ4KSksIG5ldyBFQ0Jsb2NrcygzMCwgbmV3IEVDQig0MywgMjQpLCBuZXcgRUNCKDIyLCAyNSkpLCBuZXcgRUNCbG9ja3MoMzAsIG5ldyBFQ0IoMTAsIDE1KSwgbmV3IEVDQig2NywgMTYpKSksIA0KCW5ldyBWZXJzaW9uKDQwLCBuZXcgQXJyYXkoNiwgMzAsIDU4LCA4NiwgMTE0LCAxNDIsIDE3MCksIG5ldyBFQ0Jsb2NrcygzMCwgbmV3IEVDQigxOSwgMTE4KSwgbmV3IEVDQig2LCAxMTkpKSwgbmV3IEVDQmxvY2tzKDI4LCBuZXcgRUNCKDE4LCA0NyksIG5ldyBFQ0IoMzEsIDQ4KSksIG5ldyBFQ0Jsb2NrcygzMCwgbmV3IEVDQigzNCwgMjQpLCBuZXcgRUNCKDM0LCAyNSkpLCBuZXcgRUNCbG9ja3MoMzAsIG5ldyBFQ0IoMjAsIDE1KSwgbmV3IEVDQig2MSwgMTYpKSkpOw0KfQ==</uax:ByteString>
		</Value>
	</UAVariable>
	<UAObject NodeId="ns=1;s=SYSTEM" BrowseName="1:SYSTEM">
		<DisplayName Locale="en">SYSTEM</DisplayName>
		<Description Locale="en">SYSTEM</Description>
		<References>
			<Reference ReferenceType="HasComponent" IsForward="false">Objects</Reference>
			<Reference ReferenceType="HasTypeDefinition">FolderType</Reference>
		</References>
		<Extensions>
			<atvise ExportedNodeId="ns=1;s=SYSTEM.LIBRARY.PROJECT.RESOURCES/QRCodeScanner" ExportedBrowseName="1:QRCodeScanner" Upstream="true"/>
		</Extensions>
	</UAObject>
	<UAObject NodeId="ns=1;s=SYSTEM.LIBRARY" BrowseName="1:LIBRARY">
		<DisplayName Locale="en">LIBRARY</DisplayName>
		<Description Locale="en">LIBRARY</Description>
		<References>
			<Reference ReferenceType="HasComponent" IsForward="false">ns=1;s=SYSTEM</Reference>
			<Reference ReferenceType="HasTypeDefinition">FolderType</Reference>
		</References>
		<Extensions>
			<atvise Upstream="true"/>
		</Extensions>
	</UAObject>
	<UAObject NodeId="ns=1;s=SYSTEM.LIBRARY.PROJECT" BrowseName="1:PROJECT">
		<DisplayName Locale="en">PROJECT</DisplayName>
		<Description Locale="en">PROJECT</Description>
		<References>
			<Reference ReferenceType="HasComponent" IsForward="false">ns=1;s=SYSTEM.LIBRARY</Reference>
			<Reference ReferenceType="HasTypeDefinition">FolderType</Reference>
		</References>
		<Extensions>
			<atvise Upstream="true"/>
		</Extensions>
	</UAObject>
	<UAObject NodeId="ns=1;s=SYSTEM.LIBRARY.PROJECT.RESOURCES" BrowseName="1:RESOURCES">
		<DisplayName Locale="en">RESOURCES</DisplayName>
		<Description Locale="en">RESOURCES</Description>
		<References>
			<Reference ReferenceType="HasComponent" IsForward="false">ns=1;s=SYSTEM.LIBRARY.PROJECT</Reference>
			<Reference ReferenceType="HasTypeDefinition">FolderType</Reference>
		</References>
		<Extensions>
			<atvise Upstream="true"/>
		</Extensions>
	</UAObject>
	<UAObject NodeId="ns=1;s=SYSTEM.LIBRARY.PROJECT.RESOURCES/QRCodeScanner" BrowseName="1:QRCodeScanner">
		<DisplayName Locale="en">QRCodeScanner</DisplayName>
		<Description Locale="en">QRCodeScanner</Description>
		<References>
			<Reference ReferenceType="HasComponent" IsForward="false">ns=1;s=SYSTEM.LIBRARY.PROJECT.RESOURCES</Reference>
			<Reference ReferenceType="HasTypeDefinition">FolderType</Reference>
		</References>
	</UAObject>
	<UAVariable NodeId="ns=1;s=SYSTEM.LIBRARY.PROJECT.RESOURCES/QRCodeScanner/alignpat.js" BrowseName="1:alignpat.js" DataType="ByteString" AccessLevel="103" UserAccessLevel="103" Historizing="true">
		<DisplayName Locale="en">alignpat.js</DisplayName>
		<Description Locale="en">alignpat.js</Description>
		<References>
			<Reference ReferenceType="HasComponent" IsForward="false">ns=1;s=SYSTEM.LIBRARY.PROJECT.RESOURCES/QRCodeScanner</Reference>
			<Reference ReferenceType="HasTypeDefinition">ns=1;s=VariableTypes.ATVISE.Resource.Javascript</Reference>
			<Reference ReferenceType="HasProperty">ns=1;s=VariableTypes.ATVISE.Resource.Javascript.Compress</Reference>
		</References>
		<Value>
			<uax:ByteString>LyoNCiAgUG9ydGVkIHRvIEphdmFTY3JpcHQgYnkgTGF6YXIgTGFzemxvIDIwMTEgDQogIA0KICBsYXphcnNvZnRAZ21haWwuY29tLCB3d3cubGF6YXJzb2Z0LmluZm8NCiAgDQoqLw0KDQovKg0KKg0KKiBDb3B5cmlnaHQgMjAwNyBaWGluZyBhdXRob3JzDQoqDQoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOw0KKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuDQoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KKg0KKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KKg0KKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KKi8NCg0KDQpmdW5jdGlvbiBBbGlnbm1lbnRQYXR0ZXJuKHBvc1gsIHBvc1ksICBlc3RpbWF0ZWRNb2R1bGVTaXplKQ0Kew0KCXRoaXMueD1wb3NYOw0KCXRoaXMueT1wb3NZOw0KCXRoaXMuY291bnQgPSAxOw0KCXRoaXMuZXN0aW1hdGVkTW9kdWxlU2l6ZSA9IGVzdGltYXRlZE1vZHVsZVNpemU7DQoJDQoJdGhpcy5fX2RlZmluZUdldHRlcl9fKCJFc3RpbWF0ZWRNb2R1bGVTaXplIiwgZnVuY3Rpb24oKQ0KCXsNCgkJcmV0dXJuIHRoaXMuZXN0aW1hdGVkTW9kdWxlU2l6ZTsNCgl9KTsgDQoJdGhpcy5fX2RlZmluZUdldHRlcl9fKCJDb3VudCIsIGZ1bmN0aW9uKCkNCgl7DQoJCXJldHVybiB0aGlzLmNvdW50Ow0KCX0pOw0KCXRoaXMuX19kZWZpbmVHZXR0ZXJfXygiWCIsIGZ1bmN0aW9uKCkNCgl7DQoJCXJldHVybiBNYXRoLmZsb29yKHRoaXMueCk7DQoJfSk7DQoJdGhpcy5fX2RlZmluZUdldHRlcl9fKCJZIiwgZnVuY3Rpb24oKQ0KCXsNCgkJcmV0dXJuIE1hdGguZmxvb3IodGhpcy55KTsNCgl9KTsNCgl0aGlzLmluY3JlbWVudENvdW50ID0gZnVuY3Rpb24oKQ0KCXsNCgkJdGhpcy5jb3VudCsrOw0KCX0NCgl0aGlzLmFib3V0RXF1YWxzPWZ1bmN0aW9uKCBtb2R1bGVTaXplLCAgaSwgIGopDQoJCXsNCgkJCWlmIChNYXRoLmFicyhpIC0gdGhpcy55KSA8PSBtb2R1bGVTaXplICYmIE1hdGguYWJzKGogLSB0aGlzLngpIDw9IG1vZHVsZVNpemUpDQoJCQl7DQoJCQkJdmFyIG1vZHVsZVNpemVEaWZmID0gTWF0aC5hYnMobW9kdWxlU2l6ZSAtIHRoaXMuZXN0aW1hdGVkTW9kdWxlU2l6ZSk7DQoJCQkJcmV0dXJuIG1vZHVsZVNpemVEaWZmIDw9IDEuMCB8fCBtb2R1bGVTaXplRGlmZiAvIHRoaXMuZXN0aW1hdGVkTW9kdWxlU2l6ZSA8PSAxLjA7DQoJCQl9DQoJCQlyZXR1cm4gZmFsc2U7DQoJCX0NCgkNCn0NCg0KZnVuY3Rpb24gQWxpZ25tZW50UGF0dGVybkZpbmRlciggaW1hZ2UsICBzdGFydFgsICBzdGFydFksICB3aWR0aCwgIGhlaWdodCwgIG1vZHVsZVNpemUsICByZXN1bHRQb2ludENhbGxiYWNrKQ0Kew0KCXRoaXMuaW1hZ2UgPSBpbWFnZTsNCgl0aGlzLnBvc3NpYmxlQ2VudGVycyA9IG5ldyBBcnJheSgpOw0KCXRoaXMuc3RhcnRYID0gc3RhcnRYOw0KCXRoaXMuc3RhcnRZID0gc3RhcnRZOw0KCXRoaXMud2lkdGggPSB3aWR0aDsNCgl0aGlzLmhlaWdodCA9IGhlaWdodDsNCgl0aGlzLm1vZHVsZVNpemUgPSBtb2R1bGVTaXplOw0KCXRoaXMuY3Jvc3NDaGVja1N0YXRlQ291bnQgPSBuZXcgQXJyYXkoMCwwLDApOw0KCXRoaXMucmVzdWx0UG9pbnRDYWxsYmFjayA9IHJlc3VsdFBvaW50Q2FsbGJhY2s7DQoJDQoJdGhpcy5jZW50ZXJGcm9tRW5kPWZ1bmN0aW9uKHN0YXRlQ291bnQsICBlbmQpDQoJCXsNCgkJCXJldHVybiAgKGVuZCAtIHN0YXRlQ291bnRbMl0pIC0gc3RhdGVDb3VudFsxXSAvIDIuMDsNCgkJfQ0KCXRoaXMuZm91bmRQYXR0ZXJuQ3Jvc3MgPSBmdW5jdGlvbihzdGF0ZUNvdW50KQ0KCQl7DQoJCQl2YXIgbW9kdWxlU2l6ZSA9IHRoaXMubW9kdWxlU2l6ZTsNCgkJCXZhciBtYXhWYXJpYW5jZSA9IG1vZHVsZVNpemUgLyAyLjA7DQoJCQlmb3IgKHZhciBpID0gMDsgaSA8IDM7IGkrKykNCgkJCXsNCgkJCQlpZiAoTWF0aC5hYnMobW9kdWxlU2l6ZSAtIHN0YXRlQ291bnRbaV0pID49IG1heFZhcmlhbmNlKQ0KCQkJCXsNCgkJCQkJcmV0dXJuIGZhbHNlOw0KCQkJCX0NCgkJCX0NCgkJCXJldHVybiB0cnVlOw0KCQl9DQoNCgl0aGlzLmNyb3NzQ2hlY2tWZXJ0aWNhbD1mdW5jdGlvbiggc3RhcnRJLCAgY2VudGVySiwgIG1heENvdW50LCAgb3JpZ2luYWxTdGF0ZUNvdW50VG90YWwpDQoJCXsNCgkJCXZhciBpbWFnZSA9IHRoaXMuaW1hZ2U7DQoJCQkNCgkJCXZhciBtYXhJID0gcXJjb2RlLmhlaWdodDsNCgkJCXZhciBzdGF0ZUNvdW50ID0gdGhpcy5jcm9zc0NoZWNrU3RhdGVDb3VudDsNCgkJCXN0YXRlQ291bnRbMF0gPSAwOw0KCQkJc3RhdGVDb3VudFsxXSA9IDA7DQoJCQlzdGF0ZUNvdW50WzJdID0gMDsNCgkJCQ0KCQkJLy8gU3RhcnQgY291bnRpbmcgdXAgZnJvbSBjZW50ZXINCgkJCXZhciBpID0gc3RhcnRJOw0KCQkJd2hpbGUgKGkgPj0gMCAmJiBpbWFnZVtjZW50ZXJKICsgaSpxcmNvZGUud2lkdGhdICYmIHN0YXRlQ291bnRbMV0gPD0gbWF4Q291bnQpDQoJCQl7DQoJCQkJc3RhdGVDb3VudFsxXSsrOw0KCQkJCWktLTsNCgkJCX0NCgkJCS8vIElmIGFscmVhZHkgdG9vIG1hbnkgbW9kdWxlcyBpbiB0aGlzIHN0YXRlIG9yIHJhbiBvZmYgdGhlIGVkZ2U6DQoJCQlpZiAoaSA8IDAgfHwgc3RhdGVDb3VudFsxXSA+IG1heENvdW50KQ0KCQkJew0KCQkJCXJldHVybiBOYU47DQoJCQl9DQoJCQl3aGlsZSAoaSA+PSAwICYmICFpbWFnZVtjZW50ZXJKICsgaSpxcmNvZGUud2lkdGhdICYmIHN0YXRlQ291bnRbMF0gPD0gbWF4Q291bnQpDQoJCQl7DQoJCQkJc3RhdGVDb3VudFswXSsrOw0KCQkJCWktLTsNCgkJCX0NCgkJCWlmIChzdGF0ZUNvdW50WzBdID4gbWF4Q291bnQpDQoJCQl7DQoJCQkJcmV0dXJuIE5hTjsNCgkJCX0NCgkJCQ0KCQkJLy8gTm93IGFsc28gY291bnQgZG93biBmcm9tIGNlbnRlcg0KCQkJaSA9IHN0YXJ0SSArIDE7DQoJCQl3aGlsZSAoaSA8IG1heEkgJiYgaW1hZ2VbY2VudGVySiArIGkqcXJjb2RlLndpZHRoXSAmJiBzdGF0ZUNvdW50WzFdIDw9IG1heENvdW50KQ0KCQkJew0KCQkJCXN0YXRlQ291bnRbMV0rKzsNCgkJCQlpKys7DQoJCQl9DQoJCQlpZiAoaSA9PSBtYXhJIHx8IHN0YXRlQ291bnRbMV0gPiBtYXhDb3VudCkNCgkJCXsNCgkJCQlyZXR1cm4gTmFOOw0KCQkJfQ0KCQkJd2hpbGUgKGkgPCBtYXhJICYmICFpbWFnZVtjZW50ZXJKICsgaSpxcmNvZGUud2lkdGhdICYmIHN0YXRlQ291bnRbMl0gPD0gbWF4Q291bnQpDQoJCQl7DQoJCQkJc3RhdGVDb3VudFsyXSsrOw0KCQkJCWkrKzsNCgkJCX0NCgkJCWlmIChzdGF0ZUNvdW50WzJdID4gbWF4Q291bnQpDQoJCQl7DQoJCQkJcmV0dXJuIE5hTjsNCgkJCX0NCgkJCQ0KCQkJdmFyIHN0YXRlQ291bnRUb3RhbCA9IHN0YXRlQ291bnRbMF0gKyBzdGF0ZUNvdW50WzFdICsgc3RhdGVDb3VudFsyXTsNCgkJCWlmICg1ICogTWF0aC5hYnMoc3RhdGVDb3VudFRvdGFsIC0gb3JpZ2luYWxTdGF0ZUNvdW50VG90YWwpID49IDIgKiBvcmlnaW5hbFN0YXRlQ291bnRUb3RhbCkNCgkJCXsNCgkJCQlyZXR1cm4gTmFOOw0KCQkJfQ0KCQkJDQoJCQlyZXR1cm4gdGhpcy5mb3VuZFBhdHRlcm5Dcm9zcyhzdGF0ZUNvdW50KT90aGlzLmNlbnRlckZyb21FbmQoc3RhdGVDb3VudCwgaSk6TmFOOw0KCQl9DQoJCQ0KCXRoaXMuaGFuZGxlUG9zc2libGVDZW50ZXI9ZnVuY3Rpb24oIHN0YXRlQ291bnQsICBpLCAgaikNCgkJew0KCQkJdmFyIHN0YXRlQ291bnRUb3RhbCA9IHN0YXRlQ291bnRbMF0gKyBzdGF0ZUNvdW50WzFdICsgc3RhdGVDb3VudFsyXTsNCgkJCXZhciBjZW50ZXJKID0gdGhpcy5jZW50ZXJGcm9tRW5kKHN0YXRlQ291bnQsIGopOw0KCQkJdmFyIGNlbnRlckkgPSB0aGlzLmNyb3NzQ2hlY2tWZXJ0aWNhbChpLCBNYXRoLmZsb29yIChjZW50ZXJKKSwgMiAqIHN0YXRlQ291bnRbMV0sIHN0YXRlQ291bnRUb3RhbCk7DQoJCQlpZiAoIWlzTmFOKGNlbnRlckkpKQ0KCQkJew0KCQkJCXZhciBlc3RpbWF0ZWRNb2R1bGVTaXplID0gKHN0YXRlQ291bnRbMF0gKyBzdGF0ZUNvdW50WzFdICsgc3RhdGVDb3VudFsyXSkgLyAzLjA7DQoJCQkJdmFyIG1heCA9IHRoaXMucG9zc2libGVDZW50ZXJzLmxlbmd0aDsNCgkJCQlmb3IgKHZhciBpbmRleCA9IDA7IGluZGV4IDwgbWF4OyBpbmRleCsrKQ0KCQkJCXsNCgkJCQkJdmFyIGNlbnRlciA9ICB0aGlzLnBvc3NpYmxlQ2VudGVyc1tpbmRleF07DQoJCQkJCS8vIExvb2sgZm9yIGFib3V0IHRoZSBzYW1lIGNlbnRlciBhbmQgbW9kdWxlIHNpemU6DQoJCQkJCWlmIChjZW50ZXIuYWJvdXRFcXVhbHMoZXN0aW1hdGVkTW9kdWxlU2l6ZSwgY2VudGVySSwgY2VudGVySikpDQoJCQkJCXsNCgkJCQkJCXJldHVybiBuZXcgQWxpZ25tZW50UGF0dGVybihjZW50ZXJKLCBjZW50ZXJJLCBlc3RpbWF0ZWRNb2R1bGVTaXplKTsNCgkJCQkJfQ0KCQkJCX0NCgkJCQkvLyBIYWRuJ3QgZm91bmQgdGhpcyBiZWZvcmU7IHNhdmUgaXQNCgkJCQl2YXIgcG9pbnQgPSBuZXcgQWxpZ25tZW50UGF0dGVybihjZW50ZXJKLCBjZW50ZXJJLCBlc3RpbWF0ZWRNb2R1bGVTaXplKTsNCgkJCQl0aGlzLnBvc3NpYmxlQ2VudGVycy5wdXNoKHBvaW50KTsNCgkJCQlpZiAodGhpcy5yZXN1bHRQb2ludENhbGxiYWNrICE9IG51bGwpDQoJCQkJew0KCQkJCQl0aGlzLnJlc3VsdFBvaW50Q2FsbGJhY2suZm91bmRQb3NzaWJsZVJlc3VsdFBvaW50KHBvaW50KTsNCgkJCQl9DQoJCQl9DQoJCQlyZXR1cm4gbnVsbDsNCgkJfQ0KCQkNCgl0aGlzLmZpbmQgPSBmdW5jdGlvbigpDQoJew0KCQkJdmFyIHN0YXJ0WCA9IHRoaXMuc3RhcnRYOw0KCQkJdmFyIGhlaWdodCA9IHRoaXMuaGVpZ2h0Ow0KCQkJdmFyIG1heEogPSBzdGFydFggKyB3aWR0aDsNCgkJCXZhciBtaWRkbGVJID0gc3RhcnRZICsgKGhlaWdodCA+PiAxKTsNCgkJCS8vIFdlIGFyZSBsb29raW5nIGZvciBibGFjay93aGl0ZS9ibGFjayBtb2R1bGVzIGluIDE6MToxIHJhdGlvOw0KCQkJLy8gdGhpcyB0cmFja3MgdGhlIG51bWJlciBvZiBibGFjay93aGl0ZS9ibGFjayBtb2R1bGVzIHNlZW4gc28gZmFyDQoJCQl2YXIgc3RhdGVDb3VudCA9IG5ldyBBcnJheSgwLDAsMCk7DQoJCQlmb3IgKHZhciBpR2VuID0gMDsgaUdlbiA8IGhlaWdodDsgaUdlbisrKQ0KCQkJew0KCQkJCS8vIFNlYXJjaCBmcm9tIG1pZGRsZSBvdXR3YXJkcw0KCQkJCXZhciBpID0gbWlkZGxlSSArICgoaUdlbiAmIDB4MDEpID09IDA/KChpR2VuICsgMSkgPj4gMSk6LSAoKGlHZW4gKyAxKSA+PiAxKSk7DQoJCQkJc3RhdGVDb3VudFswXSA9IDA7DQoJCQkJc3RhdGVDb3VudFsxXSA9IDA7DQoJCQkJc3RhdGVDb3VudFsyXSA9IDA7DQoJCQkJdmFyIGogPSBzdGFydFg7DQoJCQkJLy8gQnVybiBvZmYgbGVhZGluZyB3aGl0ZSBwaXhlbHMgYmVmb3JlIGFueXRoaW5nIGVsc2U7IGlmIHdlIHN0YXJ0IGluIHRoZSBtaWRkbGUgb2YNCgkJCQkvLyBhIHdoaXRlIHJ1biwgaXQgZG9lc24ndCBtYWtlIHNlbnNlIHRvIGNvdW50IGl0cyBsZW5ndGgsIHNpbmNlIHdlIGRvbid0IGtub3cgaWYgdGhlDQoJCQkJLy8gd2hpdGUgcnVuIGNvbnRpbnVlZCB0byB0aGUgbGVmdCBvZiB0aGUgc3RhcnQgcG9pbnQNCgkJCQl3aGlsZSAoaiA8IG1heEogJiYgIWltYWdlW2ogKyBxcmNvZGUud2lkdGgqIGldKQ0KCQkJCXsNCgkJCQkJaisrOw0KCQkJCX0NCgkJCQl2YXIgY3VycmVudFN0YXRlID0gMDsNCgkJCQl3aGlsZSAoaiA8IG1heEopDQoJCQkJew0KCQkJCQlpZiAoaW1hZ2VbaiArIGkqcXJjb2RlLndpZHRoXSkNCgkJCQkJew0KCQkJCQkJLy8gQmxhY2sgcGl4ZWwNCgkJCQkJCWlmIChjdXJyZW50U3RhdGUgPT0gMSkNCgkJCQkJCXsNCgkJCQkJCQkvLyBDb3VudGluZyBibGFjayBwaXhlbHMNCgkJCQkJCQlzdGF0ZUNvdW50W2N1cnJlbnRTdGF0ZV0rKzsNCgkJCQkJCX0NCgkJCQkJCWVsc2UNCgkJCQkJCXsNCgkJCQkJCQkvLyBDb3VudGluZyB3aGl0ZSBwaXhlbHMNCgkJCQkJCQlpZiAoY3VycmVudFN0YXRlID09IDIpDQoJCQkJCQkJew0KCQkJCQkJCQkvLyBBIHdpbm5lcj8NCgkJCQkJCQkJaWYgKHRoaXMuZm91bmRQYXR0ZXJuQ3Jvc3Moc3RhdGVDb3VudCkpDQoJCQkJCQkJCXsNCgkJCQkJCQkJCS8vIFllcw0KCQkJCQkJCQkJdmFyIGNvbmZpcm1lZCA9IHRoaXMuaGFuZGxlUG9zc2libGVDZW50ZXIoc3RhdGVDb3VudCwgaSwgaik7DQoJCQkJCQkJCQlpZiAoY29uZmlybWVkICE9IG51bGwpDQoJCQkJCQkJCQl7DQoJCQkJCQkJCQkJcmV0dXJuIGNvbmZpcm1lZDsNCgkJCQkJCQkJCX0NCgkJCQkJCQkJfQ0KCQkJCQkJCQlzdGF0ZUNvdW50WzBdID0gc3RhdGVDb3VudFsyXTsNCgkJCQkJCQkJc3RhdGVDb3VudFsxXSA9IDE7DQoJCQkJCQkJCXN0YXRlQ291bnRbMl0gPSAwOw0KCQkJCQkJCQljdXJyZW50U3RhdGUgPSAxOw0KCQkJCQkJCX0NCgkJCQkJCQllbHNlDQoJCQkJCQkJew0KCQkJCQkJCQlzdGF0ZUNvdW50WysrY3VycmVudFN0YXRlXSsrOw0KCQkJCQkJCX0NCgkJCQkJCX0NCgkJCQkJfQ0KCQkJCQllbHNlDQoJCQkJCXsNCgkJCQkJCS8vIFdoaXRlIHBpeGVsDQoJCQkJCQlpZiAoY3VycmVudFN0YXRlID09IDEpDQoJCQkJCQl7DQoJCQkJCQkJLy8gQ291bnRpbmcgYmxhY2sgcGl4ZWxzDQoJCQkJCQkJY3VycmVudFN0YXRlKys7DQoJCQkJCQl9DQoJCQkJCQlzdGF0ZUNvdW50W2N1cnJlbnRTdGF0ZV0rKzsNCgkJCQkJfQ0KCQkJCQlqKys7DQoJCQkJfQ0KCQkJCWlmICh0aGlzLmZvdW5kUGF0dGVybkNyb3NzKHN0YXRlQ291bnQpKQ0KCQkJCXsNCgkJCQkJdmFyIGNvbmZpcm1lZCA9IHRoaXMuaGFuZGxlUG9zc2libGVDZW50ZXIoc3RhdGVDb3VudCwgaSwgbWF4Sik7DQoJCQkJCWlmIChjb25maXJtZWQgIT0gbnVsbCkNCgkJCQkJew0KCQkJCQkJcmV0dXJuIGNvbmZpcm1lZDsNCgkJCQkJfQ0KCQkJCX0NCgkJCX0NCgkJCQ0KCQkJLy8gSG1tLCBub3RoaW5nIHdlIHNhdyB3YXMgb2JzZXJ2ZWQgYW5kIGNvbmZpcm1lZCB0d2ljZS4gSWYgd2UgaGFkDQoJCQkvLyBhbnkgZ3Vlc3MgYXQgYWxsLCByZXR1cm4gaXQuDQoJCQlpZiAoISh0aGlzLnBvc3NpYmxlQ2VudGVycy5sZW5ndGggPT0gMCkpDQoJCQl7DQoJCQkJcmV0dXJuICB0aGlzLnBvc3NpYmxlQ2VudGVyc1swXTsNCgkJCX0NCgkJCQ0KCQkJdGhyb3cgIkNvdWxkbid0IGZpbmQgZW5vdWdoIGFsaWdubWVudCBwYXR0ZXJucyI7DQoJCX0NCgkNCn0=</uax:ByteString>
		</Value>
	</UAVariable>
	<UAVariable NodeId="ns=1;s=SYSTEM.LIBRARY.PROJECT.RESOURCES/QRCodeScanner/bitmat.js" BrowseName="1:bitmat.js" DataType="ByteString" AccessLevel="103" UserAccessLevel="103" Historizing="true">
		<DisplayName Locale="en">bitmat.js</DisplayName>
		<Description Locale="en">bitmat.js</Description>
		<References>
			<Reference ReferenceType="HasComponent" IsForward="false">ns=1;s=SYSTEM.LIBRARY.PROJECT.RESOURCES/QRCodeScanner</Reference>
			<Reference ReferenceType="HasTypeDefinition">ns=1;s=VariableTypes.ATVISE.Resource.Javascript</Reference>
			<Reference ReferenceType="HasProperty">ns=1;s=VariableTypes.ATVISE.Resource.Javascript.Compress</Reference>
		</References>
		<Value>
			<uax:ByteString>LyoNCiAgUG9ydGVkIHRvIEphdmFTY3JpcHQgYnkgTGF6YXIgTGFzemxvIDIwMTEgDQogIA0KICBsYXphcnNvZnRAZ21haWwuY29tLCB3d3cubGF6YXJzb2Z0LmluZm8NCiAgDQoqLw0KDQovKg0KKg0KKiBDb3B5cmlnaHQgMjAwNyBaWGluZyBhdXRob3JzDQoqDQoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOw0KKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuDQoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KKg0KKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KKg0KKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KKi8NCg0KDQpmdW5jdGlvbiBCaXRNYXRyaXgoIHdpZHRoLCAgaGVpZ2h0KQ0Kew0KCWlmKCFoZWlnaHQpDQoJCWhlaWdodD13aWR0aDsNCglpZiAod2lkdGggPCAxIHx8IGhlaWdodCA8IDEpDQoJew0KCQl0aHJvdyAiQm90aCBkaW1lbnNpb25zIG11c3QgYmUgZ3JlYXRlciB0aGFuIDAiOw0KCX0NCgl0aGlzLndpZHRoID0gd2lkdGg7DQoJdGhpcy5oZWlnaHQgPSBoZWlnaHQ7DQoJdmFyIHJvd1NpemUgPSB3aWR0aCA+PiA1Ow0KCWlmICgod2lkdGggJiAweDFmKSAhPSAwKQ0KCXsNCgkJcm93U2l6ZSsrOw0KCX0NCgl0aGlzLnJvd1NpemUgPSByb3dTaXplOw0KCXRoaXMuYml0cyA9IG5ldyBBcnJheShyb3dTaXplICogaGVpZ2h0KTsNCglmb3IodmFyIGk9MDtpPHRoaXMuYml0cy5sZW5ndGg7aSsrKQ0KCQl0aGlzLmJpdHNbaV09MDsNCgkNCgl0aGlzLl9fZGVmaW5lR2V0dGVyX18oIldpZHRoIiwgZnVuY3Rpb24oKQ0KCXsNCgkJcmV0dXJuIHRoaXMud2lkdGg7DQoJfSk7DQoJdGhpcy5fX2RlZmluZUdldHRlcl9fKCJIZWlnaHQiLCBmdW5jdGlvbigpDQoJew0KCQlyZXR1cm4gdGhpcy5oZWlnaHQ7DQoJfSk7DQoJdGhpcy5fX2RlZmluZUdldHRlcl9fKCJEaW1lbnNpb24iLCBmdW5jdGlvbigpDQoJew0KCQlpZiAodGhpcy53aWR0aCAhPSB0aGlzLmhlaWdodCkNCgkJew0KCQkJdGhyb3cgIkNhbid0IGNhbGwgZ2V0RGltZW5zaW9uKCkgb24gYSBub24tc3F1YXJlIG1hdHJpeCI7DQoJCX0NCgkJcmV0dXJuIHRoaXMud2lkdGg7DQoJfSk7DQoJDQoJdGhpcy5nZXRfUmVuYW1lZD1mdW5jdGlvbiggeCwgIHkpDQoJCXsNCgkJCXZhciBvZmZzZXQgPSB5ICogdGhpcy5yb3dTaXplICsgKHggPj4gNSk7DQoJCQlyZXR1cm4gKChVUlNoaWZ0KHRoaXMuYml0c1tvZmZzZXRdLCAoeCAmIDB4MWYpKSkgJiAxKSAhPSAwOw0KCQl9DQoJdGhpcy5zZXRfUmVuYW1lZD1mdW5jdGlvbiggeCwgIHkpDQoJCXsNCgkJCXZhciBvZmZzZXQgPSB5ICogdGhpcy5yb3dTaXplICsgKHggPj4gNSk7DQoJCQl0aGlzLmJpdHNbb2Zmc2V0XSB8PSAxIDw8ICh4ICYgMHgxZik7DQoJCX0NCgl0aGlzLmZsaXA9ZnVuY3Rpb24oIHgsICB5KQ0KCQl7DQoJCQl2YXIgb2Zmc2V0ID0geSAqIHRoaXMucm93U2l6ZSArICh4ID4+IDUpOw0KCQkJdGhpcy5iaXRzW29mZnNldF0gXj0gMSA8PCAoeCAmIDB4MWYpOw0KCQl9DQoJdGhpcy5jbGVhcj1mdW5jdGlvbigpDQoJCXsNCgkJCXZhciBtYXggPSB0aGlzLmJpdHMubGVuZ3RoOw0KCQkJZm9yICh2YXIgaSA9IDA7IGkgPCBtYXg7IGkrKykNCgkJCXsNCgkJCQl0aGlzLmJpdHNbaV0gPSAwOw0KCQkJfQ0KCQl9DQoJdGhpcy5zZXRSZWdpb249ZnVuY3Rpb24oIGxlZnQsICB0b3AsICB3aWR0aCwgIGhlaWdodCkNCgkJew0KCQkJaWYgKHRvcCA8IDAgfHwgbGVmdCA8IDApDQoJCQl7DQoJCQkJdGhyb3cgIkxlZnQgYW5kIHRvcCBtdXN0IGJlIG5vbm5lZ2F0aXZlIjsNCgkJCX0NCgkJCWlmIChoZWlnaHQgPCAxIHx8IHdpZHRoIDwgMSkNCgkJCXsNCgkJCQl0aHJvdyAiSGVpZ2h0IGFuZCB3aWR0aCBtdXN0IGJlIGF0IGxlYXN0IDEiOw0KCQkJfQ0KCQkJdmFyIHJpZ2h0ID0gbGVmdCArIHdpZHRoOw0KCQkJdmFyIGJvdHRvbSA9IHRvcCArIGhlaWdodDsNCgkJCWlmIChib3R0b20gPiB0aGlzLmhlaWdodCB8fCByaWdodCA+IHRoaXMud2lkdGgpDQoJCQl7DQoJCQkJdGhyb3cgIlRoZSByZWdpb24gbXVzdCBmaXQgaW5zaWRlIHRoZSBtYXRyaXgiOw0KCQkJfQ0KCQkJZm9yICh2YXIgeSA9IHRvcDsgeSA8IGJvdHRvbTsgeSsrKQ0KCQkJew0KCQkJCXZhciBvZmZzZXQgPSB5ICogdGhpcy5yb3dTaXplOw0KCQkJCWZvciAodmFyIHggPSBsZWZ0OyB4IDwgcmlnaHQ7IHgrKykNCgkJCQl7DQoJCQkJCXRoaXMuYml0c1tvZmZzZXQgKyAoeCA+PiA1KV0gfD0gMSA8PCAoeCAmIDB4MWYpOw0KCQkJCX0NCgkJCX0NCgkJfQ0KfQ==</uax:ByteString>
		</Value>
	</UAVariable>
	<UAVariable NodeId="ns=1;s=SYSTEM.LIBRARY.PROJECT.RESOURCES/QRCodeScanner/bmparser.js" BrowseName="1:bmparser.js" DataType="ByteString" AccessLevel="103" UserAccessLevel="103" Historizing="true">
		<DisplayName Locale="en">bmparser.js</DisplayName>
		<Description Locale="en">bmparser.js</Description>
		<References>
			<Reference ReferenceType="HasComponent" IsForward="false">ns=1;s=SYSTEM.LIBRARY.PROJECT.RESOURCES/QRCodeScanner</Reference>
			<Reference ReferenceType="HasTypeDefinition">ns=1;s=VariableTypes.ATVISE.Resource.Javascript</Reference>
			<Reference ReferenceType="HasProperty">ns=1;s=VariableTypes.ATVISE.Resource.Javascript.Compress</Reference>
		</References>
		<Value>
			<uax:ByteString>LyoNCiAgUG9ydGVkIHRvIEphdmFTY3JpcHQgYnkgTGF6YXIgTGFzemxvIDIwMTEgDQogIA0KICBsYXphcnNvZnRAZ21haWwuY29tLCB3d3cubGF6YXJzb2Z0LmluZm8NCiAgDQoqLw0KDQovKg0KKg0KKiBDb3B5cmlnaHQgMjAwNyBaWGluZyBhdXRob3JzDQoqDQoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOw0KKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuDQoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KKg0KKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KKg0KKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KKi8NCg0KDQpmdW5jdGlvbiBCaXRNYXRyaXhQYXJzZXIoYml0TWF0cml4KQ0Kew0KCXZhciBkaW1lbnNpb24gPSBiaXRNYXRyaXguRGltZW5zaW9uOw0KCWlmIChkaW1lbnNpb24gPCAyMSB8fCAoZGltZW5zaW9uICYgMHgwMykgIT0gMSkNCgl7DQoJCXRocm93ICJFcnJvciBCaXRNYXRyaXhQYXJzZXIiOw0KCX0NCgl0aGlzLmJpdE1hdHJpeCA9IGJpdE1hdHJpeDsNCgl0aGlzLnBhcnNlZFZlcnNpb24gPSBudWxsOw0KCXRoaXMucGFyc2VkRm9ybWF0SW5mbyA9IG51bGw7DQoJDQoJdGhpcy5jb3B5Qml0PWZ1bmN0aW9uKCBpLCAgaiwgIHZlcnNpb25CaXRzKQ0KCXsNCgkJcmV0dXJuIHRoaXMuYml0TWF0cml4LmdldF9SZW5hbWVkKGksIGopPyh2ZXJzaW9uQml0cyA8PCAxKSB8IDB4MTp2ZXJzaW9uQml0cyA8PCAxOw0KCX0NCgkNCgl0aGlzLnJlYWRGb3JtYXRJbmZvcm1hdGlvbj1mdW5jdGlvbigpDQoJew0KCQkJaWYgKHRoaXMucGFyc2VkRm9ybWF0SW5mbyAhPSBudWxsKQ0KCQkJew0KCQkJCXJldHVybiB0aGlzLnBhcnNlZEZvcm1hdEluZm87DQoJCQl9DQoJCQkNCgkJCS8vIFJlYWQgdG9wLWxlZnQgZm9ybWF0IGluZm8gYml0cw0KCQkJdmFyIGZvcm1hdEluZm9CaXRzID0gMDsNCgkJCWZvciAodmFyIGkgPSAwOyBpIDwgNjsgaSsrKQ0KCQkJew0KCQkJCWZvcm1hdEluZm9CaXRzID0gdGhpcy5jb3B5Qml0KGksIDgsIGZvcm1hdEluZm9CaXRzKTsNCgkJCX0NCgkJCS8vIC4uIGFuZCBza2lwIGEgYml0IGluIHRoZSB0aW1pbmcgcGF0dGVybiAuLi4NCgkJCWZvcm1hdEluZm9CaXRzID0gdGhpcy5jb3B5Qml0KDcsIDgsIGZvcm1hdEluZm9CaXRzKTsNCgkJCWZvcm1hdEluZm9CaXRzID0gdGhpcy5jb3B5Qml0KDgsIDgsIGZvcm1hdEluZm9CaXRzKTsNCgkJCWZvcm1hdEluZm9CaXRzID0gdGhpcy5jb3B5Qml0KDgsIDcsIGZvcm1hdEluZm9CaXRzKTsNCgkJCS8vIC4uIGFuZCBza2lwIGEgYml0IGluIHRoZSB0aW1pbmcgcGF0dGVybiAuLi4NCgkJCWZvciAodmFyIGogPSA1OyBqID49IDA7IGotLSkNCgkJCXsNCgkJCQlmb3JtYXRJbmZvQml0cyA9IHRoaXMuY29weUJpdCg4LCBqLCBmb3JtYXRJbmZvQml0cyk7DQoJCQl9DQoJCQkNCgkJCXRoaXMucGFyc2VkRm9ybWF0SW5mbyA9IEZvcm1hdEluZm9ybWF0aW9uLmRlY29kZUZvcm1hdEluZm9ybWF0aW9uKGZvcm1hdEluZm9CaXRzKTsNCgkJCWlmICh0aGlzLnBhcnNlZEZvcm1hdEluZm8gIT0gbnVsbCkNCgkJCXsNCgkJCQlyZXR1cm4gdGhpcy5wYXJzZWRGb3JtYXRJbmZvOw0KCQkJfQ0KCQkJDQoJCQkvLyBIbW0sIGZhaWxlZC4gVHJ5IHRoZSB0b3AtcmlnaHQvYm90dG9tLWxlZnQgcGF0dGVybg0KCQkJdmFyIGRpbWVuc2lvbiA9IHRoaXMuYml0TWF0cml4LkRpbWVuc2lvbjsNCgkJCWZvcm1hdEluZm9CaXRzID0gMDsNCgkJCXZhciBpTWluID0gZGltZW5zaW9uIC0gODsNCgkJCWZvciAodmFyIGkgPSBkaW1lbnNpb24gLSAxOyBpID49IGlNaW47IGktLSkNCgkJCXsNCgkJCQlmb3JtYXRJbmZvQml0cyA9IHRoaXMuY29weUJpdChpLCA4LCBmb3JtYXRJbmZvQml0cyk7DQoJCQl9DQoJCQlmb3IgKHZhciBqID0gZGltZW5zaW9uIC0gNzsgaiA8IGRpbWVuc2lvbjsgaisrKQ0KCQkJew0KCQkJCWZvcm1hdEluZm9CaXRzID0gdGhpcy5jb3B5Qml0KDgsIGosIGZvcm1hdEluZm9CaXRzKTsNCgkJCX0NCgkJCQ0KCQkJdGhpcy5wYXJzZWRGb3JtYXRJbmZvID0gRm9ybWF0SW5mb3JtYXRpb24uZGVjb2RlRm9ybWF0SW5mb3JtYXRpb24oZm9ybWF0SW5mb0JpdHMpOw0KCQkJaWYgKHRoaXMucGFyc2VkRm9ybWF0SW5mbyAhPSBudWxsKQ0KCQkJew0KCQkJCXJldHVybiB0aGlzLnBhcnNlZEZvcm1hdEluZm87DQoJCQl9DQoJCQl0aHJvdyAiRXJyb3IgcmVhZEZvcm1hdEluZm9ybWF0aW9uIjsJDQoJfQ0KCXRoaXMucmVhZFZlcnNpb249ZnVuY3Rpb24oKQ0KCQl7DQoJCQkNCgkJCWlmICh0aGlzLnBhcnNlZFZlcnNpb24gIT0gbnVsbCkNCgkJCXsNCgkJCQlyZXR1cm4gdGhpcy5wYXJzZWRWZXJzaW9uOw0KCQkJfQ0KCQkJDQoJCQl2YXIgZGltZW5zaW9uID0gdGhpcy5iaXRNYXRyaXguRGltZW5zaW9uOw0KCQkJDQoJCQl2YXIgcHJvdmlzaW9uYWxWZXJzaW9uID0gKGRpbWVuc2lvbiAtIDE3KSA+PiAyOw0KCQkJaWYgKHByb3Zpc2lvbmFsVmVyc2lvbiA8PSA2KQ0KCQkJew0KCQkJCXJldHVybiBWZXJzaW9uLmdldFZlcnNpb25Gb3JOdW1iZXIocHJvdmlzaW9uYWxWZXJzaW9uKTsNCgkJCX0NCgkJCQ0KCQkJLy8gUmVhZCB0b3AtcmlnaHQgdmVyc2lvbiBpbmZvOiAzIHdpZGUgYnkgNiB0YWxsDQoJCQl2YXIgdmVyc2lvbkJpdHMgPSAwOw0KCQkJdmFyIGlqTWluID0gZGltZW5zaW9uIC0gMTE7DQoJCQlmb3IgKHZhciBqID0gNTsgaiA+PSAwOyBqLS0pDQoJCQl7DQoJCQkJZm9yICh2YXIgaSA9IGRpbWVuc2lvbiAtIDk7IGkgPj0gaWpNaW47IGktLSkNCgkJCQl7DQoJCQkJCXZlcnNpb25CaXRzID0gdGhpcy5jb3B5Qml0KGksIGosIHZlcnNpb25CaXRzKTsNCgkJCQl9DQoJCQl9DQoJCQkNCgkJCXRoaXMucGFyc2VkVmVyc2lvbiA9IFZlcnNpb24uZGVjb2RlVmVyc2lvbkluZm9ybWF0aW9uKHZlcnNpb25CaXRzKTsNCgkJCWlmICh0aGlzLnBhcnNlZFZlcnNpb24gIT0gbnVsbCAmJiB0aGlzLnBhcnNlZFZlcnNpb24uRGltZW5zaW9uRm9yVmVyc2lvbiA9PSBkaW1lbnNpb24pDQoJCQl7DQoJCQkJcmV0dXJuIHRoaXMucGFyc2VkVmVyc2lvbjsNCgkJCX0NCgkJCQ0KCQkJLy8gSG1tLCBmYWlsZWQuIFRyeSBib3R0b20gbGVmdDogNiB3aWRlIGJ5IDMgdGFsbA0KCQkJdmVyc2lvbkJpdHMgPSAwOw0KCQkJZm9yICh2YXIgaSA9IDU7IGkgPj0gMDsgaS0tKQ0KCQkJew0KCQkJCWZvciAodmFyIGogPSBkaW1lbnNpb24gLSA5OyBqID49IGlqTWluOyBqLS0pDQoJCQkJew0KCQkJCQl2ZXJzaW9uQml0cyA9IHRoaXMuY29weUJpdChpLCBqLCB2ZXJzaW9uQml0cyk7DQoJCQkJfQ0KCQkJfQ0KCQkJDQoJCQl0aGlzLnBhcnNlZFZlcnNpb24gPSBWZXJzaW9uLmRlY29kZVZlcnNpb25JbmZvcm1hdGlvbih2ZXJzaW9uQml0cyk7DQoJCQlpZiAodGhpcy5wYXJzZWRWZXJzaW9uICE9IG51bGwgJiYgdGhpcy5wYXJzZWRWZXJzaW9uLkRpbWVuc2lvbkZvclZlcnNpb24gPT0gZGltZW5zaW9uKQ0KCQkJew0KCQkJCXJldHVybiB0aGlzLnBhcnNlZFZlcnNpb247DQoJCQl9DQoJCQl0aHJvdyAiRXJyb3IgcmVhZFZlcnNpb24iOw0KCQl9DQoJdGhpcy5yZWFkQ29kZXdvcmRzPWZ1bmN0aW9uKCkNCgkJew0KCQkJDQoJCQl2YXIgZm9ybWF0SW5mbyA9IHRoaXMucmVhZEZvcm1hdEluZm9ybWF0aW9uKCk7DQoJCQl2YXIgdmVyc2lvbiA9IHRoaXMucmVhZFZlcnNpb24oKTsNCgkJCQ0KCQkJLy8gR2V0IHRoZSBkYXRhIG1hc2sgZm9yIHRoZSBmb3JtYXQgdXNlZCBpbiB0aGlzIFFSIENvZGUuIFRoaXMgd2lsbCBleGNsdWRlDQoJCQkvLyBzb21lIGJpdHMgZnJvbSByZWFkaW5nIGFzIHdlIHdpbmQgdGhyb3VnaCB0aGUgYml0IG1hdHJpeC4NCgkJCXZhciBkYXRhTWFzayA9IERhdGFNYXNrLmZvclJlZmVyZW5jZSggZm9ybWF0SW5mby5EYXRhTWFzayk7DQoJCQl2YXIgZGltZW5zaW9uID0gdGhpcy5iaXRNYXRyaXguRGltZW5zaW9uOw0KCQkJZGF0YU1hc2sudW5tYXNrQml0TWF0cml4KHRoaXMuYml0TWF0cml4LCBkaW1lbnNpb24pOw0KCQkJDQoJCQl2YXIgZnVuY3Rpb25QYXR0ZXJuID0gdmVyc2lvbi5idWlsZEZ1bmN0aW9uUGF0dGVybigpOw0KCQkJDQoJCQl2YXIgcmVhZGluZ1VwID0gdHJ1ZTsNCgkJCXZhciByZXN1bHQgPSBuZXcgQXJyYXkodmVyc2lvbi5Ub3RhbENvZGV3b3Jkcyk7DQoJCQl2YXIgcmVzdWx0T2Zmc2V0ID0gMDsNCgkJCXZhciBjdXJyZW50Qnl0ZSA9IDA7DQoJCQl2YXIgYml0c1JlYWQgPSAwOw0KCQkJLy8gUmVhZCBjb2x1bW5zIGluIHBhaXJzLCBmcm9tIHJpZ2h0IHRvIGxlZnQNCgkJCWZvciAodmFyIGogPSBkaW1lbnNpb24gLSAxOyBqID4gMDsgaiAtPSAyKQ0KCQkJew0KCQkJCWlmIChqID09IDYpDQoJCQkJew0KCQkJCQkvLyBTa2lwIHdob2xlIGNvbHVtbiB3aXRoIHZlcnRpY2FsIGFsaWdubWVudCBwYXR0ZXJuOw0KCQkJCQkvLyBzYXZlcyB0aW1lIGFuZCBtYWtlcyB0aGUgb3RoZXIgY29kZSBwcm9jZWVkIG1vcmUgY2xlYW5seQ0KCQkJCQlqLS07DQoJCQkJfQ0KCQkJCS8vIFJlYWQgYWx0ZXJuYXRpbmdseSBmcm9tIGJvdHRvbSB0byB0b3AgdGhlbiB0b3AgdG8gYm90dG9tDQoJCQkJZm9yICh2YXIgY291bnQgPSAwOyBjb3VudCA8IGRpbWVuc2lvbjsgY291bnQrKykNCgkJCQl7DQoJCQkJCXZhciBpID0gcmVhZGluZ1VwP2RpbWVuc2lvbiAtIDEgLSBjb3VudDpjb3VudDsNCgkJCQkJZm9yICh2YXIgY29sID0gMDsgY29sIDwgMjsgY29sKyspDQoJCQkJCXsNCgkJCQkJCS8vIElnbm9yZSBiaXRzIGNvdmVyZWQgYnkgdGhlIGZ1bmN0aW9uIHBhdHRlcm4NCgkJCQkJCWlmICghZnVuY3Rpb25QYXR0ZXJuLmdldF9SZW5hbWVkKGogLSBjb2wsIGkpKQ0KCQkJCQkJew0KCQkJCQkJCS8vIFJlYWQgYSBiaXQNCgkJCQkJCQliaXRzUmVhZCsrOw0KCQkJCQkJCWN1cnJlbnRCeXRlIDw8PSAxOw0KCQkJCQkJCWlmICh0aGlzLmJpdE1hdHJpeC5nZXRfUmVuYW1lZChqIC0gY29sLCBpKSkNCgkJCQkJCQl7DQoJCQkJCQkJCWN1cnJlbnRCeXRlIHw9IDE7DQoJCQkJCQkJfQ0KCQkJCQkJCS8vIElmIHdlJ3ZlIG1hZGUgYSB3aG9sZSBieXRlLCBzYXZlIGl0IG9mZg0KCQkJCQkJCWlmIChiaXRzUmVhZCA9PSA4KQ0KCQkJCQkJCXsNCgkJCQkJCQkJcmVzdWx0W3Jlc3VsdE9mZnNldCsrXSA9ICBjdXJyZW50Qnl0ZTsNCgkJCQkJCQkJYml0c1JlYWQgPSAwOw0KCQkJCQkJCQljdXJyZW50Qnl0ZSA9IDA7DQoJCQkJCQkJfQ0KCQkJCQkJfQ0KCQkJCQl9DQoJCQkJfQ0KCQkJCXJlYWRpbmdVcCBePSB0cnVlOyAvLyByZWFkaW5nVXAgPSAhcmVhZGluZ1VwOyAvLyBzd2l0Y2ggZGlyZWN0aW9ucw0KCQkJfQ0KCQkJaWYgKHJlc3VsdE9mZnNldCAhPSB2ZXJzaW9uLlRvdGFsQ29kZXdvcmRzKQ0KCQkJew0KCQkJCXRocm93ICJFcnJvciByZWFkQ29kZXdvcmRzIjsNCgkJCX0NCgkJCXJldHVybiByZXN1bHQ7DQoJCX0NCn0=</uax:ByteString>
		</Value>
	</UAVariable>
	<UAVariable NodeId="ns=1;s=SYSTEM.LIBRARY.PROJECT.RESOURCES/QRCodeScanner/datablock.js" BrowseName="1:datablock.js" DataType="ByteString" AccessLevel="103" UserAccessLevel="103" Historizing="true">
		<DisplayName Locale="en">datablock.js</DisplayName>
		<Description Locale="en">datablock.js</Description>
		<References>
			<Reference ReferenceType="HasComponent" IsForward="false">ns=1;s=SYSTEM.LIBRARY.PROJECT.RESOURCES/QRCodeScanner</Reference>
			<Reference ReferenceType="HasTypeDefinition">ns=1;s=VariableTypes.ATVISE.Resource.Javascript</Reference>
			<Reference ReferenceType="HasProperty">ns=1;s=VariableTypes.ATVISE.Resource.Javascript.Compress</Reference>
		</References>
		<Value>
			<uax:ByteString>LyoNCiAgUG9ydGVkIHRvIEphdmFTY3JpcHQgYnkgTGF6YXIgTGFzemxvIDIwMTEgDQogIA0KICBsYXphcnNvZnRAZ21haWwuY29tLCB3d3cubGF6YXJzb2Z0LmluZm8NCiAgDQoqLw0KDQovKg0KKg0KKiBDb3B5cmlnaHQgMjAwNyBaWGluZyBhdXRob3JzDQoqDQoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOw0KKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuDQoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KKg0KKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KKg0KKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KKi8NCg0KDQpmdW5jdGlvbiBEYXRhQmxvY2sobnVtRGF0YUNvZGV3b3JkcywgIGNvZGV3b3JkcykNCnsNCgl0aGlzLm51bURhdGFDb2Rld29yZHMgPSBudW1EYXRhQ29kZXdvcmRzOw0KCXRoaXMuY29kZXdvcmRzID0gY29kZXdvcmRzOw0KCQ0KCXRoaXMuX19kZWZpbmVHZXR0ZXJfXygiTnVtRGF0YUNvZGV3b3JkcyIsIGZ1bmN0aW9uKCkNCgl7DQoJCXJldHVybiB0aGlzLm51bURhdGFDb2Rld29yZHM7DQoJfSk7DQoJdGhpcy5fX2RlZmluZUdldHRlcl9fKCJDb2Rld29yZHMiLCBmdW5jdGlvbigpDQoJew0KCQlyZXR1cm4gdGhpcy5jb2Rld29yZHM7DQoJfSk7DQp9CQ0KCQ0KRGF0YUJsb2NrLmdldERhdGFCbG9ja3M9ZnVuY3Rpb24ocmF3Q29kZXdvcmRzLCAgdmVyc2lvbiwgIGVjTGV2ZWwpDQp7DQoJDQoJaWYgKHJhd0NvZGV3b3Jkcy5sZW5ndGggIT0gdmVyc2lvbi5Ub3RhbENvZGV3b3JkcykNCgl7DQoJCXRocm93ICJBcmd1bWVudEV4Y2VwdGlvbiI7DQoJfQ0KCQ0KCS8vIEZpZ3VyZSBvdXQgdGhlIG51bWJlciBhbmQgc2l6ZSBvZiBkYXRhIGJsb2NrcyB1c2VkIGJ5IHRoaXMgdmVyc2lvbiBhbmQNCgkvLyBlcnJvciBjb3JyZWN0aW9uIGxldmVsDQoJdmFyIGVjQmxvY2tzID0gdmVyc2lvbi5nZXRFQ0Jsb2Nrc0ZvckxldmVsKGVjTGV2ZWwpOw0KCQ0KCS8vIEZpcnN0IGNvdW50IHRoZSB0b3RhbCBudW1iZXIgb2YgZGF0YSBibG9ja3MNCgl2YXIgdG90YWxCbG9ja3MgPSAwOw0KCXZhciBlY0Jsb2NrQXJyYXkgPSBlY0Jsb2Nrcy5nZXRFQ0Jsb2NrcygpOw0KCWZvciAodmFyIGkgPSAwOyBpIDwgZWNCbG9ja0FycmF5Lmxlbmd0aDsgaSsrKQ0KCXsNCgkJdG90YWxCbG9ja3MgKz0gZWNCbG9ja0FycmF5W2ldLkNvdW50Ow0KCX0NCgkNCgkvLyBOb3cgZXN0YWJsaXNoIERhdGFCbG9ja3Mgb2YgdGhlIGFwcHJvcHJpYXRlIHNpemUgYW5kIG51bWJlciBvZiBkYXRhIGNvZGV3b3Jkcw0KCXZhciByZXN1bHQgPSBuZXcgQXJyYXkodG90YWxCbG9ja3MpOw0KCXZhciBudW1SZXN1bHRCbG9ja3MgPSAwOw0KCWZvciAodmFyIGogPSAwOyBqIDwgZWNCbG9ja0FycmF5Lmxlbmd0aDsgaisrKQ0KCXsNCgkJdmFyIGVjQmxvY2sgPSBlY0Jsb2NrQXJyYXlbal07DQoJCWZvciAodmFyIGkgPSAwOyBpIDwgZWNCbG9jay5Db3VudDsgaSsrKQ0KCQl7DQoJCQl2YXIgbnVtRGF0YUNvZGV3b3JkcyA9IGVjQmxvY2suRGF0YUNvZGV3b3JkczsNCgkJCXZhciBudW1CbG9ja0NvZGV3b3JkcyA9IGVjQmxvY2tzLkVDQ29kZXdvcmRzUGVyQmxvY2sgKyBudW1EYXRhQ29kZXdvcmRzOw0KCQkJcmVzdWx0W251bVJlc3VsdEJsb2NrcysrXSA9IG5ldyBEYXRhQmxvY2sobnVtRGF0YUNvZGV3b3JkcywgbmV3IEFycmF5KG51bUJsb2NrQ29kZXdvcmRzKSk7DQoJCX0NCgl9DQoJDQoJLy8gQWxsIGJsb2NrcyBoYXZlIHRoZSBzYW1lIGFtb3VudCBvZiBkYXRhLCBleGNlcHQgdGhhdCB0aGUgbGFzdCBuDQoJLy8gKHdoZXJlIG4gbWF5IGJlIDApIGhhdmUgMSBtb3JlIGJ5dGUuIEZpZ3VyZSBvdXQgd2hlcmUgdGhlc2Ugc3RhcnQuDQoJdmFyIHNob3J0ZXJCbG9ja3NUb3RhbENvZGV3b3JkcyA9IHJlc3VsdFswXS5jb2Rld29yZHMubGVuZ3RoOw0KCXZhciBsb25nZXJCbG9ja3NTdGFydEF0ID0gcmVzdWx0Lmxlbmd0aCAtIDE7DQoJd2hpbGUgKGxvbmdlckJsb2Nrc1N0YXJ0QXQgPj0gMCkNCgl7DQoJCXZhciBudW1Db2Rld29yZHMgPSByZXN1bHRbbG9uZ2VyQmxvY2tzU3RhcnRBdF0uY29kZXdvcmRzLmxlbmd0aDsNCgkJaWYgKG51bUNvZGV3b3JkcyA9PSBzaG9ydGVyQmxvY2tzVG90YWxDb2Rld29yZHMpDQoJCXsNCgkJCWJyZWFrOw0KCQl9DQoJCWxvbmdlckJsb2Nrc1N0YXJ0QXQtLTsNCgl9DQoJbG9uZ2VyQmxvY2tzU3RhcnRBdCsrOw0KCQ0KCXZhciBzaG9ydGVyQmxvY2tzTnVtRGF0YUNvZGV3b3JkcyA9IHNob3J0ZXJCbG9ja3NUb3RhbENvZGV3b3JkcyAtIGVjQmxvY2tzLkVDQ29kZXdvcmRzUGVyQmxvY2s7DQoJLy8gVGhlIGxhc3QgZWxlbWVudHMgb2YgcmVzdWx0IG1heSBiZSAxIGVsZW1lbnQgbG9uZ2VyOw0KCS8vIGZpcnN0IGZpbGwgb3V0IGFzIG1hbnkgZWxlbWVudHMgYXMgYWxsIG9mIHRoZW0gaGF2ZQ0KCXZhciByYXdDb2Rld29yZHNPZmZzZXQgPSAwOw0KCWZvciAodmFyIGkgPSAwOyBpIDwgc2hvcnRlckJsb2Nrc051bURhdGFDb2Rld29yZHM7IGkrKykNCgl7DQoJCWZvciAodmFyIGogPSAwOyBqIDwgbnVtUmVzdWx0QmxvY2tzOyBqKyspDQoJCXsNCgkJCXJlc3VsdFtqXS5jb2Rld29yZHNbaV0gPSByYXdDb2Rld29yZHNbcmF3Q29kZXdvcmRzT2Zmc2V0KytdOw0KCQl9DQoJfQ0KCS8vIEZpbGwgb3V0IHRoZSBsYXN0IGRhdGEgYmxvY2sgaW4gdGhlIGxvbmdlciBvbmVzDQoJZm9yICh2YXIgaiA9IGxvbmdlckJsb2Nrc1N0YXJ0QXQ7IGogPCBudW1SZXN1bHRCbG9ja3M7IGorKykNCgl7DQoJCXJlc3VsdFtqXS5jb2Rld29yZHNbc2hvcnRlckJsb2Nrc051bURhdGFDb2Rld29yZHNdID0gcmF3Q29kZXdvcmRzW3Jhd0NvZGV3b3Jkc09mZnNldCsrXTsNCgl9DQoJLy8gTm93IGFkZCBpbiBlcnJvciBjb3JyZWN0aW9uIGJsb2Nrcw0KCXZhciBtYXggPSByZXN1bHRbMF0uY29kZXdvcmRzLmxlbmd0aDsNCglmb3IgKHZhciBpID0gc2hvcnRlckJsb2Nrc051bURhdGFDb2Rld29yZHM7IGkgPCBtYXg7IGkrKykNCgl7DQoJCWZvciAodmFyIGogPSAwOyBqIDwgbnVtUmVzdWx0QmxvY2tzOyBqKyspDQoJCXsNCgkJCXZhciBpT2Zmc2V0ID0gaiA8IGxvbmdlckJsb2Nrc1N0YXJ0QXQ/aTppICsgMTsNCgkJCXJlc3VsdFtqXS5jb2Rld29yZHNbaU9mZnNldF0gPSByYXdDb2Rld29yZHNbcmF3Q29kZXdvcmRzT2Zmc2V0KytdOw0KCQl9DQoJfQ0KCXJldHVybiByZXN1bHQ7DQp9DQo=</uax:ByteString>
		</Value>
	</UAVariable>
	<UAVariable NodeId="ns=1;s=SYSTEM.LIBRARY.PROJECT.RESOURCES/QRCodeScanner/databr.js" BrowseName="1:databr.js" DataType="ByteString" AccessLevel="103" UserAccessLevel="103" Historizing="true">
		<DisplayName Locale="en">databr.js</DisplayName>
		<Description Locale="en">databr.js</Description>
		<References>
			<Reference ReferenceType="HasComponent" IsForward="false">ns=1;s=SYSTEM.LIBRARY.PROJECT.RESOURCES/QRCodeScanner</Reference>
			<Reference ReferenceType="HasTypeDefinition">ns=1;s=VariableTypes.ATVISE.Resource.Javascript</Reference>
			<Reference ReferenceType="HasProperty">ns=1;s=VariableTypes.ATVISE.Resource.Javascript.Compress</Reference>
		</References>
		<Value>
			<uax:ByteString>LyoNCiAgUG9ydGVkIHRvIEphdmFTY3JpcHQgYnkgTGF6YXIgTGFzemxvIDIwMTEgDQogIA0KICBsYXphcnNvZnRAZ21haWwuY29tLCB3d3cubGF6YXJzb2Z0LmluZm8NCiAgDQoqLw0KDQovKg0KKg0KKiBDb3B5cmlnaHQgMjAwNyBaWGluZyBhdXRob3JzDQoqDQoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOw0KKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuDQoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KKg0KKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KKg0KKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KKi8NCg0KDQpmdW5jdGlvbiBRUkNvZGVEYXRhQmxvY2tSZWFkZXIoYmxvY2tzLCAgdmVyc2lvbiwgIG51bUVycm9yQ29ycmVjdGlvbkNvZGUpDQp7DQoJdGhpcy5ibG9ja1BvaW50ZXIgPSAwOw0KCXRoaXMuYml0UG9pbnRlciA9IDc7DQoJdGhpcy5kYXRhTGVuZ3RoID0gMDsNCgl0aGlzLmJsb2NrcyA9IGJsb2NrczsNCgl0aGlzLm51bUVycm9yQ29ycmVjdGlvbkNvZGUgPSBudW1FcnJvckNvcnJlY3Rpb25Db2RlOw0KCWlmICh2ZXJzaW9uIDw9IDkpDQoJCXRoaXMuZGF0YUxlbmd0aE1vZGUgPSAwOw0KCWVsc2UgaWYgKHZlcnNpb24gPj0gMTAgJiYgdmVyc2lvbiA8PSAyNikNCgkJdGhpcy5kYXRhTGVuZ3RoTW9kZSA9IDE7DQoJZWxzZSBpZiAodmVyc2lvbiA+PSAyNyAmJiB2ZXJzaW9uIDw9IDQwKQ0KCQl0aGlzLmRhdGFMZW5ndGhNb2RlID0gMjsNCgkJDQoJdGhpcy5nZXROZXh0Qml0cyA9IGZ1bmN0aW9uKCBudW1CaXRzKQ0KCQl7CQkJDQoJCQl2YXIgYml0cyA9IDA7DQoJCQlpZiAobnVtQml0cyA8IHRoaXMuYml0UG9pbnRlciArIDEpDQoJCQl7DQoJCQkJLy8gbmV4dCB3b3JkIGZpdHMgaW50byBjdXJyZW50IGRhdGEgYmxvY2sNCgkJCQl2YXIgbWFzayA9IDA7DQoJCQkJZm9yICh2YXIgaSA9IDA7IGkgPCBudW1CaXRzOyBpKyspDQoJCQkJew0KCQkJCQltYXNrICs9ICgxIDw8IGkpOw0KCQkJCX0NCgkJCQltYXNrIDw8PSAodGhpcy5iaXRQb2ludGVyIC0gbnVtQml0cyArIDEpOw0KCQkJCQ0KCQkJCWJpdHMgPSAodGhpcy5ibG9ja3NbdGhpcy5ibG9ja1BvaW50ZXJdICYgbWFzaykgPj4gKHRoaXMuYml0UG9pbnRlciAtIG51bUJpdHMgKyAxKTsNCgkJCQl0aGlzLmJpdFBvaW50ZXIgLT0gbnVtQml0czsNCgkJCQlyZXR1cm4gYml0czsNCgkJCX0NCgkJCWVsc2UgaWYgKG51bUJpdHMgPCB0aGlzLmJpdFBvaW50ZXIgKyAxICsgOCkNCgkJCXsNCgkJCQkvLyBuZXh0IHdvcmQgY3Jvc3NlcyAyIGRhdGEgYmxvY2tzDQoJCQkJdmFyIG1hc2sxID0gMDsNCgkJCQlmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuYml0UG9pbnRlciArIDE7IGkrKykNCgkJCQl7DQoJCQkJCW1hc2sxICs9ICgxIDw8IGkpOw0KCQkJCX0NCgkJCQliaXRzID0gKHRoaXMuYmxvY2tzW3RoaXMuYmxvY2tQb2ludGVyXSAmIG1hc2sxKSA8PCAobnVtQml0cyAtICh0aGlzLmJpdFBvaW50ZXIgKyAxKSk7DQogICAgICAgICAgICAgICAgdGhpcy5ibG9ja1BvaW50ZXIrKzsNCgkJCQliaXRzICs9ICgodGhpcy5ibG9ja3NbdGhpcy5ibG9ja1BvaW50ZXJdKSA+PiAoOCAtIChudW1CaXRzIC0gKHRoaXMuYml0UG9pbnRlciArIDEpKSkpOw0KCQkJCQ0KCQkJCXRoaXMuYml0UG9pbnRlciA9IHRoaXMuYml0UG9pbnRlciAtIG51bUJpdHMgJSA4Ow0KCQkJCWlmICh0aGlzLmJpdFBvaW50ZXIgPCAwKQ0KCQkJCXsNCgkJCQkJdGhpcy5iaXRQb2ludGVyID0gOCArIHRoaXMuYml0UG9pbnRlcjsNCgkJCQl9DQoJCQkJcmV0dXJuIGJpdHM7DQoJCQl9DQoJCQllbHNlIGlmIChudW1CaXRzIDwgdGhpcy5iaXRQb2ludGVyICsgMSArIDE2KQ0KCQkJew0KCQkJCS8vIG5leHQgd29yZCBjcm9zc2VzIDMgZGF0YSBibG9ja3MNCgkJCQl2YXIgbWFzazEgPSAwOyAvLyBtYXNrIG9mIGZpcnN0IGJsb2NrDQoJCQkJdmFyIG1hc2szID0gMDsgLy8gbWFzayBvZiAzcmQgYmxvY2sNCgkJCQkvL2JpdFBvaW50ZXIgKyAxIDogbnVtYmVyIG9mIGJpdHMgb2YgdGhlIDFzdCBibG9jaw0KCQkJCS8vOCA6IG51bWJlciBvZiB0aGUgMm5kIGJsb2NrIChub3RlIHRoYXQgdXNlIGFscmVhZHkgOGJpdHMgYmVjYXVzZSBuZXh0IHdvcmQgdXNlcyAzIGRhdGEgYmxvY2tzKQ0KCQkJCS8vbnVtQml0cyAtIChiaXRQb2ludGVyICsgMSArIDgpIDogbnVtYmVyIG9mIGJpdHMgb2YgdGhlIDNyZCBibG9jayANCgkJCQlmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuYml0UG9pbnRlciArIDE7IGkrKykNCgkJCQl7DQoJCQkJCW1hc2sxICs9ICgxIDw8IGkpOw0KCQkJCX0NCgkJCQl2YXIgYml0c0ZpcnN0QmxvY2sgPSAodGhpcy5ibG9ja3NbdGhpcy5ibG9ja1BvaW50ZXJdICYgbWFzazEpIDw8IChudW1CaXRzIC0gKHRoaXMuYml0UG9pbnRlciArIDEpKTsNCgkJCQl0aGlzLmJsb2NrUG9pbnRlcisrOw0KCQkJCQ0KCQkJCXZhciBiaXRzU2Vjb25kQmxvY2sgPSB0aGlzLmJsb2Nrc1t0aGlzLmJsb2NrUG9pbnRlcl0gPDwgKG51bUJpdHMgLSAodGhpcy5iaXRQb2ludGVyICsgMSArIDgpKTsNCgkJCQl0aGlzLmJsb2NrUG9pbnRlcisrOw0KCQkJCQ0KCQkJCWZvciAodmFyIGkgPSAwOyBpIDwgbnVtQml0cyAtICh0aGlzLmJpdFBvaW50ZXIgKyAxICsgOCk7IGkrKykNCgkJCQl7DQoJCQkJCW1hc2szICs9ICgxIDw8IGkpOw0KCQkJCX0NCgkJCQltYXNrMyA8PD0gOCAtIChudW1CaXRzIC0gKHRoaXMuYml0UG9pbnRlciArIDEgKyA4KSk7DQoJCQkJdmFyIGJpdHNUaGlyZEJsb2NrID0gKHRoaXMuYmxvY2tzW3RoaXMuYmxvY2tQb2ludGVyXSAmIG1hc2szKSA+PiAoOCAtIChudW1CaXRzIC0gKHRoaXMuYml0UG9pbnRlciArIDEgKyA4KSkpOw0KCQkJCQ0KCQkJCWJpdHMgPSBiaXRzRmlyc3RCbG9jayArIGJpdHNTZWNvbmRCbG9jayArIGJpdHNUaGlyZEJsb2NrOw0KCQkJCXRoaXMuYml0UG9pbnRlciA9IHRoaXMuYml0UG9pbnRlciAtIChudW1CaXRzIC0gOCkgJSA4Ow0KCQkJCWlmICh0aGlzLmJpdFBvaW50ZXIgPCAwKQ0KCQkJCXsNCgkJCQkJdGhpcy5iaXRQb2ludGVyID0gOCArIHRoaXMuYml0UG9pbnRlcjsNCgkJCQl9DQoJCQkJcmV0dXJuIGJpdHM7DQoJCQl9DQoJCQllbHNlDQoJCQl7DQoJCQkJcmV0dXJuIDA7DQoJCQl9DQoJCX0NCgl0aGlzLk5leHRNb2RlPWZ1bmN0aW9uKCkNCgl7DQoJCWlmICgodGhpcy5ibG9ja1BvaW50ZXIgPiB0aGlzLmJsb2Nrcy5sZW5ndGggLSB0aGlzLm51bUVycm9yQ29ycmVjdGlvbkNvZGUgLSAyKSkNCgkJCXJldHVybiAwOw0KCQllbHNlDQoJCQlyZXR1cm4gdGhpcy5nZXROZXh0Qml0cyg0KTsNCgl9DQoJdGhpcy5nZXREYXRhTGVuZ3RoPWZ1bmN0aW9uKCBtb2RlSW5kaWNhdG9yKQ0KCQl7DQoJCQl2YXIgaW5kZXggPSAwOw0KCQkJd2hpbGUgKHRydWUpDQoJCQl7DQoJCQkJaWYgKChtb2RlSW5kaWNhdG9yID4+IGluZGV4KSA9PSAxKQ0KCQkJCQlicmVhazsNCgkJCQlpbmRleCsrOw0KCQkJfQ0KCQkJDQoJCQlyZXR1cm4gdGhpcy5nZXROZXh0Qml0cyhxcmNvZGUuc2l6ZU9mRGF0YUxlbmd0aEluZm9bdGhpcy5kYXRhTGVuZ3RoTW9kZV1baW5kZXhdKTsNCgkJfQ0KCXRoaXMuZ2V0Um9tYW5BbmRGaWd1cmVTdHJpbmc9ZnVuY3Rpb24oIGRhdGFMZW5ndGgpDQoJCXsNCgkJCXZhciBsZW5ndGggPSBkYXRhTGVuZ3RoOw0KCQkJdmFyIGludERhdGEgPSAwOw0KCQkJdmFyIHN0ckRhdGEgPSAiIjsNCgkJCXZhciB0YWJsZVJvbWFuQW5kRmlndXJlID0gbmV3IEFycmF5KCcwJywgJzEnLCAnMicsICczJywgJzQnLCAnNScsICc2JywgJzcnLCAnOCcsICc5JywgJ0EnLCAnQicsICdDJywgJ0QnLCAnRScsICdGJywgJ0cnLCAnSCcsICdJJywgJ0onLCAnSycsICdMJywgJ00nLCAnTicsICdPJywgJ1AnLCAnUScsICdSJywgJ1MnLCAnVCcsICdVJywgJ1YnLCAnVycsICdYJywgJ1knLCAnWicsICcgJywgJyQnLCAnJScsICcqJywgJysnLCAnLScsICcuJywgJy8nLCAnOicpOw0KCQkJZG8gDQoJCQl7DQoJCQkJaWYgKGxlbmd0aCA+IDEpDQoJCQkJew0KCQkJCQlpbnREYXRhID0gdGhpcy5nZXROZXh0Qml0cygxMSk7DQoJCQkJCXZhciBmaXJzdExldHRlciA9IE1hdGguZmxvb3IoaW50RGF0YSAvIDQ1KTsNCgkJCQkJdmFyIHNlY29uZExldHRlciA9IGludERhdGEgJSA0NTsNCgkJCQkJc3RyRGF0YSArPSB0YWJsZVJvbWFuQW5kRmlndXJlW2ZpcnN0TGV0dGVyXTsNCgkJCQkJc3RyRGF0YSArPSB0YWJsZVJvbWFuQW5kRmlndXJlW3NlY29uZExldHRlcl07DQoJCQkJCWxlbmd0aCAtPSAyOw0KCQkJCX0NCgkJCQllbHNlIGlmIChsZW5ndGggPT0gMSkNCgkJCQl7DQoJCQkJCWludERhdGEgPSB0aGlzLmdldE5leHRCaXRzKDYpOw0KCQkJCQlzdHJEYXRhICs9IHRhYmxlUm9tYW5BbmRGaWd1cmVbaW50RGF0YV07DQoJCQkJCWxlbmd0aCAtPSAxOw0KCQkJCX0NCgkJCX0NCgkJCXdoaWxlIChsZW5ndGggPiAwKTsNCgkJCQ0KCQkJcmV0dXJuIHN0ckRhdGE7DQoJCX0NCgl0aGlzLmdldEZpZ3VyZVN0cmluZz1mdW5jdGlvbiggZGF0YUxlbmd0aCkNCgkJew0KCQkJdmFyIGxlbmd0aCA9IGRhdGFMZW5ndGg7DQoJCQl2YXIgaW50RGF0YSA9IDA7DQoJCQl2YXIgc3RyRGF0YSA9ICIiOw0KCQkJZG8gDQoJCQl7DQoJCQkJaWYgKGxlbmd0aCA+PSAzKQ0KCQkJCXsNCgkJCQkJaW50RGF0YSA9IHRoaXMuZ2V0TmV4dEJpdHMoMTApOw0KCQkJCQlpZiAoaW50RGF0YSA8IDEwMCkNCgkJCQkJCXN0ckRhdGEgKz0gIjAiOw0KCQkJCQlpZiAoaW50RGF0YSA8IDEwKQ0KCQkJCQkJc3RyRGF0YSArPSAiMCI7DQoJCQkJCWxlbmd0aCAtPSAzOw0KCQkJCX0NCgkJCQllbHNlIGlmIChsZW5ndGggPT0gMikNCgkJCQl7DQoJCQkJCWludERhdGEgPSB0aGlzLmdldE5leHRCaXRzKDcpOw0KCQkJCQlpZiAoaW50RGF0YSA8IDEwKQ0KCQkJCQkJc3RyRGF0YSArPSAiMCI7DQoJCQkJCWxlbmd0aCAtPSAyOw0KCQkJCX0NCgkJCQllbHNlIGlmIChsZW5ndGggPT0gMSkNCgkJCQl7DQoJCQkJCWludERhdGEgPSB0aGlzLmdldE5leHRCaXRzKDQpOw0KCQkJCQlsZW5ndGggLT0gMTsNCgkJCQl9DQoJCQkJc3RyRGF0YSArPSBpbnREYXRhOw0KCQkJfQ0KCQkJd2hpbGUgKGxlbmd0aCA+IDApOw0KCQkJDQoJCQlyZXR1cm4gc3RyRGF0YTsNCgkJfQ0KCXRoaXMuZ2V0OGJpdEJ5dGVBcnJheT1mdW5jdGlvbiggZGF0YUxlbmd0aCkNCgkJew0KCQkJdmFyIGxlbmd0aCA9IGRhdGFMZW5ndGg7DQoJCQl2YXIgaW50RGF0YSA9IDA7DQoJCQl2YXIgb3V0cHV0ID0gbmV3IEFycmF5KCk7DQoJCQkNCgkJCWRvIA0KCQkJew0KCQkJCWludERhdGEgPSB0aGlzLmdldE5leHRCaXRzKDgpOw0KCQkJCW91dHB1dC5wdXNoKCBpbnREYXRhKTsNCgkJCQlsZW5ndGgtLTsNCgkJCX0NCgkJCXdoaWxlIChsZW5ndGggPiAwKTsNCgkJCXJldHVybiBvdXRwdXQ7DQoJCX0NCiAgICB0aGlzLmdldEthbmppU3RyaW5nPWZ1bmN0aW9uKCBkYXRhTGVuZ3RoKQ0KCQl7DQoJCQl2YXIgbGVuZ3RoID0gZGF0YUxlbmd0aDsNCgkJCXZhciBpbnREYXRhID0gMDsNCgkJCXZhciB1bmljb2RlU3RyaW5nID0gIiI7DQoJCQlkbyANCgkJCXsNCgkJCQlpbnREYXRhID0gdGhpcy5nZXROZXh0Qml0cygxMyk7DQoJCQkJdmFyIGxvd2VyQnl0ZSA9IGludERhdGEgJSAweEMwOw0KCQkJCXZhciBoaWdoZXJCeXRlID0gaW50RGF0YSAvIDB4QzA7DQoJCQkJDQoJCQkJdmFyIHRlbXBXb3JkID0gKGhpZ2hlckJ5dGUgPDwgOCkgKyBsb3dlckJ5dGU7DQoJCQkJdmFyIHNoaWZ0amlzV29yZCA9IDA7DQoJCQkJaWYgKHRlbXBXb3JkICsgMHg4MTQwIDw9IDB4OUZGQykNCgkJCQl7DQoJCQkJCS8vIGJldHdlZW4gODE0MCAtIDlGRkMgb24gU2hpZnRfSklTIGNoYXJhY3RlciBzZXQNCgkJCQkJc2hpZnRqaXNXb3JkID0gdGVtcFdvcmQgKyAweDgxNDA7DQoJCQkJfQ0KCQkJCWVsc2UNCgkJCQl7DQoJCQkJCS8vIGJldHdlZW4gRTA0MCAtIEVCQkYgb24gU2hpZnRfSklTIGNoYXJhY3RlciBzZXQNCgkJCQkJc2hpZnRqaXNXb3JkID0gdGVtcFdvcmQgKyAweEMxNDA7DQoJCQkJfQ0KCQkJCQ0KCQkJCS8vdmFyIHRlbXBCeXRlID0gbmV3IEFycmF5KDAsMCk7DQoJCQkJLy90ZW1wQnl0ZVswXSA9IChzYnl0ZSkgKHNoaWZ0amlzV29yZCA+PiA4KTsNCgkJCQkvL3RlbXBCeXRlWzFdID0gKHNieXRlKSAoc2hpZnRqaXNXb3JkICYgMHhGRik7DQoJCQkJLy91bmljb2RlU3RyaW5nICs9IG5ldyBTdHJpbmcoU3lzdGVtVXRpbHMuVG9DaGFyQXJyYXkoU3lzdGVtVXRpbHMuVG9CeXRlQXJyYXkodGVtcEJ5dGUpKSk7DQogICAgICAgICAgICAgICAgdW5pY29kZVN0cmluZyArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKHNoaWZ0amlzV29yZCk7DQoJCQkJbGVuZ3RoLS07DQoJCQl9DQoJCQl3aGlsZSAobGVuZ3RoID4gMCk7DQoJCQkNCgkJCQ0KCQkJcmV0dXJuIHVuaWNvZGVTdHJpbmc7DQoJCX0NCg0KCXRoaXMucGFyc2VFQ0lWYWx1ZSA9IGZ1bmN0aW9uICgpDQoJew0KCQl2YXIgaW50RGF0YSA9IDA7DQoJCXZhciBmaXJzdEJ5dGUgPSB0aGlzLmdldE5leHRCaXRzKDgpOw0KCQlpZiAoKGZpcnN0Qnl0ZSAmIDB4ODApID09IDApIHsNCgkJCWludERhdGEgPSBmaXJzdEJ5dGUgJiAweDdGOw0KCQl9DQoJCWlmICgoZmlyc3RCeXRlICYgMHhDMCkgPT0gMHg4MCkgew0KCQkJLy8gdHdvIGJ5dGVzDQoJCQl2YXIgc2Vjb25kQnl0ZSA9IHRoaXMuZ2V0TmV4dEJpdHMoOCk7DQoJCQlpbnREYXRhID0gKChmaXJzdEJ5dGUgJiAweDNGKSA8PCA4KSB8IHNlY29uZEJ5dGU7DQoJCX0NCgkJaWYgKChmaXJzdEJ5dGUgJiAweEUwKSA9PSAweEMwKSB7DQoJCQkvLyB0aHJlZSBieXRlcw0KCQkJdmFyIHNlY29uZFRoaXJkQnl0ZXMgPSB0aGlzLmdldE5leHRCaXRzKDgpOzsNCgkJCWludERhdGEgPSAoKGZpcnN0Qnl0ZSAmIDB4MUYpIDw8IDE2KSB8IHNlY29uZFRoaXJkQnl0ZXM7DQoJCX0NCgkJcmV0dXJuIGludERhdGE7DQoJfQ0KDQoJdGhpcy5fX2RlZmluZUdldHRlcl9fKCJEYXRhQnl0ZSIsIGZ1bmN0aW9uKCkNCgl7DQoJCXZhciBvdXRwdXQgPSBuZXcgQXJyYXkoKTsNCgkJdmFyIE1PREVfTlVNQkVSID0gMTsNCgkgICAgdmFyIE1PREVfUk9NQU5fQU5EX05VTUJFUiA9IDI7DQoJICAgIHZhciBNT0RFXzhCSVRfQllURSA9IDQ7DQoJCXZhciBNT0RFX0VDSSA9IDc7DQoJICAgIHZhciBNT0RFX0tBTkpJID0gODsNCgkJZG8gDQoJCQkJCXsNCgkJCQkJCXZhciBtb2RlID0gdGhpcy5OZXh0TW9kZSgpOw0KCQkJCQkJLy9jYW52YXMucHJpbnRsbigibW9kZTogIiArIG1vZGUpOw0KCQkJCQkJaWYgKG1vZGUgPT0gMCkNCgkJCQkJCXsNCgkJCQkJCQlpZiAob3V0cHV0Lmxlbmd0aCA+IDApDQoJCQkJCQkJCWJyZWFrOw0KCQkJCQkJCWVsc2UNCgkJCQkJCQkJdGhyb3cgIkVtcHR5IGRhdGEgYmxvY2siOw0KCQkJCQkJfQ0KCQkJCQkJaWYgKG1vZGUgIT0gTU9ERV9OVU1CRVIgJiYgbW9kZSAhPSBNT0RFX1JPTUFOX0FORF9OVU1CRVIgJiYgbW9kZSAhPSBNT0RFXzhCSVRfQllURSAmJiBtb2RlICE9IE1PREVfS0FOSkkgJiYgbW9kZSAhPSBNT0RFX0VDSSkNCgkJCQkJCXsNCgkJCQkJCQl0aHJvdyAiSW52YWxpZCBtb2RlOiAiICsgbW9kZSArICIgaW4gKGJsb2NrOiIgKyB0aGlzLmJsb2NrUG9pbnRlciArICIgYml0OiIgKyB0aGlzLmJpdFBvaW50ZXIgKyAiKSI7DQoJCQkJCQl9DQoNCgkJCQkJCWlmKG1vZGUgPT0gTU9ERV9FQ0kpDQoJCQkJCQl7DQoJCQkJCQkJdmFyIHRlbXBfc2J5dGVBcnJheTMgPSB0aGlzLnBhcnNlRUNJVmFsdWUoKTsNCgkJCQkJCQkvL291dHB1dC5wdXNoKHRlbXBfc2J5dGVBcnJheTMpOw0KCQkJCQkJfQ0KCQkJCQkJZWxzZQ0KCQkJCQkJew0KDQoJCQkJCQkJdmFyIGRhdGFMZW5ndGggPSB0aGlzLmdldERhdGFMZW5ndGgobW9kZSk7DQoJCQkJCQkJaWYgKGRhdGFMZW5ndGggPCAxKQ0KCQkJCQkJCQl0aHJvdyAiSW52YWxpZCBkYXRhIGxlbmd0aDogIiArIGRhdGFMZW5ndGg7DQoJCQkJCQkJc3dpdGNoIChtb2RlKQ0KCQkJCQkJCXsNCgkJCQkJCQkJDQoJCQkJCQkJCWNhc2UgTU9ERV9OVU1CRVI6IA0KCQkJCQkJCQkJdmFyIHRlbXBfc3RyID0gdGhpcy5nZXRGaWd1cmVTdHJpbmcoZGF0YUxlbmd0aCk7DQoJCQkJCQkJCQl2YXIgdGEgPSBuZXcgQXJyYXkodGVtcF9zdHIubGVuZ3RoKTsNCgkJCQkJCQkJCWZvcih2YXIgaj0wO2o8dGVtcF9zdHIubGVuZ3RoO2orKykNCgkJCQkJCQkJCQl0YVtqXT10ZW1wX3N0ci5jaGFyQ29kZUF0KGopOw0KCQkJCQkJCQkJb3V0cHV0LnB1c2godGEpOw0KCQkJCQkJCQkJYnJlYWs7DQoJCQkJCQkJCQ0KCQkJCQkJCQljYXNlIE1PREVfUk9NQU5fQU5EX05VTUJFUjogDQoJCQkJCQkJCQl2YXIgdGVtcF9zdHIgPSB0aGlzLmdldFJvbWFuQW5kRmlndXJlU3RyaW5nKGRhdGFMZW5ndGgpOw0KCQkJCQkJCQkJdmFyIHRhID0gbmV3IEFycmF5KHRlbXBfc3RyLmxlbmd0aCk7DQoJCQkJCQkJCQlmb3IodmFyIGo9MDtqPHRlbXBfc3RyLmxlbmd0aDtqKyspDQoJCQkJCQkJCQkJdGFbal09dGVtcF9zdHIuY2hhckNvZGVBdChqKTsNCgkJCQkJCQkJCW91dHB1dC5wdXNoKHRhICk7DQoJCQkJCQkJCQlicmVhazsNCgkJCQkJCQkJDQoJCQkJCQkJCWNhc2UgTU9ERV84QklUX0JZVEU6IA0KCQkJCQkJCQkJdmFyIHRlbXBfc2J5dGVBcnJheTMgPSB0aGlzLmdldDhiaXRCeXRlQXJyYXkoZGF0YUxlbmd0aCk7DQoJCQkJCQkJCQlvdXRwdXQucHVzaCh0ZW1wX3NieXRlQXJyYXkzKTsNCgkJCQkJCQkJCWJyZWFrOw0KCQkJCQkJCQkNCgkJCQkJCQkJY2FzZSBNT0RFX0tBTkpJOiANCgkJCQkJCQkJCXZhciB0ZW1wX3N0ciA9IHRoaXMuZ2V0S2FuamlTdHJpbmcoZGF0YUxlbmd0aCk7DQoJCQkJCQkJCQlvdXRwdXQucHVzaCh0ZW1wX3N0cik7DQoJCQkJCQkJCQlicmVhazsNCgkJCQkJCQl9DQoJCQkJCQl9DQoJCQkJCX0NCgkJCQkJd2hpbGUgKHRydWUpOw0KCQlyZXR1cm4gb3V0cHV0Ow0KCX0pOw0KfQ0K</uax:ByteString>
		</Value>
	</UAVariable>
	<UAVariable NodeId="ns=1;s=SYSTEM.LIBRARY.PROJECT.RESOURCES/QRCodeScanner/datamask.js" BrowseName="1:datamask.js" DataType="ByteString" AccessLevel="103" UserAccessLevel="103" Historizing="true">
		<DisplayName Locale="en">datamask.js</DisplayName>
		<Description Locale="en">datamask.js</Description>
		<References>
			<Reference ReferenceType="HasComponent" IsForward="false">ns=1;s=SYSTEM.LIBRARY.PROJECT.RESOURCES/QRCodeScanner</Reference>
			<Reference ReferenceType="HasTypeDefinition">ns=1;s=VariableTypes.ATVISE.Resource.Javascript</Reference>
			<Reference ReferenceType="HasProperty">ns=1;s=VariableTypes.ATVISE.Resource.Javascript.Compress</Reference>
		</References>
		<Value>
			<uax:ByteString>LyoNCiAgUG9ydGVkIHRvIEphdmFTY3JpcHQgYnkgTGF6YXIgTGFzemxvIDIwMTEgDQogIA0KICBsYXphcnNvZnRAZ21haWwuY29tLCB3d3cubGF6YXJzb2Z0LmluZm8NCiAgDQoqLw0KDQovKg0KKg0KKiBDb3B5cmlnaHQgMjAwNyBaWGluZyBhdXRob3JzDQoqDQoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOw0KKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuDQoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KKg0KKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KKg0KKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KKi8NCg0KDQp2YXIgRGF0YU1hc2sgPSB7fTsNCg0KRGF0YU1hc2suZm9yUmVmZXJlbmNlID0gZnVuY3Rpb24ocmVmZXJlbmNlKQ0Kew0KCWlmIChyZWZlcmVuY2UgPCAwIHx8IHJlZmVyZW5jZSA+IDcpDQoJew0KCQl0aHJvdyAiU3lzdGVtLkFyZ3VtZW50RXhjZXB0aW9uIjsNCgl9DQoJcmV0dXJuIERhdGFNYXNrLkRBVEFfTUFTS1NbcmVmZXJlbmNlXTsNCn0NCg0KZnVuY3Rpb24gRGF0YU1hc2swMDAoKQ0Kew0KCXRoaXMudW5tYXNrQml0TWF0cml4PWZ1bmN0aW9uKGJpdHMsICBkaW1lbnNpb24pDQoJew0KCQlmb3IgKHZhciBpID0gMDsgaSA8IGRpbWVuc2lvbjsgaSsrKQ0KCQl7DQoJCQlmb3IgKHZhciBqID0gMDsgaiA8IGRpbWVuc2lvbjsgaisrKQ0KCQkJew0KCQkJCWlmICh0aGlzLmlzTWFza2VkKGksIGopKQ0KCQkJCXsNCgkJCQkJYml0cy5mbGlwKGosIGkpOw0KCQkJCX0NCgkJCX0NCgkJfQ0KCX0NCgl0aGlzLmlzTWFza2VkPWZ1bmN0aW9uKCBpLCAgaikNCgl7DQoJCXJldHVybiAoKGkgKyBqKSAmIDB4MDEpID09IDA7DQoJfQ0KfQ0KDQpmdW5jdGlvbiBEYXRhTWFzazAwMSgpDQp7DQoJdGhpcy51bm1hc2tCaXRNYXRyaXg9ZnVuY3Rpb24oYml0cywgIGRpbWVuc2lvbikNCgl7DQoJCWZvciAodmFyIGkgPSAwOyBpIDwgZGltZW5zaW9uOyBpKyspDQoJCXsNCgkJCWZvciAodmFyIGogPSAwOyBqIDwgZGltZW5zaW9uOyBqKyspDQoJCQl7DQoJCQkJaWYgKHRoaXMuaXNNYXNrZWQoaSwgaikpDQoJCQkJew0KCQkJCQliaXRzLmZsaXAoaiwgaSk7DQoJCQkJfQ0KCQkJfQ0KCQl9DQoJfQ0KCXRoaXMuaXNNYXNrZWQ9ZnVuY3Rpb24oIGksICBqKQ0KCXsNCgkJcmV0dXJuIChpICYgMHgwMSkgPT0gMDsNCgl9DQp9DQoNCmZ1bmN0aW9uIERhdGFNYXNrMDEwKCkNCnsNCgl0aGlzLnVubWFza0JpdE1hdHJpeD1mdW5jdGlvbihiaXRzLCAgZGltZW5zaW9uKQ0KCXsNCgkJZm9yICh2YXIgaSA9IDA7IGkgPCBkaW1lbnNpb247IGkrKykNCgkJew0KCQkJZm9yICh2YXIgaiA9IDA7IGogPCBkaW1lbnNpb247IGorKykNCgkJCXsNCgkJCQlpZiAodGhpcy5pc01hc2tlZChpLCBqKSkNCgkJCQl7DQoJCQkJCWJpdHMuZmxpcChqLCBpKTsNCgkJCQl9DQoJCQl9DQoJCX0NCgl9DQoJdGhpcy5pc01hc2tlZD1mdW5jdGlvbiggaSwgIGopDQoJew0KCQlyZXR1cm4gaiAlIDMgPT0gMDsNCgl9DQp9DQoNCmZ1bmN0aW9uIERhdGFNYXNrMDExKCkNCnsNCgl0aGlzLnVubWFza0JpdE1hdHJpeD1mdW5jdGlvbihiaXRzLCAgZGltZW5zaW9uKQ0KCXsNCgkJZm9yICh2YXIgaSA9IDA7IGkgPCBkaW1lbnNpb247IGkrKykNCgkJew0KCQkJZm9yICh2YXIgaiA9IDA7IGogPCBkaW1lbnNpb247IGorKykNCgkJCXsNCgkJCQlpZiAodGhpcy5pc01hc2tlZChpLCBqKSkNCgkJCQl7DQoJCQkJCWJpdHMuZmxpcChqLCBpKTsNCgkJCQl9DQoJCQl9DQoJCX0NCgl9DQoJdGhpcy5pc01hc2tlZD1mdW5jdGlvbiggaSwgIGopDQoJew0KCQlyZXR1cm4gKGkgKyBqKSAlIDMgPT0gMDsNCgl9DQp9DQoNCmZ1bmN0aW9uIERhdGFNYXNrMTAwKCkNCnsNCgl0aGlzLnVubWFza0JpdE1hdHJpeD1mdW5jdGlvbihiaXRzLCAgZGltZW5zaW9uKQ0KCXsNCgkJZm9yICh2YXIgaSA9IDA7IGkgPCBkaW1lbnNpb247IGkrKykNCgkJew0KCQkJZm9yICh2YXIgaiA9IDA7IGogPCBkaW1lbnNpb247IGorKykNCgkJCXsNCgkJCQlpZiAodGhpcy5pc01hc2tlZChpLCBqKSkNCgkJCQl7DQoJCQkJCWJpdHMuZmxpcChqLCBpKTsNCgkJCQl9DQoJCQl9DQoJCX0NCgl9DQoJdGhpcy5pc01hc2tlZD1mdW5jdGlvbiggaSwgIGopDQoJew0KCQlyZXR1cm4gKCgoVVJTaGlmdChpLCAxKSkgKyAoaiAvIDMpKSAmIDB4MDEpID09IDA7DQoJfQ0KfQ0KDQpmdW5jdGlvbiBEYXRhTWFzazEwMSgpDQp7DQoJdGhpcy51bm1hc2tCaXRNYXRyaXg9ZnVuY3Rpb24oYml0cywgIGRpbWVuc2lvbikNCgl7DQoJCWZvciAodmFyIGkgPSAwOyBpIDwgZGltZW5zaW9uOyBpKyspDQoJCXsNCgkJCWZvciAodmFyIGogPSAwOyBqIDwgZGltZW5zaW9uOyBqKyspDQoJCQl7DQoJCQkJaWYgKHRoaXMuaXNNYXNrZWQoaSwgaikpDQoJCQkJew0KCQkJCQliaXRzLmZsaXAoaiwgaSk7DQoJCQkJfQ0KCQkJfQ0KCQl9DQoJfQ0KCXRoaXMuaXNNYXNrZWQ9ZnVuY3Rpb24oIGksICBqKQ0KCXsNCgkJdmFyIHRlbXAgPSBpICogajsNCgkJcmV0dXJuICh0ZW1wICYgMHgwMSkgKyAodGVtcCAlIDMpID09IDA7DQoJfQ0KfQ0KDQpmdW5jdGlvbiBEYXRhTWFzazExMCgpDQp7DQoJdGhpcy51bm1hc2tCaXRNYXRyaXg9ZnVuY3Rpb24oYml0cywgIGRpbWVuc2lvbikNCgl7DQoJCWZvciAodmFyIGkgPSAwOyBpIDwgZGltZW5zaW9uOyBpKyspDQoJCXsNCgkJCWZvciAodmFyIGogPSAwOyBqIDwgZGltZW5zaW9uOyBqKyspDQoJCQl7DQoJCQkJaWYgKHRoaXMuaXNNYXNrZWQoaSwgaikpDQoJCQkJew0KCQkJCQliaXRzLmZsaXAoaiwgaSk7DQoJCQkJfQ0KCQkJfQ0KCQl9DQoJfQ0KCXRoaXMuaXNNYXNrZWQ9ZnVuY3Rpb24oIGksICBqKQ0KCXsNCgkJdmFyIHRlbXAgPSBpICogajsNCgkJcmV0dXJuICgoKHRlbXAgJiAweDAxKSArICh0ZW1wICUgMykpICYgMHgwMSkgPT0gMDsNCgl9DQp9DQpmdW5jdGlvbiBEYXRhTWFzazExMSgpDQp7DQoJdGhpcy51bm1hc2tCaXRNYXRyaXg9ZnVuY3Rpb24oYml0cywgIGRpbWVuc2lvbikNCgl7DQoJCWZvciAodmFyIGkgPSAwOyBpIDwgZGltZW5zaW9uOyBpKyspDQoJCXsNCgkJCWZvciAodmFyIGogPSAwOyBqIDwgZGltZW5zaW9uOyBqKyspDQoJCQl7DQoJCQkJaWYgKHRoaXMuaXNNYXNrZWQoaSwgaikpDQoJCQkJew0KCQkJCQliaXRzLmZsaXAoaiwgaSk7DQoJCQkJfQ0KCQkJfQ0KCQl9DQoJfQ0KCXRoaXMuaXNNYXNrZWQ9ZnVuY3Rpb24oIGksICBqKQ0KCXsNCgkJcmV0dXJuICgoKChpICsgaikgJiAweDAxKSArICgoaSAqIGopICUgMykpICYgMHgwMSkgPT0gMDsNCgl9DQp9DQoNCkRhdGFNYXNrLkRBVEFfTUFTS1MgPSBuZXcgQXJyYXkobmV3IERhdGFNYXNrMDAwKCksIG5ldyBEYXRhTWFzazAwMSgpLCBuZXcgRGF0YU1hc2swMTAoKSwgbmV3IERhdGFNYXNrMDExKCksIG5ldyBEYXRhTWFzazEwMCgpLCBuZXcgRGF0YU1hc2sxMDEoKSwgbmV3IERhdGFNYXNrMTEwKCksIG5ldyBEYXRhTWFzazExMSgpKTsNCg0K</uax:ByteString>
		</Value>
	</UAVariable>
	<UAVariable NodeId="ns=1;s=SYSTEM.LIBRARY.PROJECT.RESOURCES/QRCodeScanner/decoder.js" BrowseName="1:decoder.js" DataType="ByteString" AccessLevel="103" UserAccessLevel="103" Historizing="true">
		<DisplayName Locale="en">decoder.js</DisplayName>
		<Description Locale="en">decoder.js</Description>
		<References>
			<Reference ReferenceType="HasComponent" IsForward="false">ns=1;s=SYSTEM.LIBRARY.PROJECT.RESOURCES/QRCodeScanner</Reference>
			<Reference ReferenceType="HasTypeDefinition">ns=1;s=VariableTypes.ATVISE.Resource.Javascript</Reference>
			<Reference ReferenceType="HasProperty">ns=1;s=VariableTypes.ATVISE.Resource.Javascript.Compress</Reference>
		</References>
		<Value>
			<uax:ByteString>LyoNCiAgUG9ydGVkIHRvIEphdmFTY3JpcHQgYnkgTGF6YXIgTGFzemxvIDIwMTEgDQogIA0KICBsYXphcnNvZnRAZ21haWwuY29tLCB3d3cubGF6YXJzb2Z0LmluZm8NCiAgDQoqLw0KDQovKg0KKg0KKiBDb3B5cmlnaHQgMjAwNyBaWGluZyBhdXRob3JzDQoqDQoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOw0KKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuDQoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KKg0KKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KKg0KKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KKi8NCg0KDQp2YXIgRGVjb2Rlcj17fTsNCkRlY29kZXIucnNEZWNvZGVyID0gbmV3IFJlZWRTb2xvbW9uRGVjb2RlcihHRjI1Ni5RUl9DT0RFX0ZJRUxEKTsNCg0KRGVjb2Rlci5jb3JyZWN0RXJyb3JzPWZ1bmN0aW9uKCBjb2Rld29yZEJ5dGVzLCAgbnVtRGF0YUNvZGV3b3JkcykNCnsNCgl2YXIgbnVtQ29kZXdvcmRzID0gY29kZXdvcmRCeXRlcy5sZW5ndGg7DQoJLy8gRmlyc3QgcmVhZCBpbnRvIGFuIGFycmF5IG9mIGludHMNCgl2YXIgY29kZXdvcmRzSW50cyA9IG5ldyBBcnJheShudW1Db2Rld29yZHMpOw0KCWZvciAodmFyIGkgPSAwOyBpIDwgbnVtQ29kZXdvcmRzOyBpKyspDQoJew0KCQljb2Rld29yZHNJbnRzW2ldID0gY29kZXdvcmRCeXRlc1tpXSAmIDB4RkY7DQoJfQ0KCXZhciBudW1FQ0NvZGV3b3JkcyA9IGNvZGV3b3JkQnl0ZXMubGVuZ3RoIC0gbnVtRGF0YUNvZGV3b3JkczsNCgl0cnkNCgl7DQoJCURlY29kZXIucnNEZWNvZGVyLmRlY29kZShjb2Rld29yZHNJbnRzLCBudW1FQ0NvZGV3b3Jkcyk7DQoJCS8vdmFyIGNvcnJlY3RvciA9IG5ldyBSZWVkU29sb21vbihjb2Rld29yZHNJbnRzLCBudW1FQ0NvZGV3b3Jkcyk7DQoJCS8vY29ycmVjdG9yLmNvcnJlY3QoKTsNCgl9DQoJY2F0Y2ggKCByc2UpDQoJew0KCQl0aHJvdyByc2U7DQoJfQ0KCS8vIENvcHkgYmFjayBpbnRvIGFycmF5IG9mIGJ5dGVzIC0tIG9ubHkgbmVlZCB0byB3b3JyeSBhYm91dCB0aGUgYnl0ZXMgdGhhdCB3ZXJlIGRhdGENCgkvLyBXZSBkb24ndCBjYXJlIGFib3V0IGVycm9ycyBpbiB0aGUgZXJyb3ItY29ycmVjdGlvbiBjb2Rld29yZHMNCglmb3IgKHZhciBpID0gMDsgaSA8IG51bURhdGFDb2Rld29yZHM7IGkrKykNCgl7DQoJCWNvZGV3b3JkQnl0ZXNbaV0gPSAgY29kZXdvcmRzSW50c1tpXTsNCgl9DQp9DQoNCkRlY29kZXIuZGVjb2RlPWZ1bmN0aW9uKGJpdHMpDQp7DQoJdmFyIHBhcnNlciA9IG5ldyBCaXRNYXRyaXhQYXJzZXIoYml0cyk7DQoJdmFyIHZlcnNpb24gPSBwYXJzZXIucmVhZFZlcnNpb24oKTsNCgl2YXIgZWNMZXZlbCA9IHBhcnNlci5yZWFkRm9ybWF0SW5mb3JtYXRpb24oKS5FcnJvckNvcnJlY3Rpb25MZXZlbDsNCgkNCgkvLyBSZWFkIGNvZGV3b3Jkcw0KCXZhciBjb2Rld29yZHMgPSBwYXJzZXIucmVhZENvZGV3b3JkcygpOw0KDQoJLy8gU2VwYXJhdGUgaW50byBkYXRhIGJsb2Nrcw0KCXZhciBkYXRhQmxvY2tzID0gRGF0YUJsb2NrLmdldERhdGFCbG9ja3MoY29kZXdvcmRzLCB2ZXJzaW9uLCBlY0xldmVsKTsNCgkNCgkvLyBDb3VudCB0b3RhbCBudW1iZXIgb2YgZGF0YSBieXRlcw0KCXZhciB0b3RhbEJ5dGVzID0gMDsNCglmb3IgKHZhciBpID0gMDsgaSA8IGRhdGFCbG9ja3MubGVuZ3RoOyBpKyspDQoJew0KCQl0b3RhbEJ5dGVzICs9IGRhdGFCbG9ja3NbaV0uTnVtRGF0YUNvZGV3b3JkczsNCgl9DQoJdmFyIHJlc3VsdEJ5dGVzID0gbmV3IEFycmF5KHRvdGFsQnl0ZXMpOw0KCXZhciByZXN1bHRPZmZzZXQgPSAwOw0KCQ0KCS8vIEVycm9yLWNvcnJlY3QgYW5kIGNvcHkgZGF0YSBibG9ja3MgdG9nZXRoZXIgaW50byBhIHN0cmVhbSBvZiBieXRlcw0KCWZvciAodmFyIGogPSAwOyBqIDwgZGF0YUJsb2Nrcy5sZW5ndGg7IGorKykNCgl7DQoJCXZhciBkYXRhQmxvY2sgPSBkYXRhQmxvY2tzW2pdOw0KCQl2YXIgY29kZXdvcmRCeXRlcyA9IGRhdGFCbG9jay5Db2Rld29yZHM7DQoJCXZhciBudW1EYXRhQ29kZXdvcmRzID0gZGF0YUJsb2NrLk51bURhdGFDb2Rld29yZHM7DQoJCURlY29kZXIuY29ycmVjdEVycm9ycyhjb2Rld29yZEJ5dGVzLCBudW1EYXRhQ29kZXdvcmRzKTsNCgkJZm9yICh2YXIgaSA9IDA7IGkgPCBudW1EYXRhQ29kZXdvcmRzOyBpKyspDQoJCXsNCgkJCXJlc3VsdEJ5dGVzW3Jlc3VsdE9mZnNldCsrXSA9IGNvZGV3b3JkQnl0ZXNbaV07DQoJCX0NCgl9DQoJDQoJLy8gRGVjb2RlIHRoZSBjb250ZW50cyBvZiB0aGF0IHN0cmVhbSBvZiBieXRlcw0KCXZhciByZWFkZXIgPSBuZXcgUVJDb2RlRGF0YUJsb2NrUmVhZGVyKHJlc3VsdEJ5dGVzLCB2ZXJzaW9uLlZlcnNpb25OdW1iZXIsIGVjTGV2ZWwuQml0cyk7DQoJcmV0dXJuIHJlYWRlcjsNCgkvL3JldHVybiBEZWNvZGVkQml0U3RyZWFtUGFyc2VyLmRlY29kZShyZXN1bHRCeXRlcywgdmVyc2lvbiwgZWNMZXZlbCk7DQp9DQo=</uax:ByteString>
		</Value>
	</UAVariable>
	<UAVariable NodeId="ns=1;s=SYSTEM.LIBRARY.PROJECT.RESOURCES/QRCodeScanner/detector.js" BrowseName="1:detector.js" DataType="ByteString" AccessLevel="103" UserAccessLevel="103" Historizing="true">
		<DisplayName Locale="en">detector.js</DisplayName>
		<Description Locale="en">detector.js</Description>
		<References>
			<Reference ReferenceType="HasComponent" IsForward="false">ns=1;s=SYSTEM.LIBRARY.PROJECT.RESOURCES/QRCodeScanner</Reference>
			<Reference ReferenceType="HasTypeDefinition">ns=1;s=VariableTypes.ATVISE.Resource.Javascript</Reference>
			<Reference ReferenceType="HasProperty">ns=1;s=VariableTypes.ATVISE.Resource.Javascript.Compress</Reference>
		</References>
		<Value>
			<uax:ByteString>LyoNCiAgUG9ydGVkIHRvIEphdmFTY3JpcHQgYnkgTGF6YXIgTGFzemxvIDIwMTEgDQogIA0KICBsYXphcnNvZnRAZ21haWwuY29tLCB3d3cubGF6YXJzb2Z0LmluZm8NCiAgDQoqLw0KDQovKg0KKg0KKiBDb3B5cmlnaHQgMjAwNyBaWGluZyBhdXRob3JzDQoqDQoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOw0KKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuDQoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KKg0KKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KKg0KKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KKi8NCg0KDQpmdW5jdGlvbiBQZXJzcGVjdGl2ZVRyYW5zZm9ybSggYTExLCAgYTIxLCAgYTMxLCAgYTEyLCAgYTIyLCAgYTMyLCAgYTEzLCAgYTIzLCAgYTMzKQ0Kew0KCXRoaXMuYTExID0gYTExOw0KCXRoaXMuYTEyID0gYTEyOw0KCXRoaXMuYTEzID0gYTEzOw0KCXRoaXMuYTIxID0gYTIxOw0KCXRoaXMuYTIyID0gYTIyOw0KCXRoaXMuYTIzID0gYTIzOw0KCXRoaXMuYTMxID0gYTMxOw0KCXRoaXMuYTMyID0gYTMyOw0KCXRoaXMuYTMzID0gYTMzOw0KCXRoaXMudHJhbnNmb3JtUG9pbnRzMT1mdW5jdGlvbiggcG9pbnRzKQ0KCQl7DQoJCQl2YXIgbWF4ID0gcG9pbnRzLmxlbmd0aDsNCgkJCXZhciBhMTEgPSB0aGlzLmExMTsNCgkJCXZhciBhMTIgPSB0aGlzLmExMjsNCgkJCXZhciBhMTMgPSB0aGlzLmExMzsNCgkJCXZhciBhMjEgPSB0aGlzLmEyMTsNCgkJCXZhciBhMjIgPSB0aGlzLmEyMjsNCgkJCXZhciBhMjMgPSB0aGlzLmEyMzsNCgkJCXZhciBhMzEgPSB0aGlzLmEzMTsNCgkJCXZhciBhMzIgPSB0aGlzLmEzMjsNCgkJCXZhciBhMzMgPSB0aGlzLmEzMzsNCgkJCWZvciAodmFyIGkgPSAwOyBpIDwgbWF4OyBpICs9IDIpDQoJCQl7DQoJCQkJdmFyIHggPSBwb2ludHNbaV07DQoJCQkJdmFyIHkgPSBwb2ludHNbaSArIDFdOw0KCQkJCXZhciBkZW5vbWluYXRvciA9IGExMyAqIHggKyBhMjMgKiB5ICsgYTMzOw0KCQkJCXBvaW50c1tpXSA9IChhMTEgKiB4ICsgYTIxICogeSArIGEzMSkgLyBkZW5vbWluYXRvcjsNCgkJCQlwb2ludHNbaSArIDFdID0gKGExMiAqIHggKyBhMjIgKiB5ICsgYTMyKSAvIGRlbm9taW5hdG9yOw0KCQkJfQ0KCQl9DQoJdGhpcy4gdHJhbnNmb3JtUG9pbnRzMj1mdW5jdGlvbih4VmFsdWVzLCB5VmFsdWVzKQ0KCQl7DQoJCQl2YXIgbiA9IHhWYWx1ZXMubGVuZ3RoOw0KCQkJZm9yICh2YXIgaSA9IDA7IGkgPCBuOyBpKyspDQoJCQl7DQoJCQkJdmFyIHggPSB4VmFsdWVzW2ldOw0KCQkJCXZhciB5ID0geVZhbHVlc1tpXTsNCgkJCQl2YXIgZGVub21pbmF0b3IgPSB0aGlzLmExMyAqIHggKyB0aGlzLmEyMyAqIHkgKyB0aGlzLmEzMzsNCgkJCQl4VmFsdWVzW2ldID0gKHRoaXMuYTExICogeCArIHRoaXMuYTIxICogeSArIHRoaXMuYTMxKSAvIGRlbm9taW5hdG9yOw0KCQkJCXlWYWx1ZXNbaV0gPSAodGhpcy5hMTIgKiB4ICsgdGhpcy5hMjIgKiB5ICsgdGhpcy5hMzIpIC8gZGVub21pbmF0b3I7DQoJCQl9DQoJCX0NCg0KCXRoaXMuYnVpbGRBZGpvaW50PWZ1bmN0aW9uKCkNCgkJew0KCQkJLy8gQWRqb2ludCBpcyB0aGUgdHJhbnNwb3NlIG9mIHRoZSBjb2ZhY3RvciBtYXRyaXg6DQoJCQlyZXR1cm4gbmV3IFBlcnNwZWN0aXZlVHJhbnNmb3JtKHRoaXMuYTIyICogdGhpcy5hMzMgLSB0aGlzLmEyMyAqIHRoaXMuYTMyLCB0aGlzLmEyMyAqIHRoaXMuYTMxIC0gdGhpcy5hMjEgKiB0aGlzLmEzMywgdGhpcy5hMjEgKiB0aGlzLmEzMiAtIHRoaXMuYTIyICogdGhpcy5hMzEsIHRoaXMuYTEzICogdGhpcy5hMzIgLSB0aGlzLmExMiAqIHRoaXMuYTMzLCB0aGlzLmExMSAqIHRoaXMuYTMzIC0gdGhpcy5hMTMgKiB0aGlzLmEzMSwgdGhpcy5hMTIgKiB0aGlzLmEzMSAtIHRoaXMuYTExICogdGhpcy5hMzIsIHRoaXMuYTEyICogdGhpcy5hMjMgLSB0aGlzLmExMyAqIHRoaXMuYTIyLCB0aGlzLmExMyAqIHRoaXMuYTIxIC0gdGhpcy5hMTEgKiB0aGlzLmEyMywgdGhpcy5hMTEgKiB0aGlzLmEyMiAtIHRoaXMuYTEyICogdGhpcy5hMjEpOw0KCQl9DQoJdGhpcy50aW1lcz1mdW5jdGlvbiggb3RoZXIpDQoJCXsNCgkJCXJldHVybiBuZXcgUGVyc3BlY3RpdmVUcmFuc2Zvcm0odGhpcy5hMTEgKiBvdGhlci5hMTEgKyB0aGlzLmEyMSAqIG90aGVyLmExMiArIHRoaXMuYTMxICogb3RoZXIuYTEzLCB0aGlzLmExMSAqIG90aGVyLmEyMSArIHRoaXMuYTIxICogb3RoZXIuYTIyICsgdGhpcy5hMzEgKiBvdGhlci5hMjMsIHRoaXMuYTExICogb3RoZXIuYTMxICsgdGhpcy5hMjEgKiBvdGhlci5hMzIgKyB0aGlzLmEzMSAqIG90aGVyLmEzMywgdGhpcy5hMTIgKiBvdGhlci5hMTEgKyB0aGlzLmEyMiAqIG90aGVyLmExMiArIHRoaXMuYTMyICogb3RoZXIuYTEzLCB0aGlzLmExMiAqIG90aGVyLmEyMSArIHRoaXMuYTIyICogb3RoZXIuYTIyICsgdGhpcy5hMzIgKiBvdGhlci5hMjMsIHRoaXMuYTEyICogb3RoZXIuYTMxICsgdGhpcy5hMjIgKiBvdGhlci5hMzIgKyB0aGlzLmEzMiAqIG90aGVyLmEzMywgdGhpcy5hMTMgKiBvdGhlci5hMTEgKyB0aGlzLmEyMyAqIG90aGVyLmExMiArdGhpcy5hMzMgKiBvdGhlci5hMTMsIHRoaXMuYTEzICogb3RoZXIuYTIxICsgdGhpcy5hMjMgKiBvdGhlci5hMjIgKyB0aGlzLmEzMyAqIG90aGVyLmEyMywgdGhpcy5hMTMgKiBvdGhlci5hMzEgKyB0aGlzLmEyMyAqIG90aGVyLmEzMiArIHRoaXMuYTMzICogb3RoZXIuYTMzKTsNCgkJfQ0KDQp9DQoNClBlcnNwZWN0aXZlVHJhbnNmb3JtLnF1YWRyaWxhdGVyYWxUb1F1YWRyaWxhdGVyYWw9ZnVuY3Rpb24oIHgwLCAgeTAsICB4MSwgIHkxLCAgeDIsICB5MiwgIHgzLCAgeTMsICB4MHAsICB5MHAsICB4MXAsICB5MXAsICB4MnAsICB5MnAsICB4M3AsICB5M3ApDQp7DQoJDQoJdmFyIHFUb1MgPSB0aGlzLnF1YWRyaWxhdGVyYWxUb1NxdWFyZSh4MCwgeTAsIHgxLCB5MSwgeDIsIHkyLCB4MywgeTMpOw0KCXZhciBzVG9RID0gdGhpcy5zcXVhcmVUb1F1YWRyaWxhdGVyYWwoeDBwLCB5MHAsIHgxcCwgeTFwLCB4MnAsIHkycCwgeDNwLCB5M3ApOw0KCXJldHVybiBzVG9RLnRpbWVzKHFUb1MpOw0KfQ0KDQpQZXJzcGVjdGl2ZVRyYW5zZm9ybS5zcXVhcmVUb1F1YWRyaWxhdGVyYWw9ZnVuY3Rpb24oIHgwLCAgeTAsICB4MSwgIHkxLCAgeDIsICB5MiwgIHgzLCAgeTMpDQp7DQoJdmFyIGR5MiA9IHkzIC0geTI7DQoJdmFyIGR5MyA9IHkwIC0geTEgKyB5MiAtIHkzOw0KCWlmIChkeTIgPT0gMC4wICYmIGR5MyA9PSAwLjApDQoJew0KCQlyZXR1cm4gbmV3IFBlcnNwZWN0aXZlVHJhbnNmb3JtKHgxIC0geDAsIHgyIC0geDEsIHgwLCB5MSAtIHkwLCB5MiAtIHkxLCB5MCwgMC4wLCAwLjAsIDEuMCk7DQoJfQ0KCWVsc2UNCgl7DQoJCXZhciBkeDEgPSB4MSAtIHgyOw0KCQl2YXIgZHgyID0geDMgLSB4MjsNCgkJdmFyIGR4MyA9IHgwIC0geDEgKyB4MiAtIHgzOw0KCQl2YXIgZHkxID0geTEgLSB5MjsNCgkJdmFyIGRlbm9taW5hdG9yID0gZHgxICogZHkyIC0gZHgyICogZHkxOw0KCQl2YXIgYTEzID0gKGR4MyAqIGR5MiAtIGR4MiAqIGR5MykgLyBkZW5vbWluYXRvcjsNCgkJdmFyIGEyMyA9IChkeDEgKiBkeTMgLSBkeDMgKiBkeTEpIC8gZGVub21pbmF0b3I7DQoJCXJldHVybiBuZXcgUGVyc3BlY3RpdmVUcmFuc2Zvcm0oeDEgLSB4MCArIGExMyAqIHgxLCB4MyAtIHgwICsgYTIzICogeDMsIHgwLCB5MSAtIHkwICsgYTEzICogeTEsIHkzIC0geTAgKyBhMjMgKiB5MywgeTAsIGExMywgYTIzLCAxLjApOw0KCX0NCn0NCg0KUGVyc3BlY3RpdmVUcmFuc2Zvcm0ucXVhZHJpbGF0ZXJhbFRvU3F1YXJlPWZ1bmN0aW9uKCB4MCwgIHkwLCAgeDEsICB5MSwgIHgyLCAgeTIsICB4MywgIHkzKQ0Kew0KCS8vIEhlcmUsIHRoZSBhZGpvaW50IHNlcnZlcyBhcyB0aGUgaW52ZXJzZToNCglyZXR1cm4gdGhpcy5zcXVhcmVUb1F1YWRyaWxhdGVyYWwoeDAsIHkwLCB4MSwgeTEsIHgyLCB5MiwgeDMsIHkzKS5idWlsZEFkam9pbnQoKTsNCn0NCg0KZnVuY3Rpb24gRGV0ZWN0b3JSZXN1bHQoYml0cywgIHBvaW50cykNCnsNCgl0aGlzLmJpdHMgPSBiaXRzOw0KCXRoaXMucG9pbnRzID0gcG9pbnRzOw0KfQ0KDQoNCmZ1bmN0aW9uIERldGVjdG9yKGltYWdlKQ0Kew0KCXRoaXMuaW1hZ2U9aW1hZ2U7DQoJdGhpcy5yZXN1bHRQb2ludENhbGxiYWNrID0gbnVsbDsNCgkNCgl0aGlzLnNpemVPZkJsYWNrV2hpdGVCbGFja1J1bj1mdW5jdGlvbiggZnJvbVgsICBmcm9tWSwgIHRvWCwgIHRvWSkNCgkJew0KCQkJLy8gTWlsZCB2YXJpYW50IG9mIEJyZXNlbmhhbSdzIGFsZ29yaXRobTsNCgkJCS8vIHNlZSBodHRwOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0JyZXNlbmhhbSdzX2xpbmVfYWxnb3JpdGhtDQoJCQl2YXIgc3RlZXAgPSBNYXRoLmFicyh0b1kgLSBmcm9tWSkgPiBNYXRoLmFicyh0b1ggLSBmcm9tWCk7DQoJCQlpZiAoc3RlZXApDQoJCQl7DQoJCQkJdmFyIHRlbXAgPSBmcm9tWDsNCgkJCQlmcm9tWCA9IGZyb21ZOw0KCQkJCWZyb21ZID0gdGVtcDsNCgkJCQl0ZW1wID0gdG9YOw0KCQkJCXRvWCA9IHRvWTsNCgkJCQl0b1kgPSB0ZW1wOw0KCQkJfQ0KCQkJDQoJCQl2YXIgZHggPSBNYXRoLmFicyh0b1ggLSBmcm9tWCk7DQoJCQl2YXIgZHkgPSBNYXRoLmFicyh0b1kgLSBmcm9tWSk7DQoJCQl2YXIgZXJyb3IgPSAtIGR4ID4+IDE7DQoJCQl2YXIgeXN0ZXAgPSBmcm9tWSA8IHRvWT8xOi0gMTsNCgkJCXZhciB4c3RlcCA9IGZyb21YIDwgdG9YPzE6LSAxOw0KCQkJdmFyIHN0YXRlID0gMDsgLy8gSW4gYmxhY2sgcGl4ZWxzLCBsb29raW5nIGZvciB3aGl0ZSwgZmlyc3Qgb3Igc2Vjb25kIHRpbWUNCgkJCWZvciAodmFyIHggPSBmcm9tWCwgeSA9IGZyb21ZOyB4ICE9IHRvWDsgeCArPSB4c3RlcCkNCgkJCXsNCgkJCQkNCgkJCQl2YXIgcmVhbFggPSBzdGVlcD95Ong7DQoJCQkJdmFyIHJlYWxZID0gc3RlZXA/eDp5Ow0KCQkJCWlmIChzdGF0ZSA9PSAxKQ0KCQkJCXsNCgkJCQkJLy8gSW4gd2hpdGUgcGl4ZWxzLCBsb29raW5nIGZvciBibGFjaw0KCQkJCQlpZiAodGhpcy5pbWFnZVtyZWFsWCArIHJlYWxZKnFyY29kZS53aWR0aF0pDQoJCQkJCXsNCgkJCQkJCXN0YXRlKys7DQoJCQkJCX0NCgkJCQl9DQoJCQkJZWxzZQ0KCQkJCXsNCgkJCQkJaWYgKCF0aGlzLmltYWdlW3JlYWxYICsgcmVhbFkqcXJjb2RlLndpZHRoXSkNCgkJCQkJew0KCQkJCQkJc3RhdGUrKzsNCgkJCQkJfQ0KCQkJCX0NCgkJCQkNCgkJCQlpZiAoc3RhdGUgPT0gMykNCgkJCQl7DQoJCQkJCS8vIEZvdW5kIGJsYWNrLCB3aGl0ZSwgYmxhY2ssIGFuZCBzdHVtYmxlZCBiYWNrIG9udG8gd2hpdGU7IGRvbmUNCgkJCQkJdmFyIGRpZmZYID0geCAtIGZyb21YOw0KCQkJCQl2YXIgZGlmZlkgPSB5IC0gZnJvbVk7DQoJCQkJCXJldHVybiAgTWF0aC5zcXJ0KCAoZGlmZlggKiBkaWZmWCArIGRpZmZZICogZGlmZlkpKTsNCgkJCQl9DQoJCQkJZXJyb3IgKz0gZHk7DQoJCQkJaWYgKGVycm9yID4gMCkNCgkJCQl7DQoJCQkJCWlmICh5ID09IHRvWSkNCgkJCQkJew0KCQkJCQkJYnJlYWs7DQoJCQkJCX0NCgkJCQkJeSArPSB5c3RlcDsNCgkJCQkJZXJyb3IgLT0gZHg7DQoJCQkJfQ0KCQkJfQ0KCQkJdmFyIGRpZmZYMiA9IHRvWCAtIGZyb21YOw0KCQkJdmFyIGRpZmZZMiA9IHRvWSAtIGZyb21ZOw0KCQkJcmV0dXJuICBNYXRoLnNxcnQoIChkaWZmWDIgKiBkaWZmWDIgKyBkaWZmWTIgKiBkaWZmWTIpKTsNCgkJfQ0KDQoJDQoJdGhpcy5zaXplT2ZCbGFja1doaXRlQmxhY2tSdW5Cb3RoV2F5cz1mdW5jdGlvbiggZnJvbVgsICBmcm9tWSwgIHRvWCwgIHRvWSkNCgkJew0KCQkJDQoJCQl2YXIgcmVzdWx0ID0gdGhpcy5zaXplT2ZCbGFja1doaXRlQmxhY2tSdW4oZnJvbVgsIGZyb21ZLCB0b1gsIHRvWSk7DQoJCQkNCgkJCS8vIE5vdyBjb3VudCBvdGhlciB3YXkgLS0gZG9uJ3QgcnVuIG9mZiBpbWFnZSB0aG91Z2ggb2YgY291cnNlDQoJCQl2YXIgc2NhbGUgPSAxLjA7DQoJCQl2YXIgb3RoZXJUb1ggPSBmcm9tWCAtICh0b1ggLSBmcm9tWCk7DQoJCQlpZiAob3RoZXJUb1ggPCAwKQ0KCQkJew0KCQkJCXNjYWxlID0gIGZyb21YIC8gIChmcm9tWCAtIG90aGVyVG9YKTsNCgkJCQlvdGhlclRvWCA9IDA7DQoJCQl9DQoJCQllbHNlIGlmIChvdGhlclRvWCA+PSBxcmNvZGUud2lkdGgpDQoJCQl7DQoJCQkJc2NhbGUgPSAgKHFyY29kZS53aWR0aCAtIDEgLSBmcm9tWCkgLyAgKG90aGVyVG9YIC0gZnJvbVgpOw0KCQkJCW90aGVyVG9YID0gcXJjb2RlLndpZHRoIC0gMTsNCgkJCX0NCgkJCXZhciBvdGhlclRvWSA9IE1hdGguZmxvb3IgKGZyb21ZIC0gKHRvWSAtIGZyb21ZKSAqIHNjYWxlKTsNCgkJCQ0KCQkJc2NhbGUgPSAxLjA7DQoJCQlpZiAob3RoZXJUb1kgPCAwKQ0KCQkJew0KCQkJCXNjYWxlID0gIGZyb21ZIC8gIChmcm9tWSAtIG90aGVyVG9ZKTsNCgkJCQlvdGhlclRvWSA9IDA7DQoJCQl9DQoJCQllbHNlIGlmIChvdGhlclRvWSA+PSBxcmNvZGUuaGVpZ2h0KQ0KCQkJew0KCQkJCXNjYWxlID0gIChxcmNvZGUuaGVpZ2h0IC0gMSAtIGZyb21ZKSAvICAob3RoZXJUb1kgLSBmcm9tWSk7DQoJCQkJb3RoZXJUb1kgPSBxcmNvZGUuaGVpZ2h0IC0gMTsNCgkJCX0NCgkJCW90aGVyVG9YID0gTWF0aC5mbG9vciAoZnJvbVggKyAob3RoZXJUb1ggLSBmcm9tWCkgKiBzY2FsZSk7DQoJCQkNCgkJCXJlc3VsdCArPSB0aGlzLnNpemVPZkJsYWNrV2hpdGVCbGFja1J1bihmcm9tWCwgZnJvbVksIG90aGVyVG9YLCBvdGhlclRvWSk7DQoJCQlyZXR1cm4gcmVzdWx0IC0gMS4wOyAvLyAtMSBiZWNhdXNlIHdlIGNvdW50ZWQgdGhlIG1pZGRsZSBwaXhlbCB0d2ljZQ0KCQl9DQoJCQ0KDQoJDQoJdGhpcy5jYWxjdWxhdGVNb2R1bGVTaXplT25lV2F5PWZ1bmN0aW9uKCBwYXR0ZXJuLCAgb3RoZXJQYXR0ZXJuKQ0KCQl7DQoJCQl2YXIgbW9kdWxlU2l6ZUVzdDEgPSB0aGlzLnNpemVPZkJsYWNrV2hpdGVCbGFja1J1bkJvdGhXYXlzKE1hdGguZmxvb3IoIHBhdHRlcm4uWCksIE1hdGguZmxvb3IoIHBhdHRlcm4uWSksIE1hdGguZmxvb3IoIG90aGVyUGF0dGVybi5YKSwgTWF0aC5mbG9vcihvdGhlclBhdHRlcm4uWSkpOw0KCQkJdmFyIG1vZHVsZVNpemVFc3QyID0gdGhpcy5zaXplT2ZCbGFja1doaXRlQmxhY2tSdW5Cb3RoV2F5cyhNYXRoLmZsb29yKG90aGVyUGF0dGVybi5YKSwgTWF0aC5mbG9vcihvdGhlclBhdHRlcm4uWSksIE1hdGguZmxvb3IoIHBhdHRlcm4uWCksIE1hdGguZmxvb3IocGF0dGVybi5ZKSk7DQoJCQlpZiAoaXNOYU4obW9kdWxlU2l6ZUVzdDEpKQ0KCQkJew0KCQkJCXJldHVybiBtb2R1bGVTaXplRXN0MiAvIDcuMDsNCgkJCX0NCgkJCWlmIChpc05hTihtb2R1bGVTaXplRXN0MikpDQoJCQl7DQoJCQkJcmV0dXJuIG1vZHVsZVNpemVFc3QxIC8gNy4wOw0KCQkJfQ0KCQkJLy8gQXZlcmFnZSB0aGVtLCBhbmQgZGl2aWRlIGJ5IDcgc2luY2Ugd2UndmUgY291bnRlZCB0aGUgd2lkdGggb2YgMyBibGFjayBtb2R1bGVzLA0KCQkJLy8gYW5kIDEgd2hpdGUgYW5kIDEgYmxhY2sgbW9kdWxlIG9uIGVpdGhlciBzaWRlLiBFcmdvLCBkaXZpZGUgc3VtIGJ5IDE0Lg0KCQkJcmV0dXJuIChtb2R1bGVTaXplRXN0MSArIG1vZHVsZVNpemVFc3QyKSAvIDE0LjA7DQoJCX0NCg0KCQ0KCXRoaXMuY2FsY3VsYXRlTW9kdWxlU2l6ZT1mdW5jdGlvbiggdG9wTGVmdCwgIHRvcFJpZ2h0LCAgYm90dG9tTGVmdCkNCgkJew0KCQkJLy8gVGFrZSB0aGUgYXZlcmFnZQ0KCQkJcmV0dXJuICh0aGlzLmNhbGN1bGF0ZU1vZHVsZVNpemVPbmVXYXkodG9wTGVmdCwgdG9wUmlnaHQpICsgdGhpcy5jYWxjdWxhdGVNb2R1bGVTaXplT25lV2F5KHRvcExlZnQsIGJvdHRvbUxlZnQpKSAvIDIuMDsNCgkJfQ0KDQoJdGhpcy5kaXN0YW5jZT1mdW5jdGlvbiggcGF0dGVybjEsICBwYXR0ZXJuMikNCgl7DQoJCXZhciB4RGlmZiA9IHBhdHRlcm4xLlggLSBwYXR0ZXJuMi5YOw0KCQl2YXIgeURpZmYgPSBwYXR0ZXJuMS5ZIC0gcGF0dGVybjIuWTsNCgkJcmV0dXJuICBNYXRoLnNxcnQoICh4RGlmZiAqIHhEaWZmICsgeURpZmYgKiB5RGlmZikpOw0KCX0NCgl0aGlzLmNvbXB1dGVEaW1lbnNpb249ZnVuY3Rpb24oIHRvcExlZnQsICB0b3BSaWdodCwgIGJvdHRvbUxlZnQsICBtb2R1bGVTaXplKQ0KCQl7DQoJCQkNCgkJCXZhciB0bHRyQ2VudGVyc0RpbWVuc2lvbiA9IE1hdGgucm91bmQodGhpcy5kaXN0YW5jZSh0b3BMZWZ0LCB0b3BSaWdodCkgLyBtb2R1bGVTaXplKTsNCgkJCXZhciB0bGJsQ2VudGVyc0RpbWVuc2lvbiA9IE1hdGgucm91bmQodGhpcy5kaXN0YW5jZSh0b3BMZWZ0LCBib3R0b21MZWZ0KSAvIG1vZHVsZVNpemUpOw0KCQkJdmFyIGRpbWVuc2lvbiA9ICgodGx0ckNlbnRlcnNEaW1lbnNpb24gKyB0bGJsQ2VudGVyc0RpbWVuc2lvbikgPj4gMSkgKyA3Ow0KCQkJc3dpdGNoIChkaW1lbnNpb24gJiAweDAzKQ0KCQkJew0KCQkJCQ0KCQkJCS8vIG1vZCA0DQoJCQkJY2FzZSAwOiANCgkJCQkJZGltZW5zaW9uKys7DQoJCQkJCWJyZWFrOw0KCQkJCQkvLyAxPyBkbyBub3RoaW5nDQoJCQkJDQoJCQkJY2FzZSAyOiANCgkJCQkJZGltZW5zaW9uLS07DQoJCQkJCWJyZWFrOw0KCQkJCQ0KCQkJCWNhc2UgMzogDQoJCQkJCXRocm93ICJFcnJvciI7DQoJCQkJfQ0KCQkJcmV0dXJuIGRpbWVuc2lvbjsNCgkJfQ0KDQoJdGhpcy5maW5kQWxpZ25tZW50SW5SZWdpb249ZnVuY3Rpb24oIG92ZXJhbGxFc3RNb2R1bGVTaXplLCAgZXN0QWxpZ25tZW50WCwgIGVzdEFsaWdubWVudFksICBhbGxvd2FuY2VGYWN0b3IpDQoJCXsNCgkJCS8vIExvb2sgZm9yIGFuIGFsaWdubWVudCBwYXR0ZXJuICgzIG1vZHVsZXMgaW4gc2l6ZSkgYXJvdW5kIHdoZXJlIGl0DQoJCQkvLyBzaG91bGQgYmUNCgkJCXZhciBhbGxvd2FuY2UgPSBNYXRoLmZsb29yIChhbGxvd2FuY2VGYWN0b3IgKiBvdmVyYWxsRXN0TW9kdWxlU2l6ZSk7DQoJCQl2YXIgYWxpZ25tZW50QXJlYUxlZnRYID0gTWF0aC5tYXgoMCwgZXN0QWxpZ25tZW50WCAtIGFsbG93YW5jZSk7DQoJCQl2YXIgYWxpZ25tZW50QXJlYVJpZ2h0WCA9IE1hdGgubWluKHFyY29kZS53aWR0aCAtIDEsIGVzdEFsaWdubWVudFggKyBhbGxvd2FuY2UpOw0KCQkJaWYgKGFsaWdubWVudEFyZWFSaWdodFggLSBhbGlnbm1lbnRBcmVhTGVmdFggPCBvdmVyYWxsRXN0TW9kdWxlU2l6ZSAqIDMpDQoJCQl7DQoJCQkJdGhyb3cgIkVycm9yIjsNCgkJCX0NCgkJCQ0KCQkJdmFyIGFsaWdubWVudEFyZWFUb3BZID0gTWF0aC5tYXgoMCwgZXN0QWxpZ25tZW50WSAtIGFsbG93YW5jZSk7DQoJCQl2YXIgYWxpZ25tZW50QXJlYUJvdHRvbVkgPSBNYXRoLm1pbihxcmNvZGUuaGVpZ2h0IC0gMSwgZXN0QWxpZ25tZW50WSArIGFsbG93YW5jZSk7DQoJCQkNCgkJCXZhciBhbGlnbm1lbnRGaW5kZXIgPSBuZXcgQWxpZ25tZW50UGF0dGVybkZpbmRlcih0aGlzLmltYWdlLCBhbGlnbm1lbnRBcmVhTGVmdFgsIGFsaWdubWVudEFyZWFUb3BZLCBhbGlnbm1lbnRBcmVhUmlnaHRYIC0gYWxpZ25tZW50QXJlYUxlZnRYLCBhbGlnbm1lbnRBcmVhQm90dG9tWSAtIGFsaWdubWVudEFyZWFUb3BZLCBvdmVyYWxsRXN0TW9kdWxlU2l6ZSwgdGhpcy5yZXN1bHRQb2ludENhbGxiYWNrKTsNCgkJCXJldHVybiBhbGlnbm1lbnRGaW5kZXIuZmluZCgpOw0KCQl9DQoJCQ0KCXRoaXMuY3JlYXRlVHJhbnNmb3JtPWZ1bmN0aW9uKCB0b3BMZWZ0LCAgdG9wUmlnaHQsICBib3R0b21MZWZ0LCBhbGlnbm1lbnRQYXR0ZXJuLCBkaW1lbnNpb24pDQoJCXsNCgkJCXZhciBkaW1NaW51c1RocmVlID0gIGRpbWVuc2lvbiAtIDMuNTsNCgkJCXZhciBib3R0b21SaWdodFg7DQoJCQl2YXIgYm90dG9tUmlnaHRZOw0KCQkJdmFyIHNvdXJjZUJvdHRvbVJpZ2h0WDsNCgkJCXZhciBzb3VyY2VCb3R0b21SaWdodFk7DQoJCQlpZiAoYWxpZ25tZW50UGF0dGVybiAhPSBudWxsKQ0KCQkJew0KCQkJCWJvdHRvbVJpZ2h0WCA9IGFsaWdubWVudFBhdHRlcm4uWDsNCgkJCQlib3R0b21SaWdodFkgPSBhbGlnbm1lbnRQYXR0ZXJuLlk7DQoJCQkJc291cmNlQm90dG9tUmlnaHRYID0gc291cmNlQm90dG9tUmlnaHRZID0gZGltTWludXNUaHJlZSAtIDMuMDsNCgkJCX0NCgkJCWVsc2UNCgkJCXsNCgkJCQkvLyBEb24ndCBoYXZlIGFuIGFsaWdubWVudCBwYXR0ZXJuLCBqdXN0IG1ha2UgdXAgdGhlIGJvdHRvbS1yaWdodCBwb2ludA0KCQkJCWJvdHRvbVJpZ2h0WCA9ICh0b3BSaWdodC5YIC0gdG9wTGVmdC5YKSArIGJvdHRvbUxlZnQuWDsNCgkJCQlib3R0b21SaWdodFkgPSAodG9wUmlnaHQuWSAtIHRvcExlZnQuWSkgKyBib3R0b21MZWZ0Llk7DQoJCQkJc291cmNlQm90dG9tUmlnaHRYID0gc291cmNlQm90dG9tUmlnaHRZID0gZGltTWludXNUaHJlZTsNCgkJCX0NCgkJCQ0KCQkJdmFyIHRyYW5zZm9ybSA9IFBlcnNwZWN0aXZlVHJhbnNmb3JtLnF1YWRyaWxhdGVyYWxUb1F1YWRyaWxhdGVyYWwoMy41LCAzLjUsIGRpbU1pbnVzVGhyZWUsIDMuNSwgc291cmNlQm90dG9tUmlnaHRYLCBzb3VyY2VCb3R0b21SaWdodFksIDMuNSwgZGltTWludXNUaHJlZSwgdG9wTGVmdC5YLCB0b3BMZWZ0LlksIHRvcFJpZ2h0LlgsIHRvcFJpZ2h0LlksIGJvdHRvbVJpZ2h0WCwgYm90dG9tUmlnaHRZLCBib3R0b21MZWZ0LlgsIGJvdHRvbUxlZnQuWSk7DQoJCQkNCgkJCXJldHVybiB0cmFuc2Zvcm07DQoJCX0JCQ0KCQ0KCXRoaXMuc2FtcGxlR3JpZD1mdW5jdGlvbiggaW1hZ2UsICB0cmFuc2Zvcm0sICBkaW1lbnNpb24pDQoJCXsNCgkJCQ0KCQkJdmFyIHNhbXBsZXIgPSBHcmlkU2FtcGxlcjsNCgkJCXJldHVybiBzYW1wbGVyLnNhbXBsZUdyaWQzKGltYWdlLCBkaW1lbnNpb24sIHRyYW5zZm9ybSk7DQoJCX0NCgkNCgl0aGlzLnByb2Nlc3NGaW5kZXJQYXR0ZXJuSW5mbyA9IGZ1bmN0aW9uKCBpbmZvKQ0KCQl7DQoJCQkNCgkJCXZhciB0b3BMZWZ0ID0gaW5mby5Ub3BMZWZ0Ow0KCQkJdmFyIHRvcFJpZ2h0ID0gaW5mby5Ub3BSaWdodDsNCgkJCXZhciBib3R0b21MZWZ0ID0gaW5mby5Cb3R0b21MZWZ0Ow0KCQkJDQoJCQl2YXIgbW9kdWxlU2l6ZSA9IHRoaXMuY2FsY3VsYXRlTW9kdWxlU2l6ZSh0b3BMZWZ0LCB0b3BSaWdodCwgYm90dG9tTGVmdCk7DQoJCQlpZiAobW9kdWxlU2l6ZSA8IDEuMCkNCgkJCXsNCgkJCQl0aHJvdyAiRXJyb3IiOw0KCQkJfQ0KCQkJdmFyIGRpbWVuc2lvbiA9IHRoaXMuY29tcHV0ZURpbWVuc2lvbih0b3BMZWZ0LCB0b3BSaWdodCwgYm90dG9tTGVmdCwgbW9kdWxlU2l6ZSk7DQoJCQl2YXIgcHJvdmlzaW9uYWxWZXJzaW9uID0gVmVyc2lvbi5nZXRQcm92aXNpb25hbFZlcnNpb25Gb3JEaW1lbnNpb24oZGltZW5zaW9uKTsNCgkJCXZhciBtb2R1bGVzQmV0d2VlbkZQQ2VudGVycyA9IHByb3Zpc2lvbmFsVmVyc2lvbi5EaW1lbnNpb25Gb3JWZXJzaW9uIC0gNzsNCgkJCQ0KCQkJdmFyIGFsaWdubWVudFBhdHRlcm4gPSBudWxsOw0KCQkJLy8gQW55dGhpbmcgYWJvdmUgdmVyc2lvbiAxIGhhcyBhbiBhbGlnbm1lbnQgcGF0dGVybg0KCQkJaWYgKHByb3Zpc2lvbmFsVmVyc2lvbi5BbGlnbm1lbnRQYXR0ZXJuQ2VudGVycy5sZW5ndGggPiAwKQ0KCQkJew0KCQkJCQ0KCQkJCS8vIEd1ZXNzIHdoZXJlIGEgImJvdHRvbSByaWdodCIgZmluZGVyIHBhdHRlcm4gd291bGQgaGF2ZSBiZWVuDQoJCQkJdmFyIGJvdHRvbVJpZ2h0WCA9IHRvcFJpZ2h0LlggLSB0b3BMZWZ0LlggKyBib3R0b21MZWZ0Llg7DQoJCQkJdmFyIGJvdHRvbVJpZ2h0WSA9IHRvcFJpZ2h0LlkgLSB0b3BMZWZ0LlkgKyBib3R0b21MZWZ0Llk7DQoJCQkJDQoJCQkJLy8gRXN0aW1hdGUgdGhhdCBhbGlnbm1lbnQgcGF0dGVybiBpcyBjbG9zZXIgYnkgMyBtb2R1bGVzDQoJCQkJLy8gZnJvbSAiYm90dG9tIHJpZ2h0IiB0byBrbm93biB0b3AgbGVmdCBsb2NhdGlvbg0KCQkJCXZhciBjb3JyZWN0aW9uVG9Ub3BMZWZ0ID0gMS4wIC0gMy4wIC8gIG1vZHVsZXNCZXR3ZWVuRlBDZW50ZXJzOw0KCQkJCXZhciBlc3RBbGlnbm1lbnRYID0gTWF0aC5mbG9vciAodG9wTGVmdC5YICsgY29ycmVjdGlvblRvVG9wTGVmdCAqIChib3R0b21SaWdodFggLSB0b3BMZWZ0LlgpKTsNCgkJCQl2YXIgZXN0QWxpZ25tZW50WSA9IE1hdGguZmxvb3IgKHRvcExlZnQuWSArIGNvcnJlY3Rpb25Ub1RvcExlZnQgKiAoYm90dG9tUmlnaHRZIC0gdG9wTGVmdC5ZKSk7DQoJCQkJDQoJCQkJLy8gS2luZCBvZiBhcmJpdHJhcnkgLS0gZXhwYW5kIHNlYXJjaCByYWRpdXMgYmVmb3JlIGdpdmluZyB1cA0KCQkJCWZvciAodmFyIGkgPSA0OyBpIDw9IDE2OyBpIDw8PSAxKQ0KCQkJCXsNCgkJCQkJLy90cnkNCgkJCQkJLy97DQoJCQkJCQlhbGlnbm1lbnRQYXR0ZXJuID0gdGhpcy5maW5kQWxpZ25tZW50SW5SZWdpb24obW9kdWxlU2l6ZSwgZXN0QWxpZ25tZW50WCwgZXN0QWxpZ25tZW50WSwgIGkpOw0KCQkJCQkJYnJlYWs7DQoJCQkJCS8vfQ0KCQkJCQkvL2NhdGNoIChyZSkNCgkJCQkJLy97DQoJCQkJCQkvLyB0cnkgbmV4dCByb3VuZA0KCQkJCQkvL30NCgkJCQl9DQoJCQkJLy8gSWYgd2UgZGlkbid0IGZpbmQgYWxpZ25tZW50IHBhdHRlcm4uLi4gd2VsbCB0cnkgYW55d2F5IHdpdGhvdXQgaXQNCgkJCX0NCgkJCQ0KCQkJdmFyIHRyYW5zZm9ybSA9IHRoaXMuY3JlYXRlVHJhbnNmb3JtKHRvcExlZnQsIHRvcFJpZ2h0LCBib3R0b21MZWZ0LCBhbGlnbm1lbnRQYXR0ZXJuLCBkaW1lbnNpb24pOw0KCQkJDQoJCQl2YXIgYml0cyA9IHRoaXMuc2FtcGxlR3JpZCh0aGlzLmltYWdlLCB0cmFuc2Zvcm0sIGRpbWVuc2lvbik7DQoJCQkNCgkJCXZhciBwb2ludHM7DQoJCQlpZiAoYWxpZ25tZW50UGF0dGVybiA9PSBudWxsKQ0KCQkJew0KCQkJCXBvaW50cyA9IG5ldyBBcnJheShib3R0b21MZWZ0LCB0b3BMZWZ0LCB0b3BSaWdodCk7DQoJCQl9DQoJCQllbHNlDQoJCQl7DQoJCQkJcG9pbnRzID0gbmV3IEFycmF5KGJvdHRvbUxlZnQsIHRvcExlZnQsIHRvcFJpZ2h0LCBhbGlnbm1lbnRQYXR0ZXJuKTsNCgkJCX0NCgkJCXJldHVybiBuZXcgRGV0ZWN0b3JSZXN1bHQoYml0cywgcG9pbnRzKTsNCgkJfQ0KCQkNCg0KCQ0KCXRoaXMuZGV0ZWN0PWZ1bmN0aW9uKCkNCgl7DQoJCXZhciBpbmZvID0gIG5ldyBGaW5kZXJQYXR0ZXJuRmluZGVyKCkuZmluZEZpbmRlclBhdHRlcm4odGhpcy5pbWFnZSk7DQoJCQkNCgkJcmV0dXJuIHRoaXMucHJvY2Vzc0ZpbmRlclBhdHRlcm5JbmZvKGluZm8pOyANCgl9DQp9</uax:ByteString>
		</Value>
	</UAVariable>
	<UAVariable NodeId="ns=1;s=SYSTEM.LIBRARY.PROJECT.RESOURCES/QRCodeScanner/errorlevel.js" BrowseName="1:errorlevel.js" DataType="ByteString" AccessLevel="103" UserAccessLevel="103" Historizing="true">
		<DisplayName Locale="en">errorlevel.js</DisplayName>
		<Description Locale="en">errorlevel.js</Description>
		<References>
			<Reference ReferenceType="HasComponent" IsForward="false">ns=1;s=SYSTEM.LIBRARY.PROJECT.RESOURCES/QRCodeScanner</Reference>
			<Reference ReferenceType="HasTypeDefinition">ns=1;s=VariableTypes.ATVISE.Resource.Javascript</Reference>
			<Reference ReferenceType="HasProperty">ns=1;s=VariableTypes.ATVISE.Resource.Javascript.Compress</Reference>
		</References>
		<Value>
			<uax:ByteString>LyoNCiAgUG9ydGVkIHRvIEphdmFTY3JpcHQgYnkgTGF6YXIgTGFzemxvIDIwMTEgDQogIA0KICBsYXphcnNvZnRAZ21haWwuY29tLCB3d3cubGF6YXJzb2Z0LmluZm8NCiAgDQoqLw0KDQovKg0KKg0KKiBDb3B5cmlnaHQgMjAwNyBaWGluZyBhdXRob3JzDQoqDQoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOw0KKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuDQoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KKg0KKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KKg0KKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KKi8NCg0KDQpmdW5jdGlvbiBFcnJvckNvcnJlY3Rpb25MZXZlbChvcmRpbmFsLCAgYml0cywgbmFtZSkNCnsNCgl0aGlzLm9yZGluYWxfUmVuYW1lZF9GaWVsZCA9IG9yZGluYWw7DQoJdGhpcy5iaXRzID0gYml0czsNCgl0aGlzLm5hbWUgPSBuYW1lOw0KCXRoaXMuX19kZWZpbmVHZXR0ZXJfXygiQml0cyIsIGZ1bmN0aW9uKCkNCgl7DQoJCXJldHVybiB0aGlzLmJpdHM7DQoJfSk7DQoJdGhpcy5fX2RlZmluZUdldHRlcl9fKCJOYW1lIiwgZnVuY3Rpb24oKQ0KCXsNCgkJcmV0dXJuIHRoaXMubmFtZTsNCgl9KTsNCgl0aGlzLm9yZGluYWw9ZnVuY3Rpb24oKQ0KCXsNCgkJcmV0dXJuIHRoaXMub3JkaW5hbF9SZW5hbWVkX0ZpZWxkOw0KCX0NCn0NCg0KRXJyb3JDb3JyZWN0aW9uTGV2ZWwuZm9yQml0cz1mdW5jdGlvbiggYml0cykNCnsNCglpZiAoYml0cyA8IDAgfHwgYml0cyA+PSBGT1JfQklUUy5sZW5ndGgpDQoJew0KCQl0aHJvdyAiQXJndW1lbnRFeGNlcHRpb24iOw0KCX0NCglyZXR1cm4gRk9SX0JJVFNbYml0c107DQp9DQoNCnZhciBMID0gbmV3IEVycm9yQ29ycmVjdGlvbkxldmVsKDAsIDB4MDEsICJMIik7DQp2YXIgTSA9IG5ldyBFcnJvckNvcnJlY3Rpb25MZXZlbCgxLCAweDAwLCAiTSIpOw0KdmFyIFEgPSBuZXcgRXJyb3JDb3JyZWN0aW9uTGV2ZWwoMiwgMHgwMywgIlEiKTsNCnZhciBIID0gbmV3IEVycm9yQ29ycmVjdGlvbkxldmVsKDMsIDB4MDIsICJIIik7DQp2YXIgRk9SX0JJVFMgPSBuZXcgQXJyYXkoIE0sIEwsIEgsIFEpOw==</uax:ByteString>
		</Value>
	</UAVariable>
	<UAVariable NodeId="ns=1;s=SYSTEM.LIBRARY.PROJECT.RESOURCES/QRCodeScanner/findpat.js" BrowseName="1:findpat.js" DataType="ByteString" AccessLevel="103" UserAccessLevel="103" Historizing="true">
		<DisplayName Locale="en">findpat.js</DisplayName>
		<Description Locale="en">findpat.js</Description>
		<References>
			<Reference ReferenceType="HasComponent" IsForward="false">ns=1;s=SYSTEM.LIBRARY.PROJECT.RESOURCES/QRCodeScanner</Reference>
			<Reference ReferenceType="HasTypeDefinition">ns=1;s=VariableTypes.ATVISE.Resource.Javascript</Reference>
			<Reference ReferenceType="HasProperty">ns=1;s=VariableTypes.ATVISE.Resource.Javascript.Compress</Reference>
		</References>
		<Value>
			<uax:ByteString>LyoNCiAgUG9ydGVkIHRvIEphdmFTY3JpcHQgYnkgTGF6YXIgTGFzemxvIDIwMTEgDQogIA0KICBsYXphcnNvZnRAZ21haWwuY29tLCB3d3cubGF6YXJzb2Z0LmluZm8NCiAgDQoqLw0KDQovKg0KKg0KKiBDb3B5cmlnaHQgMjAwNyBaWGluZyBhdXRob3JzDQoqDQoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOw0KKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuDQoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KKg0KKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KKg0KKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KKi8NCg0KDQp2YXIgTUlOX1NLSVAgPSAzOw0KdmFyIE1BWF9NT0RVTEVTID0gNTc7DQp2YXIgSU5URUdFUl9NQVRIX1NISUZUID0gODsNCnZhciBDRU5URVJfUVVPUlVNID0gMjsNCg0KcXJjb2RlLm9yZGVyQmVzdFBhdHRlcm5zPWZ1bmN0aW9uKHBhdHRlcm5zKQ0KCQl7DQoJCQkNCgkJCWZ1bmN0aW9uIGRpc3RhbmNlKCBwYXR0ZXJuMSwgIHBhdHRlcm4yKQ0KCQkJew0KCQkJCXZhciB4RGlmZiA9IHBhdHRlcm4xLlggLSBwYXR0ZXJuMi5YOw0KCQkJCXZhciB5RGlmZiA9IHBhdHRlcm4xLlkgLSBwYXR0ZXJuMi5ZOw0KCQkJCXJldHVybiAgTWF0aC5zcXJ0KCAoeERpZmYgKiB4RGlmZiArIHlEaWZmICogeURpZmYpKTsNCgkJCX0NCgkJCQ0KCQkJLy8vIDxzdW1tYXJ5PiBSZXR1cm5zIHRoZSB6IGNvbXBvbmVudCBvZiB0aGUgY3Jvc3MgcHJvZHVjdCBiZXR3ZWVuIHZlY3RvcnMgQkMgYW5kIEJBLjwvc3VtbWFyeT4NCgkJCWZ1bmN0aW9uIGNyb3NzUHJvZHVjdFooIHBvaW50QSwgIHBvaW50QiwgIHBvaW50QykNCgkJCXsNCgkJCQl2YXIgYlggPSBwb2ludEIueDsNCgkJCQl2YXIgYlkgPSBwb2ludEIueTsNCgkJCQlyZXR1cm4gKChwb2ludEMueCAtIGJYKSAqIChwb2ludEEueSAtIGJZKSkgLSAoKHBvaW50Qy55IC0gYlkpICogKHBvaW50QS54IC0gYlgpKTsNCgkJCX0NCg0KCQkJDQoJCQkvLyBGaW5kIGRpc3RhbmNlcyBiZXR3ZWVuIHBhdHRlcm4gY2VudGVycw0KCQkJdmFyIHplcm9PbmVEaXN0YW5jZSA9IGRpc3RhbmNlKHBhdHRlcm5zWzBdLCBwYXR0ZXJuc1sxXSk7DQoJCQl2YXIgb25lVHdvRGlzdGFuY2UgPSBkaXN0YW5jZShwYXR0ZXJuc1sxXSwgcGF0dGVybnNbMl0pOw0KCQkJdmFyIHplcm9Ud29EaXN0YW5jZSA9IGRpc3RhbmNlKHBhdHRlcm5zWzBdLCBwYXR0ZXJuc1syXSk7DQoJCQkNCgkJCXZhciBwb2ludEEsIHBvaW50QiwgcG9pbnRDOw0KCQkJLy8gQXNzdW1lIG9uZSBjbG9zZXN0IHRvIG90aGVyIHR3byBpcyBCOyBBIGFuZCBDIHdpbGwganVzdCBiZSBndWVzc2VzIGF0IGZpcnN0DQoJCQlpZiAob25lVHdvRGlzdGFuY2UgPj0gemVyb09uZURpc3RhbmNlICYmIG9uZVR3b0Rpc3RhbmNlID49IHplcm9Ud29EaXN0YW5jZSkNCgkJCXsNCgkJCQlwb2ludEIgPSBwYXR0ZXJuc1swXTsNCgkJCQlwb2ludEEgPSBwYXR0ZXJuc1sxXTsNCgkJCQlwb2ludEMgPSBwYXR0ZXJuc1syXTsNCgkJCX0NCgkJCWVsc2UgaWYgKHplcm9Ud29EaXN0YW5jZSA+PSBvbmVUd29EaXN0YW5jZSAmJiB6ZXJvVHdvRGlzdGFuY2UgPj0gemVyb09uZURpc3RhbmNlKQ0KCQkJew0KCQkJCXBvaW50QiA9IHBhdHRlcm5zWzFdOw0KCQkJCXBvaW50QSA9IHBhdHRlcm5zWzBdOw0KCQkJCXBvaW50QyA9IHBhdHRlcm5zWzJdOw0KCQkJfQ0KCQkJZWxzZQ0KCQkJew0KCQkJCXBvaW50QiA9IHBhdHRlcm5zWzJdOw0KCQkJCXBvaW50QSA9IHBhdHRlcm5zWzBdOw0KCQkJCXBvaW50QyA9IHBhdHRlcm5zWzFdOw0KCQkJfQ0KCQkJDQoJCQkvLyBVc2UgY3Jvc3MgcHJvZHVjdCB0byBmaWd1cmUgb3V0IHdoZXRoZXIgQSBhbmQgQyBhcmUgY29ycmVjdCBvciBmbGlwcGVkLg0KCQkJLy8gVGhpcyBhc2tzIHdoZXRoZXIgQkMgeCBCQSBoYXMgYSBwb3NpdGl2ZSB6IGNvbXBvbmVudCwgd2hpY2ggaXMgdGhlIGFycmFuZ2VtZW50DQoJCQkvLyB3ZSB3YW50IGZvciBBLCBCLCBDLiBJZiBpdCdzIG5lZ2F0aXZlLCB0aGVuIHdlJ3ZlIGdvdCBpdCBmbGlwcGVkIGFyb3VuZCBhbmQNCgkJCS8vIHNob3VsZCBzd2FwIEEgYW5kIEMuDQoJCQlpZiAoY3Jvc3NQcm9kdWN0Wihwb2ludEEsIHBvaW50QiwgcG9pbnRDKSA8IDAuMCkNCgkJCXsNCgkJCQl2YXIgdGVtcCA9IHBvaW50QTsNCgkJCQlwb2ludEEgPSBwb2ludEM7DQoJCQkJcG9pbnRDID0gdGVtcDsNCgkJCX0NCgkJCQ0KCQkJcGF0dGVybnNbMF0gPSBwb2ludEE7DQoJCQlwYXR0ZXJuc1sxXSA9IHBvaW50QjsNCgkJCXBhdHRlcm5zWzJdID0gcG9pbnRDOw0KCQl9DQoNCg0KZnVuY3Rpb24gRmluZGVyUGF0dGVybihwb3NYLCBwb3NZLCAgZXN0aW1hdGVkTW9kdWxlU2l6ZSkNCnsNCgl0aGlzLng9cG9zWDsNCgl0aGlzLnk9cG9zWTsNCgl0aGlzLmNvdW50ID0gMTsNCgl0aGlzLmVzdGltYXRlZE1vZHVsZVNpemUgPSBlc3RpbWF0ZWRNb2R1bGVTaXplOw0KCQ0KCXRoaXMuX19kZWZpbmVHZXR0ZXJfXygiRXN0aW1hdGVkTW9kdWxlU2l6ZSIsIGZ1bmN0aW9uKCkNCgl7DQoJCXJldHVybiB0aGlzLmVzdGltYXRlZE1vZHVsZVNpemU7DQoJfSk7IA0KCXRoaXMuX19kZWZpbmVHZXR0ZXJfXygiQ291bnQiLCBmdW5jdGlvbigpDQoJew0KCQlyZXR1cm4gdGhpcy5jb3VudDsNCgl9KTsNCgl0aGlzLl9fZGVmaW5lR2V0dGVyX18oIlgiLCBmdW5jdGlvbigpDQoJew0KCQlyZXR1cm4gdGhpcy54Ow0KCX0pOw0KCXRoaXMuX19kZWZpbmVHZXR0ZXJfXygiWSIsIGZ1bmN0aW9uKCkNCgl7DQoJCXJldHVybiB0aGlzLnk7DQoJfSk7DQoJdGhpcy5pbmNyZW1lbnRDb3VudCA9IGZ1bmN0aW9uKCkNCgl7DQoJCXRoaXMuY291bnQrKzsNCgl9DQoJdGhpcy5hYm91dEVxdWFscz1mdW5jdGlvbiggbW9kdWxlU2l6ZSwgIGksICBqKQ0KCQl7DQoJCQlpZiAoTWF0aC5hYnMoaSAtIHRoaXMueSkgPD0gbW9kdWxlU2l6ZSAmJiBNYXRoLmFicyhqIC0gdGhpcy54KSA8PSBtb2R1bGVTaXplKQ0KCQkJew0KCQkJCXZhciBtb2R1bGVTaXplRGlmZiA9IE1hdGguYWJzKG1vZHVsZVNpemUgLSB0aGlzLmVzdGltYXRlZE1vZHVsZVNpemUpOw0KCQkJCXJldHVybiBtb2R1bGVTaXplRGlmZiA8PSAxLjAgfHwgbW9kdWxlU2l6ZURpZmYgLyB0aGlzLmVzdGltYXRlZE1vZHVsZVNpemUgPD0gMS4wOw0KCQkJfQ0KCQkJcmV0dXJuIGZhbHNlOw0KCQl9DQoJDQp9DQoNCmZ1bmN0aW9uIEZpbmRlclBhdHRlcm5JbmZvKHBhdHRlcm5DZW50ZXJzKQ0Kew0KCXRoaXMuYm90dG9tTGVmdCA9IHBhdHRlcm5DZW50ZXJzWzBdOw0KCXRoaXMudG9wTGVmdCA9IHBhdHRlcm5DZW50ZXJzWzFdOw0KCXRoaXMudG9wUmlnaHQgPSBwYXR0ZXJuQ2VudGVyc1syXTsNCgl0aGlzLl9fZGVmaW5lR2V0dGVyX18oIkJvdHRvbUxlZnQiLCBmdW5jdGlvbigpDQoJew0KCQlyZXR1cm4gdGhpcy5ib3R0b21MZWZ0Ow0KCX0pOyANCgl0aGlzLl9fZGVmaW5lR2V0dGVyX18oIlRvcExlZnQiLCBmdW5jdGlvbigpDQoJew0KCQlyZXR1cm4gdGhpcy50b3BMZWZ0Ow0KCX0pOyANCgl0aGlzLl9fZGVmaW5lR2V0dGVyX18oIlRvcFJpZ2h0IiwgZnVuY3Rpb24oKQ0KCXsNCgkJcmV0dXJuIHRoaXMudG9wUmlnaHQ7DQoJfSk7IA0KfQ0KDQpmdW5jdGlvbiBGaW5kZXJQYXR0ZXJuRmluZGVyKCkNCnsNCgl0aGlzLmltYWdlPW51bGw7DQoJdGhpcy5wb3NzaWJsZUNlbnRlcnMgPSBbXTsNCgl0aGlzLmhhc1NraXBwZWQgPSBmYWxzZTsNCgl0aGlzLmNyb3NzQ2hlY2tTdGF0ZUNvdW50ID0gbmV3IEFycmF5KDAsMCwwLDAsMCk7DQoJdGhpcy5yZXN1bHRQb2ludENhbGxiYWNrID0gbnVsbDsNCgkNCgl0aGlzLl9fZGVmaW5lR2V0dGVyX18oIkNyb3NzQ2hlY2tTdGF0ZUNvdW50IiwgZnVuY3Rpb24oKQ0KCXsNCgkJdGhpcy5jcm9zc0NoZWNrU3RhdGVDb3VudFswXSA9IDA7DQoJCXRoaXMuY3Jvc3NDaGVja1N0YXRlQ291bnRbMV0gPSAwOw0KCQl0aGlzLmNyb3NzQ2hlY2tTdGF0ZUNvdW50WzJdID0gMDsNCgkJdGhpcy5jcm9zc0NoZWNrU3RhdGVDb3VudFszXSA9IDA7DQoJCXRoaXMuY3Jvc3NDaGVja1N0YXRlQ291bnRbNF0gPSAwOw0KCQlyZXR1cm4gdGhpcy5jcm9zc0NoZWNrU3RhdGVDb3VudDsNCgl9KTsgDQoJDQoJdGhpcy5mb3VuZFBhdHRlcm5Dcm9zcz1mdW5jdGlvbiggc3RhdGVDb3VudCkNCgkJew0KCQkJdmFyIHRvdGFsTW9kdWxlU2l6ZSA9IDA7DQoJCQlmb3IgKHZhciBpID0gMDsgaSA8IDU7IGkrKykNCgkJCXsNCgkJCQl2YXIgY291bnQgPSBzdGF0ZUNvdW50W2ldOw0KCQkJCWlmIChjb3VudCA9PSAwKQ0KCQkJCXsNCgkJCQkJcmV0dXJuIGZhbHNlOw0KCQkJCX0NCgkJCQl0b3RhbE1vZHVsZVNpemUgKz0gY291bnQ7DQoJCQl9DQoJCQlpZiAodG90YWxNb2R1bGVTaXplIDwgNykNCgkJCXsNCgkJCQlyZXR1cm4gZmFsc2U7DQoJCQl9DQoJCQl2YXIgbW9kdWxlU2l6ZSA9IE1hdGguZmxvb3IoKHRvdGFsTW9kdWxlU2l6ZSA8PCBJTlRFR0VSX01BVEhfU0hJRlQpIC8gNyk7DQoJCQl2YXIgbWF4VmFyaWFuY2UgPSBNYXRoLmZsb29yKG1vZHVsZVNpemUgLyAyKTsNCgkJCS8vIEFsbG93IGxlc3MgdGhhbiA1MCUgdmFyaWFuY2UgZnJvbSAxLTEtMy0xLTEgcHJvcG9ydGlvbnMNCgkJCXJldHVybiBNYXRoLmFicyhtb2R1bGVTaXplIC0gKHN0YXRlQ291bnRbMF0gPDwgSU5URUdFUl9NQVRIX1NISUZUKSkgPCBtYXhWYXJpYW5jZSAmJiBNYXRoLmFicyhtb2R1bGVTaXplIC0gKHN0YXRlQ291bnRbMV0gPDwgSU5URUdFUl9NQVRIX1NISUZUKSkgPCBtYXhWYXJpYW5jZSAmJiBNYXRoLmFicygzICogbW9kdWxlU2l6ZSAtIChzdGF0ZUNvdW50WzJdIDw8IElOVEVHRVJfTUFUSF9TSElGVCkpIDwgMyAqIG1heFZhcmlhbmNlICYmIE1hdGguYWJzKG1vZHVsZVNpemUgLSAoc3RhdGVDb3VudFszXSA8PCBJTlRFR0VSX01BVEhfU0hJRlQpKSA8IG1heFZhcmlhbmNlICYmIE1hdGguYWJzKG1vZHVsZVNpemUgLSAoc3RhdGVDb3VudFs0XSA8PCBJTlRFR0VSX01BVEhfU0hJRlQpKSA8IG1heFZhcmlhbmNlOw0KCQl9DQoJdGhpcy5jZW50ZXJGcm9tRW5kPWZ1bmN0aW9uKCBzdGF0ZUNvdW50LCAgZW5kKQ0KCQl7DQoJCQlyZXR1cm4gIChlbmQgLSBzdGF0ZUNvdW50WzRdIC0gc3RhdGVDb3VudFszXSkgLSBzdGF0ZUNvdW50WzJdIC8gMi4wOw0KCQl9DQoJdGhpcy5jcm9zc0NoZWNrVmVydGljYWw9ZnVuY3Rpb24oIHN0YXJ0SSwgIGNlbnRlckosICBtYXhDb3VudCwgIG9yaWdpbmFsU3RhdGVDb3VudFRvdGFsKQ0KCQl7DQoJCQl2YXIgaW1hZ2UgPSB0aGlzLmltYWdlOw0KCQkJDQoJCQl2YXIgbWF4SSA9IHFyY29kZS5oZWlnaHQ7DQoJCQl2YXIgc3RhdGVDb3VudCA9IHRoaXMuQ3Jvc3NDaGVja1N0YXRlQ291bnQ7DQoJCQkNCgkJCS8vIFN0YXJ0IGNvdW50aW5nIHVwIGZyb20gY2VudGVyDQoJCQl2YXIgaSA9IHN0YXJ0STsNCgkJCXdoaWxlIChpID49IDAgJiYgaW1hZ2VbY2VudGVySiArIGkqcXJjb2RlLndpZHRoXSkNCgkJCXsNCgkJCQlzdGF0ZUNvdW50WzJdKys7DQoJCQkJaS0tOw0KCQkJfQ0KCQkJaWYgKGkgPCAwKQ0KCQkJew0KCQkJCXJldHVybiBOYU47DQoJCQl9DQoJCQl3aGlsZSAoaSA+PSAwICYmICFpbWFnZVtjZW50ZXJKICtpKnFyY29kZS53aWR0aF0gJiYgc3RhdGVDb3VudFsxXSA8PSBtYXhDb3VudCkNCgkJCXsNCgkJCQlzdGF0ZUNvdW50WzFdKys7DQoJCQkJaS0tOw0KCQkJfQ0KCQkJLy8gSWYgYWxyZWFkeSB0b28gbWFueSBtb2R1bGVzIGluIHRoaXMgc3RhdGUgb3IgcmFuIG9mZiB0aGUgZWRnZToNCgkJCWlmIChpIDwgMCB8fCBzdGF0ZUNvdW50WzFdID4gbWF4Q291bnQpDQoJCQl7DQoJCQkJcmV0dXJuIE5hTjsNCgkJCX0NCgkJCXdoaWxlIChpID49IDAgJiYgaW1hZ2VbY2VudGVySiArIGkqcXJjb2RlLndpZHRoXSAmJiBzdGF0ZUNvdW50WzBdIDw9IG1heENvdW50KQ0KCQkJew0KCQkJCXN0YXRlQ291bnRbMF0rKzsNCgkJCQlpLS07DQoJCQl9DQoJCQlpZiAoc3RhdGVDb3VudFswXSA+IG1heENvdW50KQ0KCQkJew0KCQkJCXJldHVybiBOYU47DQoJCQl9DQoJCQkNCgkJCS8vIE5vdyBhbHNvIGNvdW50IGRvd24gZnJvbSBjZW50ZXINCgkJCWkgPSBzdGFydEkgKyAxOw0KCQkJd2hpbGUgKGkgPCBtYXhJICYmIGltYWdlW2NlbnRlckogK2kqcXJjb2RlLndpZHRoXSkNCgkJCXsNCgkJCQlzdGF0ZUNvdW50WzJdKys7DQoJCQkJaSsrOw0KCQkJfQ0KCQkJaWYgKGkgPT0gbWF4SSkNCgkJCXsNCgkJCQlyZXR1cm4gTmFOOw0KCQkJfQ0KCQkJd2hpbGUgKGkgPCBtYXhJICYmICFpbWFnZVtjZW50ZXJKICsgaSpxcmNvZGUud2lkdGhdICYmIHN0YXRlQ291bnRbM10gPCBtYXhDb3VudCkNCgkJCXsNCgkJCQlzdGF0ZUNvdW50WzNdKys7DQoJCQkJaSsrOw0KCQkJfQ0KCQkJaWYgKGkgPT0gbWF4SSB8fCBzdGF0ZUNvdW50WzNdID49IG1heENvdW50KQ0KCQkJew0KCQkJCXJldHVybiBOYU47DQoJCQl9DQoJCQl3aGlsZSAoaSA8IG1heEkgJiYgaW1hZ2VbY2VudGVySiArIGkqcXJjb2RlLndpZHRoXSAmJiBzdGF0ZUNvdW50WzRdIDwgbWF4Q291bnQpDQoJCQl7DQoJCQkJc3RhdGVDb3VudFs0XSsrOw0KCQkJCWkrKzsNCgkJCX0NCgkJCWlmIChzdGF0ZUNvdW50WzRdID49IG1heENvdW50KQ0KCQkJew0KCQkJCXJldHVybiBOYU47DQoJCQl9DQoJCQkNCgkJCS8vIElmIHdlIGZvdW5kIGEgZmluZGVyLXBhdHRlcm4tbGlrZSBzZWN0aW9uLCBidXQgaXRzIHNpemUgaXMgbW9yZSB0aGFuIDQwJSBkaWZmZXJlbnQgdGhhbg0KCQkJLy8gdGhlIG9yaWdpbmFsLCBhc3N1bWUgaXQncyBhIGZhbHNlIHBvc2l0aXZlDQoJCQl2YXIgc3RhdGVDb3VudFRvdGFsID0gc3RhdGVDb3VudFswXSArIHN0YXRlQ291bnRbMV0gKyBzdGF0ZUNvdW50WzJdICsgc3RhdGVDb3VudFszXSArIHN0YXRlQ291bnRbNF07DQoJCQlpZiAoNSAqIE1hdGguYWJzKHN0YXRlQ291bnRUb3RhbCAtIG9yaWdpbmFsU3RhdGVDb3VudFRvdGFsKSA+PSAyICogb3JpZ2luYWxTdGF0ZUNvdW50VG90YWwpDQoJCQl7DQoJCQkJcmV0dXJuIE5hTjsNCgkJCX0NCgkJCQ0KCQkJcmV0dXJuIHRoaXMuZm91bmRQYXR0ZXJuQ3Jvc3Moc3RhdGVDb3VudCk/dGhpcy5jZW50ZXJGcm9tRW5kKHN0YXRlQ291bnQsIGkpOk5hTjsNCgkJfQ0KCXRoaXMuY3Jvc3NDaGVja0hvcml6b250YWw9ZnVuY3Rpb24oIHN0YXJ0SiwgIGNlbnRlckksICBtYXhDb3VudCwgb3JpZ2luYWxTdGF0ZUNvdW50VG90YWwpDQoJCXsNCgkJCXZhciBpbWFnZSA9IHRoaXMuaW1hZ2U7DQoJCQkNCgkJCXZhciBtYXhKID0gcXJjb2RlLndpZHRoOw0KCQkJdmFyIHN0YXRlQ291bnQgPSB0aGlzLkNyb3NzQ2hlY2tTdGF0ZUNvdW50Ow0KCQkJDQoJCQl2YXIgaiA9IHN0YXJ0SjsNCgkJCXdoaWxlIChqID49IDAgJiYgaW1hZ2VbaisgY2VudGVySSpxcmNvZGUud2lkdGhdKQ0KCQkJew0KCQkJCXN0YXRlQ291bnRbMl0rKzsNCgkJCQlqLS07DQoJCQl9DQoJCQlpZiAoaiA8IDApDQoJCQl7DQoJCQkJcmV0dXJuIE5hTjsNCgkJCX0NCgkJCXdoaWxlIChqID49IDAgJiYgIWltYWdlW2orIGNlbnRlckkqcXJjb2RlLndpZHRoXSAmJiBzdGF0ZUNvdW50WzFdIDw9IG1heENvdW50KQ0KCQkJew0KCQkJCXN0YXRlQ291bnRbMV0rKzsNCgkJCQlqLS07DQoJCQl9DQoJCQlpZiAoaiA8IDAgfHwgc3RhdGVDb3VudFsxXSA+IG1heENvdW50KQ0KCQkJew0KCQkJCXJldHVybiBOYU47DQoJCQl9DQoJCQl3aGlsZSAoaiA+PSAwICYmIGltYWdlW2orIGNlbnRlckkqcXJjb2RlLndpZHRoXSAmJiBzdGF0ZUNvdW50WzBdIDw9IG1heENvdW50KQ0KCQkJew0KCQkJCXN0YXRlQ291bnRbMF0rKzsNCgkJCQlqLS07DQoJCQl9DQoJCQlpZiAoc3RhdGVDb3VudFswXSA+IG1heENvdW50KQ0KCQkJew0KCQkJCXJldHVybiBOYU47DQoJCQl9DQoJCQkNCgkJCWogPSBzdGFydEogKyAxOw0KCQkJd2hpbGUgKGogPCBtYXhKICYmIGltYWdlW2orIGNlbnRlckkqcXJjb2RlLndpZHRoXSkNCgkJCXsNCgkJCQlzdGF0ZUNvdW50WzJdKys7DQoJCQkJaisrOw0KCQkJfQ0KCQkJaWYgKGogPT0gbWF4SikNCgkJCXsNCgkJCQlyZXR1cm4gTmFOOw0KCQkJfQ0KCQkJd2hpbGUgKGogPCBtYXhKICYmICFpbWFnZVtqKyBjZW50ZXJJKnFyY29kZS53aWR0aF0gJiYgc3RhdGVDb3VudFszXSA8IG1heENvdW50KQ0KCQkJew0KCQkJCXN0YXRlQ291bnRbM10rKzsNCgkJCQlqKys7DQoJCQl9DQoJCQlpZiAoaiA9PSBtYXhKIHx8IHN0YXRlQ291bnRbM10gPj0gbWF4Q291bnQpDQoJCQl7DQoJCQkJcmV0dXJuIE5hTjsNCgkJCX0NCgkJCXdoaWxlIChqIDwgbWF4SiAmJiBpbWFnZVtqKyBjZW50ZXJJKnFyY29kZS53aWR0aF0gJiYgc3RhdGVDb3VudFs0XSA8IG1heENvdW50KQ0KCQkJew0KCQkJCXN0YXRlQ291bnRbNF0rKzsNCgkJCQlqKys7DQoJCQl9DQoJCQlpZiAoc3RhdGVDb3VudFs0XSA+PSBtYXhDb3VudCkNCgkJCXsNCgkJCQlyZXR1cm4gTmFOOw0KCQkJfQ0KCQkJDQoJCQkvLyBJZiB3ZSBmb3VuZCBhIGZpbmRlci1wYXR0ZXJuLWxpa2Ugc2VjdGlvbiwgYnV0IGl0cyBzaXplIGlzIHNpZ25pZmljYW50bHkgZGlmZmVyZW50IHRoYW4NCgkJCS8vIHRoZSBvcmlnaW5hbCwgYXNzdW1lIGl0J3MgYSBmYWxzZSBwb3NpdGl2ZQ0KCQkJdmFyIHN0YXRlQ291bnRUb3RhbCA9IHN0YXRlQ291bnRbMF0gKyBzdGF0ZUNvdW50WzFdICsgc3RhdGVDb3VudFsyXSArIHN0YXRlQ291bnRbM10gKyBzdGF0ZUNvdW50WzRdOw0KCQkJaWYgKDUgKiBNYXRoLmFicyhzdGF0ZUNvdW50VG90YWwgLSBvcmlnaW5hbFN0YXRlQ291bnRUb3RhbCkgPj0gb3JpZ2luYWxTdGF0ZUNvdW50VG90YWwpDQoJCQl7DQoJCQkJcmV0dXJuIE5hTjsNCgkJCX0NCgkJCQ0KCQkJcmV0dXJuIHRoaXMuZm91bmRQYXR0ZXJuQ3Jvc3Moc3RhdGVDb3VudCk/dGhpcy5jZW50ZXJGcm9tRW5kKHN0YXRlQ291bnQsIGopOk5hTjsNCgkJfQ0KCXRoaXMuaGFuZGxlUG9zc2libGVDZW50ZXI9ZnVuY3Rpb24oIHN0YXRlQ291bnQsICBpLCAgaikNCgkJew0KCQkJdmFyIHN0YXRlQ291bnRUb3RhbCA9IHN0YXRlQ291bnRbMF0gKyBzdGF0ZUNvdW50WzFdICsgc3RhdGVDb3VudFsyXSArIHN0YXRlQ291bnRbM10gKyBzdGF0ZUNvdW50WzRdOw0KCQkJdmFyIGNlbnRlckogPSB0aGlzLmNlbnRlckZyb21FbmQoc3RhdGVDb3VudCwgaik7IC8vZmxvYXQNCgkJCXZhciBjZW50ZXJJID0gdGhpcy5jcm9zc0NoZWNrVmVydGljYWwoaSwgTWF0aC5mbG9vciggY2VudGVySiksIHN0YXRlQ291bnRbMl0sIHN0YXRlQ291bnRUb3RhbCk7IC8vZmxvYXQNCgkJCWlmICghaXNOYU4oY2VudGVySSkpDQoJCQl7DQoJCQkJLy8gUmUtY3Jvc3MgY2hlY2sNCgkJCQljZW50ZXJKID0gdGhpcy5jcm9zc0NoZWNrSG9yaXpvbnRhbChNYXRoLmZsb29yKCBjZW50ZXJKKSwgTWF0aC5mbG9vciggY2VudGVySSksIHN0YXRlQ291bnRbMl0sIHN0YXRlQ291bnRUb3RhbCk7DQoJCQkJaWYgKCFpc05hTihjZW50ZXJKKSkNCgkJCQl7DQoJCQkJCXZhciBlc3RpbWF0ZWRNb2R1bGVTaXplID0gICBzdGF0ZUNvdW50VG90YWwgLyA3LjA7DQoJCQkJCXZhciBmb3VuZCA9IGZhbHNlOw0KCQkJCQl2YXIgbWF4ID0gdGhpcy5wb3NzaWJsZUNlbnRlcnMubGVuZ3RoOw0KCQkJCQlmb3IgKHZhciBpbmRleCA9IDA7IGluZGV4IDwgbWF4OyBpbmRleCsrKQ0KCQkJCQl7DQoJCQkJCQl2YXIgY2VudGVyID0gdGhpcy5wb3NzaWJsZUNlbnRlcnNbaW5kZXhdOw0KCQkJCQkJLy8gTG9vayBmb3IgYWJvdXQgdGhlIHNhbWUgY2VudGVyIGFuZCBtb2R1bGUgc2l6ZToNCgkJCQkJCWlmIChjZW50ZXIuYWJvdXRFcXVhbHMoZXN0aW1hdGVkTW9kdWxlU2l6ZSwgY2VudGVySSwgY2VudGVySikpDQoJCQkJCQl7DQoJCQkJCQkJY2VudGVyLmluY3JlbWVudENvdW50KCk7DQoJCQkJCQkJZm91bmQgPSB0cnVlOw0KCQkJCQkJCWJyZWFrOw0KCQkJCQkJfQ0KCQkJCQl9DQoJCQkJCWlmICghZm91bmQpDQoJCQkJCXsNCgkJCQkJCXZhciBwb2ludCA9IG5ldyBGaW5kZXJQYXR0ZXJuKGNlbnRlckosIGNlbnRlckksIGVzdGltYXRlZE1vZHVsZVNpemUpOw0KCQkJCQkJdGhpcy5wb3NzaWJsZUNlbnRlcnMucHVzaChwb2ludCk7DQoJCQkJCQlpZiAodGhpcy5yZXN1bHRQb2ludENhbGxiYWNrICE9IG51bGwpDQoJCQkJCQl7DQoJCQkJCQkJdGhpcy5yZXN1bHRQb2ludENhbGxiYWNrLmZvdW5kUG9zc2libGVSZXN1bHRQb2ludChwb2ludCk7DQoJCQkJCQl9DQoJCQkJCX0NCgkJCQkJcmV0dXJuIHRydWU7DQoJCQkJfQ0KCQkJfQ0KCQkJcmV0dXJuIGZhbHNlOw0KCQl9DQoJCQ0KCXRoaXMuc2VsZWN0QmVzdFBhdHRlcm5zPWZ1bmN0aW9uKCkNCgkJew0KCQkJDQoJCQl2YXIgc3RhcnRTaXplID0gdGhpcy5wb3NzaWJsZUNlbnRlcnMubGVuZ3RoOw0KCQkJaWYgKHN0YXJ0U2l6ZSA8IDMpDQoJCQl7DQoJCQkJLy8gQ291bGRuJ3QgZmluZCBlbm91Z2ggZmluZGVyIHBhdHRlcm5zDQoJCQkJdGhyb3cgIkNvdWxkbid0IGZpbmQgZW5vdWdoIGZpbmRlciBwYXR0ZXJucyAoZm91bmQgIiArIHN0YXJ0U2l6ZSArICIpIg0KCQkJfQ0KCQkJDQoJCQkvLyBGaWx0ZXIgb3V0bGllciBwb3NzaWJpbGl0aWVzIHdob3NlIG1vZHVsZSBzaXplIGlzIHRvbyBkaWZmZXJlbnQNCgkJCWlmIChzdGFydFNpemUgPiAzKQ0KCQkJew0KCQkJCS8vIEJ1dCB3ZSBjYW4gb25seSBhZmZvcmQgdG8gZG8gc28gaWYgd2UgaGF2ZSBhdCBsZWFzdCA0IHBvc3NpYmlsaXRpZXMgdG8gY2hvb3NlIGZyb20NCgkJCQl2YXIgdG90YWxNb2R1bGVTaXplID0gMC4wOw0KICAgICAgICAgICAgICAgIHZhciBzcXVhcmUgPSAwLjA7DQoJCQkJZm9yICh2YXIgaSA9IDA7IGkgPCBzdGFydFNpemU7IGkrKykNCgkJCQl7DQoJCQkJCS8vdG90YWxNb2R1bGVTaXplICs9ICB0aGlzLnBvc3NpYmxlQ2VudGVyc1tpXS5Fc3RpbWF0ZWRNb2R1bGVTaXplOw0KICAgICAgICAgICAgICAgICAgICB2YXIJY2VudGVyVmFsdWU9dGhpcy5wb3NzaWJsZUNlbnRlcnNbaV0uRXN0aW1hdGVkTW9kdWxlU2l6ZTsNCgkJCQkJdG90YWxNb2R1bGVTaXplICs9IGNlbnRlclZhbHVlOw0KCQkJCQlzcXVhcmUgKz0gKGNlbnRlclZhbHVlICogY2VudGVyVmFsdWUpOw0KCQkJCX0NCgkJCQl2YXIgYXZlcmFnZSA9IHRvdGFsTW9kdWxlU2l6ZSAvICBzdGFydFNpemU7DQogICAgICAgICAgICAgICAgdGhpcy5wb3NzaWJsZUNlbnRlcnMuc29ydChmdW5jdGlvbihjZW50ZXIxLGNlbnRlcjIpIHsNCgkJCQkgICAgICB2YXIgZEE9TWF0aC5hYnMoY2VudGVyMi5Fc3RpbWF0ZWRNb2R1bGVTaXplIC0gYXZlcmFnZSk7DQoJCQkJICAgICAgdmFyIGRCPU1hdGguYWJzKGNlbnRlcjEuRXN0aW1hdGVkTW9kdWxlU2l6ZSAtIGF2ZXJhZ2UpOw0KCQkJCSAgICAgIGlmIChkQSA8IGRCKSB7DQoJCQkJICAgIAkgIHJldHVybiAoLTEpOw0KCQkJCSAgICAgIH0gZWxzZSBpZiAoZEEgPT0gZEIpIHsNCgkJCQkgICAgCSAgcmV0dXJuIDA7DQoJCQkJICAgICAgfSBlbHNlIHsNCgkJCQkgICAgCSAgcmV0dXJuIDE7DQoJCQkJICAgICAgfQ0KCQkJCQl9KTsNCg0KCQkJCXZhciBzdGREZXYgPSBNYXRoLnNxcnQoc3F1YXJlIC8gc3RhcnRTaXplIC0gYXZlcmFnZSAqIGF2ZXJhZ2UpOw0KCQkJCXZhciBsaW1pdCA9IE1hdGgubWF4KDAuMiAqIGF2ZXJhZ2UsIHN0ZERldik7DQoJCQkJLy9mb3IgKHZhciBpID0gMDsgaSA8IHRoaXMucG9zc2libGVDZW50ZXJzLmxlbmd0aCAmJiB0aGlzLnBvc3NpYmxlQ2VudGVycy5sZW5ndGggPiAzOyBpKyspDQoJCQkJZm9yICh2YXIgaSA9IHRoaXMucG9zc2libGVDZW50ZXJzLmxlbmd0aCAtIDE7IGkgPj0gMCA7IGktLSkNCgkJCQl7DQoJCQkJCXZhciBwYXR0ZXJuID0gIHRoaXMucG9zc2libGVDZW50ZXJzW2ldOw0KCQkJCQkvL2lmIChNYXRoLmFicyhwYXR0ZXJuLkVzdGltYXRlZE1vZHVsZVNpemUgLSBhdmVyYWdlKSA+IDAuMiAqIGF2ZXJhZ2UpDQogICAgICAgICAgICAgICAgICAgIGlmIChNYXRoLmFicyhwYXR0ZXJuLkVzdGltYXRlZE1vZHVsZVNpemUgLSBhdmVyYWdlKSA+IGxpbWl0KQ0KCQkJCQl7DQoJCQkJCQkvL3RoaXMucG9zc2libGVDZW50ZXJzLnJlbW92ZShpKTsNCgkJCQkJCXRoaXMucG9zc2libGVDZW50ZXJzLnNwbGljZShpLDEpOw0KCQkJCQkJLy9pLS07DQoJCQkJCX0NCgkJCQl9DQoJCQl9DQoJCQkNCgkJCWlmICh0aGlzLnBvc3NpYmxlQ2VudGVycy5sZW5ndGggPiAzKQ0KCQkJew0KCQkJCS8vIFRocm93IGF3YXkgYWxsIGJ1dCB0aG9zZSBmaXJzdCBzaXplIGNhbmRpZGF0ZSBwb2ludHMgd2UgZm91bmQuDQoJCQkJdGhpcy5wb3NzaWJsZUNlbnRlcnMuc29ydChmdW5jdGlvbihhLCBiKXsNCgkJCQkJaWYgKGEuY291bnQgPiBiLmNvdW50KXtyZXR1cm4gLTE7fQ0KCQkJCQlpZiAoYS5jb3VudCA8IGIuY291bnQpe3JldHVybiAxO30NCgkJCQkJcmV0dXJuIDA7DQoJCQkJfSk7DQoJCQl9DQoJCQkNCgkJCXJldHVybiBuZXcgQXJyYXkoIHRoaXMucG9zc2libGVDZW50ZXJzWzBdLCAgdGhpcy5wb3NzaWJsZUNlbnRlcnNbMV0sICB0aGlzLnBvc3NpYmxlQ2VudGVyc1syXSk7DQoJCX0NCgkJDQoJdGhpcy5maW5kUm93U2tpcD1mdW5jdGlvbigpDQoJCXsNCgkJCXZhciBtYXggPSB0aGlzLnBvc3NpYmxlQ2VudGVycy5sZW5ndGg7DQoJCQlpZiAobWF4IDw9IDEpDQoJCQl7DQoJCQkJcmV0dXJuIDA7DQoJCQl9DQoJCQl2YXIgZmlyc3RDb25maXJtZWRDZW50ZXIgPSBudWxsOw0KCQkJZm9yICh2YXIgaSA9IDA7IGkgPCBtYXg7IGkrKykNCgkJCXsNCgkJCQl2YXIgY2VudGVyID0gIHRoaXMucG9zc2libGVDZW50ZXJzW2ldOw0KCQkJCWlmIChjZW50ZXIuQ291bnQgPj0gQ0VOVEVSX1FVT1JVTSkNCgkJCQl7DQoJCQkJCWlmIChmaXJzdENvbmZpcm1lZENlbnRlciA9PSBudWxsKQ0KCQkJCQl7DQoJCQkJCQlmaXJzdENvbmZpcm1lZENlbnRlciA9IGNlbnRlcjsNCgkJCQkJfQ0KCQkJCQllbHNlDQoJCQkJCXsNCgkJCQkJCS8vIFdlIGhhdmUgdHdvIGNvbmZpcm1lZCBjZW50ZXJzDQoJCQkJCQkvLyBIb3cgZmFyIGRvd24gY2FuIHdlIHNraXAgYmVmb3JlIHJlc3VtaW5nIGxvb2tpbmcgZm9yIHRoZSBuZXh0DQoJCQkJCQkvLyBwYXR0ZXJuPyBJbiB0aGUgd29yc3QgY2FzZSwgb25seSB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZQ0KCQkJCQkJLy8gZGlmZmVyZW5jZSBpbiB0aGUgeCAvIHkgY29vcmRpbmF0ZXMgb2YgdGhlIHR3byBjZW50ZXJzLg0KCQkJCQkJLy8gVGhpcyBpcyB0aGUgY2FzZSB3aGVyZSB5b3UgZmluZCB0b3AgbGVmdCBsYXN0Lg0KCQkJCQkJdGhpcy5oYXNTa2lwcGVkID0gdHJ1ZTsNCgkJCQkJCXJldHVybiBNYXRoLmZsb29yICgoTWF0aC5hYnMoZmlyc3RDb25maXJtZWRDZW50ZXIuWCAtIGNlbnRlci5YKSAtIE1hdGguYWJzKGZpcnN0Q29uZmlybWVkQ2VudGVyLlkgLSBjZW50ZXIuWSkpIC8gMik7DQoJCQkJCX0NCgkJCQl9DQoJCQl9DQoJCQlyZXR1cm4gMDsNCgkJfQ0KCQ0KCXRoaXMuaGF2ZU11bHRpcGx5Q29uZmlybWVkQ2VudGVycz1mdW5jdGlvbigpDQoJCXsNCgkJCXZhciBjb25maXJtZWRDb3VudCA9IDA7DQoJCQl2YXIgdG90YWxNb2R1bGVTaXplID0gMC4wOw0KCQkJdmFyIG1heCA9IHRoaXMucG9zc2libGVDZW50ZXJzLmxlbmd0aDsNCgkJCWZvciAodmFyIGkgPSAwOyBpIDwgbWF4OyBpKyspDQoJCQl7DQoJCQkJdmFyIHBhdHRlcm4gPSAgdGhpcy5wb3NzaWJsZUNlbnRlcnNbaV07DQoJCQkJaWYgKHBhdHRlcm4uQ291bnQgPj0gQ0VOVEVSX1FVT1JVTSkNCgkJCQl7DQoJCQkJCWNvbmZpcm1lZENvdW50Kys7DQoJCQkJCXRvdGFsTW9kdWxlU2l6ZSArPSBwYXR0ZXJuLkVzdGltYXRlZE1vZHVsZVNpemU7DQoJCQkJfQ0KCQkJfQ0KCQkJaWYgKGNvbmZpcm1lZENvdW50IDwgMykNCgkJCXsNCgkJCQlyZXR1cm4gZmFsc2U7DQoJCQl9DQoJCQkvLyBPSywgd2UgaGF2ZSBhdCBsZWFzdCAzIGNvbmZpcm1lZCBjZW50ZXJzLCBidXQsIGl0J3MgcG9zc2libGUgdGhhdCBvbmUgaXMgYSAiZmFsc2UgcG9zaXRpdmUiDQoJCQkvLyBhbmQgdGhhdCB3ZSBuZWVkIHRvIGtlZXAgbG9va2luZy4gV2UgZGV0ZWN0IHRoaXMgYnkgYXNraW5nIGlmIHRoZSBlc3RpbWF0ZWQgbW9kdWxlIHNpemVzDQoJCQkvLyB2YXJ5IHRvbyBtdWNoLiBXZSBhcmJpdHJhcmlseSBzYXkgdGhhdCB3aGVuIHRoZSB0b3RhbCBkZXZpYXRpb24gZnJvbSBhdmVyYWdlIGV4Y2VlZHMNCgkJCS8vIDUlIG9mIHRoZSB0b3RhbCBtb2R1bGUgc2l6ZSBlc3RpbWF0ZXMsIGl0J3MgdG9vIG11Y2guDQoJCQl2YXIgYXZlcmFnZSA9IHRvdGFsTW9kdWxlU2l6ZSAvIG1heDsNCgkJCXZhciB0b3RhbERldmlhdGlvbiA9IDAuMDsNCgkJCWZvciAodmFyIGkgPSAwOyBpIDwgbWF4OyBpKyspDQoJCQl7DQoJCQkJcGF0dGVybiA9IHRoaXMucG9zc2libGVDZW50ZXJzW2ldOw0KCQkJCXRvdGFsRGV2aWF0aW9uICs9IE1hdGguYWJzKHBhdHRlcm4uRXN0aW1hdGVkTW9kdWxlU2l6ZSAtIGF2ZXJhZ2UpOw0KCQkJfQ0KCQkJcmV0dXJuIHRvdGFsRGV2aWF0aW9uIDw9IDAuMDUgKiB0b3RhbE1vZHVsZVNpemU7DQoJCX0NCgkJDQoJdGhpcy5maW5kRmluZGVyUGF0dGVybiA9IGZ1bmN0aW9uKGltYWdlKXsNCgkJdmFyIHRyeUhhcmRlciA9IGZhbHNlOw0KCQl0aGlzLmltYWdlPWltYWdlOw0KCQl2YXIgbWF4SSA9IHFyY29kZS5oZWlnaHQ7DQoJCXZhciBtYXhKID0gcXJjb2RlLndpZHRoOw0KCQl2YXIgaVNraXAgPSBNYXRoLmZsb29yKCgzICogbWF4SSkgLyAoNCAqIE1BWF9NT0RVTEVTKSk7DQoJCWlmIChpU2tpcCA8IE1JTl9TS0lQIHx8IHRyeUhhcmRlcikNCgkJew0KCQkJCWlTa2lwID0gTUlOX1NLSVA7DQoJCX0NCgkJDQoJCXZhciBkb25lID0gZmFsc2U7DQoJCXZhciBzdGF0ZUNvdW50ID0gbmV3IEFycmF5KDUpOw0KCQlmb3IgKHZhciBpID0gaVNraXAgLSAxOyBpIDwgbWF4SSAmJiAhZG9uZTsgaSArPSBpU2tpcCkNCgkJew0KCQkJLy8gR2V0IGEgcm93IG9mIGJsYWNrL3doaXRlIHZhbHVlcw0KCQkJc3RhdGVDb3VudFswXSA9IDA7DQoJCQlzdGF0ZUNvdW50WzFdID0gMDsNCgkJCXN0YXRlQ291bnRbMl0gPSAwOw0KCQkJc3RhdGVDb3VudFszXSA9IDA7DQoJCQlzdGF0ZUNvdW50WzRdID0gMDsNCgkJCXZhciBjdXJyZW50U3RhdGUgPSAwOw0KCQkJZm9yICh2YXIgaiA9IDA7IGogPCBtYXhKOyBqKyspDQoJCQl7DQoJCQkJaWYgKGltYWdlW2oraSpxcmNvZGUud2lkdGhdICkNCgkJCQl7DQoJCQkJCS8vIEJsYWNrIHBpeGVsDQoJCQkJCWlmICgoY3VycmVudFN0YXRlICYgMSkgPT0gMSkNCgkJCQkJew0KCQkJCQkJLy8gQ291bnRpbmcgd2hpdGUgcGl4ZWxzDQoJCQkJCQljdXJyZW50U3RhdGUrKzsNCgkJCQkJfQ0KCQkJCQlzdGF0ZUNvdW50W2N1cnJlbnRTdGF0ZV0rKzsNCgkJCQl9DQoJCQkJZWxzZQ0KCQkJCXsNCgkJCQkJLy8gV2hpdGUgcGl4ZWwNCgkJCQkJaWYgKChjdXJyZW50U3RhdGUgJiAxKSA9PSAwKQ0KCQkJCQl7DQoJCQkJCQkvLyBDb3VudGluZyBibGFjayBwaXhlbHMNCgkJCQkJCWlmIChjdXJyZW50U3RhdGUgPT0gNCkNCgkJCQkJCXsNCgkJCQkJCQkvLyBBIHdpbm5lcj8NCgkJCQkJCQlpZiAodGhpcy5mb3VuZFBhdHRlcm5Dcm9zcyhzdGF0ZUNvdW50KSkNCgkJCQkJCQl7DQoJCQkJCQkJCS8vIFllcw0KCQkJCQkJCQl2YXIgY29uZmlybWVkID0gdGhpcy5oYW5kbGVQb3NzaWJsZUNlbnRlcihzdGF0ZUNvdW50LCBpLCBqKTsNCgkJCQkJCQkJaWYgKGNvbmZpcm1lZCkNCgkJCQkJCQkJew0KCQkJCQkJCQkJLy8gU3RhcnQgZXhhbWluaW5nIGV2ZXJ5IG90aGVyIGxpbmUuIENoZWNraW5nIGVhY2ggbGluZSB0dXJuZWQgb3V0IHRvIGJlIHRvbw0KCQkJCQkJCQkJLy8gZXhwZW5zaXZlIGFuZCBkaWRuJ3QgaW1wcm92ZSBwZXJmb3JtYW5jZS4NCgkJCQkJCQkJCWlTa2lwID0gMjsNCgkJCQkJCQkJCWlmICh0aGlzLmhhc1NraXBwZWQpDQoJCQkJCQkJCQl7DQoJCQkJCQkJCQkJZG9uZSA9IHRoaXMuaGF2ZU11bHRpcGx5Q29uZmlybWVkQ2VudGVycygpOw0KCQkJCQkJCQkJfQ0KCQkJCQkJCQkJZWxzZQ0KCQkJCQkJCQkJew0KCQkJCQkJCQkJCXZhciByb3dTa2lwID0gdGhpcy5maW5kUm93U2tpcCgpOw0KCQkJCQkJCQkJCWlmIChyb3dTa2lwID4gc3RhdGVDb3VudFsyXSkNCgkJCQkJCQkJCQl7DQoJCQkJCQkJCQkJCS8vIFNraXAgcm93cyBiZXR3ZWVuIHJvdyBvZiBsb3dlciBjb25maXJtZWQgY2VudGVyDQoJCQkJCQkJCQkJCS8vIGFuZCB0b3Agb2YgcHJlc3VtZWQgdGhpcmQgY29uZmlybWVkIGNlbnRlcg0KCQkJCQkJCQkJCQkvLyBidXQgYmFjayB1cCBhIGJpdCB0byBnZXQgYSBmdWxsIGNoYW5jZSBvZiBkZXRlY3RpbmcNCgkJCQkJCQkJCQkJLy8gaXQsIGVudGlyZSB3aWR0aCBvZiBjZW50ZXIgb2YgZmluZGVyIHBhdHRlcm4NCgkJCQkJCQkJCQkJDQoJCQkJCQkJCQkJCS8vIFNraXAgYnkgcm93U2tpcCwgYnV0IGJhY2sgb2ZmIGJ5IHN0YXRlQ291bnRbMl0gKHNpemUgb2YgbGFzdCBjZW50ZXINCgkJCQkJCQkJCQkJLy8gb2YgcGF0dGVybiB3ZSBzYXcpIHRvIGJlIGNvbnNlcnZhdGl2ZSwgYW5kIGFsc28gYmFjayBvZmYgYnkgaVNraXAgd2hpY2gNCgkJCQkJCQkJCQkJLy8gaXMgYWJvdXQgdG8gYmUgcmUtYWRkZWQNCgkJCQkJCQkJCQkJaSArPSByb3dTa2lwIC0gc3RhdGVDb3VudFsyXSAtIGlTa2lwOw0KCQkJCQkJCQkJCQlqID0gbWF4SiAtIDE7DQoJCQkJCQkJCQkJfQ0KCQkJCQkJCQkJfQ0KCQkJCQkJCQl9DQoJCQkJCQkJCWVsc2UNCgkJCQkJCQkJew0KCQkJCQkJCQkJLy8gQWR2YW5jZSB0byBuZXh0IGJsYWNrIHBpeGVsDQoJCQkJCQkJCQlkbyANCgkJCQkJCQkJCXsNCgkJCQkJCQkJCQlqKys7DQoJCQkJCQkJCQl9DQoJCQkJCQkJCQl3aGlsZSAoaiA8IG1heEogJiYgIWltYWdlW2ogKyBpKnFyY29kZS53aWR0aF0pOw0KCQkJCQkJCQkJai0tOyAvLyBiYWNrIHVwIHRvIHRoYXQgbGFzdCB3aGl0ZSBwaXhlbA0KCQkJCQkJCQl9DQoJCQkJCQkJCS8vIENsZWFyIHN0YXRlIHRvIHN0YXJ0IGxvb2tpbmcgYWdhaW4NCgkJCQkJCQkJY3VycmVudFN0YXRlID0gMDsNCgkJCQkJCQkJc3RhdGVDb3VudFswXSA9IDA7DQoJCQkJCQkJCXN0YXRlQ291bnRbMV0gPSAwOw0KCQkJCQkJCQlzdGF0ZUNvdW50WzJdID0gMDsNCgkJCQkJCQkJc3RhdGVDb3VudFszXSA9IDA7DQoJCQkJCQkJCXN0YXRlQ291bnRbNF0gPSAwOw0KCQkJCQkJCX0NCgkJCQkJCQllbHNlDQoJCQkJCQkJew0KCQkJCQkJCQkvLyBObywgc2hpZnQgY291bnRzIGJhY2sgYnkgdHdvDQoJCQkJCQkJCXN0YXRlQ291bnRbMF0gPSBzdGF0ZUNvdW50WzJdOw0KCQkJCQkJCQlzdGF0ZUNvdW50WzFdID0gc3RhdGVDb3VudFszXTsNCgkJCQkJCQkJc3RhdGVDb3VudFsyXSA9IHN0YXRlQ291bnRbNF07DQoJCQkJCQkJCXN0YXRlQ291bnRbM10gPSAxOw0KCQkJCQkJCQlzdGF0ZUNvdW50WzRdID0gMDsNCgkJCQkJCQkJY3VycmVudFN0YXRlID0gMzsNCgkJCQkJCQl9DQoJCQkJCQl9DQoJCQkJCQllbHNlDQoJCQkJCQl7DQoJCQkJCQkJc3RhdGVDb3VudFsrK2N1cnJlbnRTdGF0ZV0rKzsNCgkJCQkJCX0NCgkJCQkJfQ0KCQkJCQllbHNlDQoJCQkJCXsNCgkJCQkJCS8vIENvdW50aW5nIHdoaXRlIHBpeGVscw0KCQkJCQkJc3RhdGVDb3VudFtjdXJyZW50U3RhdGVdKys7DQoJCQkJCX0NCgkJCQl9DQoJCQl9DQoJCQlpZiAodGhpcy5mb3VuZFBhdHRlcm5Dcm9zcyhzdGF0ZUNvdW50KSkNCgkJCXsNCgkJCQl2YXIgY29uZmlybWVkID0gdGhpcy5oYW5kbGVQb3NzaWJsZUNlbnRlcihzdGF0ZUNvdW50LCBpLCBtYXhKKTsNCgkJCQlpZiAoY29uZmlybWVkKQ0KCQkJCXsNCgkJCQkJaVNraXAgPSBzdGF0ZUNvdW50WzBdOw0KCQkJCQlpZiAodGhpcy5oYXNTa2lwcGVkKQ0KCQkJCQl7DQoJCQkJCQkvLyBGb3VuZCBhIHRoaXJkIG9uZQ0KCQkJCQkJZG9uZSA9IHRoaXMuaGF2ZU11bHRpcGx5Q29uZmlybWVkQ2VudGVycygpOw0KCQkJCQl9DQoJCQkJfQ0KCQkJfQ0KCQl9DQoJCQ0KCQl2YXIgcGF0dGVybkluZm8gPSB0aGlzLnNlbGVjdEJlc3RQYXR0ZXJucygpOw0KCQlxcmNvZGUub3JkZXJCZXN0UGF0dGVybnMocGF0dGVybkluZm8pOw0KCQkNCgkJcmV0dXJuIG5ldyBGaW5kZXJQYXR0ZXJuSW5mbyhwYXR0ZXJuSW5mbyk7DQoJfTsNCn0=</uax:ByteString>
		</Value>
	</UAVariable>
	<UAVariable NodeId="ns=1;s=SYSTEM.LIBRARY.PROJECT.RESOURCES/QRCodeScanner/formatinf.js" BrowseName="1:formatinf.js" DataType="ByteString" AccessLevel="103" UserAccessLevel="103" Historizing="true">
		<DisplayName Locale="en">formatinf.js</DisplayName>
		<Description Locale="en">formatinf.js</Description>
		<References>
			<Reference ReferenceType="HasComponent" IsForward="false">ns=1;s=SYSTEM.LIBRARY.PROJECT.RESOURCES/QRCodeScanner</Reference>
			<Reference ReferenceType="HasTypeDefinition">ns=1;s=VariableTypes.ATVISE.Resource.Javascript</Reference>
			<Reference ReferenceType="HasProperty">ns=1;s=VariableTypes.ATVISE.Resource.Javascript.Compress</Reference>
		</References>
		<Value>
			<uax:ByteString>LyoNCiAgUG9ydGVkIHRvIEphdmFTY3JpcHQgYnkgTGF6YXIgTGFzemxvIDIwMTEgDQogIA0KICBsYXphcnNvZnRAZ21haWwuY29tLCB3d3cubGF6YXJzb2Z0LmluZm8NCiAgDQoqLw0KDQovKg0KKg0KKiBDb3B5cmlnaHQgMjAwNyBaWGluZyBhdXRob3JzDQoqDQoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOw0KKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuDQoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KKg0KKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KKg0KKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KKi8NCg0KDQp2YXIgRk9STUFUX0lORk9fTUFTS19RUiA9IDB4NTQxMjsNCnZhciBGT1JNQVRfSU5GT19ERUNPREVfTE9PS1VQID0gbmV3IEFycmF5KG5ldyBBcnJheSgweDU0MTIsIDB4MDApLCBuZXcgQXJyYXkoMHg1MTI1LCAweDAxKSwgbmV3IEFycmF5KDB4NUU3QywgMHgwMiksIG5ldyBBcnJheSgweDVCNEIsIDB4MDMpLCBuZXcgQXJyYXkoMHg0NUY5LCAweDA0KSwgbmV3IEFycmF5KDB4NDBDRSwgMHgwNSksIG5ldyBBcnJheSgweDRGOTcsIDB4MDYpLCBuZXcgQXJyYXkoMHg0QUEwLCAweDA3KSwgbmV3IEFycmF5KDB4NzdDNCwgMHgwOCksIG5ldyBBcnJheSgweDcyRjMsIDB4MDkpLCBuZXcgQXJyYXkoMHg3REFBLCAweDBBKSwgbmV3IEFycmF5KDB4Nzg5RCwgMHgwQiksIG5ldyBBcnJheSgweDY2MkYsIDB4MEMpLCBuZXcgQXJyYXkoMHg2MzE4LCAweDBEKSwgbmV3IEFycmF5KDB4NkM0MSwgMHgwRSksIG5ldyBBcnJheSgweDY5NzYsIDB4MEYpLCBuZXcgQXJyYXkoMHgxNjg5LCAweDEwKSwgbmV3IEFycmF5KDB4MTNCRSwgMHgxMSksIG5ldyBBcnJheSgweDFDRTcsIDB4MTIpLCBuZXcgQXJyYXkoMHgxOUQwLCAweDEzKSwgbmV3IEFycmF5KDB4MDc2MiwgMHgxNCksIG5ldyBBcnJheSgweDAyNTUsIDB4MTUpLCBuZXcgQXJyYXkoMHgwRDBDLCAweDE2KSwgbmV3IEFycmF5KDB4MDgzQiwgMHgxNyksIG5ldyBBcnJheSgweDM1NUYsIDB4MTgpLCBuZXcgQXJyYXkoMHgzMDY4LCAweDE5KSwgbmV3IEFycmF5KDB4M0YzMSwgMHgxQSksIG5ldyBBcnJheSgweDNBMDYsIDB4MUIpLCBuZXcgQXJyYXkoMHgyNEI0LCAweDFDKSwgbmV3IEFycmF5KDB4MjE4MywgMHgxRCksIG5ldyBBcnJheSgweDJFREEsIDB4MUUpLCBuZXcgQXJyYXkoMHgyQkVELCAweDFGKSk7DQp2YXIgQklUU19TRVRfSU5fSEFMRl9CWVRFID0gbmV3IEFycmF5KDAsIDEsIDEsIDIsIDEsIDIsIDIsIDMsIDEsIDIsIDIsIDMsIDIsIDMsIDMsIDQpOw0KDQoNCmZ1bmN0aW9uIEZvcm1hdEluZm9ybWF0aW9uKGZvcm1hdEluZm8pDQp7DQoJdGhpcy5lcnJvckNvcnJlY3Rpb25MZXZlbCA9IEVycm9yQ29ycmVjdGlvbkxldmVsLmZvckJpdHMoKGZvcm1hdEluZm8gPj4gMykgJiAweDAzKTsNCgl0aGlzLmRhdGFNYXNrID0gIChmb3JtYXRJbmZvICYgMHgwNyk7DQoNCgl0aGlzLl9fZGVmaW5lR2V0dGVyX18oIkVycm9yQ29ycmVjdGlvbkxldmVsIiwgZnVuY3Rpb24oKQ0KCXsNCgkJcmV0dXJuIHRoaXMuZXJyb3JDb3JyZWN0aW9uTGV2ZWw7DQoJfSk7DQoJdGhpcy5fX2RlZmluZUdldHRlcl9fKCJEYXRhTWFzayIsIGZ1bmN0aW9uKCkNCgl7DQoJCXJldHVybiB0aGlzLmRhdGFNYXNrOw0KCX0pOw0KCXRoaXMuR2V0SGFzaENvZGU9ZnVuY3Rpb24oKQ0KCXsNCgkJcmV0dXJuICh0aGlzLmVycm9yQ29ycmVjdGlvbkxldmVsLm9yZGluYWwoKSA8PCAzKSB8ICB0aGlzLmRhdGFNYXNrOw0KCX0NCgl0aGlzLkVxdWFscz1mdW5jdGlvbiggbykNCgl7DQoJCXZhciBvdGhlciA9ICBvOw0KCQlyZXR1cm4gdGhpcy5lcnJvckNvcnJlY3Rpb25MZXZlbCA9PSBvdGhlci5lcnJvckNvcnJlY3Rpb25MZXZlbCAmJiB0aGlzLmRhdGFNYXNrID09IG90aGVyLmRhdGFNYXNrOw0KCX0NCn0NCg0KRm9ybWF0SW5mb3JtYXRpb24ubnVtQml0c0RpZmZlcmluZz1mdW5jdGlvbiggYSwgIGIpDQp7DQoJYSBePSBiOyAvLyBhIG5vdyBoYXMgYSAxIGJpdCBleGFjdGx5IHdoZXJlIGl0cyBiaXQgZGlmZmVycyB3aXRoIGIncw0KCS8vIENvdW50IGJpdHMgc2V0IHF1aWNrbHkgd2l0aCBhIHNlcmllcyBvZiBsb29rdXBzOg0KCXJldHVybiBCSVRTX1NFVF9JTl9IQUxGX0JZVEVbYSAmIDB4MEZdICsgQklUU19TRVRfSU5fSEFMRl9CWVRFWyhVUlNoaWZ0KGEsIDQpICYgMHgwRildICsgQklUU19TRVRfSU5fSEFMRl9CWVRFWyhVUlNoaWZ0KGEsIDgpICYgMHgwRildICsgQklUU19TRVRfSU5fSEFMRl9CWVRFWyhVUlNoaWZ0KGEsIDEyKSAmIDB4MEYpXSArIEJJVFNfU0VUX0lOX0hBTEZfQllURVsoVVJTaGlmdChhLCAxNikgJiAweDBGKV0gKyBCSVRTX1NFVF9JTl9IQUxGX0JZVEVbKFVSU2hpZnQoYSwgMjApICYgMHgwRildICsgQklUU19TRVRfSU5fSEFMRl9CWVRFWyhVUlNoaWZ0KGEsIDI0KSAmIDB4MEYpXSArIEJJVFNfU0VUX0lOX0hBTEZfQllURVsoVVJTaGlmdChhLCAyOCkgJiAweDBGKV07DQp9DQoNCkZvcm1hdEluZm9ybWF0aW9uLmRlY29kZUZvcm1hdEluZm9ybWF0aW9uPWZ1bmN0aW9uKCBtYXNrZWRGb3JtYXRJbmZvKQ0Kew0KCXZhciBmb3JtYXRJbmZvID0gRm9ybWF0SW5mb3JtYXRpb24uZG9EZWNvZGVGb3JtYXRJbmZvcm1hdGlvbihtYXNrZWRGb3JtYXRJbmZvKTsNCglpZiAoZm9ybWF0SW5mbyAhPSBudWxsKQ0KCXsNCgkJcmV0dXJuIGZvcm1hdEluZm87DQoJfQ0KCS8vIFNob3VsZCByZXR1cm4gbnVsbCwgYnV0LCBzb21lIFFSIGNvZGVzIGFwcGFyZW50bHkNCgkvLyBkbyBub3QgbWFzayB0aGlzIGluZm8uIFRyeSBhZ2FpbiBieSBhY3R1YWxseSBtYXNraW5nIHRoZSBwYXR0ZXJuDQoJLy8gZmlyc3QNCglyZXR1cm4gRm9ybWF0SW5mb3JtYXRpb24uZG9EZWNvZGVGb3JtYXRJbmZvcm1hdGlvbihtYXNrZWRGb3JtYXRJbmZvIF4gRk9STUFUX0lORk9fTUFTS19RUik7DQp9DQpGb3JtYXRJbmZvcm1hdGlvbi5kb0RlY29kZUZvcm1hdEluZm9ybWF0aW9uPWZ1bmN0aW9uKCBtYXNrZWRGb3JtYXRJbmZvKQ0Kew0KCS8vIEZpbmQgdGhlIGludCBpbiBGT1JNQVRfSU5GT19ERUNPREVfTE9PS1VQIHdpdGggZmV3ZXN0IGJpdHMgZGlmZmVyaW5nDQoJdmFyIGJlc3REaWZmZXJlbmNlID0gMHhmZmZmZmZmZjsNCgl2YXIgYmVzdEZvcm1hdEluZm8gPSAwOw0KCWZvciAodmFyIGkgPSAwOyBpIDwgRk9STUFUX0lORk9fREVDT0RFX0xPT0tVUC5sZW5ndGg7IGkrKykNCgl7DQoJCXZhciBkZWNvZGVJbmZvID0gRk9STUFUX0lORk9fREVDT0RFX0xPT0tVUFtpXTsNCgkJdmFyIHRhcmdldEluZm8gPSBkZWNvZGVJbmZvWzBdOw0KCQlpZiAodGFyZ2V0SW5mbyA9PSBtYXNrZWRGb3JtYXRJbmZvKQ0KCQl7DQoJCQkvLyBGb3VuZCBhbiBleGFjdCBtYXRjaA0KCQkJcmV0dXJuIG5ldyBGb3JtYXRJbmZvcm1hdGlvbihkZWNvZGVJbmZvWzFdKTsNCgkJfQ0KCQl2YXIgYml0c0RpZmZlcmVuY2UgPSB0aGlzLm51bUJpdHNEaWZmZXJpbmcobWFza2VkRm9ybWF0SW5mbywgdGFyZ2V0SW5mbyk7DQoJCWlmIChiaXRzRGlmZmVyZW5jZSA8IGJlc3REaWZmZXJlbmNlKQ0KCQl7DQoJCQliZXN0Rm9ybWF0SW5mbyA9IGRlY29kZUluZm9bMV07DQoJCQliZXN0RGlmZmVyZW5jZSA9IGJpdHNEaWZmZXJlbmNlOw0KCQl9DQoJfQ0KCS8vIEhhbW1pbmcgZGlzdGFuY2Ugb2YgdGhlIDMyIG1hc2tlZCBjb2RlcyBpcyA3LCBieSBjb25zdHJ1Y3Rpb24sIHNvIDw9IDMgYml0cw0KCS8vIGRpZmZlcmluZyBtZWFucyB3ZSBmb3VuZCBhIG1hdGNoDQoJaWYgKGJlc3REaWZmZXJlbmNlIDw9IDMpDQoJew0KCQlyZXR1cm4gbmV3IEZvcm1hdEluZm9ybWF0aW9uKGJlc3RGb3JtYXRJbmZvKTsNCgl9DQoJcmV0dXJuIG51bGw7DQp9DQoNCgkJ</uax:ByteString>
		</Value>
	</UAVariable>
	<UAVariable NodeId="ns=1;s=SYSTEM.LIBRARY.PROJECT.RESOURCES/QRCodeScanner/gf256.js" BrowseName="1:gf256.js" DataType="ByteString" AccessLevel="103" UserAccessLevel="103" Historizing="true">
		<DisplayName Locale="en">gf256.js</DisplayName>
		<Description Locale="en">gf256.js</Description>
		<References>
			<Reference ReferenceType="HasComponent" IsForward="false">ns=1;s=SYSTEM.LIBRARY.PROJECT.RESOURCES/QRCodeScanner</Reference>
			<Reference ReferenceType="HasTypeDefinition">ns=1;s=VariableTypes.ATVISE.Resource.Javascript</Reference>
			<Reference ReferenceType="HasProperty">ns=1;s=VariableTypes.ATVISE.Resource.Javascript.Compress</Reference>
		</References>
		<Value>
			<uax:ByteString>LyoNCiAgUG9ydGVkIHRvIEphdmFTY3JpcHQgYnkgTGF6YXIgTGFzemxvIDIwMTEgDQogIA0KICBsYXphcnNvZnRAZ21haWwuY29tLCB3d3cubGF6YXJzb2Z0LmluZm8NCiAgDQoqLw0KDQovKg0KKg0KKiBDb3B5cmlnaHQgMjAwNyBaWGluZyBhdXRob3JzDQoqDQoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOw0KKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuDQoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KKg0KKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KKg0KKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KKi8NCg0KDQpmdW5jdGlvbiBHRjI1NiggcHJpbWl0aXZlKQ0Kew0KCXRoaXMuZXhwVGFibGUgPSBuZXcgQXJyYXkoMjU2KTsNCgl0aGlzLmxvZ1RhYmxlID0gbmV3IEFycmF5KDI1Nik7DQoJdmFyIHggPSAxOw0KCWZvciAodmFyIGkgPSAwOyBpIDwgMjU2OyBpKyspDQoJew0KCQl0aGlzLmV4cFRhYmxlW2ldID0geDsNCgkJeCA8PD0gMTsgLy8geCA9IHggKiAyOyB3ZSdyZSBhc3N1bWluZyB0aGUgZ2VuZXJhdG9yIGFscGhhIGlzIDINCgkJaWYgKHggPj0gMHgxMDApDQoJCXsNCgkJCXggXj0gcHJpbWl0aXZlOw0KCQl9DQoJfQ0KCWZvciAodmFyIGkgPSAwOyBpIDwgMjU1OyBpKyspDQoJew0KCQl0aGlzLmxvZ1RhYmxlW3RoaXMuZXhwVGFibGVbaV1dID0gaTsNCgl9DQoJLy8gbG9nVGFibGVbMF0gPT0gMCBidXQgdGhpcyBzaG91bGQgbmV2ZXIgYmUgdXNlZA0KCXZhciBhdDA9bmV3IEFycmF5KDEpO2F0MFswXT0wOw0KCXRoaXMuemVybyA9IG5ldyBHRjI1NlBvbHkodGhpcywgbmV3IEFycmF5KGF0MCkpOw0KCXZhciBhdDE9bmV3IEFycmF5KDEpO2F0MVswXT0xOw0KCXRoaXMub25lID0gbmV3IEdGMjU2UG9seSh0aGlzLCBuZXcgQXJyYXkoYXQxKSk7DQoJDQoJdGhpcy5fX2RlZmluZUdldHRlcl9fKCJaZXJvIiwgZnVuY3Rpb24oKQ0KCXsNCgkJcmV0dXJuIHRoaXMuemVybzsNCgl9KTsNCgl0aGlzLl9fZGVmaW5lR2V0dGVyX18oIk9uZSIsIGZ1bmN0aW9uKCkNCgl7DQoJCXJldHVybiB0aGlzLm9uZTsNCgl9KTsNCgl0aGlzLmJ1aWxkTW9ub21pYWw9ZnVuY3Rpb24oIGRlZ3JlZSwgIGNvZWZmaWNpZW50KQ0KCQl7DQoJCQlpZiAoZGVncmVlIDwgMCkNCgkJCXsNCgkJCQl0aHJvdyAiU3lzdGVtLkFyZ3VtZW50RXhjZXB0aW9uIjsNCgkJCX0NCgkJCWlmIChjb2VmZmljaWVudCA9PSAwKQ0KCQkJew0KCQkJCXJldHVybiB0aGlzLnplcm87DQoJCQl9DQoJCQl2YXIgY29lZmZpY2llbnRzID0gbmV3IEFycmF5KGRlZ3JlZSArIDEpOw0KCQkJZm9yKHZhciBpPTA7aTxjb2VmZmljaWVudHMubGVuZ3RoO2krKyljb2VmZmljaWVudHNbaV09MDsNCgkJCWNvZWZmaWNpZW50c1swXSA9IGNvZWZmaWNpZW50Ow0KCQkJcmV0dXJuIG5ldyBHRjI1NlBvbHkodGhpcywgY29lZmZpY2llbnRzKTsNCgkJfQ0KCXRoaXMuZXhwPWZ1bmN0aW9uKCBhKQ0KCQl7DQoJCQlyZXR1cm4gdGhpcy5leHBUYWJsZVthXTsNCgkJfQ0KCXRoaXMubG9nPWZ1bmN0aW9uKCBhKQ0KCQl7DQoJCQlpZiAoYSA9PSAwKQ0KCQkJew0KCQkJCXRocm93ICJTeXN0ZW0uQXJndW1lbnRFeGNlcHRpb24iOw0KCQkJfQ0KCQkJcmV0dXJuIHRoaXMubG9nVGFibGVbYV07DQoJCX0NCgl0aGlzLmludmVyc2U9ZnVuY3Rpb24oIGEpDQoJCXsNCgkJCWlmIChhID09IDApDQoJCQl7DQoJCQkJdGhyb3cgIlN5c3RlbS5Bcml0aG1ldGljRXhjZXB0aW9uIjsNCgkJCX0NCgkJCXJldHVybiB0aGlzLmV4cFRhYmxlWzI1NSAtIHRoaXMubG9nVGFibGVbYV1dOw0KCQl9DQoJdGhpcy5tdWx0aXBseT1mdW5jdGlvbiggYSwgIGIpDQoJCXsNCgkJCWlmIChhID09IDAgfHwgYiA9PSAwKQ0KCQkJew0KCQkJCXJldHVybiAwOw0KCQkJfQ0KCQkJaWYgKGEgPT0gMSkNCgkJCXsNCgkJCQlyZXR1cm4gYjsNCgkJCX0NCgkJCWlmIChiID09IDEpDQoJCQl7DQoJCQkJcmV0dXJuIGE7DQoJCQl9DQoJCQlyZXR1cm4gdGhpcy5leHBUYWJsZVsodGhpcy5sb2dUYWJsZVthXSArIHRoaXMubG9nVGFibGVbYl0pICUgMjU1XTsNCgkJfQkJDQp9DQoNCkdGMjU2LlFSX0NPREVfRklFTEQgPSBuZXcgR0YyNTYoMHgwMTFEKTsNCkdGMjU2LkRBVEFfTUFUUklYX0ZJRUxEID0gbmV3IEdGMjU2KDB4MDEyRCk7DQoNCkdGMjU2LmFkZE9yU3VidHJhY3Q9ZnVuY3Rpb24oIGEsICBiKQ0Kew0KCXJldHVybiBhIF4gYjsNCn0=</uax:ByteString>
		</Value>
	</UAVariable>
	<UAVariable NodeId="ns=1;s=SYSTEM.LIBRARY.PROJECT.RESOURCES/QRCodeScanner/gf256poly.js" BrowseName="1:gf256poly.js" DataType="ByteString" AccessLevel="103" UserAccessLevel="103" Historizing="true">
		<DisplayName Locale="en">gf256poly.js</DisplayName>
		<Description Locale="en">gf256poly.js</Description>
		<References>
			<Reference ReferenceType="HasComponent" IsForward="false">ns=1;s=SYSTEM.LIBRARY.PROJECT.RESOURCES/QRCodeScanner</Reference>
			<Reference ReferenceType="HasTypeDefinition">ns=1;s=VariableTypes.ATVISE.Resource.Javascript</Reference>
			<Reference ReferenceType="HasProperty">ns=1;s=VariableTypes.ATVISE.Resource.Javascript.Compress</Reference>
		</References>
		<Value>
			<uax:ByteString>LyoNCiAgUG9ydGVkIHRvIEphdmFTY3JpcHQgYnkgTGF6YXIgTGFzemxvIDIwMTEgDQogIA0KICBsYXphcnNvZnRAZ21haWwuY29tLCB3d3cubGF6YXJzb2Z0LmluZm8NCiAgDQoqLw0KDQovKg0KKg0KKiBDb3B5cmlnaHQgMjAwNyBaWGluZyBhdXRob3JzDQoqDQoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOw0KKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuDQoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KKg0KKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KKg0KKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KKi8NCg0KDQpmdW5jdGlvbiBHRjI1NlBvbHkoZmllbGQsICBjb2VmZmljaWVudHMpDQp7DQoJaWYgKGNvZWZmaWNpZW50cyA9PSBudWxsIHx8IGNvZWZmaWNpZW50cy5sZW5ndGggPT0gMCkNCgl7DQoJCXRocm93ICJTeXN0ZW0uQXJndW1lbnRFeGNlcHRpb24iOw0KCX0NCgl0aGlzLmZpZWxkID0gZmllbGQ7DQoJdmFyIGNvZWZmaWNpZW50c0xlbmd0aCA9IGNvZWZmaWNpZW50cy5sZW5ndGg7DQoJaWYgKGNvZWZmaWNpZW50c0xlbmd0aCA+IDEgJiYgY29lZmZpY2llbnRzWzBdID09IDApDQoJew0KCQkvLyBMZWFkaW5nIHRlcm0gbXVzdCBiZSBub24temVybyBmb3IgYW55dGhpbmcgZXhjZXB0IHRoZSBjb25zdGFudCBwb2x5bm9taWFsICIwIg0KCQl2YXIgZmlyc3ROb25aZXJvID0gMTsNCgkJd2hpbGUgKGZpcnN0Tm9uWmVybyA8IGNvZWZmaWNpZW50c0xlbmd0aCAmJiBjb2VmZmljaWVudHNbZmlyc3ROb25aZXJvXSA9PSAwKQ0KCQl7DQoJCQlmaXJzdE5vblplcm8rKzsNCgkJfQ0KCQlpZiAoZmlyc3ROb25aZXJvID09IGNvZWZmaWNpZW50c0xlbmd0aCkNCgkJew0KCQkJdGhpcy5jb2VmZmljaWVudHMgPSBmaWVsZC5aZXJvLmNvZWZmaWNpZW50czsNCgkJfQ0KCQllbHNlDQoJCXsNCgkJCXRoaXMuY29lZmZpY2llbnRzID0gbmV3IEFycmF5KGNvZWZmaWNpZW50c0xlbmd0aCAtIGZpcnN0Tm9uWmVybyk7DQoJCQlmb3IodmFyIGk9MDtpPHRoaXMuY29lZmZpY2llbnRzLmxlbmd0aDtpKyspdGhpcy5jb2VmZmljaWVudHNbaV09MDsNCgkJCS8vQXJyYXkuQ29weShjb2VmZmljaWVudHMsIGZpcnN0Tm9uWmVybywgdGhpcy5jb2VmZmljaWVudHMsIDAsIHRoaXMuY29lZmZpY2llbnRzLmxlbmd0aCk7DQoJCQlmb3IodmFyIGNpPTA7Y2k8dGhpcy5jb2VmZmljaWVudHMubGVuZ3RoO2NpKyspdGhpcy5jb2VmZmljaWVudHNbY2ldPWNvZWZmaWNpZW50c1tmaXJzdE5vblplcm8rY2ldOw0KCQl9DQoJfQ0KCWVsc2UNCgl7DQoJCXRoaXMuY29lZmZpY2llbnRzID0gY29lZmZpY2llbnRzOw0KCX0NCgkNCgl0aGlzLl9fZGVmaW5lR2V0dGVyX18oIlplcm8iLCBmdW5jdGlvbigpDQoJew0KCQlyZXR1cm4gdGhpcy5jb2VmZmljaWVudHNbMF0gPT0gMDsNCgl9KTsNCgl0aGlzLl9fZGVmaW5lR2V0dGVyX18oIkRlZ3JlZSIsIGZ1bmN0aW9uKCkNCgl7DQoJCXJldHVybiB0aGlzLmNvZWZmaWNpZW50cy5sZW5ndGggLSAxOw0KCX0pOw0KCXRoaXMuX19kZWZpbmVHZXR0ZXJfXygiQ29lZmZpY2llbnRzIiwgZnVuY3Rpb24oKQ0KCXsNCgkJcmV0dXJuIHRoaXMuY29lZmZpY2llbnRzOw0KCX0pOw0KCQ0KCXRoaXMuZ2V0Q29lZmZpY2llbnQ9ZnVuY3Rpb24oIGRlZ3JlZSkNCgl7DQoJCXJldHVybiB0aGlzLmNvZWZmaWNpZW50c1t0aGlzLmNvZWZmaWNpZW50cy5sZW5ndGggLSAxIC0gZGVncmVlXTsNCgl9DQoJDQoJdGhpcy5ldmFsdWF0ZUF0PWZ1bmN0aW9uKCBhKQ0KCXsNCgkJaWYgKGEgPT0gMCkNCgkJew0KCQkJLy8gSnVzdCByZXR1cm4gdGhlIHheMCBjb2VmZmljaWVudA0KCQkJcmV0dXJuIHRoaXMuZ2V0Q29lZmZpY2llbnQoMCk7DQoJCX0NCgkJdmFyIHNpemUgPSB0aGlzLmNvZWZmaWNpZW50cy5sZW5ndGg7DQoJCWlmIChhID09IDEpDQoJCXsNCgkJCS8vIEp1c3QgdGhlIHN1bSBvZiB0aGUgY29lZmZpY2llbnRzDQoJCQl2YXIgcmVzdWx0ID0gMDsNCgkJCWZvciAodmFyIGkgPSAwOyBpIDwgc2l6ZTsgaSsrKQ0KCQkJew0KCQkJCXJlc3VsdCA9IEdGMjU2LmFkZE9yU3VidHJhY3QocmVzdWx0LCB0aGlzLmNvZWZmaWNpZW50c1tpXSk7DQoJCQl9DQoJCQlyZXR1cm4gcmVzdWx0Ow0KCQl9DQoJCXZhciByZXN1bHQyID0gdGhpcy5jb2VmZmljaWVudHNbMF07DQoJCWZvciAodmFyIGkgPSAxOyBpIDwgc2l6ZTsgaSsrKQ0KCQl7DQoJCQlyZXN1bHQyID0gR0YyNTYuYWRkT3JTdWJ0cmFjdCh0aGlzLmZpZWxkLm11bHRpcGx5KGEsIHJlc3VsdDIpLCB0aGlzLmNvZWZmaWNpZW50c1tpXSk7DQoJCX0NCgkJcmV0dXJuIHJlc3VsdDI7DQoJfQ0KCQ0KCXRoaXMuYWRkT3JTdWJ0cmFjdD1mdW5jdGlvbiggb3RoZXIpDQoJCXsNCgkJCWlmICh0aGlzLmZpZWxkICE9IG90aGVyLmZpZWxkKQ0KCQkJew0KCQkJCXRocm93ICJHRjI1NlBvbHlzIGRvIG5vdCBoYXZlIHNhbWUgR0YyNTYgZmllbGQiOw0KCQkJfQ0KCQkJaWYgKHRoaXMuWmVybykNCgkJCXsNCgkJCQlyZXR1cm4gb3RoZXI7DQoJCQl9DQoJCQlpZiAob3RoZXIuWmVybykNCgkJCXsNCgkJCQlyZXR1cm4gdGhpczsNCgkJCX0NCgkJCQ0KCQkJdmFyIHNtYWxsZXJDb2VmZmljaWVudHMgPSB0aGlzLmNvZWZmaWNpZW50czsNCgkJCXZhciBsYXJnZXJDb2VmZmljaWVudHMgPSBvdGhlci5jb2VmZmljaWVudHM7DQoJCQlpZiAoc21hbGxlckNvZWZmaWNpZW50cy5sZW5ndGggPiBsYXJnZXJDb2VmZmljaWVudHMubGVuZ3RoKQ0KCQkJew0KCQkJCXZhciB0ZW1wID0gc21hbGxlckNvZWZmaWNpZW50czsNCgkJCQlzbWFsbGVyQ29lZmZpY2llbnRzID0gbGFyZ2VyQ29lZmZpY2llbnRzOw0KCQkJCWxhcmdlckNvZWZmaWNpZW50cyA9IHRlbXA7DQoJCQl9DQoJCQl2YXIgc3VtRGlmZiA9IG5ldyBBcnJheShsYXJnZXJDb2VmZmljaWVudHMubGVuZ3RoKTsNCgkJCXZhciBsZW5ndGhEaWZmID0gbGFyZ2VyQ29lZmZpY2llbnRzLmxlbmd0aCAtIHNtYWxsZXJDb2VmZmljaWVudHMubGVuZ3RoOw0KCQkJLy8gQ29weSBoaWdoLW9yZGVyIHRlcm1zIG9ubHkgZm91bmQgaW4gaGlnaGVyLWRlZ3JlZSBwb2x5bm9taWFsJ3MgY29lZmZpY2llbnRzDQoJCQkvL0FycmF5LkNvcHkobGFyZ2VyQ29lZmZpY2llbnRzLCAwLCBzdW1EaWZmLCAwLCBsZW5ndGhEaWZmKTsNCgkJCWZvcih2YXIgY2k9MDtjaTxsZW5ndGhEaWZmO2NpKyspc3VtRGlmZltjaV09bGFyZ2VyQ29lZmZpY2llbnRzW2NpXTsNCgkJCQ0KCQkJZm9yICh2YXIgaSA9IGxlbmd0aERpZmY7IGkgPCBsYXJnZXJDb2VmZmljaWVudHMubGVuZ3RoOyBpKyspDQoJCQl7DQoJCQkJc3VtRGlmZltpXSA9IEdGMjU2LmFkZE9yU3VidHJhY3Qoc21hbGxlckNvZWZmaWNpZW50c1tpIC0gbGVuZ3RoRGlmZl0sIGxhcmdlckNvZWZmaWNpZW50c1tpXSk7DQoJCQl9DQoJCQkNCgkJCXJldHVybiBuZXcgR0YyNTZQb2x5KGZpZWxkLCBzdW1EaWZmKTsNCgl9DQoJdGhpcy5tdWx0aXBseTE9ZnVuY3Rpb24oIG90aGVyKQ0KCQl7DQoJCQlpZiAodGhpcy5maWVsZCE9b3RoZXIuZmllbGQpDQoJCQl7DQoJCQkJdGhyb3cgIkdGMjU2UG9seXMgZG8gbm90IGhhdmUgc2FtZSBHRjI1NiBmaWVsZCI7DQoJCQl9DQoJCQlpZiAodGhpcy5aZXJvIHx8IG90aGVyLlplcm8pDQoJCQl7DQoJCQkJcmV0dXJuIHRoaXMuZmllbGQuWmVybzsNCgkJCX0NCgkJCXZhciBhQ29lZmZpY2llbnRzID0gdGhpcy5jb2VmZmljaWVudHM7DQoJCQl2YXIgYUxlbmd0aCA9IGFDb2VmZmljaWVudHMubGVuZ3RoOw0KCQkJdmFyIGJDb2VmZmljaWVudHMgPSBvdGhlci5jb2VmZmljaWVudHM7DQoJCQl2YXIgYkxlbmd0aCA9IGJDb2VmZmljaWVudHMubGVuZ3RoOw0KCQkJdmFyIHByb2R1Y3QgPSBuZXcgQXJyYXkoYUxlbmd0aCArIGJMZW5ndGggLSAxKTsNCgkJCWZvciAodmFyIGkgPSAwOyBpIDwgYUxlbmd0aDsgaSsrKQ0KCQkJew0KCQkJCXZhciBhQ29lZmYgPSBhQ29lZmZpY2llbnRzW2ldOw0KCQkJCWZvciAodmFyIGogPSAwOyBqIDwgYkxlbmd0aDsgaisrKQ0KCQkJCXsNCgkJCQkJcHJvZHVjdFtpICsgal0gPSBHRjI1Ni5hZGRPclN1YnRyYWN0KHByb2R1Y3RbaSArIGpdLCB0aGlzLmZpZWxkLm11bHRpcGx5KGFDb2VmZiwgYkNvZWZmaWNpZW50c1tqXSkpOw0KCQkJCX0NCgkJCX0NCgkJCXJldHVybiBuZXcgR0YyNTZQb2x5KHRoaXMuZmllbGQsIHByb2R1Y3QpOw0KCQl9DQoJdGhpcy5tdWx0aXBseTI9ZnVuY3Rpb24oIHNjYWxhcikNCgkJew0KCQkJaWYgKHNjYWxhciA9PSAwKQ0KCQkJew0KCQkJCXJldHVybiB0aGlzLmZpZWxkLlplcm87DQoJCQl9DQoJCQlpZiAoc2NhbGFyID09IDEpDQoJCQl7DQoJCQkJcmV0dXJuIHRoaXM7DQoJCQl9DQoJCQl2YXIgc2l6ZSA9IHRoaXMuY29lZmZpY2llbnRzLmxlbmd0aDsNCgkJCXZhciBwcm9kdWN0ID0gbmV3IEFycmF5KHNpemUpOw0KCQkJZm9yICh2YXIgaSA9IDA7IGkgPCBzaXplOyBpKyspDQoJCQl7DQoJCQkJcHJvZHVjdFtpXSA9IHRoaXMuZmllbGQubXVsdGlwbHkodGhpcy5jb2VmZmljaWVudHNbaV0sIHNjYWxhcik7DQoJCQl9DQoJCQlyZXR1cm4gbmV3IEdGMjU2UG9seSh0aGlzLmZpZWxkLCBwcm9kdWN0KTsNCgkJfQ0KCXRoaXMubXVsdGlwbHlCeU1vbm9taWFsPWZ1bmN0aW9uKCBkZWdyZWUsICBjb2VmZmljaWVudCkNCgkJew0KCQkJaWYgKGRlZ3JlZSA8IDApDQoJCQl7DQoJCQkJdGhyb3cgIlN5c3RlbS5Bcmd1bWVudEV4Y2VwdGlvbiI7DQoJCQl9DQoJCQlpZiAoY29lZmZpY2llbnQgPT0gMCkNCgkJCXsNCgkJCQlyZXR1cm4gdGhpcy5maWVsZC5aZXJvOw0KCQkJfQ0KCQkJdmFyIHNpemUgPSB0aGlzLmNvZWZmaWNpZW50cy5sZW5ndGg7DQoJCQl2YXIgcHJvZHVjdCA9IG5ldyBBcnJheShzaXplICsgZGVncmVlKTsNCgkJCWZvcih2YXIgaT0wO2k8cHJvZHVjdC5sZW5ndGg7aSsrKXByb2R1Y3RbaV09MDsNCgkJCWZvciAodmFyIGkgPSAwOyBpIDwgc2l6ZTsgaSsrKQ0KCQkJew0KCQkJCXByb2R1Y3RbaV0gPSB0aGlzLmZpZWxkLm11bHRpcGx5KHRoaXMuY29lZmZpY2llbnRzW2ldLCBjb2VmZmljaWVudCk7DQoJCQl9DQoJCQlyZXR1cm4gbmV3IEdGMjU2UG9seSh0aGlzLmZpZWxkLCBwcm9kdWN0KTsNCgkJfQ0KCXRoaXMuZGl2aWRlPWZ1bmN0aW9uKCBvdGhlcikNCgkJew0KCQkJaWYgKHRoaXMuZmllbGQhPW90aGVyLmZpZWxkKQ0KCQkJew0KCQkJCXRocm93ICJHRjI1NlBvbHlzIGRvIG5vdCBoYXZlIHNhbWUgR0YyNTYgZmllbGQiOw0KCQkJfQ0KCQkJaWYgKG90aGVyLlplcm8pDQoJCQl7DQoJCQkJdGhyb3cgIkRpdmlkZSBieSAwIjsNCgkJCX0NCgkJCQ0KCQkJdmFyIHF1b3RpZW50ID0gdGhpcy5maWVsZC5aZXJvOw0KCQkJdmFyIHJlbWFpbmRlciA9IHRoaXM7DQoJCQkNCgkJCXZhciBkZW5vbWluYXRvckxlYWRpbmdUZXJtID0gb3RoZXIuZ2V0Q29lZmZpY2llbnQob3RoZXIuRGVncmVlKTsNCgkJCXZhciBpbnZlcnNlRGVub21pbmF0b3JMZWFkaW5nVGVybSA9IHRoaXMuZmllbGQuaW52ZXJzZShkZW5vbWluYXRvckxlYWRpbmdUZXJtKTsNCgkJCQ0KCQkJd2hpbGUgKHJlbWFpbmRlci5EZWdyZWUgPj0gb3RoZXIuRGVncmVlICYmICFyZW1haW5kZXIuWmVybykNCgkJCXsNCgkJCQl2YXIgZGVncmVlRGlmZmVyZW5jZSA9IHJlbWFpbmRlci5EZWdyZWUgLSBvdGhlci5EZWdyZWU7DQoJCQkJdmFyIHNjYWxlID0gdGhpcy5maWVsZC5tdWx0aXBseShyZW1haW5kZXIuZ2V0Q29lZmZpY2llbnQocmVtYWluZGVyLkRlZ3JlZSksIGludmVyc2VEZW5vbWluYXRvckxlYWRpbmdUZXJtKTsNCgkJCQl2YXIgdGVybSA9IG90aGVyLm11bHRpcGx5QnlNb25vbWlhbChkZWdyZWVEaWZmZXJlbmNlLCBzY2FsZSk7DQoJCQkJdmFyIGl0ZXJhdGlvblF1b3RpZW50ID0gdGhpcy5maWVsZC5idWlsZE1vbm9taWFsKGRlZ3JlZURpZmZlcmVuY2UsIHNjYWxlKTsNCgkJCQlxdW90aWVudCA9IHF1b3RpZW50LmFkZE9yU3VidHJhY3QoaXRlcmF0aW9uUXVvdGllbnQpOw0KCQkJCXJlbWFpbmRlciA9IHJlbWFpbmRlci5hZGRPclN1YnRyYWN0KHRlcm0pOw0KCQkJfQ0KCQkJDQoJCQlyZXR1cm4gbmV3IEFycmF5KHF1b3RpZW50LCByZW1haW5kZXIpOw0KCQl9DQp9</uax:ByteString>
		</Value>
	</UAVariable>
	<UAVariable NodeId="ns=1;s=SYSTEM.LIBRARY.PROJECT.RESOURCES/QRCodeScanner/grid.js" BrowseName="1:grid.js" DataType="ByteString" AccessLevel="103" UserAccessLevel="103" Historizing="true">
		<DisplayName Locale="en">grid.js</DisplayName>
		<Description Locale="en">grid.js</Description>
		<References>
			<Reference ReferenceType="HasComponent" IsForward="false">ns=1;s=SYSTEM.LIBRARY.PROJECT.RESOURCES/QRCodeScanner</Reference>
			<Reference ReferenceType="HasTypeDefinition">ns=1;s=VariableTypes.ATVISE.Resource.Javascript</Reference>
			<Reference ReferenceType="HasProperty">ns=1;s=VariableTypes.ATVISE.Resource.Javascript.Compress</Reference>
		</References>
		<Value>
			<uax:ByteString>LyoNCiAgUG9ydGVkIHRvIEphdmFTY3JpcHQgYnkgTGF6YXIgTGFzemxvIDIwMTEgDQogIA0KICBsYXphcnNvZnRAZ21haWwuY29tLCB3d3cubGF6YXJzb2Z0LmluZm8NCiAgDQoqLw0KDQovKg0KKg0KKiBDb3B5cmlnaHQgMjAwNyBaWGluZyBhdXRob3JzDQoqDQoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOw0KKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuDQoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KKg0KKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KKg0KKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KKi8NCg0KDQp2YXIgR3JpZFNhbXBsZXIgPSB7fTsNCg0KR3JpZFNhbXBsZXIuY2hlY2tBbmROdWRnZVBvaW50cz1mdW5jdGlvbiggaW1hZ2UsICBwb2ludHMpDQoJCXsNCgkJCXZhciB3aWR0aCA9IHFyY29kZS53aWR0aDsNCgkJCXZhciBoZWlnaHQgPSBxcmNvZGUuaGVpZ2h0Ow0KCQkJLy8gQ2hlY2sgYW5kIG51ZGdlIHBvaW50cyBmcm9tIHN0YXJ0IHVudGlsIHdlIHNlZSBzb21lIHRoYXQgYXJlIE9LOg0KCQkJdmFyIG51ZGdlZCA9IHRydWU7DQoJCQlmb3IgKHZhciBvZmZzZXQgPSAwOyBvZmZzZXQgPCBwb2ludHMubGVuZ3RoICYmIG51ZGdlZDsgb2Zmc2V0ICs9IDIpDQoJCQl7DQoJCQkJdmFyIHggPSBNYXRoLmZsb29yIChwb2ludHNbb2Zmc2V0XSk7DQoJCQkJdmFyIHkgPSBNYXRoLmZsb29yKCBwb2ludHNbb2Zmc2V0ICsgMV0pOw0KCQkJCWlmICh4IDwgLSAxIHx8IHggPiB3aWR0aCB8fCB5IDwgLSAxIHx8IHkgPiBoZWlnaHQpDQoJCQkJew0KCQkJCQl0aHJvdyAiRXJyb3IuY2hlY2tBbmROdWRnZVBvaW50cyAiOw0KCQkJCX0NCgkJCQludWRnZWQgPSBmYWxzZTsNCgkJCQlpZiAoeCA9PSAtIDEpDQoJCQkJew0KCQkJCQlwb2ludHNbb2Zmc2V0XSA9IDAuMDsNCgkJCQkJbnVkZ2VkID0gdHJ1ZTsNCgkJCQl9DQoJCQkJZWxzZSBpZiAoeCA9PSB3aWR0aCkNCgkJCQl7DQoJCQkJCXBvaW50c1tvZmZzZXRdID0gd2lkdGggLSAxOw0KCQkJCQludWRnZWQgPSB0cnVlOw0KCQkJCX0NCgkJCQlpZiAoeSA9PSAtIDEpDQoJCQkJew0KCQkJCQlwb2ludHNbb2Zmc2V0ICsgMV0gPSAwLjA7DQoJCQkJCW51ZGdlZCA9IHRydWU7DQoJCQkJfQ0KCQkJCWVsc2UgaWYgKHkgPT0gaGVpZ2h0KQ0KCQkJCXsNCgkJCQkJcG9pbnRzW29mZnNldCArIDFdID0gaGVpZ2h0IC0gMTsNCgkJCQkJbnVkZ2VkID0gdHJ1ZTsNCgkJCQl9DQoJCQl9DQoJCQkvLyBDaGVjayBhbmQgbnVkZ2UgcG9pbnRzIGZyb20gZW5kOg0KCQkJbnVkZ2VkID0gdHJ1ZTsNCgkJCWZvciAodmFyIG9mZnNldCA9IHBvaW50cy5sZW5ndGggLSAyOyBvZmZzZXQgPj0gMCAmJiBudWRnZWQ7IG9mZnNldCAtPSAyKQ0KCQkJew0KCQkJCXZhciB4ID0gTWF0aC5mbG9vciggcG9pbnRzW29mZnNldF0pOw0KCQkJCXZhciB5ID0gTWF0aC5mbG9vciggcG9pbnRzW29mZnNldCArIDFdKTsNCgkJCQlpZiAoeCA8IC0gMSB8fCB4ID4gd2lkdGggfHwgeSA8IC0gMSB8fCB5ID4gaGVpZ2h0KQ0KCQkJCXsNCgkJCQkJdGhyb3cgIkVycm9yLmNoZWNrQW5kTnVkZ2VQb2ludHMgIjsNCgkJCQl9DQoJCQkJbnVkZ2VkID0gZmFsc2U7DQoJCQkJaWYgKHggPT0gLSAxKQ0KCQkJCXsNCgkJCQkJcG9pbnRzW29mZnNldF0gPSAwLjA7DQoJCQkJCW51ZGdlZCA9IHRydWU7DQoJCQkJfQ0KCQkJCWVsc2UgaWYgKHggPT0gd2lkdGgpDQoJCQkJew0KCQkJCQlwb2ludHNbb2Zmc2V0XSA9IHdpZHRoIC0gMTsNCgkJCQkJbnVkZ2VkID0gdHJ1ZTsNCgkJCQl9DQoJCQkJaWYgKHkgPT0gLSAxKQ0KCQkJCXsNCgkJCQkJcG9pbnRzW29mZnNldCArIDFdID0gMC4wOw0KCQkJCQludWRnZWQgPSB0cnVlOw0KCQkJCX0NCgkJCQllbHNlIGlmICh5ID09IGhlaWdodCkNCgkJCQl7DQoJCQkJCXBvaW50c1tvZmZzZXQgKyAxXSA9IGhlaWdodCAtIDE7DQoJCQkJCW51ZGdlZCA9IHRydWU7DQoJCQkJfQ0KCQkJfQ0KCQl9DQoJDQoNCg0KR3JpZFNhbXBsZXIuc2FtcGxlR3JpZDM9ZnVuY3Rpb24oIGltYWdlLCAgZGltZW5zaW9uLCAgdHJhbnNmb3JtKQ0KCQl7DQoJCQl2YXIgYml0cyA9IG5ldyBCaXRNYXRyaXgoZGltZW5zaW9uKTsNCgkJCXZhciBwb2ludHMgPSBuZXcgQXJyYXkoZGltZW5zaW9uIDw8IDEpOw0KCQkJZm9yICh2YXIgeSA9IDA7IHkgPCBkaW1lbnNpb247IHkrKykNCgkJCXsNCgkJCQl2YXIgbWF4ID0gcG9pbnRzLmxlbmd0aDsNCgkJCQl2YXIgaVZhbHVlID0gIHkgKyAwLjU7DQoJCQkJZm9yICh2YXIgeCA9IDA7IHggPCBtYXg7IHggKz0gMikNCgkJCQl7DQoJCQkJCXBvaW50c1t4XSA9ICAoeCA+PiAxKSArIDAuNTsNCgkJCQkJcG9pbnRzW3ggKyAxXSA9IGlWYWx1ZTsNCgkJCQl9DQoJCQkJdHJhbnNmb3JtLnRyYW5zZm9ybVBvaW50czEocG9pbnRzKTsNCgkJCQkvLyBRdWljayBjaGVjayB0byBzZWUgaWYgcG9pbnRzIHRyYW5zZm9ybWVkIHRvIHNvbWV0aGluZyBpbnNpZGUgdGhlIGltYWdlOw0KCQkJCS8vIHN1ZmZpY2llbnQgdG8gY2hlY2sgdGhlIGVuZHBvaW50cw0KCQkJCUdyaWRTYW1wbGVyLmNoZWNrQW5kTnVkZ2VQb2ludHMoaW1hZ2UsIHBvaW50cyk7DQoJCQkJdHJ5DQoJCQkJew0KCQkJCQlmb3IgKHZhciB4ID0gMDsgeCA8IG1heDsgeCArPSAyKQ0KCQkJCQl7DQoJCQkJCQkvL3ZhciB4cG9pbnQgPSAoTWF0aC5mbG9vciggcG9pbnRzW3hdKSAqIDQpICsgKE1hdGguZmxvb3IoIHBvaW50c1t4ICsgMV0pICogcXJjb2RlLndpZHRoICogNCk7DQogICAgICAgICAgICAgICAgICAgICAgICB2YXIgYml0ID0gaW1hZ2VbTWF0aC5mbG9vciggcG9pbnRzW3hdKSsgcXJjb2RlLndpZHRoKiBNYXRoLmZsb29yKCBwb2ludHNbeCArIDFdKV07DQoJCQkJCQkvL3FyY29kZS5pbWFnZWRhdGEuZGF0YVt4cG9pbnRdID0gYml0PzI1NTowOw0KCQkJCQkJLy9xcmNvZGUuaW1hZ2VkYXRhLmRhdGFbeHBvaW50KzFdID0gYml0PzI1NTowOw0KCQkJCQkJLy9xcmNvZGUuaW1hZ2VkYXRhLmRhdGFbeHBvaW50KzJdID0gMDsNCgkJCQkJCS8vcXJjb2RlLmltYWdlZGF0YS5kYXRhW3hwb2ludCszXSA9IDI1NTsNCgkJCQkJCS8vYml0c1t4ID4+IDFdWyB5XT1iaXQ7DQoJCQkJCQlpZihiaXQpDQoJCQkJCQkJYml0cy5zZXRfUmVuYW1lZCh4ID4+IDEsIHkpOw0KCQkJCQl9DQoJCQkJfQ0KCQkJCWNhdGNoICggYWlvb2JlKQ0KCQkJCXsNCgkJCQkJLy8gVGhpcyBmZWVscyB3cm9uZywgYnV0LCBzb21ldGltZXMgaWYgdGhlIGZpbmRlciBwYXR0ZXJucyBhcmUgbWlzaWRlbnRpZmllZCwgdGhlIHJlc3VsdGluZw0KCQkJCQkvLyB0cmFuc2Zvcm0gZ2V0cyAidHdpc3RlZCIgc3VjaCB0aGF0IGl0IG1hcHMgYSBzdHJhaWdodCBsaW5lIG9mIHBvaW50cyB0byBhIHNldCBvZiBwb2ludHMNCgkJCQkJLy8gd2hvc2UgZW5kcG9pbnRzIGFyZSBpbiBib3VuZHMsIGJ1dCBvdGhlcnMgYXJlIG5vdC4gVGhlcmUgaXMgcHJvYmFibHkgc29tZSBtYXRoZW1hdGljYWwNCgkJCQkJLy8gd2F5IHRvIGRldGVjdCB0aGlzIGFib3V0IHRoZSB0cmFuc2Zvcm1hdGlvbiB0aGF0IEkgZG9uJ3Qga25vdyB5ZXQuDQoJCQkJCS8vIFRoaXMgcmVzdWx0cyBpbiBhbiB1Z2x5IHJ1bnRpbWUgZXhjZXB0aW9uIGRlc3BpdGUgb3VyIGNsZXZlciBjaGVja3MgYWJvdmUgLS0gY2FuJ3QgaGF2ZQ0KCQkJCQkvLyB0aGF0LiBXZSBjb3VsZCBjaGVjayBlYWNoIHBvaW50J3MgY29vcmRpbmF0ZXMgYnV0IHRoYXQgZmVlbHMgZHVwbGljYXRpdmUuIFdlIHNldHRsZSBmb3INCgkJCQkJLy8gY2F0Y2hpbmcgYW5kIHdyYXBwaW5nIEFycmF5SW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbi4NCgkJCQkJdGhyb3cgIkVycm9yLmNoZWNrQW5kTnVkZ2VQb2ludHMiOw0KCQkJCX0NCgkJCX0NCgkJCXJldHVybiBiaXRzOw0KCQl9DQoNCkdyaWRTYW1wbGVyLnNhbXBsZUdyaWR4PWZ1bmN0aW9uKCBpbWFnZSwgIGRpbWVuc2lvbiwgIHAxVG9YLCAgcDFUb1ksICBwMlRvWCwgIHAyVG9ZLCAgcDNUb1gsICBwM1RvWSwgIHA0VG9YLCAgcDRUb1ksICBwMUZyb21YLCAgcDFGcm9tWSwgIHAyRnJvbVgsICBwMkZyb21ZLCAgcDNGcm9tWCwgIHAzRnJvbVksICBwNEZyb21YLCAgcDRGcm9tWSkNCnsNCgl2YXIgdHJhbnNmb3JtID0gUGVyc3BlY3RpdmVUcmFuc2Zvcm0ucXVhZHJpbGF0ZXJhbFRvUXVhZHJpbGF0ZXJhbChwMVRvWCwgcDFUb1ksIHAyVG9YLCBwMlRvWSwgcDNUb1gsIHAzVG9ZLCBwNFRvWCwgcDRUb1ksIHAxRnJvbVgsIHAxRnJvbVksIHAyRnJvbVgsIHAyRnJvbVksIHAzRnJvbVgsIHAzRnJvbVksIHA0RnJvbVgsIHA0RnJvbVkpOw0KCQkJDQoJcmV0dXJuIEdyaWRTYW1wbGVyLnNhbXBsZUdyaWQzKGltYWdlLCBkaW1lbnNpb24sIHRyYW5zZm9ybSk7DQp9</uax:ByteString>
		</Value>
	</UAVariable>
	<UAVariable NodeId="ns=1;s=SYSTEM.LIBRARY.PROJECT.RESOURCES/QRCodeScanner/qrcode.js" BrowseName="1:qrcode.js" DataType="ByteString" AccessLevel="103" UserAccessLevel="103" Historizing="true">
		<DisplayName Locale="en">qrcode.js</DisplayName>
		<Description Locale="en">qrcode.js</Description>
		<References>
			<Reference ReferenceType="HasComponent" IsForward="false">ns=1;s=SYSTEM.LIBRARY.PROJECT.RESOURCES/QRCodeScanner</Reference>
			<Reference ReferenceType="HasTypeDefinition">ns=1;s=VariableTypes.ATVISE.Resource.Javascript</Reference>
			<Reference ReferenceType="HasProperty">ns=1;s=VariableTypes.ATVISE.Resource.Javascript.Compress</Reference>
		</References>
		<Value>
			<uax:ByteString>LyoKICAgQ29weXJpZ2h0IDIwMTEgTGF6YXIgTGFzemxvIChsYXphcnNvZnRAZ21haWwuY29tLCB3d3cubGF6YXJzb2Z0LmluZm8pCiAgIAogICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgogICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKCiAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKCiAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCiAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiovCgoKdmFyIHFyY29kZSA9IHt9OwpxcmNvZGUuaW1hZ2VkYXRhID0gbnVsbDsKcXJjb2RlLndpZHRoID0gMDsKcXJjb2RlLmhlaWdodCA9IDA7CnFyY29kZS5xckNvZGVTeW1ib2wgPSBudWxsOwpxcmNvZGUuZGVidWcgPSBmYWxzZTsKcXJjb2RlLm1heEltZ1NpemUgPSAxMDI0KjEwMjQ7CgpxcmNvZGUuc2l6ZU9mRGF0YUxlbmd0aEluZm8gPSAgWyAgWyAxMCwgOSwgOCwgOCBdLCAgWyAxMiwgMTEsIDE2LCAxMCBdLCAgWyAxNCwgMTMsIDE2LCAxMiBdIF07CgpxcmNvZGUuY2FsbGJhY2sgPSBudWxsOwoKcXJjb2RlLnZpZFN1Y2Nlc3MgPSBmdW5jdGlvbiAoc3RyZWFtKSAKewogICAgcXJjb2RlLmxvY2Fsc3RyZWFtID0gc3RyZWFtOwogICAgaWYocXJjb2RlLndlYmtpdCkKICAgICAgICBxcmNvZGUudmlkZW8uc3JjID0gd2luZG93LndlYmtpdFVSTC5jcmVhdGVPYmplY3RVUkwoc3RyZWFtKTsKICAgIGVsc2UKICAgIGlmKHFyY29kZS5tb3opCiAgICB7CiAgICAgICAgcXJjb2RlLnZpZGVvLm1velNyY09iamVjdCA9IHN0cmVhbTsKICAgICAgICBxcmNvZGUudmlkZW8ucGxheSgpOwogICAgfQogICAgZWxzZQogICAgICAgIHFyY29kZS52aWRlby5zcmMgPSBzdHJlYW07CiAgICAKICAgIHFyY29kZS5nVU09dHJ1ZTsKICAgIAogICAgcXJjb2RlLmNhbnZhc19xcjIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdjYW52YXMnKTsKICAgIHFyY29kZS5jYW52YXNfcXIyLmlkID0gInFyLWNhbnZhcyI7CiAgICBxcmNvZGUucXJjb250ZXh0MiA9IHFyY29kZS5jYW52YXNfcXIyLmdldENvbnRleHQoJzJkJyk7CiAgICBxcmNvZGUuY2FudmFzX3FyMi53aWR0aCA9IHFyY29kZS52aWRlby52aWRlb1dpZHRoOwogICAgcXJjb2RlLmNhbnZhc19xcjIuaGVpZ2h0ID0gcXJjb2RlLnZpZGVvLnZpZGVvSGVpZ2h0OwogICAgc2V0VGltZW91dChxcmNvZGUuY2FwdHVyZVRvQ2FudmFzLCA1MDApOwp9CiAgICAgICAgCnFyY29kZS52aWRFcnJvciA9IGZ1bmN0aW9uKGVycm9yKQp7CiAgICBxcmNvZGUuZ1VNPWZhbHNlOwogICAgcmV0dXJuOwp9CgpxcmNvZGUuY2FwdHVyZVRvQ2FudmFzID0gZnVuY3Rpb24oKQp7CiAgICBpZihxcmNvZGUuZ1VNKQogICAgewogICAgICAgIHRyeXsKICAgICAgICAgICAgaWYocXJjb2RlLnZpZGVvLnZpZGVvV2lkdGggPT0gMCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgc2V0VGltZW91dChxcmNvZGUuY2FwdHVyZVRvQ2FudmFzLCA1MDApOwogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcXJjb2RlLmNhbnZhc19xcjIud2lkdGggPSBxcmNvZGUudmlkZW8udmlkZW9XaWR0aDsKICAgICAgICAgICAgICAgIHFyY29kZS5jYW52YXNfcXIyLmhlaWdodCA9IHFyY29kZS52aWRlby52aWRlb0hlaWdodDsKICAgICAgICAgICAgfQogICAgICAgICAgICBxcmNvZGUucXJjb250ZXh0Mi5kcmF3SW1hZ2UocXJjb2RlLnZpZGVvLDAsMCk7CiAgICAgICAgICAgIHRyeXsKICAgICAgICAgICAgICAgIHFyY29kZS5kZWNvZGUoKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBjYXRjaChlKXsgICAgICAgCiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhlKTsKICAgICAgICAgICAgICAgIHNldFRpbWVvdXQocXJjb2RlLmNhcHR1cmVUb0NhbnZhcywgNTAwKTsKICAgICAgICAgICAgfTsKICAgICAgICB9CiAgICAgICAgY2F0Y2goZSl7ICAgICAgIAogICAgICAgICAgICAgICAgY29uc29sZS5sb2coZSk7CiAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KHFyY29kZS5jYXB0dXJlVG9DYW52YXMsIDUwMCk7CiAgICAgICAgfTsKICAgIH0KfQoKcXJjb2RlLnNldFdlYmNhbSA9IGZ1bmN0aW9uKHZpZGVvSWQpCnsKICAgIHZhciBuPW5hdmlnYXRvcjsKICAgIHFyY29kZS52aWRlbz1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh2aWRlb0lkKTsKCiAgICB2YXIgb3B0aW9ucyA9IHRydWU7CiAgICBpZihuYXZpZ2F0b3IubWVkaWFEZXZpY2VzICYmIG5hdmlnYXRvci5tZWRpYURldmljZXMuZW51bWVyYXRlRGV2aWNlcykKICAgIHsKICAgICAgICB0cnl7CiAgICAgICAgICAgIG5hdmlnYXRvci5tZWRpYURldmljZXMuZW51bWVyYXRlRGV2aWNlcygpCiAgICAgICAgICAgIC50aGVuKGZ1bmN0aW9uKGRldmljZXMpIHsKICAgICAgICAgICAgICBkZXZpY2VzLmZvckVhY2goZnVuY3Rpb24oZGV2aWNlKSB7CiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygiZGViMSIpOwogICAgICAgICAgICAgICAgaWYgKGRldmljZS5raW5kID09PSAndmlkZW9pbnB1dCcpIHsKICAgICAgICAgICAgICAgICAgaWYoZGV2aWNlLmxhYmVsLnRvTG93ZXJDYXNlKCkuc2VhcmNoKCJiYWNrIikgPi0xKQogICAgICAgICAgICAgICAgICAgIG9wdGlvbnM9W3snc291cmNlSWQnOiBkZXZpY2UuZGV2aWNlSWR9XSA7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhkZXZpY2Uua2luZCArICI6ICIgKyBkZXZpY2UubGFiZWwgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIiBpZCA9ICIgKyBkZXZpY2UuZGV2aWNlSWQpOwogICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9KQogICAgICAgICAgICAKICAgICAgICB9CiAgICAgICAgY2F0Y2goZSkKICAgICAgICB7CiAgICAgICAgICAgIGNvbnNvbGUubG9nKGUpOwogICAgICAgIH0KICAgIH0KICAgIGVsc2V7CiAgICAgICAgY29uc29sZS5sb2coIm5vIG5hdmlnYXRvci5tZWRpYURldmljZXMuZW51bWVyYXRlRGV2aWNlcyIgKTsKICAgIH0KICAgIAogICAgaWYobi5nZXRVc2VyTWVkaWEpCiAgICAgICAgbi5nZXRVc2VyTWVkaWEoe3ZpZGVvOiBvcHRpb25zLCBhdWRpbzogZmFsc2V9LCBxcmNvZGUudmlkU3VjY2VzcywgcXJjb2RlLnZpZEVycm9yKTsKICAgIGVsc2UKICAgIGlmKG4ud2Via2l0R2V0VXNlck1lZGlhKQogICAgewogICAgICAgIHFyY29kZS53ZWJraXQ9dHJ1ZTsKICAgICAgICBuLndlYmtpdEdldFVzZXJNZWRpYSh7dmlkZW86b3B0aW9ucywgYXVkaW86IGZhbHNlfSwgcXJjb2RlLnZpZFN1Y2Nlc3MsIHFyY29kZS52aWRFcnJvcik7CiAgICB9CiAgICBlbHNlCiAgICBpZihuLm1vekdldFVzZXJNZWRpYSkKICAgIHsKICAgICAgICBxcmNvZGUubW96PXRydWU7CiAgICAgICAgbi5tb3pHZXRVc2VyTWVkaWEoe3ZpZGVvOiBvcHRpb25zLCBhdWRpbzogZmFsc2V9LCBxcmNvZGUudmlkU3VjY2VzcywgcXJjb2RlLnZpZEVycm9yKTsKICAgIH0KfQoKcXJjb2RlLmRlY29kZSA9IGZ1bmN0aW9uKHNyYyl7CiAgICAKICAgIGlmKGFyZ3VtZW50cy5sZW5ndGg9PTApCiAgICB7CgogICAgICAgIGlmKHFyY29kZS5jYW52YXNfcXIyKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIGNhbnZhc19xciA9IHFyY29kZS5jYW52YXNfcXIyOwogICAgICAgICAgICB2YXIgY29udGV4dCA9IHFyY29kZS5xcmNvbnRleHQyOwogICAgICAgIH0gCiAgICAgICAgLy8gQWRkb24gQ2VydGVjIC0tPiBDYW52YXMgaW4gZm9yZWlnbiBvYmplY3Qgd29udCBiZSBkZXRlY3RlZCAtLT4gdXNlIGRpcmVjdCByZWZlcmVuY2UgcGFzc2VkIHRvIHFyY29kZSBvYmplY3QKICAgICAgICBlbHNlIGlmIChxcmNvZGUuY3VzdG9tQ2FudmFzKSB7CiAgICAgICAgICAgIHZhciBjYW52YXNfcXIgPSBxcmNvZGUuY3VzdG9tQ2FudmFzOwogICAgICAgICAgICB2YXIgY29udGV4dCA9IGNhbnZhc19xci5nZXRDb250ZXh0KCcyZCcpOwogICAgICAgIH0gCgkJLy8gRW5kIG9mIEFkZG9uCgkJZWxzZSB7CiAgICAgICAgICAgIHZhciBjYW52YXNfcXIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgicXItY2FudmFzIik7CiAgICAgICAgICAgIHZhciBjb250ZXh0ID0gY2FudmFzX3FyLmdldENvbnRleHQoJzJkJyk7CiAgICAgICAgfQogICAgICAgIHFyY29kZS53aWR0aCA9IGNhbnZhc19xci53aWR0aDsKICAgICAgICBxcmNvZGUuaGVpZ2h0ID0gY2FudmFzX3FyLmhlaWdodDsKICAgICAgICBxcmNvZGUuaW1hZ2VkYXRhID0gY29udGV4dC5nZXRJbWFnZURhdGEoMCwgMCwgcXJjb2RlLndpZHRoLCBxcmNvZGUuaGVpZ2h0KTsKICAgICAgICBxcmNvZGUucmVzdWx0ID0gcXJjb2RlLnByb2Nlc3MoY29udGV4dCk7CiAgICAgICAgaWYocXJjb2RlLmNhbGxiYWNrIT1udWxsKQogICAgICAgICAgICBxcmNvZGUuY2FsbGJhY2socXJjb2RlLnJlc3VsdCk7CiAgICAgICAgcmV0dXJuIHFyY29kZS5yZXN1bHQ7CiAgICB9CiAgICBlbHNlCiAgICB7CiAgICAgICAgdmFyIGltYWdlID0gbmV3IEltYWdlKCk7CiAgICAgICAgaW1hZ2UuY3Jvc3NPcmlnaW4gPSAiQW5vbnltb3VzIjsKICAgICAgICBpbWFnZS5vbmxvYWQ9ZnVuY3Rpb24oKSB7CgogICAgICAgICAgICAvL3ZhciBjYW52YXNfcXIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgicXItY2FudmFzIik7CiAgICAgICAgICAgIHZhciBjYW52YXNfb3V0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoIm91dC1jYW52YXMiKTsKICAgICAgICAgICAgaWYoY2FudmFzX291dCE9bnVsbCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIG91dGN0eCA9IGNhbnZhc19vdXQuZ2V0Q29udGV4dCgnMmQnKTsKICAgICAgICAgICAgICAgIG91dGN0eC5jbGVhclJlY3QoMCwgMCwgMzIwLCAyNDApOwogICAgICAgICAgICAgICAgb3V0Y3R4LmRyYXdJbWFnZShpbWFnZSwgMCwgMCwgMzIwLCAyNDApOwogICAgICAgICAgICB9CgogICAgICAgICAgICB2YXIgY2FudmFzX3FyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnY2FudmFzJyk7CiAgICAgICAgICAgIHZhciBjb250ZXh0ID0gY2FudmFzX3FyLmdldENvbnRleHQoJzJkJyk7CiAgICAgICAgICAgIHZhciBuaGVpZ2h0ID0gaW1hZ2UuaGVpZ2h0OwogICAgICAgICAgICB2YXIgbndpZHRoID0gaW1hZ2Uud2lkdGg7CiAgICAgICAgICAgIGlmKGltYWdlLndpZHRoKmltYWdlLmhlaWdodD5xcmNvZGUubWF4SW1nU2l6ZSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIGlyID0gaW1hZ2Uud2lkdGggLyBpbWFnZS5oZWlnaHQ7CiAgICAgICAgICAgICAgICBuaGVpZ2h0ID0gTWF0aC5zcXJ0KHFyY29kZS5tYXhJbWdTaXplL2lyKTsKICAgICAgICAgICAgICAgIG53aWR0aD1pcipuaGVpZ2h0OwogICAgICAgICAgICB9CgogICAgICAgICAgICBjYW52YXNfcXIud2lkdGggPSBud2lkdGg7CiAgICAgICAgICAgIGNhbnZhc19xci5oZWlnaHQgPSBuaGVpZ2h0OwogICAgICAgICAgICAKICAgICAgICAgICAgY29udGV4dC5kcmF3SW1hZ2UoaW1hZ2UsIDAsIDAsIGNhbnZhc19xci53aWR0aCwgY2FudmFzX3FyLmhlaWdodCApOwogICAgICAgICAgICBxcmNvZGUud2lkdGggPSBjYW52YXNfcXIud2lkdGg7CiAgICAgICAgICAgIHFyY29kZS5oZWlnaHQgPSBjYW52YXNfcXIuaGVpZ2h0OwogICAgICAgICAgICB0cnl7CiAgICAgICAgICAgICAgICBxcmNvZGUuaW1hZ2VkYXRhID0gY29udGV4dC5nZXRJbWFnZURhdGEoMCwgMCwgY2FudmFzX3FyLndpZHRoLCBjYW52YXNfcXIuaGVpZ2h0KTsKICAgICAgICAgICAgfWNhdGNoKGUpewogICAgICAgICAgICAgICAgcXJjb2RlLnJlc3VsdCA9ICJDcm9zcyBkb21haW4gaW1hZ2UgcmVhZGluZyBub3Qgc3VwcG9ydGVkIGluIHlvdXIgYnJvd3NlciEgU2F2ZSBpdCB0byB5b3VyIGNvbXB1dGVyIHRoZW4gZHJhZyBhbmQgZHJvcCB0aGUgZmlsZSEiOwogICAgICAgICAgICAgICAgaWYocXJjb2RlLmNhbGxiYWNrIT1udWxsKQogICAgICAgICAgICAgICAgICAgIHFyY29kZS5jYWxsYmFjayhxcmNvZGUucmVzdWx0KTsKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQogICAgICAgICAgICAKICAgICAgICAgICAgdHJ5CiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHFyY29kZS5yZXN1bHQgPSBxcmNvZGUucHJvY2Vzcyhjb250ZXh0KTsKICAgICAgICAgICAgfQogICAgICAgICAgICBjYXRjaChlKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhlKTsKICAgICAgICAgICAgICAgIHFyY29kZS5yZXN1bHQgPSAiZXJyb3IgZGVjb2RpbmcgUVIgQ29kZSI7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYocXJjb2RlLmNhbGxiYWNrIT1udWxsKQogICAgICAgICAgICAgICAgcXJjb2RlLmNhbGxiYWNrKHFyY29kZS5yZXN1bHQpOwogICAgICAgIH0KICAgICAgICBpbWFnZS5vbmVycm9yID0gZnVuY3Rpb24gKCkKICAgICAgICB7CiAgICAgICAgICAgIGlmKHFyY29kZS5jYWxsYmFjayE9bnVsbCkgCiAgICAgICAgICAgICAgICBxcmNvZGUuY2FsbGJhY2soIkZhaWxlZCB0byBsb2FkIHRoZSBpbWFnZSIpOwogICAgICAgIH0KCiAgICAgICAgaW1hZ2Uuc3JjID0gc3JjOwogICAgfQp9CgpxcmNvZGUuaXNVcmwgPSBmdW5jdGlvbihzKQp7CiAgICB2YXIgcmVnZXhwID0gLyhmdHB8aHR0cHxodHRwcyk6XC9cLyhcdys6ezAsMX1cdypAKT8oXFMrKSg6WzAtOV0rKT8oXC98XC8oW1x3IyE6Lj8rPSYlQCFcLVwvXSkpPy87CiAgICByZXR1cm4gcmVnZXhwLnRlc3Qocyk7Cn0KCnFyY29kZS5kZWNvZGVfdXJsID0gZnVuY3Rpb24gKHMpCnsKICB2YXIgZXNjYXBlZCA9ICIiOwogIHRyeXsKICAgIGVzY2FwZWQgPSBlc2NhcGUoIHMgKTsKICB9CiAgY2F0Y2goZSkKICB7CiAgICBjb25zb2xlLmxvZyhlKTsKICAgIGVzY2FwZWQgPSBzOwogIH0KICB2YXIgcmV0ID0gIiI7CiAgdHJ5ewogICAgcmV0ID0gZGVjb2RlVVJJQ29tcG9uZW50KCBlc2NhcGVkICk7CiAgfQogIGNhdGNoKGUpCiAgewogICAgY29uc29sZS5sb2coZSk7CiAgICByZXQgPSBlc2NhcGVkOwogIH0KICByZXR1cm4gcmV0Owp9CgpxcmNvZGUuZGVjb2RlX3V0ZjggPSBmdW5jdGlvbiAoIHMgKQp7CiAgICBpZihxcmNvZGUuaXNVcmwocykpCiAgICAgICAgcmV0dXJuIHFyY29kZS5kZWNvZGVfdXJsKHMpOwogICAgZWxzZQogICAgICAgIHJldHVybiBzOwp9CgpxcmNvZGUucHJvY2VzcyA9IGZ1bmN0aW9uKGN0eCl7CiAgICAKICAgIHZhciBzdGFydCA9IG5ldyBEYXRlKCkuZ2V0VGltZSgpOwoKICAgIHZhciBpbWFnZSA9IHFyY29kZS5ncmF5U2NhbGVUb0JpdG1hcChxcmNvZGUuZ3JheXNjYWxlKCkpOwogICAgLy92YXIgaW1hZ2UgPSBxcmNvZGUuYmluYXJpemUoMTI4KTsKICAgIAogICAgaWYocXJjb2RlLmRlYnVnKQogICAgewogICAgICAgIGZvciAodmFyIHkgPSAwOyB5IDwgcXJjb2RlLmhlaWdodDsgeSsrKQogICAgICAgIHsKICAgICAgICAgICAgZm9yICh2YXIgeCA9IDA7IHggPCBxcmNvZGUud2lkdGg7IHgrKykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIHBvaW50ID0gKHggKiA0KSArICh5ICogcXJjb2RlLndpZHRoICogNCk7CiAgICAgICAgICAgICAgICBxcmNvZGUuaW1hZ2VkYXRhLmRhdGFbcG9pbnRdID0gaW1hZ2VbeCt5KnFyY29kZS53aWR0aF0/MDowOwogICAgICAgICAgICAgICAgcXJjb2RlLmltYWdlZGF0YS5kYXRhW3BvaW50KzFdID0gaW1hZ2VbeCt5KnFyY29kZS53aWR0aF0/MDowOwogICAgICAgICAgICAgICAgcXJjb2RlLmltYWdlZGF0YS5kYXRhW3BvaW50KzJdID0gaW1hZ2VbeCt5KnFyY29kZS53aWR0aF0/MjU1OjA7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgY3R4LnB1dEltYWdlRGF0YShxcmNvZGUuaW1hZ2VkYXRhLCAwLCAwKTsKICAgIH0KICAgIAogICAgLy92YXIgZmluZGVyUGF0dGVybkluZm8gPSBuZXcgRmluZGVyUGF0dGVybkZpbmRlcigpLmZpbmRGaW5kZXJQYXR0ZXJuKGltYWdlKTsKICAgIAogICAgdmFyIGRldGVjdG9yID0gbmV3IERldGVjdG9yKGltYWdlKTsKCiAgICB2YXIgcVJDb2RlTWF0cml4ID0gZGV0ZWN0b3IuZGV0ZWN0KCk7CiAgICAKICAgIGlmKHFyY29kZS5kZWJ1ZykKICAgIHsKICAgICAgICBmb3IgKHZhciB5ID0gMDsgeSA8IHFSQ29kZU1hdHJpeC5iaXRzLkhlaWdodDsgeSsrKQogICAgICAgIHsKICAgICAgICAgICAgZm9yICh2YXIgeCA9IDA7IHggPCBxUkNvZGVNYXRyaXguYml0cy5XaWR0aDsgeCsrKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgcG9pbnQgPSAoeCAqIDQqMikgKyAoeSoyICogcXJjb2RlLndpZHRoICogNCk7CiAgICAgICAgICAgICAgICBxcmNvZGUuaW1hZ2VkYXRhLmRhdGFbcG9pbnRdID0gcVJDb2RlTWF0cml4LmJpdHMuZ2V0X1JlbmFtZWQoeCx5KT8wOjA7CiAgICAgICAgICAgICAgICBxcmNvZGUuaW1hZ2VkYXRhLmRhdGFbcG9pbnQrMV0gPSBxUkNvZGVNYXRyaXguYml0cy5nZXRfUmVuYW1lZCh4LHkpPzA6MDsKICAgICAgICAgICAgICAgIHFyY29kZS5pbWFnZWRhdGEuZGF0YVtwb2ludCsyXSA9IHFSQ29kZU1hdHJpeC5iaXRzLmdldF9SZW5hbWVkKHgseSk/MjU1OjA7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgY3R4LnB1dEltYWdlRGF0YShxcmNvZGUuaW1hZ2VkYXRhLCAwLCAwKTsKICAgIH0KICAgIAogICAgCiAgICB2YXIgcmVhZGVyID0gRGVjb2Rlci5kZWNvZGUocVJDb2RlTWF0cml4LmJpdHMpOwogICAgdmFyIGRhdGEgPSByZWFkZXIuRGF0YUJ5dGU7CiAgICB2YXIgc3RyPSIiOwogICAgZm9yKHZhciBpPTA7aTxkYXRhLmxlbmd0aDtpKyspCiAgICB7CiAgICAgICAgZm9yKHZhciBqPTA7ajxkYXRhW2ldLmxlbmd0aDtqKyspCiAgICAgICAgICAgIHN0cis9U3RyaW5nLmZyb21DaGFyQ29kZShkYXRhW2ldW2pdKTsKICAgIH0KICAgIAogICAgdmFyIGVuZCA9IG5ldyBEYXRlKCkuZ2V0VGltZSgpOwogICAgdmFyIHRpbWUgPSBlbmQgLSBzdGFydDsKICAgIC8vY29uc29sZS5sb2codGltZSk7CgogICAgcmV0dXJuIHFyY29kZS5kZWNvZGVfdXRmOChzdHIpOwogICAgLy9hbGVydCgiVGltZToiICsgdGltZSArICIgQ29kZTogIitzdHIpOwp9CgpxcmNvZGUuZ2V0UGl4ZWwgPSBmdW5jdGlvbih4LHkpewogICAgaWYgKHFyY29kZS53aWR0aCA8IHgpIHsKICAgICAgICB0aHJvdyAicG9pbnQgZXJyb3IiOwogICAgfQogICAgaWYgKHFyY29kZS5oZWlnaHQgPCB5KSB7CiAgICAgICAgdGhyb3cgInBvaW50IGVycm9yIjsKICAgIH0KICAgIHZhciBwb2ludCA9ICh4ICogNCkgKyAoeSAqIHFyY29kZS53aWR0aCAqIDQpOwogICAgdmFyIHAgPSAocXJjb2RlLmltYWdlZGF0YS5kYXRhW3BvaW50XSozMyArIHFyY29kZS5pbWFnZWRhdGEuZGF0YVtwb2ludCArIDFdKjM0ICsgcXJjb2RlLmltYWdlZGF0YS5kYXRhW3BvaW50ICsgMl0qMzMpLzEwMDsKICAgIHJldHVybiBwOwp9CgpxcmNvZGUuYmluYXJpemUgPSBmdW5jdGlvbih0aCl7CiAgICB2YXIgcmV0ID0gbmV3IEFycmF5KHFyY29kZS53aWR0aCpxcmNvZGUuaGVpZ2h0KTsKICAgIGZvciAodmFyIHkgPSAwOyB5IDwgcXJjb2RlLmhlaWdodDsgeSsrKQogICAgewogICAgICAgIGZvciAodmFyIHggPSAwOyB4IDwgcXJjb2RlLndpZHRoOyB4KyspCiAgICAgICAgewogICAgICAgICAgICB2YXIgZ3JheSA9IHFyY29kZS5nZXRQaXhlbCh4LCB5KTsKICAgICAgICAgICAgCiAgICAgICAgICAgIHJldFt4K3kqcXJjb2RlLndpZHRoXSA9IGdyYXk8PXRoP3RydWU6ZmFsc2U7CiAgICAgICAgfQogICAgfQogICAgcmV0dXJuIHJldDsKfQoKcXJjb2RlLmdldE1pZGRsZUJyaWdodG5lc3NQZXJBcmVhPWZ1bmN0aW9uKGltYWdlKQp7CiAgICB2YXIgbnVtU3FydEFyZWEgPSA0OwogICAgLy9vYnRhaW4gbWlkZGxlIGJyaWdodG5lc3MoKG1pbiArIG1heCkgLyAyKSBwZXIgYXJlYQogICAgdmFyIGFyZWFXaWR0aCA9IE1hdGguZmxvb3IocXJjb2RlLndpZHRoIC8gbnVtU3FydEFyZWEpOwogICAgdmFyIGFyZWFIZWlnaHQgPSBNYXRoLmZsb29yKHFyY29kZS5oZWlnaHQgLyBudW1TcXJ0QXJlYSk7CiAgICB2YXIgbWlubWF4ID0gbmV3IEFycmF5KG51bVNxcnRBcmVhKTsKICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbnVtU3FydEFyZWE7IGkrKykKICAgIHsKICAgICAgICBtaW5tYXhbaV0gPSBuZXcgQXJyYXkobnVtU3FydEFyZWEpOwogICAgICAgIGZvciAodmFyIGkyID0gMDsgaTIgPCBudW1TcXJ0QXJlYTsgaTIrKykKICAgICAgICB7CiAgICAgICAgICAgIG1pbm1heFtpXVtpMl0gPSBuZXcgQXJyYXkoMCwwKTsKICAgICAgICB9CiAgICB9CiAgICBmb3IgKHZhciBheSA9IDA7IGF5IDwgbnVtU3FydEFyZWE7IGF5KyspCiAgICB7CiAgICAgICAgZm9yICh2YXIgYXggPSAwOyBheCA8IG51bVNxcnRBcmVhOyBheCsrKQogICAgICAgIHsKICAgICAgICAgICAgbWlubWF4W2F4XVtheV1bMF0gPSAweEZGOwogICAgICAgICAgICBmb3IgKHZhciBkeSA9IDA7IGR5IDwgYXJlYUhlaWdodDsgZHkrKykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgZm9yICh2YXIgZHggPSAwOyBkeCA8IGFyZWFXaWR0aDsgZHgrKykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2YXIgdGFyZ2V0ID0gaW1hZ2VbYXJlYVdpZHRoICogYXggKyBkeCsoYXJlYUhlaWdodCAqIGF5ICsgZHkpKnFyY29kZS53aWR0aF07CiAgICAgICAgICAgICAgICAgICAgaWYgKHRhcmdldCA8IG1pbm1heFtheF1bYXldWzBdKQogICAgICAgICAgICAgICAgICAgICAgICBtaW5tYXhbYXhdW2F5XVswXSA9IHRhcmdldDsKICAgICAgICAgICAgICAgICAgICBpZiAodGFyZ2V0ID4gbWlubWF4W2F4XVtheV1bMV0pCiAgICAgICAgICAgICAgICAgICAgICAgIG1pbm1heFtheF1bYXldWzFdID0gdGFyZ2V0OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIC8vbWlubWF4W2F4XVtheV1bMF0gPSAobWlubWF4W2F4XVtheV1bMF0gKyBtaW5tYXhbYXhdW2F5XVsxXSkgLyAyOwogICAgICAgIH0KICAgIH0KICAgIHZhciBtaWRkbGUgPSBuZXcgQXJyYXkobnVtU3FydEFyZWEpOwogICAgZm9yICh2YXIgaTMgPSAwOyBpMyA8IG51bVNxcnRBcmVhOyBpMysrKQogICAgewogICAgICAgIG1pZGRsZVtpM10gPSBuZXcgQXJyYXkobnVtU3FydEFyZWEpOwogICAgfQogICAgZm9yICh2YXIgYXkgPSAwOyBheSA8IG51bVNxcnRBcmVhOyBheSsrKQogICAgewogICAgICAgIGZvciAodmFyIGF4ID0gMDsgYXggPCBudW1TcXJ0QXJlYTsgYXgrKykKICAgICAgICB7CiAgICAgICAgICAgIG1pZGRsZVtheF1bYXldID0gTWF0aC5mbG9vcigobWlubWF4W2F4XVtheV1bMF0gKyBtaW5tYXhbYXhdW2F5XVsxXSkgLyAyKTsKICAgICAgICAgICAgLy9Db25zb2xlLm91dC5wcmludChtaWRkbGVbYXhdW2F5XSArICIsIik7CiAgICAgICAgfQogICAgICAgIC8vQ29uc29sZS5vdXQucHJpbnRsbigiIik7CiAgICB9CiAgICAvL0NvbnNvbGUub3V0LnByaW50bG4oIiIpOwogICAgCiAgICByZXR1cm4gbWlkZGxlOwp9CgpxcmNvZGUuZ3JheVNjYWxlVG9CaXRtYXA9ZnVuY3Rpb24oZ3JheVNjYWxlKQp7CiAgICB2YXIgbWlkZGxlID0gcXJjb2RlLmdldE1pZGRsZUJyaWdodG5lc3NQZXJBcmVhKGdyYXlTY2FsZSk7CiAgICB2YXIgc3FydE51bUFyZWEgPSBtaWRkbGUubGVuZ3RoOwogICAgdmFyIGFyZWFXaWR0aCA9IE1hdGguZmxvb3IocXJjb2RlLndpZHRoIC8gc3FydE51bUFyZWEpOwogICAgdmFyIGFyZWFIZWlnaHQgPSBNYXRoLmZsb29yKHFyY29kZS5oZWlnaHQgLyBzcXJ0TnVtQXJlYSk7CgogICAgdmFyIGJ1ZmYgPSBuZXcgQXJyYXlCdWZmZXIocXJjb2RlLndpZHRoKnFyY29kZS5oZWlnaHQpOwogICAgdmFyIGJpdG1hcCA9IG5ldyBVaW50OEFycmF5KGJ1ZmYpOwoKICAgIC8vdmFyIGJpdG1hcCA9IG5ldyBBcnJheShxcmNvZGUuaGVpZ2h0KnFyY29kZS53aWR0aCk7CiAgICAKICAgIGZvciAodmFyIGF5ID0gMDsgYXkgPCBzcXJ0TnVtQXJlYTsgYXkrKykKICAgIHsKICAgICAgICBmb3IgKHZhciBheCA9IDA7IGF4IDwgc3FydE51bUFyZWE7IGF4KyspCiAgICAgICAgewogICAgICAgICAgICBmb3IgKHZhciBkeSA9IDA7IGR5IDwgYXJlYUhlaWdodDsgZHkrKykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgZm9yICh2YXIgZHggPSAwOyBkeCA8IGFyZWFXaWR0aDsgZHgrKykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBiaXRtYXBbYXJlYVdpZHRoICogYXggKyBkeCsgKGFyZWFIZWlnaHQgKiBheSArIGR5KSpxcmNvZGUud2lkdGhdID0gKGdyYXlTY2FsZVthcmVhV2lkdGggKiBheCArIGR4KyAoYXJlYUhlaWdodCAqIGF5ICsgZHkpKnFyY29kZS53aWR0aF0gPCBtaWRkbGVbYXhdW2F5XSk/dHJ1ZTpmYWxzZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgIHJldHVybiBiaXRtYXA7Cn0KCnFyY29kZS5ncmF5c2NhbGUgPSBmdW5jdGlvbigpCnsKICAgIHZhciBidWZmID0gbmV3IEFycmF5QnVmZmVyKHFyY29kZS53aWR0aCpxcmNvZGUuaGVpZ2h0KTsKICAgIHZhciByZXQgPSBuZXcgVWludDhBcnJheShidWZmKTsKICAgIC8vdmFyIHJldCA9IG5ldyBBcnJheShxcmNvZGUud2lkdGgqcXJjb2RlLmhlaWdodCk7CiAgICAKICAgIGZvciAodmFyIHkgPSAwOyB5IDwgcXJjb2RlLmhlaWdodDsgeSsrKQogICAgewogICAgICAgIGZvciAodmFyIHggPSAwOyB4IDwgcXJjb2RlLndpZHRoOyB4KyspCiAgICAgICAgewogICAgICAgICAgICB2YXIgZ3JheSA9IHFyY29kZS5nZXRQaXhlbCh4LCB5KTsKICAgICAgICAgICAgCiAgICAgICAgICAgIHJldFt4K3kqcXJjb2RlLndpZHRoXSA9IGdyYXk7CiAgICAgICAgfQogICAgfQogICAgcmV0dXJuIHJldDsKfQoKCgoKZnVuY3Rpb24gVVJTaGlmdCggbnVtYmVyLCAgYml0cykKewogICAgaWYgKG51bWJlciA+PSAwKQogICAgICAgIHJldHVybiBudW1iZXIgPj4gYml0czsKICAgIGVsc2UKICAgICAgICByZXR1cm4gKG51bWJlciA+PiBiaXRzKSArICgyIDw8IH5iaXRzKTsKfQoK</uax:ByteString>
		</Value>
	</UAVariable>
	<UAVariable NodeId="ns=1;s=SYSTEM.LIBRARY.PROJECT.RESOURCES/QRCodeScanner/rsdecoder.js" BrowseName="1:rsdecoder.js" DataType="ByteString" AccessLevel="103" UserAccessLevel="103" Historizing="true">
		<DisplayName Locale="en">rsdecoder.js</DisplayName>
		<Description Locale="en">rsdecoder.js</Description>
		<References>
			<Reference ReferenceType="HasComponent" IsForward="false">ns=1;s=SYSTEM.LIBRARY.PROJECT.RESOURCES/QRCodeScanner</Reference>
			<Reference ReferenceType="HasTypeDefinition">ns=1;s=VariableTypes.ATVISE.Resource.Javascript</Reference>
			<Reference ReferenceType="HasProperty">ns=1;s=VariableTypes.ATVISE.Resource.Javascript.Compress</Reference>
		</References>
		<Value>
			<uax:ByteString>LyoNCiAgUG9ydGVkIHRvIEphdmFTY3JpcHQgYnkgTGF6YXIgTGFzemxvIDIwMTEgDQogIA0KICBsYXphcnNvZnRAZ21haWwuY29tLCB3d3cubGF6YXJzb2Z0LmluZm8NCiAgDQoqLw0KDQovKg0KKg0KKiBDb3B5cmlnaHQgMjAwNyBaWGluZyBhdXRob3JzDQoqDQoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOw0KKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuDQoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KKg0KKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KKg0KKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KKi8NCg0KDQpmdW5jdGlvbiBSZWVkU29sb21vbkRlY29kZXIoZmllbGQpDQp7DQoJdGhpcy5maWVsZCA9IGZpZWxkOw0KCXRoaXMuZGVjb2RlPWZ1bmN0aW9uKHJlY2VpdmVkLCAgdHdvUykNCgl7DQoJCQl2YXIgcG9seSA9IG5ldyBHRjI1NlBvbHkodGhpcy5maWVsZCwgcmVjZWl2ZWQpOw0KCQkJdmFyIHN5bmRyb21lQ29lZmZpY2llbnRzID0gbmV3IEFycmF5KHR3b1MpOw0KCQkJZm9yKHZhciBpPTA7aTxzeW5kcm9tZUNvZWZmaWNpZW50cy5sZW5ndGg7aSsrKXN5bmRyb21lQ29lZmZpY2llbnRzW2ldPTA7DQoJCQl2YXIgZGF0YU1hdHJpeCA9IGZhbHNlOy8vdGhpcy5maWVsZC5FcXVhbHMoR0YyNTYuREFUQV9NQVRSSVhfRklFTEQpOw0KCQkJdmFyIG5vRXJyb3IgPSB0cnVlOw0KCQkJZm9yICh2YXIgaSA9IDA7IGkgPCB0d29TOyBpKyspDQoJCQl7DQoJCQkJLy8gVGhhbmtzIHRvIHNhbmZvcmRzcXVpcmVzIGZvciB0aGlzIGZpeDoNCgkJCQl2YXIgZXZhbHUgPSBwb2x5LmV2YWx1YXRlQXQodGhpcy5maWVsZC5leHAoZGF0YU1hdHJpeD9pICsgMTppKSk7DQoJCQkJc3luZHJvbWVDb2VmZmljaWVudHNbc3luZHJvbWVDb2VmZmljaWVudHMubGVuZ3RoIC0gMSAtIGldID0gZXZhbHU7DQoJCQkJaWYgKGV2YWx1ICE9IDApDQoJCQkJew0KCQkJCQlub0Vycm9yID0gZmFsc2U7DQoJCQkJfQ0KCQkJfQ0KCQkJaWYgKG5vRXJyb3IpDQoJCQl7DQoJCQkJcmV0dXJuIDsNCgkJCX0NCgkJCXZhciBzeW5kcm9tZSA9IG5ldyBHRjI1NlBvbHkodGhpcy5maWVsZCwgc3luZHJvbWVDb2VmZmljaWVudHMpOw0KCQkJdmFyIHNpZ21hT21lZ2EgPSB0aGlzLnJ1bkV1Y2xpZGVhbkFsZ29yaXRobSh0aGlzLmZpZWxkLmJ1aWxkTW9ub21pYWwodHdvUywgMSksIHN5bmRyb21lLCB0d29TKTsNCgkJCXZhciBzaWdtYSA9IHNpZ21hT21lZ2FbMF07DQoJCQl2YXIgb21lZ2EgPSBzaWdtYU9tZWdhWzFdOw0KCQkJdmFyIGVycm9yTG9jYXRpb25zID0gdGhpcy5maW5kRXJyb3JMb2NhdGlvbnMoc2lnbWEpOw0KCQkJdmFyIGVycm9yTWFnbml0dWRlcyA9IHRoaXMuZmluZEVycm9yTWFnbml0dWRlcyhvbWVnYSwgZXJyb3JMb2NhdGlvbnMsIGRhdGFNYXRyaXgpOw0KCQkJZm9yICh2YXIgaSA9IDA7IGkgPCBlcnJvckxvY2F0aW9ucy5sZW5ndGg7IGkrKykNCgkJCXsNCgkJCQl2YXIgcG9zaXRpb24gPSByZWNlaXZlZC5sZW5ndGggLSAxIC0gdGhpcy5maWVsZC5sb2coZXJyb3JMb2NhdGlvbnNbaV0pOw0KCQkJCWlmIChwb3NpdGlvbiA8IDApDQoJCQkJew0KCQkJCQl0aHJvdyAiUmVlZFNvbG9tb25FeGNlcHRpb24gQmFkIGVycm9yIGxvY2F0aW9uIjsNCgkJCQl9DQoJCQkJcmVjZWl2ZWRbcG9zaXRpb25dID0gR0YyNTYuYWRkT3JTdWJ0cmFjdChyZWNlaXZlZFtwb3NpdGlvbl0sIGVycm9yTWFnbml0dWRlc1tpXSk7DQoJCQl9DQoJfQ0KCQ0KCXRoaXMucnVuRXVjbGlkZWFuQWxnb3JpdGhtPWZ1bmN0aW9uKCBhLCAgYiwgIFIpDQoJCXsNCgkJCS8vIEFzc3VtZSBhJ3MgZGVncmVlIGlzID49IGIncw0KCQkJaWYgKGEuRGVncmVlIDwgYi5EZWdyZWUpDQoJCQl7DQoJCQkJdmFyIHRlbXAgPSBhOw0KCQkJCWEgPSBiOw0KCQkJCWIgPSB0ZW1wOw0KCQkJfQ0KCQkJDQoJCQl2YXIgckxhc3QgPSBhOw0KCQkJdmFyIHIgPSBiOw0KCQkJdmFyIHNMYXN0ID0gdGhpcy5maWVsZC5PbmU7DQoJCQl2YXIgcyA9IHRoaXMuZmllbGQuWmVybzsNCgkJCXZhciB0TGFzdCA9IHRoaXMuZmllbGQuWmVybzsNCgkJCXZhciB0ID0gdGhpcy5maWVsZC5PbmU7DQoJCQkNCgkJCS8vIFJ1biBFdWNsaWRlYW4gYWxnb3JpdGhtIHVudGlsIHIncyBkZWdyZWUgaXMgbGVzcyB0aGFuIFIvMg0KCQkJd2hpbGUgKHIuRGVncmVlID49IE1hdGguZmxvb3IoUiAvIDIpKQ0KCQkJew0KCQkJCXZhciByTGFzdExhc3QgPSByTGFzdDsNCgkJCQl2YXIgc0xhc3RMYXN0ID0gc0xhc3Q7DQoJCQkJdmFyIHRMYXN0TGFzdCA9IHRMYXN0Ow0KCQkJCXJMYXN0ID0gcjsNCgkJCQlzTGFzdCA9IHM7DQoJCQkJdExhc3QgPSB0Ow0KCQkJCQ0KCQkJCS8vIERpdmlkZSByTGFzdExhc3QgYnkgckxhc3QsIHdpdGggcXVvdGllbnQgaW4gcSBhbmQgcmVtYWluZGVyIGluIHINCgkJCQlpZiAockxhc3QuWmVybykNCgkJCQl7DQoJCQkJCS8vIE9vcHMsIEV1Y2xpZGVhbiBhbGdvcml0aG0gYWxyZWFkeSB0ZXJtaW5hdGVkPw0KCQkJCQl0aHJvdyAicl97aS0xfSB3YXMgemVybyI7DQoJCQkJfQ0KCQkJCXIgPSByTGFzdExhc3Q7DQoJCQkJdmFyIHEgPSB0aGlzLmZpZWxkLlplcm87DQoJCQkJdmFyIGRlbm9taW5hdG9yTGVhZGluZ1Rlcm0gPSByTGFzdC5nZXRDb2VmZmljaWVudChyTGFzdC5EZWdyZWUpOw0KCQkJCXZhciBkbHRJbnZlcnNlID0gdGhpcy5maWVsZC5pbnZlcnNlKGRlbm9taW5hdG9yTGVhZGluZ1Rlcm0pOw0KCQkJCXdoaWxlIChyLkRlZ3JlZSA+PSByTGFzdC5EZWdyZWUgJiYgIXIuWmVybykNCgkJCQl7DQoJCQkJCXZhciBkZWdyZWVEaWZmID0gci5EZWdyZWUgLSByTGFzdC5EZWdyZWU7DQoJCQkJCXZhciBzY2FsZSA9IHRoaXMuZmllbGQubXVsdGlwbHkoci5nZXRDb2VmZmljaWVudChyLkRlZ3JlZSksIGRsdEludmVyc2UpOw0KCQkJCQlxID0gcS5hZGRPclN1YnRyYWN0KHRoaXMuZmllbGQuYnVpbGRNb25vbWlhbChkZWdyZWVEaWZmLCBzY2FsZSkpOw0KCQkJCQlyID0gci5hZGRPclN1YnRyYWN0KHJMYXN0Lm11bHRpcGx5QnlNb25vbWlhbChkZWdyZWVEaWZmLCBzY2FsZSkpOw0KCQkJCQkvL3IuRVhFKCk7DQoJCQkJfQ0KCQkJCQ0KCQkJCXMgPSBxLm11bHRpcGx5MShzTGFzdCkuYWRkT3JTdWJ0cmFjdChzTGFzdExhc3QpOw0KCQkJCXQgPSBxLm11bHRpcGx5MSh0TGFzdCkuYWRkT3JTdWJ0cmFjdCh0TGFzdExhc3QpOw0KCQkJfQ0KCQkJDQoJCQl2YXIgc2lnbWFUaWxkZUF0WmVybyA9IHQuZ2V0Q29lZmZpY2llbnQoMCk7DQoJCQlpZiAoc2lnbWFUaWxkZUF0WmVybyA9PSAwKQ0KCQkJew0KCQkJCXRocm93ICJSZWVkU29sb21vbkV4Y2VwdGlvbiBzaWdtYVRpbGRlKDApIHdhcyB6ZXJvIjsNCgkJCX0NCgkJCQ0KCQkJdmFyIGludmVyc2UgPSB0aGlzLmZpZWxkLmludmVyc2Uoc2lnbWFUaWxkZUF0WmVybyk7DQoJCQl2YXIgc2lnbWEgPSB0Lm11bHRpcGx5MihpbnZlcnNlKTsNCgkJCXZhciBvbWVnYSA9IHIubXVsdGlwbHkyKGludmVyc2UpOw0KCQkJcmV0dXJuIG5ldyBBcnJheShzaWdtYSwgb21lZ2EpOw0KCQl9DQoJdGhpcy5maW5kRXJyb3JMb2NhdGlvbnM9ZnVuY3Rpb24oIGVycm9yTG9jYXRvcikNCgkJew0KCQkJLy8gVGhpcyBpcyBhIGRpcmVjdCBhcHBsaWNhdGlvbiBvZiBDaGllbidzIHNlYXJjaA0KCQkJdmFyIG51bUVycm9ycyA9IGVycm9yTG9jYXRvci5EZWdyZWU7DQoJCQlpZiAobnVtRXJyb3JzID09IDEpDQoJCQl7DQoJCQkJLy8gc2hvcnRjdXQNCgkJCQlyZXR1cm4gbmV3IEFycmF5KGVycm9yTG9jYXRvci5nZXRDb2VmZmljaWVudCgxKSk7DQoJCQl9DQoJCQl2YXIgcmVzdWx0ID0gbmV3IEFycmF5KG51bUVycm9ycyk7DQoJCQl2YXIgZSA9IDA7DQoJCQlmb3IgKHZhciBpID0gMTsgaSA8IDI1NiAmJiBlIDwgbnVtRXJyb3JzOyBpKyspDQoJCQl7DQoJCQkJaWYgKGVycm9yTG9jYXRvci5ldmFsdWF0ZUF0KGkpID09IDApDQoJCQkJew0KCQkJCQlyZXN1bHRbZV0gPSB0aGlzLmZpZWxkLmludmVyc2UoaSk7DQoJCQkJCWUrKzsNCgkJCQl9DQoJCQl9DQoJCQlpZiAoZSAhPSBudW1FcnJvcnMpDQoJCQl7DQoJCQkJdGhyb3cgIkVycm9yIGxvY2F0b3IgZGVncmVlIGRvZXMgbm90IG1hdGNoIG51bWJlciBvZiByb290cyI7DQoJCQl9DQoJCQlyZXR1cm4gcmVzdWx0Ow0KCQl9DQoJdGhpcy5maW5kRXJyb3JNYWduaXR1ZGVzPWZ1bmN0aW9uKCBlcnJvckV2YWx1YXRvciwgIGVycm9yTG9jYXRpb25zLCAgZGF0YU1hdHJpeCkNCgkJew0KCQkJLy8gVGhpcyBpcyBkaXJlY3RseSBhcHBseWluZyBGb3JuZXkncyBGb3JtdWxhDQoJCQl2YXIgcyA9IGVycm9yTG9jYXRpb25zLmxlbmd0aDsNCgkJCXZhciByZXN1bHQgPSBuZXcgQXJyYXkocyk7DQoJCQlmb3IgKHZhciBpID0gMDsgaSA8IHM7IGkrKykNCgkJCXsNCgkJCQl2YXIgeGlJbnZlcnNlID0gdGhpcy5maWVsZC5pbnZlcnNlKGVycm9yTG9jYXRpb25zW2ldKTsNCgkJCQl2YXIgZGVub21pbmF0b3IgPSAxOw0KCQkJCWZvciAodmFyIGogPSAwOyBqIDwgczsgaisrKQ0KCQkJCXsNCgkJCQkJaWYgKGkgIT0gaikNCgkJCQkJew0KCQkJCQkJZGVub21pbmF0b3IgPSB0aGlzLmZpZWxkLm11bHRpcGx5KGRlbm9taW5hdG9yLCBHRjI1Ni5hZGRPclN1YnRyYWN0KDEsIHRoaXMuZmllbGQubXVsdGlwbHkoZXJyb3JMb2NhdGlvbnNbal0sIHhpSW52ZXJzZSkpKTsNCgkJCQkJfQ0KCQkJCX0NCgkJCQlyZXN1bHRbaV0gPSB0aGlzLmZpZWxkLm11bHRpcGx5KGVycm9yRXZhbHVhdG9yLmV2YWx1YXRlQXQoeGlJbnZlcnNlKSwgdGhpcy5maWVsZC5pbnZlcnNlKGRlbm9taW5hdG9yKSk7DQoJCQkJLy8gVGhhbmtzIHRvIHNhbmZvcmRzcXVpcmVzIGZvciB0aGlzIGZpeDoNCgkJCQlpZiAoZGF0YU1hdHJpeCkNCgkJCQl7DQoJCQkJCXJlc3VsdFtpXSA9IHRoaXMuZmllbGQubXVsdGlwbHkocmVzdWx0W2ldLCB4aUludmVyc2UpOw0KCQkJCX0NCgkJCX0NCgkJCXJldHVybiByZXN1bHQ7DQoJCX0NCn0=</uax:ByteString>
		</Value>
	</UAVariable>
	<UAVariable NodeId="ns=1;s=SYSTEM.LIBRARY.PROJECT.RESOURCES/QRCodeScanner/test.html" BrowseName="1:test.html" DataType="ByteString" AccessLevel="103" UserAccessLevel="103" Historizing="true">
		<DisplayName Locale="en">test.html</DisplayName>
		<Description Locale="en">test.html</Description>
		<References>
			<Reference ReferenceType="HasComponent" IsForward="false">ns=1;s=SYSTEM.LIBRARY.PROJECT.RESOURCES/QRCodeScanner</Reference>
			<Reference ReferenceType="HasTypeDefinition">ns=1;s=VariableTypes.ATVISE.Resource.Html</Reference>
			<Reference ReferenceType="HasProperty">ns=1;s=VariableTypes.ATVISE.Resource.Html.Compress</Reference>
		</References>
		<Value>
			<uax:ByteString>PGh0bWw+CjxoZWFkPgoJCTwhLS1jb2RlIGluc2VydGVkIGJ5IGF0dmlzZS0tPgoJCTxzY3JpcHQgc3JjPSIvd2VibWkuanMiIHR5cGU9InRleHQvamF2YXNjcmlwdCI+PC9zY3JpcHQ+Cgo8dGl0bGU+UVJDT0RFPC90aXRsZT4KCjxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+Cjwvc3R5bGU+CgoKPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0iL1FSQ29kZVNjYW5uZXIvZ3JpZC5qcyI+PC9zY3JpcHQ+CjxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9Ii9RUkNvZGVTY2FubmVyL3ZlcnNpb24uanMiPjwvc2NyaXB0Pgo8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSIvUVJDb2RlU2Nhbm5lci9kZXRlY3Rvci5qcyI+PC9zY3JpcHQ+CjxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9Ii9RUkNvZGVTY2FubmVyL2Zvcm1hdGluZi5qcyI+PC9zY3JpcHQ+CjxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9Ii9RUkNvZGVTY2FubmVyL2Vycm9ybGV2ZWwuanMiPjwvc2NyaXB0Pgo8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSIvUVJDb2RlU2Nhbm5lci9iaXRtYXQuanMiPjwvc2NyaXB0Pgo8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSIvUVJDb2RlU2Nhbm5lci9kYXRhYmxvY2suanMiPjwvc2NyaXB0Pgo8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSIvUVJDb2RlU2Nhbm5lci9ibXBhcnNlci5qcyI+PC9zY3JpcHQ+CjxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9Ii9RUkNvZGVTY2FubmVyL2RhdGFtYXNrLmpzIj48L3NjcmlwdD4KPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0iL1FSQ29kZVNjYW5uZXIvcnNkZWNvZGVyLmpzIj48L3NjcmlwdD4KPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0iL1FSQ29kZVNjYW5uZXIvZ2YyNTZwb2x5LmpzIj48L3NjcmlwdD4KPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0iL1FSQ29kZVNjYW5uZXIvZ2YyNTYuanMiPjwvc2NyaXB0Pgo8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSIvUVJDb2RlU2Nhbm5lci9kZWNvZGVyLmpzIj48L3NjcmlwdD4KPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0iL1FSQ29kZVNjYW5uZXIvcXJjb2RlLmpzIj48L3NjcmlwdD4KPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0iL1FSQ29kZVNjYW5uZXIvZmluZHBhdC5qcyI+PC9zY3JpcHQ+CjxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9Ii9RUkNvZGVTY2FubmVyL2FsaWducGF0LmpzIj48L3NjcmlwdD4KPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0iL1FSQ29kZVNjYW5uZXIvZGF0YWJyLmpzIj48L3NjcmlwdD4KCjxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KZGVidWdnZXI7CnZhciBnQ3R4ID0gbnVsbDsKCXZhciBnQ2FudmFzID0gbnVsbDsKCgl2YXIgaW1hZ2VEYXRhID0gbnVsbDsKCXZhciBpaT0wOwoJdmFyIGpqPTA7Cgl2YXIgYz0wOwoJCgkKZnVuY3Rpb24gZHJhZ2VudGVyKGUpIHsKICBlLnN0b3BQcm9wYWdhdGlvbigpOwogIGUucHJldmVudERlZmF1bHQoKTsKfQoKZnVuY3Rpb24gZHJhZ292ZXIoZSkgewogIGUuc3RvcFByb3BhZ2F0aW9uKCk7CiAgZS5wcmV2ZW50RGVmYXVsdCgpOwp9CmZ1bmN0aW9uIGRyb3AoZSkgewogIGUuc3RvcFByb3BhZ2F0aW9uKCk7CiAgZS5wcmV2ZW50RGVmYXVsdCgpOwoKICB2YXIgZHQgPSBlLmRhdGFUcmFuc2ZlcjsKICB2YXIgZmlsZXMgPSBkdC5maWxlczsKCiAgaGFuZGxlRmlsZXMoZmlsZXMpOwp9CgpmdW5jdGlvbiBoYW5kbGVGaWxlcyhmKQp7Cgl2YXIgbz1bXTsKCWZvcih2YXIgaSA9MDtpPGYubGVuZ3RoO2krKykKCXsKCSAgdmFyIHJlYWRlciA9IG5ldyBGaWxlUmVhZGVyKCk7CgogICAgICByZWFkZXIub25sb2FkID0gKGZ1bmN0aW9uKHRoZUZpbGUpIHsKICAgICAgICByZXR1cm4gZnVuY3Rpb24oZSkgewogICAgICAgICAgcXJjb2RlLmRlY29kZShlLnRhcmdldC5yZXN1bHQpOwogICAgICAgIH07CiAgICAgIH0pKGZbaV0pOwoKICAgICAgLy8gUmVhZCBpbiB0aGUgaW1hZ2UgZmlsZSBhcyBhIGRhdGEgVVJMLgogICAgICByZWFkZXIucmVhZEFzRGF0YVVSTChmW2ldKTsJfQp9CgkKZnVuY3Rpb24gcmVhZChhKQp7CglhbGVydChhKTsKfQkKCQpmdW5jdGlvbiBsb2FkKCkKewoJaW5pdENhbnZhcyg2NDAsNDgwKTsKCXFyY29kZS5jYWxsYmFjayA9IHJlYWQ7CglxcmNvZGUuZGVjb2RlKCJtZXFydGh1bWIucG5nIik7Cn0KCmZ1bmN0aW9uIGluaXRDYW52YXMod3csaGgpCgl7CgkJZ0NhbnZhcyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJxci1jYW52YXMiKTsKCQlnQ2FudmFzLmFkZEV2ZW50TGlzdGVuZXIoImRyYWdlbnRlciIsIGRyYWdlbnRlciwgZmFsc2UpOyAgCgkJZ0NhbnZhcy5hZGRFdmVudExpc3RlbmVyKCJkcmFnb3ZlciIsIGRyYWdvdmVyLCBmYWxzZSk7ICAKCQlnQ2FudmFzLmFkZEV2ZW50TGlzdGVuZXIoImRyb3AiLCBkcm9wLCBmYWxzZSk7CgkJdmFyIHcgPSB3dzsKCQl2YXIgaCA9IGhoOwoJCWdDYW52YXMuc3R5bGUud2lkdGggPSB3ICsgInB4IjsKCQlnQ2FudmFzLnN0eWxlLmhlaWdodCA9IGggKyAicHgiOwoJCWdDYW52YXMud2lkdGggPSB3OwoJCWdDYW52YXMuaGVpZ2h0ID0gaDsKCQlnQ3R4ID0gZ0NhbnZhcy5nZXRDb250ZXh0KCIyZCIpOwoJCWdDdHguY2xlYXJSZWN0KDAsIDAsIHcsIGgpOwoJCWltYWdlRGF0YSA9IGdDdHguZ2V0SW1hZ2VEYXRhKCAwLDAsMzIwLDI0MCk7Cgl9CgoJZnVuY3Rpb24gcGFzc0xpbmUoc3RyaW5nUGl4ZWxzKSB7IAoJCS8vYSA9IChpbnRWYWwgPj4gMjQpICYgMHhmZjsKCgkJdmFyIGNvbGwgPSBzdHJpbmdQaXhlbHMuc3BsaXQoIi0iKTsKCQoJCWZvcih2YXIgaT0wO2k8MzIwO2krKykgeyAKCQkJdmFyIGludFZhbCA9IHBhcnNlSW50KGNvbGxbaV0pOwoJCQlyID0gKGludFZhbCA+PiAxNikgJiAweGZmOwoJCQlnID0gKGludFZhbCA+PiA4KSAmIDB4ZmY7CgkJCWIgPSAoaW50VmFsICkgJiAweGZmOwoJCQlpbWFnZURhdGEuZGF0YVtjKzBdPXI7CgkJCWltYWdlRGF0YS5kYXRhW2MrMV09ZzsKCQkJaW1hZ2VEYXRhLmRhdGFbYysyXT1iOwoJCQlpbWFnZURhdGEuZGF0YVtjKzNdPTI1NTsKCQkJYys9NDsKCQl9IAoKCQlpZihjPj0zMjAqMjQwKjQpIHsgCgkJCWM9MDsKICAgICAgCQkJZ0N0eC5wdXRJbWFnZURhdGEoaW1hZ2VEYXRhLCAwLDApOwoJCX0gCiAJfSAKCiAgICAgICAgZnVuY3Rpb24gY2FwdHVyZVRvQ2FudmFzKCkgewoJCWZsYXNoID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImVtYmVkZmxhc2giKTsKCQlmbGFzaC5jY0NhcHR1cmUoKTsKCQlxcmNvZGUuZGVjb2RlKCk7CiAgICAgICAgfQo8L3NjcmlwdD4KCjwvaGVhZD4KCjxib2R5IG9ubG9hZD0ibG9hZCgpIj4KICAgIDxkaXYgY2xhc3M9ImNvbnRhaW5lciI+CgkKICAJPG9iamVjdCAgaWQ9ImllbWJlZGZsYXNoIiBjbGFzc2lkPSJjbHNpZDpkMjdjZGI2ZS1hZTZkLTExY2YtOTZiOC00NDQ1NTM1NDAwMDAiIGNvZGViYXNlPSJodHRwOi8vZG93bmxvYWQubWFjcm9tZWRpYS5jb20vcHViL3Nob2Nrd2F2ZS9jYWJzL2ZsYXNoL3N3Zmxhc2guY2FiI3ZlcnNpb249NywwLDAsMCIgd2lkdGg9IjMyMCIgaGVpZ2h0PSIyNDAiPgogIAkJPHBhcmFtIG5hbWU9Im1vdmllIiB2YWx1ZT0iY2FtY2FudmFzLnN3ZiIgLz4KICAJCTxwYXJhbSBuYW1lPSJxdWFsaXR5IiB2YWx1ZT0iaGlnaCIgLz4KCQk8cGFyYW0gbmFtZT0iYWxsb3dTY3JpcHRBY2Nlc3MiIHZhbHVlPSJhbHdheXMiIC8+CiAgCQk8ZW1iZWQgIGFsbG93U2NyaXB0QWNjZXNzPSJhbHdheXMiICBpZD0iZW1iZWRmbGFzaCIgc3JjPSJjYW1jYW52YXMuc3dmIiBxdWFsaXR5PSJoaWdoIiB3aWR0aD0iMzIwIiBoZWlnaHQ9IjI0MCIgdHlwZT0iYXBwbGljYXRpb24veC1zaG9ja3dhdmUtZmxhc2giIHBsdWdpbnNwYWdlPSJodHRwOi8vd3d3Lm1hY3JvbWVkaWEuY29tL2dvL2dldGZsYXNocGxheWVyIiBtYXlzY3JpcHQ9InRydWUiICAvPgogICAgPC9vYmplY3Q+CgkKICAgIDwvZGl2Pgo8YnV0dG9uIG9uY2xpY2s9ImNhcHR1cmVUb0NhbnZhcygpIj5DYXB0dXJlPC9idXR0b24+PGJyPgo8Y2FudmFzIGlkPSJxci1jYW52YXMiIHdpZHRoPSI2NDAiIGhlaWdodD0iNDgwIj48L2NhbnZhcz4KPC9ib2R5PgoKPC9odG1sPg==</uax:ByteString>
		</Value>
	</UAVariable>
	<UAVariable NodeId="ns=1;s=SYSTEM.LIBRARY.PROJECT.RESOURCES/QRCodeScanner/version.js" BrowseName="1:version.js" DataType="ByteString" AccessLevel="103" UserAccessLevel="103" Historizing="true">
		<DisplayName Locale="en">version.js</DisplayName>
		<Description Locale="en">version.js</Description>
		<References>
			<Reference ReferenceType="HasComponent" IsForward="false">ns=1;s=SYSTEM.LIBRARY.PROJECT.RESOURCES/QRCodeScanner</Reference>
			<Reference ReferenceType="HasTypeDefinition">ns=1;s=VariableTypes.ATVISE.Resource.Javascript</Reference>
			<Reference ReferenceType="HasProperty">ns=1;s=VariableTypes.ATVISE.Resource.Javascript.Compress</Reference>
		</References>
		<Value>
			<uax:ByteString>LyoNCiAgUG9ydGVkIHRvIEphdmFTY3JpcHQgYnkgTGF6YXIgTGFzemxvIDIwMTEgDQogIA0KICBsYXphcnNvZnRAZ21haWwuY29tLCB3d3cubGF6YXJzb2Z0LmluZm8NCiAgDQoqLw0KDQovKg0KKg0KKiBDb3B5cmlnaHQgMjAwNyBaWGluZyBhdXRob3JzDQoqDQoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOw0KKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuDQoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KKg0KKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KKg0KKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KKi8NCg0KDQoNCmZ1bmN0aW9uIEVDQihjb3VudCwgIGRhdGFDb2Rld29yZHMpDQp7DQoJdGhpcy5jb3VudCA9IGNvdW50Ow0KCXRoaXMuZGF0YUNvZGV3b3JkcyA9IGRhdGFDb2Rld29yZHM7DQoJDQoJdGhpcy5fX2RlZmluZUdldHRlcl9fKCJDb3VudCIsIGZ1bmN0aW9uKCkNCgl7DQoJCXJldHVybiB0aGlzLmNvdW50Ow0KCX0pOw0KCXRoaXMuX19kZWZpbmVHZXR0ZXJfXygiRGF0YUNvZGV3b3JkcyIsIGZ1bmN0aW9uKCkNCgl7DQoJCXJldHVybiB0aGlzLmRhdGFDb2Rld29yZHM7DQoJfSk7DQp9DQoNCmZ1bmN0aW9uIEVDQmxvY2tzKCBlY0NvZGV3b3Jkc1BlckJsb2NrLCAgZWNCbG9ja3MxLCAgZWNCbG9ja3MyKQ0Kew0KCXRoaXMuZWNDb2Rld29yZHNQZXJCbG9jayA9IGVjQ29kZXdvcmRzUGVyQmxvY2s7DQoJaWYoZWNCbG9ja3MyKQ0KCQl0aGlzLmVjQmxvY2tzID0gbmV3IEFycmF5KGVjQmxvY2tzMSwgZWNCbG9ja3MyKTsNCgllbHNlDQoJCXRoaXMuZWNCbG9ja3MgPSBuZXcgQXJyYXkoZWNCbG9ja3MxKTsNCgkNCgl0aGlzLl9fZGVmaW5lR2V0dGVyX18oIkVDQ29kZXdvcmRzUGVyQmxvY2siLCBmdW5jdGlvbigpDQoJew0KCQlyZXR1cm4gdGhpcy5lY0NvZGV3b3Jkc1BlckJsb2NrOw0KCX0pOw0KCQ0KCXRoaXMuX19kZWZpbmVHZXR0ZXJfXygiVG90YWxFQ0NvZGV3b3JkcyIsIGZ1bmN0aW9uKCkNCgl7DQoJCXJldHVybiAgdGhpcy5lY0NvZGV3b3Jkc1BlckJsb2NrICogdGhpcy5OdW1CbG9ja3M7DQoJfSk7DQoJDQoJdGhpcy5fX2RlZmluZUdldHRlcl9fKCJOdW1CbG9ja3MiLCBmdW5jdGlvbigpDQoJew0KCQl2YXIgdG90YWwgPSAwOw0KCQlmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuZWNCbG9ja3MubGVuZ3RoOyBpKyspDQoJCXsNCgkJCXRvdGFsICs9IHRoaXMuZWNCbG9ja3NbaV0ubGVuZ3RoOw0KCQl9DQoJCXJldHVybiB0b3RhbDsNCgl9KTsNCgkNCgl0aGlzLmdldEVDQmxvY2tzPWZ1bmN0aW9uKCkNCgkJCXsNCgkJCQlyZXR1cm4gdGhpcy5lY0Jsb2NrczsNCgkJCX0NCn0NCg0KZnVuY3Rpb24gVmVyc2lvbiggdmVyc2lvbk51bWJlciwgIGFsaWdubWVudFBhdHRlcm5DZW50ZXJzLCAgZWNCbG9ja3MxLCAgZWNCbG9ja3MyLCAgZWNCbG9ja3MzLCAgZWNCbG9ja3M0KQ0Kew0KCXRoaXMudmVyc2lvbk51bWJlciA9IHZlcnNpb25OdW1iZXI7DQoJdGhpcy5hbGlnbm1lbnRQYXR0ZXJuQ2VudGVycyA9IGFsaWdubWVudFBhdHRlcm5DZW50ZXJzOw0KCXRoaXMuZWNCbG9ja3MgPSBuZXcgQXJyYXkoZWNCbG9ja3MxLCBlY0Jsb2NrczIsIGVjQmxvY2tzMywgZWNCbG9ja3M0KTsNCgkNCgl2YXIgdG90YWwgPSAwOw0KCXZhciBlY0NvZGV3b3JkcyA9IGVjQmxvY2tzMS5FQ0NvZGV3b3Jkc1BlckJsb2NrOw0KCXZhciBlY2JBcnJheSA9IGVjQmxvY2tzMS5nZXRFQ0Jsb2NrcygpOw0KCWZvciAodmFyIGkgPSAwOyBpIDwgZWNiQXJyYXkubGVuZ3RoOyBpKyspDQoJew0KCQl2YXIgZWNCbG9jayA9IGVjYkFycmF5W2ldOw0KCQl0b3RhbCArPSBlY0Jsb2NrLkNvdW50ICogKGVjQmxvY2suRGF0YUNvZGV3b3JkcyArIGVjQ29kZXdvcmRzKTsNCgl9DQoJdGhpcy50b3RhbENvZGV3b3JkcyA9IHRvdGFsOw0KCQ0KCXRoaXMuX19kZWZpbmVHZXR0ZXJfXygiVmVyc2lvbk51bWJlciIsIGZ1bmN0aW9uKCkNCgl7DQoJCXJldHVybiAgdGhpcy52ZXJzaW9uTnVtYmVyOw0KCX0pOw0KCQ0KCXRoaXMuX19kZWZpbmVHZXR0ZXJfXygiQWxpZ25tZW50UGF0dGVybkNlbnRlcnMiLCBmdW5jdGlvbigpDQoJew0KCQlyZXR1cm4gIHRoaXMuYWxpZ25tZW50UGF0dGVybkNlbnRlcnM7DQoJfSk7DQoJdGhpcy5fX2RlZmluZUdldHRlcl9fKCJUb3RhbENvZGV3b3JkcyIsIGZ1bmN0aW9uKCkNCgl7DQoJCXJldHVybiAgdGhpcy50b3RhbENvZGV3b3JkczsNCgl9KTsNCgl0aGlzLl9fZGVmaW5lR2V0dGVyX18oIkRpbWVuc2lvbkZvclZlcnNpb24iLCBmdW5jdGlvbigpDQoJew0KCQlyZXR1cm4gIDE3ICsgNCAqIHRoaXMudmVyc2lvbk51bWJlcjsNCgl9KTsNCgkNCgl0aGlzLmJ1aWxkRnVuY3Rpb25QYXR0ZXJuPWZ1bmN0aW9uKCkNCgkJew0KCQkJdmFyIGRpbWVuc2lvbiA9IHRoaXMuRGltZW5zaW9uRm9yVmVyc2lvbjsNCgkJCXZhciBiaXRNYXRyaXggPSBuZXcgQml0TWF0cml4KGRpbWVuc2lvbik7DQoJCQkNCgkJCS8vIFRvcCBsZWZ0IGZpbmRlciBwYXR0ZXJuICsgc2VwYXJhdG9yICsgZm9ybWF0DQoJCQliaXRNYXRyaXguc2V0UmVnaW9uKDAsIDAsIDksIDkpOw0KCQkJLy8gVG9wIHJpZ2h0IGZpbmRlciBwYXR0ZXJuICsgc2VwYXJhdG9yICsgZm9ybWF0DQoJCQliaXRNYXRyaXguc2V0UmVnaW9uKGRpbWVuc2lvbiAtIDgsIDAsIDgsIDkpOw0KCQkJLy8gQm90dG9tIGxlZnQgZmluZGVyIHBhdHRlcm4gKyBzZXBhcmF0b3IgKyBmb3JtYXQNCgkJCWJpdE1hdHJpeC5zZXRSZWdpb24oMCwgZGltZW5zaW9uIC0gOCwgOSwgOCk7DQoJCQkNCgkJCS8vIEFsaWdubWVudCBwYXR0ZXJucw0KCQkJdmFyIG1heCA9IHRoaXMuYWxpZ25tZW50UGF0dGVybkNlbnRlcnMubGVuZ3RoOw0KCQkJZm9yICh2YXIgeCA9IDA7IHggPCBtYXg7IHgrKykNCgkJCXsNCgkJCQl2YXIgaSA9IHRoaXMuYWxpZ25tZW50UGF0dGVybkNlbnRlcnNbeF0gLSAyOw0KCQkJCWZvciAodmFyIHkgPSAwOyB5IDwgbWF4OyB5KyspDQoJCQkJew0KCQkJCQlpZiAoKHggPT0gMCAmJiAoeSA9PSAwIHx8IHkgPT0gbWF4IC0gMSkpIHx8ICh4ID09IG1heCAtIDEgJiYgeSA9PSAwKSkNCgkJCQkJew0KCQkJCQkJLy8gTm8gYWxpZ25tZW50IHBhdHRlcm5zIG5lYXIgdGhlIHRocmVlIGZpbmRlciBwYXRlcm5zDQoJCQkJCQljb250aW51ZTsNCgkJCQkJfQ0KCQkJCQliaXRNYXRyaXguc2V0UmVnaW9uKHRoaXMuYWxpZ25tZW50UGF0dGVybkNlbnRlcnNbeV0gLSAyLCBpLCA1LCA1KTsNCgkJCQl9DQoJCQl9DQoJCQkNCgkJCS8vIFZlcnRpY2FsIHRpbWluZyBwYXR0ZXJuDQoJCQliaXRNYXRyaXguc2V0UmVnaW9uKDYsIDksIDEsIGRpbWVuc2lvbiAtIDE3KTsNCgkJCS8vIEhvcml6b250YWwgdGltaW5nIHBhdHRlcm4NCgkJCWJpdE1hdHJpeC5zZXRSZWdpb24oOSwgNiwgZGltZW5zaW9uIC0gMTcsIDEpOw0KCQkJDQoJCQlpZiAodGhpcy52ZXJzaW9uTnVtYmVyID4gNikNCgkJCXsNCgkJCQkvLyBWZXJzaW9uIGluZm8sIHRvcCByaWdodA0KCQkJCWJpdE1hdHJpeC5zZXRSZWdpb24oZGltZW5zaW9uIC0gMTEsIDAsIDMsIDYpOw0KCQkJCS8vIFZlcnNpb24gaW5mbywgYm90dG9tIGxlZnQNCgkJCQliaXRNYXRyaXguc2V0UmVnaW9uKDAsIGRpbWVuc2lvbiAtIDExLCA2LCAzKTsNCgkJCX0NCgkJCQ0KCQkJcmV0dXJuIGJpdE1hdHJpeDsNCgkJfQ0KCXRoaXMuZ2V0RUNCbG9ja3NGb3JMZXZlbD1mdW5jdGlvbiggZWNMZXZlbCkNCgl7DQoJCXJldHVybiB0aGlzLmVjQmxvY2tzW2VjTGV2ZWwub3JkaW5hbCgpXTsNCgl9DQp9DQoNClZlcnNpb24uVkVSU0lPTl9ERUNPREVfSU5GTyA9IG5ldyBBcnJheSgweDA3Qzk0LCAweDA4NUJDLCAweDA5QTk5LCAweDBBNEQzLCAweDBCQkY2LCAweDBDNzYyLCAweDBEODQ3LCAweDBFNjBELCAweDBGOTI4LCAweDEwQjc4LCAweDExNDVELCAweDEyQTE3LCAweDEzNTMyLCAweDE0OUE2LCAweDE1NjgzLCAweDE2OEM5LCAweDE3N0VDLCAweDE4RUM0LCAweDE5MUUxLCAweDFBRkFCLCAweDFCMDhFLCAweDFDQzFBLCAweDFEMzNGLCAweDFFRDc1LCAweDFGMjUwLCAweDIwOUQ1LCAweDIxNkYwLCAweDIyOEJBLCAweDIzNzlGLCAweDI0QjBCLCAweDI1NDJFLCAweDI2QTY0LCAweDI3NTQxLCAweDI4QzY5KTsNCg0KVmVyc2lvbi5WRVJTSU9OUyA9IGJ1aWxkVmVyc2lvbnMoKTsNCg0KVmVyc2lvbi5nZXRWZXJzaW9uRm9yTnVtYmVyPWZ1bmN0aW9uKCB2ZXJzaW9uTnVtYmVyKQ0Kew0KCWlmICh2ZXJzaW9uTnVtYmVyIDwgMSB8fCB2ZXJzaW9uTnVtYmVyID4gNDApDQoJew0KCQl0aHJvdyAiQXJndW1lbnRFeGNlcHRpb24iOw0KCX0NCglyZXR1cm4gVmVyc2lvbi5WRVJTSU9OU1t2ZXJzaW9uTnVtYmVyIC0gMV07DQp9DQoNClZlcnNpb24uZ2V0UHJvdmlzaW9uYWxWZXJzaW9uRm9yRGltZW5zaW9uPWZ1bmN0aW9uKGRpbWVuc2lvbikNCnsNCglpZiAoZGltZW5zaW9uICUgNCAhPSAxKQ0KCXsNCgkJdGhyb3cgIkVycm9yIGdldFByb3Zpc2lvbmFsVmVyc2lvbkZvckRpbWVuc2lvbiI7DQoJfQ0KCXRyeQ0KCXsNCgkJcmV0dXJuIFZlcnNpb24uZ2V0VmVyc2lvbkZvck51bWJlcigoZGltZW5zaW9uIC0gMTcpID4+IDIpOw0KCX0NCgljYXRjaCAoIGlhZSkNCgl7DQoJCXRocm93ICJFcnJvciBnZXRWZXJzaW9uRm9yTnVtYmVyIjsNCgl9DQp9DQoNClZlcnNpb24uZGVjb2RlVmVyc2lvbkluZm9ybWF0aW9uPWZ1bmN0aW9uKCB2ZXJzaW9uQml0cykNCnsNCgl2YXIgYmVzdERpZmZlcmVuY2UgPSAweGZmZmZmZmZmOw0KCXZhciBiZXN0VmVyc2lvbiA9IDA7DQoJZm9yICh2YXIgaSA9IDA7IGkgPCBWZXJzaW9uLlZFUlNJT05fREVDT0RFX0lORk8ubGVuZ3RoOyBpKyspDQoJew0KCQl2YXIgdGFyZ2V0VmVyc2lvbiA9IFZlcnNpb24uVkVSU0lPTl9ERUNPREVfSU5GT1tpXTsNCgkJLy8gRG8gdGhlIHZlcnNpb24gaW5mbyBiaXRzIG1hdGNoIGV4YWN0bHk/IGRvbmUuDQoJCWlmICh0YXJnZXRWZXJzaW9uID09IHZlcnNpb25CaXRzKQ0KCQl7DQoJCQlyZXR1cm4gdGhpcy5nZXRWZXJzaW9uRm9yTnVtYmVyKGkgKyA3KTsNCgkJfQ0KCQkvLyBPdGhlcndpc2Ugc2VlIGlmIHRoaXMgaXMgdGhlIGNsb3Nlc3QgdG8gYSByZWFsIHZlcnNpb24gaW5mbyBiaXQgc3RyaW5nDQoJCS8vIHdlIGhhdmUgc2VlbiBzbyBmYXINCgkJdmFyIGJpdHNEaWZmZXJlbmNlID0gRm9ybWF0SW5mb3JtYXRpb24ubnVtQml0c0RpZmZlcmluZyh2ZXJzaW9uQml0cywgdGFyZ2V0VmVyc2lvbik7DQoJCWlmIChiaXRzRGlmZmVyZW5jZSA8IGJlc3REaWZmZXJlbmNlKQ0KCQl7DQoJCQliZXN0VmVyc2lvbiA9IGkgKyA3Ow0KCQkJYmVzdERpZmZlcmVuY2UgPSBiaXRzRGlmZmVyZW5jZTsNCgkJfQ0KCX0NCgkvLyBXZSBjYW4gdG9sZXJhdGUgdXAgdG8gMyBiaXRzIG9mIGVycm9yIHNpbmNlIG5vIHR3byB2ZXJzaW9uIGluZm8gY29kZXdvcmRzIHdpbGwNCgkvLyBkaWZmZXIgaW4gbGVzcyB0aGFuIDQgYml0cy4NCglpZiAoYmVzdERpZmZlcmVuY2UgPD0gMykNCgl7DQoJCXJldHVybiB0aGlzLmdldFZlcnNpb25Gb3JOdW1iZXIoYmVzdFZlcnNpb24pOw0KCX0NCgkvLyBJZiB3ZSBkaWRuJ3QgZmluZCBhIGNsb3NlIGVub3VnaCBtYXRjaCwgZmFpbA0KCXJldHVybiBudWxsOw0KfQ0KDQpmdW5jdGlvbiBidWlsZFZlcnNpb25zKCkNCnsNCglyZXR1cm4gbmV3IEFycmF5KG5ldyBWZXJzaW9uKDEsIG5ldyBBcnJheSgpLCBuZXcgRUNCbG9ja3MoNywgbmV3IEVDQigxLCAxOSkpLCBuZXcgRUNCbG9ja3MoMTAsIG5ldyBFQ0IoMSwgMTYpKSwgbmV3IEVDQmxvY2tzKDEzLCBuZXcgRUNCKDEsIDEzKSksIG5ldyBFQ0Jsb2NrcygxNywgbmV3IEVDQigxLCA5KSkpLCANCgluZXcgVmVyc2lvbigyLCBuZXcgQXJyYXkoNiwgMTgpLCBuZXcgRUNCbG9ja3MoMTAsIG5ldyBFQ0IoMSwgMzQpKSwgbmV3IEVDQmxvY2tzKDE2LCBuZXcgRUNCKDEsIDI4KSksIG5ldyBFQ0Jsb2NrcygyMiwgbmV3IEVDQigxLCAyMikpLCBuZXcgRUNCbG9ja3MoMjgsIG5ldyBFQ0IoMSwgMTYpKSksIA0KCW5ldyBWZXJzaW9uKDMsIG5ldyBBcnJheSg2LCAyMiksIG5ldyBFQ0Jsb2NrcygxNSwgbmV3IEVDQigxLCA1NSkpLCBuZXcgRUNCbG9ja3MoMjYsIG5ldyBFQ0IoMSwgNDQpKSwgbmV3IEVDQmxvY2tzKDE4LCBuZXcgRUNCKDIsIDE3KSksIG5ldyBFQ0Jsb2NrcygyMiwgbmV3IEVDQigyLCAxMykpKSwgDQoJbmV3IFZlcnNpb24oNCwgbmV3IEFycmF5KDYsIDI2KSwgbmV3IEVDQmxvY2tzKDIwLCBuZXcgRUNCKDEsIDgwKSksIG5ldyBFQ0Jsb2NrcygxOCwgbmV3IEVDQigyLCAzMikpLCBuZXcgRUNCbG9ja3MoMjYsIG5ldyBFQ0IoMiwgMjQpKSwgbmV3IEVDQmxvY2tzKDE2LCBuZXcgRUNCKDQsIDkpKSksIA0KCW5ldyBWZXJzaW9uKDUsIG5ldyBBcnJheSg2LCAzMCksIG5ldyBFQ0Jsb2NrcygyNiwgbmV3IEVDQigxLCAxMDgpKSwgbmV3IEVDQmxvY2tzKDI0LCBuZXcgRUNCKDIsIDQzKSksIG5ldyBFQ0Jsb2NrcygxOCwgbmV3IEVDQigyLCAxNSksIG5ldyBFQ0IoMiwgMTYpKSwgbmV3IEVDQmxvY2tzKDIyLCBuZXcgRUNCKDIsIDExKSwgbmV3IEVDQigyLCAxMikpKSwgDQoJbmV3IFZlcnNpb24oNiwgbmV3IEFycmF5KDYsIDM0KSwgbmV3IEVDQmxvY2tzKDE4LCBuZXcgRUNCKDIsIDY4KSksIG5ldyBFQ0Jsb2NrcygxNiwgbmV3IEVDQig0LCAyNykpLCBuZXcgRUNCbG9ja3MoMjQsIG5ldyBFQ0IoNCwgMTkpKSwgbmV3IEVDQmxvY2tzKDI4LCBuZXcgRUNCKDQsIDE1KSkpLCANCgluZXcgVmVyc2lvbig3LCBuZXcgQXJyYXkoNiwgMjIsIDM4KSwgbmV3IEVDQmxvY2tzKDIwLCBuZXcgRUNCKDIsIDc4KSksIG5ldyBFQ0Jsb2NrcygxOCwgbmV3IEVDQig0LCAzMSkpLCBuZXcgRUNCbG9ja3MoMTgsIG5ldyBFQ0IoMiwgMTQpLCBuZXcgRUNCKDQsIDE1KSksIG5ldyBFQ0Jsb2NrcygyNiwgbmV3IEVDQig0LCAxMyksIG5ldyBFQ0IoMSwgMTQpKSksIA0KCW5ldyBWZXJzaW9uKDgsIG5ldyBBcnJheSg2LCAyNCwgNDIpLCBuZXcgRUNCbG9ja3MoMjQsIG5ldyBFQ0IoMiwgOTcpKSwgbmV3IEVDQmxvY2tzKDIyLCBuZXcgRUNCKDIsIDM4KSwgbmV3IEVDQigyLCAzOSkpLCBuZXcgRUNCbG9ja3MoMjIsIG5ldyBFQ0IoNCwgMTgpLCBuZXcgRUNCKDIsIDE5KSksIG5ldyBFQ0Jsb2NrcygyNiwgbmV3IEVDQig0LCAxNCksIG5ldyBFQ0IoMiwgMTUpKSksIA0KCW5ldyBWZXJzaW9uKDksIG5ldyBBcnJheSg2LCAyNiwgNDYpLCBuZXcgRUNCbG9ja3MoMzAsIG5ldyBFQ0IoMiwgMTE2KSksIG5ldyBFQ0Jsb2NrcygyMiwgbmV3IEVDQigzLCAzNiksIG5ldyBFQ0IoMiwgMzcpKSwgbmV3IEVDQmxvY2tzKDIwLCBuZXcgRUNCKDQsIDE2KSwgbmV3IEVDQig0LCAxNykpLCBuZXcgRUNCbG9ja3MoMjQsIG5ldyBFQ0IoNCwgMTIpLCBuZXcgRUNCKDQsIDEzKSkpLCANCgluZXcgVmVyc2lvbigxMCwgbmV3IEFycmF5KDYsIDI4LCA1MCksIG5ldyBFQ0Jsb2NrcygxOCwgbmV3IEVDQigyLCA2OCksIG5ldyBFQ0IoMiwgNjkpKSwgbmV3IEVDQmxvY2tzKDI2LCBuZXcgRUNCKDQsIDQzKSwgbmV3IEVDQigxLCA0NCkpLCBuZXcgRUNCbG9ja3MoMjQsIG5ldyBFQ0IoNiwgMTkpLCBuZXcgRUNCKDIsIDIwKSksIG5ldyBFQ0Jsb2NrcygyOCwgbmV3IEVDQig2LCAxNSksIG5ldyBFQ0IoMiwgMTYpKSksIA0KCW5ldyBWZXJzaW9uKDExLCBuZXcgQXJyYXkoNiwgMzAsIDU0KSwgbmV3IEVDQmxvY2tzKDIwLCBuZXcgRUNCKDQsIDgxKSksIG5ldyBFQ0Jsb2NrcygzMCwgbmV3IEVDQigxLCA1MCksIG5ldyBFQ0IoNCwgNTEpKSwgbmV3IEVDQmxvY2tzKDI4LCBuZXcgRUNCKDQsIDIyKSwgbmV3IEVDQig0LCAyMykpLCBuZXcgRUNCbG9ja3MoMjQsIG5ldyBFQ0IoMywgMTIpLCBuZXcgRUNCKDgsIDEzKSkpLCANCgluZXcgVmVyc2lvbigxMiwgbmV3IEFycmF5KDYsIDMyLCA1OCksIG5ldyBFQ0Jsb2NrcygyNCwgbmV3IEVDQigyLCA5MiksIG5ldyBFQ0IoMiwgOTMpKSwgbmV3IEVDQmxvY2tzKDIyLCBuZXcgRUNCKDYsIDM2KSwgbmV3IEVDQigyLCAzNykpLCBuZXcgRUNCbG9ja3MoMjYsIG5ldyBFQ0IoNCwgMjApLCBuZXcgRUNCKDYsIDIxKSksIG5ldyBFQ0Jsb2NrcygyOCwgbmV3IEVDQig3LCAxNCksIG5ldyBFQ0IoNCwgMTUpKSksIA0KCW5ldyBWZXJzaW9uKDEzLCBuZXcgQXJyYXkoNiwgMzQsIDYyKSwgbmV3IEVDQmxvY2tzKDI2LCBuZXcgRUNCKDQsIDEwNykpLCBuZXcgRUNCbG9ja3MoMjIsIG5ldyBFQ0IoOCwgMzcpLCBuZXcgRUNCKDEsIDM4KSksIG5ldyBFQ0Jsb2NrcygyNCwgbmV3IEVDQig4LCAyMCksIG5ldyBFQ0IoNCwgMjEpKSwgbmV3IEVDQmxvY2tzKDIyLCBuZXcgRUNCKDEyLCAxMSksIG5ldyBFQ0IoNCwgMTIpKSksIA0KCW5ldyBWZXJzaW9uKDE0LCBuZXcgQXJyYXkoNiwgMjYsIDQ2LCA2NiksIG5ldyBFQ0Jsb2NrcygzMCwgbmV3IEVDQigzLCAxMTUpLCBuZXcgRUNCKDEsIDExNikpLCBuZXcgRUNCbG9ja3MoMjQsIG5ldyBFQ0IoNCwgNDApLCBuZXcgRUNCKDUsIDQxKSksIG5ldyBFQ0Jsb2NrcygyMCwgbmV3IEVDQigxMSwgMTYpLCBuZXcgRUNCKDUsIDE3KSksIG5ldyBFQ0Jsb2NrcygyNCwgbmV3IEVDQigxMSwgMTIpLCBuZXcgRUNCKDUsIDEzKSkpLCANCgluZXcgVmVyc2lvbigxNSwgbmV3IEFycmF5KDYsIDI2LCA0OCwgNzApLCBuZXcgRUNCbG9ja3MoMjIsIG5ldyBFQ0IoNSwgODcpLCBuZXcgRUNCKDEsIDg4KSksIG5ldyBFQ0Jsb2NrcygyNCwgbmV3IEVDQig1LCA0MSksIG5ldyBFQ0IoNSwgNDIpKSwgbmV3IEVDQmxvY2tzKDMwLCBuZXcgRUNCKDUsIDI0KSwgbmV3IEVDQig3LCAyNSkpLCBuZXcgRUNCbG9ja3MoMjQsIG5ldyBFQ0IoMTEsIDEyKSwgbmV3IEVDQig3LCAxMykpKSwgDQoJbmV3IFZlcnNpb24oMTYsIG5ldyBBcnJheSg2LCAyNiwgNTAsIDc0KSwgbmV3IEVDQmxvY2tzKDI0LCBuZXcgRUNCKDUsIDk4KSwgbmV3IEVDQigxLCA5OSkpLCBuZXcgRUNCbG9ja3MoMjgsIG5ldyBFQ0IoNywgNDUpLCBuZXcgRUNCKDMsIDQ2KSksIG5ldyBFQ0Jsb2NrcygyNCwgbmV3IEVDQigxNSwgMTkpLCBuZXcgRUNCKDIsIDIwKSksIG5ldyBFQ0Jsb2NrcygzMCwgbmV3IEVDQigzLCAxNSksIG5ldyBFQ0IoMTMsIDE2KSkpLCANCgluZXcgVmVyc2lvbigxNywgbmV3IEFycmF5KDYsIDMwLCA1NCwgNzgpLCBuZXcgRUNCbG9ja3MoMjgsIG5ldyBFQ0IoMSwgMTA3KSwgbmV3IEVDQig1LCAxMDgpKSwgbmV3IEVDQmxvY2tzKDI4LCBuZXcgRUNCKDEwLCA0NiksIG5ldyBFQ0IoMSwgNDcpKSwgbmV3IEVDQmxvY2tzKDI4LCBuZXcgRUNCKDEsIDIyKSwgbmV3IEVDQigxNSwgMjMpKSwgbmV3IEVDQmxvY2tzKDI4LCBuZXcgRUNCKDIsIDE0KSwgbmV3IEVDQigxNywgMTUpKSksIA0KCW5ldyBWZXJzaW9uKDE4LCBuZXcgQXJyYXkoNiwgMzAsIDU2LCA4MiksIG5ldyBFQ0Jsb2NrcygzMCwgbmV3IEVDQig1LCAxMjApLCBuZXcgRUNCKDEsIDEyMSkpLCBuZXcgRUNCbG9ja3MoMjYsIG5ldyBFQ0IoOSwgNDMpLCBuZXcgRUNCKDQsIDQ0KSksIG5ldyBFQ0Jsb2NrcygyOCwgbmV3IEVDQigxNywgMjIpLCBuZXcgRUNCKDEsIDIzKSksIG5ldyBFQ0Jsb2NrcygyOCwgbmV3IEVDQigyLCAxNCksIG5ldyBFQ0IoMTksIDE1KSkpLCANCgluZXcgVmVyc2lvbigxOSwgbmV3IEFycmF5KDYsIDMwLCA1OCwgODYpLCBuZXcgRUNCbG9ja3MoMjgsIG5ldyBFQ0IoMywgMTEzKSwgbmV3IEVDQig0LCAxMTQpKSwgbmV3IEVDQmxvY2tzKDI2LCBuZXcgRUNCKDMsIDQ0KSwgbmV3IEVDQigxMSwgNDUpKSwgbmV3IEVDQmxvY2tzKDI2LCBuZXcgRUNCKDE3LCAyMSksIG5ldyBFQ0IoNCwgMjIpKSwgbmV3IEVDQmxvY2tzKDI2LCBuZXcgRUNCKDksIDEzKSwgbmV3IEVDQigxNiwgMTQpKSksIA0KCW5ldyBWZXJzaW9uKDIwLCBuZXcgQXJyYXkoNiwgMzQsIDYyLCA5MCksIG5ldyBFQ0Jsb2NrcygyOCwgbmV3IEVDQigzLCAxMDcpLCBuZXcgRUNCKDUsIDEwOCkpLCBuZXcgRUNCbG9ja3MoMjYsIG5ldyBFQ0IoMywgNDEpLCBuZXcgRUNCKDEzLCA0MikpLCBuZXcgRUNCbG9ja3MoMzAsIG5ldyBFQ0IoMTUsIDI0KSwgbmV3IEVDQig1LCAyNSkpLCBuZXcgRUNCbG9ja3MoMjgsIG5ldyBFQ0IoMTUsIDE1KSwgbmV3IEVDQigxMCwgMTYpKSksIA0KCW5ldyBWZXJzaW9uKDIxLCBuZXcgQXJyYXkoNiwgMjgsIDUwLCA3MiwgOTQpLCBuZXcgRUNCbG9ja3MoMjgsIG5ldyBFQ0IoNCwgMTE2KSwgbmV3IEVDQig0LCAxMTcpKSwgbmV3IEVDQmxvY2tzKDI2LCBuZXcgRUNCKDE3LCA0MikpLCBuZXcgRUNCbG9ja3MoMjgsIG5ldyBFQ0IoMTcsIDIyKSwgbmV3IEVDQig2LCAyMykpLCBuZXcgRUNCbG9ja3MoMzAsIG5ldyBFQ0IoMTksIDE2KSwgbmV3IEVDQig2LCAxNykpKSwgDQoJbmV3IFZlcnNpb24oMjIsIG5ldyBBcnJheSg2LCAyNiwgNTAsIDc0LCA5OCksIG5ldyBFQ0Jsb2NrcygyOCwgbmV3IEVDQigyLCAxMTEpLCBuZXcgRUNCKDcsIDExMikpLCBuZXcgRUNCbG9ja3MoMjgsIG5ldyBFQ0IoMTcsIDQ2KSksIG5ldyBFQ0Jsb2NrcygzMCwgbmV3IEVDQig3LCAyNCksIG5ldyBFQ0IoMTYsIDI1KSksIG5ldyBFQ0Jsb2NrcygyNCwgbmV3IEVDQigzNCwgMTMpKSksIA0KCW5ldyBWZXJzaW9uKDIzLCBuZXcgQXJyYXkoNiwgMzAsIDU0LCA3NCwgMTAyKSwgbmV3IEVDQmxvY2tzKDMwLCBuZXcgRUNCKDQsIDEyMSksIG5ldyBFQ0IoNSwgMTIyKSksIG5ldyBFQ0Jsb2NrcygyOCwgbmV3IEVDQig0LCA0NyksIG5ldyBFQ0IoMTQsIDQ4KSksIG5ldyBFQ0Jsb2NrcygzMCwgbmV3IEVDQigxMSwgMjQpLCBuZXcgRUNCKDE0LCAyNSkpLCBuZXcgRUNCbG9ja3MoMzAsIG5ldyBFQ0IoMTYsIDE1KSwgbmV3IEVDQigxNCwgMTYpKSksIA0KCW5ldyBWZXJzaW9uKDI0LCBuZXcgQXJyYXkoNiwgMjgsIDU0LCA4MCwgMTA2KSwgbmV3IEVDQmxvY2tzKDMwLCBuZXcgRUNCKDYsIDExNyksIG5ldyBFQ0IoNCwgMTE4KSksIG5ldyBFQ0Jsb2NrcygyOCwgbmV3IEVDQig2LCA0NSksIG5ldyBFQ0IoMTQsIDQ2KSksIG5ldyBFQ0Jsb2NrcygzMCwgbmV3IEVDQigxMSwgMjQpLCBuZXcgRUNCKDE2LCAyNSkpLCBuZXcgRUNCbG9ja3MoMzAsIG5ldyBFQ0IoMzAsIDE2KSwgbmV3IEVDQigyLCAxNykpKSwgDQoJbmV3IFZlcnNpb24oMjUsIG5ldyBBcnJheSg2LCAzMiwgNTgsIDg0LCAxMTApLCBuZXcgRUNCbG9ja3MoMjYsIG5ldyBFQ0IoOCwgMTA2KSwgbmV3IEVDQig0LCAxMDcpKSwgbmV3IEVDQmxvY2tzKDI4LCBuZXcgRUNCKDgsIDQ3KSwgbmV3IEVDQigxMywgNDgpKSwgbmV3IEVDQmxvY2tzKDMwLCBuZXcgRUNCKDcsIDI0KSwgbmV3IEVDQigyMiwgMjUpKSwgbmV3IEVDQmxvY2tzKDMwLCBuZXcgRUNCKDIyLCAxNSksIG5ldyBFQ0IoMTMsIDE2KSkpLCANCgluZXcgVmVyc2lvbigyNiwgbmV3IEFycmF5KDYsIDMwLCA1OCwgODYsIDExNCksIG5ldyBFQ0Jsb2NrcygyOCwgbmV3IEVDQigxMCwgMTE0KSwgbmV3IEVDQigyLCAxMTUpKSwgbmV3IEVDQmxvY2tzKDI4LCBuZXcgRUNCKDE5LCA0NiksIG5ldyBFQ0IoNCwgNDcpKSwgbmV3IEVDQmxvY2tzKDI4LCBuZXcgRUNCKDI4LCAyMiksIG5ldyBFQ0IoNiwgMjMpKSwgbmV3IEVDQmxvY2tzKDMwLCBuZXcgRUNCKDMzLCAxNiksIG5ldyBFQ0IoNCwgMTcpKSksIA0KCW5ldyBWZXJzaW9uKDI3LCBuZXcgQXJyYXkoNiwgMzQsIDYyLCA5MCwgMTE4KSwgbmV3IEVDQmxvY2tzKDMwLCBuZXcgRUNCKDgsIDEyMiksIG5ldyBFQ0IoNCwgMTIzKSksIG5ldyBFQ0Jsb2NrcygyOCwgbmV3IEVDQigyMiwgNDUpLCBuZXcgRUNCKDMsIDQ2KSksIG5ldyBFQ0Jsb2NrcygzMCwgbmV3IEVDQig4LCAyMyksIG5ldyBFQ0IoMjYsIDI0KSksIG5ldyBFQ0Jsb2NrcygzMCwgbmV3IEVDQigxMiwgMTUpLCAJCW5ldyBFQ0IoMjgsIDE2KSkpLA0KCW5ldyBWZXJzaW9uKDI4LCBuZXcgQXJyYXkoNiwgMjYsIDUwLCA3NCwgOTgsIDEyMiksIG5ldyBFQ0Jsb2NrcygzMCwgbmV3IEVDQigzLCAxMTcpLCBuZXcgRUNCKDEwLCAxMTgpKSwgbmV3IEVDQmxvY2tzKDI4LCBuZXcgRUNCKDMsIDQ1KSwgbmV3IEVDQigyMywgNDYpKSwgbmV3IEVDQmxvY2tzKDMwLCBuZXcgRUNCKDQsIDI0KSwgbmV3IEVDQigzMSwgMjUpKSwgbmV3IEVDQmxvY2tzKDMwLCBuZXcgRUNCKDExLCAxNSksIG5ldyBFQ0IoMzEsIDE2KSkpLCANCgluZXcgVmVyc2lvbigyOSwgbmV3IEFycmF5KDYsIDMwLCA1NCwgNzgsIDEwMiwgMTI2KSwgbmV3IEVDQmxvY2tzKDMwLCBuZXcgRUNCKDcsIDExNiksIG5ldyBFQ0IoNywgMTE3KSksIG5ldyBFQ0Jsb2NrcygyOCwgbmV3IEVDQigyMSwgNDUpLCBuZXcgRUNCKDcsIDQ2KSksIG5ldyBFQ0Jsb2NrcygzMCwgbmV3IEVDQigxLCAyMyksIG5ldyBFQ0IoMzcsIDI0KSksIG5ldyBFQ0Jsb2NrcygzMCwgbmV3IEVDQigxOSwgMTUpLCBuZXcgRUNCKDI2LCAxNikpKSwgDQoJbmV3IFZlcnNpb24oMzAsIG5ldyBBcnJheSg2LCAyNiwgNTIsIDc4LCAxMDQsIDEzMCksIG5ldyBFQ0Jsb2NrcygzMCwgbmV3IEVDQig1LCAxMTUpLCBuZXcgRUNCKDEwLCAxMTYpKSwgbmV3IEVDQmxvY2tzKDI4LCBuZXcgRUNCKDE5LCA0NyksIG5ldyBFQ0IoMTAsIDQ4KSksIG5ldyBFQ0Jsb2NrcygzMCwgbmV3IEVDQigxNSwgMjQpLCBuZXcgRUNCKDI1LCAyNSkpLCBuZXcgRUNCbG9ja3MoMzAsIG5ldyBFQ0IoMjMsIDE1KSwgbmV3IEVDQigyNSwgMTYpKSksIA0KCW5ldyBWZXJzaW9uKDMxLCBuZXcgQXJyYXkoNiwgMzAsIDU2LCA4MiwgMTA4LCAxMzQpLCBuZXcgRUNCbG9ja3MoMzAsIG5ldyBFQ0IoMTMsIDExNSksIG5ldyBFQ0IoMywgMTE2KSksIG5ldyBFQ0Jsb2NrcygyOCwgbmV3IEVDQigyLCA0NiksIG5ldyBFQ0IoMjksIDQ3KSksIG5ldyBFQ0Jsb2NrcygzMCwgbmV3IEVDQig0MiwgMjQpLCBuZXcgRUNCKDEsIDI1KSksIG5ldyBFQ0Jsb2NrcygzMCwgbmV3IEVDQigyMywgMTUpLCBuZXcgRUNCKDI4LCAxNikpKSwgDQoJbmV3IFZlcnNpb24oMzIsIG5ldyBBcnJheSg2LCAzNCwgNjAsIDg2LCAxMTIsIDEzOCksIG5ldyBFQ0Jsb2NrcygzMCwgbmV3IEVDQigxNywgMTE1KSksIG5ldyBFQ0Jsb2NrcygyOCwgbmV3IEVDQigxMCwgNDYpLCBuZXcgRUNCKDIzLCA0NykpLCBuZXcgRUNCbG9ja3MoMzAsIG5ldyBFQ0IoMTAsIDI0KSwgbmV3IEVDQigzNSwgMjUpKSwgbmV3IEVDQmxvY2tzKDMwLCBuZXcgRUNCKDE5LCAxNSksIG5ldyBFQ0IoMzUsIDE2KSkpLCANCgluZXcgVmVyc2lvbigzMywgbmV3IEFycmF5KDYsIDMwLCA1OCwgODYsIDExNCwgMTQyKSwgbmV3IEVDQmxvY2tzKDMwLCBuZXcgRUNCKDE3LCAxMTUpLCBuZXcgRUNCKDEsIDExNikpLCBuZXcgRUNCbG9ja3MoMjgsIG5ldyBFQ0IoMTQsIDQ2KSwgbmV3IEVDQigyMSwgNDcpKSwgbmV3IEVDQmxvY2tzKDMwLCBuZXcgRUNCKDI5LCAyNCksIG5ldyBFQ0IoMTksIDI1KSksIG5ldyBFQ0Jsb2NrcygzMCwgbmV3IEVDQigxMSwgMTUpLCBuZXcgRUNCKDQ2LCAxNikpKSwgDQoJbmV3IFZlcnNpb24oMzQsIG5ldyBBcnJheSg2LCAzNCwgNjIsIDkwLCAxMTgsIDE0NiksIG5ldyBFQ0Jsb2NrcygzMCwgbmV3IEVDQigxMywgMTE1KSwgbmV3IEVDQig2LCAxMTYpKSwgbmV3IEVDQmxvY2tzKDI4LCBuZXcgRUNCKDE0LCA0NiksIG5ldyBFQ0IoMjMsIDQ3KSksIG5ldyBFQ0Jsb2NrcygzMCwgbmV3IEVDQig0NCwgMjQpLCBuZXcgRUNCKDcsIDI1KSksIG5ldyBFQ0Jsb2NrcygzMCwgbmV3IEVDQig1OSwgMTYpLCBuZXcgRUNCKDEsIDE3KSkpLCANCgluZXcgVmVyc2lvbigzNSwgbmV3IEFycmF5KDYsIDMwLCA1NCwgNzgsIDEwMiwgMTI2LCAxNTApLCBuZXcgRUNCbG9ja3MoMzAsIG5ldyBFQ0IoMTIsIDEyMSksIG5ldyBFQ0IoNywgMTIyKSksIG5ldyBFQ0Jsb2NrcygyOCwgbmV3IEVDQigxMiwgNDcpLCBuZXcgRUNCKDI2LCA0OCkpLCBuZXcgRUNCbG9ja3MoMzAsIG5ldyBFQ0IoMzksIDI0KSwgbmV3IEVDQigxNCwgMjUpKSxuZXcgRUNCbG9ja3MoMzAsIG5ldyBFQ0IoMjIsIDE1KSwgbmV3IEVDQig0MSwgMTYpKSksIA0KCW5ldyBWZXJzaW9uKDM2LCBuZXcgQXJyYXkoNiwgMjQsIDUwLCA3NiwgMTAyLCAxMjgsIDE1NCksIG5ldyBFQ0Jsb2NrcygzMCwgbmV3IEVDQig2LCAxMjEpLCBuZXcgRUNCKDE0LCAxMjIpKSwgbmV3IEVDQmxvY2tzKDI4LCBuZXcgRUNCKDYsIDQ3KSwgbmV3IEVDQigzNCwgNDgpKSwgbmV3IEVDQmxvY2tzKDMwLCBuZXcgRUNCKDQ2LCAyNCksIG5ldyBFQ0IoMTAsIDI1KSksIG5ldyBFQ0Jsb2NrcygzMCwgbmV3IEVDQigyLCAxNSksIG5ldyBFQ0IoNjQsIDE2KSkpLCANCgluZXcgVmVyc2lvbigzNywgbmV3IEFycmF5KDYsIDI4LCA1NCwgODAsIDEwNiwgMTMyLCAxNTgpLCBuZXcgRUNCbG9ja3MoMzAsIG5ldyBFQ0IoMTcsIDEyMiksIG5ldyBFQ0IoNCwgMTIzKSksIG5ldyBFQ0Jsb2NrcygyOCwgbmV3IEVDQigyOSwgNDYpLCBuZXcgRUNCKDE0LCA0NykpLCBuZXcgRUNCbG9ja3MoMzAsIG5ldyBFQ0IoNDksIDI0KSwgbmV3IEVDQigxMCwgMjUpKSwgbmV3IEVDQmxvY2tzKDMwLCBuZXcgRUNCKDI0LCAxNSksIG5ldyBFQ0IoNDYsIDE2KSkpLCANCgluZXcgVmVyc2lvbigzOCwgbmV3IEFycmF5KDYsIDMyLCA1OCwgODQsIDExMCwgMTM2LCAxNjIpLCBuZXcgRUNCbG9ja3MoMzAsIG5ldyBFQ0IoNCwgMTIyKSwgbmV3IEVDQigxOCwgMTIzKSksIG5ldyBFQ0Jsb2NrcygyOCwgbmV3IEVDQigxMywgNDYpLCBuZXcgRUNCKDMyLCA0NykpLCBuZXcgRUNCbG9ja3MoMzAsIG5ldyBFQ0IoNDgsIDI0KSwgbmV3IEVDQigxNCwgMjUpKSwgbmV3IEVDQmxvY2tzKDMwLCBuZXcgRUNCKDQyLCAxNSksIG5ldyBFQ0IoMzIsIDE2KSkpLCANCgluZXcgVmVyc2lvbigzOSwgbmV3IEFycmF5KDYsIDI2LCA1NCwgODIsIDExMCwgMTM4LCAxNjYpLCBuZXcgRUNCbG9ja3MoMzAsIG5ldyBFQ0IoMjAsIDExNyksIG5ldyBFQ0IoNCwgMTE4KSksIG5ldyBFQ0Jsb2NrcygyOCwgbmV3IEVDQig0MCwgNDcpLCBuZXcgRUNCKDcsIDQ4KSksIG5ldyBFQ0Jsb2NrcygzMCwgbmV3IEVDQig0MywgMjQpLCBuZXcgRUNCKDIyLCAyNSkpLCBuZXcgRUNCbG9ja3MoMzAsIG5ldyBFQ0IoMTAsIDE1KSwgbmV3IEVDQig2NywgMTYpKSksIA0KCW5ldyBWZXJzaW9uKDQwLCBuZXcgQXJyYXkoNiwgMzAsIDU4LCA4NiwgMTE0LCAxNDIsIDE3MCksIG5ldyBFQ0Jsb2NrcygzMCwgbmV3IEVDQigxOSwgMTE4KSwgbmV3IEVDQig2LCAxMTkpKSwgbmV3IEVDQmxvY2tzKDI4LCBuZXcgRUNCKDE4LCA0NyksIG5ldyBFQ0IoMzEsIDQ4KSksIG5ldyBFQ0Jsb2NrcygzMCwgbmV3IEVDQigzNCwgMjQpLCBuZXcgRUNCKDM0LCAyNSkpLCBuZXcgRUNCbG9ja3MoMzAsIG5ldyBFQ0IoMjAsIDE1KSwgbmV3IEVDQig2MSwgMTYpKSkpOw0KfQ==</uax:ByteString>
		</Value>
	</UAVariable>
	<UAObject NodeId="ns=1;s=AGENT" BrowseName="1:AGENT">
		<DisplayName Locale="en">AGENT</DisplayName>
		<Description Locale="en">AGENT</Description>
		<References>
			<Reference ReferenceType="HasComponent" IsForward="false">Objects</Reference>
			<Reference ReferenceType="HasTypeDefinition">ns=1;s=ObjectTypes.ATVISE.Server.Local</Reference>
		</References>
		<Extensions>
			<atvise ExportedNodeId="ns=1;s=AGENT.DISPLAYS.MAIN.QR_Code_Scan" ExportedBrowseName="1:QR_Code_Scan" Upstream="true"/>
		</Extensions>
	</UAObject>
	<UAObject NodeId="ns=1;s=AGENT.DISPLAYS" BrowseName="1:DISPLAYS">
		<DisplayName Locale="en">DISPLAYS</DisplayName>
		<Description Locale="en">DISPLAYS</Description>
		<References>
			<Reference ReferenceType="HasComponent" IsForward="false">ns=1;s=AGENT</Reference>
			<Reference ReferenceType="HasTypeDefinition">FolderType</Reference>
		</References>
		<Extensions>
			<atvise Upstream="true"/>
		</Extensions>
	</UAObject>
	<UAObject NodeId="ns=1;s=AGENT.DISPLAYS.MAIN" BrowseName="1:MAIN">
		<DisplayName Locale="en">MAIN</DisplayName>
		<Description Locale="en">MAIN</Description>
		<References>
			<Reference ReferenceType="HasComponent" IsForward="false">ns=1;s=AGENT.DISPLAYS</Reference>
			<Reference ReferenceType="HasTypeDefinition">FolderType</Reference>
		</References>
		<Extensions>
			<atvise Upstream="true"/>
		</Extensions>
	</UAObject>
	<UAVariable NodeId="ns=1;s=AGENT.DISPLAYS.MAIN.QR_Code_Scan" BrowseName="1:QR_Code_Scan" DataType="XmlElement" AccessLevel="103" UserAccessLevel="103" Historizing="true">
		<DisplayName Locale="en">QR_Code_Scan</DisplayName>
		<Description Locale="en">QR_Code_Scan</Description>
		<References>
			<Reference ReferenceType="HasComponent" IsForward="false">ns=1;s=AGENT.DISPLAYS.MAIN</Reference>
			<Reference ReferenceType="HasTypeDefinition">ns=1;s=VariableTypes.ATVISE.Display</Reference>
		</References>
		<Value>
			<uax:XmlElement><![CDATA[<?xml version='1.0' encoding='UTF-8' standalone='no'?>
<svg version="1.2" xmlns:atv="http://webmi.atvise.com/2007/svgext" width="1280" height="680" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
 <defs/>
 <metadata>
  <atv:gridconfig width="20" enabled="false" height="20" gridstyle="lines"/>
  <atv:snapconfig width="10" enabled="false" height="10"/>
 </metadata>
 <svg id="id_0" width="400" transform="matrix(1.5114,0,0,1.5114,0,0)" atv:refpy="340" atv:refpx="640" height="430" x="223.456" y="9.961" xlink:href="SYSTEM.LIBRARY.PROJECT.OBJECTDISPLAYS.qr_code_scan"/>
</svg>
]]></uax:XmlElement>
		</Value>
	</UAVariable>
	<UAObject NodeId="ns=1;s=SYSTEM" BrowseName="1:SYSTEM">
		<DisplayName Locale="en">SYSTEM</DisplayName>
		<Description Locale="en">SYSTEM</Description>
		<References>
			<Reference ReferenceType="HasComponent" IsForward="false">Objects</Reference>
			<Reference ReferenceType="HasTypeDefinition">FolderType</Reference>
		</References>
		<Extensions>
			<atvise ExportedNodeId="ns=1;s=SYSTEM.LIBRARY.PROJECT.OBJECTDISPLAYS.qr_code_scan" ExportedBrowseName="1:qr_code_scan" Upstream="true"/>
		</Extensions>
	</UAObject>
	<UAObject NodeId="ns=1;s=SYSTEM.LIBRARY" BrowseName="1:LIBRARY">
		<DisplayName Locale="en">LIBRARY</DisplayName>
		<Description Locale="en">LIBRARY</Description>
		<References>
			<Reference ReferenceType="HasComponent" IsForward="false">ns=1;s=SYSTEM</Reference>
			<Reference ReferenceType="HasTypeDefinition">FolderType</Reference>
		</References>
		<Extensions>
			<atvise Upstream="true"/>
		</Extensions>
	</UAObject>
	<UAObject NodeId="ns=1;s=SYSTEM.LIBRARY.PROJECT" BrowseName="1:PROJECT">
		<DisplayName Locale="en">PROJECT</DisplayName>
		<Description Locale="en">PROJECT</Description>
		<References>
			<Reference ReferenceType="HasComponent" IsForward="false">ns=1;s=SYSTEM.LIBRARY</Reference>
			<Reference ReferenceType="HasTypeDefinition">FolderType</Reference>
		</References>
		<Extensions>
			<atvise Upstream="true"/>
		</Extensions>
	</UAObject>
	<UAObject NodeId="ns=1;s=SYSTEM.LIBRARY.PROJECT.OBJECTDISPLAYS" BrowseName="1:OBJECTDISPLAYS">
		<DisplayName Locale="en">OBJECTDISPLAYS</DisplayName>
		<Description Locale="en">OBJECTDISPLAYS</Description>
		<References>
			<Reference ReferenceType="HasComponent" IsForward="false">ns=1;s=SYSTEM.LIBRARY.PROJECT</Reference>
			<Reference ReferenceType="HasTypeDefinition">FolderType</Reference>
		</References>
		<Extensions>
			<atvise Upstream="true"/>
		</Extensions>
	</UAObject>
	<UAVariable NodeId="ns=1;s=SYSTEM.LIBRARY.PROJECT.OBJECTDISPLAYS.qr_code_scan" BrowseName="1:qr_code_scan" DataType="XmlElement" AccessLevel="103" UserAccessLevel="103" Historizing="true">
		<DisplayName Locale="en">qr_code_scan</DisplayName>
		<Description Locale="en">qr_code_scan</Description>
		<References>
			<Reference ReferenceType="HasComponent" IsForward="false">ns=1;s=SYSTEM.LIBRARY.PROJECT.OBJECTDISPLAYS</Reference>
			<Reference ReferenceType="HasTypeDefinition">ns=1;s=VariableTypes.ATVISE.Display</Reference>
		</References>
		<Value>
			<uax:XmlElement><![CDATA[<?xml version='1.0' encoding='UTF-8' standalone='no'?>
<svg height="430" version="1.2" width="400" xmlns="http://www.w3.org/2000/svg" xmlns:atv="http://webmi.atvise.com/2007/svgext" xmlns:xlink="http://www.w3.org/1999/xlink">
 <defs/>
 <metadata>
  <atv:gridconfig enabled="false" gridstyle="lines" height="20" width="20"/>
  <atv:snapconfig enabled="false" height="10" width="10"/>
 </metadata>
 <foreignObject height="299.543" id="id_0" width="400" x="0" y="0">
  <div style="width:100%;height:100%" xmlns="http://www.w3.org/1999/xhtml">
   <video autoplay="true" id="video" style="width:100%;height:100%"/>
   <img alt="No QR code loaded" id="image" src="" style="font-family: Arial; width:100%;height:90%; display:none"/>
   <input accept="image/*" id="upload_btn" style="display: none" type="file"/>
   <canvas id="qr-canvas" style="display: none;"/>
  </div>
 </foreignObject>
 <script type="text/javascript" xlink:href="../../QRCodeScanner/grid.js"/>
 <script type="text/javascript" xlink:href="../../QRCodeScanner/version.js"/>
 <script type="text/javascript" xlink:href="../../QRCodeScanner/detector.js"/>
 <script type="text/javascript" xlink:href="../../QRCodeScanner/formatinf.js"/>
 <script type="text/javascript" xlink:href="../../QRCodeScanner/errorlevel.js"/>
 <script type="text/javascript" xlink:href="../../QRCodeScanner/bitmat.js"/>
 <script type="text/javascript" xlink:href="../../QRCodeScanner/datablock.js"/>
 <script type="text/javascript" xlink:href="../../QRCodeScanner/bmparser.js"/>
 <script type="text/javascript" xlink:href="../../QRCodeScanner/datamask.js"/>
 <script type="text/javascript" xlink:href="../../QRCodeScanner/rsdecoder.js"/>
 <script type="text/javascript" xlink:href="../../QRCodeScanner/gf256poly.js"/>
 <script type="text/javascript" xlink:href="../../QRCodeScanner/gf256.js"/>
 <script type="text/javascript" xlink:href="../../QRCodeScanner/decoder.js"/>
 <script type="text/javascript" xlink:href="../../QRCodeScanner/qrcode.js"/>
 <script type="text/javascript" xlink:href="../../QRCodeScanner/findpat.js"/>
 <script type="text/javascript" xlink:href="../../QRCodeScanner/alignpat.js"/>
 <script type="text/javascript" xlink:href="../../QRCodeScanner/databr.js"/>
 <svg atv:refpx="55.673" atv:refpy="361.34" height="30" id="reset_scan" transform="matrix(1.25,0,0,1,0,0)" width="80" x="8" xlink:href="SYSTEM.LIBRARY.ATVISE.OBJECTDISPLAYS.Advanced.button" y="387.174">
  <atv:argument name="label" value="T{Reset Scan}"/>
  <atv:overwrite id="id_6" transform="matrix(0.8,0,0,1,0,0)" width="98"/>
  <atv:overwrite id="button_label_2" transform="matrix(0.8,0,0,1,0,0)" x="50"/>
  <atv:overwrite id="button_label_1" transform="matrix(0.8,0,0,1,0,0)" x="50"/>
  <atv:overwrite id="button_label" transform="matrix(0.8,0,0,1,0,0)" x="50"/>
  <atv:overwrite id="button_symbol_bottom" transform="matrix(0.48,0,0,0.6,0,0)" x="73.167"/>
  <atv:overwrite id="button_symbol_top" transform="matrix(0.48,0,0,0.6,0,0)" x="73.167"/>
  <atv:overwrite id="button_symbol" transform="matrix(0.8,0,0,1,0,0)" x="40"/>
  <atv:overwrite id="button_stroke" transform="matrix(0.8,0,0,1,0,0)" width="96"/>
  <atv:overwrite id="button_bg" transform="matrix(0.8,0,0,1,0,0)" width="98"/>
  <atv:overwrite id="outer_frame" transform="matrix(0.8,0,0,1,0,0)" width="100"/>
 </svg>
 <text atv:refpx="78.208" atv:refpy="318.344" fill="#000000" font-family="Arial" font-size="10" font-weight="bold" id="id_3" x="15" y="323.844">QR Code Content</text>
 <svg atv:refpx="199.25" atv:refpy="316.888" height="30" id="qr_code_content" transform="matrix(2.3656,0,0,1,0,0)" width="160" x="4.227" xlink:href="SYSTEM.LIBRARY.ATVISE.OBJECTDISPLAYS.Advanced.in_out_value" y="335.888">
  <atv:argument name="validation" value="String"/>
  <atv:argument name="allowDirectInput" value="No"/>
  <atv:argument name="statusEnabled" value="No"/>
  <atv:overwrite id="input_label" transform="matrix(0.4227,0,0,1,0,0)" x="370.551"/>
  <atv:overwrite id="blinking_frame" transform="matrix(0.4227,0,0,1,0,0)" width="370.496"/>
  <atv:overwrite id="focus_frame" transform="matrix(0.4227,0,0,1,0,0)" width="374.496"/>
  <atv:overwrite id="input_bg" transform="matrix(0.4227,0,0,1,0,0)" width="370.496"/>
 </svg>
 <svg atv:refpx="183.46" atv:refpy="361.34" height="30" id="check_qr_code" transform="matrix(1.25,0,0,1,0,0)" width="80" x="230.23" xlink:href="SYSTEM.LIBRARY.ATVISE.OBJECTDISPLAYS.Advanced.button" y="387.174">
  <atv:argument name="label" value="T{Check QR Code}"/>
  <atv:overwrite id="id_6" transform="matrix(0.8,0,0,1,0,0)" width="98"/>
  <atv:overwrite id="button_label" transform="matrix(0.8,0,0,1,0,0)" x="50"/>
  <atv:overwrite id="button_symbol" transform="matrix(0.8,0,0,1,0,0)" x="40"/>
  <atv:overwrite id="button_stroke" transform="matrix(0.8,0,0,1,0,0)" width="96"/>
  <atv:overwrite id="button_bg" transform="matrix(0.8,0,0,1,0,0)" width="98"/>
  <atv:overwrite id="outer_frame" transform="matrix(0.8,0,0,1,0,0)" width="100"/>
 </svg>
 <script atv:desc="" atv:name="" type="text/ecmascript"><![CDATA[
webMI.addOnload(function () {
  var video = document.getElementById('video');
  var canvas = document.getElementById('qr-canvas');
  var image = document.getElementById('image');
  var uploadImgBtn = document.getElementById('upload_btn');
  var maxImgWidth = 800;
  var maxImgHeight = 800;

  // checks current video frame/ image for a valid qr code
  function captureFrame(messageOnFail) {
    var result;

    try {
      result = qrcode.decode();
      webMI.trigger.fire("setValue", result, "qr_code_content");
    }
    catch (e) {
        if (messageOnFail) {
            alert(messageOnFail);
        }
    }
  }
  
  // setup when webcam is available
  function initVideoStream(localMediaStream) {
	try {
	  video.srcObject = localMediaStream;
	} catch (error) {
	  video.src = window.URL.createObjectURL(localMediaStream);
	}	 
    video.addEventListener('timeupdate', function () {
      canvas.width = video.videoWidth;
      canvas.height = video.videoHeight;

      canvasContext = canvas.getContext("2d");
      canvasContext.drawImage(video, 0, 0);
      
      captureFrame();
    });
  }

  // setup when webcam is not available
  function initImageUpload() {
    video.style.display = "none";
    image.style.display = "block";
    uploadImgBtn.style.display = "block";


    uploadImgBtn.addEventListener("change", function (e) {
      var file = e.target.files[0];

      if (file) {
        if (/^image\//i.test(file.type)) {
          readFile(file);
        } else {
          alert('Not a valid image!');
        }
      }
    });


    image.addEventListener("load", function () {
      var context;
      var width = image.width;
      var height = image.height;
      var shouldResize = (width > maxImgWidth) || (height > maxImgHeight);
      
      var newWidth = width;
      var newHeight = height;
      
      if (shouldResize) {

        if (width > height) {
          newHeight = height * (maxImgWidth / width);
          newWidth = maxImgWidth;
        } else {
          newWidth = width * (maxImgHeight / height);
          newHeight = maxImgHeight;
        }
      }

      canvas.width = newWidth;
      canvas.height = newHeight;

      context = canvas.getContext('2d');

      context.drawImage(this, 0, 0, newWidth, newHeight);
    });

    // check uploaded qr code manually
    webMI.addEvent("check_qr_code", ["click", "touchend"], function (e) {
      captureFrame("QR Code check failed!");
    });
  }

  function readFile(file) {
    var reader = new FileReader();

    reader.onloadend = function () {
      image.src = reader.result;
    }

    reader.onerror = function () {
      alert('There was an error reading the image!');
    }

    reader.readAsDataURL(file);
  }


  // set direct reference because element cant be retreived in libary
  qrcode.customCanvas = canvas;

  // use proper vendor prefix
  navigator.getMedia = (
    navigator.getUserMedia ||
    navigator.webkitGetUserMedia ||
    navigator.mozGetUserMedia ||
    navigator.msGetUserMedia
  );
	var kam = "environment";
  // request media device from client
  navigator.getMedia(
    {video: { facingMode: kam } },
    initVideoStream,
    initImageUpload
  );

  // reset value of read result label
  webMI.addEvent("reset_scan", ["click", "touchend"], function (e) {
    webMI.trigger.fire("setValue", "", "qr_code_content");
  });
 
  
});



]]]]><![CDATA[></script>
</svg>
]]></uax:XmlElement>
		</Value>
	</UAVariable>
</UANodeSet>
