diff --git a/README.md b/README.md index 5d8d5bbc..6ea50530 100644 --- a/README.md +++ b/README.md @@ -8,6 +8,7 @@ * **[Face Recognition](#about-face-recognition)** * **[Face Landmark Detection](#about-face-landmark-detection)** * **[Usage](#usage)** + * **[Loading the Models](#usage-load-models)** * **[Face Detection](#usage-face-detection)** * **[Face Recognition](#usage-face-recognition)** * **[Face Landmark Detection](#usage-face-landmark-detection)** @@ -95,19 +96,46 @@ Or install the package: npm i face-api.js ``` - + -### Face Detection +### Loading the Models + +To load a model, you have provide the corresponding manifest.json file as well as the model weight files (shards) as assets. Simply copy them to your public or assets folder. The manifest.json and shard files of a model have to be located in the same directory / accessible under the same route. + +Assuming the models reside in **public/model**: + +``` javascript +const net = new faceapi.FaceDetectionNet() +// accordingly for the other models: +// const net = new faceapi.FaceLandmarkNet() +// const net = new faceapi.FaceRecognitionNet() -Download the weights file from your server and initialize the net (note, that your server has to host the *face_detection_model.weights* file). +await net.load('/models/face_detection_model-weights_manifest.json') +// await net.load('/models/face_landmark_68_model-weights_manifest.json') +// await net.load('/models/face_recognition_model-weights_manifest.json') + +// or simply +await net.load('/models') +``` + +Alternatively you can load the weights as a Float32Array (in case you want to use the uncompressed models): ``` javascript -// initialize the face detector -const res = await axios.get('face_detection_model.weights', { responseType: 'arraybuffer' }) +// using fetch +const res = await fetch('/models/face_detection_model.weights') +const weights = new Float32Array(await res.arrayBuffer()) +net.load(weights) + +// using axios +const res = await axios.get('/models/face_detection_model.weights', { responseType: 'arraybuffer' }) const weights = new Float32Array(res.data) -const detectionNet = faceapi.faceDetectionNet(weights) +net.load(weights) ``` + + +### Face Detection + Detect faces and get the bounding boxes and scores: ``` javascript @@ -141,15 +169,6 @@ const { boxes, scores } = detectionNet.forward('myImg') ### Face Recognition -Download the weights file from your server and initialize the net (note, that your server has to host the *face_recognition_model.weights* file). - -``` javascript -// initialize the face recognizer -const res = await axios.get('face_recognition_model.weights', { responseType: 'arraybuffer' }) -const weights = new Float32Array(res.data) -const recognitionNet = faceapi.faceRecognitionNet(weights) -``` - Compute and compare the descriptors of two face images: ``` javascript @@ -180,15 +199,6 @@ const t = recognitionNet.forward('myImg') ### Face Landmark Detection -Download the weights file from your server and initialize the net (note, that your server has to host the *face_landmark_68_model.weights* file). - -``` javascript -// initialize the face recognizer -const res = await axios.get('face_landmark_68_model.weights', { responseType: 'arraybuffer' }) -const weights = new Float32Array(res.data) -const faceLandmarkNet = faceapi.faceLandmarkNet(weights) -``` - Detect face landmarks: ``` javascript diff --git a/dist/commons/isTensor.d.ts b/dist/commons/isTensor.d.ts new file mode 100644 index 00000000..ab251612 --- /dev/null +++ b/dist/commons/isTensor.d.ts @@ -0,0 +1,6 @@ +import * as tf from '@tensorflow/tfjs-core'; +export declare function isTensor(tensor: tf.Tensor, dim: number): boolean; +export declare function isTensor1D(tensor: tf.Tensor): boolean; +export declare function isTensor2D(tensor: tf.Tensor): boolean; +export declare function isTensor3D(tensor: tf.Tensor): boolean; +export declare function isTensor4D(tensor: tf.Tensor): boolean; diff --git a/dist/commons/isTensor.js b/dist/commons/isTensor.js new file mode 100644 index 00000000..d5b70658 --- /dev/null +++ b/dist/commons/isTensor.js @@ -0,0 +1,17 @@ +import * as tf from '@tensorflow/tfjs-core'; +export function isTensor(tensor, dim) { + return tensor instanceof tf.Tensor && tensor.shape.length === dim; +} +export function isTensor1D(tensor) { + return isTensor(tensor, 1); +} +export function isTensor2D(tensor) { + return isTensor(tensor, 2); +} +export function isTensor3D(tensor) { + return isTensor(tensor, 3); +} +export function isTensor4D(tensor) { + return isTensor(tensor, 4); +} +//# sourceMappingURL=isTensor.js.map \ No newline at end of file diff --git a/dist/commons/isTensor.js.map b/dist/commons/isTensor.js.map new file mode 100644 index 00000000..3d356cb2 --- /dev/null +++ b/dist/commons/isTensor.js.map @@ -0,0 +1 @@ +{"version":3,"file":"isTensor.js","sourceRoot":"","sources":["../../src/commons/isTensor.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,uBAAuB,CAAC;AAE5C,MAAM,mBAAmB,MAAiB,EAAE,GAAW;IACrD,OAAO,MAAM,YAAY,EAAE,CAAC,MAAM,IAAI,MAAM,CAAC,KAAK,CAAC,MAAM,KAAK,GAAG,CAAA;AACnE,CAAC;AAED,MAAM,qBAAqB,MAAiB;IAC1C,OAAO,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC,CAAA;AAC5B,CAAC;AAED,MAAM,qBAAqB,MAAiB;IAC1C,OAAO,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC,CAAA;AAC5B,CAAC;AAED,MAAM,qBAAqB,MAAiB;IAC1C,OAAO,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC,CAAA;AAC5B,CAAC;AAED,MAAM,qBAAqB,MAAiB;IAC1C,OAAO,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC,CAAA;AAC5B,CAAC"} \ No newline at end of file diff --git a/dist/commons/loadWeightMap.d.ts b/dist/commons/loadWeightMap.d.ts new file mode 100644 index 00000000..7bd9921f --- /dev/null +++ b/dist/commons/loadWeightMap.d.ts @@ -0,0 +1,5 @@ +export declare function getModelUris(uri: string | undefined, defaultModelName: string): { + manifestUri: string; + modelBaseUri: string; +}; +export declare function loadWeightMap(uri: string | undefined, defaultModelName: string): Promise; diff --git a/dist/commons/loadWeightMap.js b/dist/commons/loadWeightMap.js new file mode 100644 index 00000000..69a71dd3 --- /dev/null +++ b/dist/commons/loadWeightMap.js @@ -0,0 +1,32 @@ +import * as tslib_1 from "tslib"; +import * as tf from '@tensorflow/tfjs-core'; +export function getModelUris(uri, defaultModelName) { + var parts = (uri || '').split('/'); + var modelBaseUri = ((uri || '').endsWith('.json') + ? parts.slice(0, parts.length - 1) + : parts).filter(function (s) { return s; }).join('/'); + var defaultManifestFilename = defaultModelName + "-weights_manifest.json"; + var manifestUri = !uri || !modelBaseUri + ? defaultManifestFilename + : (uri.endsWith('.json') + ? uri + : modelBaseUri + "/" + defaultManifestFilename); + return { manifestUri: manifestUri, modelBaseUri: modelBaseUri }; +} +export function loadWeightMap(uri, defaultModelName) { + return tslib_1.__awaiter(this, void 0, void 0, function () { + var _a, manifestUri, modelBaseUri, manifest; + return tslib_1.__generator(this, function (_b) { + switch (_b.label) { + case 0: + _a = getModelUris(uri, defaultModelName), manifestUri = _a.manifestUri, modelBaseUri = _a.modelBaseUri; + return [4 /*yield*/, fetch(manifestUri)]; + case 1: return [4 /*yield*/, (_b.sent()).json()]; + case 2: + manifest = _b.sent(); + return [2 /*return*/, tf.io.loadWeights(manifest, modelBaseUri)]; + } + }); + }); +} +//# sourceMappingURL=loadWeightMap.js.map \ No newline at end of file diff --git a/dist/commons/loadWeightMap.js.map b/dist/commons/loadWeightMap.js.map new file mode 100644 index 00000000..29de3a2a --- /dev/null +++ b/dist/commons/loadWeightMap.js.map @@ -0,0 +1 @@ +{"version":3,"file":"loadWeightMap.js","sourceRoot":"","sources":["../../src/commons/loadWeightMap.ts"],"names":[],"mappings":";AAAA,OAAO,KAAK,EAAE,MAAM,uBAAuB,CAAC;AAE5C,MAAM,uBAAuB,GAAuB,EAAE,gBAAwB;IAC5E,IAAM,KAAK,GAAG,CAAC,GAAG,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;IAEpC,IAAM,YAAY,GAAG,CACnB,CAAC,GAAG,IAAI,EAAE,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC;QAC3B,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC;QAClC,CAAC,CAAC,KAAK,CACV,CAAC,MAAM,CAAC,UAAA,CAAC,IAAI,OAAA,CAAC,EAAD,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;IAE1B,IAAM,uBAAuB,GAAM,gBAAgB,2BAAwB,CAAA;IAC3E,IAAM,WAAW,GAAG,CAAC,GAAG,IAAI,CAAC,YAAY;QACvC,CAAC,CAAC,uBAAuB;QACzB,CAAC,CAAC,CACA,GAAG,CAAC,QAAQ,CAAC,OAAO,CAAC;YACnB,CAAC,CAAC,GAAG;YACL,CAAC,CAAI,YAAY,SAAI,uBAAyB,CACjD,CAAA;IAEH,OAAO,EAAE,WAAW,aAAA,EAAE,YAAY,cAAA,EAAE,CAAA;AACtC,CAAC;AAED,MAAM,wBACJ,GAAuB,EACvB,gBAAwB;;;;;;oBAGlB,KAAgC,YAAY,CAAC,GAAG,EAAE,gBAAgB,CAAC,EAAjE,WAAW,iBAAA,EAAE,YAAY,kBAAA,CAAwC;oBAEjD,qBAAM,KAAK,CAAC,WAAW,CAAC,EAAA;wBAA/B,qBAAM,CAAC,SAAwB,CAAC,CAAC,IAAI,EAAE,EAAA;;oBAAlD,QAAQ,GAAG,SAAuC;oBAExD,sBAAO,EAAE,CAAC,EAAE,CAAC,WAAW,CAAC,QAAQ,EAAE,YAAY,CAAC,EAAA;;;;CACjD"} \ No newline at end of file diff --git a/dist/face-api.js b/dist/face-api.js index d4ff1285..e40d9852 100644 --- a/dist/face-api.js +++ b/dist/face-api.js @@ -1,16208 +1,2006 @@ (function (global, factory) { - typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('crypto')) : - typeof define === 'function' && define.amd ? define(['exports', 'crypto'], factory) : - (factory((global.faceapi = global.faceapi || {}),global.crypto)); -}(this, (function (exports,crypto) { 'use strict'; - - crypto = crypto && crypto.hasOwnProperty('default') ? crypto['default'] : crypto; - - function isMobile() { - var a = navigator.userAgent || navigator.vendor || window.opera; - return /(android|bb\d+|meego).+mobile|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\.(browser|link)|vodafone|wap|windows ce|xda|xiino/i - .test(a) || - /1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\-(n|u)|c55\/|capi|ccwa|cdm\-|cell|chtm|cldc|cmd\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\-s|devi|dica|dmob|do(c|p)o|ds(12|\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\-|_)|g1 u|g560|gene|gf\-5|g\-mo|go(\.w|od)|gr(ad|un)|haie|hcit|hd\-(m|p|t)|hei\-|hi(pt|ta)|hp( i|ip)|hs\-c|ht(c(\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\-(20|go|ma)|i230|iac( |\-|\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\/)|klon|kpt |kwc\-|kyo(c|k)|le(no|xi)|lg( g|\/(k|l|u)|50|54|\-[a-w])|libw|lynx|m1\-w|m3ga|m50\/|ma(te|ui|xo)|mc(01|21|ca)|m\-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\-2|po(ck|rt|se)|prox|psio|pt\-g|qa\-a|qc(07|12|21|32|60|\-[2-7]|i\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\-|oo|p\-)|sdk\/|se(c(\-|0|1)|47|mc|nd|ri)|sgh\-|shar|sie(\-|m)|sk\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\-|v\-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\-|tdg\-|tel(i|m)|tim\-|t\-mo|to(pl|sh)|ts(70|m\-|m3|m5)|tx\-9|up(\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas\-|your|zeto|zte\-/i - .test(a.substr(0, 4)); - } - - function doc(info) { - return function () { - var args = []; - for (var _i = 0; _i < arguments.length; _i++) { - args[_i] = arguments[_i]; - } - }; - } - - function assertArgumentIsTensor(x, argName, functionName) { - assert(x instanceof Tensor, "Argument '" + argName + "' passed to '" + functionName + "' must be a Tensor, " + - ("but got " + typeof x + ".")); - } - function assertArgumentsAreTensors(args, functionName) { - var _loop_1 = function (argName) { - var arg = args[argName]; - if (Array.isArray(arg)) { - arg.forEach(function (t, i) { - assertArgumentIsTensor(t, argName + "[" + i + "]", functionName); - }); - } - else { - assertArgumentIsTensor(arg, argName, functionName); - } - }; - for (var argName in args) { - _loop_1(argName); - } - } - function shuffle(array) { - var counter = array.length; - var temp = 0; - var index = 0; - while (counter > 0) { - index = (Math.random() * counter) | 0; - counter--; - temp = array[counter]; - array[counter] = array[index]; - array[index] = temp; - } - } - function clamp(min, x, max) { - return Math.max(min, Math.min(x, max)); - } - function randUniform(a, b) { - return Math.random() * (b - a) + a; - } - function distSquared(a, b) { - var result = 0; - for (var i = 0; i < a.length; i++) { - var diff = Number(a[i]) - Number(b[i]); - result += diff * diff; - } - return result; - } - function assert(expr, msg) { - if (!expr) { - throw new Error(msg); - } - } - function assertShapesMatch(shapeA, shapeB, errorMessagePrefix) { - if (errorMessagePrefix === void 0) { errorMessagePrefix = ''; } - assert(arraysEqual(shapeA, shapeB), errorMessagePrefix + (" Shapes " + shapeA + " and " + shapeB + " must match")); - } - function assertTypesMatch(a, b) { - assert(a.dtype === b.dtype, " The dtypes of the first(" + a.dtype + ") and" + - (" second(" + b.dtype + ") input must match")); - } - function flatten(arr, ret) { - if (ret === void 0) { ret = []; } - if (Array.isArray(arr)) { - for (var i = 0; i < arr.length; ++i) { - flatten(arr[i], ret); - } - } - else { - ret.push(arr); - } - return ret; - } - function inferShape(val) { - if (isTypedArray(val)) { - return [val.length]; - } - if (!Array.isArray(val)) { - return []; - } - var shape = []; - while (val instanceof Array) { - shape.push(val.length); - val = val[0]; - } - return shape; - } - function sizeFromShape(shape) { - if (shape.length === 0) { - return 1; - } - var size = shape[0]; - for (var i = 1; i < shape.length; i++) { - size *= shape[i]; - } - return size; - } - function isScalarShape(shape) { - return shape.length === 0; - } - function arraysEqual(n1, n2) { - if (n1.length !== n2.length) { - return false; - } - for (var i = 0; i < n1.length; i++) { - if (n1[i] !== n2[i]) { - return false; - } - } - return true; - } - function isInt(a) { - return a % 1 === 0; - } - function tanh(x) { - if (Math.tanh != null) { - return Math.tanh(x); - } - if (x === Infinity) { - return 1; - } - else if (x === -Infinity) { - return -1; - } - else { - var e2x = Math.exp(2 * x); - return (e2x - 1) / (e2x + 1); - } - } - function sizeToSquarishShape(size) { - for (var a = Math.floor(Math.sqrt(size)); a > 1; --a) { - if (size % a === 0) { - return [a, size / a]; - } - } - return [1, size]; - } - function createShuffledIndices(n) { - var shuffledIndices = new Uint32Array(n); - for (var i = 0; i < n; ++i) { - shuffledIndices[i] = i; - } - shuffle(shuffledIndices); - return shuffledIndices; - } - function rightPad(a, size) { - if (size <= a.length) { - return a; - } - return a + ' '.repeat(size - a.length); - } - function repeatedTry(checkFn, delayFn, maxCounter) { - if (delayFn === void 0) { delayFn = function (counter) { return 0; }; } - return new Promise(function (resolve, reject) { - var tryCount = 0; - var tryFn = function () { - if (checkFn()) { - resolve(); - return; - } - tryCount++; - var nextBackoff = delayFn(tryCount); - if (maxCounter != null && tryCount >= maxCounter) { - reject(); - return; - } - setTimeout(tryFn, nextBackoff); - }; - setTimeout(tryFn, 0); - }); - } - function getQueryParams(queryString) { - var params = {}; - queryString.replace(/[?&]([^=?&]+)(?:=([^&]*))?/g, function (s) { - var t = []; - for (var _i = 1; _i < arguments.length; _i++) { - t[_i - 1] = arguments[_i]; - } - decodeParam(params, t[0], t[1]); - return t.join('='); - }); - return params; - } - function decodeParam(params, name, value) { - params[decodeURIComponent(name)] = decodeURIComponent(value || ''); - } - function inferFromImplicitShape(shape, size) { - var shapeProd = 1; - var implicitIdx = -1; - for (var i = 0; i < shape.length; ++i) { - if (shape[i] > 0) { - shapeProd *= shape[i]; - } - else if (shape[i] === -1) { - if (implicitIdx !== -1) { - throw Error("Shapes can only have 1 implicit size. " + - ("Found - 1 at dim " + implicitIdx + " and dim " + i)); - } - implicitIdx = i; - } - else if (shape[i] <= 0) { - throw Error("Shapes can not be <= 0. Found " + shape[i] + " at dim " + i); - } - } - if (implicitIdx === -1) { - if (size > 0 && size !== shapeProd) { - throw Error("Size(" + size + ") must match the product of shape " + shape); - } - return shape; - } - if (size % shapeProd !== 0) { - throw Error("The implicit shape can't be a fractional number. " + - ("Got " + size + " / " + shapeProd)); - } - var newShape = shape.slice(); - newShape[implicitIdx] = size / shapeProd; - return newShape; - } - function squeezeShape(shape, axis) { - var newShape = []; - var keptDims = []; - var j = 0; - for (var i = 0; i < shape.length; ++i) { - if (axis != null) { - if (axis[j] === i && shape[i] > 1) { - throw new Error("Can't squeeze axis " + i + " since its dim '" + shape[i] + "' is not 1"); - } - if ((axis[j] == null || axis[j] > i) && shape[i] === 1) { - newShape.push(shape[i]); - keptDims.push(i); - } - if (axis[j] <= i) { - j++; - } - } - if (shape[i] > 1) { - newShape.push(shape[i]); - keptDims.push(i); - } - } - return { newShape: newShape, keptDims: keptDims }; - } - function getTypedArrayFromDType(dtype, size) { - var values = null; - if (dtype == null || dtype === 'float32') { - values = new Float32Array(size); - } - else if (dtype === 'int32') { - values = new Int32Array(size); - } - else if (dtype === 'bool') { - values = new Uint8Array(size); - } - else { - throw new Error("Unknown data type " + dtype); - } - return values; - } - function isTensorInList(tensor, tensorList) { - for (var i = 0; i < tensorList.length; i++) { - if (tensorList[i].id === tensor.id) { - return true; - } - } - return false; - } - function checkForNaN(vals, dtype, name) { - if (dtype !== 'float32') { - return; - } - for (var i = 0; i < vals.length; i++) { - if (isNaN(vals[i])) { - throw Error("The result of the '" + name + "' has NaNs."); - } - } - } - function flattenNameArrayMap(nameArrayMap, keys) { - var xs = []; - if (nameArrayMap instanceof Tensor) { - xs.push(nameArrayMap); - } - else { - var xMap = nameArrayMap; - for (var i = 0; i < keys.length; i++) { - xs.push(xMap[keys[i]]); - } - } - return xs; - } - function unflattenToNameArrayMap(keys, flatArrays) { - if (keys.length !== flatArrays.length) { - throw new Error("Cannot unflatten Tensor[], keys and arrays are not of same length."); - } - var result = {}; - for (var i = 0; i < keys.length; i++) { - result[keys[i]] = flatArrays[i]; - } - return result; - } - function hasEncodingLoss(oldType, newType) { - if (newType === 'float32') { - return false; - } - if (newType === 'int32' && oldType !== 'float32') { - return false; - } - if (newType === 'bool' && oldType === 'bool') { - return false; - } - return true; - } - function copyTypedArray(array, dtype) { - if (dtype == null || dtype === 'float32') { - return new Float32Array(array); - } - else if (dtype === 'int32') { - return new Int32Array(array); - } - else if (dtype === 'bool') { - var bool = new Uint8Array(array.length); - for (var i = 0; i < bool.length; ++i) { - if (Math.round(array[i]) !== 0) { - bool[i] = 1; - } - } - return bool; - } - else { - throw new Error("Unknown data type " + dtype); - } - } - function isTypedArray(a) { - return a instanceof Float32Array || a instanceof Int32Array || - a instanceof Uint8Array; - } - function bytesPerElement(dtype) { - if (dtype === 'float32' || dtype === 'int32') { - return 4; - } - else if (dtype === 'bool') { - return 1; - } - else { - throw new Error("Unknown dtype " + dtype); - } - } - function isFunction(f) { - return !!(f && f.constructor && f.call && f.apply); - } - function extractTensorsFromContainer(result) { - return extractTensorsFromAny(result); - } - function extractTensorsFromAny(result) { - if (result == null) { - return []; - } - if (result instanceof Tensor) { - return [result]; - } - var list = []; - var resultObj = result; - if (!isIterable(resultObj)) { - return []; - } - for (var k in resultObj) { - var sublist = flatten(resultObj[k]).filter(function (x) { return x instanceof Tensor; }); - list.push.apply(list, sublist); - } - return list; - } - function isIterable(obj) { - return Array.isArray(obj) || typeof obj === 'object'; - } - - var util = /*#__PURE__*/Object.freeze({ - assertArgumentsAreTensors: assertArgumentsAreTensors, - shuffle: shuffle, - clamp: clamp, - randUniform: randUniform, - distSquared: distSquared, - assert: assert, - assertShapesMatch: assertShapesMatch, - assertTypesMatch: assertTypesMatch, - flatten: flatten, - inferShape: inferShape, - sizeFromShape: sizeFromShape, - isScalarShape: isScalarShape, - arraysEqual: arraysEqual, - isInt: isInt, - tanh: tanh, - sizeToSquarishShape: sizeToSquarishShape, - createShuffledIndices: createShuffledIndices, - rightPad: rightPad, - repeatedTry: repeatedTry, - getQueryParams: getQueryParams, - inferFromImplicitShape: inferFromImplicitShape, - squeezeShape: squeezeShape, - getTypedArrayFromDType: getTypedArrayFromDType, - isTensorInList: isTensorInList, - checkForNaN: checkForNaN, - flattenNameArrayMap: flattenNameArrayMap, - unflattenToNameArrayMap: unflattenToNameArrayMap, - hasEncodingLoss: hasEncodingLoss, - copyTypedArray: copyTypedArray, - isTypedArray: isTypedArray, - bytesPerElement: bytesPerElement, - isFunction: isFunction, - extractTensorsFromContainer: extractTensorsFromContainer, - extractTensorsFromAny: extractTensorsFromAny - }); - - var FORMAT_LIMIT_NUM_VALS = 20; - var FORMAT_NUM_FIRST_LAST_VALS = 3; - var FORMAT_NUM_SIG_DIGITS = 7; - function tensorToString(t, verbose) { - var vals = t.dataSync(); - var padPerCol = computeMaxSizePerColumn(t); - var valsLines = subTensorToString(vals, t.shape, t.strides, padPerCol); - var lines = ['Tensor']; - if (verbose) { - lines.push(" dtype: " + t.dtype); - lines.push(" rank: " + t.rank); - lines.push(" shape: [" + t.shape + "]"); - lines.push(" values:"); - } - lines.push(valsLines.map(function (l) { return ' ' + l; }).join('\n')); - return lines.join('\n'); - } - function computeMaxSizePerColumn(t) { - var vals = t.dataSync(); - var n = t.size; - var numCols = t.strides[t.strides.length - 1]; - var padPerCol = new Array(numCols).fill(0); - if (t.rank > 1) { - for (var row = 0; row < n / numCols; row++) { - var offset = row * numCols; - for (var j = 0; j < numCols; j++) { - padPerCol[j] = - Math.max(padPerCol[j], valToString(vals[offset + j], 0).length); - } - } - } - return padPerCol; - } - function valToString(val, pad) { - return rightPad(parseFloat(val.toFixed(FORMAT_NUM_SIG_DIGITS)).toString(), pad); - } - function subTensorToString(vals, shape, strides, padPerCol, isLast) { - if (isLast === void 0) { isLast = true; } - var size = shape[0]; - var rank = shape.length; - if (rank === 0) { - return [vals[0].toString()]; - } - if (rank === 1) { - if (size > FORMAT_LIMIT_NUM_VALS) { - var firstVals = Array.from(vals.subarray(0, FORMAT_NUM_FIRST_LAST_VALS)); - var lastVals = Array.from(vals.subarray(size - FORMAT_NUM_FIRST_LAST_VALS, size)); - return [ - '[' + firstVals.map(function (x, i) { return valToString(x, padPerCol[i]); }).join(', ') + - ', ..., ' + - lastVals - .map(function (x, i) { return valToString(x, padPerCol[size - FORMAT_NUM_FIRST_LAST_VALS + i]); }) - .join(', ') + - ']' - ]; - } - return [ - '[' + - Array.from(vals).map(function (x, i) { return valToString(x, padPerCol[i]); }).join(', ') + - ']' - ]; - } - var subshape = shape.slice(1); - var substrides = strides.slice(1); - var stride = strides[0]; - var lines = []; - if (size > FORMAT_LIMIT_NUM_VALS) { - for (var i = 0; i < FORMAT_NUM_FIRST_LAST_VALS; i++) { - var start = i * stride; - var end = start + stride; - lines.push.apply(lines, subTensorToString(vals.subarray(start, end), subshape, substrides, padPerCol, false)); - } - lines.push('...'); - for (var i = size - FORMAT_NUM_FIRST_LAST_VALS; i < size; i++) { - var start = i * stride; - var end = start + stride; - lines.push.apply(lines, subTensorToString(vals.subarray(start, end), subshape, substrides, padPerCol, i === size - 1)); - } - } - else { - for (var i = 0; i < size; i++) { - var start = i * stride; - var end = start + stride; - lines.push.apply(lines, subTensorToString(vals.subarray(start, end), subshape, substrides, padPerCol, i === size - 1)); - } - } - var sep = rank === 2 ? ',' : ''; - lines[0] = '[' + lines[0] + sep; - for (var i = 1; i < lines.length - 1; i++) { - lines[i] = ' ' + lines[i] + sep; - } - var newLineSep = ',\n'; - for (var i = 2; i < rank; i++) { - newLineSep += '\n'; - } - lines[lines.length - 1] = - ' ' + lines[lines.length - 1] + ']' + (isLast ? '' : newLineSep); - return lines; - } - - function axesAreInnerMostDims(axes, rank) { - for (var i = 0; i < axes.length; ++i) { - if (axes[axes.length - i - 1] !== rank - 1 - i) { - return false; - } - } - return true; - } - function combineLocations(outputLoc, reduceLoc, axes) { - var rank = outputLoc.length + reduceLoc.length; - var loc = []; - var outIdx = 0; - var reduceIdx = 0; - for (var dim = 0; dim < rank; dim++) { - if (axes.indexOf(dim) === -1) { - loc.push(outputLoc[outIdx++]); - } - else { - loc.push(reduceLoc[reduceIdx++]); - } - } - return loc; - } - function computeOutAndReduceShapes(aShape, axes) { - var outShape = []; - var rank = aShape.length; - for (var dim = 0; dim < rank; dim++) { - if (axes.indexOf(dim) === -1) { - outShape.push(aShape[dim]); - } - } - var reduceShape = axes.map(function (dim) { return aShape[dim]; }); - return [outShape, reduceShape]; - } - function expandShapeToKeepDim(shape, axes) { - var reduceSubShape = axes.map(function (x) { return 1; }); - return combineLocations(shape, reduceSubShape, axes); - } - function parseAxisParam(axis, shape) { - var rank = shape.length; - axis = axis == null ? shape.map(function (s, i) { return i; }) : [].concat(axis); - assert(axis.every(function (ax) { return ax >= -rank && ax < rank; }), "All values in axis param must be in range [-" + rank + ", " + rank + ") but " + - ("got axis " + axis)); - assert(axis.every(function (ax) { return isInt(ax); }), "All values in axis param must be integers but " + - ("got axis " + axis)); - return axis.map(function (a) { return a < 0 ? rank + a : a; }); - } - function assertAxesAreInnerMostDims(msg, axes, rank) { - assert(axesAreInnerMostDims(axes, rank), msg + " supports only inner-most axes for now. " + - ("Got axes " + axes + " and rank-" + rank + " input.")); - } - function getAxesPermutation(axes, rank) { - if (axesAreInnerMostDims(axes, rank)) { - return null; - } - var result = []; - for (var i = 0; i < rank; ++i) { - if (axes.indexOf(i) === -1) { - result.push(i); - } - } - axes.forEach(function (axis) { return result.push(axis); }); - return result; - } - function getUndoAxesPermutation(axes) { - return axes.map(function (axis, i) { return [i, axis]; }) - .sort(function (a, b) { return a[1] - b[1]; }) - .map(function (x) { return x[0]; }); - } - function getInnerMostAxes(numAxes, rank) { - var res = []; - for (var i = rank - numAxes; i < rank; ++i) { - res.push(i); - } - return res; - } - - function assertParams(aShape, bShape, axis) { - var aRank = aShape.length; - var bRank = bShape.length; - assert(aShape.length === bShape.length, "Error in concat" + aRank + "D: rank of x1 (" + aRank + ") and x2 (" + bRank + ") " + - "must be the same."); - assert(axis >= 0 && axis < aRank, "Error in concat" + aRank + "D: axis must be " + - ("between 0 and " + (aRank - 1) + ".")); - for (var i = 0; i < aRank; i++) { - assert((i === axis) || (aShape[i] === bShape[i]), "Error in concat" + aRank + "D: Shape (" + aShape + ") does not match " + - ("(" + bShape + ") along the non-concatenated axis " + i + ".")); - } - } - function computeOutShape(x1Shape, x2Shape, axis) { - assert(x1Shape.length === x2Shape.length, 'x1 and x2 should have the same rank.'); - var outputShape = x1Shape.slice(); - outputShape[axis] += x2Shape[axis]; - return outputShape; - } - function computeGradientSliceShapes(aShape, bShape) { - return { - aBegin: [0, 0], - aSize: aShape, - bBegin: [0, aShape[1]], - bSize: bShape - }; - } - - function operation(target, name, descriptor) { - var fn = descriptor.value; - descriptor.value = function () { - var args = []; - for (var _i = 0; _i < arguments.length; _i++) { - args[_i] = arguments[_i]; - } - return tidy(name, function () { return fn.apply(void 0, args); }); - }; - return descriptor; - } - - var __decorate = (undefined && undefined.__decorate) || function (decorators, target, key, desc) { - var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; - if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); - else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; - return c > 3 && r && Object.defineProperty(target, key, r), r; - }; - var ConcatOps = (function () { - function ConcatOps() { - } - ConcatOps.concat1d = function (tensors) { - return ConcatOps.concat(tensors, 0); - }; - ConcatOps.concat2d = function (tensors, axis) { - return ConcatOps.concat(tensors, axis); - }; - ConcatOps.concat3d = function (tensors, axis) { - return ConcatOps.concat(tensors, axis); - }; - ConcatOps.concat4d = function (tensors, axis) { - return ConcatOps.concat(tensors, axis); - }; - ConcatOps.concat = function (tensors, axis) { - if (axis === void 0) { axis = 0; } - assert(tensors.length >= 1, 'Pass at least one tensor to concat'); - assertArgumentsAreTensors({ tensors: tensors }, 'concat'); - var result = tensors[0]; - if (tensors.length === 1) { - return result; - } - var axes = parseAxisParam(axis, result.shape); - for (var i = 1; i < tensors.length; ++i) { - result = concat2Tensors(result, tensors[i], axes[0]); - } - return result; - }; - __decorate([ - doc({ heading: 'Tensors', subheading: 'Slicing and Joining' }), - operation - ], ConcatOps, "concat", null); - return ConcatOps; - }()); - function concat2Tensors(a, b, axis) { - assertParams(a.shape, b.shape, axis); - var outShape = computeOutShape(a.shape, b.shape, axis); - var a2D = a.as2D(-1, sizeFromShape(a.shape.slice(axis))); - var b2D = b.as2D(-1, sizeFromShape(b.shape.slice(axis))); - var _a = computeGradientSliceShapes(a2D.shape, b2D.shape), aBegin = _a.aBegin, aSize = _a.aSize, bBegin = _a.bBegin, bSize = _a.bSize; - var der = function (dy) { - return { a: function () { return dy.slice(aBegin, aSize); }, b: function () { return dy.slice(bBegin, bSize); } }; - }; - var res = ENV.engine.runKernel(function (backend) { return backend.concat(a2D, b2D); }, { a: a2D, b: b2D }, der); - return res.reshape(outShape); - } - - var commonjsGlobal = typeof window !== 'undefined' ? window : typeof global !== 'undefined' ? global : typeof self !== 'undefined' ? self : {}; - - function createCommonjsModule(fn, module) { - return module = { exports: {} }, fn(module, module.exports), module.exports; - } - - var alea = createCommonjsModule(function (module) { - // A port of an algorithm by Johannes Baagøe , 2010 - // http://baagoe.com/en/RandomMusings/javascript/ - // https://github.com/nquinlan/better-random-numbers-for-javascript-mirror - // Original work is under MIT license - - - // Copyright (C) 2010 by Johannes Baagøe - // - // Permission is hereby granted, free of charge, to any person obtaining a copy - // of this software and associated documentation files (the "Software"), to deal - // in the Software without restriction, including without limitation the rights - // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - // copies of the Software, and to permit persons to whom the Software is - // furnished to do so, subject to the following conditions: - // - // The above copyright notice and this permission notice shall be included in - // all copies or substantial portions of the Software. - // - // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - // THE SOFTWARE. - - - - (function(global, module, define) { - - function Alea(seed) { - var me = this, mash = Mash(); - - me.next = function() { - var t = 2091639 * me.s0 + me.c * 2.3283064365386963e-10; // 2^-32 - me.s0 = me.s1; - me.s1 = me.s2; - return me.s2 = t - (me.c = t | 0); + typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) : + typeof define === 'function' && define.amd ? define(['exports'], factory) : + (factory((global.faceapi = global.faceapi || {}))); +}(this, (function (exports) { 'use strict'; + + /** + * @license + * Copyright 2018 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + var extendStatics=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t;}||function(e,t){for(var n in t)t.hasOwnProperty(n)&&(e[n]=t[n]);};function __extends(e,t){function n(){this.constructor=e;}extendStatics(e,t),e.prototype=null===t?Object.create(t):(n.prototype=t.prototype,new n);}function __decorate(e,t,n,r){var a,o=arguments.length,i=o<3?t:null===r?r=Object.getOwnPropertyDescriptor(t,n):r;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)i=Reflect.decorate(e,t,n,r);else for(var s=e.length-1;s>=0;s--)(a=e[s])&&(i=(o<3?a(i):o>3?a(t,n,i):a(t,n))||i);return o>3&&i&&Object.defineProperty(t,n,i),i}function __awaiter(e,t,n,r){return new(n||(n=Promise))(function(a,o){function i(e){try{u(r.next(e));}catch(e){o(e);}}function s(e){try{u(r.throw(e));}catch(e){o(e);}}function u(e){e.done?a(e.value):new n(function(t){t(e.value);}).then(i,s);}u((r=r.apply(e,t||[])).next());})}function __generator(e,t){var n,r,a,o,i={label:0,sent:function(){if(1&a[0])throw a[1];return a[1]},trys:[],ops:[]};return o={next:s(0),throw:s(1),return:s(2)},"function"==typeof Symbol&&(o[Symbol.iterator]=function(){return this}),o;function s(o){return function(s){return function(o){if(n)throw new TypeError("Generator is already executing.");for(;i;)try{if(n=1,r&&(a=2&o[0]?r.return:o[0]?r.throw||((a=r.return)&&a.call(r),0):r.next)&&!(a=a.call(r,o[1])).done)return a;switch(r=0,a&&(o=[2&o[0],a.value]),o[0]){case 0:case 1:a=o;break;case 4:return i.label++,{value:o[1],done:!1};case 5:i.label++,r=o[1],o=[0];continue;case 7:o=i.ops.pop(),i.trys.pop();continue;default:if(!(a=(a=i.trys).length>0&&a[a.length-1])&&(6===o[0]||2===o[0])){i=0;continue}if(3===o[0]&&(!a||o[1]>a[0]&&o[1]0;)r=Math.random()*t|0,n=e[--t],e[t]=e[r],e[r]=n;}function clamp(e,t,n){return Math.max(e,Math.min(t,n))}function randUniform(e,t){return Math.random()*(t-e)+e}function distSquared(e,t){for(var n=0,r=0;r1;--t)if(e%t==0)return [t,e/t];return [1,e]}function createShuffledIndices(e){for(var t=new Uint32Array(e),n=0;n=n?a():setTimeout(i,s);}};i();})}function getQueryParams(e){var t={};return e.replace(/[?&]([^=?&]+)(?:=([^&]*))?/g,function(e){for(var n=[],r=1;r0)n*=e[a];else if(-1===e[a]){if(-1!==r)throw Error("Shapes can only have 1 implicit size. Found - 1 at dim "+r+" and dim "+a);r=a;}else if(e[a]<=0)throw Error("Shapes can not be <= 0. Found "+e[a]+" at dim "+a);if(-1===r){if(t>0&&t!==n)throw Error("Size("+t+") must match the product of shape "+e);return e}if(t%n!=0)throw Error("The implicit shape can't be a fractional number. Got "+t+" / "+n);var o=e.slice();return o[r]=t/n,o}function squeezeShape(e,t){for(var n=[],r=[],a=0,o=0;o1)throw new Error("Can't squeeze axis "+o+" since its dim '"+e[o]+"' is not 1");(null==t[a]||t[a]>o)&&1===e[o]&&(n.push(e[o]),r.push(o)),t[a]<=o&&a++;}e[o]>1&&(n.push(e[o]),r.push(o));}return {newShape:n,keptDims:r}}function getTypedArrayFromDType(e,t){var n=null;if(null==e||"float32"===e)n=new Float32Array(t);else if("int32"===e)n=new Int32Array(t);else{if("bool"!==e)throw new Error("Unknown data type "+e);n=new Uint8Array(t);}return n}function isTensorInList(e,t){for(var n=0;n1)for(var o=0;oFORMAT_LIMIT_NUM_VALS){var s=Array.from(e.subarray(0,FORMAT_NUM_FIRST_LAST_VALS)),u=Array.from(e.subarray(o-FORMAT_NUM_FIRST_LAST_VALS,o));return ["["+s.map(function(e,t){return valToString(e,r[t])}).join(", ")+", ..., "+u.map(function(e,t){return valToString(e,r[o-FORMAT_NUM_FIRST_LAST_VALS+t])}).join(", ")+"]"]}return ["["+Array.from(e).map(function(e,t){return valToString(e,r[t])}).join(", ")+"]"]}var l=t.slice(1),c=n.slice(1),d=n[0],p=[];if(o>FORMAT_LIMIT_NUM_VALS){for(var h=0;h=-n&&e=0&&n=1,"Pass at least one tensor to concat"),assertArgumentsAreTensors({tensors:e},"concat");var n=e[0];if(1===e.length)return n;for(var r=parseAxisParam(t,n.shape),a=1;a>>0,t=(r*=t)>>>0,t+=4294967296*(r-=t);}return 2.3283064365386963e-10*(t>>>0)});n.next=function(){var e=2091639*n.s0+2.3283064365386963e-10*n.c;return n.s0=n.s1,n.s1=n.s2,n.s2=e-(n.c=0|e)},n.c=1,n.s0=r(" "),n.s1=r(" "),n.s2=r(" "),n.s0-=r(e),n.s0<0&&(n.s0+=1),n.s1-=r(e),n.s1<0&&(n.s1+=1),n.s2-=r(e),n.s2<0&&(n.s2+=1),r=null;}(e),a=t&&t.state,o=n.next;return o.int32=function(){return 4294967296*n.next()|0},o.double=function(){return o()+1.1102230246251565e-16*(2097152*o()|0)},o.quick=o,a&&("object"==typeof a&&r(a,n),o.state=function(){return r(n,{})}),o}t&&t.exports?t.exports=a:n&&n.amd?n(function(){return a}):this.alea=a;}(0,e,!1);}),xor128=createCommonjsModule(function(e){!function(e,t,n){function r(e,t){return t.x=e.x,t.y=e.y,t.z=e.z,t.w=e.w,t}function a(e,t){var n=new function(e){var t=this,n="";t.x=0,t.y=0,t.z=0,t.w=0,t.next=function(){var e=t.x^t.x<<11;return t.x=t.y,t.y=t.z,t.z=t.w,t.w^=t.w>>>19^e^e>>>8},e===(0|e)?t.x=e:n+=e;for(var r=0;r>>0)/4294967296};return o.double=function(){do{var e=((n.next()>>>11)+(n.next()>>>0)/4294967296)/(1<<21);}while(0===e);return e},o.int32=n.next,o.quick=o,a&&("object"==typeof a&&r(a,n),o.state=function(){return r(n,{})}),o}t&&t.exports?t.exports=a:n&&n.amd?n(function(){return a}):this.xor128=a;}(0,e,!1);}),xorwow=createCommonjsModule(function(e){!function(e,t,n){function r(e,t){return t.x=e.x,t.y=e.y,t.z=e.z,t.w=e.w,t.v=e.v,t.d=e.d,t}function a(e,t){var n=new function(e){var t=this,n="";t.next=function(){var e=t.x^t.x>>>2;return t.x=t.y,t.y=t.z,t.z=t.w,t.w=t.v,(t.d=t.d+362437|0)+(t.v=t.v^t.v<<4^e^e<<1)|0},t.x=0,t.y=0,t.z=0,t.w=0,t.v=0,e===(0|e)?t.x=e:n+=e;for(var r=0;r>>4),t.next();}(e),a=t&&t.state,o=function(){return (n.next()>>>0)/4294967296};return o.double=function(){do{var e=((n.next()>>>11)+(n.next()>>>0)/4294967296)/(1<<21);}while(0===e);return e},o.int32=n.next,o.quick=o,a&&("object"==typeof a&&r(a,n),o.state=function(){return r(n,{})}),o}t&&t.exports?t.exports=a:n&&n.amd?n(function(){return a}):this.xorwow=a;}(0,e,!1);}),xorshift7=createCommonjsModule(function(e){!function(e,t,n){function r(e,t){return t.x=e.x.slice(),t.i=e.i,t}function a(e,t){null==e&&(e=+new Date);var n=new function(e){var t=this;t.next=function(){var e,n,r=t.x,a=t.i;return e=r[a],n=(e^=e>>>7)^e<<24,n^=(e=r[a+1&7])^e>>>10,n^=(e=r[a+3&7])^e>>>3,n^=(e=r[a+4&7])^e<<7,e=r[a+7&7],n^=(e^=e<<13)^e<<9,r[a]=n,t.i=a+1&7,n},function(e,t){var n,r=[];if(t===(0|t))r[0]=t;else for(t=""+t,n=0;n0;--n)e.next();}(t,e);}(e),a=t&&t.state,o=function(){return (n.next()>>>0)/4294967296};return o.double=function(){do{var e=((n.next()>>>11)+(n.next()>>>0)/4294967296)/(1<<21);}while(0===e);return e},o.int32=n.next,o.quick=o,a&&(a.x&&r(a,n),o.state=function(){return r(n,{})}),o}t&&t.exports?t.exports=a:n&&n.amd?n(function(){return a}):this.xorshift7=a;}(0,e,!1);}),xor4096=createCommonjsModule(function(e){!function(e,t,n){function r(e,t){return t.i=e.i,t.w=e.w,t.X=e.X.slice(),t}function a(e,t){null==e&&(e=+new Date);var n=new function(e){var t=this;t.next=function(){var e,n,r=t.w,a=t.X,o=t.i;return t.w=r=r+1640531527|0,n=a[o+34&127],e=a[o=o+1&127],n^=n<<13,e^=e<<17,n^=n>>>15,e^=e>>>12,n=a[o]=n^e,t.i=o,n+(r^r>>>16)|0},function(e,t){var n,r,a,o,i,s=[],u=128;for(t===(0|t)?(r=t,t=null):(t+="\0",r=0,u=Math.max(u,t.length)),a=0,o=-32;o>>15,r^=r<<4,r^=r>>>13,o>=0&&(i=i+1640531527|0,a=0==(n=s[127&o]^=r+i)?a+1:0);for(a>=128&&(s[127&(t&&t.length||0)]=-1),a=127,o=512;o>0;--o)r=s[a+34&127],n=s[a=a+1&127],r^=r<<13,n^=n<<17,r^=r>>>15,n^=n>>>12,s[a]=r^n;e.w=i,e.X=s,e.i=a;}(t,e);}(e),a=t&&t.state,o=function(){return (n.next()>>>0)/4294967296};return o.double=function(){do{var e=((n.next()>>>11)+(n.next()>>>0)/4294967296)/(1<<21);}while(0===e);return e},o.int32=n.next,o.quick=o,a&&(a.X&&r(a,n),o.state=function(){return r(n,{})}),o}t&&t.exports?t.exports=a:n&&n.amd?n(function(){return a}):this.xor4096=a;}(0,e,!1);}),tychei=createCommonjsModule(function(e){!function(e,t,n){function r(e,t){return t.a=e.a,t.b=e.b,t.c=e.c,t.d=e.d,t}function a(e,t){var n=new function(e){var t=this,n="";t.next=function(){var e=t.b,n=t.c,r=t.d,a=t.a;return e=e<<25^e>>>7^n,n=n-r|0,r=r<<24^r>>>8^a,a=a-e|0,t.b=e=e<<20^e>>>12^n,t.c=n=n-r|0,t.d=r<<16^n>>>16^a,t.a=a-e|0},t.a=0,t.b=0,t.c=-1640531527,t.d=1367130551,e===Math.floor(e)?(t.a=e/4294967296|0,t.b=0|e):n+=e;for(var r=0;r>>0)/4294967296};return o.double=function(){do{var e=((n.next()>>>11)+(n.next()>>>0)/4294967296)/(1<<21);}while(0===e);return e},o.int32=n.next,o.quick=o,a&&("object"==typeof a&&r(a,n),o.state=function(){return r(n,{})}),o}t&&t.exports?t.exports=a:n&&n.amd?n(function(){return a}):this.tychei=a;}(0,e,!1);}),seedrandom=createCommonjsModule(function(e){!function(t,n){var r,a=this,o=256,i=6,s="random",u=n.pow(o,i),l=n.pow(2,52),c=2*l,d=o-1;function p(e,p,m){var v=[],y=f(function e(t,n){var r,a=[],o=typeof t;if(n&&"object"==o)for(r in t)try{a.push(e(t[r],n-1));}catch(e){}return a.length?a:"string"==o?t:t+"\0"}((p=1==p?{entropy:!0}:p||{}).entropy?[e,g(t)]:null==e?function(){try{var e;return r&&(e=r.randomBytes)?e=e(o):(e=new Uint8Array(o),(a.crypto||a.msCrypto).getRandomValues(e)),g(e)}catch(e){var n=a.navigator,i=n&&n.plugins;return [+new Date,a,i,a.screen,g(t)]}}():e,3),v),x=new function(e){var t,n=e.length,r=this,a=0,i=r.i=r.j=0,s=r.S=[];n||(e=[n++]);for(;a=c;)e/=2,t/=2,n>>>=1;return (e+n)/t};return b.int32=function(){return 0|x.g(4)},b.quick=function(){return x.g(4)/4294967296},b.double=b,f(g(x.S),t),(p.pass||m||function(e,t,r,a){return a&&(a.S&&h(a,x),e.state=function(){return h(x,{})}),r?(n[s]=e,t):e})(b,y,"global"in p?p.global:this==n,p.state)}function h(e,t){return t.i=e.i,t.j=e.j,t.S=e.S.slice(),t}function f(e,t){for(var n,r=e+"",a=0;a=1||0===i);var s=Math.sqrt(-2*Math.log(i)/i);t=this.mean+this.stdDev*a*s,n=this.mean+this.stdDev*o*s,this.truncated&&!this.isValidTruncated(t)||(r=!0);}return this.truncated&&!this.isValidTruncated(n)||(this.nextVal=this.convertValue(n)),this.convertValue(t)},e.prototype.convertValue=function(e){return null==this.dtype||"float32"===this.dtype?e:Math.round(e)},e.prototype.isValidTruncated=function(e){return e<=this.upper&&e>=this.lower},e}();!function(e){e.float32="float32",e.int32="int32",e.bool="bool";}(DType||(DType={})),function(e){e.R0="R0",e.R1="R1",e.R2="R2",e.R3="R3",e.R4="R4",e.R5="R5",e.R6="R6";}(Rank||(Rank={})),function(e){e.float32="float32",e.int32="int32",e.bool="int32";}(UpcastInt32AndMap||(UpcastInt32AndMap={})),function(e){e.float32="float32",e.int32="int32",e.bool="bool";}(UpcastBoolAndMap||(UpcastBoolAndMap={})),function(e){e.float32="float32",e.int32="float32",e.bool="float32";}(UpcastFloat32AndMap||(UpcastFloat32AndMap={}));var upcastTypeMap={float32:UpcastFloat32AndMap,int32:UpcastInt32AndMap,bool:UpcastBoolAndMap};function upcastType(e,t){return upcastTypeMap[e][t]}function sumOutType(e){return upcastType(e,"int32")}function getBroadcastDims(e,t){for(var n=e.length,r=[],a=0;a1&&1===i&&r.unshift(o);}return r}function getReductionAxes(e,t){for(var n=[],r=0;r1)&&n.unshift(o);}return n}function broadcastDimsAreOuter(e){for(var t=0;t1&&s>1&&i!==s)throw Error(r);n.unshift(Math.max(i,s));}return n}var BinaryOps=function(){function e(){}return e.add=function(e,t){assertArgumentsAreTensors({a:e,b:t},"add"),assertTypesMatch(e,t);var n=assertAndGetBroadcastShape(e.shape,t.shape);return ENV.engine.runKernel(function(n){return n.add(e,t)},{a:e,b:t},function(r){return {a:function(){var t=r,a=getReductionAxes(e.shape,n);return a.length>0&&(t=t.sum(a)),t.reshape(e.shape)},b:function(){var e=r,a=getReductionAxes(t.shape,n);return a.length>0&&(e=e.sum(a)),e.reshape(t.shape)}}})},e.addStrict=function(e,t){return assertShapesMatch(e.shape,t.shape,"Error in addStrict: "),e.add(t)},e.sub=function(e,t){assertArgumentsAreTensors({a:e,b:t},"sub"),assertTypesMatch(e,t);var n=assertAndGetBroadcastShape(e.shape,t.shape);return ENV.engine.runKernel(function(n){return n.subtract(e,t)},{a:e,b:t},function(r){return {a:function(){var t=r,a=getReductionAxes(e.shape,n);return a.length>0&&(t=t.sum(a)),t.reshape(e.shape)},b:function(){var e=r,a=getReductionAxes(t.shape,n);return a.length>0&&(e=e.sum(a)),e.neg().reshape(t.shape)}}})},e.subStrict=function(e,t){return assertShapesMatch(e.shape,t.shape,"Error in subStrict: "),e.sub(t)},e.pow=function(e,t){assertArgumentsAreTensors({base:e,exp:t},"pow");var n=assertAndGetBroadcastShape(e.shape,t.shape);e=e.cast(upcastType(e.dtype,t.dtype)),t=t.cast(upcastType(e.dtype,t.dtype));return ENV.engine.runKernel(function(n,r){return r(n.pow(e,t))},{base:e,exp:t},function(r,a){var o=a[0];return {base:function(){var a=r.mul(t.toFloat().mul(o.div(e))),i=getReductionAxes(e.shape,n);return i.length>0&&(a=a.sum(i)),a.reshape(e.shape)},exp:function(){var a=r.mul(o.mul(e.log()).toFloat()),i=getReductionAxes(t.shape,n);return i.length>0&&(a=a.sum(i)),a.reshape(t.shape)}}})},e.powStrict=function(e,t){return assertShapesMatch(e.shape,t.shape,"Error in powStrict: "),e.pow(t)},e.mul=function(e,t){assertArgumentsAreTensors({a:e,b:t},"mul"),assertTypesMatch(e,t);var n=assertAndGetBroadcastShape(e.shape,t.shape);return ENV.engine.runKernel(function(n){return n.multiply(e,t)},{a:e,b:t},function(r){return {a:function(){var a=r.mul(t.toFloat()),o=getReductionAxes(e.shape,n);return o.length>0?a.sum(o).reshape(e.shape):a},b:function(){var a=r.mul(e.toFloat()),o=getReductionAxes(t.shape,n);return o.length>0?a.sum(o).reshape(t.shape):a}}})},e.mulStrict=function(e,t){return assertShapesMatch(e.shape,t.shape,"Error in multiplyStrict: "),e.mul(t)},e.div=function(t,n){var r;if(assertArgumentsAreTensors({a:t,b:n},"div"),assertTypesMatch(t,n),"int32"===t.dtype&&"int32"===n.dtype)return e.floorDiv(t,n);r=function(e){return e.realDivide(t,n)};var a=assertAndGetBroadcastShape(t.shape,n.shape);return ENV.engine.runKernel(r,{a:t,b:n},function(e){return {a:function(){var r=e.div(n.toFloat()),o=getReductionAxes(t.shape,a);return o.length>0?r.sum(o).reshape(t.shape):r},b:function(){var r=e.mul(t.toFloat()),o=getReductionAxes(n.shape,a);o.length>0&&(r=r.sum(o).reshape(n.shape));var i=n.square();return r.div(i.toFloat()).neg()}}})},e.floorDiv=function(e,t){assertArgumentsAreTensors({a:e,b:t},"floorDiv"),assertTypesMatch(e,t);var n=assertAndGetBroadcastShape(e.shape,t.shape);return ENV.engine.runKernel(function(n){return n.floorDiv(e,t)},{a:e,b:t},function(r){return {a:function(){var a=r.div(t.toFloat()),o=getReductionAxes(e.shape,n);return o.length>0?a.sum(o).reshape(e.shape):a},b:function(){var a=r.mul(e.toFloat()),o=getReductionAxes(t.shape,n);o.length>0&&(a=a.sum(o).reshape(t.shape));var i=t.square();return a.div(i.toFloat()).neg()}}})},e.divStrict=function(e,t){return assertShapesMatch(e.shape,t.shape,"Error in divideStrict: "),e.div(t)},e.mod=function(e,t){assertArgumentsAreTensors({a:e,b:t},"mod"),assertTypesMatch(e,t);var n=assertAndGetBroadcastShape(e.shape,t.shape);return ENV.engine.runKernel(function(n){return n.mod(e,t)},{a:e,b:t},function(r){return {a:function(){var t=getReductionAxes(e.shape,n);return t.length>0?r.sum(t).reshape(e.shape):r},b:function(){var a=r.mul(e.div(t).floor().neg()),o=getReductionAxes(t.shape,n);return o.length>0?a.sum(o).reshape(t.shape):a}}})},e.modStrict=function(e,t){return assertShapesMatch(e.shape,t.shape,"Error in modStrict: "),e.mod(t)},e.minimum=function(e,t){assertArgumentsAreTensors({a:e,b:t},"minimum"),assertTypesMatch(e,t),"bool"===e.dtype&&(e=e.toInt()),"bool"===t.dtype&&(t=t.toInt()),assertAndGetBroadcastShape(e.shape,t.shape);return ENV.engine.runKernel(function(n){return n.minimum(e,t)},{a:e,b:t},function(n){return {a:function(){return n.mul(e.lessEqual(t).toFloat())},b:function(){return n.mul(e.greater(t).toFloat())}}})},e.minimumStrict=function(e,t){return assertShapesMatch(e.shape,t.shape,"Error in minimumStrict: "),e.minimum(t)},e.maximum=function(e,t){assertArgumentsAreTensors({a:e,b:t},"maximum"),assertTypesMatch(e,t),"bool"===e.dtype&&(e=e.toInt()),"bool"===t.dtype&&(t=t.toInt()),assertAndGetBroadcastShape(e.shape,t.shape);return ENV.engine.runKernel(function(n){return n.maximum(e,t)},{a:e,b:t},function(n){return {a:function(){return n.mul(e.greaterEqual(t).toFloat())},b:function(){return n.mul(e.less(t).toFloat())}}})},e.maximumStrict=function(e,t){return assertShapesMatch(e.shape,t.shape,"Error in minimumStrict: "),e.maximum(t)},e.squaredDifference=function(e,t){assertArgumentsAreTensors({a:e,b:t},"squaredDifference"),assertTypesMatch(e,t),assertAndGetBroadcastShape(e.shape,t.shape);return ENV.engine.runKernel(function(n){return n.squaredDifference(e,t)},{a:e,b:t},function(n){var r=scalar(2);return {a:function(){return n.mul(e.sub(t).mul(r))},b:function(){return n.mul(t.sub(e).mul(r))}}})},e.squaredDifferenceStrict=function(e,t){return assertShapesMatch(e.shape,t.shape,"Error in squaredDifferenceStrict: "),e.squaredDifference(t)},e.atan2=function(t,n){assertArgumentsAreTensors({a:t,b:n},"atan2"),assertTypesMatch(t,n);var r=assertAndGetBroadcastShape(t.shape,n.shape);return ENV.engine.runKernel(function(e){return e.atan2(t,n)},{a:t,b:n},function(a){return {a:function(){var o=e.add(square(t),square(n)),i=a.mul(n.div(o)),s=getReductionAxes(t.shape,r);return s.length>0&&(i=i.sum(s)),i.reshape(t.shape)},b:function(){var o=e.add(square(t),square(n)),i=neg(a.mul(t.div(o))),s=getReductionAxes(n.shape,r);return s.length>0&&(i=i.sum(s)),i.reshape(n.shape)}}})},__decorate([doc({heading:"Operations",subheading:"Arithmetic"}),operation],e,"add",null),__decorate([operation],e,"addStrict",null),__decorate([doc({heading:"Operations",subheading:"Arithmetic"}),operation],e,"sub",null),__decorate([operation],e,"subStrict",null),__decorate([doc({heading:"Operations",subheading:"Arithmetic"}),operation],e,"pow",null),__decorate([operation],e,"powStrict",null),__decorate([doc({heading:"Operations",subheading:"Arithmetic"}),operation],e,"mul",null),__decorate([operation],e,"mulStrict",null),__decorate([doc({heading:"Operations",subheading:"Arithmetic"}),operation],e,"div",null),__decorate([doc({heading:"Operations",subheading:"Arithmetic"}),operation],e,"floorDiv",null),__decorate([operation],e,"divStrict",null),__decorate([doc({heading:"Operations",subheading:"Arithmetic"}),operation],e,"mod",null),__decorate([operation],e,"modStrict",null),__decorate([doc({heading:"Operations",subheading:"Arithmetic"}),operation],e,"minimum",null),__decorate([operation],e,"minimumStrict",null),__decorate([doc({heading:"Operations",subheading:"Arithmetic"}),operation],e,"maximum",null),__decorate([operation],e,"maximumStrict",null),__decorate([doc({heading:"Operations",subheading:"Arithmetic"}),operation],e,"squaredDifference",null),__decorate([operation],e,"squaredDifferenceStrict",null),__decorate([doc({heading:"Operations",subheading:"Basic math"}),operation],e,"atan2",null),e}(),CompareOps=function(){function e(){}return e.notEqual=function(e,t){return assertArgumentsAreTensors({a:e,b:t},"notEqual"),assertTypesMatch(e,t),assertAndGetBroadcastShape(e.shape,t.shape),ENV.engine.runKernel(function(n){return n.notEqual(e,t)},{a:e,b:t})},e.notEqualStrict=function(e,t){return assertShapesMatch(e.shape,t.shape,"Error in notEqualStrict: "),e.notEqual(t)},e.less=function(e,t){return assertArgumentsAreTensors({a:e,b:t},"less"),assertTypesMatch(e,t),assertAndGetBroadcastShape(e.shape,t.shape),ENV.engine.runKernel(function(n){return n.less(e,t)},{a:e,b:t})},e.lessStrict=function(e,t){return assertShapesMatch(e.shape,t.shape,"Error in lessStrict: "),e.less(t)},e.equal=function(e,t){return assertArgumentsAreTensors({a:e,b:t},"equal"),assertTypesMatch(e,t),assertAndGetBroadcastShape(e.shape,t.shape),ENV.engine.runKernel(function(n){return n.equal(e,t)},{a:e,b:t})},e.equalStrict=function(e,t){return assertShapesMatch(e.shape,t.shape,"Error in equalStrict: "),e.equal(t)},e.lessEqual=function(e,t){return assertArgumentsAreTensors({a:e,b:t},"lessEqual"),assertTypesMatch(e,t),assertAndGetBroadcastShape(e.shape,t.shape),ENV.engine.runKernel(function(n){return n.lessEqual(e,t)},{a:e,b:t})},e.lessEqualStrict=function(e,t){return assertShapesMatch(e.shape,t.shape,"Error in lessEqualStrict: "),e.lessEqual(t)},e.greater=function(e,t){return assertArgumentsAreTensors({a:e,b:t},"greater"),assertTypesMatch(e,t),assertAndGetBroadcastShape(e.shape,t.shape),ENV.engine.runKernel(function(n){return n.greater(e,t)},{a:e,b:t})},e.greaterStrict=function(e,t){return assertShapesMatch(e.shape,t.shape,"Error in greaterStrict: "),e.greater(t)},e.greaterEqual=function(e,t){return assertArgumentsAreTensors({a:e,b:t},"greaterEqual"),assertTypesMatch(e,t),assertAndGetBroadcastShape(e.shape,t.shape),ENV.engine.runKernel(function(n){return n.greaterEqual(e,t)},{a:e,b:t})},e.greaterEqualStrict=function(e,t){return assertShapesMatch(e.shape,t.shape,"Error in greaterEqualStrict: "),e.greaterEqual(t)},__decorate([doc({heading:"Operations",subheading:"Logical"}),operation],e,"notEqual",null),__decorate([operation],e,"notEqualStrict",null),__decorate([doc({heading:"Operations",subheading:"Logical"}),operation],e,"less",null),__decorate([operation],e,"lessStrict",null),__decorate([doc({heading:"Operations",subheading:"Logical"}),operation],e,"equal",null),__decorate([operation],e,"equalStrict",null),__decorate([doc({heading:"Operations",subheading:"Logical"}),operation],e,"lessEqual",null),__decorate([operation],e,"lessEqualStrict",null),__decorate([doc({heading:"Operations",subheading:"Logical"}),operation],e,"greater",null),__decorate([operation],e,"greaterStrict",null),__decorate([doc({heading:"Operations",subheading:"Logical"}),operation],e,"greaterEqual",null),__decorate([operation],e,"greaterEqualStrict",null),e}(),LogicalOps=function(){function e(){}return e.logicalNot=function(e){return assertArgumentsAreTensors({x:e},"logicalNot"),assert("bool"===e.dtype,"Error Array must be of type bool."),ENV.engine.runKernel(function(t){return t.logicalNot(e)},{x:e})},e.logicalAnd=function(e,t){return assertArgumentsAreTensors({a:e,b:t},"logicalAnd"),assert("bool"===e.dtype&&"bool"===t.dtype,"Error Array must be of type bool."),assertAndGetBroadcastShape(e.shape,t.shape),ENV.engine.runKernel(function(n){return n.logicalAnd(e,t)},{a:e,b:t})},e.logicalOr=function(e,t){return assertArgumentsAreTensors({a:e,b:t},"logicalOr"),assert("bool"===e.dtype&&"bool"===t.dtype,"Error Array must be of type bool."),assertAndGetBroadcastShape(e.shape,t.shape),ENV.engine.runKernel(function(n){return n.logicalOr(e,t)},{a:e,b:t})},e.logicalXor=function(t,n){return assertArgumentsAreTensors({a:t,b:n},"logicalXor"),assert("bool"===t.dtype&&"bool"===n.dtype,"Error Array must be of type bool."),assertAndGetBroadcastShape(t.shape,n.shape),e.logicalOr(t,n).logicalAnd(e.logicalAnd(t,n).logicalNot())},e.where=function(e,t,n){assertArgumentsAreTensors({condition:e,a:t,b:n},"where"),assert("bool"===e.dtype,"Error Condition must be of type bool."),assertShapesMatch(t.shape,n.shape,"Error in where: "),1===e.rank?assert(e.shape[0]===t.shape[0],"The first dimension of `a` must match the size of `condition`."):assertShapesMatch(e.shape,n.shape,"Error in where: ");var r=upcastType(t.dtype,n.dtype);return ENV.engine.runKernel(function(a){return a.where(e,t,n,r)},{condition:e,a:t,b:n},function(r){return {condition:function(){return zerosLike(e)},a:function(){return r.mul(e.cast(t.dtype))},b:function(){return r.mul(e.logicalNot().cast(n.dtype))}}})},__decorate([doc({heading:"Operations",subheading:"Logical"}),operation],e,"logicalNot",null),__decorate([doc({heading:"Operations",subheading:"Logical"}),operation],e,"logicalAnd",null),__decorate([doc({heading:"Operations",subheading:"Logical"}),operation],e,"logicalOr",null),__decorate([doc({heading:"Operations",subheading:"Logical"}),operation],e,"logicalXor",null),__decorate([doc({heading:"Operations",subheading:"Logical"}),operation],e,"where",null),e}(),SegmentOps=function(){function e(){}return e.unsortedSegmentSum=function(e,t,n){assertArgumentsAreTensors({x:e,segmentIds:t},"unsortedSegmentSum"),assert("int32"===t.dtype,"segmentIds must be of dtype `int32`"),assert(isInt(n),"numSegments must be of dtype int");return ENV.engine.runKernel(function(r){return r.unsortedSegmentSum(e,t,n)},{x:e},function(e){return {x:function(){return gatherDropNegatives(e,t)}}})},__decorate([doc({heading:"Operations",subheading:"Segment"}),operation],e,"unsortedSegmentSum",null),e}();function gatherDropNegatives(e,t){for(var n=BinaryOps.maximum(t,ArrayOps.zerosLike(t)),r=ArrayOps.gather(e,n),a=CompareOps.greaterEqual(t,ArrayOps.scalar(0,"int32")),o=r.rank-a.rank,i=0;i2)throw new Error("Rank of probabilities must be 1 or 2, but is "+o);n=n||Math.random();var i=1===o?e.as2D(1,-1):e,s=ENV.engine.runKernel(function(e){return e.multinomial(i,r,t,n)},{logits2D:i});return 1===o?s.as1D():s},e.oneHot=function(e,t,n,r){if(void 0===n&&(n=1),void 0===r&&(r=0),assert("int32"===e.dtype,"Indices must be of dtype `int32`"),t<2)throw new Error("Error in oneHot: depth must be >=2, but it is "+t);return ENV.engine.runKernel(function(a){return a.oneHot(e,t,n,r)},{indices:e})},e.fromPixels=function(e,t){if(void 0===t&&(t=3),t>4)throw new Error("Cannot construct Tensor with more than 4 channels from pixels.");return ENV.engine.fromPixels(e,t)},e.toPixels=function(e,t){return __awaiter(this,void 0,void 0,function(){var n,r,a,o,i,s,u,l,c,d,p,h,f,g,m,v,y,x,b;return __generator(this,function(E){switch(E.label){case 0:if(assertArgumentsAreTensors({img:e},"toPixels"),2!==e.rank&&3!==e.rank)throw new Error("toPixels only supports rank 2 or 3 tensors, got rank "+e.rank+".");if(n=e.shape.slice(0,2),r=n[0],a=n[1],(o=2===e.rank?1:e.shape[2])>4||2===o)throw new Error("toPixels only supports depth of size 1, 3 or 4 but got "+o);return i=e.min(),s=e.max(),[4,i.data()];case 1:return u=E.sent()[0],[4,s.data()];case 2:if(l=E.sent()[0],i.dispose(),s.dispose(),"float32"===e.dtype){if(u<0||l>1)throw new Error("Tensor values for a float32 Tensor must be in the range [0 - 1] but got range ["+u+" - "+l+"].")}else{if("int32"!==e.dtype)throw new Error("Unsupported type for toPixels: "+e.dtype+". Please use float32 or int32 tensors.");if(u<0||l>255)throw new Error("Tensor values for a int32 Tensor must be in the range [0 - 255] but got range ["+u+" - "+l+"].")}return [4,e.data()];case 3:for(c=E.sent(),d="float32"===e.dtype?255:1,p=new Uint8ClampedArray(a*r*4),h=0;h=1,"Pass at least one tensor to tf.stack"),1===e.length)return e[0].expandDims(t);var n=e[0].rank,r=e[0].shape,a=e[0].dtype;assert(t<=n,"Axis must be <= rank of the tensor"),e.forEach(function(e){assertShapesMatch(r,e.shape,"All tensors passed to stack must have matching shapes");}),e.forEach(function(e){assert(a===e.dtype,"All tensors passed to stack must have matching dtypes");});var o=e.map(function(e){return e.expandDims(t)});return ConcatOps.concat(o,t)},e.unstack=function(e,t){void 0===t&&(t=0);for(var n,r=e.shape[t],a=Array(e.rank-1).fill(0),o=0,i=0;i1)return e.zeros([0],a);var o=makeZerosTypedArray(Math.abs(Math.ceil((n-t)/r)),a);n0,"Gram-Schmidt process: input must not be null, undefined, or empty");for(var n=e[0].shape[0],r=1;r0)for(var n=0;n0?a>=s[t]:a<=s[t]);a+=r[t])n+=1;return n}),[i,l]}function startForAxis(e,t,n,r,a){var o=t[a];e&1<0?Number.MIN_SAFE_INTEGER:Number.MAX_SAFE_INTEGER);var i=r[a];return o<0&&(o+=i),o=clamp(0,o,i-1)}function stopForAxis(e,t,n,r,a){var o=t[a];e&1<0?Number.MAX_SAFE_INTEGER:Number.MIN_SAFE_INTEGER);var i=r[a];return o<0&&(o+=i),o=n[a]>0?clamp(0,o,i):clamp(-1,o,i-1)}var SliceOps=function(){function e(){}return e.slice1d=function(t,n,r){return assert(1===t.rank,"slice1d expects a rank-1 tensor, but got a rank-"+t.rank+" tensor"),e.slice(t,[n],[r])},e.slice2d=function(t,n,r){return assert(2===t.rank,"slice1d expects a rank-2 tensor, but got a rank-"+t.rank+" tensor"),e.slice(t,n,r)},e.slice3d=function(t,n,r){return assert(3===t.rank,"slice1d expects a rank-3 tensor, but got a rank-"+t.rank+" tensor"),e.slice(t,n,r)},e.slice4d=function(t,n,r){return assert(4===t.rank,"slice1d expects a rank-4 tensor, but got a rank-"+t.rank+" tensor"),e.slice(t,n,r)},e.slice=function(e,t,n){if(assertArgumentsAreTensors({x:e},"slice"),0===e.rank)throw new Error("Slicing scalar is not possible");var r,a;r="number"==typeof t?[t].concat(new Array(e.rank-1).fill(0)):t.length=0?t:(assert(-1===t,"Bad value in size"),e.shape[n]-r[n])}),assertParamsValid(e,r,a);var o=e.shape;return ENV.engine.runKernel(function(t){return t.slice(e,r,a)},{x:e},function(e){for(var t=[],n=0;n=0&&n=0;--r)n[r]=n[r+1]*e[r+1];return n}var Gradients=function(){function e(){}return e.gradScope=function(e,t){return tidy(e,t,!0)},e.grad=function(e){return assert(isFunction(e),"The f passed in grad(f) must be a function"),function(t,n){return assert(t instanceof Tensor,"The x passed in grad(f)(x) must be a tensor"),assert(null==n||n instanceof Tensor,"The dy passed in grad(f)(x, dy) must be a tensor"),tidy(function(){var r=ENV.engine.gradients(function(){return e(t)},[t],n),a=r.value,o=r.grads;return null!=n&&assertShapesMatch(a.shape,n.shape,"The shape of dy passed in grad(f)(x, dy) must match the shape returned by f(x)"),checkGrads(o),o[0]})}},e.grads=function(e){return assert(isFunction(e),"The f passed in grads(f) must be a function"),function(t,n){return assert(Array.isArray(t)&&t.every(function(e){return e instanceof Tensor}),"The args passed in grads(f)(args) must be an array of tensors"),assert(null==n||n instanceof Tensor,"The dy passed in grads(f)(args, dy) must be a tensor"),tidy(function(){var r=ENV.engine.gradients(function(){return e.apply(void 0,t)},t,n),a=r.value,o=r.grads;return null!=n&&assertShapesMatch(a.shape,n.shape,"The shape of dy passed in grads(f)([x1,...], dy) must match the shape returned by f([x1,...])"),checkGrads(o),o})}},e.valueAndGrad=function(e){return assert(isFunction(e),"The f passed in valueAndGrad(f) must be a function"),function(t,n){assert(t instanceof Tensor,"The x passed in valueAndGrad(f)(x) must be a tensor"),assert(null==n||n instanceof Tensor,"The dy passed in valueAndGrad(f)(x, dy) must be a tensor");var r=ENV.engine.gradients(function(){return e(t)},[t],n),a=r.grads,o=r.value;return checkGrads(a),{grad:a[0],value:o}}},e.valueAndGrads=function(e){return assert(isFunction(e),"The f passed in valueAndGrads(f) must be a function"),function(t,n){assert(Array.isArray(t)&&t.every(function(e){return e instanceof Tensor}),"The args passed in valueAndGrads(f)(args) must be array of tensors"),assert(null==n||n instanceof Tensor,"The dy passed in valueAndGrads(f)(args, dy) must be a tensor");var r=ENV.engine.gradients(function(){return e.apply(void 0,t)},t,n);return null!=n&&assertShapesMatch(r.value.shape,n.shape,"The shape of dy passed in valueAndGrads(f)([x1,...], dy) must match the shape returned by f([x1,...])"),checkGrads(r.grads),r}},e.variableGrads=function(e,t){if(assert(isFunction(e),"The f passed in variableGrads(f) must be a function"),assert(null==t||Array.isArray(t)&&t.every(function(e){return e instanceof Variable}),"The varList passed in variableGrads(f, varList) must be an array of variables"),null==t)for(var n in t=[],ENV.engine.registeredVariables)t.push(ENV.engine.registeredVariables[n]);var r=t.length;assert((t=t.filter(function(e){return e.trainable})).length>0,"variableGrads() expects at least one of the input variables to be trainable, but none of the "+r+" variables is trainable.");var a=ENV.engine.gradients(e,t,null,!0),o=a.value,i=a.grads;assert(i.some(function(e){return null!=e}),"Cannot find a connection between any variable and the result of the loss function y=f(x). Please make sure the operations that use variables are inside the function f passed to minimize()."),assert(0===o.rank,"The f passed in variableGrads(f) must return a scalar, but it returned a rank-"+o.rank+" tensor");var s={};return t.forEach(function(e,t){null!=i[t]&&(s[e.name]=i[t]);}),{value:o,grads:s}},e.customGrad=function(e){return ENV.engine.customGrad(e)},__decorate([doc({heading:"Training",subheading:"Gradients"})],e,"grad",null),__decorate([doc({heading:"Training",subheading:"Gradients"})],e,"grads",null),__decorate([doc({heading:"Training",subheading:"Gradients"})],e,"valueAndGrad",null),__decorate([doc({heading:"Training",subheading:"Gradients"})],e,"valueAndGrads",null),__decorate([doc({heading:"Training",subheading:"Gradients"})],e,"variableGrads",null),__decorate([doc({heading:"Training",subheading:"Gradients"})],e,"customGrad",null),e}();function checkGrads(e){if(e.filter(function(e){return null==e}).length>0)throw new Error("Cannot compute gradient of y=f(x) with respect to x. Make sure that\n the f you passed encloses all operations that lead from x to y.")}var tidy=Tracking.tidy,keep=Tracking.keep,dispose=Tracking.dispose,time=Tracking.time,grad=Gradients.grad,valueAndGrad=Gradients.valueAndGrad,grads=Gradients.grads,valueAndGrads=Gradients.valueAndGrads,variableGrads=Gradients.variableGrads,customGrad=Gradients.customGrad,Profiler=function(){function e(e,t){this.backendTimer=e,this.logger=t,null==t&&(this.logger=new Logger);}return e.prototype.profileKernel=function(e,t){var n,r=this,a=this.backendTimer.time(function(){n=t();}),o=n.dataSync();return checkForNaN(o,n.dtype,e),a.then(function(t){r.logger.logKernelProfile(e,n,o,t.kernelMs);}),n},e}(),Logger=function(){function e(){}return e.prototype.logKernelProfile=function(e,t,n,r){var a=rightPad(r+"ms",9),o=rightPad(e,25),i=t.rank,s=t.size,u=rightPad(t.shape.toString(),14);console.log("%c"+o+"\t%c"+a+"\t%c"+i+"D "+u+"\t%c"+s,"font-weight:bold","color:red","color:blue","color: orange");},e}();function getFilteredNodesXToY(e,t,n){for(var r={},a={},o=0;o=0;o--){i=(g=e[o]).inputs;var h=[];h.push(g.output);for(c=0;c=0;n--){var r=t[n],a=e[r.output.id];if(null==r.gradient)throw new Error("Cannot compute gradient: gradient function not found for "+r.name+".");var o=r.gradient(a);for(var i in r.inputs){if(!(i in o))throw new Error("Cannot backprop through input "+i+". Available gradients found: "+Object.keys(o)+".");var s=o[i](),u=r.inputs[i];if(!arraysEqual(s.shape,u.shape))throw new Error("Error in gradient for op "+r.name+". The gradient of input '"+i+"' has shape '"+s.shape+"', which does not match the shape of the input '"+u.shape+"'");if(null==e[u.id])e[u.id]=s;else{var l=e[u.id];e[u.id]=l.add(s),l.dispose();}}}}var Type,Engine=function(){function e(e,t){this.backend=e,this.safeMode=t,this.registeredVariables={},this.refCounter=new WeakMap,this.nextTapeNodeId=0,this.numBytes=0,this.numTensors=0,this.numDataBuffers=0,this.gradientScopeCount=0,this.customGradientDepth=0,this.keepTensors=new Set,this.activeScope={track:[]},this.scopeStack=[this.activeScope],this.profiler=new Profiler(e);}return e.prototype.runKernel=function(e,t,n){var r,a=this,o=[],i=function(e){return o.push(e),e},s=this.activeScope.name;if(this.customGradientDepth++,r=ENV.get("DEBUG")?this.profiler.profileKernel(s,function(){return e(a.backend,i)}):e(this.backend,i),this.customGradientDepth--,this.shouldRecord()){var u={id:this.nextTapeNodeId++,name:s,inputs:t,output:r};null!=n&&(u.gradient=function(e){return n(e,o)}),this.activeTape.push(u);}return r},e.prototype.registerTensor=function(e){var t=this.refCounter.has(e.dataId)?this.refCounter.get(e.dataId):0;this.numTensors++,0===t&&(this.numDataBuffers++,this.numBytes+=sizeFromShape(e.shape)*bytesPerElement(e.dtype),this.backend.register(e.dataId,e.shape,e.dtype)),this.refCounter.set(e.dataId,t+1),e instanceof Variable||this.track(e);},e.prototype.registerVariable=function(e){if(null!=this.registeredVariables[e.name])throw new Error("Variable with name "+e.name+" was already registered");this.registeredVariables[e.name]=e;},e.prototype.disposeTensor=function(e){if(this.refCounter.has(e.dataId)){this.keepTensors.has(e.id)&&this.keepTensors.delete(e.id),this.numTensors--;var t=this.refCounter.get(e.dataId);t<=1?(this.refCounter.delete(e.dataId),this.backend.disposeData(e.dataId),this.numDataBuffers--,this.numBytes-=sizeFromShape(e.shape)*bytesPerElement(e.dtype)):this.refCounter.set(e.dataId,t-1);}},e.prototype.disposeVariables=function(){for(var e in this.registeredVariables){var t=this.registeredVariables[e];this.disposeTensor(t),delete this.registeredVariables[e];}},e.prototype.memory=function(){var e=this.backend.memory();return e.numTensors=this.numTensors,e.numDataBuffers=this.numDataBuffers,e.numBytes=this.numBytes,e},e.prototype.shouldRecord=function(){return null!=this.activeTape&&0===this.customGradientDepth},e.prototype.addTapeNode=function(e,t,n){var r={};e.forEach(function(e,t){r[t]=e;});var a={id:this.nextTapeNodeId++,name:this.activeScope.name,inputs:r,output:t,gradient:function(e){var t={};return n(e).forEach(function(e,n){t[n]=function(){return e};}),t}};this.activeTape.push(a);},e.prototype.keep=function(e){if(1===this.scopeStack.length&&ENV.engine.safeMode)throw new Error("Safe mode is ON. Enclose all tensor operations inside tf.tidy(): tf.tidy(() => {...}) to avoid memory leaks.");return this.keepTensors.add(e.id),e},e.prototype.startScope=function(e,t){void 0===t&&(t=!1),t&&0===this.gradientScopeCount&&(this.activeTape=[]),t&&this.gradientScopeCount++;var n={track:[]};e&&(n.name=e),this.scopeStack.push(n),this.activeScope=n;},e.prototype.endScope=function(e,t){var n=this;void 0===t&&(t=!1),t&&(this.gradientScopeCount--,0===this.gradientScopeCount&&(this.activeTape=null));var r=new Set(this.keepTensors),a=getTensorsInContainer(e);a.forEach(function(e){return r.add(e.id)});for(var o=0;o0,"gradients() received an empty list of xs."),tidy("gradients",function(){var o=e();assert(o instanceof Tensor,"The result y returned by f() must be a tensor.");var i=getFilteredNodesXToY(a.activeTape,t,o);if(!r&&0===i.length&&t.length>0)throw new Error("Cannot compute gradient of y=f(x) with respect to x. Make sure that the f you passed encloses all operations that lead from x to y.");var s={};return s[o.id]=null==n?ones(o.shape):n,backpropagateGradients(s,i),{value:o,grads:t.map(function(e){return s[e.id]})}},!0)},e.prototype.customGrad=function(e){var t=this;return assert(isFunction(e),"The f passed in customGrad(f) must be a function."),function(){for(var n,r=[],a=0;a {op();...}); to avoid memory leaks.");return this.activeScope.track.push(e),e},e}();!function(e){e[e.NUMBER=0]="NUMBER",e[e.BOOLEAN=1]="BOOLEAN",e[e.STRING=2]="STRING";}(Type||(Type={}));var URL_PROPERTIES=[{name:"DEBUG",type:Type.BOOLEAN},{name:"IS_BROWSER",type:Type.BOOLEAN},{name:"WEBGL_DISJOINT_QUERY_TIMER_EXTENSION_VERSION",type:Type.NUMBER},{name:"WEBGL_DISJOINT_QUERY_TIMER_EXTENSION_RELIABLE",type:Type.BOOLEAN},{name:"WEBGL_VERSION",type:Type.NUMBER},{name:"WEBGL_RENDER_FLOAT32_ENABLED",type:Type.BOOLEAN},{name:"WEBGL_DOWNLOAD_FLOAT_ENABLED",type:Type.BOOLEAN},{name:"WEBGL_GET_BUFFER_SUB_DATA_ASYNC_EXTENSION_ENABLED",type:Type.BOOLEAN},{name:"BACKEND",type:Type.STRING}],TEST_EPSILON_FLOAT32_ENABLED=.001,TEST_EPSILON_FLOAT32_DISABLED=.1;function hasExtension(e,t){return null!=e.getExtension(t)}function getWebGLRenderingContext(e){if(0===e||!ENV.get("IS_BROWSER"))throw new Error("Cannot get WebGL rendering context, WebGL is disabled.");var t=document.createElement("canvas");return 1===e?t.getContext("webgl")||t.getContext("experimental-webgl"):t.getContext("webgl2")}function loseContext(e){if(null!=e){var t=e.getExtension("WEBGL_lose_context");if(null==t)throw new Error("Extension WEBGL_lose_context not supported on this browser.");t.loseContext();}}function isWebGLVersionEnabled(e){var t;try{t=getWebGLRenderingContext(e);}catch(e){return !1}return null!=t&&(loseContext(t),!0)}function getWebGLDisjointQueryTimerVersion(e){if(0===e)return 0;var t,n=getWebGLRenderingContext(e);return t=hasExtension(n,"EXT_disjoint_timer_query_webgl2")&&2===e?2:hasExtension(n,"EXT_disjoint_timer_query")?1:0,null!=n&&loseContext(n),t}function createFloatTextureAndBindToFramebuffer(e,t){var n=e.createFramebuffer(),r=e.createTexture();e.bindTexture(e.TEXTURE_2D,r);var a=2===t?e.RGBA32F:e.RGBA;e.texImage2D(e.TEXTURE_2D,0,a,1,1,0,e.RGBA,e.FLOAT,null),e.bindFramebuffer(e.FRAMEBUFFER,n),e.framebufferTexture2D(e.FRAMEBUFFER,e.COLOR_ATTACHMENT0,e.TEXTURE_2D,r,0);}function isRenderToFloatTextureEnabled(e){if(0===e)return !1;var t=getWebGLRenderingContext(e);if(1===e){if(!hasExtension(t,"OES_texture_float"))return !1}else if(!hasExtension(t,"EXT_color_buffer_float"))return !1;createFloatTextureAndBindToFramebuffer(t,e);var n=t.checkFramebufferStatus(t.FRAMEBUFFER)===t.FRAMEBUFFER_COMPLETE;return loseContext(t),n}function isDownloadFloatTextureEnabled(e){if(0===e)return !1;var t=getWebGLRenderingContext(e);if(1===e){if(!hasExtension(t,"OES_texture_float"))return !1}else if(!hasExtension(t,"EXT_color_buffer_float"))return !1;createFloatTextureAndBindToFramebuffer(t,e),t.readPixels(0,0,1,1,t.RGBA,t.FLOAT,new Float32Array(4));var n=t.getError()===t.NO_ERROR;return loseContext(t),n}function isWebGLGetBufferSubDataAsyncExtensionEnabled(e){if(e>0)return !1;if(2!==e)return !1;var t=getWebGLRenderingContext(e),n=hasExtension(t,"WEBGL_get_buffer_sub_data_async");return loseContext(t),n}function isChrome(){return null!=navigator&&null!=navigator.userAgent&&/Chrome/.test(navigator.userAgent)&&/Google Inc/.test(navigator.vendor)}var Environment=function(){function e(e){this.features={},this.registry={},null!=e&&(this.features=e),this.get("DEBUG")&&console.warn("Debugging mode is ON. The output of every math call will be downloaded to CPU and checked for NaNs. This significantly impacts performance.");}return e.setBackend=function(e,t){if(void 0===t&&(t=!1),!(e in ENV.registry))throw new Error("Backend type '"+e+"' not found in registry");ENV.initBackend(e,t);},e.getBackend=function(){return ENV.initDefaultBackend(),ENV.currentBackend},e.disposeVariables=function(){ENV.engine.disposeVariables();},e.memory=function(){return ENV.engine.memory()},e.prototype.get=function(e){return e in this.features?this.features[e]:(this.features[e]=this.evaluateFeature(e),this.features[e])},e.prototype.getFeatures=function(){return this.features},e.prototype.set=function(e,t){this.features[e]=t;},e.prototype.getBestBackendType=function(){var e=this;if(0===Object.keys(this.registry).length)throw new Error("No backend found in registry.");return Object.keys(this.registry).map(function(t){return {name:t,entry:e.registry[t]}}).sort(function(e,t){return t.entry.priority-e.entry.priority})[0].name},e.prototype.evaluateFeature=function(e){if("DEBUG"===e)return !1;if("IS_BROWSER"===e)return "undefined"!=typeof window;if("IS_NODE"===e)return "undefined"!=typeof process&&void 0!==process.versions.node;if("IS_CHROME"===e)return isChrome();if("BACKEND"===e)return this.getBestBackendType();if("WEBGL_DISJOINT_QUERY_TIMER_EXTENSION_VERSION"===e){var t=this.get("WEBGL_VERSION");return 0===t?0:getWebGLDisjointQueryTimerVersion(t)}if("WEBGL_DISJOINT_QUERY_TIMER_EXTENSION_RELIABLE"===e)return this.get("WEBGL_DISJOINT_QUERY_TIMER_EXTENSION_VERSION")>0&&!isMobile();if("WEBGL_VERSION"===e)return isWebGLVersionEnabled(2)?2:isWebGLVersionEnabled(1)?1:0;if("WEBGL_RENDER_FLOAT32_ENABLED"===e)return isRenderToFloatTextureEnabled(this.get("WEBGL_VERSION"));if("WEBGL_DOWNLOAD_FLOAT_ENABLED"===e)return isDownloadFloatTextureEnabled(this.get("WEBGL_VERSION"));if("WEBGL_GET_BUFFER_SUB_DATA_ASYNC_EXTENSION_ENABLED"===e)return isWebGLGetBufferSubDataAsyncExtensionEnabled(this.get("WEBGL_VERSION"));if("TEST_EPSILON"===e)return this.get("WEBGL_RENDER_FLOAT32_ENABLED")?TEST_EPSILON_FLOAT32_ENABLED:TEST_EPSILON_FLOAT32_DISABLED;throw new Error("Unknown feature "+e+".")},e.prototype.setFeatures=function(e){this.features=e;},e.prototype.reset=function(){this.features=getFeaturesFromURL(),null!=this.globalEngine&&(this.globalEngine=null);},e.prototype.initBackend=function(e,t){void 0===t&&(t=!1),this.currentBackend=e;var n=ENV.findBackend(e);this.globalEngine=new Engine(n,t);},e.prototype.findBackend=function(e){return e in this.registry?this.registry[e].backend:null},e.prototype.registerBackend=function(e,t,n){void 0===n&&(n=1),e in this.registry&&console.warn(e+" backend was already registered");try{var r=t();return this.registry[e]={backend:r,priority:n},!0}catch(t){return console.warn("Registration of backend "+e+" failed"),console.warn(t.stack||t.message),!1}},e.prototype.removeBackend=function(e){if(!(e in this.registry))throw new Error(e+" backend not found in registry");this.registry[e].backend.dispose(),delete this.registry[e];},Object.defineProperty(e.prototype,"engine",{get:function(){return this.initDefaultBackend(),this.globalEngine},enumerable:!0,configurable:!0}),e.prototype.initDefaultBackend=function(){null==this.globalEngine&&this.initBackend(ENV.get("BACKEND"),!1);},__decorate([doc({heading:"Environment"})],e,"setBackend",null),__decorate([doc({heading:"Environment"})],e,"getBackend",null),__decorate([doc({heading:"Environment"})],e,"disposeVariables",null),__decorate([doc({heading:"Performance",subheading:"Memory"})],e,"memory",null),e}(),TENSORFLOWJS_FLAGS_PREFIX="tfjsflags";function getFeaturesFromURL(){var e={};if("undefined"==typeof window||void 0===window.location)return e;var t=getQueryParams(window.location.search);if(TENSORFLOWJS_FLAGS_PREFIX in t){var n={};t[TENSORFLOWJS_FLAGS_PREFIX].split(",").forEach(function(e){var t=e.split(":"),r=t[0],a=t[1];n[r]=a;}),URL_PROPERTIES.forEach(function(t){t.name in n&&(console.log("Setting feature override from URL "+t.name+": "+n[t.name]),t.type===Type.NUMBER?e[t.name]=+n[t.name]:t.type===Type.BOOLEAN?e[t.name]="true"===n[t.name]:t.type===Type.STRING?e[t.name]=n[t.name]:console.warn("Unknown URL param: "+t.name+"."));});}return e}function getGlobalNamespace(){var e;if("undefined"!=typeof window)e=window;else{if("undefined"==typeof global)throw new Error("Could not find a global object");e=global;}return e}function getOrMakeEnvironment(){var e=getGlobalNamespace();return e.ENV=e.ENV||new Environment(getFeaturesFromURL()),e.ENV}var ENV=getOrMakeEnvironment(),environment=Object.freeze({get Type(){return Type},URL_PROPERTIES:URL_PROPERTIES,Environment:Environment,ENV:ENV}),PARALLELIZE_THRESHOLD=30;function computeOptimalWindowSize(e){return e<=PARALLELIZE_THRESHOLD?e:nearestDivisor(e,Math.floor(Math.sqrt(e)))}function segOpComputeOptimalWindowSize(e,t){var n,r=!1;for(e<=PARALLELIZE_THRESHOLD?(n=e,r=!0):n=nearestDivisor(e,Math.floor(Math.sqrt(e)));!r;){if(n>t||n===e){r=!0;break}n=nearestDivisor(e,n+1);}return n}function computeOutShape$1(e,t,n){for(var r=[],a=e.length,o=0;o":"<",u=n?"inOffset + i;":"round(getBestIndicesA(batch, inOffset + i));";this.userCode="\n void main() {\n ivec2 coords = getOutputCoords();\n int batch = coords[0];\n int outIdx = coords[1];\n int inOffset = outIdx * "+r+";\n\n int bestIndex = 0;\n float bestValue = getA(batch, inOffset);\n\n for (int i = 0; i < "+r+"; i++) {\n int inIdx = "+u+";\n float candidate = getA(batch, inIdx);\n if (candidate "+s+" bestValue) {\n bestValue = candidate;\n bestIndex = inIdx;\n }\n }\n setOutput(float(bestIndex));\n }\n ";}}(),AvgPool2DBackpropProgram=function(){return function(e){this.variableNames=["dy"],this.outputShape=e.inShape;var t=e.filterHeight,n=e.filterWidth,r=e.strideHeight,a=e.strideWidth,o=t-1-e.padInfo.top,i=n-1-e.padInfo.left,s=1/(t*n);this.userCode="\n const ivec2 pads = ivec2("+o+", "+i+");\n const float avgMultiplier = float("+s+");\n\n void main() {\n ivec4 coords = getOutputCoords();\n int b = coords[0];\n int d = coords[3];\n\n ivec2 dyRCCorner = coords.yz - pads;\n int dyRCorner = dyRCCorner.x;\n int dyCCorner = dyRCCorner.y;\n\n // Convolve dy(?, ?, d) with pos mask(:, :, d) to get dx(xR, xC, d).\n // ? = to be determined. : = across all values in that axis.\n float dotProd = 0.0;\n for (int wR = 0; wR < "+t+"; wR++) {\n float dyR = float(dyRCorner + wR) / "+r+".0;\n\n if (dyR < 0.0 || dyR >= "+e.outHeight+".0 || fract(dyR) > 0.0) {\n continue;\n }\n int idyR = int(dyR);\n\n for (int wC = 0; wC < "+n+"; wC++) {\n float dyC = float(dyCCorner + wC) / "+a+".0;\n\n if (dyC < 0.0 || dyC >= "+e.outWidth+".0 ||\n fract(dyC) > 0.0) {\n continue;\n }\n int idyC = int(dyC);\n\n float dyValue = getDy(b, idyR, idyC, d);\n\n dotProd += dyValue * avgMultiplier;\n }\n }\n setOutput(dotProd);\n }\n ";}}(),BatchNormProgram=function(){return function(e,t,n,r,a,o){this.outputShape=[],this.supportsBroadcasting=!0,this.variableNames=["x","mean","variance"],assertAndGetBroadcastShape(e,t),assertAndGetBroadcastShape(e,n);var i="0.0";null!=r&&(assertAndGetBroadcastShape(e,r),this.variableNames.push("offset"),i="getOffsetAtOutCoords()");var s="1.0";null!=a&&(assertAndGetBroadcastShape(e,a),this.variableNames.push("scale"),s="getScaleAtOutCoords()"),this.outputShape=e,this.userCode="\n void main() {\n float x = getXAtOutCoords();\n float mean = getMeanAtOutCoords();\n float variance = getVarianceAtOutCoords();\n float offset = "+i+";\n float scale = "+s+";\n float inv = scale * inversesqrt(variance + float("+o+"));\n setOutput((x - mean) * inv + offset);\n }\n ";}}(),CHECK_NAN_SNIPPET="\n if (isNaN(a)) return a;\n if (isNaN(b)) return b;\n",ADD="return a + b;",SUB="return a - b;",MUL="return a * b;",DIV="return a / b;",INT_DIV="\n float resultSign = sign(a) * sign(b);\n int ia = round(a);\n int ib = round(b);\n int result = ia / ib;\n int amodb = ia - ib * result;\n\n if (resultSign < 0.0 && amodb != 0) {\n result -= 1;\n }\n return float(result);\n",POW="\n return (round(mod(b, 2.0)) == 0 || round(mod(b, 2.0)) == 2) ?\n pow(abs(a), b) : sign(a) * pow(abs(a), b);\n",SQUARED_DIFFERENCE="return (a - b) * (a - b);",EQUAL="return float(a == b);",NOT_EQUAL="return float(a != b);",LESS="return float(a < b);",LESS_EQUAL="return float(a <= b);",GREATER="return float(a > b);",GREATER_EQUAL="return float(a >= b);",LOGICAL_AND="return float(a >= 1.0 && b >= 1.0);",LOGICAL_OR="return float(a >= 1.0 || b >= 1.0);",MAX=CHECK_NAN_SNIPPET+"\n return max(a, b);\n",MIN=CHECK_NAN_SNIPPET+"\n return min(a, b);\n",MOD="return mod(a, b);",ATAN2=CHECK_NAN_SNIPPET+"\n return atan(a, b);\n",ELU_DER="return (b >= 1.0) ? a : a * (b + 1.0);",BinaryOpProgram=function(){return function(e,t,n){this.variableNames=["A","B"],this.supportsBroadcasting=!0,this.outputShape=assertAndGetBroadcastShape(t,n),this.userCode="\n float binaryOperation(float a, float b) {\n "+e+"\n }\n\n void main() {\n float a = getAAtOutCoords();\n float b = getBAtOutCoords();\n setOutput(binaryOperation(a, b));\n }\n ";}}(),ClipProgram=function(){return function(e,t,n){this.variableNames=["A"],this.outputShape=e;var r=t.toFixed(20),a=n.toFixed(20);this.userCode="\n void main() {\n float value = getAAtOutCoords();\n if (isNaN(value)) {\n setOutput(value);\n return;\n }\n\n setOutput(clamp(value, "+r+", "+a+"));\n }\n ";}}(),ConcatProgram=function(){return function(e,t){this.variableNames=["A","B"],this.outputShape=[],this.outputShape=computeOutShape(e,t,1),this.userCode="\n void main() {\n ivec2 coords = getOutputCoords();\n int yR = coords.x;\n int yC = coords.y;\n\n float value = 0.0;\n if (yC < "+e[1]+") {\n value = getA(yR, yC);\n } else {\n yC -= "+e[1]+";\n value = getB(yR, yC);\n }\n\n setOutput(value);\n }\n ";}}(),Conv2DDerFilterProgram=function(){return function(e){this.variableNames=["x","dy"],this.outputShape=e.filterShape;var t=e.strideHeight,n=e.strideWidth,r=e.padInfo.top,a=e.padInfo.left;this.userCode="\n void main() {\n ivec4 coords = getOutputCoords();\n int wR = coords.x;\n int wC = coords.y;\n int d1 = coords.z;\n int d2 = coords.w;\n\n // Convolve x(?, ?, d1) with dy(:, :, d2) to get dw(wR, wC, d1, d2).\n // ? = to be determined. : = across all values in that axis.\n float dotProd = 0.0;\n\n for (int b = 0; b < "+e.batchSize+"; b++) {\n for (int yR = 0; yR < "+e.outHeight+"; yR++) {\n int xR = wR + yR * "+t+" - "+r+";\n\n if (xR < 0 || xR >= "+e.inHeight+") {\n continue;\n }\n\n for (int yC = 0; yC < "+e.outWidth+"; yC++) {\n int xC = wC + yC * "+n+" - "+a+";\n\n if (xC < 0 || xC >= "+e.inWidth+") {\n continue;\n }\n\n float dyValue = getDy(b, yR, yC, d2);\n float xValue = getX(b, xR, xC, d1);\n dotProd += (xValue * dyValue);\n }\n }\n }\n setOutput(dotProd);\n }\n ";}}(),Conv2DDerInputProgram=function(){return function(e){this.variableNames=["dy","W"],this.outputShape=e.inShape;var t=e.filterHeight,n=e.filterWidth,r=e.strideHeight,a=e.strideWidth,o=t-1-e.padInfo.top,i=n-1-e.padInfo.left;this.userCode="\n const ivec2 pads = ivec2("+o+", "+i+");\n\n void main() {\n ivec4 coords = getOutputCoords();\n int batch = coords[0];\n int d1 = coords[3];\n\n ivec2 dyCorner = coords.yz - pads;\n int dyRCorner = dyCorner.x;\n int dyCCorner = dyCorner.y;\n\n // Convolve dy(?, ?, d2) with w(:, :, d1, d2) to compute dx(xR, xC, d1).\n // ? = to be determined. : = across all values in that axis.\n float dotProd = 0.0;\n for (int wR = 0; wR < "+t+"; wR++) {\n float dyR = float(dyRCorner + wR) / "+r+".0;\n\n if (dyR < 0.0 || dyR >= "+e.outHeight+".0 || fract(dyR) > 0.0) {\n continue;\n }\n int idyR = int(dyR);\n\n int wRPerm = "+t+" - 1 - wR;\n\n for (int wC = 0; wC < "+n+"; wC++) {\n float dyC = float(dyCCorner + wC) / "+a+".0;\n\n if (dyC < 0.0 || dyC >= "+e.outWidth+".0 ||\n fract(dyC) > 0.0) {\n continue;\n }\n int idyC = int(dyC);\n\n int wCPerm = "+n+" - 1 - wC;\n\n for (int d2 = 0; d2 < "+e.outChannels+"; d2++) {\n float xValue = getDy(batch, idyR, idyC, d2);\n float wValue = getW(wRPerm, wCPerm, d1, d2);\n dotProd += xValue * wValue;\n }\n }\n }\n setOutput(dotProd);\n }\n ";}}(),DepthwiseConv2DDerFilterProgram=function(){return function(e){this.variableNames=["x","dy"],this.outputShape=e.filterShape;var t=e.strideHeight,n=e.strideWidth,r=e.padInfo.top,a=e.padInfo.left,o=e.outChannels/e.inChannels;this.userCode="\n void main() {\n ivec4 coords = getOutputCoords();\n int wR = coords.x;\n int wC = coords.y;\n int d1 = coords.z;\n int dm = coords.w;\n int d2 = d1 * "+o+" + dm;\n\n float dotProd = 0.0;\n\n // TODO: Vec4 over the batch size\n for (int b = 0; b < "+e.batchSize+"; b++) {\n for (int yR = 0; yR < "+e.outHeight+"; yR++) {\n int xR = wR + yR * "+t+" - "+r+";\n\n if (xR < 0 || xR >= "+e.inHeight+") {\n continue;\n }\n\n for (int yC = 0; yC < "+e.outWidth+"; yC++) {\n int xC = wC + yC * "+n+" - "+a+";\n\n if (xC < 0 || xC >= "+e.inWidth+") {\n continue;\n }\n\n float dyValue = getDy(b, yR, yC, d2);\n float xValue = getX(b, xR, xC, d1);\n dotProd += (xValue * dyValue);\n }\n }\n }\n setOutput(dotProd);\n }\n ";}}(),DepthwiseConv2DDerInputProgram=function(){return function(e){this.variableNames=["dy","W"],this.outputShape=e.inShape;var t=e.filterHeight,n=e.filterWidth,r=e.strideHeight,a=e.strideWidth,o=t-1-e.padInfo.top,i=n-1-e.padInfo.left,s=e.outChannels/e.inChannels;this.userCode="\n const ivec2 pads = ivec2("+o+", "+i+");\n\n void main() {\n ivec4 coords = getOutputCoords();\n int batch = coords[0];\n int d1 = coords[3];\n ivec2 dyCorner = coords.yz - pads;\n int dyRCorner = dyCorner.x;\n int dyCCorner = dyCorner.y;\n\n float dotProd = 0.0;\n\n for (int wR = 0; wR < "+t+"; wR++) {\n float dyR = float(dyRCorner + wR) / "+r+".0;\n\n if (dyR < 0.0 || dyR >= "+e.outHeight+".0 || fract(dyR) > 0.0) {\n continue;\n }\n int idyR = int(dyR);\n\n int wRPerm = "+t+" - 1 - wR;\n\n for (int wC = 0; wC < "+n+"; wC++) {\n float dyC = float(dyCCorner + wC) / "+a+".0;\n\n if (dyC < 0.0 || dyC >= "+e.outWidth+".0 ||\n fract(dyC) > 0.0) {\n continue;\n }\n int idyC = int(dyC);\n\n int wCPerm = "+n+" - 1 - wC;\n\n // TODO: Vec4 over the channelMul\n for (int dm = 0; dm < "+s+"; dm++) {\n int d2 = d1 * "+s+" + dm;\n float xValue = getDy(batch, idyR, idyC, d2);\n float wValue = getW(wRPerm, wCPerm, d1, dm);\n dotProd += xValue * wValue;\n }\n }\n }\n setOutput(dotProd);\n }\n ";}}(),Conv2DProgram=function(){return function(e){this.variableNames=["x","W"],this.outputShape=e.outShape;var t=e.padInfo.top,n=e.padInfo.left,r=e.strideHeight,a=e.strideWidth,o=e.dilationHeight,i=e.dilationWidth,s=e.filterHeight,u=e.filterWidth,l=4*Math.floor(e.inChannels/4),c=e.inChannels%4;this.userCode="\n const ivec2 strides = ivec2("+r+", "+a+");\n const ivec2 pads = ivec2("+t+", "+n+");\n\n void main() {\n ivec4 coords = getOutputCoords();\n int batch = coords[0];\n int d2 = coords[3];\n\n ivec2 xRCCorner = coords.yz * strides - pads;\n int xRCorner = xRCCorner.x;\n int xCCorner = xRCCorner.y;\n\n // Convolve x(?, ?, d1) with w(:, :, d1, d2) to get y(yR, yC, d2).\n // ? = to be determined. : = across all values in that axis.\n float dotProd = 0.0;\n for (int wR = 0; wR < "+s+"; wR++) {\n int xR = xRCorner + wR * "+o+";\n\n if (xR < 0 || xR >= "+e.inHeight+") {\n continue;\n }\n\n for (int wC = 0; wC < "+u+"; wC++) {\n int xC = xCCorner + wC * "+i+";\n\n if (xC < 0 || xC >= "+e.inWidth+") {\n continue;\n }\n\n for (int d1 = 0; d1 < "+l+"; d1 += 4) {\n vec4 xValues = vec4(\n getX(batch, xR, xC, d1),\n getX(batch, xR, xC, d1 + 1),\n getX(batch, xR, xC, d1 + 2),\n getX(batch, xR, xC, d1 + 3)\n );\n vec4 wValues = vec4(\n getW(wR, wC, d1, d2),\n getW(wR, wC, d1 + 1, d2),\n getW(wR, wC, d1 + 2, d2),\n getW(wR, wC, d1 + 3, d2)\n );\n\n dotProd += dot(xValues, wValues);\n }\n\n if ("+(1===c)+") {\n dotProd +=\n getX(batch, xR, xC, "+l+") *\n getW(wR, wC, "+l+", d2);\n } else if ("+(2===c)+") {\n vec2 xValues = vec2(\n getX(batch, xR, xC, "+l+"),\n getX(batch, xR, xC, "+l+" + 1)\n );\n vec2 wValues = vec2(\n getW(wR, wC, "+l+", d2),\n getW(wR, wC, "+l+" + 1, d2)\n );\n dotProd += dot(xValues, wValues);\n } else if ("+(3===c)+") {\n vec3 xValues = vec3(\n getX(batch, xR, xC, "+l+"),\n getX(batch, xR, xC, "+l+" + 1),\n getX(batch, xR, xC, "+l+" + 2)\n );\n vec3 wValues = vec3(\n getW(wR, wC, "+l+", d2),\n getW(wR, wC, "+l+" + 1, d2),\n getW(wR, wC, "+l+" + 2, d2)\n );\n dotProd += dot(xValues, wValues);\n }\n }\n }\n setOutput(dotProd);\n }\n ";}}(),DepthwiseConv2DProgram=function(){return function(e){this.variableNames=["x","W"],this.outputShape=e.outShape;var t=e.inHeight,n=e.inWidth,r=e.padInfo.top,a=e.padInfo.left,o=e.strideHeight,i=e.strideWidth,s=e.dilationHeight,u=e.dilationWidth,l=e.filterHeight,c=e.filterWidth,d=e.outChannels/e.inChannels;this.userCode="\n const ivec2 strides = ivec2("+o+", "+i+");\n const ivec2 pads = ivec2("+r+", "+a+");\n\n void main() {\n ivec4 coords = getOutputCoords();\n int batch = coords.x;\n ivec2 xRCCorner = coords.yz * strides - pads;\n int d2 = coords.w;\n int d1 = d2 / "+d+";\n int q = d2 - d1 * "+d+";\n\n int xRCorner = xRCCorner.x;\n int xCCorner = xRCCorner.y;\n\n // Convolve x(?, ?, d1) with w(:, :, d1, q) to get y(yR, yC, d2).\n // ? = to be determined. : = across all values in that axis.\n float dotProd = 0.0;\n // TODO(dsmilkov): Flatten the two for loops and vec4 the operations.\n for (int wR = 0; wR < "+l+"; wR++) {\n int xR = xRCorner + wR * "+s+";\n\n if (xR < 0 || xR >= "+t+") {\n continue;\n }\n\n for (int wC = 0; wC < "+c+"; wC++) {\n int xC = xCCorner + wC * "+u+";\n\n if (xC < 0 || xC >= "+n+") {\n continue;\n }\n\n float xVal = getX(batch, xR, xC, d1);\n float wVal = getW(wR, wC, d1, q);\n dotProd += xVal * wVal;\n }\n }\n setOutput(dotProd);\n }\n ";}}();function makeShader(e,t,n,r){var a=e.map(function(e){var t=sizeFromShape(e.shapeInfo.logicalShape);return e.shapeInfo.isUniform?"uniform float "+e.name+(t>1?"["+t+"]":"")+";":"uniform sampler2D "+e.name+";"});a=a.join("\n");var o=e.map(function(e){return getInputSamplingSnippet(e,t,r)}).join("\n"),i=t.texShape,s=getOutputSamplingSnippet(t.logicalShape,i);return [SHADER_PREFIX,FLOAT_TEXTURE_SAMPLE_SNIPPET,FLOAT_TEXTURE_SETOUTPUT_SNIPPET,a,s,o,n].join("\n")}function getSamplerFromInInfo(e){var t=e.shapeInfo.logicalShape;switch(t.length){case 0:return getSamplerScalar(e);case 1:return getSampler1D(e);case 2:return getSampler2D(e);case 3:return getSampler3D(e);case 4:return getSampler4D(e);case 5:return getSampler5D(e);case 6:return getSampler6D(e);default:throw new Error(t.length+"-D input sampling is not yet supported")}}function getInputSamplingSnippet(e,t,n){var r=getSamplerFlat(e);return r+=getSamplerFromInInfo(e),(n||arraysEqual(e.shapeInfo.logicalShape,t.logicalShape))&&(r+=getSamplerAtOutputCoords(e,t,n)),r}function getOutputSamplingSnippet(e,t){switch(e.length){case 0:return getOutputScalarCoords();case 1:return getOutput1DCoords(e,t);case 2:return getOutput2DCoords(e,t);case 3:return getOutput3DCoords(e,t);case 4:return getOutput4DCoords(e,t);case 5:return getOutput5DCoords(e,t);case 6:return getOutput6DCoords(e,t);default:throw new Error(e.length+"-D output sampling is not yet supported")}}var SAMPLE_1D_SNIPPET="\nvec2 UVfrom1D(int texNumR, int texNumC, int index) {\n int texR = index / texNumC;\n int texC = index - texR * texNumC;\n return (vec2(texC, texR) + halfCR) / vec2(texNumC, texNumR);\n}\n",SAMPLE_2D_SNIPPET="\nvec2 UVfrom2D(int texNumR, int texNumC, int numC, int row, int col) {\n int index = row * numC + col;\n int texR = index / texNumC;\n int texC = index - texR * texNumC;\n return (vec2(texC, texR) + halfCR) / vec2(texNumC, texNumR);\n}\n",SAMPLE_3D_SNIPPET="\nvec2 UVfrom3D(int texNumR, int texNumC, int stride0,\n int stride1, int row, int col, int depth) {\n // Explicitly use integer operations as dot() only works on floats.\n int index = row * stride0 + col * stride1 + depth;\n int texR = index / texNumC;\n int texC = index - texR * texNumC;\n return (vec2(texC, texR) + halfCR) / vec2(texNumC, texNumR);\n}\n",SAMPLE_4D_SNIPPET="\nvec2 UVfrom4D(int texNumR, int texNumC, int stride0,\n int stride1, int stride2, int row, int col, int depth,\n int depth2) {\n // Explicitly use integer operations as dot() only works on floats.\n int index = row * stride0 + col * stride1 + depth * stride2 + depth2;\n int texR = index / texNumC;\n int texC = index - texR * texNumC;\n return (vec2(texC, texR) + halfCR) / vec2(texNumC, texNumR);\n}\n",SAMPLE_5D_SNIPPET="\nvec2 UVfrom5D(int texNumR, int texNumC, int stride0,\n int stride1, int stride2, int stride3, int row, int col, int depth,\n int depth2, int depth3) {\n // Explicitly use integer operations as dot() only works on floats.\n int index = row * stride0 + col * stride1 +\n depth * stride2 + depth2 * stride3 + depth3;\n int texR = index / texNumC;\n int texC = index - texR * texNumC;\n return (vec2(texC, texR) + halfCR) / vec2(texNumC, texNumR);\n}\n",SAMPLE_6D_SNIPPET="\nvec2 UVfrom6D(int texNumR, int texNumC, int stride0,\n int stride1, int stride2, int stride3, int stride4,\n int row, int col, int depth, int depth2, int depth3, int depth4) {\n // Explicitly use integer operations as dot() only works on floats.\n int index = row * stride0 + col * stride1 + depth * stride2 + depth2 *\n stride3 + depth3 * stride4 + depth4;\n int texR = index / texNumC;\n int texC = index - texR * texNumC;\n return (vec2(texC, texR) + halfCR) / vec2(texNumC, texNumR);\n}\n",FLOAT_TEXTURE_SAMPLE_SNIPPET="\n float sampleTexture(sampler2D textureSampler, vec2 uv) {\n return texture2D(textureSampler, uv).r;\n }\n",FLOAT_TEXTURE_SETOUTPUT_SNIPPET="\n void setOutput(float val) {\n gl_FragColor = vec4(val, 0, 0, 0);\n }\n",SHADER_PREFIX="\n precision highp float;\n precision highp int;\n varying vec2 resultUV;\n const vec2 halfCR = vec2(0.5, 0.5);\n\n struct ivec5\n {\n int x;\n int y;\n int z;\n int w;\n int u;\n };\n\n struct ivec6\n {\n int x;\n int y;\n int z;\n int w;\n int u;\n int v;\n };\n\n bool isNaN(float val) {\n return (val < 0.0 || 0.0 < val || val == 0.0) ? false : true;\n }\n\n bool hasNaN(vec4 values) {\n vec4 v1 = values * values;\n vec4 v2 = values * values;\n return any(notEqual(v1, v2));\n }\n\n float getNaN(vec4 values) {\n return dot(vec4(1), values);\n }\n\n int round(float value) {\n return int(floor(value + 0.5));\n }\n\n int imod(int x, int y) {\n return x - y * (x / y);\n }\n\n //Based on the work of Dave Hoskins\n //https://www.shadertoy.com/view/4djSRW\n #define HASHSCALE1 443.8975\n float random(float seed){\n vec2 p = resultUV * seed;\n vec3 p3 = fract(vec3(p.xyx) * HASHSCALE1);\n p3 += dot(p3, p3.yzx + 19.19);\n return fract((p3.x + p3.y) * p3.z);\n }\n\n "+SAMPLE_1D_SNIPPET+"\n "+SAMPLE_2D_SNIPPET+"\n "+SAMPLE_3D_SNIPPET+"\n "+SAMPLE_4D_SNIPPET+"\n "+SAMPLE_5D_SNIPPET+"\n "+SAMPLE_6D_SNIPPET+"\n";function getOutputScalarCoords(){return "\n int getOutputCoords() {\n return 0;\n }\n "}function getOutput1DCoords(e,t){return 1===t[0]?"\n int getOutputCoords() {\n return int(resultUV.x * "+t[1]+".0);\n }\n ":1===t[1]?"\n int getOutputCoords() {\n return int(resultUV.y * "+t[0]+".0);\n }\n ":"\n int getOutputCoords() {\n ivec2 resTexRC = ivec2(resultUV.yx *\n vec2("+t[0]+", "+t[1]+"));\n return resTexRC.x * "+t[1]+" + resTexRC.y;\n }\n "}function getOutput3DCoords(e,t){var n=e[1]*e[2],r=e[2];return "\n ivec3 getOutputCoords() {\n ivec2 resTexRC = ivec2(resultUV.yx *\n vec2("+t[0]+", "+t[1]+"));\n int index = resTexRC.x * "+t[1]+" + resTexRC.y;\n int r = index / "+n+";\n index -= r * "+n+";\n int c = index / "+r+";\n int d = index - c * "+r+";\n return ivec3(r, c, d);\n }\n "}function getOutput4DCoords(e,t){var n=e[3],r=e[2]*n,a=e[1]*r;return "\n ivec4 getOutputCoords() {\n ivec2 resTexRC = ivec2(resultUV.yx *\n vec2("+t[0]+", "+t[1]+"));\n int index = resTexRC.x * "+t[1]+" + resTexRC.y;\n\n int r = index / "+a+";\n index -= r * "+a+";\n\n int c = index / "+r+";\n index -= c * "+r+";\n\n int d = index / "+n+";\n int d2 = index - d * "+n+";\n\n return ivec4(r, c, d, d2);\n }\n "}function getOutput5DCoords(e,t){var n=e[4],r=e[3]*n,a=e[2]*r,o=e[1]*a;return "\n ivec5 getOutputCoords() {\n ivec2 resTexRC = ivec2(resultUV.yx * vec2("+t[0]+",\n "+t[1]+"));\n\n int index = resTexRC.x * "+t[1]+" + resTexRC.y;\n\n int r = index / "+o+";\n index -= r * "+o+";\n\n int c = index / "+a+";\n index -= c * "+a+";\n\n int d = index / "+r+";\n index -= d * "+r+";\n\n int d2 = index / "+n+";\n int d3 = index - d2 * "+n+";\n\n ivec5 outShape = ivec5(r, c, d, d2, d3);\n return outShape;\n }\n "}function getOutput6DCoords(e,t){var n=e[5],r=e[4]*n,a=e[3]*r,o=e[2]*a,i=e[1]*o;return "\n ivec6 getOutputCoords() {\n ivec2 resTexRC = ivec2(resultUV.yx *\n vec2("+t[0]+", "+t[1]+"));\n int index = resTexRC.x * "+t[1]+" + resTexRC.y;\n\n int r = index / "+i+";\n index -= r * "+i+";\n\n int c = index / "+o+";\n index -= c * "+o+";\n\n int d = index / "+a+";\n index -= d * "+a+";\n\n int d2 = index / "+r+";\n index -= d2 * "+r+";\n\n int d3 = index / "+n+";\n int d4 = index - d3 * "+n+";\n\n ivec6 result = ivec6(r, c, d, d2, d3, d4);\n return result;\n }\n "}function getOutput2DCoords(e,t){return arraysEqual(e,t)?"\n ivec2 getOutputCoords() {\n return ivec2(resultUV.yx * vec2("+t[0]+", "+t[1]+"));\n }\n ":1===e[1]?"\n ivec2 getOutputCoords() {\n ivec2 resTexRC = ivec2(resultUV.yx *\n vec2("+t[0]+", "+t[1]+"));\n int index = resTexRC.x * "+t[1]+" + resTexRC.y;\n return ivec2(index, 0);\n }\n ":1===e[0]?"\n ivec2 getOutputCoords() {\n ivec2 resTexRC = ivec2(resultUV.yx *\n vec2("+t[0]+", "+t[1]+"));\n int index = resTexRC.x * "+t[1]+" + resTexRC.y;\n return ivec2(0, index);\n }\n ":"\n ivec2 getOutputCoords() {\n ivec2 resTexRC = ivec2(resultUV.yx *\n vec2("+t[0]+", "+t[1]+"));\n int index = resTexRC.x * "+t[1]+" + resTexRC.y;\n int r = index / "+e[1]+";\n int c = index - r * "+e[1]+";\n return ivec2(r, c);\n }\n "}function getSamplerScalar(e){var t=e.name,n="get"+t.charAt(0).toUpperCase()+t.slice(1);return e.shapeInfo.isUniform?"float "+n+"() {return "+t+";}":"\n float "+n+"() {\n return sampleTexture("+t+", halfCR);\n }\n "}function getSampler1D(e){var t=e.name,n="get"+t.charAt(0).toUpperCase()+t.slice(1);return "\n float "+n+"(int index) {\n return "+n+"Flat(index);\n }\n "}function getSampler2D(e){var t=e.shapeInfo.logicalShape,n=e.name,r="get"+n.charAt(0).toUpperCase()+n.slice(1),a=e.shapeInfo.texShape;if(null!=a&&arraysEqual(t,a)){var o=a[0];return "\n float "+r+"(int row, int col) {\n vec2 uv = (vec2(col, row) + halfCR) / vec2("+a[1]+".0, "+o+".0);\n return sampleTexture("+n+", uv);\n }\n "}var i=squeezeShape(t),s=i.newShape,u=i.keptDims,l=s;if(l.length=1?"coords = 0;":s.map(function(e){return "coords["+(e+u)+"] = 0;"}).join("\n"))+"\n return get"+n+"("+(o<2&&a>0?"coords":e.shapeInfo.logicalShape.map(function(e,t){return "coords["+(t+u)+"]"}).join(", "))+");\n }\n "}function getSamplerAtOutputCoords(e,t,n){var r=e.name,a=r.charAt(0).toUpperCase()+r.slice(1),o="get"+a+"AtOutCoords",i=getBroadcastDims(e.shapeInfo.logicalShape,t.logicalShape),s=e.shapeInfo.logicalShape.length,u=t.logicalShape.length,l=n&&(u>s||i.length>0),c=broadcastDimsAreOuter(i),d=e.shapeInfo.isUniform;if(l&&!c)return getBroadcastOutputCoordsSampler(e,t,a,o);var p=sizeFromShape(e.shapeInfo.logicalShape),h="";l&&c&&(h="\n int mainPart = index / "+p+";\n index -= mainPart * "+p+";\n ");var f=t.texShape;if(d)return 1===p?"float "+o+"() {return "+r+";}":"\n float "+o+"() {\n ivec2 resTexRC = ivec2(resultUV.yx *\n vec2("+f[0]+", "+f[1]+"));\n int index = resTexRC.x * "+f[1]+" + resTexRC.y;\n "+h+"\n return get"+a+"Flat(index);\n }\n ";var g=e.shapeInfo.texShape;return arraysEqual(g,f)?"\n float "+o+"() {\n return sampleTexture("+r+", resultUV);\n }\n ":"\n float "+o+"() {\n ivec2 resTexRC = ivec2(resultUV.yx *\n vec2("+f[0]+", "+f[1]+"));\n int index = resTexRC.x * "+f[1]+" + resTexRC.y;\n "+h+"\n int texR = index / "+g[1]+";\n int texC = index - texR * "+g[1]+";\n vec2 uv = (vec2(texC, texR) + halfCR) /\n vec2("+g[1]+".0, "+g[0]+".0);\n\n return sampleTexture("+r+", uv);\n }\n "}function getCoordsDataType(e){if(e<=1)return "int";if(2===e)return "ivec2";if(3===e)return "ivec3";if(4===e)return "ivec4";if(5===e)return "ivec5";if(6===e)return "ivec6";throw Error("GPU for rank "+e+" is not yet supported")}function squeezeInputInfo(e,t){var n=JSON.parse(JSON.stringify(e));return n.shapeInfo.logicalShape=t,n}function getSqueezedParams(e,t){return t.map(function(t){return e[t]}).join(", ")}var CumSumProgram=function(){return function(e,t,n){this.variableNames=["x"],this.outputShape=e;var r=e.length,a=e[e.length-1],o=n?"<":">";this.userCode="\n int getIndex(int i) {\n "+(n?"return "+a+" -i - 1;":"return i;")+"\n }\n\n void main() {\n "+getCoordsDataType(r)+" coords = getOutputCoords();\n int end = "+getFinalCoord(r,"coords")+";\n float val = 0.0;\n for (int i = "+a+" - 1; i >= 0; i -= 1) {\n int idx = getIndex(i);\n if (idx "+o+" end) {\n continue;\n }\n if (idx == end && "+t+") {\n continue;\n }\n "+getFinalCoord(r,"coords")+" = idx;\n val += getX("+getCoords(r,"coords")+");\n }\n setOutput(val);\n }\n ";}}();function getCoords(e,t){if(1===e)return ""+t;if(2===e)return t+".x, "+t+".y";if(3===e)return t+".x, "+t+".y, "+t+".z";if(4===e)return t+".x, "+t+".y, "+t+".z, "+t+".w";throw Error("Cumulative sum for rank "+e+" is not yet supported")}function getFinalCoord(e,t){if(1===e)return ""+t;if(2===e)return t+".y";if(3===e)return t+".z";if(4===e)return t+".w";throw Error("Cumulative sum for rank "+e+" is not yet supported")}var TextureUsage,PhysicalTextureType,EncodeFloatProgram=function(){return function(e){this.variableNames=["A"],this.outputShape=e,this.userCode="\n const float FLOAT_MAX = 1.70141184e38;\n const float FLOAT_MIN = 1.17549435e-38;\n\n lowp vec4 encode_float(highp float v) {\n if (isNaN(v)) {\n return vec4(255, 255, 255, 255);\n }\n\n highp float av = abs(v);\n\n if(av < FLOAT_MIN) {\n return vec4(0.0, 0.0, 0.0, 0.0);\n } else if(v > FLOAT_MAX) {\n return vec4(0.0, 0.0, 128.0, 127.0) / 255.0;\n } else if(v < -FLOAT_MAX) {\n return vec4(0.0, 0.0, 128.0, 255.0) / 255.0;\n }\n\n highp vec4 c = vec4(0,0,0,0);\n\n highp float e = floor(log2(av));\n highp float m = exp2(fract(log2(av))) - 1.0;\n\n c[2] = floor(128.0 * m);\n m -= c[2] / 128.0;\n c[1] = floor(32768.0 * m);\n m -= c[1] / 32768.0;\n c[0] = floor(8388608.0 * m);\n\n highp float ebias = e + 127.0;\n c[3] = floor(ebias / 2.0);\n ebias -= c[3] * 2.0;\n c[2] += floor(ebias) * 128.0;\n\n c[3] += 128.0 * step(0.0, -v);\n\n return c / 255.0;\n }\n\n void main() {\n float x = getAAtOutCoords();\n gl_FragColor = encode_float(x);\n }\n ";}}(),FromPixelsProgram=function(){return function(e){this.variableNames=["A"];var t=e[0],n=e[1];this.outputShape=e,this.userCode="\n void main() {\n ivec3 coords = getOutputCoords();\n int texR = coords[0];\n int texC = coords[1];\n int depth = coords[2];\n vec2 uv = (vec2(texC, texR) + halfCR) / vec2("+n+".0, "+t+".0);\n\n vec4 values = texture2D(A, uv);\n float value;\n if (depth == 0) {\n value = values.r;\n } else if (depth == 1) {\n value = values.g;\n } else if (depth == 2) {\n value = values.b;\n } else if (depth == 3) {\n value = values.a;\n }\n\n setOutput(floor(value * 255.0 + 0.5));\n }\n ";}}(),GatherProgram=function(){return function(e,t,n){this.variableNames=["A","indices"];var r=e.slice();r[n]=t,this.outputShape=r,this.rank=r.length;var a=getCoordsDataType(this.rank),o=getSourceCoords(e,n);this.userCode="\n void main() {\n "+a+" resRC = getOutputCoords();\n setOutput(getA("+o+"));\n }\n ";}}();function getSourceCoords(e,t){var n=e.length;if(n>4)throw Error("Gather for rank "+n+" is not yet supported");if(1===n)return "int(getIndices(resRC))";for(var r=["resRC.x","resRC.y","resRC.z","resRC.w"],a=[],o=0;o= "+r);for(var a=0,o=0;o= "+r);for(var a=0,o=0;o= "+a);for(var o=getPackedMatrixTextureShapeWidthHeight(t,n),i=o[0],s=o[1],u=n%2==1,l=t%2==1,c=Math.floor(n/2),d=Math.floor(t/2),p=u?4:0,h=n,f=0,g=0;g= "+a);for(var o=n%2==1,i=t%2==1,s=Math.floor(n/2),u=Math.floor(t/2),l=getPackedMatrixTextureShapeWidthHeight(t,n),c=l[0],d=l[1],p=o?4:0,h=n+(o?1:0),f=0,g=0,m=n,v=0;vr||n>r){a="["+t+"x"+n+"]";throw new Error("Requested texture size "+a+" greater than WebGL maximum on this browser / GPU "+("["+r+"x"+r+"]")+".")}}function createFramebuffer(e){return throwIfNull(e,function(){return e.createFramebuffer()},"Unable to create WebGLFramebuffer.")}function bindVertexBufferToProgramAttribute(e,t,n,r,a,o,i){var s=e.getAttribLocation(t,n);return -1!==s&&(callAndCheck(e,function(){return e.bindBuffer(e.ARRAY_BUFFER,r)}),callAndCheck(e,function(){return e.vertexAttribPointer(s,a,e.FLOAT,!1,o,i)}),callAndCheck(e,function(){return e.enableVertexAttribArray(s)}),!0)}function bindTextureUnit(e,t,n){validateTextureUnit(e,n),callAndCheck(e,function(){return e.activeTexture(e.TEXTURE0+n)}),callAndCheck(e,function(){return e.bindTexture(e.TEXTURE_2D,t)});}function unbindTextureUnit(e,t){validateTextureUnit(e,t),callAndCheck(e,function(){return e.activeTexture(e.TEXTURE0+t)}),callAndCheck(e,function(){return e.bindTexture(e.TEXTURE_2D,null)});}function getProgramUniformLocationOrThrow(e,t,n){return throwIfNull(e,function(){return e.getUniformLocation(t,n)},'uniform "'+n+'" not present in program.')}function getProgramUniformLocation(e,t,n){return e.getUniformLocation(t,n)}function bindTextureToProgramUniformSampler(e,t,n,r,a){callAndCheck(e,function(){return bindTextureUnit(e,n,a)}),callAndCheck(e,function(){return e.uniform1i(r,a)});}function bindCanvasToFramebuffer(e){callAndCheck(e,function(){return e.bindFramebuffer(e.FRAMEBUFFER,null)}),callAndCheck(e,function(){return e.viewport(0,0,e.canvas.width,e.canvas.height)}),callAndCheck(e,function(){return e.scissor(0,0,e.canvas.width,e.canvas.height)});}function bindColorTextureToFramebuffer(e,t,n){callAndCheck(e,function(){return e.bindFramebuffer(e.FRAMEBUFFER,n)}),callAndCheck(e,function(){return e.framebufferTexture2D(e.FRAMEBUFFER,e.COLOR_ATTACHMENT0,e.TEXTURE_2D,t,0)});}function unbindColorTextureFromFramebuffer(e,t){callAndCheck(e,function(){return e.bindFramebuffer(e.FRAMEBUFFER,t)}),callAndCheck(e,function(){return e.framebufferTexture2D(e.FRAMEBUFFER,e.COLOR_ATTACHMENT0,e.TEXTURE_2D,null,0)});}function validateFramebuffer(e){var t=e.checkFramebufferStatus(e.FRAMEBUFFER);if(t!==e.FRAMEBUFFER_COMPLETE)throw new Error("Error binding framebuffer: "+getFramebufferErrorMessage(e,t))}function getFramebufferErrorMessage(e,t){switch(t){case e.FRAMEBUFFER_INCOMPLETE_ATTACHMENT:return "FRAMEBUFFER_INCOMPLETE_ATTACHMENT";case e.FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT:return "FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT";case e.FRAMEBUFFER_INCOMPLETE_DIMENSIONS:return "FRAMEBUFFER_INCOMPLETE_DIMENSIONS";case e.FRAMEBUFFER_UNSUPPORTED:return "FRAMEBUFFER_UNSUPPORTED";default:return "unknown error "+t}}function throwIfNull(e,t,n){var r=callAndCheck(e,function(){return t()});if(null==r)throw new Error(n);return r}function validateTextureUnit(e,t){var n=e.MAX_COMBINED_TEXTURE_IMAGE_UNITS-1,r=t+e.TEXTURE0;if(rn)throw new Error("textureUnit must be in "+("[gl.TEXTURE0, gl.TEXTURE"+n+"]")+".")}function getTextureShapeFromLogicalShape(e,t){2!==t.length&&(t=squeezeShape(t).newShape);var n=queryMaxTextureSize(e),r=sizeFromShape(t);return t.length<=1&&r<=n?[r,1]:2===t.length&&t[0]<=n&&t[1]<=n?t:3===t.length&&t[0]<=n&&t[1]*t[2]<=n?[t[0],t[1]*t[2]]:4===t.length&&t[0]<=n&&t[1]*t[2]*t[3]<=n?[t[0],t[1]*t[2]*t[3]]:sizeToSquarishShape(r)}var webgl_util=Object.freeze({createWebGLRenderingContext:createWebGLRenderingContext,createWebGLRenderingContextFromCanvas:createWebGLRenderingContextFromCanvas,callAndCheck:callAndCheck,enableDebugWebGLErrorChecking:enableDebugWebGLErrorChecking,checkWebGLError:checkWebGLError,getWebGLErrorMessage:getWebGLErrorMessage,getExtensionOrThrow:getExtensionOrThrow,createVertexShader:createVertexShader,createFragmentShader:createFragmentShader,createProgram:createProgram,linkProgram:linkProgram,validateProgram:validateProgram,createStaticVertexBuffer:createStaticVertexBuffer,createStaticIndexBuffer:createStaticIndexBuffer,queryMaxTextureSize:queryMaxTextureSize,getNumChannels:getNumChannels,createTexture:createTexture,validateTextureSize:validateTextureSize,createFramebuffer:createFramebuffer,bindVertexBufferToProgramAttribute:bindVertexBufferToProgramAttribute,bindTextureUnit:bindTextureUnit,unbindTextureUnit:unbindTextureUnit,getProgramUniformLocationOrThrow:getProgramUniformLocationOrThrow,getProgramUniformLocation:getProgramUniformLocation,bindTextureToProgramUniformSampler:bindTextureToProgramUniformSampler,bindCanvasToFramebuffer:bindCanvasToFramebuffer,bindColorTextureToFramebuffer:bindColorTextureToFramebuffer,unbindColorTextureFromFramebuffer:unbindColorTextureFromFramebuffer,validateFramebuffer:validateFramebuffer,getFramebufferErrorMessage:getFramebufferErrorMessage,getTextureShapeFromLogicalShape:getTextureShapeFromLogicalShape});function getWebGLContextAttributes(){return {alpha:!1,antialias:!1,premultipliedAlpha:!1,preserveDrawingBuffer:!1,depth:!1,stencil:!1,failIfMajorPerformanceCaveat:!0}}function createWebGLContext(e){var t,n=getWebGLContextAttributes();return callAndCheck(t=null!=e?createWebGLRenderingContextFromCanvas(e,n):createWebGLRenderingContext(n),function(){return t.disable(t.DEPTH_TEST)}),callAndCheck(t,function(){return t.disable(t.STENCIL_TEST)}),callAndCheck(t,function(){return t.disable(t.BLEND)}),callAndCheck(t,function(){return t.disable(t.DITHER)}),callAndCheck(t,function(){return t.disable(t.POLYGON_OFFSET_FILL)}),callAndCheck(t,function(){return t.disable(t.SAMPLE_COVERAGE)}),callAndCheck(t,function(){return t.enable(t.SCISSOR_TEST)}),callAndCheck(t,function(){return t.enable(t.CULL_FACE)}),callAndCheck(t,function(){return t.cullFace(t.BACK)}),t}function createVertexShader$1(e){return createVertexShader(e,"\n precision highp float;\n attribute vec3 clipSpacePos;\n attribute vec2 uv;\n varying vec2 resultUV;\n\n void main() {\n gl_Position = vec4(clipSpacePos, 1);\n resultUV = uv;\n }")}function createVertexBuffer(e){return createStaticVertexBuffer(e,new Float32Array([-1,1,0,0,1,-1,-1,0,0,0,1,1,0,1,1,1,-1,0,1,0]))}function createIndexBuffer(e){return createStaticIndexBuffer(e,new Uint16Array([0,1,2,2,1,3]))}function getTextureConfig(e,t){var n,r,a,o,i,s,u,l=e;return 2===ENV.get("WEBGL_VERSION")?(n=l.R32F,r=l.R16F,a=l.RGBA32F,o=l.RED,i=4,s=1,u=l.HALF_FLOAT):(n=e.RGBA,r=e.RGBA,a=l.RGBA,o=e.RGBA,i=4,s=4,u=null!=t?t.HALF_FLOAT_OES:null),{internalFormatFloat:n,internalFormatHalfFloat:r,internalFormatPackedFloat:a,textureFormatFloat:o,downloadTextureFormat:e.RGBA,downloadUnpackNumChannels:i,defaultNumChannels:s,textureTypeHalfFloat:u}}function createAndConfigureTexture(e,t,n,r,a,o){validateTextureSize(e,t,n);var i=createTexture(e),s=e.TEXTURE_2D;return callAndCheck(e,function(){return e.bindTexture(s,i)}),callAndCheck(e,function(){return e.texParameteri(s,e.TEXTURE_WRAP_S,e.CLAMP_TO_EDGE)}),callAndCheck(e,function(){return e.texParameteri(s,e.TEXTURE_WRAP_T,e.CLAMP_TO_EDGE)}),callAndCheck(e,function(){return e.texParameteri(s,e.TEXTURE_MIN_FILTER,e.NEAREST)}),callAndCheck(e,function(){return e.texParameteri(s,e.TEXTURE_MAG_FILTER,e.NEAREST)}),callAndCheck(e,function(){return e.texImage2D(s,0,r,t,n,0,a,o,null)}),callAndCheck(e,function(){return e.bindTexture(e.TEXTURE_2D,null)}),i}function createFloat32MatrixTexture(e,t,n,r){var a=getUnpackedMatrixTextureShapeWidthHeight(t,n);return createAndConfigureTexture(e,a[0],a[1],r.internalFormatFloat,r.textureFormatFloat,e.FLOAT)}function createFloat16MatrixTexture(e,t,n,r){var a=getUnpackedMatrixTextureShapeWidthHeight(t,n);return createAndConfigureTexture(e,a[0],a[1],r.internalFormatFloat,r.textureFormatFloat,r.textureTypeHalfFloat)}function createUnsignedBytesMatrixTexture(e,t,n,r){var a=getUnpackedMatrixTextureShapeWidthHeight(t,n);return createAndConfigureTexture(e,a[0],a[1],e.RGBA,e.RGBA,e.UNSIGNED_BYTE)}function createPackedMatrixTexture(e,t,n,r){var a=getPackedMatrixTextureShapeWidthHeight(t,n);return createAndConfigureTexture(e,a[0],a[1],r.internalFormatPackedFloat,e.RGBA,e.FLOAT)}function bindVertexProgramAttributeStreams(e,t,n){return callAndCheck(e,function(){return e.bindBuffer(e.ARRAY_BUFFER,n)}),bindVertexBufferToProgramAttribute(e,t,"clipSpacePos",n,3,20,0)&&bindVertexBufferToProgramAttribute(e,t,"uv",n,2,20,12)}function uploadPixelDataToTexture(e,t,n){callAndCheck(e,function(){return e.bindTexture(e.TEXTURE_2D,t)}),callAndCheck(e,function(){return e.texImage2D(e.TEXTURE_2D,0,e.RGBA,e.RGBA,e.UNSIGNED_BYTE,n)}),callAndCheck(e,function(){return e.bindTexture(e.TEXTURE_2D,null)});}function uploadDataToTexture(e,t,n,r,a,o){validateTextureSize(e,n,r),callAndCheck(e,function(){return e.bindTexture(e.TEXTURE_2D,t)}),callAndCheck(e,function(){return e.texSubImage2D(e.TEXTURE_2D,0,0,0,n,r,o,e.FLOAT,a)}),callAndCheck(e,function(){return e.bindTexture(e.TEXTURE_2D,null)});}function uploadMatrixToTexture(e,t,n,r,a,o,i){var s,u=getUnpackedMatrixTextureShapeWidthHeight(n,r),l=u[0],c=u[1];1===i.defaultNumChannels?s=a:encodeMatrixToUnpackedArray(a,s=new Float32Array(getUnpackedArraySizeFromMatrixSize(a.length,o)),o),uploadDataToTexture(e,t,l,c,s,i.textureFormatFloat);}function uploadMatrixToPackedTexture(e,t,n,r,a,o){var i=getPackedMatrixTextureShapeWidthHeight(n,r),s=i[0],u=i[1],l=new Float32Array(getPackedRGBAArraySizeFromMatrixShape(n,r));encodeMatrixToPackedRGBA(a,n,r,l),uploadDataToTexture(e,t,s,u,l,e.RGBA);}function downloadMatrixFromOutputTextureAsync(e,t,n,r,a){return __awaiter(this,void 0,void 0,function(){var o,i,s,u,l;return __generator(this,function(c){switch(c.label){case 0:return o=e,i=new Float32Array(getUnpackedArraySizeFromMatrixSize(n*r,a.downloadUnpackNumChannels)),s=i instanceof Float32Array?4*i.length:i,u=e.createBuffer(),callAndCheck(e,function(){return e.bindBuffer(o.PIXEL_PACK_BUFFER,u)}),callAndCheck(e,function(){return e.bufferData(o.PIXEL_PACK_BUFFER,s,e.STATIC_DRAW)}),callAndCheck(e,function(){return o.readPixels(0,0,r,n,e.RGBA,e.FLOAT,0)}),[4,t.getBufferSubDataAsync(o.PIXEL_PACK_BUFFER,0,i)];case 1:return c.sent(),l=new Float32Array(n*r),decodeMatrixFromUnpackedArray(i,l,a.downloadUnpackNumChannels),[2,l]}})})}function downloadFloat32MatrixFromOutputTexture(e,t,n,r){var a=getUnpackedMatrixTextureShapeWidthHeight(t,n),o=a[0],i=a[1],s=new Float32Array(getUnpackedArraySizeFromMatrixSize(t*n,r.downloadUnpackNumChannels));callAndCheck(e,function(){return e.readPixels(0,0,o,i,r.downloadTextureFormat,e.FLOAT,s)});var u=new Float32Array(t*n);return decodeMatrixFromUnpackedArray(s,u,r.downloadUnpackNumChannels),u}function downloadByteEncodedFloatMatrixFromOutputTexture(e,t,n,r){var a=getUnpackedMatrixTextureShapeWidthHeight(t,n),o=a[0],i=a[1],s=new Uint8Array(getUnpackedArraySizeFromMatrixSize(t*n,4));return callAndCheck(e,function(){return e.readPixels(0,0,o,i,r.downloadTextureFormat,e.UNSIGNED_BYTE,s)}),new Float32Array(s.buffer)}function downloadMatrixFromPackedOutputTexture(e,t,n,r){var a=getPackedMatrixTextureShapeWidthHeight(t,n),o=a[0],i=a[1],s=new Float32Array(getPackedRGBAArraySizeFromMatrixShape(t,n));callAndCheck(e,function(){return e.readPixels(0,0,o,i,e.RGBA,e.FLOAT,s)});var u=new Float32Array(t*n);return decodeMatrixFromPackedRGBA(s,t,n,u)}var gpgpu_util=Object.freeze({getWebGLContextAttributes:getWebGLContextAttributes,createWebGLContext:createWebGLContext,createVertexShader:createVertexShader$1,createVertexBuffer:createVertexBuffer,createIndexBuffer:createIndexBuffer,getTextureConfig:getTextureConfig,createFloat32MatrixTexture:createFloat32MatrixTexture,createFloat16MatrixTexture:createFloat16MatrixTexture,createUnsignedBytesMatrixTexture:createUnsignedBytesMatrixTexture,createPackedMatrixTexture:createPackedMatrixTexture,bindVertexProgramAttributeStreams:bindVertexProgramAttributeStreams,uploadPixelDataToTexture:uploadPixelDataToTexture,uploadMatrixToTexture:uploadMatrixToTexture,uploadMatrixToPackedTexture:uploadMatrixToPackedTexture,downloadMatrixFromOutputTextureAsync:downloadMatrixFromOutputTextureAsync,downloadFloat32MatrixFromOutputTexture:downloadFloat32MatrixFromOutputTexture,downloadByteEncodedFloatMatrixFromOutputTexture:downloadByteEncodedFloatMatrixFromOutputTexture,downloadMatrixFromPackedOutputTexture:downloadMatrixFromPackedOutputTexture}),GPGPUContext=function(){function e(e){this.outputTexture=null,this.program=null,this.disposed=!1,this.autoDebugValidate=!1,this.vertexAttrsAreBound=!1,this.itemsToPoll=[],this.gl=null!=e?e:createWebGLContext(),1===ENV.get("WEBGL_VERSION")?(this.textureFloatExtension=getExtensionOrThrow(this.gl,"OES_texture_float"),this.colorBufferFloatExtension=this.gl.getExtension("WEBGL_color_buffer_float"),ENV.get("WEBGL_RENDER_FLOAT32_ENABLED")||(this.textureHalfFloatExtension=getExtensionOrThrow(this.gl,"OES_texture_half_float"),this.colorBufferHalfFloatExtension=this.gl.getExtension("EXT_color_buffer_half_float"))):this.colorBufferFloatExtension=getExtensionOrThrow(this.gl,"EXT_color_buffer_float"),this.loseContextExtension=getExtensionOrThrow(this.gl,"WEBGL_lose_context"),ENV.get("WEBGL_GET_BUFFER_SUB_DATA_ASYNC_EXTENSION_ENABLED")&&(this.getBufferSubDataAsyncExtension=this.gl.getExtension("WEBGL_get_buffer_sub_data_async")),this.vertexBuffer=createVertexBuffer(this.gl),this.indexBuffer=createIndexBuffer(this.gl),this.framebuffer=createFramebuffer(this.gl),this.textureConfig=getTextureConfig(this.gl,this.textureHalfFloatExtension);}return e.prototype.dispose=function(){var e=this;if(!this.disposed){null!=this.program&&console.warn("Disposing a GPGPUContext that still has a bound WebGLProgram. This is probably a resource leak, delete the program with GPGPUContext.deleteProgram before disposing."),null!=this.outputTexture&&console.warn("Disposing a GPGPUContext that still has a bound output matrix texture. This is probably a resource leak, delete the output matrix texture with GPGPUContext.deleteMatrixTexture before disposing.");var t=this.gl;callAndCheck(t,function(){return t.finish()}),callAndCheck(t,function(){return t.bindFramebuffer(t.FRAMEBUFFER,null)}),callAndCheck(t,function(){return t.deleteFramebuffer(e.framebuffer)}),callAndCheck(t,function(){return t.bindBuffer(t.ARRAY_BUFFER,null)}),callAndCheck(t,function(){return t.deleteBuffer(e.vertexBuffer)}),callAndCheck(t,function(){return t.bindBuffer(t.ELEMENT_ARRAY_BUFFER,null)}),callAndCheck(t,function(){return t.deleteBuffer(e.indexBuffer)}),this.loseContextExtension.loseContext(),this.disposed=!0;}},e.prototype.enableAutomaticDebugValidation=function(e){this.autoDebugValidate=e,enableDebugWebGLErrorChecking(e);},e.prototype.createFloat32MatrixTexture=function(e,t){return this.throwIfDisposed(),createFloat32MatrixTexture(this.gl,e,t,this.textureConfig)},e.prototype.createFloat16MatrixTexture=function(e,t){return this.throwIfDisposed(),createFloat16MatrixTexture(this.gl,e,t,this.textureConfig)},e.prototype.createUnsignedBytesMatrixTexture=function(e,t){return this.throwIfDisposed(),createUnsignedBytesMatrixTexture(this.gl,e,t,this.textureConfig)},e.prototype.uploadPixelDataToTexture=function(e,t){this.throwIfDisposed(),uploadPixelDataToTexture(this.gl,e,t);},e.prototype.createPackedMatrixTexture=function(e,t){return this.throwIfDisposed(),createPackedMatrixTexture(this.gl,e,t,this.textureConfig)},e.prototype.deleteMatrixTexture=function(e){var t=this;this.throwIfDisposed(),this.outputTexture===e&&(unbindColorTextureFromFramebuffer(this.gl,this.framebuffer),this.outputTexture=null),callAndCheck(this.gl,function(){return t.gl.deleteTexture(e)});},e.prototype.uploadMatrixToTexture=function(e,t,n,r){this.throwIfDisposed();var a=getNumChannels();return uploadMatrixToTexture(this.gl,e,t,n,r,a,this.textureConfig)},e.prototype.uploadMatrixToPackedTexture=function(e,t,n,r){return this.throwIfDisposed(),uploadMatrixToPackedTexture(this.gl,e,t,n,r,this.textureConfig)},e.prototype.downloadFloat32MatrixFromOutputTexture=function(e,t,n){var r=this;return this.downloadMatrixDriver(e,function(){return downloadFloat32MatrixFromOutputTexture(r.gl,t,n,r.textureConfig)})},e.prototype.downloadByteEncodedFloatMatrixFromOutputTexture=function(e,t,n){var r=this;return this.downloadMatrixDriver(e,function(){return downloadByteEncodedFloatMatrixFromOutputTexture(r.gl,t,n,r.textureConfig)})},e.prototype.downloadMatrixFromTextureAsync=function(e,t,n){return __awaiter(this,void 0,void 0,function(){var r=this;return __generator(this,function(a){if(null==this.getBufferSubDataAsyncExtension)throw new Error("Cannot download matrix from output texture asynchronously, WEBGL_get_buffer_sub_data_async is not enabled.");return [2,this.downloadMatrixDriverAsync(e,function(){return downloadMatrixFromOutputTextureAsync(r.gl,r.getBufferSubDataAsyncExtension,t,n,r.textureConfig)})]})})},e.prototype.downloadMatrixFromPackedTexture=function(e,t,n){var r=this;return this.downloadMatrixDriver(e,function(){return downloadMatrixFromPackedOutputTexture(r.gl,t,n,r.textureConfig)})},e.prototype.createProgram=function(e){this.throwIfDisposed();var t=this.gl,n=createFragmentShader(t,e),r=createVertexShader$1(t),a=createProgram(t);return callAndCheck(t,function(){return t.attachShader(a,r)}),callAndCheck(t,function(){return t.attachShader(a,n)}),linkProgram(t,a),this.autoDebugValidate&&validateProgram(t,a),this.vertexAttrsAreBound||(this.setProgram(a),this.vertexAttrsAreBound=bindVertexProgramAttributeStreams(t,this.program,this.vertexBuffer)),a},e.prototype.deleteProgram=function(e){var t=this;this.throwIfDisposed(),e===this.program&&(this.program=null),null!=e&&callAndCheck(this.gl,function(){return t.gl.deleteProgram(e)});},e.prototype.setProgram=function(e){var t=this;this.throwIfDisposed(),this.program=e,null!=this.program&&this.autoDebugValidate&&validateProgram(this.gl,this.program),callAndCheck(this.gl,function(){return t.gl.useProgram(e)});},e.prototype.getUniformLocation=function(e,t,n){return void 0===n&&(n=!0),this.throwIfDisposed(),n?getProgramUniformLocationOrThrow(this.gl,e,t):getProgramUniformLocation(this.gl,e,t)},e.prototype.getAttributeLocation=function(e,t){var n=this;return this.throwIfDisposed(),callAndCheck(this.gl,function(){return n.gl.getAttribLocation(e,t)})},e.prototype.getUniformLocationNoThrow=function(e,t){return this.throwIfDisposed(),this.gl.getUniformLocation(e,t)},e.prototype.setInputMatrixTexture=function(e,t,n){this.throwIfDisposed(),this.throwIfNoProgram(),bindTextureToProgramUniformSampler(this.gl,this.program,e,t,n);},e.prototype.setOutputMatrixTexture=function(e,t,n){this.setOutputMatrixTextureDriver(e,n,t);},e.prototype.setOutputPackedMatrixTexture=function(e,t,n){this.throwIfDisposed();var r=getPackedMatrixTextureShapeWidthHeight(t,n),a=r[0],o=r[1];this.setOutputMatrixTextureDriver(e,a,o);},e.prototype.setOutputMatrixWriteRegion=function(e,t,n,r){this.setOutputMatrixWriteRegionDriver(n,e,r,t);},e.prototype.setOutputPackedMatrixWriteRegion=function(e,t,n,r){throw new Error("setOutputPackedMatrixWriteRegion not implemented.")},e.prototype.debugValidate=function(){null!=this.program&&validateProgram(this.gl,this.program),validateFramebuffer(this.gl);},e.prototype.executeProgram=function(){this.throwIfDisposed(),this.throwIfNoProgram();var e=this.gl;this.autoDebugValidate&&this.debugValidate(),callAndCheck(e,function(){return e.drawElements(e.TRIANGLES,6,e.UNSIGNED_SHORT,0)});},e.prototype.blockUntilAllProgramsCompleted=function(){var e=this;this.throwIfDisposed(),callAndCheck(this.gl,function(){return e.gl.finish()});},e.prototype.getQueryTimerExtension=function(){return null==this.disjointQueryTimerExtension&&(this.disjointQueryTimerExtension=getExtensionOrThrow(this.gl,2===ENV.get("WEBGL_DISJOINT_QUERY_TIMER_EXTENSION_VERSION")?"EXT_disjoint_timer_query_webgl2":"EXT_disjoint_timer_query")),this.disjointQueryTimerExtension},e.prototype.getQueryTimerExtensionWebGL2=function(){return this.getQueryTimerExtension()},e.prototype.getQueryTimerExtensionWebGL1=function(){return this.getQueryTimerExtension()},e.prototype.runQuery=function(e){var t=this.beginQuery();return e(),this.endQuery(),this.pollQueryTime(t)},e.prototype.beginQuery=function(){if(2===ENV.get("WEBGL_DISJOINT_QUERY_TIMER_EXTENSION_VERSION")){var e=this.gl,t=this.getQueryTimerExtensionWebGL2(),n=e.createQuery();return e.beginQuery(t.TIME_ELAPSED_EXT,n),n}var r=this.getQueryTimerExtensionWebGL1(),a=r.createQueryEXT();return r.beginQueryEXT(r.TIME_ELAPSED_EXT,a),a},e.prototype.endQuery=function(){if(2!==ENV.get("WEBGL_DISJOINT_QUERY_TIMER_EXTENSION_VERSION")){var e=this.getQueryTimerExtensionWebGL1();e.endQueryEXT(e.TIME_ELAPSED_EXT);}else{var t=this.gl,n=this.getQueryTimerExtensionWebGL2();t.endQuery(n.TIME_ELAPSED_EXT);}},e.prototype.isQueryAvailable=function(e,t){if(0===t)return !0;if(2===t){var n=this.gl,r=this.getQueryTimerExtensionWebGL2(),a=n.getQueryParameter(e,n.QUERY_RESULT_AVAILABLE);return null==this.disjoint&&(this.disjoint=this.gl.getParameter(r.GPU_DISJOINT_EXT)),a&&!this.disjoint}a=(r=this.getQueryTimerExtensionWebGL1()).getQueryObjectEXT(e,r.QUERY_RESULT_AVAILABLE_EXT);return null==this.disjoint&&(this.disjoint=this.gl.getParameter(r.GPU_DISJOINT_EXT)),a&&!this.disjoint},e.prototype.pollQueryTime=function(e){var t=this;return new Promise(function(n){var r=ENV.get("WEBGL_DISJOINT_QUERY_TIMER_EXTENSION_VERSION");t.addItemToPoll(function(){return t.isQueryAvailable(e,r)},function(){return n(t.getQueryTime(e,r))});})},e.prototype.pollItems=function(){for(var e=binSearchLastTrue(this.itemsToPoll.map(function(e){return e.isDoneFn})),t=0;t<=e;++t){(0, this.itemsToPoll[t].resolveFn)();}this.itemsToPoll=this.itemsToPoll.slice(e+1);},e.prototype.addItemToPoll=function(e,t){var n=this;this.itemsToPoll.push({isDoneFn:e,resolveFn:t}),this.itemsToPoll.length>1||repeatedTry(function(){return n.pollItems(),0===n.itemsToPoll.length});},e.prototype.getQueryTime=function(e,t){if(0===t)return null;if(2===t){var n=this.gl;return n.getQueryParameter(e,n.QUERY_RESULT)/1e6}var r=this.getQueryTimerExtensionWebGL1();return r.getQueryObjectEXT(e,r.QUERY_RESULT_EXT)/1e6},e.prototype.downloadMatrixDriverSetup=function(e){this.throwIfDisposed(),bindColorTextureToFramebuffer(this.gl,e,this.framebuffer),this.autoDebugValidate&&validateFramebuffer(this.gl);},e.prototype.downloadMatrixDriverTeardown=function(){null!=this.outputTexture?(bindColorTextureToFramebuffer(this.gl,this.outputTexture,this.framebuffer),this.autoDebugValidate&&validateFramebuffer(this.gl)):unbindColorTextureFromFramebuffer(this.gl,this.framebuffer);},e.prototype.downloadMatrixDriver=function(e,t){this.downloadMatrixDriverSetup(e);var n=t();return this.downloadMatrixDriverTeardown(),n},e.prototype.downloadMatrixDriverAsync=function(e,t){return __awaiter(this,void 0,void 0,function(){var n;return __generator(this,function(r){switch(r.label){case 0:return this.downloadMatrixDriverSetup(e),[4,t()];case 1:return n=r.sent(),this.downloadMatrixDriverTeardown(),[2,n]}})})},e.prototype.setOutputMatrixTextureDriver=function(e,t,n){this.throwIfDisposed();var r=this.gl;bindColorTextureToFramebuffer(r,e,this.framebuffer),this.autoDebugValidate&&validateFramebuffer(r),this.outputTexture=e,callAndCheck(r,function(){return r.viewport(0,0,t,n)}),callAndCheck(r,function(){return r.scissor(0,0,t,n)});},e.prototype.setOutputMatrixWriteRegionDriver=function(e,t,n,r){var a=this;this.throwIfDisposed(),callAndCheck(this.gl,function(){return a.gl.scissor(e,t,n,r)});},e.prototype.throwIfDisposed=function(){if(this.disposed)throw new Error("Attempted to use disposed GPGPUContext.")},e.prototype.throwIfNoProgram=function(){if(null==this.program)throw new Error("No GPU program is currently set.")},e}();function binSearchLastTrue(e){for(var t=0,n=e.length-1,r=-1;t<=n;){var a=t+n>>1;e[a]()?(r=a,t=a+1):n=a-1;}return r}function compileProgram(e,t,n,r){for(var a=t.userCode,o=n.map(function(e,n){var r={logicalShape:e.tensor.shape,texShape:e.isUniform?null:e.texData.texShape,isUniform:e.isUniform};return {name:t.variableNames[n],shapeInfo:r}}),i=o.map(function(e){return e.shapeInfo}),s={logicalShape:r.tensor.shape,texShape:r.texData.texShape,isUniform:!1},u=makeShader(o,s,a,!0===t.supportsBroadcasting),l=e.createProgram(u),c={},d=0;d4)throw Error("Where for rank "+n+" is not yet supported");if(1===n)a="resRC",r="resRC";else{for(var o=["resRC.x","resRC.y","resRC.z","resRC.w"],i=[],s=[],u=0;u= 1.0) {\n setOutput(getA("+a+"));\n } else {\n setOutput(getB("+a+"));\n }\n }\n ";}}(),LRNProgram=function(){return function(e,t,n,r,a){this.variableNames=["x"],this.outputShape=[];var o,i=t,s=e[3]-1;this.outputShape=e;var u="float("+n+") + float("+r+") * sum";o=.5===a?"inversesqrt("+u+")":1===a?"1.0/("+u+")":"exp(log("+u+") * float(-"+a+"));",this.userCode="\n void main() {\n ivec4 coords = getOutputCoords();\n int b = coords[0];\n int r = coords[1];\n int c = coords[2];\n int d = coords[3];\n float x = getX(b, r, c, d);\n float sum = 0.0;\n for (int j = -"+i+"; j <= "+i+"; j++) {\n int idx = d + j;\n if (idx >= 0 && idx <= "+s+") {\n float z = getX(b, r, c, idx);\n sum += z * z;\n }\n }\n float val = x * "+o+";\n setOutput(val);\n }\n ";}}(),MaxPool2DBackpropProgram=function(){return function(e){this.variableNames=["dy","maxPos"],this.outputShape=e.inShape;var t=e.filterHeight,n=e.filterWidth,r=e.strideHeight,a=e.strideWidth,o=t-1-e.padInfo.top,i=n-1-e.padInfo.left,s=t*n-1;this.userCode="\n const ivec2 pads = ivec2("+o+", "+i+");\n\n void main() {\n ivec4 coords = getOutputCoords();\n int b = coords[0];\n int d = coords[3];\n\n ivec2 dyRCCorner = coords.yz - pads;\n int dyRCorner = dyRCCorner.x;\n int dyCCorner = dyRCCorner.y;\n\n // Convolve dy(?, ?, d) with pos mask(:, :, d) to get dx(xR, xC, d).\n // ? = to be determined. : = across all values in that axis.\n float dotProd = 0.0;\n for (int wR = 0; wR < "+t+"; wR++) {\n float dyR = float(dyRCorner + wR) / "+r+".0;\n\n if (dyR < 0.0 || dyR >= "+e.outHeight+".0 || fract(dyR) > 0.0) {\n continue;\n }\n int idyR = int(dyR);\n\n for (int wC = 0; wC < "+n+"; wC++) {\n float dyC = float(dyCCorner + wC) / "+a+".0;\n\n if (dyC < 0.0 || dyC >= "+e.outWidth+".0 ||\n fract(dyC) > 0.0) {\n continue;\n }\n int idyC = int(dyC);\n\n float dyValue = getDy(b, idyR, idyC, d);\n int maxPosValue = "+s+" - int(getMaxPos(b, idyR, idyC, d));\n\n // Get the current value, check it against the value from the\n // position matrix.\n int curPosValue = wR * "+n+" + wC;\n float mask = float(maxPosValue == curPosValue ? 1.0 : 0.0);\n\n dotProd += dyValue * mask;\n }\n }\n setOutput(dotProd);\n }\n ";}}(),MatMulProgram=function(){return function(e,t,n,r){void 0===n&&(n=!1),void 0===r&&(r=!1),this.variableNames=["matrixA","matrixB"];var a=n?e[1]:e[0],o=r?t[0]:t[1],i=n?e[0]:e[1];this.outputShape=[a,o];var s=function(e,t){return n?t+" + "+e+", aRow":"aRow, "+t+" + "+e},u=function(e,t){return r?"bCol, "+t+" + "+e:t+" + "+e+", bCol"},l=4*Math.floor(i/4),c=i%4;this.userCode=" float dotARowBCol(int aRow, int bCol) {\n float result = 0.0;\n for (int i = 0; i < "+l+"; i += 4) {\n vec4 a = vec4(\n getMatrixA("+s(0,"i")+"),\n getMatrixA("+s(1,"i")+"),\n getMatrixA("+s(2,"i")+"),\n getMatrixA("+s(3,"i")+")\n );\n vec4 b = vec4(\n getMatrixB("+u(0,"i")+"),\n getMatrixB("+u(1,"i")+"),\n getMatrixB("+u(2,"i")+"),\n getMatrixB("+u(3,"i")+")\n );\n\n result += dot(a, b);\n }\n\n if ("+(1===c)+") {\n result += getMatrixA("+s(0,l)+") *\n getMatrixB("+u(0,l)+");\n } else if ("+(2===c)+") {\n vec2 a = vec2(\n getMatrixA("+s(0,l)+"),\n getMatrixA("+s(1,l)+")\n );\n vec2 b = vec2(\n getMatrixB("+u(0,l)+"),\n getMatrixB("+u(1,l)+")\n );\n result += dot(a, b);\n } else if ("+(3===c)+") {\n vec3 a = vec3(\n getMatrixA("+s(0,l)+"),\n getMatrixA("+s(1,l)+"),\n getMatrixA("+s(2,l)+")\n );\n vec3 b = vec3(\n getMatrixB("+u(0,l)+"),\n getMatrixB("+u(1,l)+"),\n getMatrixB("+u(2,l)+")\n );\n result += dot(a, b);\n }\n\n return result;\n }\n\n void main() {\n ivec2 resRC = getOutputCoords();\n setOutput(dotARowBCol(resRC.x, resRC.y));\n }\n ";}}(),MultinomialProgram=function(){function e(e,t,n){this.variableNames=["probs"],this.outputShape=[e,n],this.userCode="\n uniform float seed;\n\n void main() {\n ivec2 coords = getOutputCoords();\n int batch = coords[0];\n\n float r = random(seed);\n float cdf = 0.0;\n\n for (int i = 0; i < "+(t-1)+"; i++) {\n cdf += getProbs(batch, i);\n\n if (r < cdf) {\n setOutput(float(i));\n return;\n }\n }\n\n // If no other event happened, last event happened.\n setOutput(float("+(t-1)+"));\n }\n ";}return e.prototype.getCustomSetupFunc=function(e){var t=this;return function(n,r){null==t.seedLoc&&(t.seedLoc=n.getUniformLocation(r,"seed")),n.gl.uniform1f(t.seedLoc,e);}},e}(),OneHotProgram=function(){return function(e,t,n,r){this.variableNames=["indices"],this.outputShape=[e,t],this.userCode="\n void main() {\n ivec2 coords = getOutputCoords();\n int index = round(getIndices(coords.x));\n setOutput(mix(float("+r+"), float("+n+"),\n float(index == coords.y)));\n }\n ";}}(),PadProgram=function(){return function(e,t,n){this.variableNames=["x"],this.outputShape=t.map(function(t,n){return t[0]+e[n]+t[1]});var r=e.length,a=getCoordsDataType(r),o=t.map(function(e){return e[0]}).join(","),i=t.map(function(t,n){return t[0]+e[n]}).join(","),s=["coords[0]","coords[1]","coords[2]","coords[3]"].slice(0,r);this.userCode=1!==r?"\n "+a+" start = "+a+"("+o+");\n "+a+" end = "+a+"("+i+");\n\n void main() {\n "+a+" outC = getOutputCoords();\n if (any(lessThan(outC, start)) || any(greaterThanEqual(outC, end))) {\n setOutput(float("+n+"));\n } else {\n "+a+" coords = outC - start;\n setOutput(getX("+s+"));\n }\n }\n ":"\n int start = "+o+";\n int end = "+i+";\n\n void main() {\n int outC = getOutputCoords();\n if (outC < start || outC >= end) {\n setOutput(float("+n+"));\n } else {\n setOutput(getX(outC - start));\n }\n }\n ";}}(),Pool2DProgram=function(){return function(e,t,n){if(this.variableNames=["x"],"avg"===t&&n)throw new Error("Cannot compute positions for average pool.");var r=e.filterHeight,a=e.filterWidth,o=e.strideHeight,i=e.strideWidth,s=e.padInfo.top,u=e.padInfo.left;this.outputShape=e.outShape;var l="avg"===t,c="0.0";if(l||(c="-1.0 / 0.0"),n)this.userCode="\n const ivec2 strides = ivec2("+o+", "+i+");\n const ivec2 pads = ivec2("+s+", "+u+");\n\n void main() {\n ivec4 coords = getOutputCoords();\n int batch = coords[0];\n int d = coords[3];\n\n ivec2 xRCCorner = coords.yz * strides - pads;\n int xRCorner = xRCCorner.x;\n int xCCorner = xRCCorner.y;\n\n // max/min x(?, ?, d) to get y(yR, yC, d).\n // ? = to be determined\n float minMaxValue = 0.0;\n float minMaxValueFound = 0.0;\n int minMaxPosition = 0;\n float avgValue = 0.0;\n\n for (int wR = 0; wR < "+r+"; wR++) {\n int xR = xRCorner + wR;\n\n if (xR < 0 || xR >= "+e.inHeight+") {\n continue;\n }\n\n for (int wC = 0; wC < "+a+"; wC++) {\n int xC = xCCorner + wC;\n\n if (xC < 0 || xC >= "+e.inWidth+") {\n continue;\n }\n\n float value = getX(batch, xR, xC, d);\n\n // If a min / max value has already been found, use it. If not,\n // use the current value.\n float currMinMaxValue = mix(\n value, minMaxValue, minMaxValueFound);\n if (value >= currMinMaxValue) {\n minMaxValue = value;\n minMaxValueFound = 1.0;\n minMaxPosition = wR * "+a+" + wC;\n }\n }\n }\n setOutput(float(minMaxPosition));\n }\n ";else{var d=t+"("+t+"("+t+"(minMaxValue[0], minMaxValue[1]), minMaxValue[2]), minMaxValue[3])";"avg"===t&&(d="avgValue / count");var p=4*Math.floor(a/4),h=a%4,f="\n if ("+l+") {\n avgValue += dot(values, ones);\n } else {\n minMaxValue = max(values, minMaxValue);\n }\n ";this.userCode="\n const ivec2 strides = ivec2("+o+", "+i+");\n const ivec2 pads = ivec2("+s+", "+u+");\n const float initializationValue = "+c+";\n const vec4 ones = vec4(1.0, 1.0, 1.0, 1.0);\n\n float count = 0.0;\n\n float getValue(int batch, int xR, int xC, int d) {\n if (xC < 0 || xC >= "+e.inWidth+") {\n return initializationValue;\n }\n count += 1.0;\n return getX(batch, xR, xC, d);\n }\n\n void main() {\n ivec4 coords = getOutputCoords();\n int batch = coords[0];\n int d = coords[3];\n\n ivec2 xRCCorner = coords.yz * strides - pads;\n int xRCorner = xRCCorner.x;\n int xCCorner = xRCCorner.y;\n\n // max/min x(?, ?, d) to get y(yR, yC, d).\n // ? = to be determined\n vec4 minMaxValue = vec4("+c+");\n float avgValue = 0.0;\n count = 0.0;\n\n for (int wR = 0; wR < "+r+"; wR++) {\n int xR = xRCorner + wR;\n\n if (xR < 0 || xR >= "+e.inHeight+") {\n continue;\n }\n\n for (int wC = 0; wC < "+p+"; wC += 4) {\n int xC = xCCorner + wC;\n\n vec4 values = vec4(\n getValue(batch, xR, xC, d),\n getValue(batch, xR, xC + 1, d),\n getValue(batch, xR, xC + 2, d),\n getValue(batch, xR, xC + 3, d)\n );\n\n "+f+"\n }\n\n int xC = xCCorner + "+p+";\n if ("+(1===h)+") {\n vec4 values = vec4(\n getValue(batch, xR, xC, d),\n initializationValue,\n initializationValue,\n initializationValue\n );\n\n "+f+"\n } else if ("+(2===h)+") {\n vec4 values = vec4(\n getValue(batch, xR, xC, d),\n getValue(batch, xR, xC + 1, d),\n initializationValue,\n initializationValue\n );\n\n "+f+"\n } else if ("+(3===h)+") {\n vec4 values = vec4(\n getValue(batch, xR, xC, d),\n getValue(batch, xR, xC + 1, d),\n getValue(batch, xR, xC + 2, d),\n initializationValue\n );\n\n "+f+"\n }\n }\n setOutput("+d+");\n }\n ";}}}(),ReduceProgram=function(){return function(e,t){this.variableNames=["x"];var n=e.windowSize,r=e.batchSize,a=e.inSize,o=Math.ceil(a/n);this.outputShape=[r,o];var i="0.0",s="";"min"===t?(i="1.0 / 0.0",s="min"):"max"===t&&(i="-1.0 / 0.0",s="max");var u=t+"("+t+"("+t+"(minMaxValue[0], minMaxValue[1]), minMaxValue[2]), minMaxValue[3])";"sum"===t?u="sumValue":"all"===t&&(u="allValue");var l=4*Math.floor(n/4),c=n%4,d="\n if ("+("sum"===t)+") {\n sumValue += dot(values, ones);\n } else {\n minMaxValue = "+s+"(values, minMaxValue);\n }\n ",p="vec4";"all"===t&&(i="1.0",d="\n bool reducedAllValue = all(values);\n float floatedReducedAllValue = float(reducedAllValue);\n allValue = float(allValue >= 1.0 && floatedReducedAllValue >= 1.0);\n ",p="bvec4");var h="";a%n>0&&(h="\n if (inIdx < 0 || inIdx >= "+a+") {\n return initializationValue;\n }\n "),this.userCode="\n const float initializationValue = "+i+";\n const vec4 ones = vec4(1.0, 1.0, 1.0, 1.0);\n\n float getValue(int batch, int inIdx) {\n "+h+"\n return getX(batch, inIdx);\n }\n\n void main() {\n ivec2 coords = getOutputCoords();\n int batch = coords[0];\n int outIdx = coords[1];\n int inOffset = outIdx * "+n+";\n\n vec4 minMaxValue = vec4("+i+");\n float sumValue = 0.0;\n float allValue = 1.0;\n\n for (int i = 0; i < "+l+"; i += 4) {\n int inIdx = inOffset + i;\n "+p+" values = "+p+"(\n getValue(batch, inIdx),\n getValue(batch, inIdx + 1),\n getValue(batch, inIdx + 2),\n getValue(batch, inIdx + 3)\n );\n\n "+d+"\n }\n\n int inIdx = inOffset + "+l+";\n if ("+(1===c)+") {\n "+p+" values = "+p+"(\n getValue(batch, inIdx),\n initializationValue,\n initializationValue,\n initializationValue\n );\n\n "+d+"\n } else if ("+(2===c)+") {\n "+p+" values = "+p+"(\n getValue(batch, inIdx),\n getValue(batch, inIdx + 1),\n initializationValue,\n initializationValue\n );\n\n "+d+"\n } else if ("+(3===c)+") {\n "+p+" values = "+p+"(\n getValue(batch, inIdx),\n getValue(batch, inIdx + 1),\n getValue(batch, inIdx + 2),\n initializationValue\n );\n\n "+d+"\n }\n setOutput("+u+");\n }\n ";}}(),ResizeBilinearBackpropProgram=function(){return function(e,t,n){this.variableNames=["dy"],this.outputShape=[],this.outputShape=t.shape;var r=t.shape,a=r[1],o=r[2],i=e.shape,s=i[1],u=i[2],l=[n&&s>1?a-1:a,n&&u>1?o-1:o],c=[n&&s>1?s-1:s,n&&u>1?u-1:u],d=l[0]/c[0],p=l[1]/c[1],h=1/d,f=1/p,g=2*Math.ceil(h)+2,m=2*Math.ceil(f)+2;this.userCode="\n void main() {\n ivec4 coords = getOutputCoords();\n int b = coords[0];\n int d = coords[3];\n int r = coords[1];\n int c = coords[2];\n\n float accumulator = 0.0;\n\n const float heightScale = float("+d+");\n const float widthScale = float("+p+");\n\n const float invHeightScale = float("+h+");\n const float invWidthScale = float("+f+");\n\n const int winHeight = int("+g+");\n const int winWidth = int("+m+");\n\n // Compute bounds for where in dy we will look\n float startRLerp = floor(float(r) * invHeightScale);\n int startDyR = int(startRLerp - float(winHeight / 2));\n\n float startCLerp = floor(float(c) * invWidthScale);\n int startDyC = int(startCLerp - float(winWidth / 2));\n\n // Loop over dy\n for (int dyROffset = 0; dyROffset < winHeight; dyROffset++) {\n int dyR = dyROffset + startDyR;\n\n // Guard against the window exceeding the bounds of dy\n if (dyR < 0 || dyR >= "+s+") {\n continue;\n }\n\n for (int dyCOffset = 0; dyCOffset < winWidth; dyCOffset++) {\n int dyC = dyCOffset + startDyC;\n\n // Guard against the window exceeding the bounds of dy\n if (dyC < 0 || dyC >= "+u+") {\n continue;\n }\n\n float dxR = float(dyR) * heightScale;\n int topDxRIndex = int(floor(dxR));\n int bottomDxRIndex = int(min(ceil(dxR), "+(a-1)+".0));\n float dxRLerp = dxR - float(topDxRIndex);\n float inverseDxRLerp = 1.0 - dxRLerp;\n\n float dxC = float(dyC) * widthScale;\n int leftDxCIndex = int(floor(dxC));\n int rightDxCIndex = int(min(ceil(dxC), "+(o-1)+".0));\n float dxCLerp = dxC - float(leftDxCIndex);\n float inverseDxCLerp = 1.0 - dxCLerp;\n\n if (r == topDxRIndex && c == leftDxCIndex) {\n // topLeft\n accumulator +=\n getDy(b, dyR, dyC, d) * inverseDxRLerp * inverseDxCLerp;\n }\n\n if (r == topDxRIndex && c == rightDxCIndex) {\n // topRight\n accumulator += getDy(b, dyR, dyC, d) * inverseDxRLerp * dxCLerp;\n }\n\n if (r == bottomDxRIndex && c == leftDxCIndex) {\n // bottomLeft\n accumulator += getDy(b, dyR, dyC, d) * dxRLerp * inverseDxCLerp;\n }\n\n if (r == bottomDxRIndex && c == rightDxCIndex) {\n // bottomRight\n accumulator += getDy(b, dyR, dyC, d) * dxRLerp * dxCLerp;\n }\n }\n }\n // End loop over dy\n\n setOutput(accumulator);\n }\n ";}}(),ResizeBilinearProgram=function(){return function(e,t,n,r){this.variableNames=["A"],this.outputShape=[];var a=e[0],o=e[1],i=e[2],s=e[3];this.outputShape=[a,t,n,s];var u=[r&&t>1?o-1:o,r&&n>1?i-1:i],l=[r&&t>1?t-1:t,r&&n>1?n-1:n];this.userCode="\n const vec2 effectiveInputOverOutputRatioRC = vec2(\n "+u[0]/l[0]+",\n "+u[1]/l[1]+");\n const vec2 inputShapeRC = vec2("+o+".0, "+i+".0);\n\n void main() {\n ivec4 coords = getOutputCoords();\n int b = coords[0];\n int d = coords[3];\n ivec2 yRC = coords.yz;\n\n // Fractional source index.\n vec2 sourceFracIndexRC = vec2(yRC) * effectiveInputOverOutputRatioRC;\n\n // Compute the four integer indices.\n ivec2 sourceFloorRC = ivec2(sourceFracIndexRC);\n ivec2 sourceCeilRC = ivec2(\n min(inputShapeRC - 1.0, ceil(sourceFracIndexRC)));\n\n float topLeft = getA(b, sourceFloorRC.x, sourceFloorRC.y, d);\n float bottomLeft = getA(b, sourceCeilRC.x, sourceFloorRC.y, d);\n float topRight = getA(b, sourceFloorRC.x, sourceCeilRC.y, d);\n float bottomRight = getA(b, sourceCeilRC.x, sourceCeilRC.y, d);\n\n vec2 fracRC = sourceFracIndexRC - vec2(sourceFloorRC);\n\n float top = topLeft + (topRight - topLeft) * fracRC.y;\n float bottom = bottomLeft + (bottomRight - bottomLeft) * fracRC.y;\n float newValue = top + (bottom - top) * fracRC.x;\n\n setOutput(newValue);\n }\n ";}}(),ResizeNearestNeighborProgram=function(){return function(e,t,n,r){this.variableNames=["A"],this.outputShape=[];var a=e[0],o=e[1],i=e[2],s=e[3];this.outputShape=[a,t,n,s];var u=r?[o-1,i-1]:[o,i],l=r?[t-1,n-1]:[t,n],c=r?"0.5":"0.0";this.userCode="\n const vec2 effectiveInputOverOutputRatioRC = vec2(\n "+u[0]/l[0]+",\n "+u[1]/l[1]+");\n const vec2 inputShapeRC = vec2("+o+".0, "+i+".0);\n\n void main() {\n ivec4 coords = getOutputCoords();\n int b = coords[0];\n int d = coords[3];\n ivec2 yRC = coords.yz;\n\n // Fractional source index.\n vec2 sourceFracIndexRC = vec2(yRC) * effectiveInputOverOutputRatioRC;\n\n // Compute the coordinators of nearest neighbor point.\n ivec2 sourceNearestRC = ivec2(\n min(inputShapeRC - 1.0, floor(sourceFracIndexRC + "+c+")));\n\n float newValue = getA(b, sourceNearestRC.x, sourceNearestRC.y, d);\n\n setOutput(newValue);\n }\n ";}}(),ReverseProgram=function(){return function(e,t){this.variableNames=["x"];var n=e.length;if(n>4)throw new Error("WebGL backend: Reverse of rank-"+n+" tensor is not yet supported");if(this.outputShape=e,1!==n){var r=e.map(function(n,r){return function(n){return -1!==t.indexOf(n)&&1!==e[n]?e[n]+" - coords["+n+"] - 1":"coords["+n+"]"}(r)}).join(","),a=getCoordsDataType(n);this.userCode="\n void main() {\n "+a+" coords = getOutputCoords();\n setOutput(getX("+r+"));\n }\n ";}else this.userCode="\n void main() {\n int coord = getOutputCoords();\n setOutput(getX("+e[0]+" - coord - 1));\n }\n ";}}(),SegmentOpProgram=function(){return function(e,t){this.variableNames=["x","segmentIds"];var n=e.windowSize,r=e.batchSize,a=e.inSize,o=e.numSegments,i=o*Math.ceil(a/n);this.outputShape=[r,i];var s=4*Math.floor(n/4),u=n%4,l="\n sumValue += dot(values, filter);\n ",c="";a%n>0&&(c="\n if (inIdx < 0 || inIdx >= "+a+") {\n return initializationValue;\n }\n ");var d="";a%n>0&&(d="\n if (inIdx < 0 || inIdx >= "+a+") {\n return -1.0;\n }\n "),this.userCode="\n const float initializationValue = 0.0;\n\n float getValue(int batch, int inIdx) {\n "+c+"\n return getX(batch, inIdx);\n }\n\n float getSegmentIdAtIndex(int inIdx) {\n "+d+"\n return getSegmentIds(inIdx);\n }\n\n void main() {\n ivec2 coords = getOutputCoords();\n int batch = coords[0];\n int outIdx = coords[1];\n int inOffset = int(floor(float(outIdx) / float(\n "+o+")) * float("+n+"));\n int currentSeg = int(mod(float(outIdx), float("+o+")));\n\n float sumValue = 0.0;\n\n for (int i = 0; i < "+s+"; i += 4) {\n int inIdx = inOffset + i;\n vec4 values = vec4(\n getValue(batch, inIdx),\n getValue(batch, inIdx + 1),\n getValue(batch, inIdx + 2),\n getValue(batch, inIdx + 3)\n );\n\n vec4 filter = vec4(\n int(getSegmentIdAtIndex(inIdx)) == currentSeg ? 1 : 0,\n int(getSegmentIdAtIndex(inIdx + 1)) == currentSeg ? 1 : 0,\n int(getSegmentIdAtIndex(inIdx + 2)) == currentSeg ? 1 : 0,\n int(getSegmentIdAtIndex(inIdx + 3)) == currentSeg ? 1 : 0\n );\n\n "+l+"\n }\n\n int inIdx = inOffset + "+s+";\n if ("+(1===u)+") {\n vec4 values = vec4(\n getValue(batch, inIdx),\n initializationValue,\n initializationValue,\n initializationValue\n );\n\n int inIdxSeg = int(getSegmentIdAtIndex(inIdx));\n\n vec4 filter = vec4(\n int(getSegmentIdAtIndex(inIdx)) == currentSeg ? 1 : 0,\n 0,\n 0,\n 0\n );\n\n "+l+"\n } else if ("+(2===u)+") {\n vec4 values = vec4(\n getValue(batch, inIdx),\n getValue(batch, inIdx + 1),\n initializationValue,\n initializationValue\n );\n\n vec4 filter = vec4(\n int(getSegmentIdAtIndex(inIdx)) == currentSeg ? 1 : 0,\n int(getSegmentIdAtIndex(inIdx + 1)) == currentSeg ? 1 : 0,\n 0,\n 0\n );\n\n "+l+"\n } else if ("+(3===u)+") {\n vec4 values = vec4(\n getValue(batch, inIdx),\n getValue(batch, inIdx + 1),\n getValue(batch, inIdx + 2),\n initializationValue\n );\n\n vec4 filter = vec4(\n int(getSegmentIdAtIndex(inIdx)) == currentSeg ? 1 : 0,\n int(getSegmentIdAtIndex(inIdx + 1)) == currentSeg ? 1 : 0,\n int(getSegmentIdAtIndex(inIdx + 2)) == currentSeg ? 1 : 0,\n 0\n );\n\n "+l+"\n }\n setOutput(sumValue);\n }\n ";}}(),SliceProgram=function(){function e(e){this.variableNames=["source"],this.outputShape=e,this.rank=e.length;var t=getCoordsDataType(this.rank),n=getCoords$1(this.rank);this.userCode="\n uniform "+t+" start;\n\n void main() {\n "+t+" sourceLoc = start + getOutputCoords();\n setOutput(getSource("+n+"));\n }\n ";}return e.prototype.getCustomSetupFunc=function(e){var t=this;if(e.length!==this.rank)throw Error("The rank ("+this.rank+") of the program must match the length of start ("+e.length+")");return function(n,r){if(null!=t.startLoc||(t.startLoc=n.getUniformLocationNoThrow(r,"start"),null!=t.startLoc))if(1===t.rank)n.gl.uniform1i(t.startLoc,e[0]);else if(2===t.rank)n.gl.uniform2i(t.startLoc,e[0],e[1]);else if(3===t.rank)n.gl.uniform3i(t.startLoc,e[0],e[1],e[2]);else{if(4!==t.rank)throw Error("Slicing for rank "+t.rank+" is not yet supported");n.gl.uniform4i(t.startLoc,e[0],e[1],e[2],e[3]);}}},e}();function getCoords$1(e){if(1===e)return "sourceLoc";if(2===e)return "sourceLoc.x, sourceLoc.y";if(3===e)return "sourceLoc.x, sourceLoc.y, sourceLoc.z";if(4===e)return "sourceLoc.x, sourceLoc.y, sourceLoc.z, sourceLoc.w";throw Error("Slicing for rank "+e+" is not yet supported")}var StridedSliceProgram=function(){return function(e,t,n){this.variableNames=["x"],this.outputShape=n,this.rank=n.length;var r=getCoordsDataType(this.rank),a="";a=1===this.rank?"coords * strides + begin":n.map(function(e,t){return "coords["+t+"] * strides["+t+"] + begin["+t+"]"}).join(","),this.userCode="\n "+r+" begin = "+r+"("+e+");\n "+r+" strides = "+r+"("+t+");\n\n void main() {\n "+r+" coords = getOutputCoords();\n setOutput(getX("+a+"));\n }\n ";}}(),TextureManager=function(){function e(e){this.gpgpu=e,this.numUsedTextures=0,this.numFreeTextures=0,this.freeTextures={},this.logEnabled=!1,this.usedTextures={};}return e.prototype.acquireTexture=function(e,t){var n,r=getPhysicalFromLogicalTextureType(t),a=getKeyFromTextureShape(e,r);if(a in this.freeTextures||(this.freeTextures[a]=[]),a in this.usedTextures||(this.usedTextures[a]=[]),this.freeTextures[a].length>0){this.numFreeTextures--,this.numUsedTextures++,this.log();var o=this.freeTextures[a].shift();return this.usedTextures[a].push(o),o}return this.numUsedTextures++,this.log(),r===PhysicalTextureType.FLOAT32?n=this.gpgpu.createFloat32MatrixTexture(e[0],e[1]):r===PhysicalTextureType.FLOAT16?n=this.gpgpu.createFloat16MatrixTexture(e[0],e[1]):r===PhysicalTextureType.UNSIGNED_BYTE&&(n=this.gpgpu.createUnsignedBytesMatrixTexture(e[0],e[1])),this.usedTextures[a].push(n),n},e.prototype.releaseTexture=function(e,t,n){var r=getKeyFromTextureShape(t,getPhysicalFromLogicalTextureType(n));r in this.freeTextures||(this.freeTextures[r]=[]),this.freeTextures[r].push(e),this.numFreeTextures++,this.numUsedTextures--;var a=this.usedTextures[r],o=a.indexOf(e);if(o<0)throw new Error("Cannot release a texture that was never provided by this texture manager");a.splice(o,1),this.log();},e.prototype.log=function(){if(this.logEnabled){var e=this.numFreeTextures+this.numUsedTextures;console.log("Free/Used",this.numFreeTextures+" / "+this.numUsedTextures,"("+e+")");}},e.prototype.getNumUsedTextures=function(){return this.numUsedTextures},e.prototype.getNumFreeTextures=function(){return this.numFreeTextures},e.prototype.dispose=function(){var e=this;if(null!=this.freeTextures){for(var t in this.freeTextures)this.freeTextures[t].forEach(function(t){e.gpgpu.deleteMatrixTexture(t);});for(var t in this.usedTextures)this.usedTextures[t].forEach(function(t){e.gpgpu.deleteMatrixTexture(t);});this.freeTextures=null,this.usedTextures=null,this.numUsedTextures=0,this.numFreeTextures=0;}},e}();function getPhysicalFromLogicalTextureType(e){if(e===TextureUsage.DOWNLOAD||e===TextureUsage.PIXELS)return PhysicalTextureType.UNSIGNED_BYTE;if(e===TextureUsage.UPLOAD)return PhysicalTextureType.FLOAT32;if(e===TextureUsage.RENDER)return ENV.get("WEBGL_RENDER_FLOAT32_ENABLED")?PhysicalTextureType.FLOAT32:PhysicalTextureType.FLOAT16;throw new Error("Unknown logical texture type "+e)}function getKeyFromTextureShape(e,t){return e[0]+"_"+e[1]+"_"+t}var TileProgram=function(){return function(e,t){this.variableNames=["A"];for(var n=new Array(e.length),r=0;r5)throw Error("Tile for rank "+t+" is not yet supported");if(1===t)return "imod(resRC, "+e[0]+")";for(var n=["resRC.x","resRC.y","resRC.z","resRC.w","resRC.u"],r=[],a=0;a6)throw Error("Transpose for rank "+t+" is not yet supported");for(var n=["resRC.x","resRC.y","resRC.z","resRC.w","resRC.u","resRC.v"],r=new Array(t),a=0;a= 0.0) ? scale * x : scaleAlpha * (exp(x) - 1.0);\n";function STEP(e){return void 0===e&&(e=0),CHECK_NAN_SNIPPET$1+"\n return x > 0.0 ? 1.0 : float("+e+");\n "}var NEG="return -x;",CEIL="return ceil(x);",FLOOR="return floor(x);",SIGN="\n if (isNaN(x)) { return 0.0; }\n return sign(x);\n",ROUND="\n // OpenGL ES does not support round function.\n // The algorithm is based on banker's rounding.\n float base = floor(x);\n if ((x - base) < 0.5) {\n return floor(x);\n } else if ((x - base) > 0.5) {\n return ceil(x);\n } else {\n if (mod(base, 2.0) == 0.0) {\n return base;\n } else {\n return base + 1.0;\n }\n }\n",EXP="return exp(x);",EXPM1="return exp(x) - 1.0;",LOG="return log(x);",LOG1P="return log(1.0 + x);",SQRT="return sqrt(x);",RSQRT="return inversesqrt(x);",SIGMOID="return 1.0 / (1.0 + exp(-1.0 * x));",SOFTPLUS="\n float epsilon = 1.1920928955078125e-7;\n float threshold = log(epsilon) + 2.0;\n\n bool too_large = x > -threshold;\n bool too_small = x < threshold;\n\n float result;\n float exp_x = exp(x);\n\n if (too_large){\n result = x;\n }\n else if (too_small){\n result = exp_x;\n }\n else{\n result = log(exp_x + 1.0);\n }\n return result;\n",SIN=CHECK_NAN_SNIPPET$1+"\n return sin(x);\n",COS=CHECK_NAN_SNIPPET$1+"\n return cos(x);\n",TAN="return tan(x);",ASIN="return asin(x);",ACOS="return acos(x);",ATAN=CHECK_NAN_SNIPPET$1+"\n return atan(x);\n",SINH="\n float e2x = exp(x);\n return (e2x - 1.0 / e2x) / 2.0;\n",COSH="\n float e2x = exp(-x);\n return (e2x + 1.0 / e2x) / 2.0;\n",TANH="\n float e2x = exp(-2.0 * abs(x));\n return sign(x) * (1.0 - e2x) / (1.0 + e2x);\n",ASINH="return log(x + sqrt(x * x + 1.0));",ACOSH="return log(x + sqrt(x * x - 1.0));",ATANH="return (log(1.0 + x) - log(1.0 - x)) / 2.0;",ERF='\n // Error function is calculated approximately with elementary function.\n // See "Handbook of Mathematical Functions with Formulas,\n // Graphs, and Mathematical Tables", Abramowitz and Stegun.\n float p = '+ERF_P+";\n float a1 = "+ERF_A1+";\n float a2 = "+ERF_A2+";\n float a3 = "+ERF_A3+";\n float a4 = "+ERF_A4+";\n float a5 = "+ERF_A5+";\n\n float t = 1.0 / (1.0 + p * x);\n return 1.0 - (((((a5*t + a4)*t) + a3)*t + a2)*t + a1)*t*exp(-x*x);\n",SQUARE="return x * x;",RECIPROCAL="return 1.0 / x;",LOGICAL_NOT="return float(!(x >= 1.0));",TO_INT="return float(int(x));",BEFORE_PAGING_CONSTANT=300,SIZE_UPLOAD_UNIFORM=32,MathBackendWebGL=function(){function e(e,t){if(void 0===t&&(t=!0),this.gpgpu=e,this.delayedStorage=t,this.texData=new WeakMap,this.pendingRead=new WeakMap,this.pendingDisposal=new WeakSet,this.lruDataGPU=[],this.numBytesInGPU=0,this.uploadWaitMs=0,this.downloadWaitMs=0,this.binaryCache={},this.disposed=!1,ENV.get("WEBGL_VERSION")<1)throw new Error("WebGL is not supported on this device");ENV.get("IS_BROWSER")&&(this.canvas=document.createElement("canvas")),null==e?(this.gpgpu=new GPGPUContext(createWebGLContext(this.canvas)),this.gpgpuCreatedLocally=!0):this.gpgpuCreatedLocally=!1,this.NUM_BYTES_BEFORE_PAGING=window.screen.height*window.screen.width*window.devicePixelRatio*BEFORE_PAGING_CONSTANT,this.textureManager=new TextureManager(this.gpgpu);}return e.prototype.register=function(e,t,n){if(this.texData.has(e))throw new Error("Data buffer is already registered");this.texData.set(e,{shape:t,dtype:n,values:null,texture:null,texShape:null,usage:TextureUsage.RENDER});},e.prototype.fromPixels=function(e,t){if(null==e)throw new Error("MathBackendWebGL.writePixels(): pixels can not be null");var n=[e.height,e.width],r=[e.height,e.width,t];if(e instanceof HTMLVideoElement){if(null==this.fromPixelsCanvas){if(!ENV.get("IS_BROWSER"))throw new Error("Can't read pixels from HTMLImageElement outside the browser.");if("complete"!==document.readyState)throw new Error("The DOM is not ready yet. Please call tf.fromPixels() once the DOM is ready. One way to do that is to add an event listener for `DOMContentLoaded` on the document object");this.fromPixelsCanvas=document.createElement("canvas");}this.fromPixelsCanvas.width=e.width,this.fromPixelsCanvas.height=e.height,this.fromPixelsCanvas.getContext("2d").drawImage(e,0,0,e.width,e.height),e=this.fromPixelsCanvas;}var a=Tensor.make(n,{},"int32");this.texData.get(a.dataId).usage=TextureUsage.PIXELS,this.gpgpu.uploadPixelDataToTexture(this.getTexture(a.dataId),e);var o=new FromPixelsProgram(r),i=this.compileAndRun(o,[a]);return a.dispose(),i},e.prototype.write=function(e,t){if(null==t)throw new Error("MathBackendWebGL.write(): values can not be null");this.throwIfNoData(e);var n=this.texData.get(e),r=n.texture,a=n.texShape,o=n.usage;null!=r&&(this.releaseTexture(e,r,a,o),n.texture=null,n.texShape=null),n.usage=TextureUsage.UPLOAD,n.values=t,this.delayedStorage||this.uploadToGPU(e);},e.prototype.readSync=function(e){this.throwIfNoData(e);var t=this.texData.get(e),n=t.shape,r=t.texture,a=t.values,o=t.texShape,i=t.dtype;if(null!=a)return this.cacheOnCPU(e),a;var s,u,l=null!=this.activeTimers;if(l&&(s=performance.now()),ENV.get("WEBGL_DOWNLOAD_FLOAT_ENABLED"))u=this.gpgpu.downloadFloat32MatrixFromOutputTexture(r,o[0],o[1]);else{var c=Tensor.make(n,{});this.texData.get(c.dataId).usage=TextureUsage.DOWNLOAD;var d=Tensor.make(n,{dataId:e},i),p=new EncodeFloatProgram(n),h=this.compileAndRun(p,[d],c),f=this.texData.get(c.dataId);u=this.gpgpu.downloadByteEncodedFloatMatrixFromOutputTexture(f.texture,f.texShape[0],f.texShape[1]),h.dispose(),d.dispose(),c.dispose();}return l&&(this.downloadWaitMs+=performance.now()-s),this.cacheOnCPU(e,u),t.values},e.prototype.read=function(e){return __awaiter(this,void 0,void 0,function(){var t,n,r,a,o,i,s,u;return __generator(this,function(l){switch(l.label){case 0:return this.pendingRead.has(e)?(t=this.pendingRead.get(e),[2,new Promise(function(e){return t.push(e)})]):(this.throwIfNoData(e),n=this.texData.get(e),r=n.texture,a=n.values,o=n.texShape,null!=a?(this.cacheOnCPU(e),[2,a]):ENV.get("WEBGL_GET_BUFFER_SUB_DATA_ASYNC_EXTENSION_ENABLED")?[4,this.gpgpu.downloadMatrixFromTextureAsync(r,o[0],o[1])]:[3,2]);case 1:return i=l.sent(),this.cacheOnCPU(e,i),[2,n.values];case 2:return 0===ENV.get("WEBGL_DISJOINT_QUERY_TIMER_EXTENSION_VERSION")?[2,this.readSync(e)]:(this.pendingRead.set(e,[]),[4,this.gpgpu.runQuery(function(){})]);case 3:return l.sent(),s=this.pendingRead.get(e),this.pendingRead.delete(e),u=this.readSync(e),s.forEach(function(e){return e(u)}),this.pendingDisposal.has(e)&&(this.pendingDisposal.delete(e),this.disposeData(e)),[2,u]}})})},e.prototype.time=function(e){return __awaiter(this,void 0,void 0,function(){var t,n,r,a,o,i;return __generator(this,function(s){switch(s.label){case 0:return t=this.activeTimers,n=[],r=!1,null==this.programTimersStack?(this.programTimersStack=n,r=!0):this.activeTimers.push(n),this.activeTimers=n,e(),a=flatten(this.activeTimers),this.activeTimers=t,r&&(this.programTimersStack=null),[4,Promise.all(a).then(function(e){var t=0;return e.forEach(function(e){return t+=e}),t})];case 1:return o=s.sent(),i={uploadWaitMs:this.uploadWaitMs,downloadWaitMs:this.downloadWaitMs,kernelMs:o,wallMs:null},this.uploadWaitMs=0,this.downloadWaitMs=0,[2,i]}})})},e.prototype.memory=function(){return {unreliable:!1,numBytesInGPU:this.numBytesInGPU}},e.prototype.startTimer=function(){return ENV.get("WEBGL_DISJOINT_QUERY_TIMER_EXTENSION_VERSION")>0?this.gpgpu.beginQuery():{startMs:performance.now(),endMs:null}},e.prototype.endTimer=function(e){return ENV.get("WEBGL_DISJOINT_QUERY_TIMER_EXTENSION_VERSION")>0?(this.gpgpu.endQuery(),e):(e.endMs=performance.now(),e)},e.prototype.getQueryTime=function(e){return __awaiter(this,void 0,void 0,function(){var t;return __generator(this,function(n){return ENV.get("WEBGL_DISJOINT_QUERY_TIMER_EXTENSION_VERSION")>0?[2,this.gpgpu.pollQueryTime(e)]:[2,(t=e).endMs-t.startMs]})})},e.prototype.disposeData=function(e){if(!this.pendingDisposal.has(e))if(this.pendingRead.has(e))this.pendingDisposal.add(e);else if(this.texData.has(e)){var t=this.texData.get(e),n=t.texture,r=t.texShape,a=t.usage;null!=n&&this.releaseTexture(e,n,r,a),this.texData.delete(e);}},e.prototype.getTexture=function(e){return this.uploadToGPU(e),this.texData.get(e).texture},e.prototype.getGPGPUContext=function(){return this.gpgpu},e.prototype.getCanvas=function(){return this.canvas},e.prototype.slice=function(e,t,n){var r=new SliceProgram(n),a=r.getCustomSetupFunc(t);return this.compileAndRun(r,[e],null,a)},e.prototype.stridedSlice=function(e,t,n,r,a,o){var i=getStridedSlicedInfo(e.shape,t,n,r,a,o),s=i[0],u=i[1];if(u.some(function(e){return 0===e}))return tensor([],u);var l=new StridedSliceProgram(s,r,u);return this.compileAndRun(l,[e])},e.prototype.reverse=function(e,t){var n=new ReverseProgram(e.shape,t);return this.compileAndRun(n,[e])},e.prototype.concat=function(e,t){var n=new ConcatProgram(e.shape,t.shape);return this.compileAndRun(n,[e,t])},e.prototype.neg=function(e){var t=new UnaryOpProgram(e.shape,NEG);return this.compileAndRun(t,[e])},e.prototype.matMul=function(e,t,n,r){var a=new MatMulProgram(e.shape,t.shape,n,r);return this.compileAndRun(a,[e,t])},e.prototype.multiply=function(e,t){var n=new BinaryOpProgram(MUL,e.shape,t.shape),r=this.makeOutputArray(n.outputShape,upcastType(e.dtype,t.dtype));return this.compileAndRun(n,[e,t],r)},e.prototype.batchNormalization=function(e,t,n,r,a,o){var i=[e,t,n],s=null;null!=o&&(s=o.shape,i.push(o));var u=null;null!=a&&(u=a.shape,i.push(a));var l=new BatchNormProgram(e.shape,t.shape,n.shape,s,u,r);return this.compileAndRun(l,i)},e.prototype.localResponseNormalization4D=function(e,t,n,r,a){var o=new LRNProgram(e.shape,t,n,r,a);return this.compileAndRun(o,[e])},e.prototype.tile=function(e,t){var n=new TileProgram(e.shape,t);return this.compileAndRun(n,[e])},e.prototype.pad=function(e,t,n){var r=new PadProgram(e.shape,t,n);return this.compileAndRun(r,[e])},e.prototype.transpose=function(e,t){var n=new TransposeProgram(e.shape,t);return this.compileAndRun(n,[e])},e.prototype.gather=function(e,t,n){var r=new GatherProgram(e.shape,t.size,n);return this.compileAndRun(r,[e,t])},e.prototype.reduce=function(e,t,n){var r=e.shape[0],a=e.shape[1],o=computeOptimalWindowSize(a),i=new ReduceProgram({windowSize:o,inSize:a,batchSize:r},t),s=i.outputShape,u=s[0],l=s[1],c=this.makeOutputArray([u,l],n);return this.compileAndRun(i,[e],c),1===c.shape[1]?c:this.reduce(c,t,n)},e.prototype.argReduce=function(e,t,n){void 0===n&&(n=null);var r=e.shape[0],a=e.shape[1];null!=n&&(r=n.shape[0],a=n.shape[1]);var o=computeOptimalWindowSize(a),i=new ArgMinMaxProgram({windowSize:o,inSize:a,batchSize:r},t,null==n),s=i.outputShape,u=s[0],l=s[1],c=this.makeOutputArray([u,l],"int32"),d=[e];return null!=n&&d.push(n),this.compileAndRun(i,d,c),1===c.shape[1]?c:this.argReduce(e,t,c)},e.prototype.sum=function(e,t){assertAxesAreInnerMostDims("sum",t,e.rank);var n=computeOutAndReduceShapes(e.shape,t),r=n[0],a=sizeFromShape(n[1]),o=e.as2D(-1,a),i=sumOutType(e.dtype);return this.reduce(o,"sum",i).reshape(r)},e.prototype.unsortedSegmentSum=function(e,t,n){var r=0,a=getAxesPermutation([r],e.rank),o=e;null!=a&&(o=e.transpose(a),r=getInnerMostAxes(1,e.rank)[0]);var i=computeOutShape$1(o.shape,r,n),s=sizeFromShape([o.shape[r]]),u=o.as2D(-1,s),l=sumOutType(e.dtype),c=this.segOpCompute(u,"unsortedSegmentSum",t,l,n).reshape(i);return null!=a&&(c=c.transpose(getUndoAxesPermutation(a))),c},e.prototype.segOpCompute=function(e,t,n,r,a){var o=e.shape[0],i=e.shape[1],s=segOpComputeOptimalWindowSize(i,a),u=new SegmentOpProgram({windowSize:s,inSize:i,batchSize:o,numSegments:a},t),l=u.outputShape,c=l[0],d=l[1],p=this.makeOutputArray([c,d],r);return this.compileAndRun(u,[e,n],p),p.shape[1]===a?p:(n=range(0,a).tile([i/s]),this.segOpCompute(p,t,n,r,a))},e.prototype.argMin=function(e,t){var n=[t];assertAxesAreInnerMostDims("argMin",n,e.rank);var r=computeOutAndReduceShapes(e.shape,n),a=r[0],o=sizeFromShape(r[1]),i=e.as2D(-1,o);return this.argReduce(i,"min").reshape(a)},e.prototype.argMax=function(e,t){var n=[t];assertAxesAreInnerMostDims("argMax",n,e.rank);var r=computeOutAndReduceShapes(e.shape,n),a=r[0],o=sizeFromShape(r[1]),i=e.as2D(-1,o);return this.argReduce(i,"max").reshape(a)},e.prototype.cumsum=function(e,t,n,r){if(t!==e.rank-1)throw new Error("WebGL cumsum shader expects an inner-most axis="+(e.rank-1)+" but got axis="+t);var a=new CumSumProgram(e.shape,n,r);return this.compileAndRun(a,[e])},e.prototype.equal=function(e,t){var n=new BinaryOpProgram(EQUAL,e.shape,t.shape),r=this.makeOutputArray(n.outputShape,"bool");return this.compileAndRun(n,[e,t],r)},e.prototype.notEqual=function(e,t){var n=new BinaryOpProgram(NOT_EQUAL,e.shape,t.shape),r=this.makeOutputArray(n.outputShape,"bool");return this.compileAndRun(n,[e,t],r)},e.prototype.less=function(e,t){var n=new BinaryOpProgram(LESS,e.shape,t.shape),r=this.makeOutputArray(n.outputShape,"bool");return this.compileAndRun(n,[e,t],r)},e.prototype.lessEqual=function(e,t){var n=new BinaryOpProgram(LESS_EQUAL,e.shape,t.shape),r=this.makeOutputArray(n.outputShape,"bool");return this.compileAndRun(n,[e,t],r)},e.prototype.greater=function(e,t){var n=new BinaryOpProgram(GREATER,e.shape,t.shape),r=this.makeOutputArray(n.outputShape,"bool");return this.compileAndRun(n,[e,t],r)},e.prototype.greaterEqual=function(e,t){var n=new BinaryOpProgram(GREATER_EQUAL,e.shape,t.shape),r=this.makeOutputArray(n.outputShape,"bool");return this.compileAndRun(n,[e,t],r)},e.prototype.logicalNot=function(e){var t=new UnaryOpProgram(e.shape,LOGICAL_NOT);return this.compileAndRun(t,[e])},e.prototype.logicalAnd=function(e,t){var n=new BinaryOpProgram(LOGICAL_AND,e.shape,t.shape),r=this.makeOutputArray(n.outputShape,"bool");return this.compileAndRun(n,[e,t],r)},e.prototype.logicalOr=function(e,t){var n=new BinaryOpProgram(LOGICAL_OR,e.shape,t.shape),r=this.makeOutputArray(n.outputShape,"bool");return this.compileAndRun(n,[e,t],r)},e.prototype.where=function(e,t,n,r){var a=new WhereProgram(e.rank,t.shape,t.rank),o=this.makeOutputArray(a.outputShape,r);return this.compileAndRun(a,[e,t,n],o)},e.prototype.topKValues=function(e,t){throw new Error("topKValues GPU not yet implemented!")},e.prototype.topKIndices=function(e,t){throw new Error("topKIndices GPU not yet implemented!")},e.prototype.min=function(e,t){assertAxesAreInnerMostDims("min",t,e.rank);var n=computeOutAndReduceShapes(e.shape,t),r=n[0],a=sizeFromShape(n[1]),o=e.as2D(-1,a);return this.reduce(o,"min",o.dtype).reshape(r)},e.prototype.minimum=function(e,t){var n=new BinaryOpProgram(MIN,e.shape,t.shape);return this.compileAndRun(n,[e,t])},e.prototype.mod=function(e,t){var n=new BinaryOpProgram(MOD,e.shape,t.shape);return this.compileAndRun(n,[e,t])},e.prototype.max=function(e,t){assertAxesAreInnerMostDims("max",t,e.rank);var n=computeOutAndReduceShapes(e.shape,t),r=n[0],a=sizeFromShape(n[1]),o=e.as2D(-1,a);return this.reduce(o,"max",o.dtype).reshape(r)},e.prototype.maximum=function(e,t){var n=new BinaryOpProgram(MAX,e.shape,t.shape);return this.compileAndRun(n,[e,t])},e.prototype.all=function(e,t){assertAxesAreInnerMostDims("all",t,e.rank);var n=computeOutAndReduceShapes(e.shape,t),r=n[0],a=sizeFromShape(n[1]),o=e.as2D(-1,a);return this.reduce(o,"all",o.dtype).reshape(r)},e.prototype.squaredDifference=function(e,t){var n=new BinaryOpProgram(SQUARED_DIFFERENCE,e.shape,t.shape);return this.compileAndRun(n,[e,t])},e.prototype.realDivide=function(e,t){var n=new BinaryOpProgram(DIV,e.shape,t.shape),r=this.makeOutputArray(n.outputShape,"float32");return this.compileAndRun(n,[e,t],r)},e.prototype.floorDiv=function(e,t){var n=new BinaryOpProgram(INT_DIV,e.shape,t.shape),r=this.makeOutputArray(n.outputShape,"int32");return this.compileAndRun(n,[e,t],r)},e.prototype.add=function(e,t){var n=new BinaryOpProgram(ADD,e.shape,t.shape),r=this.makeOutputArray(n.outputShape,upcastType(e.dtype,t.dtype));return this.compileAndRun(n,[e,t],r)},e.prototype.subtract=function(e,t){var n=new BinaryOpProgram(SUB,e.shape,t.shape),r=this.makeOutputArray(n.outputShape,upcastType(e.dtype,t.dtype));return this.compileAndRun(n,[e,t],r)},e.prototype.pow=function(e,t){var n=new BinaryOpProgram(POW,e.shape,t.shape),r=this.makeOutputArray(n.outputShape,upcastType(e.dtype,t.dtype));return this.compileAndRun(n,[e,t],r)},e.prototype.ceil=function(e){var t=new UnaryOpProgram(e.shape,CEIL);return this.compileAndRun(t,[e])},e.prototype.floor=function(e){var t=new UnaryOpProgram(e.shape,FLOOR);return this.compileAndRun(t,[e])},e.prototype.sign=function(e){var t=new UnaryOpProgram(e.shape,SIGN);return this.compileAndRun(t,[e])},e.prototype.round=function(e){var t=new UnaryOpProgram(e.shape,ROUND);return this.compileAndRun(t,[e])},e.prototype.exp=function(e){var t=new UnaryOpProgram(e.shape,EXP);return this.compileAndRun(t,[e])},e.prototype.expm1=function(e){var t=new UnaryOpProgram(e.shape,EXPM1);return this.compileAndRun(t,[e])},e.prototype.log=function(e){var t=new UnaryOpProgram(e.shape,LOG);return this.compileAndRun(t,[e])},e.prototype.log1p=function(e){var t=new UnaryOpProgram(e.shape,LOG1P);return this.compileAndRun(t,[e])},e.prototype.sqrt=function(e){var t=new UnaryOpProgram(e.shape,SQRT);return this.compileAndRun(t,[e])},e.prototype.rsqrt=function(e){var t=new UnaryOpProgram(e.shape,RSQRT);return this.compileAndRun(t,[e])},e.prototype.square=function(e){var t=new UnaryOpProgram(e.shape,SQUARE);return this.compileAndRun(t,[e])},e.prototype.reciprocal=function(e){var t=new UnaryOpProgram(e.shape,RECIPROCAL);return this.compileAndRun(t,[e])},e.prototype.relu=function(e){var t=new UnaryOpProgram(e.shape,RELU);return this.compileAndRun(t,[e])},e.prototype.elu=function(e){var t=new UnaryOpProgram(e.shape,ELU);return this.compileAndRun(t,[e])},e.prototype.eluDer=function(e,t){var n=new BinaryOpProgram(ELU_DER,e.shape,t.shape);return this.compileAndRun(n,[e,t])},e.prototype.selu=function(e){var t=new UnaryOpProgram(e.shape,SELU);return this.compileAndRun(t,[e])},e.prototype.int=function(e){var t=new UnaryOpProgram(e.shape,TO_INT),n=this.makeOutputArray(t.outputShape,"int32");return this.compileAndRun(t,[e],n)},e.prototype.clip=function(e,t,n){var r=new ClipProgram(e.shape,t,n);return this.compileAndRun(r,[e])},e.prototype.abs=function(e){var t=new UnaryOpProgram(e.shape,ABS);return this.compileAndRun(t,[e])},e.prototype.sigmoid=function(e){var t=new UnaryOpProgram(e.shape,SIGMOID);return this.compileAndRun(t,[e])},e.prototype.softplus=function(e){var t=new UnaryOpProgram(e.shape,SOFTPLUS);return this.compileAndRun(t,[e])},e.prototype.sin=function(e){var t=new UnaryOpProgram(e.shape,SIN);return this.compileAndRun(t,[e])},e.prototype.cos=function(e){var t=new UnaryOpProgram(e.shape,COS);return this.compileAndRun(t,[e])},e.prototype.tan=function(e){var t=new UnaryOpProgram(e.shape,TAN);return this.compileAndRun(t,[e])},e.prototype.asin=function(e){var t=new UnaryOpProgram(e.shape,ASIN);return this.compileAndRun(t,[e])},e.prototype.acos=function(e){var t=new UnaryOpProgram(e.shape,ACOS);return this.compileAndRun(t,[e])},e.prototype.atan=function(e){var t=new UnaryOpProgram(e.shape,ATAN);return this.compileAndRun(t,[e])},e.prototype.atan2=function(e,t){var n=new BinaryOpProgram(ATAN2,e.shape,t.shape);return this.compileAndRun(n,[e,t])},e.prototype.sinh=function(e){var t=new UnaryOpProgram(e.shape,SINH);return this.compileAndRun(t,[e])},e.prototype.cosh=function(e){var t=new UnaryOpProgram(e.shape,COSH);return this.compileAndRun(t,[e])},e.prototype.tanh=function(e){var t=new UnaryOpProgram(e.shape,TANH);return this.compileAndRun(t,[e])},e.prototype.asinh=function(e){var t=new UnaryOpProgram(e.shape,ASINH);return this.compileAndRun(t,[e])},e.prototype.acosh=function(e){var t=new UnaryOpProgram(e.shape,ACOSH);return this.compileAndRun(t,[e])},e.prototype.atanh=function(e){var t=new UnaryOpProgram(e.shape,ATANH);return this.compileAndRun(t,[e])},e.prototype.erf=function(e){var t=new UnaryOpProgram(e.shape,ERF);return this.compileAndRun(t,[e])},e.prototype.step=function(e,t){var n=new UnaryOpProgram(e.shape,STEP(t));return this.compileAndRun(n,[e])},e.prototype.conv2d=function(e,t,n){var r=new Conv2DProgram(n);return this.compileAndRun(r,[e,t])},e.prototype.conv2dDerInput=function(e,t,n){var r=new Conv2DDerInputProgram(n);return this.compileAndRun(r,[e,t])},e.prototype.conv2dDerFilter=function(e,t,n){var r=new Conv2DDerFilterProgram(n);return this.compileAndRun(r,[e,t])},e.prototype.depthwiseConv2D=function(e,t,n){var r=new DepthwiseConv2DProgram(n);return this.compileAndRun(r,[e,t])},e.prototype.depthwiseConv2DDerInput=function(e,t,n){var r=new DepthwiseConv2DDerInputProgram(n);return this.compileAndRun(r,[e,t])},e.prototype.depthwiseConv2DDerFilter=function(e,t,n){var r=new DepthwiseConv2DDerFilterProgram(n);return this.compileAndRun(r,[e,t])},e.prototype.maxPool=function(e,t){var n=new Pool2DProgram(t,"max",!1),r=this.makeOutputArray(n.outputShape,e.dtype);return this.compileAndRun(n,[e],r)},e.prototype.avgPool=function(e,t){var n=new Pool2DProgram(t,"avg",!1),r=this.makeOutputArray(n.outputShape,"float32");return this.compileAndRun(n,[e],r)},e.prototype.maxPoolBackprop=function(e,t,n,r){var a=new Pool2DProgram(r,"max",!0),o=this.compileAndRun(a,[t]),i=new MaxPool2DBackpropProgram(r),s=this.makeOutputArray(i.outputShape,t.dtype),u=this.compileAndRun(i,[e,o],s);return o.dispose(),u},e.prototype.avgPoolBackprop=function(e,t,n){var r=new AvgPool2DBackpropProgram(n),a=this.makeOutputArray(r.outputShape,t.dtype);return this.compileAndRun(r,[e],a)},e.prototype.cast=function(e,t){return castTensor(e,t,this)},e.prototype.reshape=function(e,t){return reshapeTensor(e,t)},e.prototype.resizeBilinear=function(e,t,n,r){var a=new ResizeBilinearProgram(e.shape,t,n,r);return this.compileAndRun(a,[e])},e.prototype.resizeBilinearBackprop=function(e,t,n){var r=new ResizeBilinearBackpropProgram(e,t,n);return this.compileAndRun(r,[e])},e.prototype.resizeNearestNeighbor=function(e,t,n,r){var a=new ResizeNearestNeighborProgram(e.shape,t,n,r);return this.compileAndRun(a,[e])},e.prototype.multinomial=function(e,t,n,r){var a=t?e:softmax(e),o=a.shape[0],i=a.shape[1],s=new MultinomialProgram(o,i,n),u=this.makeOutputArray(s.outputShape,"int32"),l=s.getCustomSetupFunc(r);return this.compileAndRun(s,[a],u,l)},e.prototype.oneHot=function(e,t,n,r){var a=new OneHotProgram(e.size,t,n,r);return this.compileAndRun(a,[e])},e.prototype.makeOutputArray=function(e,t){return Tensor.make(e,{},t)},e.prototype.compileAndRun=function(e,t,n,r){var a=this;null==n&&(n=this.makeOutputArray(e.outputShape,t[0].dtype));var o=t.map(function(e){var t=a.texData.get(e.dataId);return null==t.texture&&e.size<=SIZE_UPLOAD_UNIFORM?{tensor:e,texData:null,isUniform:!0}:(a.uploadToGPU(e.dataId),{tensor:e,texData:t,isUniform:!1})});this.uploadToGPU(n.dataId);var i,s={tensor:n,texData:this.texData.get(n.dataId),isUniform:!1},u=makeShaderKey(e,o,s),l=this.getAndSaveBinary(u,function(){return compileProgram(a.gpgpu,e,o,s)}),c=null!=this.activeTimers;if(c&&(i=this.startTimer()),runProgram(l,o,s,r),this.numBytesInGPU>this.NUM_BYTES_BEFORE_PAGING)for(var d=this.numBytesInGPU-this.NUM_BYTES_BEFORE_PAGING;d>0;){var p=this.lruDataGPU.shift(),h=this.texData.get(p),f=h.shape,g=h.dtype;d-=this.computeBytes(f,g),this.read(p);}return c&&(i=this.endTimer(i),this.activeTimers.push(this.getQueryTime(i))),n},e.prototype.getAndSaveBinary=function(e,t){return e in this.binaryCache||(this.binaryCache[e]=t()),this.binaryCache[e]},e.prototype.getTextureManager=function(){return this.textureManager},e.prototype.dispose=function(){if(!this.disposed){for(var e in this.binaryCache)this.gpgpu.deleteProgram(this.binaryCache[e].webGLProgram);this.textureManager.dispose(),this.canvas.remove(),null!=this.fromPixelsCanvas&&this.fromPixelsCanvas.remove(),this.gpgpuCreatedLocally&&this.gpgpu.dispose(),this.disposed=!0;}},e.prototype.throwIfNoData=function(e){if(!this.texData.has(e))throw new Error("WebGL backend: No data found for this tensor. Did you change your backend in the middle of the program? New backends can't use Tensors created with previous backends")},e.prototype.uploadToGPU=function(e){this.throwIfNoData(e);var t=this.texData.get(e),n=t.shape,r=t.values,a=t.texture,o=t.dtype,i=t.usage;if(null!=a)return this.lruDataGPU.splice(this.lruDataGPU.indexOf(e),1),void this.lruDataGPU.push(e);var s,u=null!=this.activeTimers;u&&(s=performance.now());var l=getTextureShapeFromLogicalShape(this.gpgpu.gl,n);t.texShape=l;var c=this.acquireTexture(e,l,i);t.texture=c,null!=r&&(this.gpgpu.uploadMatrixToTexture(c,l[0],l[1],typedArrayToFloat32(r,o)),t.values=null,u&&(this.uploadWaitMs+=performance.now()-s));},e.prototype.cacheOnCPU=function(e,t){var n=this.delayedStorage,r=this.texData.get(e),a=r.texture,o=r.texShape,i=r.dtype,s=r.usage;n&&null!=a&&(this.releaseTexture(e,a,o,s),r.texture=null,r.texShape=null),null!=t&&(r.values=float32ToTypedArray(t,i));},e.prototype.releaseTexture=function(e,t,n,r){var a=this.texData.get(e),o=a.shape,i=a.dtype,s=this.lruDataGPU.indexOf(e);s>=0&&this.lruDataGPU.splice(s,1),this.numBytesInGPU-=this.computeBytes(o,i),this.textureManager.releaseTexture(t,n,r);},e.prototype.acquireTexture=function(e,t,n){var r=this.texData.get(e),a=r.shape,o=r.dtype;return this.lruDataGPU.push(e),this.numBytesInGPU+=this.computeBytes(a,o),this.textureManager.acquireTexture(t,n)},e.prototype.computeBytes=function(e,t){return sizeFromShape(e)*bytesPerElement(t)},e}();function float32ToTypedArray(e,t){if("float32"===t)return e;if("int32"===t||"bool"===t){for(var n="int32"===t?new Int32Array(e.length):new Uint8Array(e.length),r=0;rp&&(p=g,h=f);}u[c]=h;}return i},e.prototype.cumsum=function(e,t,n,r){if(t!==e.rank-1)throw new Error("backend.cumsum in CPU expects an inner-most axis="+(e.rank-1)+" but got axis="+t);for(var a=upcastType(e.dtype,"int32"),o=zeros(e.shape,a),i=o.dataSync(),s=e.dataSync(),u=e.shape[e.rank-1],l=r?function(e,t){return e+u-t-1}:function(e,t){return e+t},c=0;ct?1:0})},e.prototype.greaterEqual=function(e,t){return this.broadcastedBinaryOp(e,t,"bool",function(e,t){return e>=t?1:0})},e.prototype.logicalNot=function(e){for(var t=e.dataSync(),n=new Int32Array(t.length),r=0;r1||1===t.rank?1:t.shape[1],d=0;d=0&&t>=0?n:(n+t)%t})},e.prototype.max=function(e,t){assertAxesAreInnerMostDims("max",t,e.rank);for(var n=computeOutAndReduceShapes(e.shape,t),r=n[0],a=n[1],o=zeros(r,e.dtype),i=sizeFromShape(a),s=o.dataSync(),u=e.dataSync(),l=0;ld&&(d=h);}s[l]=d;}return o},e.prototype.maximum=function(e,t){return this.broadcastedBinaryOp(e,t,e.dtype,function(e,t){return Math.max(e,t)})},e.prototype.all=function(e,t){assertAxesAreInnerMostDims("all",t,e.rank);for(var n=computeOutAndReduceShapes(e.shape,t),r=n[0],a=n[1],o=zeros(r,e.dtype),i=sizeFromShape(a),s=o.dataSync(),u=e.dataSync(),l=0;l0?n[r]=1:n[r]=0;return Tensor.make(e.shape,{values:n})},e.prototype.round=function(e){for(var t=e.dataSync(),n=new Float32Array(t.length),r=0;r.5?n[r]=Math.ceil(t[r]):n[r]=a%2==0?a:a+1;}return Tensor.make(e.shape,{values:n})},e.prototype.exp=function(e){for(var t=e.dataSync(),n=new Float32Array(t.length),r=0;r=0?a:Math.exp(a)-1;}return Tensor.make(e.shape,{values:t})},e.prototype.eluDer=function(e,t){for(var n=new Float32Array(t.size),r=t.dataSync(),a=e.dataSync(),o=0;o=1?a[o]:a[o]*(i+1);}return Tensor.make(t.shape,{values:n})},e.prototype.selu=function(e){for(var t=SELU_SCALEALPHA,n=SELU_SCALE,r=new Float32Array(e.size),a=e.dataSync(),o=0;o=0?n*i:t*(Math.exp(i)-1);}return Tensor.make(e.shape,{values:r})},e.prototype.clip=function(e,t,n){for(var r=new Float32Array(e.size),a=e.dataSync(),o=0;o-t,i=r[a]0?1:t;}return Tensor.make(e.shape,{values:n})},e.prototype.conv2d=function(e,t,n){for(var r=n.filterHeight,a=n.filterWidth,o=n.dilationHeight,i=n.dilationWidth,s=n.padInfo.left,u=n.padInfo.top,l=buffer(n.outShape,e.dtype),c=0;c=n.inHeight))for(var x=0;x=n.inWidth))for(var E=0;E=n.inHeight))for(var E=0;E=n.inWidth))y+=e.get(d,b,S,p)*t.get(x,E,p,v);}}c.set(y,d,h,g,p*l+v);}return c.toTensor()},e.prototype.depthwiseConv2DDerInput=function(e,t,n){for(var r=buffer(n.inShape,"float32"),a=r.values,o=r.strides,i=o[0],s=o[1],u=o[2],l=e.dataSync(),c=e.strides,d=c[0],p=c[1],h=c[2],f=t.dataSync(),g=t.strides,m=g[0],v=g[1],y=g[2],x=n.batchSize,b=n.filterHeight,E=n.filterWidth,S=n.inChannels,A=n.inHeight,T=n.inWidth,w=n.outChannels,_=n.outHeight,R=n.outWidth,C=n.strideHeight,O=n.strideWidth,I=b-1-n.padInfo.top,k=E-1-n.padInfo.left,M=w/S,N=0;Nb?b=w:"avg"===n&&(E+=w,S++);}if(isNaN(b))break}s.set("avg"===n?E/S:b,c,p,m,d);}return s.toTensor()},e.prototype.maxPool=function(e,t){return this.pool(e,t,"max")},e.prototype.maxPoolPositions=function(e,t){for(var n=buffer(t.outShape,"int32"),r=t.strideHeight,a=t.strideWidth,o=t.filterHeight,i=t.filterWidth,s=t.padInfo.top,u=t.padInfo.left,l=0;lx&&(x=w,b=S*i+T);}n.set(b,l,d,g,c);}return n.toTensor()},e.prototype.maxPoolBackprop=function(e,t,n,r){for(var a=this.maxPoolPositions(t,r),o=r.strideHeight,i=r.strideWidth,s=r.filterHeight,u=r.filterWidth,l=u-1-r.padInfo.left,c=s-1-r.padInfo.top,d=buffer(t.shape,"float32"),p=0;p=r.outHeight||Math.floor(b)!==b))for(var E=0;E=r.outWidth||Math.floor(S)!==S)){var A=s*u-1-a.get(p,b,S,h)===x*u+E?1:0;if(0!==A)y+=e.get(p,b,S,h)*A;}}}d.set(y,p,f,g,h);}return d.toTensor()},e.prototype.avgPoolBackprop=function(e,t,n){for(var r=n.strideHeight,a=n.strideWidth,o=n.filterHeight,i=n.filterWidth,s=i-1-n.padInfo.left,u=o-1-n.padInfo.top,l=buffer(t.shape,"float32"),c=1/(o*i),d=0;d=n.outHeight||Math.floor(x)!==x))for(var b=0;b=n.outWidth||Math.floor(E)!==E))v+=e.get(d,x,E,p);}}l.set(v*c,d,h,f,p);}return l.toTensor()},e.prototype.cast=function(e,t){return castTensor(e,t,this)},e.prototype.reshape=function(e,t){return reshapeTensor(e,t)},e.prototype.avgPool=function(e,t){return this.pool(e,t,"avg").toFloat()},e.prototype.resizeBilinear=function(e,t,n,r){for(var a=e.shape,o=a[0],i=a[1],s=a[2],u=a[3],l=buffer([o,t,n,u],e.dtype),c=[r&&t>1?i-1:i,r&&n>1?s-1:s],d=[r&&t>1?t-1:t,r&&n>1?n-1:n],p=0;p1?o-1:o,n&&c>1?i-1:i],h=[n&&l>1?l-1:l,n&&c>1?c-1:c],f=p[0]/h[0],g=p[1]/h[1],m=0;m=0&&e.get(o)0,"scheme must not be an empty string.");var r=e.getInstance();assert(null==r.managers[t],"A model store manager is already registered for scheme '"+t+"'."),r.managers[t]=n;},e.getManager=function(e){var t=this.getInstance().managers[e];if(null==t)throw new Error("Cannot find model manager for scheme '"+e+"'");return t},e.getSchemes=function(){return Object.keys(this.getInstance().managers)},e}();function parseURL(e){if(-1===e.indexOf(URL_SCHEME_SUFFIX))throw new Error("The url string provided does not contain a scheme. Supported schemes are: "+ModelStoreManagerRegistry.getSchemes().join(","));return {scheme:e.split(URL_SCHEME_SUFFIX)[0],path:e.split(URL_SCHEME_SUFFIX)[1]}}function cloneModelInternal(e,t,n){return void 0===n&&(n=!1),__awaiter(this,void 0,void 0,function(){var r,a,o,i,s,u,l,c,d;return __generator(this,function(p){switch(p.label){case 0:return assert(e!==t,"Old path and new path are the same: '"+e+"'"),assert((r=IORouterRegistry.getLoadHandlers(e)).length>0,"Copying failed because no load handler is found for source URL "+e+"."),assert(r.length<2,"Copying failed because more than one ("+r.length+") load handlers for source URL "+e+"."),a=r[0],assert((o=IORouterRegistry.getSaveHandlers(t)).length>0,"Copying failed because no save handler is found for destination URL "+t+"."),assert(o.length<2,"Copying failed because more than one ("+r.length+") save handlers for destination URL "+t+"."),i=o[0],s=parseURL(e).scheme,u=parseURL(e).path,l=s===parseURL(e).scheme,[4,a.load()];case 1:return c=p.sent(),n&&l?[4,ModelStoreManagerRegistry.getManager(s).removeModel(u)]:[3,3];case 2:p.sent(),p.label=3;case 3:return [4,i.save(c)];case 4:return d=p.sent(),!n||l?[3,6]:[4,ModelStoreManagerRegistry.getManager(s).removeModel(u)];case 5:p.sent(),p.label=6;case 6:return [2,d.modelArtifactsInfo]}})})}var ModelManagement=function(){function e(){}return e.listModels=function(){return __awaiter(this,void 0,void 0,function(){var e,t,n,r,a,o,i;return __generator(this,function(s){switch(s.label){case 0:e=ModelStoreManagerRegistry.getSchemes(),t={},n=0,r=e,s.label=1;case 1:return n0,"URL path for browserHTTPRequest must not be null, undefined or empty."),this.path=e,null!=t&&null!=t.body)throw new Error("requestInit is expected to have no pre-existing body, but has one.");this.requestInit=t||{};}return e.prototype.save=function(e){return __awaiter(this,void 0,void 0,function(){var t,n,r,a;return __generator(this,function(o){switch(o.label){case 0:if(e.modelTopology instanceof ArrayBuffer)throw new Error("BrowserHTTPRequest.save() does not support saving model topology in binary formats yet.");return (t=Object.assign({method:this.DEFAULT_METHOD},this.requestInit)).body=new FormData,n=[{paths:["./model.weights.bin"],weights:e.weightSpecs}],r={modelTopology:e.modelTopology,weightsManifest:n},t.body.append("model.json",new Blob([JSON.stringify(r)],{type:"application/json"}),"model.json"),null!=e.weightData&&t.body.append("model.weights.bin",new Blob([e.weightData],{type:"application/octet-stream"}),"model.weights.bin"),[4,fetch(this.path,t)];case 1:if(200===(a=o.sent()).status)return [2,{modelArtifactsInfo:getModelArtifactsInfoForJSON(e),responses:[a]}];throw new Error("BrowserHTTPRequest.save() failed due to HTTP response status "+a.status+".")}})})},e.prototype.load=function(){return __awaiter(this,void 0,void 0,function(){var e,t,n,r,a,o,i,s,u,l,c,d;return __generator(this,function(p){switch(p.label){case 0:return [4,fetch(this.path,this.requestInit)];case 1:return [4,p.sent().json()];case 2:if(e=p.sent(),t=e.modelTopology,n=e.weightsManifest,null==t&&null==n)throw new Error("The JSON from HTTP path "+this.path+" contains neither model topology or manifest for weights.");if(null==n)return [3,4];for(o=e.weightsManifest,r=[],i=0,s=o;in)}function expectValuesInRange(e,t,n){var r;r=e instanceof Tensor?e.dataSync():e;for(var a=0;an)throw new Error("Value out of range:"+r[a]+" low: "+t+", high: "+n)}function expectArrayBuffersEqual(e,t){expect(new Float32Array(e)).toEqual(new Float32Array(t));}var test_util=Object.freeze({WEBGL_ENVS:WEBGL_ENVS,CPU_ENVS:CPU_ENVS,CHROME_CPU_ENVS:CHROME_CPU_ENVS,NATIVE_ENV:NATIVE_ENV,BROWSER_ENVS:BROWSER_ENVS,ALL_ENVS:ALL_ENVS,expectArraysClose:expectArraysClose,expectPromiseToFail:expectPromiseToFail,expectArraysEqual:expectArraysEqual,expectNumbersClose:expectNumbersClose,expectValuesInRange:expectValuesInRange,expectArrayBuffersEqual:expectArrayBuffersEqual}),version="0.11.9",webgl=Object.freeze({gpgpu_util:gpgpu_util,webgl_util:webgl_util,MathBackendWebGL:MathBackendWebGL,GPGPUContext:GPGPUContext}),Optimizer=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return __extends(t,e),t.prototype.minimize=function(e,t,n){void 0===t&&(t=!1);var r=this.computeGradients(e,n),a=r.value,o=r.grads;return this.applyGradients(o),Object.keys(o).forEach(function(e){return o[e].dispose()}),t?a:(a.dispose(),null)},t.prototype.computeGradients=function(e,t){return variableGrads(e,t)},__decorate([doc({heading:"Training",subheading:"Optimizers"})],t.prototype,"minimize",null),t=__decorate([doc({heading:"Training",subheading:"Classes",namespace:"train"})],t)}(Serializable),DEFAULT_FLOAT32_EPSILON=1e-8,DEFAULT_FLOAT16_EPSILON=1e-4;function getOptimizerDefaultEpsilonValue(){return ENV.get("WEBGL_RENDER_FLOAT32_ENABLED")?DEFAULT_FLOAT32_EPSILON:DEFAULT_FLOAT16_EPSILON}var AdadeltaOptimizer=function(e){function t(t,n,r){void 0===r&&(r=null);var a=e.call(this)||this;return a.learningRate=t,a.rho=n,a.epsilon=r,a.accumulatedGrads={},a.accumulatedUpdates={},a.c=keep(scalar(-t)),a.rhoScalar=keep(scalar(n)),a.oneMinusRho=keep(scalar(1-n)),null===r&&(r=getOptimizerDefaultEpsilonValue()),a.epsilonScalar=keep(scalar(r)),a}return __extends(t,e),t.prototype.applyGradients=function(e){var t=this,n=function(n){var a=ENV.engine.registeredVariables[n];if(null==r.accumulatedGrads[n]){tidy(function(){t.accumulatedGrads[n]=zerosLike(a).variable(!1);});}if(null==r.accumulatedUpdates[n]){tidy(function(){t.accumulatedUpdates[n]=zerosLike(a).variable(!1);});}var o=e[n],i=r.accumulatedGrads[n],s=r.accumulatedUpdates[n];tidy(function(){var e=t.rhoScalar.mul(i).add(t.oneMinusRho.mul(o.square())),r=s.add(t.epsilonScalar).sqrt().div(i.add(t.epsilonScalar).sqrt()).mul(o),u=t.rhoScalar.mul(s).add(t.oneMinusRho.mul(r.square()));t.accumulatedGrads[n].assign(e),t.accumulatedUpdates[n].assign(u);var l=t.c.mul(r).add(a);a.assign(l);});},r=this;for(var a in e)n(a);},t.prototype.dispose=function(){var e=this;this.c.dispose(),this.epsilonScalar.dispose(),this.rhoScalar.dispose(),this.oneMinusRho.dispose(),null!=this.accumulatedUpdates&&(Object.keys(this.accumulatedUpdates).forEach(function(t){return e.accumulatedUpdates[t].dispose()}),Object.keys(this.accumulatedGrads).forEach(function(t){return e.accumulatedGrads[t].dispose()}));},t.prototype.getConfig=function(){return {learningRate:this.learningRate,rho:this.rho,epsilon:this.epsilon}},t.fromConfig=function(e,t){return new e(t.learningRate,t.rho,t.epsilon)},t.className="AdadeltaOptimizer",t}(Optimizer);SerializationMap.register(AdadeltaOptimizer);var AdagradOptimizer=function(e){function t(t,n){void 0===n&&(n=.1);var r=e.call(this)||this;r.learningRate=t,r.initialAccumulatorValue=n,r.accumulatedGrads={},r.c=keep(scalar(-t));var a=getOptimizerDefaultEpsilonValue();return r.epsilon=keep(scalar(a)),r}return __extends(t,e),t.prototype.applyGradients=function(e){var t=this,n=function(n){var a=ENV.engine.registeredVariables[n];if(null==r.accumulatedGrads[n]){tidy(function(){t.accumulatedGrads[n]=fill(a.shape,t.initialAccumulatorValue).variable(!1);});}var o=e[n],i=r.accumulatedGrads[n];tidy(function(){var e=i.add(o.square());t.accumulatedGrads[n].assign(e);var r=t.c.mul(o.div(e.add(t.epsilon).sqrt())).add(a);a.assign(r);});},r=this;for(var a in e)n(a);},t.prototype.dispose=function(){var e=this;this.epsilon.dispose(),this.c.dispose(),null!=this.accumulatedGrads&&Object.keys(this.accumulatedGrads).forEach(function(t){return e.accumulatedGrads[t].dispose()});},t.prototype.getConfig=function(){return {learningRate:this.learningRate,initialAccumulatorValue:this.initialAccumulatorValue}},t.fromConfig=function(e,t){return new e(t.learningRate,t.initialAccumulatorValue)},t.className="AdagradOptimizer",t}(Optimizer);SerializationMap.register(AdagradOptimizer);var AdamOptimizer=function(e){function t(t,n,r,a){void 0===a&&(a=null);var o=e.call(this)||this;return o.learningRate=t,o.beta1=n,o.beta2=r,o.epsilon=a,o.accumulatedFirstMoment={},o.accumulatedSecondMoment={},o.c=keep(scalar(-t)),o.beta1Scalar=keep(scalar(n)),o.beta2Scalar=keep(scalar(r)),tidy(function(){o.accBeta1=scalar(n).variable(),o.accBeta2=scalar(r).variable();}),o.oneMinusBeta1=keep(scalar(1-n)),o.oneMinusBeta2=keep(scalar(1-r)),o.one=keep(scalar(1)),null===a&&(a=getOptimizerDefaultEpsilonValue()),o.epsScalar=keep(scalar(a)),o}return __extends(t,e),t.prototype.applyGradients=function(e){var t=this;tidy(function(){var n=t.one.sub(t.accBeta1),r=t.one.sub(t.accBeta2);for(var a in e){var o=ENV.engine.registeredVariables[a];if(null==t.accumulatedFirstMoment[a]){var i=!1;t.accumulatedFirstMoment[a]=zerosLike(o).variable(i);}if(null==t.accumulatedSecondMoment[a]){i=!1;t.accumulatedSecondMoment[a]=zerosLike(o).variable(i);}var s=e[a],u=t.accumulatedFirstMoment[a],l=t.accumulatedSecondMoment[a],c=t.beta1Scalar.mul(u).add(t.oneMinusBeta1.mul(s)),d=t.beta2Scalar.mul(l).add(t.oneMinusBeta2.mul(s.square())),p=c.div(n),h=d.div(r);t.accumulatedFirstMoment[a].assign(c),t.accumulatedSecondMoment[a].assign(d);var f=t.c.mul(p.div(t.epsScalar.add(h.sqrt()))).add(o);o.assign(f);}t.accBeta1.assign(t.accBeta1.mul(t.beta1Scalar)),t.accBeta2.assign(t.accBeta2.mul(t.beta2Scalar));});},t.prototype.dispose=function(){var e=this;this.c.dispose(),this.epsScalar.dispose(),this.beta1Scalar.dispose(),this.beta2Scalar.dispose(),this.accBeta1.dispose(),this.accBeta2.dispose(),this.oneMinusBeta1.dispose(),this.oneMinusBeta2.dispose(),this.one.dispose(),null!=this.accumulatedFirstMoment&&Object.keys(this.accumulatedFirstMoment).forEach(function(t){return e.accumulatedFirstMoment[t].dispose()}),null!=this.accumulatedSecondMoment&&Object.keys(this.accumulatedSecondMoment).forEach(function(t){return e.accumulatedSecondMoment[t].dispose()});},t.prototype.getConfig=function(){return {learningRate:this.learningRate,beta1:this.beta1,beta2:this.beta2,epsilon:this.epsilon}},t.fromConfig=function(e,t){return new e(t.learningRate,t.beta1,t.beta2,t.epsilon)},t.className="AdamOptimizer",t}(Optimizer);SerializationMap.register(AdamOptimizer);var AdamaxOptimizer=function(e){function t(t,n,r,a,o){void 0===a&&(a=null),void 0===o&&(o=0);var i=e.call(this)||this;return i.learningRate=t,i.beta1=n,i.beta2=r,i.epsilon=a,i.decay=o,i.accumulatedFirstMoment={},i.accumulatedWeightedInfNorm={},i.c=keep(scalar(-t)),i.beta1Scalar=keep(scalar(n)),i.beta2Scalar=keep(scalar(r)),i.decayScalar=keep(scalar(o)),tidy(function(){i.iteration=scalar(0).variable(),i.accBeta1=scalar(n).variable();}),i.oneMinusBeta1=keep(scalar(1-n)),i.one=keep(scalar(1)),null===a&&(a=getOptimizerDefaultEpsilonValue()),i.epsScalar=keep(scalar(a)),i}return __extends(t,e),t.prototype.applyGradients=function(e){var t=this;tidy(function(){var n=t.one.sub(t.accBeta1),r=t.c.div(t.one.add(t.decayScalar.mul(t.iteration)));for(var a in e){var o=ENV.engine.registeredVariables[a];if(null==t.accumulatedFirstMoment[a]){var i=!1;t.accumulatedFirstMoment[a]=zerosLike(o).variable(i);}if(null==t.accumulatedWeightedInfNorm[a]){i=!1;t.accumulatedWeightedInfNorm[a]=zerosLike(o).variable(i);}var s=e[a],u=t.accumulatedFirstMoment[a],l=t.accumulatedWeightedInfNorm[a],c=t.beta1Scalar.mul(u).add(t.oneMinusBeta1.mul(s)),d=t.beta2Scalar.mul(l),p=s.abs(),h=d.maximum(p);t.accumulatedFirstMoment[a].assign(c),t.accumulatedWeightedInfNorm[a].assign(h);var f=r.div(n).mul(c.div(t.epsScalar.add(h))).add(o);o.assign(f);}t.iteration.assign(t.iteration.add(t.one)),t.accBeta1.assign(t.accBeta1.mul(t.beta1Scalar));});},t.prototype.dispose=function(){var e=this;this.c.dispose(),this.epsScalar.dispose(),this.accBeta1.dispose(),this.beta1Scalar.dispose(),this.beta2Scalar.dispose(),this.oneMinusBeta1.dispose(),this.decayScalar.dispose(),this.iteration.dispose(),this.one.dispose(),null!=this.accumulatedFirstMoment&&Object.keys(this.accumulatedFirstMoment).forEach(function(t){return e.accumulatedFirstMoment[t].dispose()}),null!=this.accumulatedWeightedInfNorm&&Object.keys(this.accumulatedWeightedInfNorm).forEach(function(t){return e.accumulatedWeightedInfNorm[t].dispose()});},t.prototype.getConfig=function(){return {learningRate:this.learningRate,beta1:this.beta1,beta2:this.beta2,epsilon:this.epsilon,decay:this.decay}},t.fromConfig=function(e,t){return new e(t.learningRate,t.beta1,t.beta2,t.epsilon,t.decay)},t.className="AdamaxOptimizer",t}(Optimizer);SerializationMap.register(AdamaxOptimizer);var SGDOptimizer=function(e){function t(t){var n=e.call(this)||this;return n.learningRate=t,n.setLearningRate(t),n}return __extends(t,e),t.prototype.applyGradients=function(e){var t=this;Object.keys(e).forEach(function(n){var r=e[n],a=ENV.engine.registeredVariables[n];tidy(function(){var e=t.c.mul(r).add(a);a.assign(e);});});},t.prototype.setLearningRate=function(e){this.learningRate=e,null!=this.c&&this.c.dispose(),this.c=keep(scalar(-e));},t.prototype.dispose=function(){this.c.dispose();},t.prototype.getConfig=function(){return {learningRate:this.learningRate}},t.fromConfig=function(e,t){return new e(t.learningRate)},t.className="SGDOptimizer",t}(Optimizer);SerializationMap.register(SGDOptimizer);var MomentumOptimizer=function(e){function t(t,n,r){void 0===r&&(r=!1);var a=e.call(this,t)||this;return a.learningRate=t,a.momentum=n,a.useNesterov=r,a.m=scalar(a.momentum),a.accumulations={},a}return __extends(t,e),t.prototype.applyGradients=function(e){var t=this,n=function(n){var a=ENV.engine.registeredVariables[n];if(null==r.accumulations[n]){tidy(function(){t.accumulations[n]=zerosLike(a).variable(!1);});}var o=r.accumulations[n],i=e[n];tidy(function(){var e,r=t.m.mul(o).add(i);e=t.useNesterov?t.c.mul(i.add(r.mul(t.m))).add(a):t.c.mul(r).add(a),t.accumulations[n].assign(r),a.assign(e);});},r=this;for(var a in e)n(a);},t.prototype.dispose=function(){if(e.prototype.dispose.call(this),this.m.dispose(),null!=this.accumulations)for(var t in this.accumulations)this.accumulations[t].dispose();},t.prototype.setMomentum=function(e){this.momentum=e;},t.prototype.getConfig=function(){return {learningRate:this.learningRate,momentum:this.momentum,useNesterov:this.useNesterov}},t.fromConfig=function(e,t){return new e(t.learningRate,t.momentum,t.useNesterov)},t.className="MomentumOptimizer",t}(SGDOptimizer);SerializationMap.register(MomentumOptimizer);var RMSPropOptimizer=function(e){function t(t,n,r,a,o){void 0===n&&(n=.9),void 0===r&&(r=0),void 0===a&&(a=null),void 0===o&&(o=!1);var i=e.call(this)||this;return i.learningRate=t,i.decay=n,i.momentum=r,i.epsilon=a,i.accumulatedMeanSquares={},i.accumulatedMeanGrads={},i.accumulatedMoments={},i.c=keep(scalar(t)),i.decayScalar=keep(scalar(n)),i.momentumScalar=keep(scalar(r)),i.oneMinusDecay=keep(scalar(1-n)),i.centered=o,null===a&&(a=getOptimizerDefaultEpsilonValue()),i.epsilonScalar=keep(scalar(a)),i}return __extends(t,e),t.prototype.applyGradients=function(e){var t=this,n=function(n){var a=ENV.engine.registeredVariables[n];if(null==r.accumulatedMeanSquares[n]){tidy(function(){t.accumulatedMeanSquares[n]=zerosLike(a).variable(!1);});}if(null==r.accumulatedMeanGrads[n]&&r.centered){tidy(function(){t.accumulatedMeanGrads[n]=zerosLike(a).variable(!1);});}if(null==r.accumulatedMoments[n]){tidy(function(){t.accumulatedMoments[n]=zerosLike(a).variable(!1);});}var o=r.accumulatedMeanSquares[n],i=r.accumulatedMeanGrads[n],s=r.accumulatedMoments[n],u=e[n];tidy(function(){var e=t.decayScalar.mul(o).add(t.oneMinusDecay.mul(u.square()));if(t.centered){var r=t.decayScalar.mul(i).add(t.oneMinusDecay.mul(u)),l=t.momentumScalar.mul(s).add(t.c.mul(u).div(e.sub(r.square().add(t.epsilonScalar)).sqrt()));t.accumulatedMeanSquares[n].assign(e),t.accumulatedMeanGrads[n].assign(r),t.accumulatedMoments[n].assign(l);var c=a.sub(l);a.assign(c);}else{var d=t.decayScalar.mul(o).add(t.oneMinusDecay.mul(u.square()));l=t.momentumScalar.mul(s).add(t.c.mul(u).div(d.add(t.epsilonScalar).sqrt()));t.accumulatedMeanSquares[n].assign(d),t.accumulatedMoments[n].assign(l);c=a.sub(l);a.assign(c);}});},r=this;for(var a in e)n(a);},t.prototype.dispose=function(){var e=this;this.c.dispose(),this.epsilonScalar.dispose(),this.decayScalar.dispose(),this.momentumScalar.dispose(),this.oneMinusDecay.dispose(),null!=this.accumulatedMeanSquares&&Object.keys(this.accumulatedMeanSquares).forEach(function(t){return e.accumulatedMeanSquares[t].dispose()}),null!=this.accumulatedMeanGrads&&this.centered&&Object.keys(this.accumulatedMeanGrads).forEach(function(t){return e.accumulatedMeanGrads[t].dispose()}),null!=this.accumulatedMoments&&Object.keys(this.accumulatedMoments).forEach(function(t){return e.accumulatedMoments[t].dispose()});},t.prototype.getConfig=function(){return {learningRate:this.learningRate,decay:this.decay,momentum:this.momentum,epsilon:this.epsilon,centered:this.centered}},t.fromConfig=function(e,t){return new e(t.learningRate,t.decay,t.momentum,t.epsilon,t.centered)},t.className="RMSPropOptimizer",t}(Optimizer);SerializationMap.register(RMSPropOptimizer);var OptimizerConstructors=function(){function e(){}return e.sgd=function(e){return new SGDOptimizer(e)},e.momentum=function(e,t,n){return void 0===n&&(n=!1),new MomentumOptimizer(e,t,n)},e.rmsprop=function(e,t,n,r,a){return void 0===t&&(t=.9),void 0===n&&(n=0),void 0===r&&(r=null),void 0===a&&(a=!1),new RMSPropOptimizer(e,t,n,r,a)},e.adam=function(e,t,n,r){return void 0===e&&(e=.001),void 0===t&&(t=.9),void 0===n&&(n=.999),void 0===r&&(r=null),new AdamOptimizer(e,t,n,r)},e.adadelta=function(e,t,n){return void 0===e&&(e=.001),void 0===t&&(t=.95),void 0===n&&(n=null),new AdadeltaOptimizer(e,t,n)},e.adamax=function(e,t,n,r,a){return void 0===e&&(e=.002),void 0===t&&(t=.9),void 0===n&&(n=.999),void 0===r&&(r=null),void 0===a&&(a=0),new AdamaxOptimizer(e,t,n,r,a)},e.adagrad=function(e,t){return void 0===t&&(t=.1),new AdagradOptimizer(e,t)},__decorate([doc({heading:"Training",subheading:"Optimizers",namespace:"train"})],e,"sgd",null),__decorate([doc({heading:"Training",subheading:"Optimizers",namespace:"train"})],e,"momentum",null),__decorate([doc({heading:"Training",subheading:"Optimizers",namespace:"train"})],e,"rmsprop",null),__decorate([doc({heading:"Training",subheading:"Optimizers",namespace:"train"})],e,"adam",null),__decorate([doc({heading:"Training",subheading:"Optimizers",namespace:"train"})],e,"adadelta",null),__decorate([doc({heading:"Training",subheading:"Optimizers",namespace:"train"})],e,"adamax",null),__decorate([doc({heading:"Training",subheading:"Optimizers",namespace:"train"})],e,"adagrad",null),e}(),train={sgd:OptimizerConstructors.sgd,momentum:OptimizerConstructors.momentum,adadelta:OptimizerConstructors.adadelta,adagrad:OptimizerConstructors.adagrad,rmsprop:OptimizerConstructors.rmsprop,adamax:OptimizerConstructors.adamax,adam:OptimizerConstructors.adam},setBackend=Environment.setBackend,getBackend=Environment.getBackend,disposeVariables=Environment.disposeVariables,memory=Environment.memory,nextFrame=BrowserUtil.nextFrame; + + var tfCore_esm = /*#__PURE__*/Object.freeze({ + setBackend: setBackend, + getBackend: getBackend, + disposeVariables: disposeVariables, + memory: memory, + version_core: version, + nextFrame: nextFrame, + environment: environment, + io: io, + serialization: serialization, + test_util: test_util, + util: util, + webgl: webgl, + AdadeltaOptimizer: AdadeltaOptimizer, + AdagradOptimizer: AdagradOptimizer, + AdamOptimizer: AdamOptimizer, + AdamaxOptimizer: AdamaxOptimizer, + MomentumOptimizer: MomentumOptimizer, + Optimizer: Optimizer, + RMSPropOptimizer: RMSPropOptimizer, + SGDOptimizer: SGDOptimizer, + Tensor: Tensor, + TensorBuffer: TensorBuffer, + variable: variable, + Variable: Variable, + get Rank () { return Rank; }, + get Reduction () { return Reduction; }, + ENV: ENV, + Environment: Environment, + doc: doc, + batchNormalization: batchNormalization, + batchNormalization2d: batchNormalization2d, + batchNormalization3d: batchNormalization3d, + batchNormalization4d: batchNormalization4d, + concat: concat, + concat1d: concat1d, + concat2d: concat2d, + concat3d: concat3d, + concat4d: concat4d, + conv1d: conv1d, + conv2d: conv2d, + conv2dTranspose: conv2dTranspose, + depthwiseConv2d: depthwiseConv2d, + separableConv2d: separableConv2d, + matMul: matMul, + matrixTimesVector: matrixTimesVector, + outerProduct: outerProduct, + vectorTimesMatrix: vectorTimesMatrix, + dot: dot, + avgPool: avgPool, + maxPool: maxPool, + transpose: transpose, + reverse: reverse, + reverse1d: reverse1d, + reverse2d: reverse2d, + reverse3d: reverse3d, + reverse4d: reverse4d, + slice: slice, + slice1d: slice1d, + slice2d: slice2d, + slice3d: slice3d, + slice4d: slice4d, + stridedSlice: stridedSlice, + argMax: argMax, + argMin: argMin, + logSumExp: logSumExp, + max: max, + mean: mean, + min: min, + all: all, + moments: moments, + sum: sum, + unsortedSegmentSum: unsortedSegmentSum, + equal: equal, + equalStrict: equalStrict, + greater: greater, + greaterStrict: greaterStrict, + greaterEqual: greaterEqual, + greaterEqualStrict: greaterEqualStrict, + less: less, + lessStrict: lessStrict, + lessEqual: lessEqual, + lessEqualStrict: lessEqualStrict, + notEqual: notEqual, + notEqualStrict: notEqualStrict, + logicalNot: logicalNot, + logicalAnd: logicalAnd, + logicalOr: logicalOr, + logicalXor: logicalXor, + where: where, + abs: abs, + acos: acos, + acosh: acosh, + asin: asin, + asinh: asinh, + atan: atan, + atanh: atanh, + ceil: ceil, + clipByValue: clipByValue, + cos: cos, + cosh: cosh, + elu: elu, + exp: exp, + expm1: expm1, + floor: floor, + sign: sign, + leakyRelu: leakyRelu, + log: log, + log1p: log1p, + logSigmoid: logSigmoid, + neg: neg, + prelu: prelu, + relu: relu, + reciprocal: reciprocal, + round: round, + selu: selu, + sigmoid: sigmoid, + sin: sin, + sinh: sinh, + softplus: softplus, + sqrt: sqrt, + rsqrt: rsqrt, + square: square, + step: step, + tan: tan, + tanh: tanh$1, + erf: erf, + add: add, + addStrict: addStrict, + atan2: atan2, + div: div, + floorDiv: floorDiv, + divStrict: divStrict, + maximum: maximum, + maximumStrict: maximumStrict, + minimum: minimum, + minimumStrict: minimumStrict, + mod: mod, + modStrict: modStrict, + mul: mul, + mulStrict: mulStrict, + pow: pow, + powStrict: powStrict, + sub: sub, + subStrict: subStrict, + squaredDifference: squaredDifference, + squaredDifferenceStrict: squaredDifferenceStrict, + norm: norm, + cast: cast, + clone: clone, + fromPixels: fromPixels, + toPixels: toPixels, + ones: ones, + onesLike: onesLike, + zeros: zeros, + zerosLike: zerosLike, + eye: eye, + rand: rand, + randomNormal: randomNormal, + truncatedNormal: truncatedNormal, + randomUniform: randomUniform, + multinomial: multinomial, + reshape: reshape, + squeeze: squeeze, + tile: tile, + gather: gather, + oneHot: oneHot, + linspace: linspace, + range: range, + buffer: buffer, + fill: fill, + tensor: tensor, + scalar: scalar, + tensor1d: tensor1d, + tensor2d: tensor2d, + tensor3d: tensor3d, + tensor4d: tensor4d, + tensor5d: tensor5d, + tensor6d: tensor6d, + print: print, + expandDims: expandDims, + stack: stack, + unstack: unstack, + split: split, + cumsum: cumsum, + pad: pad, + pad1d: pad1d, + pad2d: pad2d, + pad3d: pad3d, + pad4d: pad4d, + movingAverage: movingAverage, + basicLSTMCell: basicLSTMCell, + multiRNNCell: multiRNNCell, + softmax: softmax, + sigmoidCrossEntropyWithLogits: sigmoidCrossEntropyWithLogits, + localResponseNormalization: localResponseNormalization, + linalg: linalg, + losses: losses, + image: image, + operation: operation, + train: train, + tidy: tidy, + keep: keep, + dispose: dispose, + time: time, + grad: grad, + valueAndGrad: valueAndGrad, + grads: grads, + valueAndGrads: valueAndGrads, + variableGrads: variableGrads, + customGrad: customGrad + }); + + function euclideanDistance(arr1, arr2) { + if (arr1.length !== arr2.length) + throw new Error('euclideanDistance: arr1.length !== arr2.length'); + var desc1 = Array.from(arr1); + var desc2 = Array.from(arr2); + return Math.sqrt(desc1 + .map(function (val, i) { return val - desc2[i]; }) + .reduce(function (res, diff) { return res + Math.pow(diff, 2); }, 0)); + } + + /*! ***************************************************************************** + Copyright (c) Microsoft Corporation. All rights reserved. + Licensed under the Apache License, Version 2.0 (the "License"); you may not use + this file except in compliance with the License. You may obtain a copy of the + License at http://www.apache.org/licenses/LICENSE-2.0 + + THIS CODE IS PROVIDED ON AN *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED + WARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE, + MERCHANTABLITY OR NON-INFRINGEMENT. + + See the Apache Version 2.0 License for specific language governing permissions + and limitations under the License. + ***************************************************************************** */ + + function __awaiter$1(thisArg, _arguments, P, generator) { + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); + } + + function __generator$1(thisArg, body) { + var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g; + return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g; + function verb(n) { return function (v) { return step([n, v]); }; } + function step(op) { + if (f) throw new TypeError("Generator is already executing."); + while (_) try { + if (f = 1, y && (t = y[op[0] & 2 ? "return" : op[0] ? "throw" : "next"]) && !(t = t.call(y, op[1])).done) return t; + if (y = 0, t) op = [0, t.value]; + switch (op[0]) { + case 0: case 1: t = op; break; + case 4: _.label++; return { value: op[1], done: false }; + case 5: _.label++; y = op[1]; op = [0]; continue; + case 7: op = _.ops.pop(); _.trys.pop(); continue; + default: + if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; } + if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; } + if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; } + if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; } + if (t[2]) _.ops.pop(); + _.trys.pop(); continue; + } + op = body.call(thisArg, _); + } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; } + if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true }; + } + } + + function isFloat(num) { + return num % 1 !== 0; + } + function isEven(num) { + return num % 2 === 0; + } + function round$1(num) { + return Math.floor(num * 100) / 100; + } + function getElement(arg) { + if (typeof arg === 'string') { + return document.getElementById(arg); + } + return arg; + } + function getContext2dOrThrow(canvas) { + var ctx = canvas.getContext('2d'); + if (!ctx) { + throw new Error('canvas 2d context is null'); + } + return ctx; + } + function createCanvas(_a) { + var width = _a.width, height = _a.height; + var canvas = document.createElement('canvas'); + canvas.width = width; + canvas.height = height; + return canvas; + } + function createCanvasFromMedia(media, dims) { + var _a = dims || getMediaDimensions(media), width = _a.width, height = _a.height; + var canvas = createCanvas({ width: width, height: height }); + getContext2dOrThrow(canvas).drawImage(media, 0, 0, width, height); + return canvas; + } + function getMediaDimensions(media) { + if (media instanceof HTMLImageElement) { + return { width: media.naturalWidth, height: media.naturalHeight }; + } + if (media instanceof HTMLVideoElement) { + return { width: media.videoWidth, height: media.videoHeight }; + } + return media; + } + function bufferToImage(buf) { + return new Promise(function (resolve, reject) { + if (!(buf instanceof Blob)) { + return reject('bufferToImage - expected buf to be of type: Blob'); + } + var reader = new FileReader(); + reader.onload = function () { + var img = new Image(); + img.onload = function () { return resolve(img); }; + img.onerror = reject; + img.src = reader.result; + }; + reader.onerror = reject; + reader.readAsDataURL(buf); + }); + } + function imageTensorToCanvas(imgTensor, canvas) { + return __awaiter$1(this, void 0, void 0, function () { + var targetCanvas, _a, _, height, width, numChannels; + return __generator$1(this, function (_b) { + switch (_b.label) { + case 0: + targetCanvas = canvas || document.createElement('canvas'); + _a = imgTensor.shape, _ = _a[0], height = _a[1], width = _a[2], numChannels = _a[3]; + return [4 /*yield*/, toPixels(imgTensor.as3D(height, width, numChannels).toInt(), targetCanvas)]; + case 1: + _b.sent(); + return [2 /*return*/, targetCanvas]; + } + }); + }); + } + function getDefaultDrawOptions() { + return { + color: 'blue', + lineWidth: 2, + fontSize: 20, + fontStyle: 'Georgia' }; - - // Apply the seeding algorithm from Baagoe. - me.c = 1; - me.s0 = mash(' '); - me.s1 = mash(' '); - me.s2 = mash(' '); - me.s0 -= mash(seed); - if (me.s0 < 0) { me.s0 += 1; } - me.s1 -= mash(seed); - if (me.s1 < 0) { me.s1 += 1; } - me.s2 -= mash(seed); - if (me.s2 < 0) { me.s2 += 1; } - mash = null; - } - - function copy(f, t) { - t.c = f.c; - t.s0 = f.s0; - t.s1 = f.s1; - t.s2 = f.s2; - return t; - } - - function impl(seed, opts) { - var xg = new Alea(seed), - state = opts && opts.state, - prng = xg.next; - prng.int32 = function() { return (xg.next() * 0x100000000) | 0; }; - prng.double = function() { - return prng() + (prng() * 0x200000 | 0) * 1.1102230246251565e-16; // 2^-53 + } + function drawBox(ctx, x, y, w, h, options) { + var drawOptions = Object.assign(getDefaultDrawOptions(), (options || {})); + ctx.strokeStyle = drawOptions.color; + ctx.lineWidth = drawOptions.lineWidth; + ctx.strokeRect(x, y, w, h); + } + function drawText(ctx, x, y, text, options) { + var drawOptions = Object.assign(getDefaultDrawOptions(), (options || {})); + var padText = 2 + drawOptions.lineWidth; + ctx.fillStyle = drawOptions.color; + ctx.font = drawOptions.fontSize + "px " + drawOptions.fontStyle; + ctx.fillText(text, x + padText, y + padText + (drawOptions.fontSize * 0.6)); + } + function drawDetection(canvasArg, detection, options) { + var canvas = getElement(canvasArg); + if (!(canvas instanceof HTMLCanvasElement)) { + throw new Error('drawBox - expected canvas to be of type: HTMLCanvasElement'); + } + var detectionArray = Array.isArray(detection) + ? detection + : [detection]; + detectionArray.forEach(function (det) { + var _a = det.getBox(), x = _a.x, y = _a.y, width = _a.width, height = _a.height; + var drawOptions = Object.assign(getDefaultDrawOptions(), (options || {})); + var withScore = Object.assign({ withScore: true }, (options || {})).withScore; + var ctx = getContext2dOrThrow(canvas); + drawBox(ctx, x, y, width, height, drawOptions); + if (withScore) { + drawText(ctx, x, y, "" + round$1(det.getScore()), drawOptions); + } + }); + } + function drawContour(ctx, points, isClosed) { + if (isClosed === void 0) { isClosed = false; } + ctx.beginPath(); + points.slice(1).forEach(function (_a, prevIdx) { + var x = _a.x, y = _a.y; + var from = points[prevIdx]; + ctx.moveTo(from.x, from.y); + ctx.lineTo(x, y); + }); + if (isClosed) { + var from = points[points.length - 1]; + var to = points[0]; + if (!from || !to) { + return; + } + ctx.moveTo(from.x, from.y); + ctx.lineTo(to.x, to.y); + } + ctx.stroke(); + } + function drawLandmarks(canvasArg, faceLandmarks, options) { + var canvas = getElement(canvasArg); + if (!(canvas instanceof HTMLCanvasElement)) { + throw new Error('drawLandmarks - expected canvas to be of type: HTMLCanvasElement'); + } + var drawOptions = Object.assign(getDefaultDrawOptions(), (options || {})); + var drawLines = Object.assign({ drawLines: false }, (options || {})).drawLines; + var ctx = getContext2dOrThrow(canvas); + var lineWidth = drawOptions.lineWidth, color = drawOptions.color; + if (drawLines) { + ctx.strokeStyle = color; + ctx.lineWidth = lineWidth; + drawContour(ctx, faceLandmarks.getJawOutline()); + drawContour(ctx, faceLandmarks.getLeftEyeBrow()); + drawContour(ctx, faceLandmarks.getRightEyeBrow()); + drawContour(ctx, faceLandmarks.getNose()); + drawContour(ctx, faceLandmarks.getLeftEye(), true); + drawContour(ctx, faceLandmarks.getRightEye(), true); + drawContour(ctx, faceLandmarks.getMouth(), true); + return; + } + // else draw points + var ptOffset = lineWidth / 2; + ctx.fillStyle = color; + faceLandmarks.getPositions().forEach(function (pt) { return ctx.fillRect(pt.x - ptOffset, pt.y - ptOffset, lineWidth, lineWidth); }); + } + + var NetInput = /** @class */ (function () { + function NetInput(mediaArg, dims) { + var _this = this; + var mediaArgArray = Array.isArray(mediaArg) + ? mediaArg + : [mediaArg]; + if (!mediaArgArray.length) { + throw new Error('NetInput - empty array passed as input'); + } + var medias = mediaArgArray.map(getElement); + medias.forEach(function (media, i) { + if (!(media instanceof HTMLImageElement || media instanceof HTMLVideoElement || media instanceof HTMLCanvasElement)) { + var idxHint = Array.isArray(mediaArg) ? " at input index " + i + ":" : ''; + if (typeof mediaArgArray[i] === 'string') { + throw new Error("NetInput -" + idxHint + " string passed, but could not resolve HTMLElement for element id"); + } + throw new Error("NetInput -" + idxHint + " expected media to be of type HTMLImageElement | HTMLVideoElement | HTMLCanvasElement, or to be an element id"); + } + }); + this._canvases = []; + medias.forEach(function (m) { return _this.initCanvas(m, dims); }); + } + NetInput.prototype.initCanvas = function (media, dims) { + if (media instanceof HTMLCanvasElement) { + this._canvases.push(media); + return; + } + // if input is batch type, make sure every canvas has the same dimensions + var canvasDims = this.dims || dims; + this._canvases.push(createCanvasFromMedia(media, canvasDims)); }; - prng.quick = prng; - if (state) { - if (typeof(state) == 'object') copy(state, xg); - prng.state = function() { return copy(xg, {}); }; + Object.defineProperty(NetInput.prototype, "canvases", { + get: function () { + return this._canvases; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(NetInput.prototype, "width", { + get: function () { + return (this._canvases[0] || {}).width; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(NetInput.prototype, "height", { + get: function () { + return (this._canvases[0] || {}).height; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(NetInput.prototype, "dims", { + get: function () { + var _a = this, width = _a.width, height = _a.height; + return (width > 0 && height > 0) ? { width: width, height: height } : null; + }, + enumerable: true, + configurable: true + }); + return NetInput; + }()); + + /** + * Pads the smaller dimension of an image tensor with zeros, such that width === height. + * + * @param imgTensor The image tensor. + * @param isCenterImage (optional, default: false) If true, add padding on both sides of the image, such that the image. + * @returns The padded tensor with width === height. + */ + function padToSquare(imgTensor, isCenterImage) { + if (isCenterImage === void 0) { isCenterImage = false; } + return tidy(function () { + var _a = imgTensor.shape.slice(1), height = _a[0], width = _a[1]; + if (height === width) { + return imgTensor; + } + var dimDiff = Math.abs(height - width); + var paddingAmount = Math.floor(dimDiff * (isCenterImage ? 0.5 : 1)); + var paddingAxis = height > width ? 2 : 1; + var getPaddingTensorShape = function (isRoundUp) { + if (isRoundUp === void 0) { isRoundUp = false; } + var paddingTensorShape = imgTensor.shape.slice(); + paddingTensorShape[paddingAxis] = paddingAmount + (isRoundUp ? 1 : 0); + return paddingTensorShape; + }; + var tensorsToStack = (isCenterImage ? [fill(getPaddingTensorShape(!isEven(dimDiff)), 0)] : []) + .concat([imgTensor, fill(getPaddingTensorShape(), 0)]); + return concat(tensorsToStack, paddingAxis); + }); + } + + var Rect = /** @class */ (function () { + function Rect(x, y, width, height) { + this.x = x; + this.y = y; + this.width = width; + this.height = height; } - return prng; - } - - function Mash() { - var n = 0xefc8249d; - - var mash = function(data) { - data = data.toString(); - for (var i = 0; i < data.length; i++) { - n += data.charCodeAt(i); - var h = 0.02519603282416938 * n; - n = h >>> 0; - h -= n; - h *= n; - n = h >>> 0; - h -= n; - n += h * 0x100000000; // 2^32 - } - return (n >>> 0) * 2.3283064365386963e-10; // 2^-32 + Rect.prototype.floor = function () { + return new Rect(Math.floor(this.x), Math.floor(this.y), Math.floor(this.width), Math.floor(this.height)); }; - - return mash; - } - - - if (module && module.exports) { - module.exports = impl; - } else if (define && define.amd) { - define(function() { return impl; }); - } else { - this.alea = impl; - } - - })( - commonjsGlobal, - module, // present in node.js - (typeof undefined) == 'function' && undefined // present with an AMD loader - ); - }); - - var xor128 = createCommonjsModule(function (module) { - // A Javascript implementaion of the "xor128" prng algorithm by - // George Marsaglia. See http://www.jstatsoft.org/v08/i14/paper - - (function(global, module, define) { - - function XorGen(seed) { - var me = this, strseed = ''; - - me.x = 0; - me.y = 0; - me.z = 0; - me.w = 0; - - // Set up generator function. - me.next = function() { - var t = me.x ^ (me.x << 11); - me.x = me.y; - me.y = me.z; - me.z = me.w; - return me.w ^= (me.w >>> 19) ^ t ^ (t >>> 8); + return Rect; + }()); + + var FaceDetection = /** @class */ (function () { + function FaceDetection(score, relativeBox, imageDims) { + var width = imageDims.width, height = imageDims.height; + this._imageWidth = width; + this._imageHeight = height; + this._score = score; + this._box = new Rect(relativeBox.x * width, relativeBox.y * height, relativeBox.width * width, relativeBox.height * height); + } + FaceDetection.prototype.getScore = function () { + return this._score; }; - - if (seed === (seed | 0)) { - // Integer seed. - me.x = seed; - } else { - // String seed. - strseed += seed; + FaceDetection.prototype.getBox = function () { + return this._box; + }; + FaceDetection.prototype.getImageWidth = function () { + return this._imageWidth; + }; + FaceDetection.prototype.getImageHeight = function () { + return this._imageHeight; + }; + FaceDetection.prototype.getRelativeBox = function () { + return new Rect(this._box.x / this._imageWidth, this._box.y / this._imageHeight, this._box.width / this._imageWidth, this._box.height / this._imageHeight); + }; + FaceDetection.prototype.forSize = function (width, height) { + return new FaceDetection(this._score, this.getRelativeBox(), { width: width, height: height }); + }; + return FaceDetection; + }()); + + /** + * Extracts the image regions containing the detected faces. + * + * @param input The image that face detection has been performed on. + * @param detections The face detection results or face bounding boxes for that image. + * @returns The Canvases of the corresponding image region for each detected face. + */ + function extractFaces(image, detections) { + var ctx = getContext2dOrThrow(image); + var boxes = detections.map(function (det) { return det instanceof FaceDetection + ? det.forSize(image.width, image.height).getBox().floor() + : det; }); + return boxes.map(function (_a) { + var x = _a.x, y = _a.y, width = _a.width, height = _a.height; + var faceImg = createCanvas({ width: width, height: height }); + getContext2dOrThrow(faceImg) + .putImageData(ctx.getImageData(x, y, width, height), 0, 0); + return faceImg; + }); + } + + function getImageTensor(input) { + return tidy(function () { + if (input instanceof Tensor) { + var rank = input.shape.length; + if (rank !== 3 && rank !== 4) { + throw new Error('input tensor must be of rank 3 or 4'); + } + return (rank === 3 ? input.expandDims(0) : input).toFloat(); + } + var netInput = input instanceof NetInput ? input : new NetInput(input); + return concat(netInput.canvases.map(function (canvas) { + return fromPixels(canvas).expandDims(0).toFloat(); + })); + }); + } + + /** + * Extracts the tensors of the image regions containing the detected faces. + * Useful if you want to compute the face descriptors for the face images. + * Using this method is faster then extracting a canvas for each face and + * converting them to tensors individually. + * + * @param input The image that face detection has been performed on. + * @param detections The face detection results or face bounding boxes for that image. + * @returns Tensors of the corresponding image region for each detected face. + */ + function extractFaceTensors(image$$1, detections) { + return tidy(function () { + var imgTensor = getImageTensor(image$$1); + // TODO handle batches + var _a = imgTensor.shape, batchSize = _a[0], imgHeight = _a[1], imgWidth = _a[2], numChannels = _a[3]; + var boxes = detections.map(function (det) { return det instanceof FaceDetection + ? det.forSize(imgWidth, imgHeight).getBox().floor() + : det; }); + var faceTensors = boxes.map(function (_a) { + var x = _a.x, y = _a.y, width = _a.width, height = _a.height; + return slice(imgTensor, [0, y, x, 0], [1, height, width, numChannels]); + }); + return faceTensors; + }); + } + + function extractWeightsFactory(weights) { + var remainingWeights = weights; + function extractWeights(numWeights) { + var ret = remainingWeights.slice(0, numWeights); + remainingWeights = remainingWeights.slice(numWeights); + return ret; } - - // Mix in string seed, then discard an initial batch of 64 values. - for (var k = 0; k < strseed.length + 64; k++) { - me.x ^= strseed.charCodeAt(k) | 0; - me.next(); + function getRemainingWeights() { + return remainingWeights; } - } - - function copy(f, t) { - t.x = f.x; - t.y = f.y; - t.z = f.z; - t.w = f.w; - return t; - } - - function impl(seed, opts) { - var xg = new XorGen(seed), - state = opts && opts.state, - prng = function() { return (xg.next() >>> 0) / 0x100000000; }; - prng.double = function() { - do { - var top = xg.next() >>> 11, - bot = (xg.next() >>> 0) / 0x100000000, - result = (top + bot) / (1 << 21); - } while (result === 0); - return result; + return { + extractWeights: extractWeights, + getRemainingWeights: getRemainingWeights }; - prng.int32 = xg.next; - prng.quick = prng; - if (state) { - if (typeof(state) == 'object') copy(state, xg); - prng.state = function() { return copy(xg, {}); }; + } + + function extractorsFactory(extractWeights) { + function extractDepthwiseConvParams(numChannels) { + var filters = tensor4d(extractWeights(3 * 3 * numChannels), [3, 3, numChannels, 1]); + var batch_norm_scale = tensor1d(extractWeights(numChannels)); + var batch_norm_offset = tensor1d(extractWeights(numChannels)); + var batch_norm_mean = tensor1d(extractWeights(numChannels)); + var batch_norm_variance = tensor1d(extractWeights(numChannels)); + return { + filters: filters, + batch_norm_scale: batch_norm_scale, + batch_norm_offset: batch_norm_offset, + batch_norm_mean: batch_norm_mean, + batch_norm_variance: batch_norm_variance + }; } - return prng; - } - - if (module && module.exports) { - module.exports = impl; - } else if (define && define.amd) { - define(function() { return impl; }); - } else { - this.xor128 = impl; - } - - })( - commonjsGlobal, - module, // present in node.js - (typeof undefined) == 'function' && undefined // present with an AMD loader - ); - }); - - var xorwow = createCommonjsModule(function (module) { - // A Javascript implementaion of the "xorwow" prng algorithm by - // George Marsaglia. See http://www.jstatsoft.org/v08/i14/paper - - (function(global, module, define) { - - function XorGen(seed) { - var me = this, strseed = ''; - - // Set up generator function. - me.next = function() { - var t = (me.x ^ (me.x >>> 2)); - me.x = me.y; me.y = me.z; me.z = me.w; me.w = me.v; - return (me.d = (me.d + 362437 | 0)) + - (me.v = (me.v ^ (me.v << 4)) ^ (t ^ (t << 1))) | 0; + function extractConvParams(channelsIn, channelsOut, filterSize) { + var filters = tensor4d(extractWeights(channelsIn * channelsOut * filterSize * filterSize), [filterSize, filterSize, channelsIn, channelsOut]); + var bias = tensor1d(extractWeights(channelsOut)); + return { + filters: filters, + bias: bias + }; + } + function extractPointwiseConvParams(channelsIn, channelsOut, filterSize) { + var _a = extractConvParams(channelsIn, channelsOut, filterSize), filters = _a.filters, bias = _a.bias; + return { + filters: filters, + batch_norm_offset: bias + }; + } + function extractConvPairParams(channelsIn, channelsOut) { + var depthwise_conv_params = extractDepthwiseConvParams(channelsIn); + var pointwise_conv_params = extractPointwiseConvParams(channelsIn, channelsOut, 1); + return { + depthwise_conv_params: depthwise_conv_params, + pointwise_conv_params: pointwise_conv_params + }; + } + function extractMobilenetV1Params() { + var conv_0_params = extractPointwiseConvParams(3, 32, 3); + var channelNumPairs = [ + [32, 64], + [64, 128], + [128, 128], + [128, 256], + [256, 256], + [256, 512], + [512, 512], + [512, 512], + [512, 512], + [512, 512], + [512, 512], + [512, 1024], + [1024, 1024] + ]; + var conv_pair_params = channelNumPairs.map(function (_a) { + var channelsIn = _a[0], channelsOut = _a[1]; + return extractConvPairParams(channelsIn, channelsOut); + }); + return { + conv_0_params: conv_0_params, + conv_pair_params: conv_pair_params + }; + } + function extractPredictionLayerParams() { + var conv_0_params = extractPointwiseConvParams(1024, 256, 1); + var conv_1_params = extractPointwiseConvParams(256, 512, 3); + var conv_2_params = extractPointwiseConvParams(512, 128, 1); + var conv_3_params = extractPointwiseConvParams(128, 256, 3); + var conv_4_params = extractPointwiseConvParams(256, 128, 1); + var conv_5_params = extractPointwiseConvParams(128, 256, 3); + var conv_6_params = extractPointwiseConvParams(256, 64, 1); + var conv_7_params = extractPointwiseConvParams(64, 128, 3); + var box_encoding_0_predictor_params = extractConvParams(512, 12, 1); + var class_predictor_0_params = extractConvParams(512, 9, 1); + var box_encoding_1_predictor_params = extractConvParams(1024, 24, 1); + var class_predictor_1_params = extractConvParams(1024, 18, 1); + var box_encoding_2_predictor_params = extractConvParams(512, 24, 1); + var class_predictor_2_params = extractConvParams(512, 18, 1); + var box_encoding_3_predictor_params = extractConvParams(256, 24, 1); + var class_predictor_3_params = extractConvParams(256, 18, 1); + var box_encoding_4_predictor_params = extractConvParams(256, 24, 1); + var class_predictor_4_params = extractConvParams(256, 18, 1); + var box_encoding_5_predictor_params = extractConvParams(128, 24, 1); + var class_predictor_5_params = extractConvParams(128, 18, 1); + var box_predictor_0_params = { + box_encoding_predictor_params: box_encoding_0_predictor_params, + class_predictor_params: class_predictor_0_params + }; + var box_predictor_1_params = { + box_encoding_predictor_params: box_encoding_1_predictor_params, + class_predictor_params: class_predictor_1_params + }; + var box_predictor_2_params = { + box_encoding_predictor_params: box_encoding_2_predictor_params, + class_predictor_params: class_predictor_2_params + }; + var box_predictor_3_params = { + box_encoding_predictor_params: box_encoding_3_predictor_params, + class_predictor_params: class_predictor_3_params + }; + var box_predictor_4_params = { + box_encoding_predictor_params: box_encoding_4_predictor_params, + class_predictor_params: class_predictor_4_params + }; + var box_predictor_5_params = { + box_encoding_predictor_params: box_encoding_5_predictor_params, + class_predictor_params: class_predictor_5_params + }; + return { + conv_0_params: conv_0_params, + conv_1_params: conv_1_params, + conv_2_params: conv_2_params, + conv_3_params: conv_3_params, + conv_4_params: conv_4_params, + conv_5_params: conv_5_params, + conv_6_params: conv_6_params, + conv_7_params: conv_7_params, + box_predictor_0_params: box_predictor_0_params, + box_predictor_1_params: box_predictor_1_params, + box_predictor_2_params: box_predictor_2_params, + box_predictor_3_params: box_predictor_3_params, + box_predictor_4_params: box_predictor_4_params, + box_predictor_5_params: box_predictor_5_params + }; + } + return { + extractMobilenetV1Params: extractMobilenetV1Params, + extractPredictionLayerParams: extractPredictionLayerParams }; - - me.x = 0; - me.y = 0; - me.z = 0; - me.w = 0; - me.v = 0; - - if (seed === (seed | 0)) { - // Integer seed. - me.x = seed; - } else { - // String seed. - strseed += seed; + } + function extractParams(weights) { + var _a = extractWeightsFactory(weights), extractWeights = _a.extractWeights, getRemainingWeights = _a.getRemainingWeights; + var _b = extractorsFactory(extractWeights), extractMobilenetV1Params = _b.extractMobilenetV1Params, extractPredictionLayerParams = _b.extractPredictionLayerParams; + var mobilenetv1_params = extractMobilenetV1Params(); + var prediction_layer_params = extractPredictionLayerParams(); + var extra_dim = tensor3d(extractWeights(5118 * 4), [1, 5118, 4]); + var output_layer_params = { + extra_dim: extra_dim + }; + if (getRemainingWeights().length !== 0) { + throw new Error("weights remaing after extract: " + getRemainingWeights().length); } - - // Mix in string seed, then discard an initial batch of 64 values. - for (var k = 0; k < strseed.length + 64; k++) { - me.x ^= strseed.charCodeAt(k) | 0; - if (k == strseed.length) { - me.d = me.x << 10 ^ me.x >>> 4; - } - me.next(); + return { + mobilenetv1_params: mobilenetv1_params, + prediction_layer_params: prediction_layer_params, + output_layer_params: output_layer_params + }; + } + + function isTensor(tensor$$1, dim) { + return tensor$$1 instanceof Tensor && tensor$$1.shape.length === dim; + } + function isTensor1D(tensor$$1) { + return isTensor(tensor$$1, 1); + } + function isTensor2D(tensor$$1) { + return isTensor(tensor$$1, 2); + } + function isTensor3D(tensor$$1) { + return isTensor(tensor$$1, 3); + } + function isTensor4D(tensor$$1) { + return isTensor(tensor$$1, 4); + } + + function getModelUris(uri, defaultModelName) { + var parts = (uri || '').split('/'); + var modelBaseUri = ((uri || '').endsWith('.json') + ? parts.slice(0, parts.length - 1) + : parts).filter(function (s) { return s; }).join('/'); + var defaultManifestFilename = defaultModelName + "-weights_manifest.json"; + var manifestUri = !uri || !modelBaseUri + ? defaultManifestFilename + : (uri.endsWith('.json') + ? uri + : modelBaseUri + "/" + defaultManifestFilename); + return { manifestUri: manifestUri, modelBaseUri: modelBaseUri }; + } + function loadWeightMap(uri, defaultModelName) { + return __awaiter$1(this, void 0, void 0, function () { + var _a, manifestUri, modelBaseUri, manifest; + return __generator$1(this, function (_b) { + switch (_b.label) { + case 0: + _a = getModelUris(uri, defaultModelName), manifestUri = _a.manifestUri, modelBaseUri = _a.modelBaseUri; + return [4 /*yield*/, fetch(manifestUri)]; + case 1: return [4 /*yield*/, (_b.sent()).json()]; + case 2: + manifest = _b.sent(); + return [2 /*return*/, io.loadWeights(manifest, modelBaseUri)]; + } + }); + }); + } + + var DEFAULT_MODEL_NAME = 'face_detection_model'; + function extractorsFactory$1(weightMap) { + function extractPointwiseConvParams(prefix, idx) { + var pointwise_conv_params = { + filters: weightMap[prefix + "/Conv2d_" + idx + "_pointwise/weights"], + batch_norm_offset: weightMap[prefix + "/Conv2d_" + idx + "_pointwise/convolution_bn_offset"] + }; + if (!isTensor4D(pointwise_conv_params.filters)) { + throw new Error("expected weightMap[" + prefix + "/Conv2d_" + idx + "_pointwise/weights] to be a Tensor4D, instead have " + pointwise_conv_params.filters); + } + if (!isTensor1D(pointwise_conv_params.batch_norm_offset)) { + throw new Error("expected weightMap[" + prefix + "/Conv2d_" + idx + "_pointwise/convolution_bn_offset] to be a Tensor1D, instead have " + pointwise_conv_params.batch_norm_offset); + } + return pointwise_conv_params; } - } - - function copy(f, t) { - t.x = f.x; - t.y = f.y; - t.z = f.z; - t.w = f.w; - t.v = f.v; - t.d = f.d; - return t; - } - - function impl(seed, opts) { - var xg = new XorGen(seed), - state = opts && opts.state, - prng = function() { return (xg.next() >>> 0) / 0x100000000; }; - prng.double = function() { - do { - var top = xg.next() >>> 11, - bot = (xg.next() >>> 0) / 0x100000000, - result = (top + bot) / (1 << 21); - } while (result === 0); - return result; + function extractConvPairParams(idx) { + var depthwise_conv_params = { + filters: weightMap["MobilenetV1/Conv2d_" + idx + "_depthwise/depthwise_weights"], + batch_norm_scale: weightMap["MobilenetV1/Conv2d_" + idx + "_depthwise/BatchNorm/gamma"], + batch_norm_offset: weightMap["MobilenetV1/Conv2d_" + idx + "_depthwise/BatchNorm/beta"], + batch_norm_mean: weightMap["MobilenetV1/Conv2d_" + idx + "_depthwise/BatchNorm/moving_mean"], + batch_norm_variance: weightMap["MobilenetV1/Conv2d_" + idx + "_depthwise/BatchNorm/moving_variance"], + }; + if (!isTensor4D(depthwise_conv_params.filters)) { + throw new Error("expected weightMap[MobilenetV1/Conv2d_" + idx + "_depthwise/depthwise_weights] to be a Tensor4D, instead have " + depthwise_conv_params.filters); + } + if (!isTensor1D(depthwise_conv_params.batch_norm_scale)) { + throw new Error("expected weightMap[MobilenetV1/Conv2d_" + idx + "_depthwise/BatchNorm/gamma] to be a Tensor1D, instead have " + depthwise_conv_params.batch_norm_scale); + } + if (!isTensor1D(depthwise_conv_params.batch_norm_offset)) { + throw new Error("expected weightMap[MobilenetV1/Conv2d_" + idx + "_depthwise/BatchNorm/beta] to be a Tensor1D, instead have " + depthwise_conv_params.batch_norm_offset); + } + if (!isTensor1D(depthwise_conv_params.batch_norm_mean)) { + throw new Error("expected weightMap[MobilenetV1/Conv2d_" + idx + "_depthwise/BatchNorm/moving_mean] to be a Tensor1D, instead have " + depthwise_conv_params.batch_norm_mean); + } + if (!isTensor1D(depthwise_conv_params.batch_norm_variance)) { + throw new Error("expected weightMap[MobilenetV1/Conv2d_" + idx + "_depthwise/BatchNorm/moving_variance] to be a Tensor1D, instead have " + depthwise_conv_params.batch_norm_variance); + } + return { + depthwise_conv_params: depthwise_conv_params, + pointwise_conv_params: extractPointwiseConvParams('MobilenetV1', idx) + }; + } + function extractMobilenetV1Params() { + return { + conv_0_params: extractPointwiseConvParams('MobilenetV1', 0), + conv_pair_params: Array(13).fill(0).map(function (_, i) { return extractConvPairParams(i + 1); }) + }; + } + function extractBoxPredictorParams(idx) { + var params = { + box_encoding_predictor_params: { + filters: weightMap["Prediction/BoxPredictor_" + idx + "/BoxEncodingPredictor/weights"], + bias: weightMap["Prediction/BoxPredictor_" + idx + "/BoxEncodingPredictor/biases"] + }, + class_predictor_params: { + filters: weightMap["Prediction/BoxPredictor_" + idx + "/ClassPredictor/weights"], + bias: weightMap["Prediction/BoxPredictor_" + idx + "/ClassPredictor/biases"] + } + }; + if (!isTensor4D(params.box_encoding_predictor_params.filters)) { + throw new Error("expected weightMap[Prediction/BoxPredictor_" + idx + "/BoxEncodingPredictor/weights] to be a Tensor4D, instead have " + params.box_encoding_predictor_params.filters); + } + if (!isTensor1D(params.box_encoding_predictor_params.bias)) { + throw new Error("expected weightMap[Prediction/BoxPredictor_" + idx + "/BoxEncodingPredictor/biases] to be a Tensor1D, instead have " + params.box_encoding_predictor_params.bias); + } + if (!isTensor4D(params.class_predictor_params.filters)) { + throw new Error("expected weightMap[Prediction/BoxPredictor_" + idx + "/ClassPredictor/weights] to be a Tensor4D, instead have " + params.class_predictor_params.filters); + } + if (!isTensor1D(params.class_predictor_params.bias)) { + throw new Error("expected weightMap[Prediction/BoxPredictor_" + idx + "/ClassPredictor/biases] to be a Tensor1D, instead have " + params.class_predictor_params.bias); + } + return params; + } + function extractPredictionLayerParams() { + return { + conv_0_params: extractPointwiseConvParams('Prediction', 0), + conv_1_params: extractPointwiseConvParams('Prediction', 1), + conv_2_params: extractPointwiseConvParams('Prediction', 2), + conv_3_params: extractPointwiseConvParams('Prediction', 3), + conv_4_params: extractPointwiseConvParams('Prediction', 4), + conv_5_params: extractPointwiseConvParams('Prediction', 5), + conv_6_params: extractPointwiseConvParams('Prediction', 6), + conv_7_params: extractPointwiseConvParams('Prediction', 7), + box_predictor_0_params: extractBoxPredictorParams(0), + box_predictor_1_params: extractBoxPredictorParams(1), + box_predictor_2_params: extractBoxPredictorParams(2), + box_predictor_3_params: extractBoxPredictorParams(3), + box_predictor_4_params: extractBoxPredictorParams(4), + box_predictor_5_params: extractBoxPredictorParams(5) + }; + } + return { + extractMobilenetV1Params: extractMobilenetV1Params, + extractPredictionLayerParams: extractPredictionLayerParams + }; + } + function loadQuantizedParams(uri) { + return __awaiter$1(this, void 0, void 0, function () { + var weightMap, _a, extractMobilenetV1Params, extractPredictionLayerParams, extra_dim; + return __generator$1(this, function (_b) { + switch (_b.label) { + case 0: return [4 /*yield*/, loadWeightMap(uri, DEFAULT_MODEL_NAME)]; + case 1: + weightMap = _b.sent(); + _a = extractorsFactory$1(weightMap), extractMobilenetV1Params = _a.extractMobilenetV1Params, extractPredictionLayerParams = _a.extractPredictionLayerParams; + extra_dim = weightMap['Output/extra_dim']; + if (!isTensor3D(extra_dim)) { + throw new Error("expected weightMap['Output/extra_dim'] to be a Tensor3D, instead have " + extra_dim); + } + return [2 /*return*/, { + mobilenetv1_params: extractMobilenetV1Params(), + prediction_layer_params: extractPredictionLayerParams(), + output_layer_params: { + extra_dim: extra_dim + } + }]; + } + }); + }); + } + + function pointwiseConvLayer(x, params, strides) { + return tidy(function () { + var out = conv2d(x, params.filters, strides, 'same'); + out = add(out, params.batch_norm_offset); + return clipByValue(out, 0, 6); + }); + } + + var epsilon = 0.0010000000474974513; + function depthwiseConvLayer(x, params, strides) { + return tidy(function () { + var out = depthwiseConv2d(x, params.filters, strides, 'same'); + out = batchNormalization(out, params.batch_norm_mean, params.batch_norm_variance, epsilon, params.batch_norm_scale, params.batch_norm_offset); + return clipByValue(out, 0, 6); + }); + } + function getStridesForLayerIdx(layerIdx) { + return [2, 4, 6, 12].some(function (idx) { return idx === layerIdx; }) ? [2, 2] : [1, 1]; + } + function mobileNetV1(x, params) { + return tidy(function () { + var conv11 = null; + var out = pointwiseConvLayer(x, params.conv_0_params, [2, 2]); + params.conv_pair_params.forEach(function (param, i) { + var layerIdx = i + 1; + var depthwiseConvStrides = getStridesForLayerIdx(layerIdx); + out = depthwiseConvLayer(out, param.depthwise_conv_params, depthwiseConvStrides); + out = pointwiseConvLayer(out, param.pointwise_conv_params, [1, 1]); + if (layerIdx === 11) { + conv11 = out; + } + }); + if (conv11 === null) { + throw new Error('mobileNetV1 - output of conv layer 11 is null'); + } + return { + out: out, + conv11: conv11 + }; + }); + } + + function nonMaxSuppression(boxes, scores, maxOutputSize, iouThreshold, scoreThreshold) { + var numBoxes = boxes.shape[0]; + var outputSize = Math.min(maxOutputSize, numBoxes); + var candidates = scores + .map(function (score, boxIndex) { return ({ score: score, boxIndex: boxIndex }); }) + .filter(function (c) { return c.score > scoreThreshold; }) + .sort(function (c1, c2) { return c2.score - c1.score; }); + var suppressFunc = function (x) { return x <= iouThreshold ? 1 : 0; }; + var selected = []; + candidates.forEach(function (c) { + if (selected.length >= outputSize) { + return; + } + var originalScore = c.score; + for (var j = selected.length - 1; j >= 0; --j) { + var iou = IOU(boxes, c.boxIndex, selected[j]); + if (iou === 0.0) { + continue; + } + c.score *= suppressFunc(iou); + if (c.score <= scoreThreshold) { + break; + } + } + if (originalScore === c.score) { + selected.push(c.boxIndex); + } + }); + return selected; + } + function IOU(boxes, i, j) { + var yminI = Math.min(boxes.get(i, 0), boxes.get(i, 2)); + var xminI = Math.min(boxes.get(i, 1), boxes.get(i, 3)); + var ymaxI = Math.max(boxes.get(i, 0), boxes.get(i, 2)); + var xmaxI = Math.max(boxes.get(i, 1), boxes.get(i, 3)); + var yminJ = Math.min(boxes.get(j, 0), boxes.get(j, 2)); + var xminJ = Math.min(boxes.get(j, 1), boxes.get(j, 3)); + var ymaxJ = Math.max(boxes.get(j, 0), boxes.get(j, 2)); + var xmaxJ = Math.max(boxes.get(j, 1), boxes.get(j, 3)); + var areaI = (ymaxI - yminI) * (xmaxI - xminI); + var areaJ = (ymaxJ - yminJ) * (xmaxJ - xminJ); + if (areaI <= 0 || areaJ <= 0) { + return 0.0; + } + var intersectionYmin = Math.max(yminI, yminJ); + var intersectionXmin = Math.max(xminI, xminJ); + var intersectionYmax = Math.min(ymaxI, ymaxJ); + var intersectionXmax = Math.min(xmaxI, xmaxJ); + var intersectionArea = Math.max(intersectionYmax - intersectionYmin, 0.0) * + Math.max(intersectionXmax - intersectionXmin, 0.0); + return intersectionArea / (areaI + areaJ - intersectionArea); + } + + function getCenterCoordinatesAndSizesLayer(x) { + var vec = unstack(transpose(x, [1, 0])); + var sizes = [ + sub(vec[2], vec[0]), + sub(vec[3], vec[1]) + ]; + var centers = [ + add(vec[0], div(sizes[0], scalar(2))), + add(vec[1], div(sizes[1], scalar(2))) + ]; + return { + sizes: sizes, + centers: centers }; - prng.int32 = xg.next; - prng.quick = prng; - if (state) { - if (typeof(state) == 'object') copy(state, xg); - prng.state = function() { return copy(xg, {}); }; + } + function decodeBoxesLayer(x0, x1) { + var _a = getCenterCoordinatesAndSizesLayer(x0), sizes = _a.sizes, centers = _a.centers; + var vec = unstack(transpose(x1, [1, 0])); + var div0_out = div(mul(exp(div(vec[2], scalar(5))), sizes[0]), scalar(2)); + var add0_out = add(mul(div(vec[0], scalar(10)), sizes[0]), centers[0]); + var div1_out = div(mul(exp(div(vec[3], scalar(5))), sizes[1]), scalar(2)); + var add1_out = add(mul(div(vec[1], scalar(10)), sizes[1]), centers[1]); + return transpose(stack([ + sub(add0_out, div0_out), + sub(add1_out, div1_out), + add(add0_out, div0_out), + add(add1_out, div1_out) + ]), [1, 0]); + } + function outputLayer(boxPredictions, classPredictions, params) { + return tidy(function () { + var batchSize = boxPredictions.shape[0]; + var boxes = decodeBoxesLayer(reshape(tile(params.extra_dim, [batchSize, 1, 1]), [-1, 4]), reshape(boxPredictions, [-1, 4])); + boxes = reshape(boxes, [batchSize, (boxes.shape[0] / batchSize), 4]); + var scoresAndClasses = sigmoid(slice(classPredictions, [0, 0, 1], [-1, -1, -1])); + var scores = slice(scoresAndClasses, [0, 0, 0], [-1, -1, 1]); + scores = reshape(scores, [batchSize, scores.shape[1]]); + var boxesByBatch = unstack(boxes); + var scoresByBatch = unstack(scores); + return { + boxes: boxesByBatch, + scores: scoresByBatch + }; + }); + } + + function convLayer(x, params, padding, withRelu) { + if (padding === void 0) { padding = 'same'; } + if (withRelu === void 0) { withRelu = false; } + return tidy(function () { + var out = add(conv2d(x, params.filters, [1, 1], padding), params.bias); + return withRelu ? relu(out) : out; + }); + } + + function boxPredictionLayer(x, params) { + return tidy(function () { + var batchSize = x.shape[0]; + var boxPredictionEncoding = reshape(convLayer(x, params.box_encoding_predictor_params), [batchSize, -1, 1, 4]); + var classPrediction = reshape(convLayer(x, params.class_predictor_params), [batchSize, -1, 3]); + return { + boxPredictionEncoding: boxPredictionEncoding, + classPrediction: classPrediction + }; + }); + } + + function predictionLayer(x, conv11, params) { + return tidy(function () { + var conv0 = pointwiseConvLayer(x, params.conv_0_params, [1, 1]); + var conv1 = pointwiseConvLayer(conv0, params.conv_1_params, [2, 2]); + var conv2 = pointwiseConvLayer(conv1, params.conv_2_params, [1, 1]); + var conv3 = pointwiseConvLayer(conv2, params.conv_3_params, [2, 2]); + var conv4 = pointwiseConvLayer(conv3, params.conv_4_params, [1, 1]); + var conv5 = pointwiseConvLayer(conv4, params.conv_5_params, [2, 2]); + var conv6 = pointwiseConvLayer(conv5, params.conv_6_params, [1, 1]); + var conv7 = pointwiseConvLayer(conv6, params.conv_7_params, [2, 2]); + var boxPrediction0 = boxPredictionLayer(conv11, params.box_predictor_0_params); + var boxPrediction1 = boxPredictionLayer(x, params.box_predictor_1_params); + var boxPrediction2 = boxPredictionLayer(conv1, params.box_predictor_2_params); + var boxPrediction3 = boxPredictionLayer(conv3, params.box_predictor_3_params); + var boxPrediction4 = boxPredictionLayer(conv5, params.box_predictor_4_params); + var boxPrediction5 = boxPredictionLayer(conv7, params.box_predictor_5_params); + var boxPredictions = concat([ + boxPrediction0.boxPredictionEncoding, + boxPrediction1.boxPredictionEncoding, + boxPrediction2.boxPredictionEncoding, + boxPrediction3.boxPredictionEncoding, + boxPrediction4.boxPredictionEncoding, + boxPrediction5.boxPredictionEncoding + ], 1); + var classPredictions = concat([ + boxPrediction0.classPrediction, + boxPrediction1.classPrediction, + boxPrediction2.classPrediction, + boxPrediction3.classPrediction, + boxPrediction4.classPrediction, + boxPrediction5.classPrediction + ], 1); + return { + boxPredictions: boxPredictions, + classPredictions: classPredictions + }; + }); + } + + var resizedImageSize = [512, 512]; + var weight = scalar(0.007843137718737125); + var bias = scalar(1); + function resizeLayer(x) { + return tidy(function () { + var resized = image.resizeBilinear(x, resizedImageSize, false); + return sub(mul(resized, weight), bias); + }); + } + + var FaceDetectionNet = /** @class */ (function () { + function FaceDetectionNet() { } - return prng; - } - - if (module && module.exports) { - module.exports = impl; - } else if (define && define.amd) { - define(function() { return impl; }); - } else { - this.xorwow = impl; - } - - })( - commonjsGlobal, - module, // present in node.js - (typeof undefined) == 'function' && undefined // present with an AMD loader - ); - }); - - var xorshift7 = createCommonjsModule(function (module) { - // A Javascript implementaion of the "xorshift7" algorithm by - // François Panneton and Pierre L'ecuyer: - // "On the Xorgshift Random Number Generators" - // http://saluc.engr.uconn.edu/refs/crypto/rng/panneton05onthexorshift.pdf - - (function(global, module, define) { - - function XorGen(seed) { - var me = this; - - // Set up generator function. - me.next = function() { - // Update xor generator. - var X = me.x, i = me.i, t, v; - t = X[i]; t ^= (t >>> 7); v = t ^ (t << 24); - t = X[(i + 1) & 7]; v ^= t ^ (t >>> 10); - t = X[(i + 3) & 7]; v ^= t ^ (t >>> 3); - t = X[(i + 4) & 7]; v ^= t ^ (t << 7); - t = X[(i + 7) & 7]; t = t ^ (t << 13); v ^= t ^ (t << 9); - X[i] = v; - me.i = (i + 1) & 7; - return v; + FaceDetectionNet.prototype.load = function (weightsOrUrl) { + return __awaiter$1(this, void 0, void 0, function () { + var _a; + return __generator$1(this, function (_b) { + switch (_b.label) { + case 0: + if (weightsOrUrl instanceof Float32Array) { + this.extractWeights(weightsOrUrl); + return [2 /*return*/]; + } + if (weightsOrUrl && typeof weightsOrUrl !== 'string') { + throw new Error('FaceDetectionNet.load - expected model uri, or weights as Float32Array'); + } + _a = this; + return [4 /*yield*/, loadQuantizedParams(weightsOrUrl)]; + case 1: + _a._params = _b.sent(); + return [2 /*return*/]; + } + }); + }); }; - - function init(me, seed) { - var j, w, X = []; - - if (seed === (seed | 0)) { - // Seed state array using a 32-bit integer. - w = X[0] = seed; - } else { - // Seed state using a string. - seed = '' + seed; - for (j = 0; j < seed.length; ++j) { - X[j & 7] = (X[j & 7] << 15) ^ - (seed.charCodeAt(j) + X[(j + 1) & 7] << 13); + FaceDetectionNet.prototype.extractWeights = function (weights) { + this._params = extractParams(weights); + }; + FaceDetectionNet.prototype.forwardTensor = function (imgTensor) { + var _this = this; + if (!this._params) { + throw new Error('FaceDetectionNet - load model before inference'); } - } - // Enforce an array length of 8, not all zeroes. - while (X.length < 8) X.push(0); - for (j = 0; j < 8 && X[j] === 0; ++j); - if (j == 8) w = X[7] = -1; else w = X[j]; - - me.x = X; - me.i = 0; - - // Discard an initial 256 values. - for (j = 256; j > 0; --j) { - me.next(); - } + return tidy(function () { + var resized = resizeLayer(imgTensor); + var features = mobileNetV1(resized, _this._params.mobilenetv1_params); + var _a = predictionLayer(features.out, features.conv11, _this._params.prediction_layer_params), boxPredictions = _a.boxPredictions, classPredictions = _a.classPredictions; + return outputLayer(boxPredictions, classPredictions, _this._params.output_layer_params); + }); + }; + FaceDetectionNet.prototype.forward = function (input) { + var _this = this; + return tidy(function () { return _this.forwardTensor(padToSquare(getImageTensor(input))); }); + }; + FaceDetectionNet.prototype.locateFaces = function (input, minConfidence, maxResults) { + if (minConfidence === void 0) { minConfidence = 0.8; } + if (maxResults === void 0) { maxResults = 100; } + return __awaiter$1(this, void 0, void 0, function () { + var _this = this; + var paddedHeightRelative, paddedWidthRelative, imageDimensions, _a, _boxes, _scores, boxes, scores, i, scoresData, _b, _c, iouThreshold, indices, results; + return __generator$1(this, function (_d) { + switch (_d.label) { + case 0: + paddedHeightRelative = 1, paddedWidthRelative = 1; + _a = tidy(function () { + var imgTensor = getImageTensor(input); + var _a = imgTensor.shape.slice(1), height = _a[0], width = _a[1]; + imageDimensions = { width: width, height: height }; + imgTensor = padToSquare(imgTensor); + paddedHeightRelative = imgTensor.shape[1] / height; + paddedWidthRelative = imgTensor.shape[2] / width; + return _this.forwardTensor(imgTensor); + }), _boxes = _a.boxes, _scores = _a.scores; + boxes = _boxes[0]; + scores = _scores[0]; + for (i = 1; i < _boxes.length; i++) { + _boxes[i].dispose(); + _scores[i].dispose(); + } + _c = (_b = Array).from; + return [4 /*yield*/, scores.data()]; + case 1: + scoresData = _c.apply(_b, [_d.sent()]); + iouThreshold = 0.5; + indices = nonMaxSuppression(boxes, scoresData, maxResults, iouThreshold, minConfidence); + results = indices + .map(function (idx) { + var _a = [ + Math.max(0, boxes.get(idx, 0)), + Math.min(1.0, boxes.get(idx, 2)) + ].map(function (val) { return val * paddedHeightRelative; }), top = _a[0], bottom = _a[1]; + var _b = [ + Math.max(0, boxes.get(idx, 1)), + Math.min(1.0, boxes.get(idx, 3)) + ].map(function (val) { return val * paddedWidthRelative; }), left = _b[0], right = _b[1]; + return new FaceDetection(scoresData[idx], new Rect(left, top, right - left, bottom - top), imageDimensions); + }); + boxes.dispose(); + scores.dispose(); + return [2 /*return*/, results]; + } + }); + }); + }; + return FaceDetectionNet; + }()); + + function faceDetectionNet(weights) { + var net = new FaceDetectionNet(); + net.extractWeights(weights); + return net; + } + + var Point = /** @class */ (function () { + function Point(x, y) { + this.x = x; + this.y = y; } - - init(me, seed); - } - - function copy(f, t) { - t.x = f.x.slice(); - t.i = f.i; - return t; - } - - function impl(seed, opts) { - if (seed == null) seed = +(new Date); - var xg = new XorGen(seed), - state = opts && opts.state, - prng = function() { return (xg.next() >>> 0) / 0x100000000; }; - prng.double = function() { - do { - var top = xg.next() >>> 11, - bot = (xg.next() >>> 0) / 0x100000000, - result = (top + bot) / (1 << 21); - } while (result === 0); - return result; + Point.prototype.add = function (pt) { + return new Point(this.x + pt.x, this.y + pt.y); + }; + Point.prototype.sub = function (pt) { + return new Point(this.x - pt.x, this.y - pt.y); + }; + Point.prototype.mul = function (pt) { + return new Point(this.x * pt.x, this.y * pt.y); + }; + Point.prototype.div = function (pt) { + return new Point(this.x / pt.x, this.y / pt.y); }; - prng.int32 = xg.next; - prng.quick = prng; - if (state) { - if (state.x) copy(state, xg); - prng.state = function() { return copy(xg, {}); }; + Point.prototype.abs = function () { + return new Point(Math.abs(this.x), Math.abs(this.y)); + }; + Point.prototype.magnitude = function () { + return Math.sqrt(Math.pow(this.x, 2) + Math.pow(this.y, 2)); + }; + Point.prototype.floor = function () { + return new Point(Math.floor(this.x), Math.floor(this.y)); + }; + return Point; + }()); + + function extractConvParamsFactory(extractWeights) { + return function (channelsIn, channelsOut, filterSize) { + var filters = tensor4d(extractWeights(channelsIn * channelsOut * filterSize * filterSize), [filterSize, filterSize, channelsIn, channelsOut]); + var bias = tensor1d(extractWeights(channelsOut)); + return { + filters: filters, + bias: bias + }; + }; + } + + function extractParams$1(weights) { + var _a = extractWeightsFactory(weights), extractWeights = _a.extractWeights, getRemainingWeights = _a.getRemainingWeights; + var extractConvParams = extractConvParamsFactory(extractWeights); + function extractFcParams(channelsIn, channelsOut) { + var fc_weights = tensor2d(extractWeights(channelsIn * channelsOut), [channelsIn, channelsOut]); + var fc_bias = tensor1d(extractWeights(channelsOut)); + return { + weights: fc_weights, + bias: fc_bias + }; } - return prng; - } - - if (module && module.exports) { - module.exports = impl; - } else if (define && define.amd) { - define(function() { return impl; }); - } else { - this.xorshift7 = impl; - } - - })( - commonjsGlobal, - module, // present in node.js - (typeof undefined) == 'function' && undefined // present with an AMD loader - ); - }); - - var xor4096 = createCommonjsModule(function (module) { - // A Javascript implementaion of Richard Brent's Xorgens xor4096 algorithm. - // - // This fast non-cryptographic random number generator is designed for - // use in Monte-Carlo algorithms. It combines a long-period xorshift - // generator with a Weyl generator, and it passes all common batteries - // of stasticial tests for randomness while consuming only a few nanoseconds - // for each prng generated. For background on the generator, see Brent's - // paper: "Some long-period random number generators using shifts and xors." - // http://arxiv.org/pdf/1004.3115v1.pdf - // - // Usage: - // - // var xor4096 = require('xor4096'); - // random = xor4096(1); // Seed with int32 or string. - // assert.equal(random(), 0.1520436450538547); // (0, 1) range, 53 bits. - // assert.equal(random.int32(), 1806534897); // signed int32, 32 bits. - // - // For nonzero numeric keys, this impelementation provides a sequence - // identical to that by Brent's xorgens 3 implementaion in C. This - // implementation also provides for initalizing the generator with - // string seeds, or for saving and restoring the state of the generator. - // - // On Chrome, this prng benchmarks about 2.1 times slower than - // Javascript's built-in Math.random(). - - (function(global, module, define) { - - function XorGen(seed) { - var me = this; - - // Set up generator function. - me.next = function() { - var w = me.w, - X = me.X, i = me.i, t, v; - // Update Weyl generator. - me.w = w = (w + 0x61c88647) | 0; - // Update xor generator. - v = X[(i + 34) & 127]; - t = X[i = ((i + 1) & 127)]; - v ^= v << 13; - t ^= t << 17; - v ^= v >>> 15; - t ^= t >>> 12; - // Update Xor generator array state. - v = X[i] = v ^ t; - me.i = i; - // Result is the combination. - return (v + (w ^ (w >>> 16))) | 0; + var conv0_params = extractConvParams(3, 32, 3); + var conv1_params = extractConvParams(32, 64, 3); + var conv2_params = extractConvParams(64, 64, 3); + var conv3_params = extractConvParams(64, 64, 3); + var conv4_params = extractConvParams(64, 64, 3); + var conv5_params = extractConvParams(64, 128, 3); + var conv6_params = extractConvParams(128, 128, 3); + var conv7_params = extractConvParams(128, 256, 3); + var fc0_params = extractFcParams(6400, 1024); + var fc1_params = extractFcParams(1024, 136); + if (getRemainingWeights().length !== 0) { + throw new Error("weights remaing after extract: " + getRemainingWeights().length); + } + return { + conv0_params: conv0_params, + conv1_params: conv1_params, + conv2_params: conv2_params, + conv3_params: conv3_params, + conv4_params: conv4_params, + conv5_params: conv5_params, + conv6_params: conv6_params, + conv7_params: conv7_params, + fc0_params: fc0_params, + fc1_params: fc1_params }; - - function init(me, seed) { - var t, v, i, j, w, X = [], limit = 128; - if (seed === (seed | 0)) { - // Numeric seeds initialize v, which is used to generates X. - v = seed; - seed = null; - } else { - // String seeds are mixed into v and X one character at a time. - seed = seed + '\0'; - v = 0; - limit = Math.max(limit, seed.length); - } - // Initialize circular array and weyl value. - for (i = 0, j = -32; j < limit; ++j) { - // Put the unicode characters into the array, and shuffle them. - if (seed) v ^= seed.charCodeAt((j + 32) % seed.length); - // After 32 shuffles, take v as the starting w value. - if (j === 0) w = v; - v ^= v << 10; - v ^= v >>> 15; - v ^= v << 4; - v ^= v >>> 13; - if (j >= 0) { - w = (w + 0x61c88647) | 0; // Weyl. - t = (X[j & 127] ^= (v + w)); // Combine xor and weyl to init array. - i = (0 == t) ? i + 1 : 0; // Count zeroes. + } + + function getCenterPoint(pts) { + return pts.reduce(function (sum, pt) { return sum.add(pt); }, new Point(0, 0)) + .div(new Point(pts.length, pts.length)); + } + + // face alignment constants + var relX = 0.5; + var relY = 0.43; + var relScale = 0.45; + var FaceLandmarks = /** @class */ (function () { + function FaceLandmarks(relativeFaceLandmarkPositions, imageDims, shift) { + if (shift === void 0) { shift = new Point(0, 0); } + var width = imageDims.width, height = imageDims.height; + this._imageWidth = width; + this._imageHeight = height; + this._shift = shift; + this._faceLandmarks = relativeFaceLandmarkPositions.map(function (pt) { return pt.mul(new Point(width, height)).add(shift); }); + } + FaceLandmarks.prototype.getShift = function () { + return new Point(this._shift.x, this._shift.y); + }; + FaceLandmarks.prototype.getImageWidth = function () { + return this._imageWidth; + }; + FaceLandmarks.prototype.getImageHeight = function () { + return this._imageHeight; + }; + FaceLandmarks.prototype.getPositions = function () { + return this._faceLandmarks; + }; + FaceLandmarks.prototype.getRelativePositions = function () { + var _this = this; + return this._faceLandmarks.map(function (pt) { return pt.sub(_this._shift).div(new Point(_this._imageWidth, _this._imageHeight)); }); + }; + FaceLandmarks.prototype.getJawOutline = function () { + return this._faceLandmarks.slice(0, 17); + }; + FaceLandmarks.prototype.getLeftEyeBrow = function () { + return this._faceLandmarks.slice(17, 22); + }; + FaceLandmarks.prototype.getRightEyeBrow = function () { + return this._faceLandmarks.slice(22, 27); + }; + FaceLandmarks.prototype.getNose = function () { + return this._faceLandmarks.slice(27, 36); + }; + FaceLandmarks.prototype.getLeftEye = function () { + return this._faceLandmarks.slice(36, 42); + }; + FaceLandmarks.prototype.getRightEye = function () { + return this._faceLandmarks.slice(42, 48); + }; + FaceLandmarks.prototype.getMouth = function () { + return this._faceLandmarks.slice(48, 68); + }; + FaceLandmarks.prototype.forSize = function (width, height) { + return new FaceLandmarks(this.getRelativePositions(), { width: width, height: height }); + }; + FaceLandmarks.prototype.shift = function (x, y) { + return new FaceLandmarks(this.getRelativePositions(), { width: this._imageWidth, height: this._imageHeight }, new Point(x, y)); + }; + /** + * Aligns the face landmarks after face detection from the relative positions of the faces + * bounding box, or it's current shift. This function should be used to align the face images + * after face detection has been performed, before they are passed to the face recognition net. + * This will make the computed face descriptor more accurate. + * + * @param detection (optional) The bounding box of the face or the face detection result. If + * no argument was passed the position of the face landmarks are assumed to be relative to + * it's current shift. + * @returns The bounding box of the aligned face. + */ + FaceLandmarks.prototype.align = function (detection) { + if (detection) { + var box = detection instanceof FaceDetection + ? detection.getBox().floor() + : detection; + return this.shift(box.x, box.y).align(); + } + var centers = [ + this.getLeftEye(), + this.getRightEye(), + this.getMouth() + ].map(getCenterPoint); + var leftEyeCenter = centers[0], rightEyeCenter = centers[1], mouthCenter = centers[2]; + var distToMouth = function (pt) { return mouthCenter.sub(pt).magnitude(); }; + var eyeToMouthDist = (distToMouth(leftEyeCenter) + distToMouth(rightEyeCenter)) / 2; + var size = Math.floor(eyeToMouthDist / relScale); + var refPoint = getCenterPoint(centers); + // TODO: pad in case rectangle is out of image bounds + var x = Math.floor(Math.max(0, refPoint.x - (relX * size))); + var y = Math.floor(Math.max(0, refPoint.y - (relY * size))); + return new Rect(x, y, size, size); + }; + return FaceLandmarks; + }()); + + function fullyConnectedLayer(x, params) { + return tidy(function () { + return add(matMul(x, params.weights), params.bias); + }); + } + + var DEFAULT_MODEL_NAME$1 = 'face_landmark_68_model'; + function extractorsFactory$2(weightMap) { + function extractConvParams(prefix) { + var params = { + filters: weightMap[prefix + "/kernel"], + bias: weightMap[prefix + "/bias"] + }; + if (!isTensor4D(params.filters)) { + throw new Error("expected weightMap[" + prefix + "/kernel] to be a Tensor4D, instead have " + params.filters); + } + if (!isTensor1D(params.bias)) { + throw new Error("expected weightMap[" + prefix + "/bias] to be a Tensor1D, instead have " + params.bias); } - } - // We have detected all zeroes; make the key nonzero. - if (i >= 128) { - X[(seed && seed.length || 0) & 127] = -1; - } - // Run the generator 512 times to further mix the state before using it. - // Factoring this as a function slows the main generator, so it is just - // unrolled here. The weyl generator is not advanced while warming up. - i = 127; - for (j = 4 * 128; j > 0; --j) { - v = X[(i + 34) & 127]; - t = X[i = ((i + 1) & 127)]; - v ^= v << 13; - t ^= t << 17; - v ^= v >>> 15; - t ^= t >>> 12; - X[i] = v ^ t; - } - // Storing state as object members is faster than using closure variables. - me.w = w; - me.X = X; - me.i = i; + return params; } - - init(me, seed); - } - - function copy(f, t) { - t.i = f.i; - t.w = f.w; - t.X = f.X.slice(); - return t; - } - function impl(seed, opts) { - if (seed == null) seed = +(new Date); - var xg = new XorGen(seed), - state = opts && opts.state, - prng = function() { return (xg.next() >>> 0) / 0x100000000; }; - prng.double = function() { - do { - var top = xg.next() >>> 11, - bot = (xg.next() >>> 0) / 0x100000000, - result = (top + bot) / (1 << 21); - } while (result === 0); - return result; + function extractFcParams(prefix) { + var params = { + weights: weightMap[prefix + "/kernel"], + bias: weightMap[prefix + "/bias"] + }; + if (!isTensor2D(params.weights)) { + throw new Error("expected weightMap[" + prefix + "/kernel] to be a Tensor2D, instead have " + params.weights); + } + if (!isTensor1D(params.bias)) { + throw new Error("expected weightMap[" + prefix + "/bias] to be a Tensor1D, instead have " + params.bias); + } + return params; + } + return { + extractConvParams: extractConvParams, + extractFcParams: extractFcParams }; - prng.int32 = xg.next; - prng.quick = prng; - if (state) { - if (state.X) copy(state, xg); - prng.state = function() { return copy(xg, {}); }; + } + function loadQuantizedParams$1(uri) { + return __awaiter$1(this, void 0, void 0, function () { + var weightMap, _a, extractConvParams, extractFcParams; + return __generator$1(this, function (_b) { + switch (_b.label) { + case 0: return [4 /*yield*/, loadWeightMap(uri, DEFAULT_MODEL_NAME$1)]; + case 1: + weightMap = _b.sent(); + _a = extractorsFactory$2(weightMap), extractConvParams = _a.extractConvParams, extractFcParams = _a.extractFcParams; + return [2 /*return*/, { + conv0_params: extractConvParams('conv2d_0'), + conv1_params: extractConvParams('conv2d_1'), + conv2_params: extractConvParams('conv2d_2'), + conv3_params: extractConvParams('conv2d_3'), + conv4_params: extractConvParams('conv2d_4'), + conv5_params: extractConvParams('conv2d_5'), + conv6_params: extractConvParams('conv2d_6'), + conv7_params: extractConvParams('conv2d_7'), + fc0_params: extractFcParams('dense'), + fc1_params: extractFcParams('logits') + }]; + } + }); + }); + } + + function conv(x, params) { + return convLayer(x, params, 'valid', true); + } + function maxPool$1(x, strides) { + if (strides === void 0) { strides = [2, 2]; } + return maxPool(x, [2, 2], strides, 'valid'); + } + var FaceLandmarkNet = /** @class */ (function () { + function FaceLandmarkNet() { } - return prng; - } - - if (module && module.exports) { - module.exports = impl; - } else if (define && define.amd) { - define(function() { return impl; }); - } else { - this.xor4096 = impl; - } - - })( - commonjsGlobal, // window object or global - module, // present in node.js - (typeof undefined) == 'function' && undefined // present with an AMD loader - ); - }); - - var tychei = createCommonjsModule(function (module) { - // A Javascript implementaion of the "Tyche-i" prng algorithm by - // Samuel Neves and Filipe Araujo. - // See https://eden.dei.uc.pt/~sneves/pubs/2011-snfa2.pdf - - (function(global, module, define) { - - function XorGen(seed) { - var me = this, strseed = ''; - - // Set up generator function. - me.next = function() { - var b = me.b, c = me.c, d = me.d, a = me.a; - b = (b << 25) ^ (b >>> 7) ^ c; - c = (c - d) | 0; - d = (d << 24) ^ (d >>> 8) ^ a; - a = (a - b) | 0; - me.b = b = (b << 20) ^ (b >>> 12) ^ c; - me.c = c = (c - d) | 0; - me.d = (d << 16) ^ (c >>> 16) ^ a; - return me.a = (a - b) | 0; + FaceLandmarkNet.prototype.load = function (weightsOrUrl) { + return __awaiter$1(this, void 0, void 0, function () { + var _a; + return __generator$1(this, function (_b) { + switch (_b.label) { + case 0: + if (weightsOrUrl instanceof Float32Array) { + this.extractWeights(weightsOrUrl); + return [2 /*return*/]; + } + if (weightsOrUrl && typeof weightsOrUrl !== 'string') { + throw new Error('FaceLandmarkNet.load - expected model uri, or weights as Float32Array'); + } + _a = this; + return [4 /*yield*/, loadQuantizedParams$1(weightsOrUrl)]; + case 1: + _a._params = _b.sent(); + return [2 /*return*/]; + } + }); + }); }; - - /* The following is non-inverted tyche, which has better internal - * bit diffusion, but which is about 25% slower than tyche-i in JS. - me.next = function() { - var a = me.a, b = me.b, c = me.c, d = me.d; - a = (me.a + me.b | 0) >>> 0; - d = me.d ^ a; d = d << 16 ^ d >>> 16; - c = me.c + d | 0; - b = me.b ^ c; b = b << 12 ^ d >>> 20; - me.a = a = a + b | 0; - d = d ^ a; me.d = d = d << 8 ^ d >>> 24; - me.c = c = c + d | 0; - b = b ^ c; - return me.b = (b << 7 ^ b >>> 25); + FaceLandmarkNet.prototype.extractWeights = function (weights) { + this._params = extractParams$1(weights); + }; + FaceLandmarkNet.prototype.detectLandmarks = function (input) { + return __awaiter$1(this, void 0, void 0, function () { + var _this = this; + var imageDimensions, outTensor, faceLandmarksArray, _a, _b, xCoords, yCoords; + return __generator$1(this, function (_c) { + switch (_c.label) { + case 0: + if (!this._params) { + throw new Error('FaceLandmarkNet - load model before inference'); + } + outTensor = tidy(function () { + var params = _this._params; + var imgTensor = getImageTensor(input); + var _a = imgTensor.shape.slice(1), height = _a[0], width = _a[1]; + imageDimensions = { width: width, height: height }; + // work with 128 x 128 sized face images + if (imgTensor.shape[1] !== 128 || imgTensor.shape[2] !== 128) { + imgTensor = image.resizeBilinear(imgTensor, [128, 128]); + } + var out = conv(imgTensor, params.conv0_params); + out = maxPool$1(out); + out = conv(out, params.conv1_params); + out = conv(out, params.conv2_params); + out = maxPool$1(out); + out = conv(out, params.conv3_params); + out = conv(out, params.conv4_params); + out = maxPool$1(out); + out = conv(out, params.conv5_params); + out = conv(out, params.conv6_params); + out = maxPool$1(out, [1, 1]); + out = conv(out, params.conv7_params); + var fc0 = relu(fullyConnectedLayer(out.as2D(out.shape[0], -1), params.fc0_params)); + var fc1 = fullyConnectedLayer(fc0, params.fc1_params); + return fc1; + }); + _b = (_a = Array).from; + return [4 /*yield*/, outTensor.data()]; + case 1: + faceLandmarksArray = _b.apply(_a, [_c.sent()]); + outTensor.dispose(); + xCoords = faceLandmarksArray.filter(function (c, i) { return (i - 1) % 2; }); + yCoords = faceLandmarksArray.filter(function (c, i) { return i % 2; }); + return [2 /*return*/, new FaceLandmarks(Array(68).fill(0).map(function (_, i) { return new Point(xCoords[i], yCoords[i]); }), imageDimensions)]; + } + }); + }); + }; + return FaceLandmarkNet; + }()); + + function faceLandmarkNet(weights) { + var net = new FaceLandmarkNet(); + net.extractWeights(weights); + return net; + } + + function scale(x, params) { + return add(mul(x, params.weights), params.biases); + } + + function convLayer$1(x, params, strides, withRelu, padding) { + if (padding === void 0) { padding = 'same'; } + var _a = params.conv, filters = _a.filters, bias = _a.bias; + var out = conv2d(x, filters, strides, padding); + out = add(out, bias); + out = scale(out, params.scale); + return withRelu ? relu(out) : out; + } + function conv$1(x, params) { + return convLayer$1(x, params, [1, 1], true); + } + function convNoRelu(x, params) { + return convLayer$1(x, params, [1, 1], false); + } + function convDown(x, params) { + return convLayer$1(x, params, [2, 2], true, 'valid'); + } + + function extractorsFactory$3(extractWeights) { + function extractFilterValues(numFilterValues, numFilters, filterSize) { + var weights = extractWeights(numFilterValues); + var depth = weights.length / (numFilters * filterSize * filterSize); + if (isFloat(depth)) { + throw new Error("depth has to be an integer: " + depth + ", weights.length: " + weights.length + ", numFilters: " + numFilters + ", filterSize: " + filterSize); + } + return transpose(tensor4d(weights, [numFilters, depth, filterSize, filterSize]), [2, 3, 1, 0]); } - */ - - me.a = 0; - me.b = 0; - me.c = 2654435769 | 0; - me.d = 1367130551; - - if (seed === Math.floor(seed)) { - // Integer seed. - me.a = (seed / 0x100000000) | 0; - me.b = seed | 0; - } else { - // String seed. - strseed += seed; + function extractScaleLayerParams(numWeights) { + var weights = tensor1d(extractWeights(numWeights)); + var biases = tensor1d(extractWeights(numWeights)); + return { + weights: weights, + biases: biases + }; } - - // Mix in string seed, then discard an initial batch of 64 values. - for (var k = 0; k < strseed.length + 20; k++) { - me.b ^= strseed.charCodeAt(k) | 0; - me.next(); + function extractConvLayerParams(numFilterValues, numFilters, filterSize) { + var conv_filters = extractFilterValues(numFilterValues, numFilters, filterSize); + var conv_bias = tensor1d(extractWeights(numFilters)); + var scale = extractScaleLayerParams(numFilters); + return { + conv: { + filters: conv_filters, + bias: conv_bias + }, + scale: scale + }; } - } - - function copy(f, t) { - t.a = f.a; - t.b = f.b; - t.c = f.c; - t.d = f.d; - return t; - } - function impl(seed, opts) { - var xg = new XorGen(seed), - state = opts && opts.state, - prng = function() { return (xg.next() >>> 0) / 0x100000000; }; - prng.double = function() { - do { - var top = xg.next() >>> 11, - bot = (xg.next() >>> 0) / 0x100000000, - result = (top + bot) / (1 << 21); - } while (result === 0); - return result; + function extractResidualLayerParams(numFilterValues, numFilters, filterSize, isDown) { + if (isDown === void 0) { isDown = false; } + var conv1 = extractConvLayerParams((isDown ? 0.5 : 1) * numFilterValues, numFilters, filterSize); + var conv2 = extractConvLayerParams(numFilterValues, numFilters, filterSize); + return { + conv1: conv1, + conv2: conv2 + }; + } + return { + extractConvLayerParams: extractConvLayerParams, + extractResidualLayerParams: extractResidualLayerParams }; - prng.int32 = xg.next; - prng.quick = prng; - if (state) { - if (typeof(state) == 'object') copy(state, xg); - prng.state = function() { return copy(xg, {}); }; + } + function extractParams$2(weights) { + var _a = extractWeightsFactory(weights), extractWeights = _a.extractWeights, getRemainingWeights = _a.getRemainingWeights; + var _b = extractorsFactory$3(extractWeights), extractConvLayerParams = _b.extractConvLayerParams, extractResidualLayerParams = _b.extractResidualLayerParams; + var conv32_down = extractConvLayerParams(4704, 32, 7); + var conv32_1 = extractResidualLayerParams(9216, 32, 3); + var conv32_2 = extractResidualLayerParams(9216, 32, 3); + var conv32_3 = extractResidualLayerParams(9216, 32, 3); + var conv64_down = extractResidualLayerParams(36864, 64, 3, true); + var conv64_1 = extractResidualLayerParams(36864, 64, 3); + var conv64_2 = extractResidualLayerParams(36864, 64, 3); + var conv64_3 = extractResidualLayerParams(36864, 64, 3); + var conv128_down = extractResidualLayerParams(147456, 128, 3, true); + var conv128_1 = extractResidualLayerParams(147456, 128, 3); + var conv128_2 = extractResidualLayerParams(147456, 128, 3); + var conv256_down = extractResidualLayerParams(589824, 256, 3, true); + var conv256_1 = extractResidualLayerParams(589824, 256, 3); + var conv256_2 = extractResidualLayerParams(589824, 256, 3); + var conv256_down_out = extractResidualLayerParams(589824, 256, 3); + var fc = transpose(tensor2d(extractWeights(256 * 128), [128, 256]), [1, 0]); + if (getRemainingWeights().length !== 0) { + throw new Error("weights remaing after extract: " + getRemainingWeights().length); } - return prng; - } - - if (module && module.exports) { - module.exports = impl; - } else if (define && define.amd) { - define(function() { return impl; }); - } else { - this.tychei = impl; - } - - })( - commonjsGlobal, - module, // present in node.js - (typeof undefined) == 'function' && undefined // present with an AMD loader - ); - }); - - var seedrandom = createCommonjsModule(function (module) { - /* - Copyright 2014 David Bau. - - Permission is hereby granted, free of charge, to any person obtaining - a copy of this software and associated documentation files (the - "Software"), to deal in the Software without restriction, including - without limitation the rights to use, copy, modify, merge, publish, - distribute, sublicense, and/or sell copies of the Software, and to - permit persons to whom the Software is furnished to do so, subject to - the following conditions: - - The above copyright notice and this permission notice shall be - included in all copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. - IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY - CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, - TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE - SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - - */ - - (function (pool, math) { - // - // The following constants are related to IEEE 754 limits. - // - var global = this, - width = 256, // each RC4 output is 0 <= x < 256 - chunks = 6, // at least six RC4 outputs for each double - digits = 52, // there are 52 significant digits in a double - rngname = 'random', // rngname: name for Math.random and Math.seedrandom - startdenom = math.pow(width, chunks), - significance = math.pow(2, digits), - overflow = significance * 2, - mask = width - 1, - nodecrypto; // node.js crypto module, initialized at the bottom. - - // - // seedrandom() - // This is the seedrandom function described above. - // - function seedrandom(seed, options, callback) { - var key = []; - options = (options == true) ? { entropy: true } : (options || {}); - - // Flatten the seed string or build one from local entropy if needed. - var shortseed = mixkey(flatten( - options.entropy ? [seed, tostring(pool)] : - (seed == null) ? autoseed() : seed, 3), key); - - // Use the seed to initialize an ARC4 generator. - var arc4 = new ARC4(key); - - // This function returns a random double in [0, 1) that contains - // randomness in every bit of the mantissa of the IEEE 754 value. - var prng = function() { - var n = arc4.g(chunks), // Start with a numerator n < 2 ^ 48 - d = startdenom, // and denominator d = 2 ^ 48. - x = 0; // and no 'extra last byte'. - while (n < significance) { // Fill up all significant digits by - n = (n + x) * width; // shifting numerator and - d *= width; // denominator and generating a - x = arc4.g(1); // new least-significant-byte. - } - while (n >= overflow) { // To avoid rounding up, before adding - n /= 2; // last byte, shift everything - d /= 2; // right using integer math until - x >>>= 1; // we have exactly the desired bits. - } - return (n + x) / d; // Form the number within [0, 1). + return { + conv32_down: conv32_down, + conv32_1: conv32_1, + conv32_2: conv32_2, + conv32_3: conv32_3, + conv64_down: conv64_down, + conv64_1: conv64_1, + conv64_2: conv64_2, + conv64_3: conv64_3, + conv128_down: conv128_down, + conv128_1: conv128_1, + conv128_2: conv128_2, + conv256_down: conv256_down, + conv256_1: conv256_1, + conv256_2: conv256_2, + conv256_down_out: conv256_down_out, + fc: fc }; - - prng.int32 = function() { return arc4.g(4) | 0; }; - prng.quick = function() { return arc4.g(4) / 0x100000000; }; - prng.double = prng; - - // Mix the randomness into accumulated entropy. - mixkey(tostring(arc4.S), pool); - - // Calling convention: what to return as a function of prng, seed, is_math. - return (options.pass || callback || - function(prng, seed, is_math_call, state) { - if (state) { - // Load the arc4 state from the given state if it has an S array. - if (state.S) { copy(state, arc4); } - // Only provide the .state method if requested via options.state. - prng.state = function() { return copy(arc4, {}); }; - } - - // If called as a method of Math (Math.seedrandom()), mutate - // Math.random because that is how seedrandom.js has worked since v1.0. - if (is_math_call) { math[rngname] = prng; return seed; } - - // Otherwise, it is a newer calling convention, so return the - // prng directly. - else return prng; - })( - prng, - shortseed, - 'global' in options ? options.global : (this == math), - options.state); - } - math['seed' + rngname] = seedrandom; - - // - // ARC4 - // - // An ARC4 implementation. The constructor takes a key in the form of - // an array of at most (width) integers that should be 0 <= x < (width). - // - // The g(count) method returns a pseudorandom integer that concatenates - // the next (count) outputs from ARC4. Its return value is a number x - // that is in the range 0 <= x < (width ^ count). - // - function ARC4(key) { - var t, keylen = key.length, - me = this, i = 0, j = me.i = me.j = 0, s = me.S = []; - - // The empty key [] is treated as [0]. - if (!keylen) { key = [keylen++]; } - - // Set up S using the standard key scheduling algorithm. - while (i < width) { - s[i] = i++; + } + + var DEFAULT_MODEL_NAME$2 = 'face_recognition_model'; + function extractorsFactory$4(weightMap) { + function extractScaleLayerParams(prefix) { + var params = { + weights: weightMap[prefix + "/scale/weights"], + biases: weightMap[prefix + "/scale/biases"] + }; + if (!isTensor1D(params.weights)) { + throw new Error("expected weightMap[" + prefix + "/scale/weights] to be a Tensor1D, instead have " + params.weights); + } + if (!isTensor1D(params.biases)) { + throw new Error("expected weightMap[" + prefix + "/scale/biases] to be a Tensor1D, instead have " + params.biases); + } + return params; } - for (i = 0; i < width; i++) { - s[i] = s[j = mask & (j + key[i % keylen] + (t = s[i]))]; - s[j] = t; + function extractConvLayerParams(prefix) { + var params = { + filters: weightMap[prefix + "/conv/filters"], + bias: weightMap[prefix + "/conv/bias"] + }; + if (!isTensor4D(params.filters)) { + throw new Error("expected weightMap[" + prefix + "/conv/filters] to be a Tensor1D, instead have " + params.filters); + } + if (!isTensor1D(params.bias)) { + throw new Error("expected weightMap[" + prefix + "/conv/bias] to be a Tensor1D, instead have " + params.bias); + } + return { + conv: params, + scale: extractScaleLayerParams(prefix) + }; } - - // The "g" method returns the next (count) outputs as one number. - (me.g = function(count) { - // Using instance members instead of closure state nearly doubles speed. - var t, r = 0, - i = me.i, j = me.j, s = me.S; - while (count--) { - t = s[i = mask & (i + 1)]; - r = r * width + s[mask & ((s[i] = s[j = mask & (j + t)]) + (s[j] = t))]; - } - me.i = i; me.j = j; - return r; - // For robust unpredictability, the function call below automatically - // discards an initial batch of values. This is called RC4-drop[256]. - // See http://google.com/search?q=rsa+fluhrer+response&btnI - })(width); - } - - // - // copy() - // Copies internal state of ARC4 to or from a plain object. - // - function copy(f, t) { - t.i = f.i; - t.j = f.j; - t.S = f.S.slice(); - return t; - } - // - // flatten() - // Converts an object tree to nested arrays of strings. - // - function flatten(obj, depth) { - var result = [], typ = (typeof obj), prop; - if (depth && typ == 'object') { - for (prop in obj) { - try { result.push(flatten(obj[prop], depth - 1)); } catch (e) {} - } + function extractResidualLayerParams(prefix) { + return { + conv1: extractConvLayerParams(prefix + "/conv1"), + conv2: extractConvLayerParams(prefix + "/conv2") + }; } - return (result.length ? result : typ == 'string' ? obj : obj + '\0'); - } - - // - // mixkey() - // Mixes a string seed into a key that is an array of integers, and - // returns a shortened string seed that is equivalent to the result key. - // - function mixkey(seed, key) { - var stringseed = seed + '', smear, j = 0; - while (j < stringseed.length) { - key[mask & j] = - mask & ((smear ^= key[mask & j] * 19) + stringseed.charCodeAt(j++)); + return { + extractConvLayerParams: extractConvLayerParams, + extractResidualLayerParams: extractResidualLayerParams + }; + } + function loadQuantizedParams$2(uri) { + return __awaiter$1(this, void 0, void 0, function () { + var weightMap, _a, extractConvLayerParams, extractResidualLayerParams, conv32_down, conv32_1, conv32_2, conv32_3, conv64_down, conv64_1, conv64_2, conv64_3, conv128_down, conv128_1, conv128_2, conv256_down, conv256_1, conv256_2, conv256_down_out, fc; + return __generator$1(this, function (_b) { + switch (_b.label) { + case 0: return [4 /*yield*/, loadWeightMap(uri, DEFAULT_MODEL_NAME$2)]; + case 1: + weightMap = _b.sent(); + _a = extractorsFactory$4(weightMap), extractConvLayerParams = _a.extractConvLayerParams, extractResidualLayerParams = _a.extractResidualLayerParams; + conv32_down = extractConvLayerParams('conv32_down'); + conv32_1 = extractResidualLayerParams('conv32_1'); + conv32_2 = extractResidualLayerParams('conv32_2'); + conv32_3 = extractResidualLayerParams('conv32_3'); + conv64_down = extractResidualLayerParams('conv64_down'); + conv64_1 = extractResidualLayerParams('conv64_1'); + conv64_2 = extractResidualLayerParams('conv64_2'); + conv64_3 = extractResidualLayerParams('conv64_3'); + conv128_down = extractResidualLayerParams('conv128_down'); + conv128_1 = extractResidualLayerParams('conv128_1'); + conv128_2 = extractResidualLayerParams('conv128_2'); + conv256_down = extractResidualLayerParams('conv256_down'); + conv256_1 = extractResidualLayerParams('conv256_1'); + conv256_2 = extractResidualLayerParams('conv256_2'); + conv256_down_out = extractResidualLayerParams('conv256_down_out'); + fc = weightMap['fc']; + if (!isTensor2D(fc)) { + throw new Error("expected weightMap[fc] to be a Tensor2D, instead have " + fc); + } + return [2 /*return*/, { + conv32_down: conv32_down, + conv32_1: conv32_1, + conv32_2: conv32_2, + conv32_3: conv32_3, + conv64_down: conv64_down, + conv64_1: conv64_1, + conv64_2: conv64_2, + conv64_3: conv64_3, + conv128_down: conv128_down, + conv128_1: conv128_1, + conv128_2: conv128_2, + conv256_down: conv256_down, + conv256_1: conv256_1, + conv256_2: conv256_2, + conv256_down_out: conv256_down_out, + fc: fc + }]; + } + }); + }); + } + + function normalize(x) { + return tidy(function () { + var avg_r = fill([1, 150, 150, 1], 122.782); + var avg_g = fill([1, 150, 150, 1], 117.001); + var avg_b = fill([1, 150, 150, 1], 104.298); + var avg_rgb = concat([avg_r, avg_g, avg_b], 3); + return div(sub(x, avg_rgb), scalar(256)); + }); + } + + function residual(x, params) { + var out = conv$1(x, params.conv1); + out = convNoRelu(out, params.conv2); + out = add(out, x); + out = relu(out); + return out; + } + function residualDown(x, params) { + var out = convDown(x, params.conv1); + out = convNoRelu(out, params.conv2); + var pooled = avgPool(x, 2, 2, 'valid'); + var zeros$$1 = zeros(pooled.shape); + var isPad = pooled.shape[3] !== out.shape[3]; + var isAdjustShape = pooled.shape[1] !== out.shape[1] || pooled.shape[2] !== out.shape[2]; + if (isAdjustShape) { + var padShapeX = out.shape.slice(); + padShapeX[1] = 1; + var zerosW = zeros(padShapeX); + out = concat([out, zerosW], 1); + var padShapeY = out.shape.slice(); + padShapeY[2] = 1; + var zerosH = zeros(padShapeY); + out = concat([out, zerosH], 2); } - return tostring(key); - } - - // - // autoseed() - // Returns an object for autoseeding, using window.crypto and Node crypto - // module if available. - // - function autoseed() { - try { - var out; - if (nodecrypto && (out = nodecrypto.randomBytes)) { - // The use of 'out' to remember randomBytes makes tight minified code. - out = out(width); - } else { - out = new Uint8Array(width); - (global.crypto || global.msCrypto).getRandomValues(out); - } - return tostring(out); - } catch (e) { - var browser = global.navigator, - plugins = browser && browser.plugins; - return [+new Date, global, plugins, global.screen, tostring(pool)]; + pooled = isPad ? concat([pooled, zeros$$1], 3) : pooled; + out = add(pooled, out); + out = relu(out); + return out; + } + + var FaceRecognitionNet = /** @class */ (function () { + function FaceRecognitionNet() { } - } - - // - // tostring() - // Converts an array of charcodes to a string - // - function tostring(a) { - return String.fromCharCode.apply(0, a); - } - - // - // When seedrandom.js is loaded, we immediately mix a few bits - // from the built-in RNG into the entropy pool. Because we do - // not want to interfere with deterministic PRNG state later, - // seedrandom will not call math.random on its own again after - // initialization. - // - mixkey(math.random(), pool); - - // - // Nodejs and AMD support: export the implementation as a module using - // either convention. - // - if (module.exports) { - module.exports = seedrandom; - // When in node.js, try using crypto package for autoseeding. - try { - nodecrypto = crypto; - } catch (ex) {} - } else if ((typeof undefined) == 'function' && undefined.amd) { - undefined(function() { return seedrandom; }); - } - - // End anonymous scope, and pass initial values. - })( - [], // pool: entropy pool starts empty - Math // math: package containing random, pow, and seedrandom - ); - }); - - // A library of seedable RNGs implemented in Javascript. - // - // Usage: - // - // var seedrandom = require('seedrandom'); - // var random = seedrandom(1); // or any seed. - // var x = random(); // 0 <= x < 1. Every bit is random. - // var x = random.quick(); // 0 <= x < 1. 32 bits of randomness. - - // alea, a 53-bit multiply-with-carry generator by Johannes Baagøe. - // Period: ~2^116 - // Reported to pass all BigCrush tests. - - - // xor128, a pure xor-shift generator by George Marsaglia. - // Period: 2^128-1. - // Reported to fail: MatrixRank and LinearComp. - - - // xorwow, George Marsaglia's 160-bit xor-shift combined plus weyl. - // Period: 2^192-2^32 - // Reported to fail: CollisionOver, SimpPoker, and LinearComp. - - - // xorshift7, by François Panneton and Pierre L'ecuyer, takes - // a different approach: it adds robustness by allowing more shifts - // than Marsaglia's original three. It is a 7-shift generator - // with 256 bits, that passes BigCrush with no systmatic failures. - // Period 2^256-1. - // No systematic BigCrush failures reported. - - - // xor4096, by Richard Brent, is a 4096-bit xor-shift with a - // very long period that also adds a Weyl generator. It also passes - // BigCrush with no systematic failures. Its long period may - // be useful if you have many generators and need to avoid - // collisions. - // Period: 2^4128-2^32. - // No systematic BigCrush failures reported. - - - // Tyche-i, by Samuel Neves and Filipe Araujo, is a bit-shifting random - // number generator derived from ChaCha, a modern stream cipher. - // https://eden.dei.uc.pt/~sneves/pubs/2011-snfa2.pdf - // Period: ~2^127 - // No systematic BigCrush failures reported. - - - // The original ARC4-based prng included in this library. - // Period: ~2^1600 - - - seedrandom.alea = alea; - seedrandom.xor128 = xor128; - seedrandom.xorwow = xorwow; - seedrandom.xorshift7 = xorshift7; - seedrandom.xor4096 = xor4096; - seedrandom.tychei = tychei; - - var C__Users_user_dev_faceApi_js_node_modules_seedrandom = seedrandom; - - var seedrandom$1 = /*#__PURE__*/Object.freeze({ - default: C__Users_user_dev_faceApi_js_node_modules_seedrandom, - __moduleExports: C__Users_user_dev_faceApi_js_node_modules_seedrandom - }); - - var MPRandGauss = (function () { - function MPRandGauss(mean, stdDeviation, dtype, truncated, seed) { - this.mean = mean; - this.stdDev = stdDeviation; - this.dtype = dtype; - this.nextVal = NaN; - this.truncated = truncated; - if (this.truncated) { - this.upper = this.mean + this.stdDev * 2; - this.lower = this.mean - this.stdDev * 2; - } - var seedValue = seed ? seed : Math.random(); - this.random = undefined(seedValue.toString()); - } - MPRandGauss.prototype.nextValue = function () { - if (!isNaN(this.nextVal)) { - var value = this.nextVal; - this.nextVal = NaN; - return value; - } - var resultX, resultY; - var isValid = false; - while (!isValid) { - var v1 = void 0, v2 = void 0, s = void 0; - do { - v1 = 2 * this.random() - 1; - v2 = 2 * this.random() - 1; - s = v1 * v1 + v2 * v2; - } while (s >= 1 || s === 0); - var mul = Math.sqrt(-2.0 * Math.log(s) / s); - resultX = this.mean + this.stdDev * v1 * mul; - resultY = this.mean + this.stdDev * v2 * mul; - if (!this.truncated || this.isValidTruncated(resultX)) { - isValid = true; - } - } - if (!this.truncated || this.isValidTruncated(resultY)) { - this.nextVal = this.convertValue(resultY); - } - return this.convertValue(resultX); - }; - MPRandGauss.prototype.convertValue = function (value) { - if (this.dtype == null || this.dtype === 'float32') { - return value; - } - return Math.round(value); - }; - MPRandGauss.prototype.isValidTruncated = function (value) { - return value <= this.upper && value >= this.lower; - }; - return MPRandGauss; - }()); - - var __decorate$1 = (undefined && undefined.__decorate) || function (decorators, target, key, desc) { - var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; - if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); - else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; - return c > 3 && r && Object.defineProperty(target, key, r), r; - }; - var ReductionOps = (function () { - function ReductionOps() { - } - ReductionOps.logSumExp = function (x, axis, keepDims) { - if (axis === void 0) { axis = null; } - if (keepDims === void 0) { keepDims = false; } - assertArgumentsAreTensors({ x: x }, 'logSumExp'); - var axes = parseAxisParam(axis, x.shape); - var xMax = x.max(axes, true); - var a = x.sub(xMax); - var b = a.exp(); - var c = b.sum(axes); - var d = c.log(); - var res = xMax.reshape(d.shape).add(d); - if (keepDims) { - var newShape = expandShapeToKeepDim(res.shape, axes); - return res.reshape(newShape); - } - return res; - }; - ReductionOps.sum = function (x, axis, keepDims) { - if (axis === void 0) { axis = null; } - if (keepDims === void 0) { keepDims = false; } - assertArgumentsAreTensors({ x: x }, 'sum'); - if (x.dtype === 'bool') { - x = x.toInt(); - } - var axes = parseAxisParam(axis, x.shape); - var customOp = customGrad(function (x) { - var permutation = getAxesPermutation(axes, x.rank); - var reductionAxes = axes; - var permutedX = x; - if (permutation != null) { - permutedX = x.transpose(permutation); - reductionAxes = - getInnerMostAxes(reductionAxes.length, x.rank); - } - var value = ENV.engine.runKernel(function (backend) { return backend.sum(permutedX, reductionAxes); }, { permutedX: permutedX }); - if (keepDims) { - var newShape = expandShapeToKeepDim(value.shape, axes); - value = value.reshape(newShape); - } - var gradFunc = function (dy) { - var expandedDyShape = x.shape.slice(); - axes.forEach(function (axis) { - expandedDyShape[axis] = 1; - }); - var expandedDy = dy.reshape(expandedDyShape); - var derX = expandedDy.mul(ones(x.shape, 'float32')); - return derX; - }; - return { value: value, gradFunc: gradFunc }; - }); - return customOp(x); - }; - ReductionOps.mean = function (x, axis, keepDims) { - if (axis === void 0) { axis = null; } - if (keepDims === void 0) { keepDims = false; } - assertArgumentsAreTensors({ x: x }, 'mean'); - var axes = parseAxisParam(axis, x.shape); - var shapes = computeOutAndReduceShapes(x.shape, axes); - var reduceShape = shapes[1]; - var reduceSize = sizeFromShape(reduceShape); - var customOp = customGrad(function (x) { - var reduceSizeScalar = scalar(reduceSize); - var xReduce = reduceSizeScalar.dtype === x.dtype ? - x : - x.cast(reduceSizeScalar.dtype); - var res = xReduce.div(reduceSizeScalar); - var value = res.sum(axis, keepDims); - var gradFunc = function (dy) { - var expandedDyShape = x.shape.slice(); - axes.forEach(function (axis) { - expandedDyShape[axis] = 1; - }); - var expandedDy = dy.reshape(expandedDyShape); - var derX = expandedDy.mul(ones(x.shape, 'float32')).div(reduceSizeScalar); - return derX; - }; - return { value: value, gradFunc: gradFunc }; - }); - return customOp(x); - }; - ReductionOps.min = function (x, axis, keepDims) { - if (axis === void 0) { axis = null; } - if (keepDims === void 0) { keepDims = false; } - assertArgumentsAreTensors({ x: x }, 'min'); - var origAxes = parseAxisParam(axis, x.shape); - var axes = origAxes; - var permutedAxes = getAxesPermutation(axes, x.rank); - if (permutedAxes != null) { - x = x.transpose(permutedAxes); - axes = getInnerMostAxes(axes.length, x.rank); - } - var res = ENV.engine.runKernel(function (backend) { return backend.min(x, axes); }, { x: x }); - if (keepDims) { - var newShape = expandShapeToKeepDim(res.shape, origAxes); - return res.reshape(newShape); - } - return res; - }; - ReductionOps.max = function (x, axis, keepDims) { - if (axis === void 0) { axis = null; } - if (keepDims === void 0) { keepDims = false; } - assertArgumentsAreTensors({ x: x }, 'max'); - var origAxes = parseAxisParam(axis, x.shape); - var axes = origAxes; - var permutedAxes = getAxesPermutation(axes, x.rank); - if (permutedAxes != null) { - x = x.transpose(permutedAxes); - axes = getInnerMostAxes(axes.length, x.rank); - } - var res = ENV.engine.runKernel(function (backend) { return backend.max(x, axes); }, { x: x }); - if (keepDims) { - var newShape = expandShapeToKeepDim(res.shape, origAxes); - return res.reshape(newShape); - } - return res; - }; - ReductionOps.argMin = function (x, axis) { - if (axis === void 0) { axis = 0; } - assertArgumentsAreTensors({ x: x }, 'argMin'); - if (axis == null) { - axis = 0; - } - var axes = parseAxisParam(axis, x.shape); - var permutedAxes = getAxesPermutation(axes, x.rank); - if (permutedAxes != null) { - x = x.transpose(permutedAxes); - axes = getInnerMostAxes(axes.length, x.rank); - } - return ENV.engine.runKernel(function (backend) { return backend.argMin(x, axes[0]); }, { x: x }); - }; - ReductionOps.argMax = function (x, axis) { - if (axis === void 0) { axis = 0; } - assertArgumentsAreTensors({ x: x }, 'argMax'); - if (axis == null) { - axis = 0; - } - var axes = parseAxisParam(axis, x.shape); - var permutedAxes = getAxesPermutation(axes, x.rank); - if (permutedAxes != null) { - x = x.transpose(permutedAxes); - axes = getInnerMostAxes(axes.length, x.rank); - } - return ENV.engine.runKernel(function (backend) { return backend.argMax(x, axes[0]); }, { x: x }); - }; - ReductionOps.moments = function (x, axis, keepDims) { - if (axis === void 0) { axis = null; } - if (keepDims === void 0) { keepDims = false; } - assertArgumentsAreTensors({ x: x }, 'moments'); - var axes = parseAxisParam(axis, x.shape); - var mean$$1 = x.mean(axes, keepDims); - var keepDimsShape = mean$$1.shape; - if (!keepDims) { - keepDimsShape = expandShapeToKeepDim(mean$$1.shape, axes); - } - var devSquared = x.toFloat().sub(mean$$1.reshape(keepDimsShape)).square(); - var variance = devSquared.mean(axes, keepDims); - return { mean: mean$$1, variance: variance }; - }; - ReductionOps.unsortedSegmentSum = function (x, segmentIds, numSegments, axis) { - if (axis === void 0) { axis = 0; } - assertArgumentsAreTensors({ x: x, segmentIds: segmentIds }, 'unsortedSegmentSum'); - assert(segmentIds.dtype === 'int32', 'Segment Ids must be of dtype `int32`'); - axis = parseAxisParam(axis, x.shape)[0]; - var res = []; - var dim = segmentIds.shape[0]; - var newShape = []; - for (var i = 0; i < x.shape.length; i++) { - if (i === axis) { - newShape.push(dim); - } - else { - newShape.push(1); - } - } - var reshapedSegmentIds = reshape(segmentIds, newShape); - for (var i = 0; i < numSegments; i++) { - var segmentId = scalar(i, 'int32'); - var mask = equal(segmentId, reshapedSegmentIds).asType('float32'); - var sum$$1 = mask.mul(x).sum(axis); - res.push(sum$$1); - } - return stack(res, axis); - }; - __decorate$1([ - doc({ heading: 'Operations', subheading: 'Reduction' }), - operation - ], ReductionOps, "logSumExp", null); - __decorate$1([ - doc({ heading: 'Operations', subheading: 'Reduction' }), - operation - ], ReductionOps, "sum", null); - __decorate$1([ - doc({ heading: 'Operations', subheading: 'Reduction' }), - operation - ], ReductionOps, "mean", null); - __decorate$1([ - doc({ heading: 'Operations', subheading: 'Reduction' }), - operation - ], ReductionOps, "min", null); - __decorate$1([ - doc({ heading: 'Operations', subheading: 'Reduction' }), - operation - ], ReductionOps, "max", null); - __decorate$1([ - doc({ heading: 'Operations', subheading: 'Reduction' }), - operation - ], ReductionOps, "argMin", null); - __decorate$1([ - doc({ heading: 'Operations', subheading: 'Reduction' }), - operation - ], ReductionOps, "argMax", null); - __decorate$1([ - doc({ heading: 'Operations', subheading: 'Normalization' }), - operation - ], ReductionOps, "moments", null); - __decorate$1([ - doc({ heading: 'Operations', subheading: 'Reduction' }), - operation - ], ReductionOps, "unsortedSegmentSum", null); - return ReductionOps; - }()); - - var __decorate$2 = (undefined && undefined.__decorate) || function (decorators, target, key, desc) { - var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; - if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); - else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; - return c > 3 && r && Object.defineProperty(target, key, r), r; - }; - var __awaiter = (undefined && undefined.__awaiter) || function (thisArg, _arguments, P, generator) { - return new (P || (P = Promise))(function (resolve, reject) { - function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } - function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } - function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); } - step((generator = generator.apply(thisArg, _arguments || [])).next()); - }); - }; - var __generator = (undefined && undefined.__generator) || function (thisArg, body) { - var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g; - return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g; - function verb(n) { return function (v) { return step([n, v]); }; } - function step(op) { - if (f) throw new TypeError("Generator is already executing."); - while (_) try { - if (f = 1, y && (t = y[op[0] & 2 ? "return" : op[0] ? "throw" : "next"]) && !(t = t.call(y, op[1])).done) return t; - if (y = 0, t) op = [0, t.value]; - switch (op[0]) { - case 0: case 1: t = op; break; - case 4: _.label++; return { value: op[1], done: false }; - case 5: _.label++; y = op[1]; op = [0]; continue; - case 7: op = _.ops.pop(); _.trys.pop(); continue; - default: - if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; } - if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; } - if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; } - if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; } - if (t[2]) _.ops.pop(); - _.trys.pop(); continue; - } - op = body.call(thisArg, _); - } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; } - if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true }; - } - }; - var ArrayOps = (function () { - function ArrayOps() { - } - ArrayOps.tensor = function (values, shape, dtype) { - if (dtype === void 0) { dtype = 'float32'; } - var inferredShape = inferShape(values); - if (shape != null && inferredShape.length !== 1) { - assertShapesMatch(shape, inferredShape, "Error creating a new Tensor. " + - ("Inferred shape (" + inferredShape + ") does not match the ") + - ("provided shape (" + shape + "). ")); - } - if (!isTypedArray(values) && !Array.isArray(values)) { - values = [values]; - } - shape = shape || inferredShape; - return Tensor.make(shape, { values: toTypedArray(values, dtype) }, dtype); - }; - ArrayOps.scalar = function (value, dtype) { - if (dtype === void 0) { dtype = 'float32'; } - if (isTypedArray(value) || Array.isArray(value)) { - throw new Error('Error creating a new Scalar: value must be a primitive ' + - '(number|boolean)'); - } - return ArrayOps.tensor(value, [], dtype); - }; - ArrayOps.tensor1d = function (values, dtype) { - if (dtype === void 0) { dtype = 'float32'; } - var inferredShape = inferShape(values); - if (inferredShape.length !== 1) { - throw new Error('tensor1d() requires values to be a flat/TypedArray'); - } - return ArrayOps.tensor(values, inferredShape, dtype); - }; - ArrayOps.tensor2d = function (values, shape, dtype) { - if (dtype === void 0) { dtype = 'float32'; } - if (shape != null && shape.length !== 2) { - throw new Error('tensor2d() requires shape to have two numbers'); - } - var inferredShape = inferShape(values); - if (inferredShape.length !== 2 && inferredShape.length !== 1) { - throw new Error('tensor2d() requires values to be number[][] or flat/TypedArray'); - } - if (inferredShape.length === 1 && shape == null) { - throw new Error('tensor2d() requires shape to be provided when `values` ' + - 'are a flat/TypedArray'); - } - shape = shape || inferredShape; - return ArrayOps.tensor(values, shape, dtype); - }; - ArrayOps.tensor3d = function (values, shape, dtype) { - if (dtype === void 0) { dtype = 'float32'; } - if (shape != null && shape.length !== 3) { - throw new Error('tensor3d() requires shape to have three numbers'); - } - var inferredShape = inferShape(values); - if (inferredShape.length !== 3 && inferredShape.length !== 1) { - throw new Error('tensor3d() requires values to be number[][][] or flat/TypedArray'); - } - if (inferredShape.length === 1 && shape == null) { - throw new Error('tensor3d() requires shape to be provided when `values` ' + - 'are a flat array'); - } - shape = shape || inferredShape; - return ArrayOps.tensor(values, shape, dtype); - }; - ArrayOps.tensor4d = function (values, shape, dtype) { - if (dtype === void 0) { dtype = 'float32'; } - if (shape != null && shape.length !== 4) { - throw new Error('tensor4d() requires shape to have four numbers'); - } - var inferredShape = inferShape(values); - if (inferredShape.length !== 4 && inferredShape.length !== 1) { - throw new Error('tensor4d() requires values to be number[][][][] or flat/TypedArray'); - } - if (inferredShape.length === 1 && shape == null) { - throw new Error('tensor4d() requires shape to be provided when `values` ' + - 'are a flat array'); - } - shape = shape || inferredShape; - return ArrayOps.tensor(values, shape, dtype); - }; - ArrayOps.ones = function (shape, dtype) { - if (dtype === void 0) { dtype = 'float32'; } - var values = makeOnesTypedArray(sizeFromShape(shape), dtype); - return Tensor.make(shape, { values: values }, dtype); - }; - ArrayOps.zeros = function (shape, dtype) { - if (dtype === void 0) { dtype = 'float32'; } - var values = makeZerosTypedArray(sizeFromShape(shape), dtype); - return Tensor.make(shape, { values: values }, dtype); - }; - ArrayOps.fill = function (shape, value, dtype) { - if (dtype === void 0) { dtype = 'float32'; } - var values = getTypedArrayFromDType(dtype, sizeFromShape(shape)); - values.fill(value); - return Tensor.make(shape, { values: values }, dtype); - }; - ArrayOps.onesLike = function (x) { - assertArgumentsAreTensors({ x: x }, 'onesLike'); - return ArrayOps.ones(x.shape, x.dtype); - }; - ArrayOps.zerosLike = function (x) { - assertArgumentsAreTensors({ x: x }, 'zerosLike'); - return ArrayOps.zeros(x.shape, x.dtype); - }; - ArrayOps.clone = function (x) { - assertArgumentsAreTensors({ x: x }, 'clone'); - var der = function (dy) { - return { x: function () { return dy.toFloat(); } }; - }; - return ENV.engine.runKernel(function (backend) { - return Tensor.make(x.shape, { dataId: x.dataId }, x.dtype); - }, { x: x }, der); - }; - ArrayOps.eye = function (numRows, numColumns, batchShape, dtype) { - if (dtype === void 0) { dtype = 'float32'; } - if (numColumns == null) { - numColumns = numRows; - } - var buffer = ArrayOps.buffer([numRows, numColumns], dtype); - var n = numRows <= numColumns ? numRows : numColumns; - for (var i = 0; i < n; ++i) { - buffer.set(1, i, i); - } - var out = buffer.toTensor().as2D(numRows, numColumns); - if (batchShape == null) { - return out; - } - else { - if (batchShape.length === 1) { - return ArrayOps.tile(ArrayOps.expandDims(out, 0), [batchShape[0], 1, 1]); - } - else if (batchShape.length === 2) { - return ArrayOps.tile(ArrayOps.expandDims(ArrayOps.expandDims(out, 0), 0), [batchShape[0], batchShape[1], 1, 1]); - } - else { - throw new Error("eye() currently supports only 1D and 2D " + - ("batchShapes, but received " + batchShape.length + "D.")); - } - } - }; - ArrayOps.randomNormal = function (shape, mean, stdDev, dtype, seed) { - if (mean === void 0) { mean = 0; } - if (stdDev === void 0) { stdDev = 1; } - if (dtype != null && dtype === 'bool') { - throw new Error("Unsupported data type " + dtype); - } - var randGauss = new MPRandGauss(mean, stdDev, dtype, false, seed); - var res = ArrayOps.buffer(shape, dtype); - for (var i = 0; i < res.values.length; i++) { - res.values[i] = randGauss.nextValue(); - } - return res.toTensor(); - }; - ArrayOps.truncatedNormal = function (shape, mean, stdDev, dtype, seed) { - if (mean === void 0) { mean = 0; } - if (stdDev === void 0) { stdDev = 1; } - if (dtype != null && dtype === 'bool') { - throw new Error("Unsupported data type " + dtype); - } - var randGauss = new MPRandGauss(mean, stdDev, dtype, true, seed); - var res = ArrayOps.buffer(shape, dtype); - for (var i = 0; i < res.values.length; i++) { - res.values[i] = randGauss.nextValue(); - } - return res.toTensor(); - }; - ArrayOps.randomUniform = function (shape, minval, maxval, dtype) { - if (minval === void 0) { minval = 0; } - if (maxval === void 0) { maxval = 1; } - if (dtype === void 0) { dtype = 'float32'; } - var res = ArrayOps.buffer(shape, dtype); - for (var i = 0; i < res.values.length; i++) { - res.values[i] = randUniform(minval, maxval); - } - return res.toTensor(); - }; - ArrayOps.rand = function (shape, randFunction, dtype) { - var size = sizeFromShape(shape); - var values = null; - if (dtype == null || dtype === 'float32') { - values = new Float32Array(size); - } - else if (dtype === 'int32') { - values = new Int32Array(size); - } - else if (dtype === 'bool') { - values = new Uint8Array(size); - } - else { - throw new Error("Unknown data type " + dtype); - } - for (var i = 0; i < size; i++) { - values[i] = randFunction(); - } - return Tensor.make(shape, { values: values }, dtype); - }; - ArrayOps.multinomial = function (logits, numSamples, seed, normalized) { - if (normalized === void 0) { normalized = false; } - assertArgumentsAreTensors({ logits: logits }, 'multinomial'); - var numOutcomes = logits.size; - var origRank = logits.rank; - if (numOutcomes < 2) { - throw new Error("Error in multinomial: you need at least 2 outcomes, but got " + - (numOutcomes + ".")); - } - if (origRank > 2) { - throw new Error("Rank of probabilities must be 1 or 2, but is " + origRank); - } - seed = seed || Math.random(); - var logits2D = origRank === 1 ? logits.as2D(1, -1) : logits; - var res = ENV.engine.runKernel(function (backend) { return backend.multinomial(logits2D, normalized, numSamples, seed); }, { logits2D: logits2D }); - return origRank === 1 ? res.as1D() : res; - }; - ArrayOps.oneHot = function (indices, depth, onValue, offValue) { - if (onValue === void 0) { onValue = 1; } - if (offValue === void 0) { offValue = 0; } - assert(indices.dtype === 'int32', 'Indices must be of dtype `int32`'); - if (depth < 2) { - throw new Error("Error in oneHot: depth must be >=2, but it is " + depth); - } - return ENV.engine.runKernel(function (backend) { return backend.oneHot(indices, depth, onValue, offValue); }, { indices: indices }); - }; - ArrayOps.fromPixels = function (pixels, numChannels) { - if (numChannels === void 0) { numChannels = 3; } - if (numChannels > 4) { - throw new Error('Cannot construct Tensor with more than 4 channels from pixels.'); - } - return ENV.engine.fromPixels(pixels, numChannels); - }; - ArrayOps.toPixels = function (img, canvas) { - return __awaiter(this, void 0, void 0, function () { - var _a, height, width, depth, minTensor, maxTensor, min, max, data, multiplier, bytes, i, r, g, b, a, j, ctx, imageData; - return __generator(this, function (_b) { - switch (_b.label) { - case 0: - assertArgumentsAreTensors({ img: img }, 'toPixels'); - if (img.rank !== 2 && img.rank !== 3) { - throw new Error("toPixels only supports rank 2 or 3 tensors, got rank " + img.rank + "."); - } - _a = img.shape.slice(0, 2), height = _a[0], width = _a[1]; - depth = img.rank === 2 ? 1 : img.shape[2]; - if (depth > 4 || depth === 2) { - throw new Error("toPixels only supports depth of size " + - ("1, 3 or 4 but got " + depth)); - } - minTensor = img.min(); - maxTensor = img.max(); - return [4, minTensor.data()]; - case 1: - min = (_b.sent())[0]; - return [4, maxTensor.data()]; - case 2: - max = (_b.sent())[0]; - minTensor.dispose(); - maxTensor.dispose(); - if (img.dtype === 'float32') { - if (min < 0 || max > 1) { - throw new Error("Tensor values for a float32 Tensor must be in the " + - ("range [0 - 1] but got range [" + min + " - " + max + "].")); - } - } - else if (img.dtype === 'int32') { - if (min < 0 || max > 255) { - throw new Error("Tensor values for a int32 Tensor must be in the " + - ("range [0 - 255] but got range [" + min + " - " + max + "].")); - } - } - else { - throw new Error("Unsupported type for toPixels: " + img.dtype + "." + - " Please use float32 or int32 tensors."); - } - return [4, img.data()]; - case 3: - data = _b.sent(); - multiplier = img.dtype === 'float32' ? 255 : 1; - bytes = new Uint8ClampedArray(width * height * 4); - for (i = 0; i < height * width; ++i) { - r = void 0, g = void 0, b = void 0, a = void 0; - if (depth === 1) { - r = data[i] * multiplier; - g = data[i] * multiplier; - b = data[i] * multiplier; - a = 255; - } - else if (depth === 3) { - r = data[i * 3] * multiplier; - g = data[i * 3 + 1] * multiplier; - b = data[i * 3 + 2] * multiplier; - a = 255; - } - else if (depth === 4) { - r = data[i * 4] * multiplier; - g = data[i * 4 + 1] * multiplier; - b = data[i * 4 + 2] * multiplier; - a = data[i * 4 + 3] * multiplier; - } - j = i * 4; - bytes[j + 0] = Math.round(r); - bytes[j + 1] = Math.round(g); - bytes[j + 2] = Math.round(b); - bytes[j + 3] = Math.round(a); - } - if (canvas != null) { - canvas.width = width; - canvas.height = height; - ctx = canvas.getContext('2d'); - imageData = new ImageData(bytes, width, height); - ctx.putImageData(imageData, 0, 0); - } - return [2, bytes]; - } - }); - }); - }; - ArrayOps.reshape = function (x, shape) { - assertArgumentsAreTensors({ x: x }, 'reshape'); - shape = inferFromImplicitShape(shape, x.size); - assert(x.size === sizeFromShape(shape), 'new shape and old shape must have the same number of elements.'); - var grad = function (dy) { - return { x: function () { return dy.reshape(x.shape); } }; - }; - return ENV.engine.runKernel(function (backend) { return backend.reshape(x, shape); }, { x: x }, grad); - }; - ArrayOps.squeeze = function (x, axis) { - assertArgumentsAreTensors({ x: x }, 'squeeze'); - return ArrayOps.reshape(x, squeezeShape(x.shape, axis).newShape); - }; - ArrayOps.cast = function (x, dtype) { - assertArgumentsAreTensors({ x: x }, 'cast'); - var grad = function (dy) { - return { x: function () { return dy.clone(); } }; - }; - return ENV.engine.runKernel(function (backend) { return backend.cast(x, dtype); }, { x: x }, grad); - }; - ArrayOps.tile = function (x, reps) { - assertArgumentsAreTensors({ x: x }, 'tile'); - assert(x.rank === reps.length, "Error in transpose: rank of input " + x.rank + " " + - ("must match length of reps " + reps + ".")); - var grad = function (dy) { - var derX = function () { - var xGrad = ArrayOps.zerosLike(x); - if (x.rank === 1) { - for (var i = 0; i < reps[0]; ++i) { - xGrad = xGrad.add(dy.slice([i * x.shape[0]], [x.shape[0]])); - } - } - else if (x.rank === 2) { - for (var i = 0; i < reps[0]; ++i) { - for (var j = 0; j < reps[1]; ++j) { - xGrad = xGrad.add(dy.slice([i * x.shape[0], j * x.shape[1]], [x.shape[0], x.shape[1]])); - } - } - } - else if (x.rank === 3) { - for (var i = 0; i < reps[0]; ++i) { - for (var j = 0; j < reps[1]; ++j) { - for (var k = 0; k < reps[2]; ++k) { - xGrad = xGrad.add(dy.slice([i * x.shape[0], j * x.shape[1], k * x.shape[2]], [x.shape[0], x.shape[1], x.shape[2]])); - } - } - } - } - else if (x.rank === 4) { - for (var i = 0; i < reps[0]; ++i) { - for (var j = 0; j < reps[1]; ++j) { - for (var k = 0; k < reps[2]; ++k) { - for (var l = 0; l < reps[3]; ++l) { - xGrad = xGrad.add(dy.slice([ - i * x.shape[0], j * x.shape[1], k * x.shape[2], - l * x.shape[3] - ], [x.shape[0], x.shape[1], x.shape[2], x.shape[3]])); - } - } - } - } - } - else { - throw new Error("Gradient for tile operation is not implemented for rank-" + - (x.rank + " tensors yet.")); - } - return xGrad; - }; - return { x: derX }; - }; - return ENV.engine.runKernel(function (backend) { return backend.tile(x, reps); }, { x: x }, grad); - }; - ArrayOps.gather = function (x, indices, axis) { - if (axis === void 0) { axis = 0; } - assertArgumentsAreTensors({ x: x, indices: indices }, 'gather'); - assert(indices.dtype === 'int32', 'Indices must be of dtype `int32`'); - axis = parseAxisParam(axis, x.shape)[0]; - var grad = function (dy) { - var derX = function () { - return ReductionOps.unsortedSegmentSum(dy, indices, x.shape[axis], axis); - }; - return { x: derX }; - }; - return ENV.engine.runKernel(function (backend) { return backend.gather(x, indices, axis); }, { x: x }, grad); - }; - ArrayOps.pad1d = function (x, paddings, constantValue) { - if (constantValue === void 0) { constantValue = 0; } - assert(paddings.length === 2, 'Invalid number of paddings. Must be length of 2.'); - return ArrayOps.pad(x, [paddings], constantValue); - }; - ArrayOps.pad2d = function (x, paddings, constantValue) { - if (constantValue === void 0) { constantValue = 0; } - assert(paddings.length === 2 && paddings[0].length === 2 && - paddings[1].length === 2, 'Invalid number of paddings. Must be length of 2 each.'); - return ArrayOps.pad(x, paddings, constantValue); - }; - ArrayOps.pad3d = function (x, paddings, constantValue) { - if (constantValue === void 0) { constantValue = 0; } - assert(paddings.length === 3 && paddings[0].length === 2 && - paddings[1].length === 2 && paddings[2].length === 2, 'Invalid number of paddings. Must be length of 2 each.'); - return ArrayOps.pad(x, paddings, constantValue); - }; - ArrayOps.pad4d = function (x, paddings, constantValue) { - if (constantValue === void 0) { constantValue = 0; } - assert(paddings.length === 4 && paddings[0].length === 2 && - paddings[1].length === 2 && paddings[2].length === 2 && - paddings[3].length === 2, 'Invalid number of paddings. Must be length of 2 each.'); - return ArrayOps.pad(x, paddings, constantValue); - }; - ArrayOps.pad = function (x, paddings, constantValue) { - if (constantValue === void 0) { constantValue = 0; } - assertArgumentsAreTensors({ x: x }, 'pad'); - if (x.rank === 0) { - throw new Error('pad(scalar) is not defined. Pass non-scalar to pad'); - } - var begin = paddings.map(function (p) { return p[0]; }); - var grad = function (dy) { - return { x: function () { return dy.slice(begin, x.shape); } }; - }; - return ENV.engine.runKernel(function (backend) { return backend.pad(x, paddings, constantValue); }, { x: x }, grad); - }; - ArrayOps.stack = function (tensors, axis) { - if (axis === void 0) { axis = 0; } - assertArgumentsAreTensors({ tensors: tensors }, 'stack'); - assert(tensors.length >= 1, 'Pass at least one tensor to tf.stack'); - if (tensors.length === 1) { - return tensors[0].expandDims(axis); - } - var rank = tensors[0].rank; - var shape = tensors[0].shape; - var dtype = tensors[0].dtype; - assert(axis <= rank, 'Axis must be <= rank of the tensor'); - tensors.forEach(function (t) { - assertShapesMatch(shape, t.shape, 'All tensors passed to stack must have matching shapes'); - }); - tensors.forEach(function (t) { - assert(dtype === t.dtype, 'All tensors passed to stack must have matching dtypes'); - }); - var expandedTensors = tensors.map(function (t) { return t.expandDims(axis); }); - return ConcatOps.concat(expandedTensors, axis); - }; - ArrayOps.unstack = function (value, axis) { - if (axis === void 0) { axis = 0; } - var num = value.shape[axis]; - var outputShape = Array(value.rank - 1).fill(0); - var outIndex = 0; - for (var i = 0; i < value.rank; i++) { - if (i !== axis) { - outputShape[outIndex] = value.shape[i]; - outIndex++; - } - } - var splitSizes; - splitSizes = Array(num).fill(1); - var begin = Array(value.rank).fill(0); - var size = value.shape.slice(); - return splitSizes.map(function (s) { - size[axis] = s; - var slice = value.slice(begin, size); - begin[axis] += s; - return slice.reshape(outputShape); - }); - }; - ArrayOps.split = function (x, numOrSizeSplits, axis) { - if (axis === void 0) { axis = 0; } - assertArgumentsAreTensors({ x: x }, 'split'); - axis = parseAxisParam(axis, x.shape)[0]; - var splitSizes; - if (typeof (numOrSizeSplits) === 'number') { - assert(x.shape[axis] % numOrSizeSplits === 0, 'Number of splits must evenly divide the axis.'); - splitSizes = Array(numOrSizeSplits).fill(x.shape[axis] / numOrSizeSplits); - } - else { - assert(x.shape[axis] === numOrSizeSplits.reduce(function (a, b) { return a + b; }), 'The sum of sizes must match the size of the axis dimension.'); - splitSizes = numOrSizeSplits; - } - var begin = Array(x.rank).fill(0); - var size = x.shape.slice(); - return splitSizes.map(function (s) { - size[axis] = s; - var slice = x.slice(begin, size); - begin[axis] += s; - return slice; - }); - }; - ArrayOps.cumsum = function (x, axis, exclusive, reverse) { - if (axis === void 0) { axis = 0; } - if (exclusive === void 0) { exclusive = false; } - if (reverse === void 0) { reverse = false; } - assertArgumentsAreTensors({ x: x }, 'cumsum'); - var permutation = getAxesPermutation([axis], x.rank); - var permutedX = x; - if (permutation != null) { - permutedX = x.transpose(permutation); - } - var grad = function (dy) { - return { permutedX: function () { return dy.cumsum(axis, exclusive, !reverse); } }; - }; - var value = ENV.engine.runKernel(function (backend) { return backend.cumsum(permutedX, axis, exclusive, reverse); }, { permutedX: permutedX }, grad); - if (permutation != null) { - value = value.transpose(permutation); - } - return value; - }; - ArrayOps.expandDims = function (x, axis) { - if (axis === void 0) { axis = 0; } - assertArgumentsAreTensors({ x: x }, 'expandDims'); - assert(axis <= x.rank, 'Axis must be <= rank of the tensor'); - var newShape = x.shape.slice(); - newShape.splice(axis, 0, 1); - return ArrayOps.reshape(x, newShape); - }; - ArrayOps.linspace = function (start, stop, num) { - if (num === 0) { - throw new Error('Cannot request zero samples'); - } - var step = (stop - start) / (num - 1); - var values = makeZerosTypedArray(num, 'float32'); - values[0] = start; - for (var i = 1; i < values.length; i++) { - values[i] = values[i - 1] + step; - } - return ArrayOps.tensor1d(values, 'float32'); - }; - ArrayOps.range = function (start, stop, step, dtype) { - if (step === void 0) { step = 1; } - if (dtype === void 0) { dtype = 'float32'; } - if (step === 0) { - throw new Error('Cannot have a step of zero'); - } - var sameStartStop = start === stop; - var increasingRangeNegativeStep = start < stop && step < 0; - var decreasingRangePositiveStep = stop < start && step > 1; - if (sameStartStop || increasingRangeNegativeStep || - decreasingRangePositiveStep) { - return ArrayOps.zeros([0], dtype); - } - var numElements = Math.abs(Math.ceil((stop - start) / step)); - var values = makeZerosTypedArray(numElements, dtype); - if (stop < start && step === 1) { - step = -1; - } - values[0] = start; - for (var i = 1; i < values.length; i++) { - values[i] = values[i - 1] + step; - } - return ArrayOps.tensor1d(values, dtype); - }; - ArrayOps.buffer = function (shape, dtype, values) { - if (dtype === void 0) { dtype = 'float32'; } - return new TensorBuffer(shape, dtype, values); - }; - ArrayOps.print = function (x, verbose) { - if (verbose === void 0) { verbose = false; } - console.log(tensorToString(x, verbose)); - }; - __decorate$2([ - doc({ heading: 'Tensors', subheading: 'Creation' }) - ], ArrayOps, "tensor", null); - __decorate$2([ - doc({ heading: 'Tensors', subheading: 'Creation' }) - ], ArrayOps, "scalar", null); - __decorate$2([ - doc({ heading: 'Tensors', subheading: 'Creation' }) - ], ArrayOps, "tensor1d", null); - __decorate$2([ - doc({ heading: 'Tensors', subheading: 'Creation' }) - ], ArrayOps, "tensor2d", null); - __decorate$2([ - doc({ heading: 'Tensors', subheading: 'Creation' }) - ], ArrayOps, "tensor3d", null); - __decorate$2([ - doc({ heading: 'Tensors', subheading: 'Creation' }) - ], ArrayOps, "tensor4d", null); - __decorate$2([ - doc({ heading: 'Tensors', subheading: 'Creation' }), - operation - ], ArrayOps, "ones", null); - __decorate$2([ - doc({ heading: 'Tensors', subheading: 'Creation' }), - operation - ], ArrayOps, "zeros", null); - __decorate$2([ - doc({ heading: 'Tensors', subheading: 'Creation' }), - operation - ], ArrayOps, "fill", null); - __decorate$2([ - doc({ heading: 'Tensors', subheading: 'Creation' }), - operation - ], ArrayOps, "onesLike", null); - __decorate$2([ - doc({ heading: 'Tensors', subheading: 'Creation' }), - operation - ], ArrayOps, "zerosLike", null); - __decorate$2([ - doc({ heading: 'Tensors', subheading: 'Creation' }), - operation - ], ArrayOps, "clone", null); - __decorate$2([ - doc({ heading: 'Tensors', subheading: 'Creation' }), - operation - ], ArrayOps, "eye", null); - __decorate$2([ - doc({ heading: 'Tensors', subheading: 'Creation' }), - operation - ], ArrayOps, "randomNormal", null); - __decorate$2([ - doc({ heading: 'Tensors', subheading: 'Creation' }), - operation - ], ArrayOps, "truncatedNormal", null); - __decorate$2([ - doc({ heading: 'Tensors', subheading: 'Creation' }), - operation - ], ArrayOps, "randomUniform", null); - __decorate$2([ - operation - ], ArrayOps, "rand", null); - __decorate$2([ - operation - ], ArrayOps, "multinomial", null); - __decorate$2([ - doc({ heading: 'Tensors', subheading: 'Creation' }), - operation - ], ArrayOps, "oneHot", null); - __decorate$2([ - doc({ heading: 'Tensors', subheading: 'Creation' }), - operation - ], ArrayOps, "fromPixels", null); - __decorate$2([ - doc({ heading: 'Visualization' }) - ], ArrayOps, "toPixels", null); - __decorate$2([ - doc({ heading: 'Tensors', subheading: 'Transformations' }), - operation - ], ArrayOps, "reshape", null); - __decorate$2([ - doc({ heading: 'Tensors', subheading: 'Transformations' }) - ], ArrayOps, "squeeze", null); - __decorate$2([ - doc({ heading: 'Tensors', subheading: 'Transformations' }), - operation - ], ArrayOps, "cast", null); - __decorate$2([ - doc({ heading: 'Tensors', subheading: 'Slicing and Joining' }), - operation - ], ArrayOps, "tile", null); - __decorate$2([ - doc({ heading: 'Tensors', subheading: 'Slicing and Joining' }), - operation - ], ArrayOps, "gather", null); - __decorate$2([ - doc({ heading: 'Tensors', subheading: 'Transformations' }), - operation - ], ArrayOps, "pad", null); - __decorate$2([ - doc({ heading: 'Tensors', subheading: 'Slicing and Joining' }), - operation - ], ArrayOps, "stack", null); - __decorate$2([ - doc({ heading: 'Tensors', subheading: 'Slicing and Joining' }), - operation - ], ArrayOps, "unstack", null); - __decorate$2([ - doc({ heading: 'Tensors', subheading: 'Slicing and Joining' }), - operation - ], ArrayOps, "split", null); - __decorate$2([ - doc({ heading: 'Operations', subheading: 'Scan' }) - ], ArrayOps, "cumsum", null); - __decorate$2([ - doc({ heading: 'Tensors', subheading: 'Transformations' }), - operation - ], ArrayOps, "expandDims", null); - __decorate$2([ - operation, - doc({ heading: 'Tensors', subheading: 'Creation' }) - ], ArrayOps, "linspace", null); - __decorate$2([ - operation, - doc({ heading: 'Tensors', subheading: 'Creation' }) - ], ArrayOps, "range", null); - __decorate$2([ - doc({ heading: 'Tensors', subheading: 'Creation' }) - ], ArrayOps, "buffer", null); - __decorate$2([ - doc({ heading: 'Tensors', subheading: 'Creation' }) - ], ArrayOps, "print", null); - return ArrayOps; - }()); - function makeZerosTypedArray(size, dtype) { - if (dtype == null || dtype === 'float32') { - return new Float32Array(size); - } - else if (dtype === 'int32') { - return new Int32Array(size); - } - else if (dtype === 'bool') { - return new Uint8Array(size); - } - else { - throw new Error("Unknown data type $ {dtype}"); - } - } - function makeOnesTypedArray(size, dtype) { - var array = makeZerosTypedArray(size, dtype); - for (var i = 0; i < array.length; i++) { - array[i] = 1; - } - return array; - } - function toTypedArray(a, dtype) { - if (noConversionNeeded(a, dtype)) { - return a; - } - if (Array.isArray(a)) { - a = flatten(a); - } - return copyTypedArray(a, dtype); - } - function noConversionNeeded(a, dtype) { - return (a instanceof Float32Array && dtype === 'float32') || - (a instanceof Int32Array && dtype === 'int32') || - (a instanceof Uint8Array && dtype === 'bool'); - } - - function getBroadcastDims(inShape, outShape) { - var inRank = inShape.length; - var dims = []; - for (var i = 0; i < inRank; i++) { - var dim = inRank - 1 - i; - var a = inShape[dim] || 1; - var b = outShape[outShape.length - 1 - i] || 1; - if (b > 1 && a === 1) { - dims.unshift(dim); - } - } - return dims; - } - function getReductionAxes(inShape, outShape) { - var result = []; - for (var i = 0; i < outShape.length; i++) { - var inDim = inShape[inShape.length - i - 1]; - var outAxis = outShape.length - i - 1; - var outDim = outShape[outAxis]; - if (inDim == null || (inDim === 1 && outDim > 1)) { - result.unshift(outAxis); - } - } - return result; - } - function broadcastDimsAreOuter(dims) { - for (var i = 0; i < dims.length; i++) { - if (dims[i] !== i) { - return false; - } - } - return true; - } - function assertAndGetBroadcastShape(shapeA, shapeB) { - var result = []; - var errMsg = "Operands could not be broadcast together with shapes " + - (shapeA + " and " + shapeB + "."); - var l = Math.max(shapeA.length, shapeB.length); - for (var i = 0; i < l; i++) { - var a = shapeA[shapeA.length - i - 1] || 1; - var b = shapeB[shapeB.length - i - 1] || 1; - if (a > 1 && b > 1 && a !== b) { - throw Error(errMsg); - } - result.unshift(Math.max(a, b)); - } - return result; - } - - var __decorate$3 = (undefined && undefined.__decorate) || function (decorators, target, key, desc) { - var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; - if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); - else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; - return c > 3 && r && Object.defineProperty(target, key, r), r; - }; - var BatchNormOps = (function () { - function BatchNormOps() { - } - BatchNormOps.batchNormalization2d = function (x, mean$$1, variance, varianceEpsilon, scale, offset) { - if (varianceEpsilon === void 0) { varianceEpsilon = .001; } - assert(x.rank === 2, "Error in batchNormalization3D: x must be rank 3 but got rank " + - (x.rank + ".")); - assert(mean$$1.rank === 2 || mean$$1.rank === 1, "Error in batchNormalization2D: mean must be rank 2 or rank 1 but " + - ("got rank " + mean$$1.rank + ".")); - assert(variance.rank === 2 || variance.rank === 1, "Error in batchNormalization2D: variance must be rank 2 or rank 1 " + - ("but got rank " + variance.rank + ".")); - if (scale != null) { - assert(scale.rank === 2 || scale.rank === 1, "Error in batchNormalization2D: scale must be rank 2 or rank 1 " + - ("but got rank " + scale.rank + ".")); - } - if (offset != null) { - assert(offset.rank === 2 || offset.rank === 1, "Error in batchNormalization2D: offset must be rank 2 or rank 1 " + - ("but got rank " + offset.rank + ".")); - } - return BatchNormOps.batchNormalization(x, mean$$1, variance, varianceEpsilon, scale, offset); - }; - BatchNormOps.batchNormalization3d = function (x, mean$$1, variance, varianceEpsilon, scale, offset) { - if (varianceEpsilon === void 0) { varianceEpsilon = .001; } - assert(x.rank === 3, "Error in batchNormalization3D: x must be rank 3 but got rank " + - (x.rank + ".")); - assert(mean$$1.rank === 3 || mean$$1.rank === 1, "Error in batchNormalization3D: mean must be rank 3 or rank 1 but " + - ("got rank " + mean$$1.rank + ".")); - assert(variance.rank === 3 || variance.rank === 1, "Error in batchNormalization3D: variance must be rank 3 or rank 1 " + - ("but got rank " + variance.rank + ".")); - if (scale != null) { - assert(scale.rank === 3 || scale.rank === 1, "Error in batchNormalization3D: scale must be rank 3 or rank 1 " + - ("but got rank " + scale.rank + ".")); - } - if (offset != null) { - assert(offset.rank === 3 || offset.rank === 1, "Error in batchNormalization3D: offset must be rank 3 or rank 1 " + - ("but got rank " + offset.rank + ".")); - } - return BatchNormOps.batchNormalization(x, mean$$1, variance, varianceEpsilon, scale, offset); - }; - BatchNormOps.batchNormalization4d = function (x, mean$$1, variance, varianceEpsilon, scale, offset) { - if (varianceEpsilon === void 0) { varianceEpsilon = .001; } - assert(x.rank === 4, "Error in batchNormalization4D: x must be rank 4 but got rank " + - (x.rank + ".")); - assert(mean$$1.rank === 4 || mean$$1.rank === 1, "Error in batchNormalization4D: mean must be rank 4 or rank 1 but " + - ("got rank " + mean$$1.rank + ".")); - assert(variance.rank === 4 || variance.rank === 1, "Error in batchNormalization4D: variance must be rank 4 or rank 1 " + - ("but got rank " + variance.rank + ".")); - if (scale != null) { - assert(scale.rank === 4 || scale.rank === 1, "Error in batchNormalization4D: scale must be rank 4 or rank 1 " + - ("but got rank " + scale.rank + ".")); - } - if (offset != null) { - assert(offset.rank === 4 || offset.rank === 1, "Error in batchNormalization4D: offset must be rank 4 or rank 1 " + - ("but got rank " + offset.rank + ".")); - } - return BatchNormOps.batchNormalization(x, mean$$1, variance, varianceEpsilon, scale, offset); - }; - BatchNormOps.batchNormalization = function (x, mean$$1, variance, varianceEpsilon, scale, offset) { - if (varianceEpsilon === void 0) { varianceEpsilon = .001; } - assertArgumentsAreTensors({ x: x, mean: mean$$1, variance: variance }, 'batchNormalization'); - if (scale != null) { - assertArgumentsAreTensors({ scale: scale }, 'batchNormalization'); - } - if (offset != null) { - assertArgumentsAreTensors({ offset: offset }, 'batchNormalization'); - } - assert(mean$$1.rank === variance.rank, 'Batch normalization gradient requires mean and variance to have ' + - 'equal ranks.'); - assert(offset == null || mean$$1.rank === offset.rank, 'Batch normalization gradient requires mean and offset to have ' + - 'equal ranks.'); - assert(scale == null || mean$$1.rank === scale.rank, 'Batch normalization gradient requires mean and scale to have ' + - 'equal ranks.'); - var x4D; - if (x.rank === 0 || x.rank === 1) { - x4D = x.as4D(1, 1, 1, x.size); - } - else if (x.rank === 2) { - x4D = x.as4D(1, 1, x.shape[0], x.shape[1]); - } - else if (x.rank === 3) { - x4D = x.as4D(1, x.shape[0], x.shape[1], x.shape[2]); - } - else { - x4D = x; - } - var der = function (dy) { - var scaleValue = scale == null ? ArrayOps.scalar(1) : scale; - var reductionAxes = getReductionAxes(mean$$1.shape, x4D.shape); - var tileShape = []; - if (mean$$1.rank === 1) { - for (var i = 0; i < x4D.shape.length - 1; ++i) { - tileShape.push(x4D.shape[i]); - } - tileShape.push(1); - } - var xMinusMean = x.sub(mean$$1); - var dyTimesScaleValue = dy.mul(scaleValue); - var oneOverSqrtVariance = rsqrt(variance.add(ArrayOps.scalar(varianceEpsilon))); - var minusHalfRCube = oneOverSqrtVariance.mul(oneOverSqrtVariance) - .mul(oneOverSqrtVariance) - .mul(ArrayOps.scalar(-0.5)); - var derX = function () { - if (mean$$1.rank === 1) { - return dy - .mul(ArrayOps.tile(oneOverSqrtVariance.as4D(1, 1, 1, mean$$1.shape[0]), tileShape)) - .mul(scaleValue) - .reshape(x.shape); - } - else { - return dy.mul(oneOverSqrtVariance).mul(scaleValue).reshape(x.shape); - } - }; - var derMean = function () { - var meanDer = oneOverSqrtVariance.mul(ArrayOps.scalar(-1)).mul(dyTimesScaleValue); - if (mean$$1.rank === 1) { - meanDer = meanDer.sum(reductionAxes); - } - return meanDer.reshape(mean$$1.shape); - }; - var derVariance = function () { - var varianceDer = minusHalfRCube.mul(xMinusMean).mul(dyTimesScaleValue); - if (mean$$1.rank === 1) { - varianceDer = varianceDer.sum(reductionAxes); - } - return varianceDer.reshape(mean$$1.shape); - }; - var derScale = function () { - var xMinusMean2TimesRsqrt = xMinusMean.mul(oneOverSqrtVariance); - var scaleDer = dy.mul(xMinusMean2TimesRsqrt); - if (mean$$1.rank === 1) { - scaleDer = scaleDer.sum(reductionAxes); - } - return scaleDer.reshape(mean$$1.shape); - }; - var derOffset = function () { - var offsetDer = dy; - if (mean$$1.rank === 1) { - offsetDer = offsetDer.sum(reductionAxes); - } - return offsetDer.reshape(mean$$1.shape); - }; - return { - x: derX, - mean: derMean, - variance: derVariance, - scale: derScale, - offset: derOffset - }; - }; - var res = ENV.engine.runKernel(function (backend) { return backend.batchNormalization(x4D, batchnormReshape4D(mean$$1), batchnormReshape4D(variance), varianceEpsilon, batchnormReshape4D(scale), batchnormReshape4D(offset)); }, { x: x, mean: mean$$1, variance: variance, scale: scale, offset: offset }, der); - return res.reshape(x.shape); - }; - __decorate$3([ - operation - ], BatchNormOps, "batchNormalization2d", null); - __decorate$3([ - operation - ], BatchNormOps, "batchNormalization3d", null); - __decorate$3([ - operation - ], BatchNormOps, "batchNormalization4d", null); - __decorate$3([ - doc({ heading: 'Operations', subheading: 'Normalization' }) - ], BatchNormOps, "batchNormalization", null); - return BatchNormOps; - }()); - function batchnormReshape4D(x) { - if (x == null) { - return null; - } - if (x.rank === 0) { - return x.as1D(); - } - else if (x.rank === 1) { - return x; - } - else if (x.rank === 2) { - return x.as4D(1, 1, x.shape[0], x.shape[1]); - } - else if (x.rank === 3) { - return x.as4D(1, x.shape[0], x.shape[1], x.shape[2]); - } - return x; - } - - var DType; - (function (DType) { - DType["float32"] = "float32"; - DType["int32"] = "int32"; - DType["bool"] = "bool"; - })(DType || (DType = {})); - var Rank; - (function (Rank) { - Rank["R0"] = "R0"; - Rank["R1"] = "R1"; - Rank["R2"] = "R2"; - Rank["R3"] = "R3"; - Rank["R4"] = "R4"; - })(Rank || (Rank = {})); - var UpcastInt32AndMap; - (function (UpcastInt32AndMap) { - UpcastInt32AndMap["float32"] = "float32"; - UpcastInt32AndMap["int32"] = "int32"; - UpcastInt32AndMap["bool"] = "int32"; - })(UpcastInt32AndMap || (UpcastInt32AndMap = {})); - var UpcastBoolAndMap; - (function (UpcastBoolAndMap) { - UpcastBoolAndMap["float32"] = "float32"; - UpcastBoolAndMap["int32"] = "int32"; - UpcastBoolAndMap["bool"] = "bool"; - })(UpcastBoolAndMap || (UpcastBoolAndMap = {})); - var UpcastFloat32AndMap; - (function (UpcastFloat32AndMap) { - UpcastFloat32AndMap["float32"] = "float32"; - UpcastFloat32AndMap["int32"] = "float32"; - UpcastFloat32AndMap["bool"] = "float32"; - })(UpcastFloat32AndMap || (UpcastFloat32AndMap = {})); - var upcastTypeMap = { - float32: UpcastFloat32AndMap, - int32: UpcastInt32AndMap, - bool: UpcastBoolAndMap - }; - function upcastType(typeA, typeB) { - return upcastTypeMap[typeA][typeB]; - } - function sumOutType(type) { - return upcastType(type, 'int32'); - } - - var __decorate$4 = (undefined && undefined.__decorate) || function (decorators, target, key, desc) { - var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; - if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); - else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; - return c > 3 && r && Object.defineProperty(target, key, r), r; - }; - var BinaryOps = (function () { - function BinaryOps() { - } - BinaryOps.add = function (a, b) { - assertArgumentsAreTensors({ a: a, b: b }, 'add'); - assertTypesMatch(a, b); - var outShape = assertAndGetBroadcastShape(a.shape, b.shape); - var der = function (dy) { - var derA = function () { - var res = dy; - var reduceAxes = getReductionAxes(a.shape, outShape); - if (reduceAxes.length > 0) { - res = res.sum(reduceAxes); - } - return res.reshape(a.shape); - }; - var derB = function () { - var res = dy; - var reduceAxes = getReductionAxes(b.shape, outShape); - if (reduceAxes.length > 0) { - res = res.sum(reduceAxes); - } - return res.reshape(b.shape); - }; - return { a: derA, b: derB }; - }; - return ENV.engine.runKernel(function (backend) { return backend.add(a, b); }, { a: a, b: b }, der); - }; - BinaryOps.addStrict = function (a, b) { - assertShapesMatch(a.shape, b.shape, 'Error in addStrict: '); - return a.add(b); - }; - BinaryOps.sub = function (a, b) { - assertArgumentsAreTensors({ a: a, b: b }, 'sub'); - assertTypesMatch(a, b); - var outShape = assertAndGetBroadcastShape(a.shape, b.shape); - var der = function (dy) { - var derA = function () { - var res = dy; - var reduceAxes = getReductionAxes(a.shape, outShape); - if (reduceAxes.length > 0) { - res = res.sum(reduceAxes); - } - return res.reshape(a.shape); - }; - var derB = function () { - var res = dy; - var reduceAxes = getReductionAxes(b.shape, outShape); - if (reduceAxes.length > 0) { - res = res.sum(reduceAxes); - } - return res.neg().reshape(b.shape); - }; - return { a: derA, b: derB }; - }; - return ENV.engine.runKernel(function (backend) { return backend.subtract(a, b); }, { a: a, b: b }, der); - }; - BinaryOps.subStrict = function (a, b) { - assertShapesMatch(a.shape, b.shape, 'Error in subStrict: '); - return a.sub(b); - }; - BinaryOps.pow = function (base, exp$$1) { - assertArgumentsAreTensors({ base: base, exp: exp$$1 }, 'pow'); - var outShape = assertAndGetBroadcastShape(base.shape, exp$$1.shape); - base = base.cast(upcastType(base.dtype, exp$$1.dtype)); - exp$$1 = exp$$1.cast(upcastType(base.dtype, exp$$1.dtype)); - var grad = function (dy, saved) { - var y = saved[0]; - var derBase = function () { - var res = dy.mul(exp$$1.toFloat().mul(y.div(base))); - var reduceAxes = getReductionAxes(base.shape, outShape); - if (reduceAxes.length > 0) { - res = res.sum(reduceAxes); - } - return res.reshape(base.shape); - }; - var derExp = function () { - var res = dy.mul(y.mul(base.log()).toFloat()); - var reduceAxes = getReductionAxes(exp$$1.shape, outShape); - if (reduceAxes.length > 0) { - res = res.sum(reduceAxes); - } - return res.reshape(exp$$1.shape); - }; - return { base: derBase, exp: derExp }; - }; - return ENV.engine.runKernel(function (backend, save) { return save(backend.pow(base, exp$$1)); }, { base: base, exp: exp$$1 }, grad); - }; - BinaryOps.powStrict = function (base, exp$$1) { - assertShapesMatch(base.shape, exp$$1.shape, 'Error in powStrict: '); - return base.pow(exp$$1); - }; - BinaryOps.mul = function (a, b) { - assertArgumentsAreTensors({ a: a, b: b }, 'mul'); - assertTypesMatch(a, b); - var outShape = assertAndGetBroadcastShape(a.shape, b.shape); - var der = function (dy) { - var derA = function () { - var res = dy.mul(b.toFloat()); - var reduceAxes = getReductionAxes(a.shape, outShape); - if (reduceAxes.length > 0) { - return res.sum(reduceAxes).reshape(a.shape); - } - return res; - }; - var derB = function () { - var res = dy.mul(a.toFloat()); - var reduceAxes = getReductionAxes(b.shape, outShape); - if (reduceAxes.length > 0) { - return res.sum(reduceAxes).reshape(b.shape); - } - return res; - }; - return { a: derA, b: derB }; - }; - return ENV.engine.runKernel(function (backend) { return backend.multiply(a, b); }, { a: a, b: b }, der); - }; - BinaryOps.mulStrict = function (a, b) { - assertShapesMatch(a.shape, b.shape, 'Error in multiplyStrict: '); - return a.mul(b); - }; - BinaryOps.div = function (a, b) { - assertArgumentsAreTensors({ a: a, b: b }, 'div'); - assertTypesMatch(a, b); - var outShape = assertAndGetBroadcastShape(a.shape, b.shape); - var der = function (dy) { - var derA = function () { - var res = dy.div(b.toFloat()); - var reduceAxes = getReductionAxes(a.shape, outShape); - if (reduceAxes.length > 0) { - return res.sum(reduceAxes).reshape(a.shape); - } - return res; - }; - var derB = function () { - var res = dy.mul(a.toFloat()); - var reduceAxes = getReductionAxes(b.shape, outShape); - if (reduceAxes.length > 0) { - res = res.sum(reduceAxes).reshape(b.shape); - } - var tmp = b.square(); - return res.div(tmp.toFloat()).neg(); - }; - return { a: derA, b: derB }; - }; - return ENV.engine.runKernel(function (backend) { return backend.divide(a, b); }, { a: a, b: b }, der); - }; - BinaryOps.divStrict = function (a, b) { - assertShapesMatch(a.shape, b.shape, 'Error in divideStrict: '); - return a.div(b); - }; - BinaryOps.mod = function (a, b) { - assertArgumentsAreTensors({ a: a, b: b }, 'mod'); - assertTypesMatch(a, b); - var outShape = assertAndGetBroadcastShape(a.shape, b.shape); - var der = function (dy) { - var derA = function () { - var reduceAxes = getReductionAxes(a.shape, outShape); - if (reduceAxes.length > 0) { - return dy.sum(reduceAxes).reshape(a.shape); - } - return dy; - }; - var derB = function () { - var res = dy.mul(a.div(b).floor().neg()); - var reduceAxes = getReductionAxes(b.shape, outShape); - if (reduceAxes.length > 0) { - return res.sum(reduceAxes).reshape(b.shape); - } - return res; - }; - return { a: derA, b: derB }; - }; - return ENV.engine.runKernel(function (backend) { return backend.mod(a, b); }, { a: a, b: b }, der); - }; - BinaryOps.modStrict = function (a, b) { - assertShapesMatch(a.shape, b.shape, 'Error in modStrict: '); - return a.mod(b); - }; - BinaryOps.minimum = function (a, b) { - assertArgumentsAreTensors({ a: a, b: b }, 'minimum'); - assertTypesMatch(a, b); - if (a.dtype === 'bool') { - a = a.toInt(); - } - if (b.dtype === 'bool') { - b = b.toInt(); - } - assertAndGetBroadcastShape(a.shape, b.shape); - var der = function (dy) { - var derA = function () { return dy.mul(a.lessEqual(b).toFloat()); }; - var derB = function () { return dy.mul(a.greater(b).toFloat()); }; - return { a: derA, b: derB }; - }; - return ENV.engine.runKernel(function (backend) { return backend.minimum(a, b); }, { a: a, b: b }, der); - }; - BinaryOps.minimumStrict = function (a, b) { - assertShapesMatch(a.shape, b.shape, 'Error in minimumStrict: '); - return a.minimum(b); - }; - BinaryOps.maximum = function (a, b) { - assertArgumentsAreTensors({ a: a, b: b }, 'maximum'); - assertTypesMatch(a, b); - if (a.dtype === 'bool') { - a = a.toInt(); - } - if (b.dtype === 'bool') { - b = b.toInt(); - } - assertAndGetBroadcastShape(a.shape, b.shape); - var der = function (dy) { - var derA = function () { return dy.mul(a.greaterEqual(b).toFloat()); }; - var derB = function () { return dy.mul(a.less(b).toFloat()); }; - return { a: derA, b: derB }; - }; - return ENV.engine.runKernel(function (backend) { return backend.maximum(a, b); }, { a: a, b: b }, der); - }; - BinaryOps.maximumStrict = function (a, b) { - assertShapesMatch(a.shape, b.shape, 'Error in minimumStrict: '); - return a.maximum(b); - }; - BinaryOps.squaredDifference = function (a, b) { - assertArgumentsAreTensors({ a: a, b: b }, 'squaredDifference'); - assertTypesMatch(a, b); - assertAndGetBroadcastShape(a.shape, b.shape); - var der = function (dy) { - var two = scalar(2); - var derA = function () { return dy.mul(a.sub(b).mul(two)); }; - var derB = function () { return dy.mul(b.sub(a).mul(two)); }; - return { a: derA, b: derB }; - }; - return ENV.engine.runKernel(function (backend) { return backend.squaredDifference(a, b); }, { a: a, b: b }, der); - }; - BinaryOps.squaredDifferenceStrict = function (a, b) { - assertShapesMatch(a.shape, b.shape, 'Error in squaredDifferenceStrict: '); - return a.squaredDifference(b); - }; - BinaryOps.atan2 = function (a, b) { - assertArgumentsAreTensors({ a: a, b: b }, 'atan2'); - assertTypesMatch(a, b); - var outShape = assertAndGetBroadcastShape(a.shape, b.shape); - var der = function (dy) { - var derA = function () { - var d = BinaryOps.add(square(a), square(b)); - var res = dy.mul(b.div(d)); - var reduceAxes = getReductionAxes(a.shape, outShape); - if (reduceAxes.length > 0) { - res = res.sum(reduceAxes); - } - return res.reshape(a.shape); - }; - var derB = function () { - var d = BinaryOps.add(square(a), square(b)); - var res = neg(dy.mul(a.div(d))); - var reduceAxes = getReductionAxes(b.shape, outShape); - if (reduceAxes.length > 0) { - res = res.sum(reduceAxes); - } - return res.reshape(b.shape); - }; - return { a: derA, b: derB }; - }; - return ENV.engine.runKernel(function (backend) { return backend.atan2(a, b); }, { a: a, b: b }, der); - }; - __decorate$4([ - doc({ heading: 'Operations', subheading: 'Arithmetic' }), - operation - ], BinaryOps, "add", null); - __decorate$4([ - operation - ], BinaryOps, "addStrict", null); - __decorate$4([ - doc({ heading: 'Operations', subheading: 'Arithmetic' }), - operation - ], BinaryOps, "sub", null); - __decorate$4([ - operation - ], BinaryOps, "subStrict", null); - __decorate$4([ - doc({ heading: 'Operations', subheading: 'Arithmetic' }), - operation - ], BinaryOps, "pow", null); - __decorate$4([ - operation - ], BinaryOps, "powStrict", null); - __decorate$4([ - doc({ heading: 'Operations', subheading: 'Arithmetic' }), - operation - ], BinaryOps, "mul", null); - __decorate$4([ - operation - ], BinaryOps, "mulStrict", null); - __decorate$4([ - doc({ heading: 'Operations', subheading: 'Arithmetic' }), - operation - ], BinaryOps, "div", null); - __decorate$4([ - operation - ], BinaryOps, "divStrict", null); - __decorate$4([ - doc({ heading: 'Operations', subheading: 'Arithmetic' }), - operation - ], BinaryOps, "mod", null); - __decorate$4([ - operation - ], BinaryOps, "modStrict", null); - __decorate$4([ - doc({ heading: 'Operations', subheading: 'Arithmetic' }), - operation - ], BinaryOps, "minimum", null); - __decorate$4([ - operation - ], BinaryOps, "minimumStrict", null); - __decorate$4([ - doc({ heading: 'Operations', subheading: 'Arithmetic' }), - operation - ], BinaryOps, "maximum", null); - __decorate$4([ - operation - ], BinaryOps, "maximumStrict", null); - __decorate$4([ - doc({ heading: 'Operations', subheading: 'Arithmetic' }), - operation - ], BinaryOps, "squaredDifference", null); - __decorate$4([ - operation - ], BinaryOps, "squaredDifferenceStrict", null); - __decorate$4([ - operation - ], BinaryOps, "atan2", null); - return BinaryOps; - }()); - - var __decorate$5 = (undefined && undefined.__decorate) || function (decorators, target, key, desc) { - var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; - if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); - else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; - return c > 3 && r && Object.defineProperty(target, key, r), r; - }; - var CompareOps = (function () { - function CompareOps() { - } - CompareOps.notEqual = function (a, b) { - assertArgumentsAreTensors({ a: a, b: b }, 'notEqual'); - assertTypesMatch(a, b); - assertAndGetBroadcastShape(a.shape, b.shape); - return ENV.engine.runKernel(function (backend) { return backend.notEqual(a, b); }, { a: a, b: b }); - }; - CompareOps.notEqualStrict = function (a, b) { - assertShapesMatch(a.shape, b.shape, 'Error in notEqualStrict: '); - return a.notEqual(b); - }; - CompareOps.less = function (a, b) { - assertArgumentsAreTensors({ a: a, b: b }, 'less'); - assertTypesMatch(a, b); - assertAndGetBroadcastShape(a.shape, b.shape); - return ENV.engine.runKernel(function (backend) { return backend.less(a, b); }, { a: a, b: b }); - }; - CompareOps.lessStrict = function (a, b) { - assertShapesMatch(a.shape, b.shape, 'Error in lessStrict: '); - return a.less(b); - }; - CompareOps.equal = function (a, b) { - assertArgumentsAreTensors({ a: a, b: b }, 'equal'); - assertTypesMatch(a, b); - assertAndGetBroadcastShape(a.shape, b.shape); - return ENV.engine.runKernel(function (backend) { return backend.equal(a, b); }, { a: a, b: b }); - }; - CompareOps.equalStrict = function (a, b) { - assertShapesMatch(a.shape, b.shape, 'Error in equalStrict: '); - return a.equal(b); - }; - CompareOps.lessEqual = function (a, b) { - assertArgumentsAreTensors({ a: a, b: b }, 'lessEqual'); - assertTypesMatch(a, b); - assertAndGetBroadcastShape(a.shape, b.shape); - return ENV.engine.runKernel(function (backend) { return backend.lessEqual(a, b); }, { a: a, b: b }); - }; - CompareOps.lessEqualStrict = function (a, b) { - assertShapesMatch(a.shape, b.shape, 'Error in lessEqualStrict: '); - return a.lessEqual(b); - }; - CompareOps.greater = function (a, b) { - assertArgumentsAreTensors({ a: a, b: b }, 'greater'); - assertTypesMatch(a, b); - assertAndGetBroadcastShape(a.shape, b.shape); - return ENV.engine.runKernel(function (backend) { return backend.greater(a, b); }, { a: a, b: b }); - }; - CompareOps.greaterStrict = function (a, b) { - assertShapesMatch(a.shape, b.shape, 'Error in greaterStrict: '); - return a.greater(b); - }; - CompareOps.greaterEqual = function (a, b) { - assertArgumentsAreTensors({ a: a, b: b }, 'greaterEqual'); - assertTypesMatch(a, b); - assertAndGetBroadcastShape(a.shape, b.shape); - return ENV.engine.runKernel(function (backend) { return backend.greaterEqual(a, b); }, { a: a, b: b }); - }; - CompareOps.greaterEqualStrict = function (a, b) { - assertShapesMatch(a.shape, b.shape, 'Error in greaterEqualStrict: '); - return a.greaterEqual(b); - }; - __decorate$5([ - doc({ heading: 'Operations', subheading: 'Logical' }), - operation - ], CompareOps, "notEqual", null); - __decorate$5([ - operation - ], CompareOps, "notEqualStrict", null); - __decorate$5([ - doc({ heading: 'Operations', subheading: 'Logical' }), - operation - ], CompareOps, "less", null); - __decorate$5([ - operation - ], CompareOps, "lessStrict", null); - __decorate$5([ - doc({ heading: 'Operations', subheading: 'Logical' }), - operation - ], CompareOps, "equal", null); - __decorate$5([ - operation - ], CompareOps, "equalStrict", null); - __decorate$5([ - doc({ heading: 'Operations', subheading: 'Logical' }), - operation - ], CompareOps, "lessEqual", null); - __decorate$5([ - operation - ], CompareOps, "lessEqualStrict", null); - __decorate$5([ - doc({ heading: 'Operations', subheading: 'Logical' }), - operation - ], CompareOps, "greater", null); - __decorate$5([ - operation - ], CompareOps, "greaterStrict", null); - __decorate$5([ - doc({ heading: 'Operations', subheading: 'Logical' }), - operation - ], CompareOps, "greaterEqual", null); - __decorate$5([ - operation - ], CompareOps, "greaterEqualStrict", null); - return CompareOps; - }()); - - function computePool2DInfo(inShape, filterSize, strides, pad, roundingMode, dataFormat) { - if (dataFormat === void 0) { dataFormat = 'channelsLast'; } - var _a = parseTupleParam(filterSize), filterHeight = _a[0], filterWidth = _a[1]; - var filterShape; - if (dataFormat === 'channelsLast') { - filterShape = [filterHeight, filterWidth, inShape[3], inShape[3]]; - } - else if (dataFormat === 'channelsFirst') { - filterShape = [filterHeight, filterWidth, inShape[1], inShape[1]]; - } - else { - throw new Error("Unknown dataFormat " + dataFormat); - } - var dilations = 1; - return computeConv2DInfo(inShape, filterShape, strides, dilations, pad, roundingMode, false, dataFormat); - } - function computeConv2DInfo(inShape, filterShape, strides, dilations, pad, roundingMode, depthwise, dataFormat) { - if (depthwise === void 0) { depthwise = false; } - if (dataFormat === void 0) { dataFormat = 'channelsLast'; } - var _a = [-1, -1, -1, -1], batchSize = _a[0], inHeight = _a[1], inWidth = _a[2], inChannels = _a[3]; - if (dataFormat === 'channelsLast') { - batchSize = inShape[0], inHeight = inShape[1], inWidth = inShape[2], inChannels = inShape[3]; - } - else if (dataFormat === 'channelsFirst') { - batchSize = inShape[0], inChannels = inShape[1], inHeight = inShape[2], inWidth = inShape[3]; - } - else { - throw new Error("Unknown dataFormat " + dataFormat); - } - var filterHeight = filterShape[0], filterWidth = filterShape[1], filterChannels = filterShape[3]; - var _b = parseTupleParam(strides), strideHeight = _b[0], strideWidth = _b[1]; - var _c = parseTupleParam(dilations), dilationHeight = _c[0], dilationWidth = _c[1]; - var effectiveFilterHeight = getEffectiveFilterSize(filterHeight, dilationHeight); - var effectiveFilterWidth = getEffectiveFilterSize(filterWidth, dilationWidth); - var _d = getPadAndOutInfo(pad, inHeight, inWidth, strideHeight, strideWidth, effectiveFilterHeight, effectiveFilterWidth, roundingMode), padInfo = _d.padInfo, outHeight = _d.outHeight, outWidth = _d.outWidth; - var outChannels = depthwise ? filterChannels * inChannels : filterChannels; - var outShape; - if (dataFormat === 'channelsFirst') { - outShape = [batchSize, outChannels, outHeight, outWidth]; - } - else if (dataFormat === 'channelsLast') { - outShape = [batchSize, outHeight, outWidth, outChannels]; - } - return { - batchSize: batchSize, - dataFormat: dataFormat, - inHeight: inHeight, - inWidth: inWidth, - inChannels: inChannels, - outHeight: outHeight, - outWidth: outWidth, - outChannels: outChannels, - padInfo: padInfo, - strideHeight: strideHeight, - strideWidth: strideWidth, - filterHeight: filterHeight, - filterWidth: filterWidth, - dilationHeight: dilationHeight, - dilationWidth: dilationWidth, - inShape: inShape, - outShape: outShape, - filterShape: filterShape - }; - } - function computeOutputShape3D(inShape, fieldSize, outDepth, stride, zeroPad, roundingMode) { - if (zeroPad == null) { - zeroPad = computeDefaultPad(inShape, fieldSize, stride); - } - var inputRows = inShape[0]; - var inputCols = inShape[1]; - var outputRows = conditionalRound((inputRows - fieldSize + 2 * zeroPad) / stride + 1, roundingMode); - assert(isInt(outputRows), "The output # of rows (" + outputRows + ") must be an integer. Change the " + - "stride and/or zero pad parameters"); - var outputCols = conditionalRound((inputCols - fieldSize + 2 * zeroPad) / stride + 1, roundingMode); - assert(isInt(outputCols), "The output # of columns (" + outputCols + ") must be an integer. Change " + - "the stride and/or zero pad parameters"); - return [outputRows, outputCols, outDepth]; - } - function computeDefaultPad(inputShape, fieldSize, stride, dilation) { - if (dilation === void 0) { dilation = 1; } - var effectiveFieldSize = getEffectiveFilterSize(fieldSize, dilation); - return Math.floor((inputShape[0] * (stride - 1) - stride + effectiveFieldSize) / 2); - } - function parseTupleParam(param) { - return typeof param === 'number' ? [param, param] : param; - } - function getEffectiveFilterSize(filterSize, dilation) { - if (dilation <= 1) { - return filterSize; - } - return filterSize + (filterSize - 1) * (dilation - 1); - } - function getPadAndOutInfo(pad, inHeight, inWidth, strideHeight, strideWidth, filterHeight, filterWidth, roundingMode) { - var padInfo; - var outHeight; - var outWidth; - if (typeof pad === 'number') { - var padType = (pad === 0) ? 'VALID' : 'NUMBER'; - padInfo = { top: pad, bottom: pad, left: pad, right: pad, type: padType }; - var outShape = computeOutputShape3D([inHeight, inWidth, 1], filterHeight, 1, strideHeight, pad, roundingMode); - outHeight = outShape[0]; - outWidth = outShape[1]; - } - else if (pad === 'same') { - outHeight = Math.ceil(inHeight / strideHeight); - outWidth = Math.ceil(inWidth / strideWidth); - var padAlongHeight = (outHeight - 1) * strideHeight + filterHeight - inHeight; - var padAlongWidth = (outWidth - 1) * strideWidth + filterWidth - inWidth; - var top_1 = Math.floor(padAlongHeight / 2); - var bottom = padAlongHeight - top_1; - var left = Math.floor(padAlongWidth / 2); - var right = padAlongWidth - left; - padInfo = { top: top_1, bottom: bottom, left: left, right: right, type: 'SAME' }; - } - else if (pad === 'valid') { - padInfo = { top: 0, bottom: 0, left: 0, right: 0, type: 'VALID' }; - outHeight = Math.ceil((inHeight - filterHeight + 1) / strideHeight); - outWidth = Math.ceil((inWidth - filterWidth + 1) / strideWidth); - } - else { - throw Error("Unknown padding parameter: " + pad); - } - return { padInfo: padInfo, outHeight: outHeight, outWidth: outWidth }; - } - function conditionalRound(value, roundingMode) { - if (!roundingMode) { - return value; - } - switch (roundingMode) { - case 'round': - return Math.round(value); - case 'ceil': - return Math.ceil(value); - case 'floor': - return Math.floor(value); - default: - throw new Error("Unknown roundingMode " + roundingMode); - } - } - - var __decorate$6 = (undefined && undefined.__decorate) || function (decorators, target, key, desc) { - var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; - if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); - else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; - return c > 3 && r && Object.defineProperty(target, key, r), r; - }; - var ConvOps = (function () { - function ConvOps() { - } - ConvOps.conv1d = function (x, filter, stride, pad, dataFormat, dilation, dimRoundingMode) { - if (dataFormat === void 0) { dataFormat = 'NWC'; } - if (dilation === void 0) { dilation = 1; } - assertArgumentsAreTensors({ x: x, filter: filter }, 'conv1d'); - var x3D = x; - var reshapedTo3D = false; - if (x.rank === 2) { - reshapedTo3D = true; - x3D = x.as3D(1, x.shape[0], x.shape[1]); - } - assert(x3D.rank === 3, "Error in conv1d: input must be rank 3, but got rank " + x3D.rank + "."); - assert(filter.rank === 3, "Error in conv1d: filter must be rank 3, but got rank " + - (filter.rank + ".")); - if (dimRoundingMode != null) { - assert(isInt(pad), "Error in conv1d: pad must be an integer when using, " + - ("dimRoundingMode " + dimRoundingMode + " but got pad " + pad + ".")); - } - assert(x3D.shape[2] === filter.shape[1], "Error in conv1d: depth of input (" + x3D.shape[2] + ") must match " + - ("input depth for filter " + filter.shape[1] + ".")); - assert(eitherStridesOrDilationsAreOne(stride, dilation), 'Error in conv1D: Either stride or dilation must be 1.' + - ("Got stride " + stride + " and dilation '" + dilation + "'")); - assert(dataFormat === 'NWC', "Error in conv1d: got dataFormat of " + dataFormat + " but only NWC is currently supported."); - var filter4D = filter.as4D(1, filter.shape[0], filter.shape[1], filter.shape[2]); - var input4D = x3D.as4D(x3D.shape[0], 1, x3D.shape[1], x3D.shape[2]); - var strides = [1, stride]; - var dilations = [1, dilation]; - var conv2dDataFormat = 'NHWC'; - var res = ConvOps.conv2d(input4D, filter4D, strides, pad, conv2dDataFormat, dilations, dimRoundingMode); - if (reshapedTo3D) { - return res.as2D(res.shape[2], res.shape[3]); - } - return res.as3D(res.shape[0], res.shape[2], res.shape[3]); - }; - ConvOps.conv2d = function (x, filter, strides, pad, dataFormat, dilations, dimRoundingMode) { - if (dataFormat === void 0) { dataFormat = 'NHWC'; } - if (dilations === void 0) { dilations = [1, 1]; } - assertArgumentsAreTensors({ x: x, filter: filter }, 'conv2d'); - var x4D = x; - var reshapedTo4D = false; - if (x.rank === 3) { - reshapedTo4D = true; - x4D = x.as4D(1, x.shape[0], x.shape[1], x.shape[2]); - } - assert(x4D.rank === 4, "Error in conv2d: input must be rank 4, but got rank " + x4D.rank + "."); - assert(filter.rank === 4, "Error in conv2d: filter must be rank 4, but got rank " + - (filter.rank + ".")); - if (dimRoundingMode != null) { - assert(isInt(pad), "Error in conv2d: pad must be an integer when using, " + - ("dimRoundingMode " + dimRoundingMode + " but got pad " + pad + ".")); - } - assert(x4D.shape[3] === filter.shape[2], "Error in conv2d: depth of input (" + x4D.shape[3] + ") must match " + - ("input depth for filter " + filter.shape[2] + ".")); - assert(eitherStridesOrDilationsAreOne(strides, dilations), 'Error in conv2D: Either strides or dilations must be 1.' + - ("Got strides " + strides + " and dilations '" + dilations + "'")); - assert(dataFormat === 'NHWC', "Error in conv2d: got dataFormat of " + dataFormat + " but only NHWC is currently supported."); - var convInfo = computeConv2DInfo(x4D.shape, filter.shape, strides, dilations, pad, dimRoundingMode); - var grad = function (dy) { - assert(tupleValuesAreOne(dilations), 'Error in gradient of conv2D: dilation rates greater than 1 are not' + - ("yet supported in gradients. Got dilations '" + dilations + "'")); - return { - x: function () { return ConvOps.conv2dDerInput(x4D.shape, dy, filter, strides, pad); }, - filter: function () { - return ConvOps.conv2dDerFilter(x4D, dy, filter.shape, strides, pad); - } - }; - }; - var res = ENV.engine.runKernel(function (backend) { return backend.conv2d(x4D, filter, convInfo); }, { x: x4D, filter: filter }, grad); - if (reshapedTo4D) { - return res.as3D(res.shape[1], res.shape[2], res.shape[3]); - } - return res; - }; - ConvOps.conv2dDerInput = function (xShape, dy, filter, strides, pad, dimRoundingMode) { - assertArgumentsAreTensors({ dy: dy, filter: filter }, 'conv2dDerInput'); - assert(xShape.length === dy.rank, "Length of inShape " + - ("(" + xShape.length + ") and rank of dy (" + dy.rank + ") must match")); - var xShape4D = xShape; - var dy4D = dy; - var reshapedTo4D = false; - if (dy.rank === 3) { - reshapedTo4D = true; - dy4D = dy.as4D(1, dy.shape[0], dy.shape[1], dy.shape[2]); - xShape4D = [1, xShape[0], xShape[1], xShape[2]]; - } - var inDepth = xShape4D[3]; - var outDepth = dy4D.shape[3]; - assert(xShape4D.length === 4, "Error in conv2dDerInput: inShape must be length 4, but got length " + - (xShape4D.length + ".")); - assert(dy4D.rank === 4, "Error in conv2dDerInput: dy must be rank 4, but got " + - ("rank " + dy4D.rank)); - assert(filter.rank === 4, "Error in conv2dDerInput: filter must be rank 4, but got " + - ("rank " + filter.rank)); - assert(inDepth === filter.shape[2], "Error in conv2dDerInput: depth of input (" + inDepth + ") must " + - ("match input depth for filter " + filter.shape[2] + ".")); - assert(outDepth === filter.shape[3], "Error in conv2dDerInput: depth of output (" + outDepth + ") must" + - ("match output depth for filter " + filter.shape[3] + ".")); - if (dimRoundingMode != null) { - assert(isInt(pad), "Error in conv2dDerInput: pad must be an integer when using, " + - ("dimRoundingMode " + dimRoundingMode + " but got pad " + pad + ".")); - } - var dilations = 1; - var convInfo = computeConv2DInfo(xShape4D, filter.shape, strides, dilations, pad, dimRoundingMode); - var res = ENV.engine.runKernel(function (backend) { return backend.conv2dDerInput(dy4D, filter, convInfo); }, { dy4D: dy4D }); - if (reshapedTo4D) { - return res.as3D(res.shape[1], res.shape[2], res.shape[3]); - } - return res; - }; - ConvOps.conv2dDerFilter = function (x, dy, filterShape, strides, pad, dimRoundingMode) { - assertArgumentsAreTensors({ x: x, dy: dy }, 'conv2dDerFilter'); - var x4D = x; - if (x.rank === 3) { - x4D = x.as4D(1, x.shape[0], x.shape[1], x.shape[2]); - } - var dy4D = dy; - if (dy4D.rank === 3) { - dy4D = dy.as4D(1, dy.shape[0], dy.shape[1], dy.shape[2]); - } - assert(x4D.rank === 4, "Error in conv2dDerFilter: input must be rank 4, but got shape " + - (x4D.shape + ".")); - assert(dy4D.rank === 4, "Error in conv2dDerFilter: dy must be rank 4, but got shape " + - (dy4D.shape + ".")); - assert(filterShape.length === 4, "Error in conv2dDerFilter: filterShape must be length 4, but got " + - (filterShape + ".")); - assert(x4D.shape[3] === filterShape[2], "Error in conv2dDerFilter: depth of input " + x4D.shape[3] + ") must " + - ("match input depth in filter (" + filterShape[2] + ".")); - assert(dy4D.shape[3] === filterShape[3], "Error in conv2dDerFilter: depth of dy (" + dy4D.shape[3] + ") must " + - ("match output depth for filter (" + filterShape[3] + ").")); - if (dimRoundingMode != null) { - assert(isInt(pad), "Error in conv2dDerFilter: pad must be an integer when using, " + - ("dimRoundingMode " + dimRoundingMode + " but got pad " + pad + ".")); - } - var dilations = 1; - var convInfo = computeConv2DInfo(x4D.shape, filterShape, strides, dilations, pad, dimRoundingMode); - return ENV.engine.runKernel(function (backend) { return backend.conv2dDerFilter(x4D, dy4D, convInfo); }, { x4D: x4D, dy4D: dy4D }); - }; - ConvOps.conv2dTranspose = function (x, filter, outputShape, strides, pad, dimRoundingMode) { - assertArgumentsAreTensors({ x: x, filter: filter }, 'conv2dTranspose'); - return ConvOps.conv2dDerInput(outputShape, x, filter, strides, pad, dimRoundingMode); - }; - ConvOps.depthwiseConv2d = function (x, filter, strides, pad, dataFormat, dilations, dimRoundingMode) { - if (dataFormat === void 0) { dataFormat = 'NHWC'; } - if (dilations === void 0) { dilations = [1, 1]; } - assertArgumentsAreTensors({ x: x, filter: filter }, 'depthwiseConv2d'); - var x4D = x; - var reshapedTo4D = false; - if (x.rank === 3) { - reshapedTo4D = true; - x4D = x.as4D(1, x.shape[0], x.shape[1], x.shape[2]); - } - assert(x4D.rank === 4, "Error in depthwiseConv2D: input must be rank 4, but got " + - ("rank " + x4D.rank + ".")); - assert(filter.rank === 4, "Error in depthwiseConv2D: filter must be rank 4, but got rank " + - (filter.rank + ".")); - assert(x4D.shape[3] === filter.shape[2], "Error in depthwiseConv2D: number of input channels " + - ("(" + x4D.shape[3] + ") must match the inChannels dimension in ") + - ("filter " + filter.shape[2] + ".")); - if (dilations == null) { - dilations = [1, 1]; - } - assert(eitherStridesOrDilationsAreOne(strides, dilations), 'Error in depthwiseConv2d: Either strides or dilations must be 1.' + - ("Got strides " + strides + " and dilations '" + dilations + "'")); - if (dimRoundingMode != null) { - assert(isInt(pad), "Error in depthwiseConv2D: pad must be an integer when using, " + - ("dimRoundingMode " + dimRoundingMode + " but got pad " + pad + ".")); - } - var convInfo = computeConv2DInfo(x4D.shape, filter.shape, strides, dilations, pad, dimRoundingMode, true); - var res = ENV.engine.runKernel(function (backend) { return backend.depthwiseConv2D(x4D, filter, convInfo); }, { x4D: x4D, filter: filter }); - if (reshapedTo4D) { - return res.as3D(res.shape[1], res.shape[2], res.shape[3]); - } - return res; - }; - ConvOps.separableConv2d = function (x, depthwiseFilter, pointwiseFilter, strides, pad, dilation, dataFormat) { - if (dilation === void 0) { dilation = [1, 1]; } - if (dataFormat === void 0) { dataFormat = 'NHWC'; } - assertArgumentsAreTensors({ x: x, depthwiseFilter: depthwiseFilter, pointwiseFilter: pointwiseFilter }, 'separableConv2d'); - var x4D = x; - var reshapedTo4D = false; - if (x.rank === 3) { - reshapedTo4D = true; - x4D = x.as4D(1, x.shape[0], x.shape[1], x.shape[2]); - } - if (dataFormat === 'NCHW') { - throw new Error('separableConv2d currently does not support dataFormat NCHW; only ' + - 'NHWC is supported'); - } - assert(x4D.rank === 4, "Error in separableConv2d: input must be rank 4, but got " + - ("rank " + x4D.rank + ".")); - assert(depthwiseFilter.rank === 4, "Error in separableConv2d: depthwise filter must be rank 4, but got " + - ("rank " + depthwiseFilter.rank + ".")); - assert(pointwiseFilter.rank === 4, "Error in separableConv2d: pointwise filter must be rank 4, but got " + - ("rank " + depthwiseFilter.rank + ".")); - assert(pointwiseFilter.shape[0] === 1, "Error in separableConv2d: the first dimension of pointwise filter " + - (" must be 1, but got " + pointwiseFilter.shape[0] + ".")); - assert(pointwiseFilter.shape[1] === 1, "Error in separableConv2d: the second dimension of pointwise filter " + - (" must be 1, but got " + pointwiseFilter.shape[1] + ".")); - var inChannels = depthwiseFilter.shape[2]; - var channelMultiplier = depthwiseFilter.shape[3]; - assert(pointwiseFilter.shape[2] === inChannels * channelMultiplier, "Error in separableConv2d: the third dimension of pointwise filter " + - ("must be " + inChannels * channelMultiplier + ", ") + - ("but got " + pointwiseFilter.shape[2] + ".")); - var depthwise = ConvOps.depthwiseConv2d(x4D, depthwiseFilter, strides, pad, dataFormat, dilation); - var pointwiseStride = 1; - var res = ConvOps.conv2d(depthwise, pointwiseFilter, pointwiseStride, 'valid', dataFormat); - if (reshapedTo4D) { - return res.as3D(res.shape[1], res.shape[2], res.shape[3]); - } - return res; - }; - __decorate$6([ - doc({ heading: 'Operations', subheading: 'Convolution' }), - operation - ], ConvOps, "conv1d", null); - __decorate$6([ - doc({ heading: 'Operations', subheading: 'Convolution' }), - operation - ], ConvOps, "conv2d", null); - __decorate$6([ - operation - ], ConvOps, "conv2dDerInput", null); - __decorate$6([ - operation - ], ConvOps, "conv2dDerFilter", null); - __decorate$6([ - doc({ heading: 'Operations', subheading: 'Convolution' }), - operation - ], ConvOps, "conv2dTranspose", null); - __decorate$6([ - doc({ heading: 'Operations', subheading: 'Convolution' }), - operation - ], ConvOps, "depthwiseConv2d", null); - __decorate$6([ - doc({ heading: 'Operations', subheading: 'Convolution' }), - operation - ], ConvOps, "separableConv2d", null); - return ConvOps; - }()); - function parseTupleParam$1(param) { - return typeof param === 'number' ? [param, param] : param; - } - function tupleValuesAreOne(param) { - var _a = parseTupleParam$1(param), dimA = _a[0], dimB = _a[1]; - return dimA === 1 && dimB === 1; - } - function eitherStridesOrDilationsAreOne(strides, dilations) { - return tupleValuesAreOne(strides) || tupleValuesAreOne(dilations); - } - - var __decorate$7 = (undefined && undefined.__decorate) || function (decorators, target, key, desc) { - var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; - if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); - else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; - return c > 3 && r && Object.defineProperty(target, key, r), r; - }; - var ImageOps = (function () { - function ImageOps() { - } - ImageOps.resizeBilinear = function (images, size, alignCorners) { - if (alignCorners === void 0) { alignCorners = false; } - assertArgumentsAreTensors({ images: images }, 'resizeBilinear'); - assert(images.rank === 3 || images.rank === 4, "Error in resizeBilinear: x must be rank 3 or 4, but got " + - ("rank " + images.rank + ".")); - assert(size.length === 2, "Error in resizeBilinear: new shape must 2D, but got shape " + - (size + ".")); - var batchImages = images; - var reshapedTo4D = false; - if (images.rank === 3) { - reshapedTo4D = true; - batchImages = - images.as4D(1, images.shape[0], images.shape[1], images.shape[2]); - } - var newHeight = size[0], newWidth = size[1]; - var forward = function (backend, save) { - return backend.resizeBilinear(batchImages, newHeight, newWidth, alignCorners); - }; - var backward = function (dy, saved) { - return { - batchImages: function () { return ENV.engine.runKernel(function (backend) { - return backend.resizeBilinearBackprop(dy, batchImages, alignCorners); - }, {}); } - }; - }; - var res = ENV.engine.runKernel(forward, { batchImages: batchImages }, backward); - if (reshapedTo4D) { - return res.as3D(res.shape[1], res.shape[2], res.shape[3]); - } - return res; - }; - ImageOps.resizeNearestNeighbor = function (images, size, alignCorners) { - if (alignCorners === void 0) { alignCorners = false; } - assertArgumentsAreTensors({ images: images }, 'resizeNearestNeighbor'); - assert(images.rank === 3 || images.rank === 4, "Error in resizeNearestNeighbor: x must be rank 3 or 4, but got " + - ("rank " + images.rank + ".")); - assert(size.length === 2, "Error in resizeNearestNeighbor: new shape must 2D, but got shape " + - (size + ".")); - assert(images.dtype === 'float32' || images.dtype === 'int32', '`images` must have `int32` or `float32` as dtype'); - var batchImages = images; - var reshapedTo4D = false; - if (images.rank === 3) { - reshapedTo4D = true; - batchImages = - images.as4D(1, images.shape[0], images.shape[1], images.shape[2]); - } - var newHeight = size[0], newWidth = size[1]; - var res = ENV.engine.runKernel(function (backend) { return backend.resizeNearestNeighbor(batchImages, newHeight, newWidth, alignCorners); }, { batchImages: batchImages }); - if (reshapedTo4D) { - return res.as3D(res.shape[1], res.shape[2], res.shape[3]); - } - return res; - }; - __decorate$7([ - doc({ heading: 'Operations', subheading: 'Images', namespace: 'image' }), - operation - ], ImageOps, "resizeBilinear", null); - __decorate$7([ - doc({ heading: 'Operations', subheading: 'Images', namespace: 'image' }), - operation - ], ImageOps, "resizeNearestNeighbor", null); - return ImageOps; - }()); - - var __decorate$8 = (undefined && undefined.__decorate) || function (decorators, target, key, desc) { - var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; - if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); - else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; - return c > 3 && r && Object.defineProperty(target, key, r), r; - }; - var Tracking = (function () { - function Tracking() { - } - Tracking.tidy = function (nameOrFn, fn, gradMode) { - if (gradMode === void 0) { gradMode = false; } - var name = null; - if (fn == null) { - if (typeof nameOrFn !== 'function') { - throw new Error('Please provide a function to tidy()'); - } - fn = nameOrFn; - } - else { - if (typeof nameOrFn !== 'string' && !(nameOrFn instanceof String)) { - throw new Error('When calling with two arguments, the first argument ' + - 'to tidy() must be a string'); - } - if (typeof fn !== 'function') { - throw new Error('When calling with two arguments, the 2nd argument ' + - 'to tidy() must be a function'); - } - name = nameOrFn; - } - ENV.engine.startScope(name, gradMode); - var result = fn(); - if (result instanceof Promise) { - console.error('Cannot return a Promise inside of tidy.'); - } - ENV.engine.endScope(result, gradMode); - return result; - }; - Tracking.dispose = function (container) { - var tensors = extractTensorsFromAny(container); - tensors.forEach(function (tensor) { return tensor.dispose(); }); - }; - Tracking.keep = function (result) { - return ENV.engine.keep(result); - }; - Tracking.time = function (f) { - return ENV.engine.time(f); - }; - __decorate$8([ - doc({ heading: 'Performance', subheading: 'Memory' }) - ], Tracking, "tidy", null); - __decorate$8([ - doc({ heading: 'Performance', subheading: 'Memory' }) - ], Tracking, "keep", null); - __decorate$8([ - doc({ heading: 'Performance', subheading: 'Timing' }) - ], Tracking, "time", null); - return Tracking; - }()); - - var __decorate$9 = (undefined && undefined.__decorate) || function (decorators, target, key, desc) { - var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; - if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); - else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; - return c > 3 && r && Object.defineProperty(target, key, r), r; - }; - var LinalgOps = (function () { - function LinalgOps() { - } - LinalgOps.gramSchmidt = function (xs) { - var inputIsTensor2D; - if (Array.isArray(xs)) { - inputIsTensor2D = false; - assert(xs != null && xs.length > 0, 'Gram-Schmidt process: input must not be null, undefined, or empty'); - var dim = xs[0].shape[0]; - for (var i = 1; i < xs.length; ++i) { - assert(xs[i].shape[0] === dim, 'Gram-Schmidt: Non-unique lengths found in the input vectors: ' + - ("(" + xs[i].shape[0] + " vs. " + dim + ")")); - } - } - else { - inputIsTensor2D = true; - xs = split(xs, xs.shape[0], 0).map(function (x) { return squeeze(x, [0]); }); - } - assert(xs.length <= xs[0].shape[0], "Gram-Schmidt: Number of vectors (" + xs.length + ") exceeds " + - ("number of dimensions (" + xs[0].shape[0] + ").")); - var ys = []; - var xs1d = xs; - var _loop_1 = function (i) { - ys.push(Tracking.tidy(function () { - var x = xs1d[i]; - if (i > 0) { - for (var j = 0; j < i; ++j) { - var proj = sum(ys[j].mulStrict(x)).mul(ys[j]); - x = x.sub(proj); - } - } - return x.div(norm(x, 'euclidean')); - })); - }; - for (var i = 0; i < xs.length; ++i) { - _loop_1(i); - } - if (inputIsTensor2D) { - return stack(ys, 0); - } - else { - return ys; - } - }; - __decorate$9([ - doc({ heading: 'Operations', subheading: 'Linear Algebra' }), - operation - ], LinalgOps, "gramSchmidt", null); - return LinalgOps; - }()); - - var __decorate$a = (undefined && undefined.__decorate) || function (decorators, target, key, desc) { - var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; - if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); - else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; - return c > 3 && r && Object.defineProperty(target, key, r), r; - }; - var LogicalOps = (function () { - function LogicalOps() { - } - LogicalOps.logicalNot = function (x) { - assertArgumentsAreTensors({ x: x }, 'logicalNot'); - assert(x.dtype === 'bool', 'Error Array must be of type bool.'); - return ENV.engine.runKernel(function (backend) { return backend.logicalNot(x); }, { x: x }); - }; - LogicalOps.logicalAnd = function (a, b) { - assertArgumentsAreTensors({ a: a, b: b }, 'logicalAnd'); - assert(a.dtype === 'bool' && b.dtype === 'bool', 'Error Array must be of type bool.'); - assertAndGetBroadcastShape(a.shape, b.shape); - return ENV.engine.runKernel(function (backend) { return backend.logicalAnd(a, b); }, { a: a, b: b }); - }; - LogicalOps.logicalOr = function (a, b) { - assertArgumentsAreTensors({ a: a, b: b }, 'logicalOr'); - assert(a.dtype === 'bool' && b.dtype === 'bool', 'Error Array must be of type bool.'); - assertAndGetBroadcastShape(a.shape, b.shape); - return ENV.engine.runKernel(function (backend) { return backend.logicalOr(a, b); }, { a: a, b: b }); - }; - LogicalOps.logicalXor = function (a, b) { - assertArgumentsAreTensors({ a: a, b: b }, 'logicalXor'); - assert(a.dtype === 'bool' && b.dtype === 'bool', 'Error Array must be of type bool.'); - assertAndGetBroadcastShape(a.shape, b.shape); - return LogicalOps.logicalOr(a, b).logicalAnd(LogicalOps.logicalAnd(a, b).logicalNot()); - }; - LogicalOps.where = function (condition, a, b) { - assertArgumentsAreTensors({ condition: condition, a: a, b: b }, 'where'); - assert(condition.dtype === 'bool' || a.dtype === 'bool' || b.dtype === 'bool', 'Error Array must be of type bool.'); - assertShapesMatch(a.shape, b.shape, 'Error in where: '); - if (condition.rank === 1) { - assert(condition.shape[0] === a.shape[0], 'The first dimension of `a` must match the size of `condition`.'); - } - else { - assertShapesMatch(condition.shape, b.shape, 'Error in where: '); - } - var dtype = upcastType(a.dtype, b.dtype); - return ENV.engine.runKernel(function (backend) { return backend.where(condition, a, b, dtype); }, { condition: condition, a: a, b: b }); - }; - __decorate$a([ - doc({ heading: 'Operations', subheading: 'Logical' }), - operation - ], LogicalOps, "logicalNot", null); - __decorate$a([ - doc({ heading: 'Operations', subheading: 'Logical' }), - operation - ], LogicalOps, "logicalAnd", null); - __decorate$a([ - doc({ heading: 'Operations', subheading: 'Logical' }), - operation - ], LogicalOps, "logicalOr", null); - __decorate$a([ - doc({ heading: 'Operations', subheading: 'Logical' }), - operation - ], LogicalOps, "logicalXor", null); - __decorate$a([ - doc({ heading: 'Operations', subheading: 'Logical' }), - operation - ], LogicalOps, "where", null); - return LogicalOps; - }()); - - var __decorate$b = (undefined && undefined.__decorate) || function (decorators, target, key, desc) { - var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; - if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); - else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; - return c > 3 && r && Object.defineProperty(target, key, r), r; - }; - var Reduction; - (function (Reduction) { - Reduction[Reduction["NONE"] = 0] = "NONE"; - Reduction[Reduction["MEAN"] = 1] = "MEAN"; - Reduction[Reduction["SUM"] = 2] = "SUM"; - Reduction[Reduction["SUM_BY_NONZERO_WEIGHTS"] = 3] = "SUM_BY_NONZERO_WEIGHTS"; - })(Reduction || (Reduction = {})); - var LossOps = (function () { - function LossOps() { - } - LossOps.computeWeightedLoss = function (losses$$1, weights, reduction) { - if (reduction === void 0) { reduction = Reduction.SUM_BY_NONZERO_WEIGHTS; } - assertArgumentsAreTensors({ losses: losses$$1 }, 'computeWeightedLoss'); - if (weights != null) { - assertArgumentsAreTensors({ weights: weights }, 'computeWeightedLoss'); - } - var weightedLoss = (weights == null) ? losses$$1 : losses$$1.mul(weights); - if (reduction === Reduction.NONE) { - return weightedLoss; - } - if (reduction === Reduction.SUM) { - return weightedLoss.sum(); - } - if (reduction === Reduction.MEAN) { - return (weights == null) ? weightedLoss.mean() : - weightedLoss.sum().div(weights.sum()); - } - if (reduction === Reduction.SUM_BY_NONZERO_WEIGHTS) { - if (weights == null) { - return weightedLoss.sum().div(scalar(losses$$1.size)); - } - else { - var numNonZeros = weights.notEqual(scalar(0)).sum().toFloat(); - return weightedLoss.sum().div(numNonZeros); - } - } - throw Error("Unknown reduction: " + reduction); - }; - LossOps.absoluteDifference = function (labels, predictions, weights, reduction) { - if (reduction === void 0) { reduction = Reduction.SUM_BY_NONZERO_WEIGHTS; } - assertArgumentsAreTensors({ labels: labels, predictions: predictions }, 'absoluteDifference'); - if (weights != null) { - assertArgumentsAreTensors({ weights: weights }, 'absoluteDifference'); - } - assertShapesMatch(labels.shape, predictions.shape, 'Error in absoluteDifference: '); - var losses$$1 = labels.sub(predictions).abs(); - return LossOps.computeWeightedLoss(losses$$1, weights, reduction); - }; - LossOps.meanSquaredError = function (labels, predictions, weights, reduction) { - if (reduction === void 0) { reduction = Reduction.SUM_BY_NONZERO_WEIGHTS; } - assertArgumentsAreTensors({ labels: labels, predictions: predictions }, 'meanSquaredError'); - if (weights != null) { - assertArgumentsAreTensors({ weights: weights }, 'meanSquaredError'); - } - assertShapesMatch(labels.shape, predictions.shape, 'Error in meanSquaredError: '); - var losses$$1 = labels.squaredDifference(predictions); - return LossOps.computeWeightedLoss(losses$$1, weights, reduction); - }; - LossOps.cosineDistance = function (labels, predictions, axis, weights, reduction) { - if (reduction === void 0) { reduction = Reduction.SUM_BY_NONZERO_WEIGHTS; } - assertArgumentsAreTensors({ labels: labels, predictions: predictions }, 'cosineDistance'); - if (weights != null) { - assertArgumentsAreTensors({ weights: weights }, 'cosineDistance'); - } - assertShapesMatch(labels.shape, predictions.shape, 'Error in cosineDistance: '); - var one = scalar(1); - var losses$$1 = one.sub(labels.mul(predictions).sum(axis, true)); - return LossOps.computeWeightedLoss(losses$$1, weights, reduction); - }; - LossOps.hingeLoss = function (labels, predictions, weights, reduction) { - if (reduction === void 0) { reduction = Reduction.SUM_BY_NONZERO_WEIGHTS; } - assertArgumentsAreTensors({ labels: labels, predictions: predictions }, 'hingeLoss'); - if (weights != null) { - assertArgumentsAreTensors({ weights: weights }, 'hingeLoss'); - } - assertShapesMatch(labels.shape, predictions.shape, 'Error in hingeLoss: '); - var one = scalar(1); - labels = scalar(2).mul(labels).sub(one); - var losses$$1 = one.sub(labels.mul(predictions)).relu(); - return LossOps.computeWeightedLoss(losses$$1, weights, reduction); - }; - LossOps.logLoss = function (labels, predictions, weights, epsilon, reduction) { - if (epsilon === void 0) { epsilon = 1e-7; } - if (reduction === void 0) { reduction = Reduction.SUM_BY_NONZERO_WEIGHTS; } - assertArgumentsAreTensors({ labels: labels, predictions: predictions }, 'logLoss'); - if (weights != null) { - assertArgumentsAreTensors({ weights: weights }, 'logLoss'); - } - assertShapesMatch(labels.shape, predictions.shape, 'Error in logLoss: '); - var one = scalar(1); - var epsilonScalar = scalar(epsilon); - var losses$$1 = labels.mul(predictions.add(epsilonScalar).log()) - .neg() - .sub(one.sub(labels).mul(one.sub(predictions).add(epsilonScalar).log())); - return LossOps.computeWeightedLoss(losses$$1, weights, reduction); - }; - __decorate$b([ - doc({ heading: 'Training', subheading: 'Losses', namespace: 'losses' }), - operation - ], LossOps, "computeWeightedLoss", null); - __decorate$b([ - doc({ heading: 'Training', subheading: 'Losses', namespace: 'losses' }), - operation - ], LossOps, "absoluteDifference", null); - __decorate$b([ - doc({ heading: 'Training', subheading: 'Losses', namespace: 'losses' }), - operation - ], LossOps, "meanSquaredError", null); - __decorate$b([ - doc({ heading: 'Training', subheading: 'Losses', namespace: 'losses' }), - operation - ], LossOps, "cosineDistance", null); - __decorate$b([ - doc({ heading: 'Training', subheading: 'Losses', namespace: 'losses' }), - operation - ], LossOps, "hingeLoss", null); - __decorate$b([ - doc({ heading: 'Training', subheading: 'Losses', namespace: 'losses' }), - operation - ], LossOps, "logLoss", null); - return LossOps; - }()); - - var __decorate$c = (undefined && undefined.__decorate) || function (decorators, target, key, desc) { - var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; - if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); - else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; - return c > 3 && r && Object.defineProperty(target, key, r), r; - }; - var LRNOps = (function () { - function LRNOps() { - } - LRNOps.localResponseNormalization = function (x, radius, bias, alpha, beta) { - if (radius === void 0) { radius = 5; } - if (bias === void 0) { bias = 1; } - if (alpha === void 0) { alpha = 1; } - if (beta === void 0) { beta = 0.5; } - assertArgumentsAreTensors({ x: x }, 'localResponseNormalization'); - assert(x.rank === 4 || x.rank === 3, "Error in localResponseNormalization: x must be rank 3 or 4 but got\n rank " + x.rank + "."); - assert(isInt(radius), "Error in localResponseNormalization3D: radius must be an integer\n but got radius " + radius + "."); - var x4D = x; - var reshapedTo4D = false; - if (x.rank === 3) { - reshapedTo4D = true; - x4D = x.as4D(1, x.shape[0], x.shape[1], x.shape[2]); - } - var res = ENV.engine.runKernel(function (backend) { return backend.localResponseNormalization4D(x4D, radius, bias, alpha, beta); }, { x4D: x4D }); - if (reshapedTo4D) { - return res.as3D(res.shape[1], res.shape[2], res.shape[3]); - } - else { - return res; - } - }; - __decorate$c([ - doc({ heading: 'Operations', subheading: 'Normalization' }), - operation - ], LRNOps, "localResponseNormalization", null); - return LRNOps; - }()); - - var __decorate$d = (undefined && undefined.__decorate) || function (decorators, target, key, desc) { - var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; - if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); - else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; - return c > 3 && r && Object.defineProperty(target, key, r), r; - }; - var LSTMOps = (function () { - function LSTMOps() { - } - LSTMOps.multiRNNCell = function (lstmCells, data, c, h) { - assertArgumentsAreTensors({ data: data, c: c, h: h }, 'multiRNNCell'); - var input = data; - var newStates = []; - for (var i = 0; i < lstmCells.length; i++) { - var output = lstmCells[i](input, c[i], h[i]); - newStates.push(output[0]); - newStates.push(output[1]); - input = output[1]; - } - var newC = []; - var newH = []; - for (var i = 0; i < newStates.length; i += 2) { - newC.push(newStates[i]); - newH.push(newStates[i + 1]); - } - return [newC, newH]; - }; - LSTMOps.basicLSTMCell = function (forgetBias, lstmKernel, lstmBias, data, c, h) { - assertArgumentsAreTensors({ forgetBias: forgetBias, lstmKernel: lstmKernel, lstmBias: lstmBias, data: data, c: c, h: h }, 'basicLSTMCell'); - var combined = data.concat(h, 1); - var weighted = combined.matMul(lstmKernel); - var res = weighted.add(lstmBias); - var batchSize = res.shape[0]; - var sliceCols = res.shape[1] / 4; - var sliceSize = [batchSize, sliceCols]; - var i = res.slice([0, 0], sliceSize); - var j = res.slice([0, sliceCols], sliceSize); - var f = res.slice([0, sliceCols * 2], sliceSize); - var o = res.slice([0, sliceCols * 3], sliceSize); - var newC = i.sigmoid().mulStrict(j.tanh()).addStrict(c.mulStrict(forgetBias.add(f).sigmoid())); - var newH = newC.tanh().mulStrict(o.sigmoid()); - return [newC, newH]; - }; - __decorate$d([ - doc({ heading: 'Operations', subheading: 'RNN' }), - operation - ], LSTMOps, "multiRNNCell", null); - __decorate$d([ - doc({ heading: 'Operations', subheading: 'RNN' }), - operation - ], LSTMOps, "basicLSTMCell", null); - return LSTMOps; - }()); - - var __decorate$e = (undefined && undefined.__decorate) || function (decorators, target, key, desc) { - var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; - if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); - else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; - return c > 3 && r && Object.defineProperty(target, key, r), r; - }; - var MatmulOps = (function () { - function MatmulOps() { - } - MatmulOps.matMul = function (a, b, transposeA, transposeB) { - if (transposeA === void 0) { transposeA = false; } - if (transposeB === void 0) { transposeB = false; } - assertArgumentsAreTensors({ a: a, b: b }, 'matMul'); - var innerShapeA = transposeA ? a.shape[0] : a.shape[1]; - var innerShapeB = transposeB ? b.shape[1] : b.shape[0]; - assert(a.rank === 2 && b.rank === 2, "Error in matMul: inputs must be rank 2, got ranks " + a.rank + - (" and " + b.rank + ".")); - assert(innerShapeA === innerShapeB, "Error in matMul: inner shapes (" + innerShapeA + ") and (" + - (innerShapeB + ") of Tensors with shapes " + a.shape + " and ") + - (b.shape + " and transposeA=" + transposeA) + - (" and transposeB=" + transposeB + " must match.")); - var grad = function (dy) { - if (!transposeA && !transposeB) { - return { - a: function () { return dy.matMul(b.toFloat(), false, true); }, - b: function () { return a.toFloat().matMul(dy, true, false); } - }; - } - else if (!transposeA && transposeB) { - return { - a: function () { return dy.matMul(b.toFloat(), false, false); }, - b: function () { return dy.matMul(a.toFloat(), true, false); } - }; - } - else if (transposeA && !transposeB) { - return { - a: function () { return b.toFloat().matMul(dy, false, true); }, - b: function () { return a.toFloat().matMul(dy, false, false); } - }; - } - else { - return { - a: function () { return b.toFloat().matMul(dy, true, true); }, - b: function () { return dy.matMul(a.toFloat(), true, true); } - }; - } - }; - return ENV.engine.runKernel(function (backend) { return backend.matMul(a, b, transposeA, transposeB); }, { a: a, b: b }, grad); - }; - MatmulOps.vectorTimesMatrix = function (v, matrix) { - assert(v.rank === 1, "Error in vectorTimesMatrix: first input must be rank 1, but got " + - ("rank " + v.rank + ".")); - assert(matrix.rank === 2, "Error in vectorTimesMatrix: second input must be rank 2, but got " + - ("rank " + matrix.rank + ".")); - assert(v.size === matrix.shape[0], "Error in vectorTimesMatrix: size of vector (" + v.size + ") " + - ("must match first dimension of matrix (" + matrix.shape[0] + ")")); - return v.as2D(1, -1).matMul(matrix).as1D(); - }; - MatmulOps.matrixTimesVector = function (matrix, v) { - assert(v.rank === 1, "Error in matrixTimesVector: second input must rank 1, but got " + - ("rank " + v.rank + ".")); - assert(matrix.rank === 2, "Error in matrixTimesVector: first input must be a rank 2, but got " + - ("rank " + matrix.rank + ".")); - assert(v.size === matrix.shape[1], "Error in matrixTimesVector: size of first rank 1 input " + v.size + " " + - "must match inner dimension of second rank 2 input, but got " + - ("shape " + matrix.shape + ".")); - return matrix.matMul(v.as2D(-1, 1)).as1D(); - }; - MatmulOps.dotProduct = function (v1, v2) { - assert(v1.rank === 1 && v2.rank === 1, "Error in dotProduct: inputs must be rank 1, but got ranks " + - (v1.rank + " and " + v2.rank + ".")); - assert(v1.size === v2.size, "Error in dotProduct: size of inputs (" + v1.size + ") and (" + - (v2.size + ") must match.")); - return v1.as2D(1, -1).matMul(v2.as2D(-1, 1)).asScalar(); - }; - MatmulOps.outerProduct = function (v1, v2) { - assert(v1.rank === 1 && v2.rank === 1, "Error in outerProduct: inputs must be rank 1, but got ranks " + - (v1.rank + " and " + v2.rank + ".")); - return v1.as2D(-1, 1).matMul(v2.as2D(1, -1)); - }; - __decorate$e([ - doc({ heading: 'Operations', subheading: 'Matrices' }), - operation - ], MatmulOps, "matMul", null); - __decorate$e([ - operation - ], MatmulOps, "vectorTimesMatrix", null); - __decorate$e([ - operation - ], MatmulOps, "matrixTimesVector", null); - __decorate$e([ - operation - ], MatmulOps, "dotProduct", null); - __decorate$e([ - doc({ heading: 'Operations', subheading: 'Matrices' }), - operation - ], MatmulOps, "outerProduct", null); - return MatmulOps; - }()); - - var __decorate$f = (undefined && undefined.__decorate) || function (decorators, target, key, desc) { - var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; - if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); - else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; - return c > 3 && r && Object.defineProperty(target, key, r), r; - }; - var MovingAverageOps = (function () { - function MovingAverageOps() { - } - MovingAverageOps.movingAverage = function (v, x, decay, step, zeroDebias) { - if (zeroDebias === void 0) { zeroDebias = true; } - assertArgumentsAreTensors({ v: v, x: x }, 'movingAverage'); - assertTypesMatch(v, x); - assert(arraysEqual(v.shape, x.shape), 'Shape mismatch in v and x'); - var one = ArrayOps.scalar(1); - decay = typeof decay === 'number' ? ArrayOps.scalar(decay) : decay; - var oneMinusDecay = one.sub(decay); - var update = x.sub(v).mul(oneMinusDecay); - if (zeroDebias) { - assert(step != null, 'When using zeroDebias: true, step is required.'); - step = typeof step === 'number' ? ArrayOps.scalar(step) : step; - update = update.div(one.sub(BinaryOps.pow(decay, step))); - } - return v.add(update); - }; - __decorate$f([ - doc({ heading: 'Operations', subheading: 'Moving Average' }), - operation - ], MovingAverageOps, "movingAverage", null); - return MovingAverageOps; - }()); - - var __decorate$g = (undefined && undefined.__decorate) || function (decorators, target, key, desc) { - var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; - if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); - else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; - return c > 3 && r && Object.defineProperty(target, key, r), r; - }; - var NormOps = (function () { - function NormOps() { - } - NormOps.norm = function (x, ord, axis, keepDims) { - if (ord === void 0) { ord = 'euclidean'; } - if (axis === void 0) { axis = null; } - if (keepDims === void 0) { keepDims = false; } - assertArgumentsAreTensors({ x: x }, 'norm'); - var norm$$1 = normImpl(x, ord, axis); - var keepDimsShape = norm$$1.shape; - if (keepDims) { - var axes = parseAxisParam(axis, x.shape); - keepDimsShape = expandShapeToKeepDim(norm$$1.shape, axes); - } - return norm$$1.reshape(keepDimsShape); - }; - __decorate$g([ - doc({ heading: 'Operations', subheading: 'Matrices' }), - operation - ], NormOps, "norm", null); - return NormOps; - }()); - function normImpl(x, p, axis) { - if (axis === void 0) { axis = null; } - if (x.rank === 0) { - return x.abs(); - } - if (x.rank !== 1 && axis === null) { - return normImpl(x.reshape([-1]), p, axis); - } - if (x.rank === 1 || typeof axis === 'number' || - axis instanceof Array && axis.length === 1) { - if (p === 1) { - return x.abs().sum(axis); - } - if (p === Infinity) { - return x.abs().max(axis); - } - if (p === -Infinity) { - return x.abs().min(axis); - } - if (p === 'euclidean' || p === 2) { - return x.abs().pow(scalar(2, 'int32')).sum(axis).sqrt(); - } - throw new Error("Error in norm: invalid ord value: " + p); - } - if (axis instanceof Array && axis.length === 2) { - if (p === 1) { - return x.abs().sum(axis[0]).max(axis[1] - 1); - } - if (p === Infinity) { - return x.abs().sum(axis[1]).max(axis[0]); - } - if (p === -Infinity) { - return x.abs().sum(axis[1]).min(axis[0]); - } - if (p === 'fro' || p === 'euclidean') { - return x.square().sum(axis).sqrt(); - } - throw new Error("Error in norm: invalid ord value: " + p); - } - throw new Error("Error in norm: invalid axis: " + axis); - } - - var __decorate$h = (undefined && undefined.__decorate) || function (decorators, target, key, desc) { - var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; - if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); - else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; - return c > 3 && r && Object.defineProperty(target, key, r), r; - }; - var PoolOps = (function () { - function PoolOps() { - } - PoolOps.maxPool = function (x, filterSize, strides, pad, dimRoundingMode) { - assertArgumentsAreTensors({ x: x }, 'maxPool'); - var x4D = x; - var reshapedTo4D = false; - if (x.rank === 3) { - reshapedTo4D = true; - x4D = x.as4D(1, x.shape[0], x.shape[1], x.shape[2]); - } - assert(x4D.rank === 4, "Error in maxPool: input must be rank 4 but got rank " + x4D.rank + "."); - if (dimRoundingMode != null) { - assert(isInt(pad), "Error in maxPool: pad must be an integer when using, " + - ("dimRoundingMode " + dimRoundingMode + " but got pad " + pad + ".")); - } - var convInfo = computePool2DInfo(x4D.shape, filterSize, strides, pad, dimRoundingMode); - var grad = function (dy, saved) { - var y4D = saved[0]; - return { - x: function () { return PoolOps.maxPoolBackprop(dy, x4D, y4D, filterSize, strides, pad); } - }; - }; - var res = ENV.engine.runKernel(function (backend, save) { return save(backend.maxPool(x4D, convInfo)); }, { x: x4D }, grad); - if (reshapedTo4D) { - return res.as3D(res.shape[1], res.shape[2], res.shape[3]); - } - return res; - }; - PoolOps.maxPoolBackprop = function (dy, input, output, filterSize, strides, pad, dimRoundingMode) { - assertArgumentsAreTensors({ dy: dy, input: input, output: output }, 'maxPoolBackprop'); - assert(input.rank === dy.rank, "Rank of input (" + input.rank + ") does not match rank of dy (" + dy.rank + ")"); - assert(dy.rank === 4, "Error in maxPoolBackprop: dy must be rank 4 but got rank " + - (dy.rank + ".")); - assert(input.rank === 4, "Error in maxPoolBackprop: input must be rank 4 but got rank " + - (input.rank + ".")); - if (dimRoundingMode != null) { - assert(isInt(pad), "Error in maxPoolBackprop: pad must be an integer when using, " + - ("dimRoundingMode " + dimRoundingMode + " but got pad " + pad + ".")); - } - var convInfo = computePool2DInfo(input.shape, filterSize, strides, pad, dimRoundingMode); - var res = ENV.engine.runKernel(function (backend) { return backend.maxPoolBackprop(dy, input, output, convInfo); }, { dy: dy, input: input }); - return res; - }; - PoolOps.avgPool = function (x, filterSize, strides, pad, dimRoundingMode) { - assertArgumentsAreTensors({ x: x }, 'avgPool'); - assert(x.dtype === 'float32', 'The input dtype to avgPool must be float32'); - var x4D = x; - var reshapedTo4D = false; - if (x.rank === 3) { - reshapedTo4D = true; - x4D = x.as4D(1, x.shape[0], x.shape[1], x.shape[2]); - } - assert(x4D.rank === 4, "Error in avgPool: x must be rank 4 but got rank " + x4D.rank + "."); - if (dimRoundingMode != null) { - assert(isInt(pad), "Error in avgPool: pad must be an integer when using, " + - ("dimRoundingMode " + dimRoundingMode + " but got pad " + pad + ".")); - } - var convInfo = computePool2DInfo(x4D.shape, filterSize, strides, pad); - var grad = function (dy) { - return { - x: function () { return PoolOps.avgPoolBackprop(dy, x4D, filterSize, strides, pad); } - }; - }; - var res = ENV.engine.runKernel(function (backend) { return backend.avgPool(x4D, convInfo); }, { x: x4D }, grad); - res = res.cast(x.dtype); - if (reshapedTo4D) { - return res.as3D(res.shape[1], res.shape[2], res.shape[3]); - } - return res; - }; - PoolOps.avgPoolBackprop = function (dy, input, filterSize, strides, pad) { - assertArgumentsAreTensors({ dy: dy, input: input }, 'avgPoolBackprop'); - assert(input.rank === dy.rank, "Rank of input (" + input.rank + ") does not match rank of dy (" + dy.rank + ")"); - var input4D = input; - var dy4D = dy; - var reshapedTo4D = false; - if (input.rank === 3) { - reshapedTo4D = true; - input4D = input.as4D(1, input.shape[0], input.shape[1], input.shape[2]); - dy4D = dy.as4D(1, dy.shape[0], dy.shape[1], dy.shape[2]); - } - assert(dy4D.rank === 4, "Error in avgPoolBackprop: dy must be rank 4 but got rank " + - (dy4D.rank + ".")); - assert(input4D.rank === 4, "Error in avgPoolBackprop: input must be rank 4 but got rank " + - (input4D.rank + ".")); - var convInfo = computePool2DInfo(input4D.shape, filterSize, strides, pad); - var res = ENV.engine.runKernel(function (backend) { return backend.avgPoolBackprop(dy4D, input4D, convInfo); }, { dy4D: dy4D, input4D: input4D }); - if (reshapedTo4D) { - return res.as3D(res.shape[1], res.shape[2], res.shape[3]); - } - return res; - }; - __decorate$h([ - doc({ heading: 'Operations', subheading: 'Convolution' }), - operation - ], PoolOps, "maxPool", null); - __decorate$h([ - operation - ], PoolOps, "maxPoolBackprop", null); - __decorate$h([ - doc({ heading: 'Operations', subheading: 'Convolution' }), - operation - ], PoolOps, "avgPool", null); - __decorate$h([ - operation - ], PoolOps, "avgPoolBackprop", null); - return PoolOps; - }()); - - var __decorate$i = (undefined && undefined.__decorate) || function (decorators, target, key, desc) { - var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; - if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); - else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; - return c > 3 && r && Object.defineProperty(target, key, r), r; - }; - var ReverseOps = (function () { - function ReverseOps() { - } - ReverseOps.reverse1d = function (x) { - assert(x.rank === 1, "Error in reverse1D: x must be rank 1 but got\n rank " + x.rank + "."); - return ReverseOps.reverse(x, 0); - }; - ReverseOps.reverse2d = function (x, axis) { - assert(x.rank === 2, "Error in reverse2D: x must be rank 2 but got\n rank " + x.rank + "."); - return ReverseOps.reverse(x, axis); - }; - ReverseOps.reverse3d = function (x, axis) { - assert(x.rank === 3, "Error in reverse3D: x must be rank 3 but got\n rank " + x.rank + "."); - return ReverseOps.reverse(x, axis); - }; - ReverseOps.reverse4d = function (x, axis) { - assert(x.rank === 4, "Error in reverse4D: x must be rank 4 but got\n rank " + x.rank + "."); - return ReverseOps.reverse(x, axis); - }; - ReverseOps.reverse = function (x, axis) { - assertArgumentsAreTensors({ x: x }, 'reverse'); - if (x.rank === 0) { - return x.clone(); - } - var axes = parseAxisParam(axis, x.shape); - var grad = function (dy) { - return { x: function () { return dy.reverse(axes); } }; - }; - var res = ENV.engine.runKernel(function (backend) { return backend.reverse(x, axes); }, { x: x }, grad); - return res.reshapeAs(x); - }; - __decorate$i([ - doc({ heading: 'Tensors', subheading: 'Slicing and Joining' }), - operation - ], ReverseOps, "reverse", null); - return ReverseOps; - }()); - - function assertParamsValid(input, begin, size) { - assert(input.rank === begin.length, "Error in slice" + input.rank + "D: Length of begin " + begin + " must " + - ("match the rank of the array (" + input.rank + ").")); - assert(input.rank === size.length, "Error in slice" + input.rank + "D: Length of size " + size + " must " + - ("match the rank of the array (" + input.rank + ").")); - for (var i = 0; i < input.rank; ++i) { - assert(begin[i] + size[i] <= input.shape[i], "Error in slice" + input.rank + "D: begin[" + i + "] + size[" + i + "] " + - ("(" + (begin[i] + size[i]) + ") would overflow input.shape[" + i + "] (" + input.shape[i] + ")")); - } - } - function getStridedSlicedInfo(shape, begin, end, strides, beginMask, endMask) { - if (beginMask === void 0) { beginMask = 0; } - if (endMask === void 0) { endMask = 0; } - var startIndex = []; - var endIndex = []; - for (var i = 0; i < shape.length; i++) { - startIndex[i] = startForAxis(beginMask, begin, strides, shape, i); - endIndex[i] = stopForAxis(endMask, end, strides, shape, i); - } - var size = new Array(shape.length).fill(0); - size = size.map(function (d, i) { - var count = 0; - for (var start = startIndex[i]; !(strides[i] > 0 ? start >= endIndex[i] : start <= endIndex[i]); start += strides[i]) { - count += 1; - } - return count; - }); - return [startIndex, size]; - } - function startForAxis(beginMask, startIndices, strides, inputShape, axis) { - var start = startIndices[axis]; - if (beginMask & 1 << axis) { - if (strides[axis] > 0) { - start = Number.MIN_SAFE_INTEGER; - } - else { - start = Number.MAX_SAFE_INTEGER; - } - } - var axisSize = inputShape[axis]; - if (start < 0) { - start += axisSize; - } - start = clamp(0, start, axisSize - 1); - return start; - } - function stopForAxis(endMask, stopIndices, strides, inputShape, axis) { - var stop = stopIndices[axis]; - if (endMask & (1 << axis)) { - if (strides[axis] > 0) { - stop = Number.MAX_SAFE_INTEGER; - } - else { - stop = Number.MIN_SAFE_INTEGER; - } - } - var axisSize = inputShape[axis]; - if (stop < 0) { - stop += axisSize; - } - if (strides[axis] > 0) { - stop = clamp(0, stop, axisSize); - } - else { - stop = clamp(-1, stop, axisSize - 1); - } - return stop; - } - - var __decorate$j = (undefined && undefined.__decorate) || function (decorators, target, key, desc) { - var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; - if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); - else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; - return c > 3 && r && Object.defineProperty(target, key, r), r; - }; - var SliceOps = (function () { - function SliceOps() { - } - SliceOps.slice1d = function (x, begin, size) { - assert(x.rank === 1, "slice1d expects a rank-1 tensor, but got a rank-" + x.rank + " tensor"); - return SliceOps.slice(x, [begin], [size]); - }; - SliceOps.slice2d = function (x, begin, size) { - assert(x.rank === 2, "slice1d expects a rank-2 tensor, but got a rank-" + x.rank + " tensor"); - return SliceOps.slice(x, begin, size); - }; - SliceOps.slice3d = function (x, begin, size) { - assert(x.rank === 3, "slice1d expects a rank-3 tensor, but got a rank-" + x.rank + " tensor"); - return SliceOps.slice(x, begin, size); - }; - SliceOps.slice4d = function (x, begin, size) { - assert(x.rank === 4, "slice1d expects a rank-4 tensor, but got a rank-" + x.rank + " tensor"); - return SliceOps.slice(x, begin, size); - }; - SliceOps.slice = function (x, begin, size) { - assertArgumentsAreTensors({ x: x }, 'slice'); - if (x.rank === 0) { - throw new Error('Slicing scalar is not possible'); - } - var begin_; - if (typeof begin === 'number') { - begin_ = [begin].concat(new Array(x.rank - 1).fill(0)); - } - else if (begin.length < x.rank) { - begin_ = begin.concat(new Array(x.rank - begin.length).fill(0)); - } - else { - begin_ = begin; - } - var size_; - if (size == null) { - size_ = new Array(x.rank).fill(-1); - } - else if (typeof size === 'number') { - size_ = [size].concat(new Array(x.rank - 1).fill(-1)); - } - else if (size.length < x.rank) { - size_ = size.concat(new Array(x.rank - size.length).fill(-1)); - } - else { - size_ = size; - } - size_ = size_.map(function (d, i) { - if (d >= 0) { - return d; - } - else { - assert(d === -1, 'Bad value in size'); - return x.shape[i] - begin_[i]; - } - }); - assertParamsValid(x, begin_, size_); - var inputShape = x.shape; - var grad = function (dy) { - var paddings = []; - for (var i = 0; i < dy.rank; i++) { - paddings.push([begin_[i], inputShape[i] - begin_[i] - size_[i]]); - } - return { x: function () { return dy.pad(paddings); } }; - }; - return ENV.engine.runKernel(function (backend) { return backend.slice(x, begin_, size_); }, { x: x }, grad); - }; - __decorate$j([ - doc({ heading: 'Tensors', subheading: 'Slicing and Joining' }), - operation - ], SliceOps, "slice", null); - return SliceOps; - }()); - - var __decorate$k = (undefined && undefined.__decorate) || function (decorators, target, key, desc) { - var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; - if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); - else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; - return c > 3 && r && Object.defineProperty(target, key, r), r; - }; - var SoftmaxOps = (function () { - function SoftmaxOps() { - } - SoftmaxOps.softmax = function (logits, dim) { - if (dim === void 0) { dim = -1; } - assertArgumentsAreTensors({ logits: logits }, 'softmax'); - if (dim === -1) { - dim = logits.rank - 1; - } - if (dim !== logits.rank - 1) { - throw Error('Softmax along a non-last dimension is not yet supported. ' + - ("Logits was rank " + logits.rank + " and dim was " + dim)); - } - var customOp = customGrad(function (logits) { - var keepDims = true; - var lse = logits.logSumExp([dim], keepDims); - var logResult = logits.toFloat().sub(lse); - var y = logResult.exp(); - var gradFunc = function (dy) { - var dyTimesY = dy.mul(y); - var keepDims = true; - return dyTimesY.sub(dyTimesY.sum([dim], keepDims).mul(y)); - }; - return { value: y, gradFunc: gradFunc }; - }); - return customOp(logits); - }; - SoftmaxOps.softmaxCrossEntropy = function (labels, logits, dim) { - if (dim === void 0) { dim = -1; } - assertArgumentsAreTensors({ labels: labels, logits: logits }, 'softmaxCrossEntropy'); - assertShapesMatch(labels.shape, logits.shape, 'Error in softmaxCrossEntropy: '); - if (dim === -1) { - dim = logits.rank - 1; - } - if (dim !== logits.rank - 1) { - throw Error("Softmax cross entropy along a non-last dimension is not yet " + - ("supported. Labels / logits was rank " + logits.rank + " ") + - ("and dim was " + dim)); - } - var customOp = customGrad(function (labels, logits) { - var predictedProbs = logits.softmax(dim); - var costVector = scalar(1e-5).add(predictedProbs).log().mul(labels).neg(); - var value = costVector.sum([dim]); - var gradFunc = function (dy) { - var dyShape = expandShapeToKeepDim(dy.shape, [dim]); - return [ - dy.reshape(dyShape).mul(labels.toFloat().sub(predictedProbs)), - dy.reshape(dyShape).mul(predictedProbs.sub(labels.toFloat())), - ]; - }; - return { value: value, gradFunc: gradFunc }; - }); - return customOp(labels, logits); - }; - __decorate$k([ - doc({ heading: 'Operations', subheading: 'Normalization' }), - operation - ], SoftmaxOps, "softmax", null); - __decorate$k([ - doc({ heading: 'Training', subheading: 'Losses', namespace: 'losses' }), - operation - ], SoftmaxOps, "softmaxCrossEntropy", null); - return SoftmaxOps; - }()); - - var __decorate$l = (undefined && undefined.__decorate) || function (decorators, target, key, desc) { - var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; - if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); - else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; - return c > 3 && r && Object.defineProperty(target, key, r), r; - }; - var StridedSliceOps = (function () { - function StridedSliceOps() { - } - StridedSliceOps.stridedSlice = function (x, begin, end, strides, beginMask, endMask) { - if (beginMask === void 0) { beginMask = 0; } - if (endMask === void 0) { endMask = 0; } - assertArgumentsAreTensors({ x: x }, 'stridedSlice'); - return ENV.engine.runKernel(function (backend) { return backend.stridedSlice(x, begin, end, strides, beginMask, endMask); }, { x: x }); - }; - __decorate$l([ - doc({ heading: 'Operations', subheading: 'Slicing and Joining' }), - operation - ], StridedSliceOps, "stridedSlice", null); - return StridedSliceOps; - }()); - - var __decorate$m = (undefined && undefined.__decorate) || function (decorators, target, key, desc) { - var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; - if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); - else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; - return c > 3 && r && Object.defineProperty(target, key, r), r; - }; - var TransposeOps = (function () { - function TransposeOps() { - } - TransposeOps.transpose = function (x, perm) { - assertArgumentsAreTensors({ x: x }, 'transpose'); - if (perm == null) { - perm = x.shape.map(function (s, i) { return i; }).reverse(); - } - assert(x.rank === perm.length, "Error in transpose: rank of input " + x.rank + " " + - ("must match length of perm " + perm + ".")); - perm.forEach(function (axis) { - assert(axis >= 0 && axis < x.rank, "All entries in 'perm' must be between 0 and " + (x.rank - 1) + - (" but got " + perm)); - }); - if (x.rank <= 1) { - return x.clone(); - } - var der = function (dy) { - var undoPerm = getUndoAxesPermutation(perm); - return { x: function () { return dy.transpose(undoPerm); } }; - }; - return ENV.engine.runKernel(function (backend) { return backend.transpose(x, perm); }, { x: x }, der); - }; - __decorate$m([ - doc({ heading: 'Operations', subheading: 'Matrices' }), - operation - ], TransposeOps, "transpose", null); - return TransposeOps; - }()); - - var SELU_SCALEALPHA = 1.7580993408473768599402175208123; - var SELU_SCALE = 1.0507009873554804934193349852946; - - var __decorate$n = (undefined && undefined.__decorate) || function (decorators, target, key, desc) { - var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; - if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); - else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; - return c > 3 && r && Object.defineProperty(target, key, r), r; - }; - var UnaryOps = (function () { - function UnaryOps() { - } - UnaryOps.neg = function (x) { - assertArgumentsAreTensors({ x: x }, 'neg'); - var grad = function (dy) { - return { x: function () { return dy.neg(); } }; - }; - return ENV.engine.runKernel(function (backend) { return backend.neg(x); }, { x: x }, grad); - }; - UnaryOps.ceil = function (x) { - assertArgumentsAreTensors({ x: x }, 'ceil'); - var grad = function (dy) { - return { x: function () { return zerosLike(dy); } }; - }; - return ENV.engine.runKernel(function (backend) { return backend.ceil(x); }, { x: x }, grad); - }; - UnaryOps.floor = function (x) { - assertArgumentsAreTensors({ x: x }, 'floor'); - var grad = function (dy) { - return { x: function () { return zerosLike(dy); } }; - }; - return ENV.engine.runKernel(function (backend) { return backend.floor(x); }, { x: x }, grad); - }; - UnaryOps.sign = function (x) { - assertArgumentsAreTensors({ x: x }, 'sign'); - var grad = function (dy) { - return { x: function () { return zerosLike(dy); } }; - }; - return ENV.engine.runKernel(function (backend) { return backend.sign(x); }, { x: x }, grad); - }; - UnaryOps.round = function (x) { - assertArgumentsAreTensors({ x: x }, 'round'); - var grad = function (dy) { - return { x: function () { return zerosLike(dy); } }; - }; - return ENV.engine.runKernel(function (backend) { return backend.round(x); }, { x: x }, grad); - }; - UnaryOps.exp = function (x) { - assertArgumentsAreTensors({ x: x }, 'exp'); - var bck = function (dy, saved) { - var y = saved[0]; - return { x: function () { return dy.mulStrict(y); } }; - }; - return ENV.engine.runKernel(function (backend, save) { return save(backend.exp(x)); }, { x: x }, bck); - }; - UnaryOps.expm1 = function (x) { - assertArgumentsAreTensors({ x: x }, 'expm1'); - var grad = function (dy) { - return { x: function () { return dy.mulStrict(x.exp()); } }; - }; - return ENV.engine.runKernel(function (backend) { return backend.expm1(x); }, { x: x }, grad); - }; - UnaryOps.log = function (x) { - assertArgumentsAreTensors({ x: x }, 'log'); - var grad = function (dy) { - return { x: function () { return dy.divStrict(x.toFloat()); } }; - }; - return ENV.engine.runKernel(function (backend) { return backend.log(x); }, { x: x }, grad); - }; - UnaryOps.log1p = function (x) { - assertArgumentsAreTensors({ x: x }, 'log1p'); - var grad = function (dy) { - return { x: function () { return dy.divStrict(x.add(scalar(1))); } }; - }; - return ENV.engine.runKernel(function (backend) { return backend.log1p(x); }, { x: x }, grad); - }; - UnaryOps.sqrt = function (x) { - assertArgumentsAreTensors({ x: x }, 'sqrt'); - var grad = function (dy) { - return { x: function () { return dy.divStrict(x.toFloat().sqrt().mul(scalar(2))); } }; - }; - return ENV.engine.runKernel(function (backend) { return backend.sqrt(x); }, { x: x }, grad); - }; - UnaryOps.rsqrt = function (x) { - assertArgumentsAreTensors({ x: x }, 'rsqrt'); - var grad = function (dy) { - return { - x: function () { return dy.divStrict(x.pow(scalar(1.5)).mul(scalar(2))).neg(); } - }; - }; - return ENV.engine.runKernel(function (backend) { return backend.rsqrt(x); }, { x: x }, grad); - }; - UnaryOps.square = function (x) { - assertArgumentsAreTensors({ x: x }, 'square'); - var grad = function (dy) { - return { x: function () { return dy.mulStrict(x.toFloat().mul(scalar(2))); } }; - }; - return ENV.engine.runKernel(function (backend) { return backend.square(x); }, { x: x }, grad); - }; - UnaryOps.reciprocal = function (x) { - assertArgumentsAreTensors({ x: x }, 'reciprocal'); - var grad = function (dy) { - return { x: function () { return dy.divStrict(x.square().neg()); } }; - }; - return ENV.engine.runKernel(function (backend) { return backend.reciprocal(x); }, { x: x }, grad); - }; - UnaryOps.abs = function (x) { - assertArgumentsAreTensors({ x: x }, 'abs'); - var grad = function (dy) { - return { x: function () { return dy.mulStrict(x.toFloat().step(-1)); } }; - }; - return ENV.engine.runKernel(function (backend) { return backend.abs(x); }, { x: x }, grad); - }; - UnaryOps.clipByValue = function (x, clipValueMin, clipValueMax) { - assertArgumentsAreTensors({ x: x }, 'clipByValue'); - assert((clipValueMin <= clipValueMax), "Error in clip: min (" + clipValueMin + ") must be " + - ("less than or equal to max (" + clipValueMax + ").")); - var grad = function (dy) { - return { - x: function () { return dy.where(x.greater(scalar(clipValueMin)) - .logicalAnd(x.less(scalar(clipValueMax))), zerosLike(dy)); }, - }; - }; - return ENV.engine.runKernel(function (backend) { return backend.clip(x, clipValueMin, clipValueMax); }, { x: x }, grad); - }; - UnaryOps.relu = function (x) { - assertArgumentsAreTensors({ x: x }, 'relu'); - if (x.dtype === 'bool') { - return x.toInt(); - } - var grad = function (dy) { - var stepRes = x.step(); - return { x: function () { return dy.mulStrict(stepRes.toFloat()); } }; - }; - return ENV.engine.runKernel(function (backend) { return backend.relu(x); }, { x: x }, grad); - }; - UnaryOps.elu = function (x) { - assertArgumentsAreTensors({ x: x }, 'elu'); - var grad = function (dy, saved) { - var y = saved[0]; - return { - x: function () { - return ENV.engine.runKernel(function (backend) { return backend.eluDer(dy, y); }, { dy: dy, y: y }); - } - }; - }; - return ENV.engine.runKernel(function (backend, save) { return save(backend.elu(x)); }, { x: x }, grad); - }; - UnaryOps.selu = function (x) { - assertArgumentsAreTensors({ x: x }, 'selu'); - var grad = function (dy) { - return { - x: function () { - var mask = x.greater(scalar(0)); - var scaleAlpha = scalar(SELU_SCALEALPHA); - var scale = scalar(SELU_SCALE); - var greaterThanZeroDer = dy.mul(scale); - var lessEqualZeroDer = dy.mul(scaleAlpha).mul(x.toFloat().exp()); - return where(mask, greaterThanZeroDer, lessEqualZeroDer); - } - }; - }; - return ENV.engine.runKernel(function (backend) { return backend.selu(x); }, { x: x }, grad); - }; - UnaryOps.leakyRelu = function (x, alpha) { - if (alpha === void 0) { alpha = 0.2; } - assertArgumentsAreTensors({ x: x }, 'leakyRelu'); - return maximum(scalar(alpha).mul(x), x); - }; - UnaryOps.prelu = function (x, alpha) { - assertArgumentsAreTensors({ x: x, alpha: alpha }, 'prelu'); - var zero = scalar(0); - return maximum(zero, x).add(alpha.mul(minimum(zero, x))); - }; - UnaryOps.sigmoid = function (x) { - assertArgumentsAreTensors({ x: x }, 'sigmoid'); - var grad = function (dy, saved) { - var y = saved[0]; - return { x: function () { return dy.mulStrict(y.mul(scalar(1).sub(y))); } }; - }; - return ENV.engine.runKernel(function (backend, save) { return save(backend.sigmoid(x)); }, { x: x }, grad); - }; - UnaryOps.logSigmoid = function (x) { - assertArgumentsAreTensors({ x: x }, 'logSigmoid'); - var grad = function (dy) { - return { x: function () { return dy.mulStrict(x.neg().sigmoid()); } }; - }; - return ENV.engine.runKernel(function (backend) { return backend.softplus(x.neg()).neg(); }, { x: x }, grad); - }; - UnaryOps.softplus = function (x) { - assertArgumentsAreTensors({ x: x }, 'softplus'); - var grad = function (dy) { - return { x: function () { return dy.mulStrict(x.sigmoid()); } }; - }; - return ENV.engine.runKernel(function (backend) { return backend.softplus(x); }, { x: x }, grad); - }; - UnaryOps.sin = function (x) { - assertArgumentsAreTensors({ x: x }, 'sin'); - var grad = function (dy) { - return { x: function () { return x.toFloat().cos().mulStrict(dy); } }; - }; - return ENV.engine.runKernel(function (backend) { return backend.sin(x); }, { x: x }, grad); - }; - UnaryOps.cos = function (x) { - assertArgumentsAreTensors({ x: x }, 'cos'); - var grad = function (dy) { - return { x: function () { return x.toFloat().sin().neg().mulStrict(dy); } }; - }; - return ENV.engine.runKernel(function (backend) { return backend.cos(x); }, { x: x }, grad); - }; - UnaryOps.tan = function (x) { - assertArgumentsAreTensors({ x: x }, 'tan'); - var grad = function (dy) { - return { x: function () { return dy.divStrict(x.cos().square()); } }; - }; - return ENV.engine.runKernel(function (backend) { return backend.tan(x); }, { x: x }, grad); - }; - UnaryOps.asin = function (x) { - assertArgumentsAreTensors({ x: x }, 'asin'); - var grad = function (dy) { - return { - x: function () { - return dy.divStrict(UnaryOps.sqrt(scalar(1).sub(x.toFloat().square()))); - } - }; - }; - return ENV.engine.runKernel(function (backend) { return backend.asin(x); }, { x: x }, grad); - }; - UnaryOps.acos = function (x) { - assertArgumentsAreTensors({ x: x }, 'acos'); - var grad = function (dy) { - return { - x: function () { - return dy.divStrict(UnaryOps.sqrt(scalar(1).sub(x.toFloat().square()))) - .neg(); - } - }; - }; - return ENV.engine.runKernel(function (backend) { return backend.acos(x); }, { x: x }, grad); - }; - UnaryOps.atan = function (x) { - assertArgumentsAreTensors({ x: x }, 'atan'); - var grad = function (dy) { - return { x: function () { return dy.divStrict(scalar(1).add(x.toFloat().square())); } }; - }; - return ENV.engine.runKernel(function (backend) { return backend.atan(x); }, { x: x }, grad); - }; - UnaryOps.sinh = function (x) { - assertArgumentsAreTensors({ x: x }, 'sinh'); - var grad = function (dy) { - return { x: function () { return x.toFloat().cosh().mulStrict(dy); } }; - }; - return ENV.engine.runKernel(function (backend) { return backend.sinh(x); }, { x: x }, grad); - }; - UnaryOps.cosh = function (x) { - assertArgumentsAreTensors({ x: x }, 'cosh'); - var grad = function (dy) { - return { x: function () { return x.toFloat().sinh().mulStrict(dy); } }; - }; - return ENV.engine.runKernel(function (backend) { return backend.cosh(x); }, { x: x }, grad); - }; - UnaryOps.tanh = function (x) { - assertArgumentsAreTensors({ x: x }, 'tanh'); - var grad = function (dy, saved) { - var y = saved[0]; - return { x: function () { return scalar(1).sub(y.square()).mulStrict(dy); } }; - }; - return ENV.engine.runKernel(function (backend, save) { return save(backend.tanh(x)); }, { x: x }, grad); - }; - UnaryOps.asinh = function (x) { - assertArgumentsAreTensors({ x: x }, 'asinh'); - var grad = function (dy) { - return { - x: function () { - return dy.divStrict(UnaryOps.sqrt(scalar(1).add(x.toFloat().square()))); - } - }; - }; - return ENV.engine.runKernel(function (backend) { return backend.asinh(x); }, { x: x }, grad); - }; - UnaryOps.acosh = function (x) { - assertArgumentsAreTensors({ x: x }, 'acosh'); - var grad = function (dy) { - return { - x: function () { - return dy.divStrict(UnaryOps.sqrt(x.toFloat().square().sub(scalar(1)))); - } - }; - }; - return ENV.engine.runKernel(function (backend) { return backend.acosh(x); }, { x: x }, grad); - }; - UnaryOps.atanh = function (x) { - assertArgumentsAreTensors({ x: x }, 'atanh'); - var grad = function (dy) { - return { x: function () { return dy.divStrict(scalar(1).sub(x.toFloat().square())); } }; - }; - return ENV.engine.runKernel(function (backend) { return backend.atanh(x); }, { x: x }, grad); - }; - UnaryOps.erf = function (x) { - assert(x.dtype === 'int32' || x.dtype === 'float32', 'Input dtype must be `int32` or `float32`.'); - if (x.dtype === 'int32') { - x = x.toFloat(); - } - var grad = function (dy) { - return { - x: function () { - return dy.mulStrict(scalar(2 / Math.sqrt(Math.PI)) - .mul(x.square().neg().exp())); - } - }; - }; - return ENV.engine.runKernel(function (backend) { return backend.erf(x); }, { x: x }, grad); - }; - UnaryOps.step = function (x, alpha) { - if (alpha === void 0) { alpha = 0.0; } - assertArgumentsAreTensors({ x: x }, 'step'); - var grad = function (dy) { - return { x: function () { return zerosLike(dy); } }; - }; - return ENV.engine.runKernel(function (backend) { return backend.step(x, alpha); }, { x: x }, grad); - }; - __decorate$n([ - doc({ heading: 'Operations', subheading: 'Basic math' }), - operation - ], UnaryOps, "neg", null); - __decorate$n([ - doc({ heading: 'Operations', subheading: 'Basic math' }), - operation - ], UnaryOps, "ceil", null); - __decorate$n([ - doc({ heading: 'Operations', subheading: 'Basic math' }), - operation - ], UnaryOps, "floor", null); - __decorate$n([ - doc({ heading: 'Operations', subheading: 'Basic math' }), - operation - ], UnaryOps, "sign", null); - __decorate$n([ - doc({ heading: 'Operations', subheading: 'Basic math' }), - operation - ], UnaryOps, "round", null); - __decorate$n([ - doc({ heading: 'Operations', subheading: 'Basic math' }), - operation - ], UnaryOps, "exp", null); - __decorate$n([ - doc({ heading: 'Operations', subheading: 'Basic math' }), - operation - ], UnaryOps, "expm1", null); - __decorate$n([ - doc({ heading: 'Operations', subheading: 'Basic math' }), - operation - ], UnaryOps, "log", null); - __decorate$n([ - doc({ heading: 'Operations', subheading: 'Basic math' }), - operation - ], UnaryOps, "log1p", null); - __decorate$n([ - doc({ heading: 'Operations', subheading: 'Basic math' }), - operation - ], UnaryOps, "sqrt", null); - __decorate$n([ - doc({ heading: 'Operations', subheading: 'Basic math' }), - operation - ], UnaryOps, "rsqrt", null); - __decorate$n([ - doc({ heading: 'Operations', subheading: 'Basic math' }), - operation - ], UnaryOps, "square", null); - __decorate$n([ - doc({ heading: 'Operations', subheading: 'Basic math' }), - operation - ], UnaryOps, "reciprocal", null); - __decorate$n([ - doc({ heading: 'Operations', subheading: 'Basic math' }), - operation - ], UnaryOps, "abs", null); - __decorate$n([ - doc({ heading: 'Operations', subheading: 'Basic math' }), - operation - ], UnaryOps, "clipByValue", null); - __decorate$n([ - doc({ heading: 'Operations', subheading: 'Basic math' }), - operation - ], UnaryOps, "relu", null); - __decorate$n([ - doc({ heading: 'Operations', subheading: 'Basic math' }), - operation - ], UnaryOps, "elu", null); - __decorate$n([ - doc({ heading: 'Operations', subheading: 'Basic math' }), - operation - ], UnaryOps, "selu", null); - __decorate$n([ - doc({ heading: 'Operations', subheading: 'Basic math' }), - operation - ], UnaryOps, "leakyRelu", null); - __decorate$n([ - doc({ heading: 'Operations', subheading: 'Basic math' }), - operation - ], UnaryOps, "prelu", null); - __decorate$n([ - doc({ heading: 'Operations', subheading: 'Basic math' }), - operation - ], UnaryOps, "sigmoid", null); - __decorate$n([ - doc({ heading: 'Operations', subheading: 'Basic math' }), - operation - ], UnaryOps, "logSigmoid", null); - __decorate$n([ - doc({ heading: 'Operations', subheading: 'Basic math' }), - operation - ], UnaryOps, "softplus", null); - __decorate$n([ - doc({ heading: 'Operations', subheading: 'Basic math' }), - operation - ], UnaryOps, "sin", null); - __decorate$n([ - doc({ heading: 'Operations', subheading: 'Basic math' }), - operation - ], UnaryOps, "cos", null); - __decorate$n([ - doc({ heading: 'Operations', subheading: 'Basic math' }), - operation - ], UnaryOps, "tan", null); - __decorate$n([ - doc({ heading: 'Operations', subheading: 'Basic math' }), - operation - ], UnaryOps, "asin", null); - __decorate$n([ - doc({ heading: 'Operations', subheading: 'Basic math' }), - operation - ], UnaryOps, "acos", null); - __decorate$n([ - doc({ heading: 'Operations', subheading: 'Basic math' }), - operation - ], UnaryOps, "atan", null); - __decorate$n([ - doc({ heading: 'Operations', subheading: 'Basic math' }), - operation - ], UnaryOps, "sinh", null); - __decorate$n([ - doc({ heading: 'Operations', subheading: 'Basic math' }), - operation - ], UnaryOps, "cosh", null); - __decorate$n([ - doc({ heading: 'Operations', subheading: 'Basic math' }), - operation - ], UnaryOps, "tanh", null); - __decorate$n([ - doc({ heading: 'Operations', subheading: 'Basic math' }), - operation - ], UnaryOps, "asinh", null); - __decorate$n([ - doc({ heading: 'Operations', subheading: 'Basic math' }), - operation - ], UnaryOps, "acosh", null); - __decorate$n([ - doc({ heading: 'Operations', subheading: 'Basic math' }), - operation - ], UnaryOps, "atanh", null); - __decorate$n([ - doc({ heading: 'Operations', subheading: 'Basic math' }), - operation - ], UnaryOps, "erf", null); - __decorate$n([ - doc({ heading: 'Operations', subheading: 'Basic math' }), - operation - ], UnaryOps, "step", null); - return UnaryOps; - }()); - - var batchNormalization = BatchNormOps.batchNormalization; - var batchNormalization2d = BatchNormOps.batchNormalization2d; - var batchNormalization3d = BatchNormOps.batchNormalization3d; - var batchNormalization4d = BatchNormOps.batchNormalization4d; - var concat = ConcatOps.concat; - var concat1d = ConcatOps.concat1d; - var concat2d = ConcatOps.concat2d; - var concat3d = ConcatOps.concat3d; - var concat4d = ConcatOps.concat4d; - var conv1d = ConvOps.conv1d; - var conv2d = ConvOps.conv2d; - var conv2dTranspose = ConvOps.conv2dTranspose; - var depthwiseConv2d = ConvOps.depthwiseConv2d; - var separableConv2d = ConvOps.separableConv2d; - var matMul = MatmulOps.matMul; - var matrixTimesVector = MatmulOps.matrixTimesVector; - var outerProduct = MatmulOps.outerProduct; - var vectorTimesMatrix = MatmulOps.vectorTimesMatrix; - var avgPool = PoolOps.avgPool; - var maxPool = PoolOps.maxPool; - var transpose = TransposeOps.transpose; - var reverse = ReverseOps.reverse; - var reverse1d = ReverseOps.reverse1d; - var reverse2d = ReverseOps.reverse2d; - var reverse3d = ReverseOps.reverse3d; - var reverse4d = ReverseOps.reverse4d; - var slice = SliceOps.slice; - var slice1d = SliceOps.slice1d; - var slice2d = SliceOps.slice2d; - var slice3d = SliceOps.slice3d; - var slice4d = SliceOps.slice4d; - var stridedSlice = StridedSliceOps.stridedSlice; - var argMax = ReductionOps.argMax; - var argMin = ReductionOps.argMin; - var logSumExp = ReductionOps.logSumExp; - var max = ReductionOps.max; - var mean = ReductionOps.mean; - var min = ReductionOps.min; - var moments = ReductionOps.moments; - var sum = ReductionOps.sum; - var unsortedSegmentSum = ReductionOps.unsortedSegmentSum; - var equal = CompareOps.equal; - var equalStrict = CompareOps.equalStrict; - var greater = CompareOps.greater; - var greaterStrict = CompareOps.greaterStrict; - var greaterEqual = CompareOps.greaterEqual; - var greaterEqualStrict = CompareOps.greaterEqualStrict; - var less = CompareOps.less; - var lessStrict = CompareOps.lessStrict; - var lessEqual = CompareOps.lessEqual; - var lessEqualStrict = CompareOps.lessEqualStrict; - var notEqual = CompareOps.notEqual; - var notEqualStrict = CompareOps.notEqualStrict; - var logicalNot = LogicalOps.logicalNot; - var logicalAnd = LogicalOps.logicalAnd; - var logicalOr = LogicalOps.logicalOr; - var logicalXor = LogicalOps.logicalXor; - var where = LogicalOps.where; - var abs = UnaryOps.abs; - var acos = UnaryOps.acos; - var acosh = UnaryOps.acosh; - var asin = UnaryOps.asin; - var asinh = UnaryOps.asinh; - var atan = UnaryOps.atan; - var atanh = UnaryOps.atanh; - var ceil = UnaryOps.ceil; - var clipByValue = UnaryOps.clipByValue; - var cos = UnaryOps.cos; - var cosh = UnaryOps.cosh; - var elu = UnaryOps.elu; - var exp = UnaryOps.exp; - var expm1 = UnaryOps.expm1; - var floor = UnaryOps.floor; - var sign = UnaryOps.sign; - var leakyRelu = UnaryOps.leakyRelu; - var log = UnaryOps.log; - var log1p = UnaryOps.log1p; - var logSigmoid = UnaryOps.logSigmoid; - var neg = UnaryOps.neg; - var prelu = UnaryOps.prelu; - var relu = UnaryOps.relu; - var reciprocal = UnaryOps.reciprocal; - var round = UnaryOps.round; - var selu = UnaryOps.selu; - var sigmoid = UnaryOps.sigmoid; - var sin = UnaryOps.sin; - var sinh = UnaryOps.sinh; - var softplus = UnaryOps.softplus; - var sqrt = UnaryOps.sqrt; - var rsqrt = UnaryOps.rsqrt; - var square = UnaryOps.square; - var step = UnaryOps.step; - var tan = UnaryOps.tan; - var tanh$1 = UnaryOps.tanh; - var erf = UnaryOps.erf; - var add = BinaryOps.add; - var addStrict = BinaryOps.addStrict; - var atan2 = BinaryOps.atan2; - var div = BinaryOps.div; - var divStrict = BinaryOps.divStrict; - var maximum = BinaryOps.maximum; - var maximumStrict = BinaryOps.maximumStrict; - var minimum = BinaryOps.minimum; - var minimumStrict = BinaryOps.minimumStrict; - var mod = BinaryOps.mod; - var modStrict = BinaryOps.modStrict; - var mul = BinaryOps.mul; - var mulStrict = BinaryOps.mulStrict; - var pow = BinaryOps.pow; - var powStrict = BinaryOps.powStrict; - var sub = BinaryOps.sub; - var subStrict = BinaryOps.subStrict; - var squaredDifference = BinaryOps.squaredDifference; - var squaredDifferenceStrict = BinaryOps.squaredDifferenceStrict; - var norm = NormOps.norm; - var cast = ArrayOps.cast; - var clone = ArrayOps.clone; - var fromPixels = ArrayOps.fromPixels; - var toPixels = ArrayOps.toPixels; - var ones = ArrayOps.ones; - var onesLike = ArrayOps.onesLike; - var zeros = ArrayOps.zeros; - var zerosLike = ArrayOps.zerosLike; - var eye = ArrayOps.eye; - var rand = ArrayOps.rand; - var randomNormal = ArrayOps.randomNormal; - var truncatedNormal = ArrayOps.truncatedNormal; - var randomUniform = ArrayOps.randomUniform; - var multinomial = ArrayOps.multinomial; - var reshape = ArrayOps.reshape; - var squeeze = ArrayOps.squeeze; - var tile = ArrayOps.tile; - var gather = ArrayOps.gather; - var oneHot = ArrayOps.oneHot; - var linspace = ArrayOps.linspace; - var range = ArrayOps.range; - var buffer = ArrayOps.buffer; - var fill = ArrayOps.fill; - var tensor = ArrayOps.tensor; - var scalar = ArrayOps.scalar; - var tensor1d = ArrayOps.tensor1d; - var tensor2d = ArrayOps.tensor2d; - var tensor3d = ArrayOps.tensor3d; - var tensor4d = ArrayOps.tensor4d; - var print = ArrayOps.print; - var expandDims = ArrayOps.expandDims; - var stack = ArrayOps.stack; - var unstack = ArrayOps.unstack; - var split = ArrayOps.split; - var cumsum = ArrayOps.cumsum; - var pad = ArrayOps.pad; - var pad1d = ArrayOps.pad1d; - var pad2d = ArrayOps.pad2d; - var pad3d = ArrayOps.pad3d; - var pad4d = ArrayOps.pad4d; - var movingAverage = MovingAverageOps.movingAverage; - var basicLSTMCell = LSTMOps.basicLSTMCell; - var multiRNNCell = LSTMOps.multiRNNCell; - var softmax = SoftmaxOps.softmax; - var localResponseNormalization = LRNOps.localResponseNormalization; - var linalg = LinalgOps; - var losses = { - absoluteDifference: LossOps.absoluteDifference, - computeWeightedLoss: LossOps.computeWeightedLoss, - cosineDistance: LossOps.cosineDistance, - hingeLoss: LossOps.hingeLoss, - logLoss: LossOps.logLoss, - meanSquaredError: LossOps.meanSquaredError, - softmaxCrossEntropy: SoftmaxOps.softmaxCrossEntropy - }; - var image = { - resizeBilinear: ImageOps.resizeBilinear, - resizeNearestNeighbor: ImageOps.resizeNearestNeighbor, - }; - - var __extends = (undefined && undefined.__extends) || (function () { - var extendStatics = Object.setPrototypeOf || - ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || - function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; }; - return function (d, b) { - extendStatics(d, b); - function __() { this.constructor = d; } - d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); - }; - })(); - var __decorate$o = (undefined && undefined.__decorate) || function (decorators, target, key, desc) { - var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; - if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); - else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; - return c > 3 && r && Object.defineProperty(target, key, r), r; - }; - var __awaiter$1 = (undefined && undefined.__awaiter) || function (thisArg, _arguments, P, generator) { - return new (P || (P = Promise))(function (resolve, reject) { - function fulfilled(value) { try { step$$1(generator.next(value)); } catch (e) { reject(e); } } - function rejected(value) { try { step$$1(generator["throw"](value)); } catch (e) { reject(e); } } - function step$$1(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); } - step$$1((generator = generator.apply(thisArg, _arguments || [])).next()); - }); - }; - var __generator$1 = (undefined && undefined.__generator) || function (thisArg, body) { - var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g; - return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g; - function verb(n) { return function (v) { return step$$1([n, v]); }; } - function step$$1(op) { - if (f) throw new TypeError("Generator is already executing."); - while (_) try { - if (f = 1, y && (t = y[op[0] & 2 ? "return" : op[0] ? "throw" : "next"]) && !(t = t.call(y, op[1])).done) return t; - if (y = 0, t) op = [0, t.value]; - switch (op[0]) { - case 0: case 1: t = op; break; - case 4: _.label++; return { value: op[1], done: false }; - case 5: _.label++; y = op[1]; op = [0]; continue; - case 7: op = _.ops.pop(); _.trys.pop(); continue; - default: - if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; } - if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; } - if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; } - if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; } - if (t[2]) _.ops.pop(); - _.trys.pop(); continue; - } - op = body.call(thisArg, _); - } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; } - if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true }; - } - }; - var TensorBuffer = (function () { - function TensorBuffer(shape, dtype, values) { - this.dtype = dtype; - if (values != null) { - var n = values.length; - var size = sizeFromShape(shape); - assert(n === size, "Length of values '" + n + "' does not match the size " + - ("inferred by the shape '" + size + "'")); - } - this.shape = shape.slice(); - this.values = - values || getTypedArrayFromDType(dtype, sizeFromShape(shape)); - this.strides = computeStrides(shape); - this.size = sizeFromShape(shape); - } - TensorBuffer.prototype.set = function (value) { - var locs = []; - for (var _i = 1; _i < arguments.length; _i++) { - locs[_i - 1] = arguments[_i]; - } - if (locs.length === 0) { - locs = [0]; - } - assert(locs.length === this.rank, "The number of provided coordinates (" + locs.length + ") must " + - ("match the rank (" + this.rank + ")")); - var index = this.locToIndex(locs); - this.values[index] = value; - }; - TensorBuffer.prototype.get = function () { - var locs = []; - for (var _i = 0; _i < arguments.length; _i++) { - locs[_i] = arguments[_i]; - } - if (locs.length === 0) { - locs = [0]; - } - var index = locs[locs.length - 1]; - for (var i = 0; i < locs.length - 1; ++i) { - index += this.strides[i] * locs[i]; - } - return this.values[index]; - }; - TensorBuffer.prototype.locToIndex = function (locs) { - if (this.rank === 0) { - return 0; - } - else if (this.rank === 1) { - return locs[0]; - } - var index = locs[locs.length - 1]; - for (var i = 0; i < locs.length - 1; ++i) { - index += this.strides[i] * locs[i]; - } - return index; - }; - TensorBuffer.prototype.indexToLoc = function (index) { - if (this.rank === 0) { - return []; - } - else if (this.rank === 1) { - return [index]; - } - var locs = new Array(this.shape.length); - for (var i = 0; i < locs.length - 1; ++i) { - locs[i] = Math.floor(index / this.strides[i]); - index -= locs[i] * this.strides[i]; - } - locs[locs.length - 1] = index; - return locs; - }; - Object.defineProperty(TensorBuffer.prototype, "rank", { - get: function () { - return this.shape.length; - }, - enumerable: true, - configurable: true - }); - TensorBuffer.prototype.toTensor = function () { - return Tensor.make(this.shape, { values: this.values }, this.dtype); - }; - __decorate$o([ - doc({ heading: 'Tensors', subheading: 'Creation' }) - ], TensorBuffer.prototype, "set", null); - __decorate$o([ - doc({ heading: 'Tensors', subheading: 'Creation' }) - ], TensorBuffer.prototype, "get", null); - __decorate$o([ - doc({ heading: 'Tensors', subheading: 'Creation' }) - ], TensorBuffer.prototype, "toTensor", null); - TensorBuffer = __decorate$o([ - doc({ heading: 'Tensors', subheading: 'Classes' }) - ], TensorBuffer); - return TensorBuffer; - }()); - var Tensor = (function () { - function Tensor(shape, dtype, values, dataId) { - this.isDisposed = false; - this.size = sizeFromShape(shape); - if (values != null) { - assert(this.size === values.length, "Constructing tensor of shape (" + this.size + ") should match the " + - ("length of values (" + values.length + ")")); - } - this.shape = shape.slice(); - this.dtype = dtype || 'float32'; - this.strides = computeStrides(shape); - this.dataId = dataId != null ? dataId : {}; - this.id = Tensor_1.nextId++; - this.rankType = (this.rank < 5 ? this.rank.toString() : 'higher'); - ENV.engine.registerTensor(this); - if (values != null) { - ENV.engine.write(this.dataId, values); - } - } - Tensor_1 = Tensor; - Tensor.make = function (shape, data, dtype) { - return new Tensor_1(shape, dtype, data.values, data.dataId); - }; - Tensor.prototype.flatten = function () { - this.throwIfDisposed(); - return this.as1D(); - }; - Tensor.prototype.asScalar = function () { - this.throwIfDisposed(); - assert(this.size === 1, 'The array must have only 1 element.'); - return this.reshape([]); - }; - Tensor.prototype.as1D = function () { - this.throwIfDisposed(); - return this.reshape([this.size]); - }; - Tensor.prototype.as2D = function (rows, columns) { - this.throwIfDisposed(); - return this.reshape([rows, columns]); - }; - Tensor.prototype.as3D = function (rows, columns, depth) { - this.throwIfDisposed(); - return this.reshape([rows, columns, depth]); - }; - Tensor.prototype.as4D = function (rows, columns, depth, depth2) { - this.throwIfDisposed(); - return this.reshape([rows, columns, depth, depth2]); - }; - Tensor.prototype.asType = function (dtype) { - this.throwIfDisposed(); - return cast(this, dtype); - }; - Object.defineProperty(Tensor.prototype, "rank", { - get: function () { - return this.shape.length; - }, - enumerable: true, - configurable: true - }); - Tensor.prototype.get = function () { - var locs = []; - for (var _i = 0; _i < arguments.length; _i++) { - locs[_i] = arguments[_i]; - } - assert(locs.length === this.rank, 'Number of coordinates in get() must match the rank of the tensor'); - this.throwIfDisposed(); - if (locs.length === 0) { - locs = [0]; - } - var index = locs[locs.length - 1]; - for (var i = 0; i < locs.length - 1; ++i) { - index += this.strides[i] * locs[i]; - } - return this.dataSync()[index]; - }; - Tensor.prototype.buffer = function () { - return buffer(this.shape, this.dtype, this.dataSync()); - }; - Tensor.prototype.data = function () { - return __awaiter$1(this, void 0, void 0, function () { - return __generator$1(this, function (_a) { - this.throwIfDisposed(); - return [2, ENV.engine.read(this.dataId)]; - }); - }); - }; - Tensor.prototype.dataSync = function () { - this.throwIfDisposed(); - return ENV.engine.readSync(this.dataId); - }; - Tensor.prototype.dispose = function () { - if (this.isDisposed) { - return; - } - this.isDisposed = true; - ENV.engine.disposeTensor(this); - }; - Tensor.prototype.throwIfDisposed = function () { - if (this.isDisposed) { - throw new Error("Tensor is disposed."); - } - }; - Tensor.prototype.toFloat = function () { - return this.asType('float32'); - }; - Tensor.prototype.toInt = function () { - return this.asType('int32'); - }; - Tensor.prototype.toBool = function () { - return this.asType('bool'); - }; - Tensor.prototype.print = function (verbose) { - if (verbose === void 0) { verbose = false; } - return print(this, verbose); - }; - Tensor.prototype.reshape = function (newShape) { - this.throwIfDisposed(); - return reshape(this, newShape); - }; - Tensor.prototype.reshapeAs = function (x) { - this.throwIfDisposed(); - return this.reshape(x.shape); - }; - Tensor.prototype.expandDims = function (axis) { - if (axis === void 0) { axis = 0; } - return expandDims(this, axis); - }; - Tensor.prototype.cumsum = function (axis, exclusive, reverse$$1) { - if (axis === void 0) { axis = 0; } - if (exclusive === void 0) { exclusive = false; } - if (reverse$$1 === void 0) { reverse$$1 = false; } - return cumsum(this, axis, exclusive, reverse$$1); - }; - Tensor.prototype.squeeze = function (axis) { - this.throwIfDisposed(); - return squeeze(this, axis); - }; - Tensor.prototype.clone = function () { - this.throwIfDisposed(); - return clone(this); - }; - Tensor.prototype.toString = function (verbose) { - if (verbose === void 0) { verbose = false; } - return tensorToString(this, verbose); - }; - Tensor.prototype.tile = function (reps) { - this.throwIfDisposed(); - return tile(this, reps); - }; - Tensor.prototype.gather = function (indices, axis) { - if (axis === void 0) { axis = 0; } - this.throwIfDisposed(); - return gather(this, indices, axis); - }; - Tensor.prototype.matMul = function (b, transposeA, transposeB) { - if (transposeA === void 0) { transposeA = false; } - if (transposeB === void 0) { transposeB = false; } - this.throwIfDisposed(); - return matMul(this, b, transposeA, transposeB); - }; - Tensor.prototype.norm = function (ord, axis, keepDims) { - if (ord === void 0) { ord = 'euclidean'; } - if (axis === void 0) { axis = null; } - if (keepDims === void 0) { keepDims = false; } - this.throwIfDisposed(); - return norm(this, ord, axis, keepDims); - }; - Tensor.prototype.slice = function (begin, size) { - this.throwIfDisposed(); - return slice(this, begin, size); - }; - Tensor.prototype.reverse = function (axis) { - this.throwIfDisposed(); - return reverse(this, axis); - }; - Tensor.prototype.concat = function (x, axis) { - if (axis === void 0) { axis = 0; } - this.throwIfDisposed(); - return concat([this, x], axis); - }; - Tensor.prototype.stack = function (x, axis) { - if (axis === void 0) { axis = 0; } - return stack([this, x], axis); - }; - Tensor.prototype.unstack = function (x, axis) { - if (axis === void 0) { axis = 0; } - return unstack(this, axis); - }; - Tensor.prototype.pad = function (paddings, constantValue) { - if (constantValue === void 0) { constantValue = 0; } - return pad(this, paddings, constantValue); - }; - Tensor.prototype.batchNormalization = function (mean$$1, variance, varianceEpsilon, scale, offset) { - if (varianceEpsilon === void 0) { varianceEpsilon = .001; } - this.throwIfDisposed(); - return batchNormalization(this, mean$$1, variance, varianceEpsilon, scale, offset); - }; - Tensor.prototype.logSumExp = function (axis, keepDims) { - if (axis === void 0) { axis = null; } - if (keepDims === void 0) { keepDims = false; } - this.throwIfDisposed(); - return logSumExp(this, axis, keepDims); - }; - Tensor.prototype.sum = function (axis, keepDims) { - if (axis === void 0) { axis = null; } - if (keepDims === void 0) { keepDims = false; } - this.throwIfDisposed(); - return sum(this, axis, keepDims); - }; - Tensor.prototype.mean = function (axis, keepDims) { - if (axis === void 0) { axis = null; } - if (keepDims === void 0) { keepDims = false; } - this.throwIfDisposed(); - return mean(this, axis, keepDims); - }; - Tensor.prototype.min = function (axis, keepDims) { - if (axis === void 0) { axis = null; } - if (keepDims === void 0) { keepDims = false; } - this.throwIfDisposed(); - return min(this, axis, keepDims); - }; - Tensor.prototype.max = function (axis, keepDims) { - if (axis === void 0) { axis = null; } - if (keepDims === void 0) { keepDims = false; } - this.throwIfDisposed(); - return max(this, axis, keepDims); - }; - Tensor.prototype.argMin = function (axis) { - if (axis === void 0) { axis = null; } - this.throwIfDisposed(); - return argMin(this, axis); - }; - Tensor.prototype.argMax = function (axis) { - if (axis === void 0) { axis = null; } - this.throwIfDisposed(); - return argMax(this, axis); - }; - Tensor.prototype.cast = function (dtype) { - this.throwIfDisposed(); - return cast(this, dtype); - }; - Tensor.prototype.add = function (x) { - this.throwIfDisposed(); - return add(this, x); - }; - Tensor.prototype.addStrict = function (x) { - this.throwIfDisposed(); - return addStrict(this, x); - }; - Tensor.prototype.sub = function (x) { - this.throwIfDisposed(); - return sub(this, x); - }; - Tensor.prototype.subStrict = function (x) { - this.throwIfDisposed(); - return subStrict(this, x); - }; - Tensor.prototype.pow = function (exp$$1) { - this.throwIfDisposed(); - return pow(this, exp$$1); - }; - Tensor.prototype.powStrict = function (exp$$1) { - this.throwIfDisposed(); - return powStrict(this, exp$$1); - }; - Tensor.prototype.mul = function (x) { - this.throwIfDisposed(); - return mul(this, x); - }; - Tensor.prototype.mulStrict = function (x) { - this.throwIfDisposed(); - return mulStrict(this, x); - }; - Tensor.prototype.div = function (x) { - this.throwIfDisposed(); - return div(this, x); - }; - Tensor.prototype.divStrict = function (x) { - this.throwIfDisposed(); - return divStrict(this, x); - }; - Tensor.prototype.minimum = function (x) { - this.throwIfDisposed(); - return minimum(this, x); - }; - Tensor.prototype.minimumStrict = function (x) { - this.throwIfDisposed(); - return minimumStrict(this, x); - }; - Tensor.prototype.maximum = function (x) { - this.throwIfDisposed(); - return maximum(this, x); - }; - Tensor.prototype.maximumStrict = function (x) { - this.throwIfDisposed(); - return maximumStrict(this, x); - }; - Tensor.prototype.mod = function (x) { - this.throwIfDisposed(); - return mod(this, x); - }; - Tensor.prototype.modStrict = function (x) { - this.throwIfDisposed(); - return modStrict(this, x); - }; - Tensor.prototype.squaredDifference = function (x) { - this.throwIfDisposed(); - return squaredDifference(this, x); - }; - Tensor.prototype.squaredDifferenceStrict = function (x) { - this.throwIfDisposed(); - return squaredDifferenceStrict(this, x); - }; - Tensor.prototype.transpose = function (perm) { - this.throwIfDisposed(); - return transpose(this, perm); - }; - Tensor.prototype.notEqual = function (x) { - this.throwIfDisposed(); - return notEqual(this, x); - }; - Tensor.prototype.notEqualStrict = function (x) { - this.throwIfDisposed(); - return notEqualStrict(this, x); - }; - Tensor.prototype.less = function (x) { - this.throwIfDisposed(); - return less(this, x); - }; - Tensor.prototype.lessStrict = function (x) { - this.throwIfDisposed(); - return lessStrict(this, x); - }; - Tensor.prototype.equal = function (x) { - this.throwIfDisposed(); - return equal(this, x); - }; - Tensor.prototype.equalStrict = function (x) { - this.throwIfDisposed(); - return equalStrict(this, x); - }; - Tensor.prototype.lessEqual = function (x) { - this.throwIfDisposed(); - return lessEqual(this, x); - }; - Tensor.prototype.lessEqualStrict = function (x) { - this.throwIfDisposed(); - return lessEqualStrict(this, x); - }; - Tensor.prototype.greater = function (x) { - this.throwIfDisposed(); - return greater(this, x); - }; - Tensor.prototype.greaterStrict = function (x) { - this.throwIfDisposed(); - return greaterStrict(this, x); - }; - Tensor.prototype.greaterEqual = function (x) { - this.throwIfDisposed(); - return greaterEqual(this, x); - }; - Tensor.prototype.greaterEqualStrict = function (x) { - this.throwIfDisposed(); - return greaterEqualStrict(this, x); - }; - Tensor.prototype.logicalAnd = function (x) { - this.throwIfDisposed(); - return logicalAnd(this, x); - }; - Tensor.prototype.logicalOr = function (x) { - this.throwIfDisposed(); - return logicalOr(this, x); - }; - Tensor.prototype.logicalNot = function () { - this.throwIfDisposed(); - return logicalNot(this); - }; - Tensor.prototype.logicalXor = function (x) { - this.throwIfDisposed(); - return logicalXor(this, x); - }; - Tensor.prototype.where = function (condition, x) { - this.throwIfDisposed(); - return where(condition, this, x); - }; - Tensor.prototype.neg = function () { - this.throwIfDisposed(); - return neg(this); - }; - Tensor.prototype.ceil = function () { - this.throwIfDisposed(); - return ceil(this); - }; - Tensor.prototype.floor = function () { - this.throwIfDisposed(); - return floor(this); - }; - Tensor.prototype.sign = function () { - this.throwIfDisposed(); - return sign(this); - }; - Tensor.prototype.exp = function () { - this.throwIfDisposed(); - return exp(this); - }; - Tensor.prototype.expm1 = function () { - this.throwIfDisposed(); - return expm1(this); - }; - Tensor.prototype.log = function () { - this.throwIfDisposed(); - return log(this); - }; - Tensor.prototype.log1p = function () { - this.throwIfDisposed(); - return log1p(this); - }; - Tensor.prototype.sqrt = function () { - this.throwIfDisposed(); - return sqrt(this); - }; - Tensor.prototype.rsqrt = function () { - this.throwIfDisposed(); - return rsqrt(this); - }; - Tensor.prototype.square = function () { - this.throwIfDisposed(); - return square(this); - }; - Tensor.prototype.reciprocal = function () { - this.throwIfDisposed(); - return reciprocal(this); - }; - Tensor.prototype.abs = function () { - this.throwIfDisposed(); - return abs(this); - }; - Tensor.prototype.clipByValue = function (min$$1, max$$1) { - this.throwIfDisposed(); - return clipByValue(this, min$$1, max$$1); - }; - Tensor.prototype.relu = function () { - this.throwIfDisposed(); - return relu(this); - }; - Tensor.prototype.elu = function () { - this.throwIfDisposed(); - return elu(this); - }; - Tensor.prototype.selu = function () { - this.throwIfDisposed(); - return selu(this); - }; - Tensor.prototype.leakyRelu = function (alpha) { - if (alpha === void 0) { alpha = 0.2; } - this.throwIfDisposed(); - return leakyRelu(this, alpha); - }; - Tensor.prototype.prelu = function (alpha) { - this.throwIfDisposed(); - return prelu(this, alpha); - }; - Tensor.prototype.sigmoid = function () { - this.throwIfDisposed(); - return sigmoid(this); - }; - Tensor.prototype.logSigmoid = function () { - this.throwIfDisposed(); - return logSigmoid(this); - }; - Tensor.prototype.softplus = function () { - this.throwIfDisposed(); - return softplus(this); - }; - Tensor.prototype.sin = function () { - this.throwIfDisposed(); - return sin(this); - }; - Tensor.prototype.cos = function () { - this.throwIfDisposed(); - return cos(this); - }; - Tensor.prototype.tan = function () { - this.throwIfDisposed(); - return tan(this); - }; - Tensor.prototype.asin = function () { - this.throwIfDisposed(); - return asin(this); - }; - Tensor.prototype.acos = function () { - this.throwIfDisposed(); - return acos(this); - }; - Tensor.prototype.atan = function () { - this.throwIfDisposed(); - return atan(this); - }; - Tensor.prototype.sinh = function () { - this.throwIfDisposed(); - return sinh(this); - }; - Tensor.prototype.cosh = function () { - this.throwIfDisposed(); - return cosh(this); - }; - Tensor.prototype.tanh = function () { - this.throwIfDisposed(); - return tanh$1(this); - }; - Tensor.prototype.asinh = function () { - this.throwIfDisposed(); - return asinh(this); - }; - Tensor.prototype.acosh = function () { - this.throwIfDisposed(); - return acosh(this); - }; - Tensor.prototype.atanh = function () { - this.throwIfDisposed(); - return atanh(this); - }; - Tensor.prototype.erf = function () { - this.throwIfDisposed(); - return erf(this); - }; - Tensor.prototype.round = function () { - this.throwIfDisposed(); - return round(this); - }; - Tensor.prototype.step = function (alpha) { - if (alpha === void 0) { alpha = 0.0; } - this.throwIfDisposed(); - return step(this, alpha); - }; - Tensor.prototype.softmax = function (dim) { - if (dim === void 0) { dim = -1; } - this.throwIfDisposed(); - return softmax(this, dim); - }; - Tensor.prototype.resizeBilinear = function (newShape2D, alignCorners) { - if (alignCorners === void 0) { alignCorners = false; } - this.throwIfDisposed(); - return image.resizeBilinear(this, newShape2D, alignCorners); - }; - Tensor.prototype.resizeNearestNeighbor = function (newShape2D, alignCorners) { - if (alignCorners === void 0) { alignCorners = false; } - this.throwIfDisposed(); - return image.resizeNearestNeighbor(this, newShape2D, alignCorners); - }; - Tensor.prototype.conv1d = function (filter, stride, pad$$1, dataFormat, dilation, dimRoundingMode) { - if (dataFormat === void 0) { dataFormat = 'NWC'; } - if (dilation === void 0) { dilation = 1; } - this.throwIfDisposed(); - return conv1d(this, filter, stride, pad$$1, dataFormat, dilation, dimRoundingMode); - }; - Tensor.prototype.conv2d = function (filter, strides, pad$$1, dataFormat, dilations, dimRoundingMode) { - if (dataFormat === void 0) { dataFormat = 'NHWC'; } - if (dilations === void 0) { dilations = [1, 1]; } - this.throwIfDisposed(); - return conv2d(this, filter, strides, pad$$1, dataFormat, dilations, dimRoundingMode); - }; - Tensor.prototype.conv2dTranspose = function (filter, outputShape, strides, pad$$1, dimRoundingMode) { - this.throwIfDisposed(); - return conv2dTranspose(this, filter, outputShape, strides, pad$$1, dimRoundingMode); - }; - Tensor.prototype.depthwiseConv2D = function (filter, strides, pad$$1, dataFormat, dilations, dimRoundingMode) { - if (dataFormat === void 0) { dataFormat = 'NHWC'; } - if (dilations === void 0) { dilations = [1, 1]; } - this.throwIfDisposed(); - return depthwiseConv2d(this, filter, strides, pad$$1, dataFormat, dilations, dimRoundingMode); - }; - Tensor.prototype.avgPool = function (filterSize, strides, pad$$1, dimRoundingMode) { - this.throwIfDisposed(); - return avgPool(this, filterSize, strides, pad$$1, dimRoundingMode); - }; - Tensor.prototype.maxPool = function (filterSize, strides, pad$$1, dimRoundingMode) { - this.throwIfDisposed(); - return maxPool(this, filterSize, strides, pad$$1, dimRoundingMode); - }; - Tensor.prototype.localResponseNormalization = function (radius, bias, alpha, beta) { - if (radius === void 0) { radius = 5; } - if (bias === void 0) { bias = 1; } - if (alpha === void 0) { alpha = 1; } - if (beta === void 0) { beta = 0.5; } - return localResponseNormalization(this, radius, bias, alpha, beta); - }; - Tensor.prototype.variable = function (trainable, name, dtype) { - if (trainable === void 0) { trainable = true; } - this.throwIfDisposed(); - return Variable.variable(this, trainable, name, dtype); - }; - Tensor.prototype.unsortedSegmentSum = function (segmentIds, numSegments, axis) { - if (axis === void 0) { axis = 0; } - this.throwIfDisposed(); - return unsortedSegmentSum(this, segmentIds, numSegments, axis); - }; - Tensor.nextId = 0; - __decorate$o([ - doc({ heading: 'Tensors', subheading: 'Classes' }) - ], Tensor.prototype, "flatten", null); - __decorate$o([ - doc({ heading: 'Tensors', subheading: 'Classes' }) - ], Tensor.prototype, "asScalar", null); - __decorate$o([ - doc({ heading: 'Tensors', subheading: 'Classes' }) - ], Tensor.prototype, "as1D", null); - __decorate$o([ - doc({ heading: 'Tensors', subheading: 'Classes' }) - ], Tensor.prototype, "as2D", null); - __decorate$o([ - doc({ heading: 'Tensors', subheading: 'Classes' }) - ], Tensor.prototype, "as3D", null); - __decorate$o([ - doc({ heading: 'Tensors', subheading: 'Classes' }) - ], Tensor.prototype, "as4D", null); - __decorate$o([ - doc({ heading: 'Tensors', subheading: 'Classes' }) - ], Tensor.prototype, "asType", null); - __decorate$o([ - doc({ heading: 'Tensors', subheading: 'Classes' }) - ], Tensor.prototype, "buffer", null); - __decorate$o([ - doc({ heading: 'Tensors', subheading: 'Classes' }) - ], Tensor.prototype, "data", null); - __decorate$o([ - doc({ heading: 'Tensors', subheading: 'Classes' }) - ], Tensor.prototype, "dataSync", null); - __decorate$o([ - doc({ heading: 'Tensors', subheading: 'Classes' }) - ], Tensor.prototype, "dispose", null); - __decorate$o([ - doc({ heading: 'Tensors', subheading: 'Classes' }) - ], Tensor.prototype, "toFloat", null); - __decorate$o([ - doc({ heading: 'Tensors', subheading: 'Classes' }) - ], Tensor.prototype, "toInt", null); - __decorate$o([ - doc({ heading: 'Tensors', subheading: 'Classes' }) - ], Tensor.prototype, "toBool", null); - __decorate$o([ - doc({ heading: 'Tensors', subheading: 'Classes' }) - ], Tensor.prototype, "print", null); - __decorate$o([ - doc({ heading: 'Tensors', subheading: 'Classes' }) - ], Tensor.prototype, "reshape", null); - __decorate$o([ - doc({ heading: 'Tensors', subheading: 'Classes' }) - ], Tensor.prototype, "reshapeAs", null); - __decorate$o([ - doc({ heading: 'Tensors', subheading: 'Classes' }) - ], Tensor.prototype, "expandDims", null); - __decorate$o([ - doc({ heading: 'Tensors', subheading: 'Classes' }) - ], Tensor.prototype, "cumsum", null); - __decorate$o([ - doc({ heading: 'Tensors', subheading: 'Classes' }) - ], Tensor.prototype, "squeeze", null); - __decorate$o([ - doc({ heading: 'Tensors', subheading: 'Classes' }) - ], Tensor.prototype, "clone", null); - __decorate$o([ - doc({ heading: 'Tensors', subheading: 'Classes' }) - ], Tensor.prototype, "toString", null); - Tensor = Tensor_1 = __decorate$o([ - doc({ heading: 'Tensors', subheading: 'Classes' }) - ], Tensor); - return Tensor; - var Tensor_1; - }()); - var Variable = (function (_super) { - __extends(Variable, _super); - function Variable(initialValue, trainable, name) { - if (trainable === void 0) { trainable = true; } - var _this = _super.call(this, initialValue.shape, initialValue.dtype, null, initialValue.dataId) || this; - _this.trainable = trainable; - _this.name = name; - if (_this.name == null) { - _this.name = Variable_1.nextVarId.toString(); - Variable_1.nextVarId++; - } - ENV.engine.registerVariable(_this); - return _this; - } - Variable_1 = Variable; - Variable.variable = function (initialValue, trainable, name, dtype) { - if (trainable === void 0) { trainable = true; } - if (dtype != null && dtype !== initialValue.dtype) { - initialValue = initialValue.asType(dtype); - } - return new Variable_1(initialValue, trainable, name); - }; - Variable.prototype.assign = function (newValue) { - if (newValue.dtype !== this.dtype) { - throw new Error("dtype of the new value (" + newValue.dtype + ") and " + - ("previous value (" + this.dtype + ") must match")); - } - if (!arraysEqual(newValue.shape, this.shape)) { - throw new Error("shape of the new value (" + newValue.shape + ") and " + - ("previous value (" + this.shape + ") must match")); - } - ENV.engine.disposeTensor(this); - this.dataId = newValue.dataId; - ENV.engine.registerTensor(this); - }; - Variable.nextVarId = 0; - __decorate$o([ - doc({ heading: 'Tensors', subheading: 'Classes' }) - ], Variable.prototype, "assign", null); - __decorate$o([ - doc({ heading: 'Tensors', subheading: 'Creation' }) - ], Variable, "variable", null); - Variable = Variable_1 = __decorate$o([ - doc({ heading: 'Tensors', subheading: 'Classes' }) - ], Variable); - return Variable; - var Variable_1; - }(Tensor)); - var variable = Variable.variable; - function computeStrides(shape) { - var rank = shape.length; - if (rank < 2) { - return []; - } - var strides = new Array(rank - 1); - strides[rank - 2] = shape[rank - 1]; - for (var i = rank - 3; i >= 0; --i) { - strides[i] = strides[i + 1] * shape[i + 1]; - } - return strides; - } - - var __decorate$p = (undefined && undefined.__decorate) || function (decorators, target, key, desc) { - var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; - if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); - else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; - return c > 3 && r && Object.defineProperty(target, key, r), r; - }; - var Gradients = (function () { - function Gradients() { - } - Gradients.gradScope = function (nameOrScopeFn, scopeFn) { - return tidy(nameOrScopeFn, scopeFn, true); - }; - Gradients.grad = function (f) { - assert(isFunction(f), 'The f passed in grad(f) must be a function'); - return function (x, dy) { - assert(x instanceof Tensor, 'The x passed in grad(f)(x) must be a tensor'); - assert(dy == null || dy instanceof Tensor, 'The dy passed in grad(f)(x, dy) must be a tensor'); - return tidy(function () { - var _a = ENV.engine.gradients(function () { return f(x); }, [x], dy), value = _a.value, grads$$1 = _a.grads; - if (dy != null) { - assertShapesMatch(value.shape, dy.shape, 'The shape of dy passed in grad(f)(x, dy) must match the shape ' + - 'returned by f(x)'); - } - checkGrads(grads$$1); - return grads$$1[0]; - }); - }; - }; - Gradients.grads = function (f) { - assert(isFunction(f), 'The f passed in grads(f) must be a function'); - return function (args, dy) { - assert(Array.isArray(args) && args.every(function (arg) { return arg instanceof Tensor; }), 'The args passed in grads(f)(args) must be an array of tensors'); - assert(dy == null || dy instanceof Tensor, 'The dy passed in grads(f)(args, dy) must be a tensor'); - return tidy(function () { - var _a = ENV.engine.gradients(function () { return f.apply(void 0, args); }, args, dy), value = _a.value, grads$$1 = _a.grads; - if (dy != null) { - assertShapesMatch(value.shape, dy.shape, 'The shape of dy passed in grads(f)([x1,...], dy) must ' + - 'match the shape returned by f([x1,...])'); - } - checkGrads(grads$$1); - return grads$$1; - }); - }; - }; - Gradients.valueAndGrad = function (f) { - assert(isFunction(f), 'The f passed in valueAndGrad(f) must be a function'); - return function (x, dy) { - assert(x instanceof Tensor, 'The x passed in valueAndGrad(f)(x) must be a tensor'); - assert(dy == null || dy instanceof Tensor, 'The dy passed in valueAndGrad(f)(x, dy) must be a tensor'); - var _a = ENV.engine.gradients(function () { return f(x); }, [x], dy), grads$$1 = _a.grads, value = _a.value; - checkGrads(grads$$1); - return { grad: grads$$1[0], value: value }; - }; - }; - Gradients.valueAndGrads = function (f) { - assert(isFunction(f), 'The f passed in valueAndGrads(f) must be a function'); - return function (args, dy) { - assert(Array.isArray(args) && args.every(function (arg) { return arg instanceof Tensor; }), 'The args passed in valueAndGrads(f)(args) must be array of tensors'); - assert(dy == null || dy instanceof Tensor, 'The dy passed in valueAndGrads(f)(args, dy) must be a tensor'); - var res = ENV.engine.gradients(function () { return f.apply(void 0, args); }, args, dy); - if (dy != null) { - assertShapesMatch(res.value.shape, dy.shape, 'The shape of dy passed in valueAndGrads(f)([x1,...], dy) must ' + - 'match the shape returned by f([x1,...])'); - } - checkGrads(res.grads); - return res; - }; - }; - Gradients.variableGrads = function (f, varList) { - assert(isFunction(f), 'The f passed in variableGrads(f) must be a function'); - assert(varList == null || - Array.isArray(varList) && varList.every(function (v) { return v instanceof Variable; }), 'The varList passed in variableGrads(f, varList) must be an array ' + - 'of variables'); - if (varList == null) { - varList = []; - for (var varName in ENV.engine.registeredVariables) { - varList.push(ENV.engine.registeredVariables[varName]); - } - } - var originalVarCount = varList.length; - varList = varList.filter(function (variable$$1) { return variable$$1.trainable; }); - assert(varList.length > 0, "variableGrads() expects at least one of the input variables to be " + - ("trainable, but none of the " + originalVarCount + " variables is ") + - "trainable."); - var allowNoGradients = true; - var _a = ENV.engine.gradients(f, varList, null, allowNoGradients), value = _a.value, grads$$1 = _a.grads; - assert(grads$$1.some(function (g) { return g != null; }), 'Cannot find a connection between any variable and the result of the ' + - 'loss function y=f(x). Please make sure the operations that use ' + - 'variables are inside the function f passed to minimize().'); - assert(value.rank === 0, "The f passed in variableGrads(f) must return a scalar, but it " + - ("returned a rank-" + value.rank + " tensor")); - var namedGrads = {}; - varList.forEach(function (v, i) { - if (grads$$1[i] != null) { - namedGrads[v.name] = grads$$1[i]; - } - }); - return { value: value, grads: namedGrads }; - }; - Gradients.customGrad = function (f) { - return ENV.engine.customGrad(f); - }; - __decorate$p([ - doc({ heading: 'Training', subheading: 'Gradients' }) - ], Gradients, "grad", null); - __decorate$p([ - doc({ heading: 'Training', subheading: 'Gradients' }) - ], Gradients, "grads", null); - __decorate$p([ - doc({ heading: 'Training', subheading: 'Gradients' }) - ], Gradients, "valueAndGrad", null); - __decorate$p([ - doc({ heading: 'Training', subheading: 'Gradients' }) - ], Gradients, "valueAndGrads", null); - __decorate$p([ - doc({ heading: 'Training', subheading: 'Gradients' }) - ], Gradients, "variableGrads", null); - __decorate$p([ - doc({ heading: 'Training', subheading: 'Gradients' }) - ], Gradients, "customGrad", null); - return Gradients; - }()); - function checkGrads(grads$$1) { - var numNullGradients = grads$$1.filter(function (g) { return g == null; }).length; - if (numNullGradients > 0) { - throw new Error("Cannot compute gradient of y=f(x) with respect to x. Make sure that\n the f you passed encloses all operations that lead from x to y."); - } - } - - var tidy = Tracking.tidy; - var keep = Tracking.keep; - var dispose = Tracking.dispose; - var time = Tracking.time; - var grad = Gradients.grad; - var valueAndGrad = Gradients.valueAndGrad; - var grads = Gradients.grads; - var valueAndGrads = Gradients.valueAndGrads; - var variableGrads = Gradients.variableGrads; - var customGrad = Gradients.customGrad; - - var Profiler = (function () { - function Profiler(backendTimer, logger) { - this.backendTimer = backendTimer; - this.logger = logger; - if (logger == null) { - this.logger = new Logger(); - } - } - Profiler.prototype.profileKernel = function (name, f) { - var _this = this; - var result; - var holdResultWrapperFn = function () { - result = f(); - }; - var timer = this.backendTimer.time(holdResultWrapperFn); - var vals = result.dataSync(); - checkForNaN(vals, result.dtype, name); - timer.then(function (timing) { - _this.logger.logKernelProfile(name, result, vals, timing.kernelMs); - }); - return result; - }; - return Profiler; - }()); - var Logger = (function () { - function Logger() { - } - Logger.prototype.logKernelProfile = function (name, result, vals, timeMs) { - var time = rightPad(timeMs + "ms", 9); - var paddedName = rightPad(name, 25); - var rank = result.rank; - var size = result.size; - var shape = rightPad(result.shape.toString(), 14); - console.log("%c" + paddedName + "\t%c" + time + "\t%c" + rank + "D " + shape + "\t%c" + size, 'font-weight:bold', 'color:red', 'color:blue', 'color: orange'); - }; - return Logger; - }()); - - function getFilteredNodesXToY(tape, xs, y) { - var tensorsFromX = {}; - var nodesFromX = {}; - for (var i = 0; i < xs.length; i++) { - tensorsFromX[xs[i].id] = true; - } - for (var i = 0; i < tape.length; i++) { - var node = tape[i]; - var nodeInputs = node.inputs; - for (var inputName in nodeInputs) { - var input = nodeInputs[inputName]; - var anyInputFromX = false; - for (var j = 0; j < xs.length; j++) { - if (tensorsFromX[input.id]) { - tensorsFromX[node.output.id] = true; - anyInputFromX = true; - nodesFromX[node.id] = true; - break; - } - } - if (anyInputFromX) { - break; - } - } - } - var tensorsLeadToY = {}; - tensorsLeadToY[y.id] = true; - var nodesToY = {}; - for (var i = tape.length - 1; i >= 0; i--) { - var node = tape[i]; - var nodeInputs = node.inputs; - var outputs = []; - outputs.push(node.output); - for (var j = 0; j < outputs.length; j++) { - if (tensorsLeadToY[outputs[j].id]) { - for (var inputName in nodeInputs) { - tensorsLeadToY[nodeInputs[inputName].id] = true; - nodesToY[node.id] = true; - } - break; - } - } - } - var filteredTape = []; - for (var i = 0; i < tape.length; i++) { - var node = tape[i]; - if (nodesFromX[node.id] && nodesToY[node.id]) { - var prunedInputs = {}; - for (var inputName in node.inputs) { - var nodeInput = node.inputs[inputName]; - if (tensorsFromX[nodeInput.id]) { - prunedInputs[inputName] = nodeInput; - } - } - var prunedNode = Object.assign({}, node); - prunedNode.inputs = prunedInputs; - prunedNode.output = node.output; - filteredTape.push(prunedNode); - } - } - return filteredTape; - } - function backpropagateGradients(tensorAccumulatedGradientMap, filteredTape) { - for (var i = filteredTape.length - 1; i >= 0; i--) { - var node = filteredTape[i]; - var dy = tensorAccumulatedGradientMap[node.output.id]; - if (node.gradient == null) { - throw new Error("Cannot compute gradient: gradient function not found " + - ("for " + node.name + ".")); - } - var inputGradients = node.gradient(dy); - for (var inputName in node.inputs) { - if (!(inputName in inputGradients)) { - throw new Error("Cannot backprop through input " + inputName + ". " + - ("Available gradients found: " + Object.keys(inputGradients) + ".")); - } - var dx = inputGradients[inputName](); - var x = node.inputs[inputName]; - if (!arraysEqual(dx.shape, x.shape)) { - throw new Error("Error in gradient for op " + node.name + ". The gradient of input " + - ("'" + inputName + "' has shape '" + dx.shape + "', which does not match ") + - ("the shape of the input '" + x.shape + "'")); - } - if (tensorAccumulatedGradientMap[x.id] == null) { - tensorAccumulatedGradientMap[x.id] = dx; - } - else { - var curGradient = tensorAccumulatedGradientMap[x.id]; - tensorAccumulatedGradientMap[x.id] = curGradient.add(dx); - curGradient.dispose(); - } - } - } - } - - var __awaiter$2 = (undefined && undefined.__awaiter) || function (thisArg, _arguments, P, generator) { - return new (P || (P = Promise))(function (resolve, reject) { - function fulfilled(value) { try { step$$1(generator.next(value)); } catch (e) { reject(e); } } - function rejected(value) { try { step$$1(generator["throw"](value)); } catch (e) { reject(e); } } - function step$$1(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); } - step$$1((generator = generator.apply(thisArg, _arguments || [])).next()); - }); - }; - var __generator$2 = (undefined && undefined.__generator) || function (thisArg, body) { - var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g; - return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g; - function verb(n) { return function (v) { return step$$1([n, v]); }; } - function step$$1(op) { - if (f) throw new TypeError("Generator is already executing."); - while (_) try { - if (f = 1, y && (t = y[op[0] & 2 ? "return" : op[0] ? "throw" : "next"]) && !(t = t.call(y, op[1])).done) return t; - if (y = 0, t) op = [0, t.value]; - switch (op[0]) { - case 0: case 1: t = op; break; - case 4: _.label++; return { value: op[1], done: false }; - case 5: _.label++; y = op[1]; op = [0]; continue; - case 7: op = _.ops.pop(); _.trys.pop(); continue; - default: - if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; } - if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; } - if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; } - if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; } - if (t[2]) _.ops.pop(); - _.trys.pop(); continue; - } - op = body.call(thisArg, _); - } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; } - if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true }; - } - }; - var Engine = (function () { - function Engine(backend, safeMode) { - this.backend = backend; - this.safeMode = safeMode; - this.registeredVariables = {}; - this.refCounter = new WeakMap(); - this.nextTapeNodeId = 0; - this.numBytes = 0; - this.numTensors = 0; - this.numDataBuffers = 0; - this.gradientScopeCount = 0; - this.customGradientDepth = 0; - this.activeScope = { keep: [], track: [] }; - this.scopeStack = [this.activeScope]; - this.profiler = new Profiler(backend); - } - Engine.prototype.runKernel = function (forwardFunc, inputs, backwardsFunc) { - var _this = this; - var result; - var saved = []; - var saveFunc = function (x) { - saved.push(x); - return x; - }; - var scopeName = this.activeScope.name; - this.customGradientDepth++; - if (!ENV.get('DEBUG')) { - result = forwardFunc(this.backend, saveFunc); - } - else { - result = this.profiler.profileKernel(scopeName, function () { return forwardFunc(_this.backend, saveFunc); }); - } - this.customGradientDepth--; - if (this.shouldRecord()) { - var tapeNode = { - id: this.nextTapeNodeId++, - name: scopeName, - inputs: inputs, - output: result, - }; - if (backwardsFunc != null) { - tapeNode.gradient = function (dy) { return backwardsFunc(dy, saved); }; - } - this.activeTape.push(tapeNode); - } - return result; - }; - Engine.prototype.registerTensor = function (a) { - var refCount = this.refCounter.has(a.dataId) ? this.refCounter.get(a.dataId) : 0; - this.numTensors++; - if (refCount === 0) { - this.numDataBuffers++; - this.numBytes += - sizeFromShape(a.shape) * bytesPerElement(a.dtype); - this.backend.register(a.dataId, a.shape, a.dtype); - } - this.refCounter.set(a.dataId, refCount + 1); - if (!(a instanceof Variable)) { - this.track(a); - } - }; - Engine.prototype.registerVariable = function (v) { - if (this.registeredVariables[v.name] != null) { - throw new Error("Variable with name " + v.name + " was already registered"); - } - this.registeredVariables[v.name] = v; - }; - Engine.prototype.disposeTensor = function (a) { - if (!this.refCounter.has(a.dataId)) { - return; - } - this.numTensors--; - var refCount = this.refCounter.get(a.dataId); - if (refCount <= 1) { - this.refCounter.delete(a.dataId); - this.backend.disposeData(a.dataId); - this.numDataBuffers--; - this.numBytes -= - sizeFromShape(a.shape) * bytesPerElement(a.dtype); - } - else { - this.refCounter.set(a.dataId, refCount - 1); - } - }; - Engine.prototype.disposeVariables = function () { - for (var varName in this.registeredVariables) { - var v = this.registeredVariables[varName]; - this.disposeTensor(v); - delete this.registeredVariables[varName]; - } - }; - Engine.prototype.memory = function () { - var info = this.backend.memory(); - info.numTensors = this.numTensors; - info.numDataBuffers = this.numDataBuffers; - info.numBytes = this.numBytes; - return info; - }; - Engine.prototype.shouldRecord = function () { - return this.activeTape != null && this.customGradientDepth === 0; - }; - Engine.prototype.addTapeNode = function (inputs, result, gradientsFunc) { - var inputsMap = {}; - inputs.forEach(function (input, idx) { - inputsMap[idx] = input; - }); - var gradient = function (dy) { - var res = gradientsFunc(dy); - var resMap = {}; - res.forEach(function (r, idx) { - resMap[idx] = function () { return r; }; - }); - return resMap; - }; - var tapeNode = { - id: this.nextTapeNodeId++, - name: this.activeScope.name, - inputs: inputsMap, - output: result, - gradient: gradient - }; - this.activeTape.push(tapeNode); - }; - Engine.prototype.keep = function (result) { - if (this.scopeStack.length === 1 && ENV.engine.safeMode) { - throw new Error('Safe mode is ON. Enclose all tensor operations inside tf.tidy(): ' + - 'tf.tidy(() => {...}) to avoid memory leaks.'); - } - this.activeScope.keep.push(result); - return result; - }; - Engine.prototype.startScope = function (name, gradientsMode) { - if (gradientsMode === void 0) { gradientsMode = false; } - if (gradientsMode && this.gradientScopeCount === 0) { - this.activeTape = []; - } - if (gradientsMode) { - this.gradientScopeCount++; - } - var scopeInfo = { keep: [], track: [] }; - if (name) { - scopeInfo.name = name; - } - this.scopeStack.push(scopeInfo); - this.activeScope = scopeInfo; - }; - Engine.prototype.endScope = function (result, gradientsMode) { - var _this = this; - if (gradientsMode === void 0) { gradientsMode = false; } - if (gradientsMode) { - this.gradientScopeCount--; - if (this.gradientScopeCount === 0) { - this.activeTape = null; - } - } - var tensorsToKeep = this.activeScope.keep; - var tensorsToTrackInParent = extractTensorsFromContainer(result); - tensorsToKeep = tensorsToKeep.concat(tensorsToTrackInParent); - for (var i = 0; i < this.activeScope.track.length; i++) { - var tensor$$1 = this.activeScope.track[i]; - if (isTensorInList(tensor$$1, tensorsToKeep)) { - continue; - } - if (this.activeTape != null) { - tensorsToTrackInParent.push(tensor$$1); - } - else { - tensor$$1.dispose(); - } - } - this.scopeStack.pop(); - this.activeScope = this.scopeStack.length === 0 ? - { keep: [], track: [] } : - this.scopeStack[this.scopeStack.length - 1]; - tensorsToTrackInParent.forEach(function (tensor$$1) { - if (!isTensorInList(tensor$$1, _this.activeScope.keep)) { - _this.track(tensor$$1); - } - }); - }; - Engine.prototype.dispose = function () { }; - Engine.prototype.gradients = function (f, xs, dy, allowNoGradients) { - var _this = this; - if (allowNoGradients === void 0) { allowNoGradients = false; } - assert(xs.length > 0, 'gradients() received an empty list of xs.'); - return tidy('gradients', function () { - var y = f(); - assert(y instanceof Tensor, 'The result y returned by f() must be a tensor.'); - var filteredTape = getFilteredNodesXToY(_this.activeTape, xs, y); - if (!allowNoGradients && filteredTape.length === 0 && xs.length > 0) { - throw new Error('Cannot compute gradient of y=f(x) with respect to x. Make sure ' + - 'that the f you passed encloses all operations that lead from x ' + - 'to y.'); - } - var accumulatedGradientMap = {}; - accumulatedGradientMap[y.id] = (dy == null) ? ones(y.shape) : dy; - backpropagateGradients(accumulatedGradientMap, filteredTape); - var grads$$1 = xs.map(function (x) { return accumulatedGradientMap[x.id]; }); - return { value: y, grads: grads$$1 }; - }, true); - }; - Engine.prototype.customGrad = function (f) { - var _this = this; - assert(isFunction(f), 'The f passed in customGrad(f) must be a function.'); - return function () { - var inputs = []; - for (var _i = 0; _i < arguments.length; _i++) { - inputs[_i] = arguments[_i]; - } - assert(inputs.every(function (t) { return t instanceof Tensor; }), 'The args passed in customGrad(f)(x1, x2,...) must all be tensors'); - _this.customGradientDepth++; - var gradientsFunc; - var gradientsMode = true; - var result = tidy(f.name, function () { - var _a = f.apply(void 0, inputs), value = _a.value, gradFunc = _a.gradFunc; - assert(value instanceof Tensor, 'The function f passed in customGrad(f) must return an object ' + - 'where `obj.value` is a tensor'); - assert(isFunction(gradFunc), 'The function f passed in customGrad(f) must return an object ' + - 'where `obj.gradFunc` is a function.'); - gradientsFunc = gradFunc; - return value; - }, gradientsMode); - _this.customGradientDepth--; - if (_this.shouldRecord()) { - var gradFunc = function (dy) { - var res = gradientsFunc(dy); - var grads$$1 = Array.isArray(res) ? res : [res]; - assert(grads$$1.length === inputs.length, 'The function f passed in customGrad(f) must return an object ' + - 'where `obj.gradFunc` is a function that returns the same ' + - 'number of tensors as inputs passed to f(...).'); - assert(grads$$1.every(function (t) { return t instanceof Tensor; }), 'The function f passed in customGrad(f) must return an object ' + - 'where `obj.gradFunc` is a function that returns a list of ' + - 'only tensors.'); - return grads$$1; - }; - _this.addTapeNode(inputs, result, gradFunc); - } - return result; - }; - }; - Engine.prototype.write = function (dataId, values) { - this.backend.write(dataId, values); - }; - Engine.prototype.readSync = function (dataId) { - return this.backend.readSync(dataId); - }; - Engine.prototype.read = function (dataId) { - return this.backend.read(dataId); - }; - Engine.prototype.fromPixels = function (pixels, numChannels) { - return this.backend.fromPixels(pixels, numChannels); - }; - Engine.prototype.time = function (query) { - return __awaiter$2(this, void 0, void 0, function () { - var start, timingInfo; - return __generator$2(this, function (_a) { - switch (_a.label) { - case 0: - start = performance.now(); - return [4, this.backend.time(query)]; - case 1: - timingInfo = _a.sent(); - timingInfo.wallMs = performance.now() - start; - return [2, timingInfo]; - } - }); - }); - }; - Engine.prototype.track = function (result) { - if (this.scopeStack.length === 1 && this.safeMode) { - throw new Error('Safe mode is ON. Enclose all tensor operations inside tf.tidy(): ' + - 'tf.tidy(() => {op();...}); to avoid memory leaks.'); - } - this.activeScope.track.push(result); - return result; - }; - return Engine; - }()); - - var __decorate$q = (undefined && undefined.__decorate) || function (decorators, target, key, desc) { - var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; - if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); - else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; - return c > 3 && r && Object.defineProperty(target, key, r), r; - }; - var Type; - (function (Type) { - Type[Type["NUMBER"] = 0] = "NUMBER"; - Type[Type["BOOLEAN"] = 1] = "BOOLEAN"; - Type[Type["STRING"] = 2] = "STRING"; - })(Type || (Type = {})); - var URL_PROPERTIES = [ - { name: 'DEBUG', type: Type.BOOLEAN }, { name: 'IS_BROWSER', type: Type.BOOLEAN }, - { name: 'WEBGL_DISJOINT_QUERY_TIMER_EXTENSION_VERSION', type: Type.NUMBER }, - { name: 'WEBGL_DISJOINT_QUERY_TIMER_EXTENSION_RELIABLE', type: Type.BOOLEAN }, - { name: 'WEBGL_VERSION', type: Type.NUMBER }, - { name: 'WEBGL_FLOAT_TEXTURE_ENABLED', type: Type.BOOLEAN }, { - name: 'WEBGL_GET_BUFFER_SUB_DATA_ASYNC_EXTENSION_ENABLED', - type: Type.BOOLEAN - }, - { name: 'BACKEND', type: Type.STRING } - ]; - function hasExtension(gl, extensionName) { - var ext = gl.getExtension(extensionName); - return ext != null; - } - function getWebGLRenderingContext(webGLVersion) { - if (webGLVersion === 0) { - throw new Error('Cannot get WebGL rendering context, WebGL is disabled.'); - } - var tempCanvas = document.createElement('canvas'); - if (webGLVersion === 1) { - return (tempCanvas.getContext('webgl') || - tempCanvas.getContext('experimental-webgl')); - } - return tempCanvas.getContext('webgl2'); - } - function loseContext(gl) { - if (gl != null) { - var loseContextExtension = gl.getExtension('WEBGL_lose_context'); - if (loseContextExtension == null) { - throw new Error('Extension WEBGL_lose_context not supported on this browser.'); - } - loseContextExtension.loseContext(); - } - } - function isWebGLVersionEnabled(webGLVersion) { - var gl = getWebGLRenderingContext(webGLVersion); - if (gl != null) { - loseContext(gl); - return true; - } - return false; - } - function getWebGLDisjointQueryTimerVersion(webGLVersion) { - if (webGLVersion === 0) { - return 0; - } - var queryTimerVersion; - var gl = getWebGLRenderingContext(webGLVersion); - if (hasExtension(gl, 'EXT_disjoint_timer_query_webgl2') && - webGLVersion === 2) { - queryTimerVersion = 2; - } - else if (hasExtension(gl, 'EXT_disjoint_timer_query')) { - queryTimerVersion = 1; - } - else { - queryTimerVersion = 0; - } - if (gl != null) { - loseContext(gl); - } - return queryTimerVersion; - } - function isFloatTextureReadPixelsEnabled(webGLVersion) { - if (webGLVersion === 0) { - return false; - } - var gl = getWebGLRenderingContext(webGLVersion); - if (webGLVersion === 1) { - if (!hasExtension(gl, 'OES_texture_float')) { - return false; - } - } - else { - if (!hasExtension(gl, 'EXT_color_buffer_float')) { - return false; - } - } - var frameBuffer = gl.createFramebuffer(); - var texture = gl.createTexture(); - gl.bindTexture(gl.TEXTURE_2D, texture); - var internalFormat = webGLVersion === 2 ? gl.RGBA32F : gl.RGBA; - gl.texImage2D(gl.TEXTURE_2D, 0, internalFormat, 1, 1, 0, gl.RGBA, gl.FLOAT, null); - gl.bindFramebuffer(gl.FRAMEBUFFER, frameBuffer); - gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, texture, 0); - var frameBufferComplete = (gl.checkFramebufferStatus(gl.FRAMEBUFFER) === gl.FRAMEBUFFER_COMPLETE); - gl.readPixels(0, 0, 1, 1, gl.RGBA, gl.FLOAT, new Float32Array(4)); - var readPixelsNoError = gl.getError() === gl.NO_ERROR; - loseContext(gl); - return frameBufferComplete && readPixelsNoError; - } - function isWebGLGetBufferSubDataAsyncExtensionEnabled(webGLVersion) { - if (webGLVersion > 0) { - return false; - } - if (webGLVersion !== 2) { - return false; - } - var gl = getWebGLRenderingContext(webGLVersion); - var isEnabled = hasExtension(gl, 'WEBGL_get_buffer_sub_data_async'); - loseContext(gl); - return isEnabled; - } - var Environment = (function () { - function Environment(features) { - this.features = {}; - this.registry = {}; - if (features != null) { - this.features = features; - } - if (this.get('DEBUG')) { - console.warn('Debugging mode is ON. The output of every math call will ' + - 'be downloaded to CPU and checked for NaNs. ' + - 'This significantly impacts performance.'); - } - } - Environment.setBackend = function (backendType, safeMode) { - if (safeMode === void 0) { safeMode = false; } - if (!(backendType in ENV.registry)) { - throw new Error("Backend type '" + backendType + "' not found in registry"); - } - ENV.initBackend(backendType, safeMode); - }; - Environment.getBackend = function () { - ENV.initDefaultBackend(); - return ENV.currentBackend; - }; - Environment.disposeVariables = function () { - ENV.engine.disposeVariables(); - }; - Environment.memory = function () { - return ENV.engine.memory(); - }; - Environment.prototype.get = function (feature) { - if (feature in this.features) { - return this.features[feature]; - } - this.features[feature] = this.evaluateFeature(feature); - return this.features[feature]; - }; - Environment.prototype.set = function (feature, value) { - this.features[feature] = value; - }; - Environment.prototype.getBestBackendType = function () { - var _this = this; - if (Object.keys(this.registry).length === 0) { - throw new Error('No backend found in registry.'); - } - var sortedBackends = Object.keys(this.registry) - .map(function (name) { - return { name: name, entry: _this.registry[name] }; - }) - .sort(function (a, b) { - return b.entry.priority - a.entry.priority; - }); - return sortedBackends[0].name; - }; - Environment.prototype.evaluateFeature = function (feature) { - if (feature === 'DEBUG') { - return false; - } - else if (feature === 'IS_BROWSER') { - return typeof window !== 'undefined'; - } - else if (feature === 'BACKEND') { - return this.getBestBackendType(); - } - else if (feature === 'WEBGL_DISJOINT_QUERY_TIMER_EXTENSION_VERSION') { - var webGLVersion = this.get('WEBGL_VERSION'); - if (webGLVersion === 0) { - return 0; - } - return getWebGLDisjointQueryTimerVersion(webGLVersion); - } - else if (feature === 'WEBGL_DISJOINT_QUERY_TIMER_EXTENSION_RELIABLE') { - return this.get('WEBGL_DISJOINT_QUERY_TIMER_EXTENSION_VERSION') > 0 && - !isMobile(); - } - else if (feature === 'WEBGL_VERSION') { - if (isWebGLVersionEnabled(2)) { - return 2; - } - else if (isWebGLVersionEnabled(1)) { - return 1; - } - return 0; - } - else if (feature === 'WEBGL_FLOAT_TEXTURE_ENABLED') { - return isFloatTextureReadPixelsEnabled(this.get('WEBGL_VERSION')); - } - else if (feature === 'WEBGL_GET_BUFFER_SUB_DATA_ASYNC_EXTENSION_ENABLED') { - return isWebGLGetBufferSubDataAsyncExtensionEnabled(this.get('WEBGL_VERSION')); - } - throw new Error("Unknown feature " + feature + "."); - }; - Environment.prototype.setFeatures = function (features) { - this.features = features; - }; - Environment.prototype.reset = function () { - this.features = getFeaturesFromURL(); - if (this.globalEngine != null) { - this.globalEngine.dispose(); - this.globalEngine = null; - } - }; - Environment.prototype.initBackend = function (backendType, safeMode) { - if (safeMode === void 0) { safeMode = false; } - this.currentBackend = backendType; - if (this.globalEngine != null) { - this.globalEngine.dispose(); - } - var backend = ENV.findBackend(backendType); - this.globalEngine = new Engine(backend, safeMode); - }; - Environment.prototype.findBackend = function (name) { - if (!(name in this.registry)) { - return null; - } - return this.registry[name].backend; - }; - Environment.prototype.registerBackend = function (name, factory, priority) { - if (priority === void 0) { priority = 1; } - if (name in this.registry) { - console.warn(name + " backend was already registered"); - } - try { - var backend = factory(); - this.registry[name] = { backend: backend, priority: priority }; - return true; - } - catch (err) { - console.warn(err.message); - return false; - } - }; - Environment.prototype.removeBackend = function (name) { - if (!(name in this.registry)) { - throw new Error(name + " backend not found in registry"); - } - this.registry[name].backend.dispose(); - delete this.registry[name]; - }; - Object.defineProperty(Environment.prototype, "engine", { - get: function () { - this.initDefaultBackend(); - return this.globalEngine; - }, - enumerable: true, - configurable: true - }); - Environment.prototype.initDefaultBackend = function () { - if (this.globalEngine == null) { - this.initBackend(ENV.get('BACKEND'), false); - } - }; - __decorate$q([ - doc({ heading: 'Environment' }) - ], Environment, "setBackend", null); - __decorate$q([ - doc({ heading: 'Environment' }) - ], Environment, "getBackend", null); - __decorate$q([ - doc({ heading: 'Environment' }) - ], Environment, "disposeVariables", null); - __decorate$q([ - doc({ heading: 'Performance', subheading: 'Memory' }) - ], Environment, "memory", null); - return Environment; - }()); - var TENSORFLOWJS_FLAGS_PREFIX = 'tfjsflags'; - function getFeaturesFromURL() { - var features = {}; - if (typeof window === 'undefined' || typeof window.location === 'undefined') { - return features; - } - var urlParams = getQueryParams(window.location.search); - if (TENSORFLOWJS_FLAGS_PREFIX in urlParams) { - var urlFlags_1 = {}; - var keyValues = urlParams[TENSORFLOWJS_FLAGS_PREFIX].split(','); - keyValues.forEach(function (keyValue) { - var _a = keyValue.split(':'), key = _a[0], value = _a[1]; - urlFlags_1[key] = value; - }); - URL_PROPERTIES.forEach(function (urlProperty) { - if (urlProperty.name in urlFlags_1) { - console.log("Setting feature override from URL " + urlProperty.name + ": " + - ("" + urlFlags_1[urlProperty.name])); - if (urlProperty.type === Type.NUMBER) { - features[urlProperty.name] = +urlFlags_1[urlProperty.name]; - } - else if (urlProperty.type === Type.BOOLEAN) { - features[urlProperty.name] = urlFlags_1[urlProperty.name] === 'true'; - } - else if (urlProperty.type === Type.STRING) { - features[urlProperty.name] = urlFlags_1[urlProperty.name]; - } - else { - console.warn("Unknown URL param: " + urlProperty.name + "."); - } - } - }); - } - return features; - } - function getGlobalNamespace() { - var ns; - if (typeof (window) !== 'undefined') { - ns = window; - } - else if (typeof (global) !== 'undefined') { - ns = global; - } - else { - throw new Error('Could not find a global object'); - } - return ns; - } - function getOrMakeEnvironment() { - var ns = getGlobalNamespace(); - ns.ENV = ns.ENV || new Environment(getFeaturesFromURL()); - return ns.ENV; - } - var ENV = getOrMakeEnvironment(); - - var environment = /*#__PURE__*/Object.freeze({ - get Type () { return Type; }, - URL_PROPERTIES: URL_PROPERTIES, - Environment: Environment, - ENV: ENV - }); - - var PARALLELIZE_THRESHOLD = 30; - function computeOptimalWindowSize(inSize) { - if (inSize <= PARALLELIZE_THRESHOLD) { - return inSize; - } - return nearestDivisor(inSize, Math.floor(Math.sqrt(inSize))); - } - function nearestDivisor(size, start) { - for (var i = start; i < size; ++i) { - if (size % i === 0) { - return i; - } - } - return size; - } - - function castTensor(x, dtype, backend) { - if (!hasEncodingLoss(x.dtype, dtype)) { - return Tensor.make(x.shape, { dataId: x.dataId }, dtype); - } - if (dtype === 'int32') { - return backend.int(x); - } - else if (dtype === 'bool') { - return backend.notEqual(x, ArrayOps.scalar(0, x.dtype)); - } - else { - throw new Error("Error in Cast: unknown dtype argument (" + dtype + ")"); - } - } - function reshapeTensor(x, shape) { - return Tensor.make(shape, { dataId: x.dataId }, x.dtype); - } - - var ArgMinMaxProgram = (function () { - function ArgMinMaxProgram(reduceInfo, op, firstPass) { - this.variableNames = ['A']; - var windowSize = reduceInfo.windowSize; - var batchSize = reduceInfo.batchSize; - var inSize = reduceInfo.inSize; - var outSize = Math.ceil(inSize / windowSize); - if (!firstPass) { - this.variableNames.push('bestIndicesA'); - } - this.outputShape = [batchSize, outSize]; - var compOp = (op === 'max') ? '>' : '<'; - var indexSnippet = firstPass ? - 'inOffset + i;' : - 'round(getBestIndicesA(batch, inOffset + i));'; - this.userCode = "\n void main() {\n ivec2 coords = getOutputCoords();\n int batch = coords[0];\n int outIdx = coords[1];\n int inOffset = outIdx * " + windowSize + ";\n\n int bestIndex = 0;\n float bestValue = getA(batch, inOffset);\n\n for (int i = 0; i < " + windowSize + "; i++) {\n int inIdx = " + indexSnippet + ";\n float candidate = getA(batch, inIdx);\n if (candidate " + compOp + " bestValue) {\n bestValue = candidate;\n bestIndex = inIdx;\n }\n }\n setOutput(float(bestIndex));\n }\n "; - } - return ArgMinMaxProgram; - }()); - - var AvgPool2DBackpropProgram = (function () { - function AvgPool2DBackpropProgram(convInfo) { - this.variableNames = ['dy']; - this.outputShape = convInfo.inShape; - var filterHeight = convInfo.filterHeight; - var filterWidth = convInfo.filterWidth; - var strideHeight = convInfo.strideHeight; - var strideWidth = convInfo.strideWidth; - var padTop = filterHeight - 1 - convInfo.padInfo.top; - var padLeft = filterWidth - 1 - convInfo.padInfo.left; - var avgMultiplier = 1 / (filterHeight * filterWidth); - this.userCode = "\n const ivec2 pads = ivec2(" + padTop + ", " + padLeft + ");\n const float avgMultiplier = float(" + avgMultiplier + ");\n\n void main() {\n ivec4 coords = getOutputCoords();\n int b = coords[0];\n int d = coords[3];\n\n ivec2 dyRCCorner = coords.yz - pads;\n int dyRCorner = dyRCCorner.x;\n int dyCCorner = dyRCCorner.y;\n\n // Convolve dy(?, ?, d) with pos mask(:, :, d) to get dx(xR, xC, d).\n // ? = to be determined. : = across all values in that axis.\n float dotProd = 0.0;\n for (int wR = 0; wR < " + filterHeight + "; wR++) {\n float dyR = float(dyRCorner + wR) / " + strideHeight + ".0;\n\n if (dyR < 0.0 || dyR >= " + convInfo.outHeight + ".0 || fract(dyR) > 0.0) {\n continue;\n }\n int idyR = int(dyR);\n\n for (int wC = 0; wC < " + filterWidth + "; wC++) {\n float dyC = float(dyCCorner + wC) / " + strideWidth + ".0;\n\n if (dyC < 0.0 || dyC >= " + convInfo.outWidth + ".0 ||\n fract(dyC) > 0.0) {\n continue;\n }\n int idyC = int(dyC);\n\n float dyValue = getDy(b, idyR, idyC, d);\n\n dotProd += dyValue * avgMultiplier;\n }\n }\n setOutput(dotProd);\n }\n "; - } - return AvgPool2DBackpropProgram; - }()); - - var BatchNormProgram = (function () { - function BatchNormProgram(xShape, meanShape, varianceShape, offsetShape, scaleShape, varianceEpsilon) { - this.outputShape = []; - this.supportsBroadcasting = true; - this.variableNames = ['x', 'mean', 'variance']; - assertAndGetBroadcastShape(xShape, meanShape); - assertAndGetBroadcastShape(xShape, varianceShape); - var offsetSnippet = '0.0'; - if (offsetShape != null) { - assertAndGetBroadcastShape(xShape, offsetShape); - this.variableNames.push('offset'); - offsetSnippet = 'getOffsetAtOutCoords()'; - } - var scaleSnippet = '1.0'; - if (scaleShape != null) { - assertAndGetBroadcastShape(xShape, scaleShape); - this.variableNames.push('scale'); - scaleSnippet = 'getScaleAtOutCoords()'; - } - this.outputShape = xShape; - this.userCode = "\n void main() {\n float x = getXAtOutCoords();\n float mean = getMeanAtOutCoords();\n float variance = getVarianceAtOutCoords();\n float offset = " + offsetSnippet + ";\n float scale = " + scaleSnippet + ";\n float inv = scale * inversesqrt(variance + float(" + varianceEpsilon + "));\n setOutput((x - mean) * inv + offset);\n }\n "; - } - return BatchNormProgram; - }()); - - var CHECK_NAN_SNIPPET = "\n if (isNaN(a)) return a;\n if (isNaN(b)) return b;\n"; - var ADD = 'return a + b;'; - var SUB = 'return a - b;'; - var MUL = 'return a * b;'; - var DIV = 'return a / b;'; - var INT_DIV = "\n float resultSign = sign(a) * sign(b);\n int ia = round(a);\n int ib = round(b);\n int result = ia / ib;\n int amodb = ia - ib * result;\n\n if (resultSign < 0.0 && amodb != 0) {\n result -= 1;\n }\n return float(result);\n"; - var POW = "\n return (round(mod(b, 2.0)) == 0 || round(mod(b, 2.0)) == 2) ?\n pow(abs(a), b) : sign(a) * pow(abs(a), b);\n"; - var SQUARED_DIFFERENCE = 'return (a - b) * (a - b);'; - var EQUAL = "return float(a == b);"; - var NOT_EQUAL = "return float(a != b);"; - var LESS = "return float(a < b);"; - var LESS_EQUAL = "return float(a <= b);"; - var GREATER = "return float(a > b);"; - var GREATER_EQUAL = "return float(a >= b);"; - var LOGICAL_AND = "return float(a >= 1.0 && b >= 1.0);"; - var LOGICAL_OR = "return float(a >= 1.0 || b >= 1.0);"; - var MAX = CHECK_NAN_SNIPPET + "\n return max(a, b);\n"; - var MIN = CHECK_NAN_SNIPPET + "\n return min(a, b);\n"; - var MOD = "return mod(a, b);"; - var ATAN2 = CHECK_NAN_SNIPPET + "\n return atan(a, b);\n"; - var ELU_DER = "return (b >= 1.0) ? a : a * (b + 1.0);"; - var BinaryOpProgram = (function () { - function BinaryOpProgram(op, aShape, bShape) { - this.variableNames = ['A', 'B']; - this.supportsBroadcasting = true; - this.outputShape = - assertAndGetBroadcastShape(aShape, bShape); - this.userCode = "\n float binaryOperation(float a, float b) {\n " + op + "\n }\n\n void main() {\n float a = getAAtOutCoords();\n float b = getBAtOutCoords();\n setOutput(binaryOperation(a, b));\n }\n "; - } - return BinaryOpProgram; - }()); - - var ClipProgram = (function () { - function ClipProgram(aShape, min, max) { - this.variableNames = ['A']; - this.outputShape = aShape; - var minFixed = min.toFixed(20); - var maxFixed = max.toFixed(20); - this.userCode = "\n void main() {\n float value = getAAtOutCoords();\n if (isNaN(value)) {\n setOutput(value);\n return;\n }\n\n setOutput(clamp(value, " + minFixed + ", " + maxFixed + "));\n }\n "; - } - return ClipProgram; - }()); - - var ConcatProgram = (function () { - function ConcatProgram(aShape, bShape) { - this.variableNames = ['A', 'B']; - this.outputShape = []; - this.outputShape = - computeOutShape(aShape, bShape, 1); - this.userCode = "\n void main() {\n ivec2 coords = getOutputCoords();\n int yR = coords.x;\n int yC = coords.y;\n\n float value = 0.0;\n if (yC < " + aShape[1] + ") {\n value = getA(yR, yC);\n } else {\n yC -= " + aShape[1] + ";\n value = getB(yR, yC);\n }\n\n setOutput(value);\n }\n "; - } - return ConcatProgram; - }()); - - var Conv2DDerFilterProgram = (function () { - function Conv2DDerFilterProgram(convInfo) { - this.variableNames = ['x', 'dy']; - this.outputShape = convInfo.filterShape; - var strideHeight = convInfo.strideHeight; - var strideWidth = convInfo.strideWidth; - var padTop = convInfo.padInfo.top; - var padLeft = convInfo.padInfo.left; - this.userCode = "\n void main() {\n ivec4 coords = getOutputCoords();\n int wR = coords.x;\n int wC = coords.y;\n int d1 = coords.z;\n int d2 = coords.w;\n\n // Convolve x(?, ?, d1) with dy(:, :, d2) to get dw(wR, wC, d1, d2).\n // ? = to be determined. : = across all values in that axis.\n float dotProd = 0.0;\n\n for (int b = 0; b < " + convInfo.batchSize + "; b++) {\n for (int yR = 0; yR < " + convInfo.outHeight + "; yR++) {\n int xR = wR + yR * " + strideHeight + " - " + padTop + ";\n\n if (xR < 0 || xR >= " + convInfo.inHeight + ") {\n continue;\n }\n\n for (int yC = 0; yC < " + convInfo.outWidth + "; yC++) {\n int xC = wC + yC * " + strideWidth + " - " + padLeft + ";\n\n if (xC < 0 || xC >= " + convInfo.inWidth + ") {\n continue;\n }\n\n float dyValue = getDy(b, yR, yC, d2);\n float xValue = getX(b, xR, xC, d1);\n dotProd += (xValue * dyValue);\n }\n }\n }\n setOutput(dotProd);\n }\n "; - } - return Conv2DDerFilterProgram; - }()); - var Conv2DDerInputProgram = (function () { - function Conv2DDerInputProgram(convInfo) { - this.variableNames = ['dy', 'W']; - this.outputShape = convInfo.inShape; - var filterHeight = convInfo.filterHeight; - var filterWidth = convInfo.filterWidth; - var strideHeight = convInfo.strideHeight; - var strideWidth = convInfo.strideWidth; - var padTop = filterHeight - 1 - convInfo.padInfo.top; - var padLeft = filterWidth - 1 - convInfo.padInfo.left; - this.userCode = "\n const ivec2 pads = ivec2(" + padTop + ", " + padLeft + ");\n\n void main() {\n ivec4 coords = getOutputCoords();\n int batch = coords[0];\n int d1 = coords[3];\n\n ivec2 dyCorner = coords.yz - pads;\n int dyRCorner = dyCorner.x;\n int dyCCorner = dyCorner.y;\n\n // Convolve dy(?, ?, d2) with w(:, :, d1, d2) to compute dx(xR, xC, d1).\n // ? = to be determined. : = across all values in that axis.\n float dotProd = 0.0;\n for (int wR = 0; wR < " + filterHeight + "; wR++) {\n float dyR = float(dyRCorner + wR) / " + strideHeight + ".0;\n\n if (dyR < 0.0 || dyR >= " + convInfo.outHeight + ".0 || fract(dyR) > 0.0) {\n continue;\n }\n int idyR = int(dyR);\n\n int wRPerm = " + filterHeight + " - 1 - wR;\n\n for (int wC = 0; wC < " + filterWidth + "; wC++) {\n float dyC = float(dyCCorner + wC) / " + strideWidth + ".0;\n\n if (dyC < 0.0 || dyC >= " + convInfo.outWidth + ".0 ||\n fract(dyC) > 0.0) {\n continue;\n }\n int idyC = int(dyC);\n\n int wCPerm = " + filterWidth + " - 1 - wC;\n\n for (int d2 = 0; d2 < " + convInfo.outChannels + "; d2++) {\n float xValue = getDy(batch, idyR, idyC, d2);\n float wValue = getW(wRPerm, wCPerm, d1, d2);\n dotProd += xValue * wValue;\n }\n }\n }\n setOutput(dotProd);\n }\n "; - } - return Conv2DDerInputProgram; - }()); - - var Conv2DProgram = (function () { - function Conv2DProgram(convInfo) { - this.variableNames = ['x', 'W']; - this.outputShape = convInfo.outShape; - var padTop = convInfo.padInfo.top; - var padLeft = convInfo.padInfo.left; - var strideHeight = convInfo.strideHeight; - var strideWidth = convInfo.strideWidth; - var dilationHeight = convInfo.dilationHeight; - var dilationWidth = convInfo.dilationWidth; - var filterHeight = convInfo.filterHeight; - var filterWidth = convInfo.filterWidth; - var inputDepthNearestVec4 = Math.floor(convInfo.inChannels / 4) * 4; - var inputDepthVec4Remainder = convInfo.inChannels % 4; - this.userCode = "\n const ivec2 strides = ivec2(" + strideHeight + ", " + strideWidth + ");\n const ivec2 pads = ivec2(" + padTop + ", " + padLeft + ");\n\n void main() {\n ivec4 coords = getOutputCoords();\n int batch = coords[0];\n int d2 = coords[3];\n\n ivec2 xRCCorner = coords.yz * strides - pads;\n int xRCorner = xRCCorner.x;\n int xCCorner = xRCCorner.y;\n\n // Convolve x(?, ?, d1) with w(:, :, d1, d2) to get y(yR, yC, d2).\n // ? = to be determined. : = across all values in that axis.\n float dotProd = 0.0;\n for (int wR = 0; wR < " + filterHeight + "; wR++) {\n int xR = xRCorner + wR * " + dilationHeight + ";\n\n if (xR < 0 || xR >= " + convInfo.inHeight + ") {\n continue;\n }\n\n for (int wC = 0; wC < " + filterWidth + "; wC++) {\n int xC = xCCorner + wC * " + dilationWidth + ";\n\n if (xC < 0 || xC >= " + convInfo.inWidth + ") {\n continue;\n }\n\n for (int d1 = 0; d1 < " + inputDepthNearestVec4 + "; d1 += 4) {\n vec4 xValues = vec4(\n getX(batch, xR, xC, d1),\n getX(batch, xR, xC, d1 + 1),\n getX(batch, xR, xC, d1 + 2),\n getX(batch, xR, xC, d1 + 3)\n );\n vec4 wValues = vec4(\n getW(wR, wC, d1, d2),\n getW(wR, wC, d1 + 1, d2),\n getW(wR, wC, d1 + 2, d2),\n getW(wR, wC, d1 + 3, d2)\n );\n\n dotProd += dot(xValues, wValues);\n }\n\n if (" + (inputDepthVec4Remainder === 1) + ") {\n dotProd +=\n getX(batch, xR, xC, " + inputDepthNearestVec4 + ") *\n getW(wR, wC, " + inputDepthNearestVec4 + ", d2);\n } else if (" + (inputDepthVec4Remainder === 2) + ") {\n vec2 xValues = vec2(\n getX(batch, xR, xC, " + inputDepthNearestVec4 + "),\n getX(batch, xR, xC, " + inputDepthNearestVec4 + " + 1)\n );\n vec2 wValues = vec2(\n getW(wR, wC, " + inputDepthNearestVec4 + ", d2),\n getW(wR, wC, " + inputDepthNearestVec4 + " + 1, d2)\n );\n dotProd += dot(xValues, wValues);\n } else if (" + (inputDepthVec4Remainder === 3) + ") {\n vec3 xValues = vec3(\n getX(batch, xR, xC, " + inputDepthNearestVec4 + "),\n getX(batch, xR, xC, " + inputDepthNearestVec4 + " + 1),\n getX(batch, xR, xC, " + inputDepthNearestVec4 + " + 2)\n );\n vec3 wValues = vec3(\n getW(wR, wC, " + inputDepthNearestVec4 + ", d2),\n getW(wR, wC, " + inputDepthNearestVec4 + " + 1, d2),\n getW(wR, wC, " + inputDepthNearestVec4 + " + 2, d2)\n );\n dotProd += dot(xValues, wValues);\n }\n }\n }\n setOutput(dotProd);\n }\n "; - } - return Conv2DProgram; - }()); - - var TextureType; - (function (TextureType) { - TextureType[TextureType["FLOAT"] = 0] = "FLOAT"; - TextureType[TextureType["UNSIGNED_BYTE"] = 1] = "UNSIGNED_BYTE"; - })(TextureType || (TextureType = {})); - function getUnpackedMatrixTextureShapeWidthHeight(rows, columns) { - return [columns, rows]; - } - function getUnpackedArraySizeFromMatrixSize(matrixSize, channelsPerTexture) { - return matrixSize * channelsPerTexture; - } - function getColorMatrixTextureShapeWidthHeight(rows, columns) { - return [columns * 4, rows]; - } - function getMatrixSizeFromUnpackedArraySize(unpackedSize, channelsPerTexture) { - if (unpackedSize % channelsPerTexture !== 0) { - throw new Error("unpackedSize (" + unpackedSize + ") must be a multiple of " + - ("" + channelsPerTexture)); - } - return unpackedSize / channelsPerTexture; - } - function encodeMatrixToUnpackedArray(matrix, unpackedArray, channelsPerTexture) { - var requiredSize = getUnpackedArraySizeFromMatrixSize(matrix.length, channelsPerTexture); - if (unpackedArray.length < requiredSize) { - throw new Error("unpackedArray length (" + unpackedArray.length + ") must be >= " + - ("" + requiredSize)); - } - var dst = 0; - for (var src = 0; src < matrix.length; ++src) { - unpackedArray[dst] = matrix[src]; - dst += channelsPerTexture; - } - } - var FLOAT_MAX = 20000; - var FLOAT_MIN = -FLOAT_MAX; - var FLOAT_RANGE = (FLOAT_MAX - FLOAT_MIN) / 255; - var FLOAT_DELTAS = [1, 1 / 255, 1 / (255 * 255), 1 / (255 * 255 * 255)]; - var FLOAT_POWERS = [1, 255, 255 * 255]; - var BYTE_NAN_VALUE = 0; - function encodeFloatArray(floatArray) { - var uintArray = new Uint8Array(floatArray.length * 4); - var _loop_1 = function (i) { - var value = floatArray[i / 4]; - if (isNaN(value)) { - uintArray[i] = BYTE_NAN_VALUE; - uintArray[i + 1] = BYTE_NAN_VALUE; - uintArray[i + 2] = BYTE_NAN_VALUE; - uintArray[i + 3] = BYTE_NAN_VALUE; - return "continue"; - } - var normalizedValue = (value - FLOAT_MIN) / FLOAT_RANGE; - var enc = FLOAT_POWERS.map(function (pow) { return pow * normalizedValue; }); - var buckets = enc.map(function (value) { return Math.floor((value % 1) * 255); }); - uintArray[i] = Math.floor(normalizedValue); - uintArray[i + 1] = buckets[0]; - uintArray[i + 2] = buckets[1]; - uintArray[i + 3] = buckets[2]; - }; - for (var i = 0; i < uintArray.length; i += 4) { - _loop_1(i); - } - return uintArray; - } - function decodeToFloatArray(uintArray) { - var floatArray = new Float32Array(uintArray.length / 4); - var _loop_2 = function (i) { - if (uintArray[i] === BYTE_NAN_VALUE && - uintArray[i + 1] === BYTE_NAN_VALUE && - uintArray[i + 2] === BYTE_NAN_VALUE && - uintArray[i + 3] === BYTE_NAN_VALUE) { - floatArray[i / 4] = NaN; - return "continue"; - } - var dot = 0; - FLOAT_DELTAS.forEach(function (delta, j) { - dot += delta * uintArray[i + j]; - }); - var value = dot * FLOAT_RANGE + FLOAT_MIN; - floatArray[i / 4] = value; - }; - for (var i = 0; i < uintArray.length; i += 4) { - _loop_2(i); - } - return floatArray; - } - function decodeMatrixFromUnpackedArray(unpackedArray, matrix, channelsPerTexture) { - var requiredSize = getMatrixSizeFromUnpackedArraySize(unpackedArray.length, channelsPerTexture); - if (matrix.length < requiredSize) { - throw new Error("matrix length (" + matrix.length + ") must be >= " + requiredSize); - } - var dst = 0; - for (var src = 0; src < unpackedArray.length; src += channelsPerTexture) { - matrix[dst++] = unpackedArray[src]; - } - } - function decodeMatrixFromUnpackedColorRGBAArray(unpackedArray, matrix, channels) { - var requiredSize = unpackedArray.length * channels / 4; - if (matrix.length < requiredSize) { - throw new Error("matrix length (" + matrix.length + ") must be >= " + requiredSize); - } - var dst = 0; - for (var src = 0; src < unpackedArray.length; src += 4) { - for (var c = 0; c < channels; c++) { - matrix[dst++] = unpackedArray[src + c]; - } - } - } - function getPackedMatrixTextureShapeWidthHeight(rows, columns) { - return [Math.ceil(columns / 2), Math.ceil(rows / 2)]; - } - function getPackedRGBAArraySizeFromMatrixShape(rows, columns) { - var _a = getPackedMatrixTextureShapeWidthHeight(rows, columns), w = _a[0], h = _a[1]; - return w * h * 4; - } - function encodeMatrixToPackedRGBA(matrix, rows, columns, packedRGBA) { - var requiredSize = getPackedRGBAArraySizeFromMatrixShape(rows, columns); - if (packedRGBA.length < requiredSize) { - throw new Error("packedRGBA length (" + packedRGBA.length + ") must be >= " + requiredSize); - } - var _a = getPackedMatrixTextureShapeWidthHeight(rows, columns), textureWidth = _a[0], textureHeight = _a[1]; - var oddWidth = (columns % 2) === 1; - var oddHeight = (rows % 2) === 1; - var widthInFullBlocks = Math.floor(columns / 2); - var heightInFullBlocks = Math.floor(rows / 2); - { - var dstStride = (oddWidth ? 4 : 0); - var oneRow = columns; - var dst = 0; - for (var blockY = 0; blockY < heightInFullBlocks; ++blockY) { - var matrixSrcRow = (blockY * 2 * columns); - for (var blockX = 0; blockX < widthInFullBlocks; ++blockX) { - var matrixSrcCol = blockX * 2; - var src = matrixSrcRow + matrixSrcCol; - packedRGBA[dst] = matrix[src]; - packedRGBA[dst + 1] = matrix[src + 1]; - packedRGBA[dst + 2] = matrix[src + oneRow]; - packedRGBA[dst + 3] = matrix[src + oneRow + 1]; - dst += 4; - } - dst += dstStride; - } - } - if (oddWidth) { - var src = columns - 1; - var dst = (textureWidth - 1) * 4; - var srcStride = 2 * columns; - var dstStride = textureWidth * 4; - for (var blockY = 0; blockY < heightInFullBlocks; ++blockY) { - packedRGBA[dst] = matrix[src]; - packedRGBA[dst + 2] = matrix[src + columns]; - src += srcStride; - dst += dstStride; - } - } - if (oddHeight) { - var src = (rows - 1) * columns; - var dst = (textureHeight - 1) * textureWidth * 4; - for (var blockX = 0; blockX < widthInFullBlocks; ++blockX) { - packedRGBA[dst++] = matrix[src++]; - packedRGBA[dst++] = matrix[src++]; - dst += 2; - } - } - if (oddWidth && oddHeight) { - packedRGBA[packedRGBA.length - 4] = matrix[matrix.length - 1]; - } - return packedRGBA; - } - function decodeMatrixFromPackedRGBA(packedRGBA, rows, columns, matrix) { - var requiredSize = rows * columns; - if (requiredSize < matrix.length) { - throw new Error("matrix length (" + matrix.length + ") must be >= " + requiredSize); - } - var oddWidth = (columns % 2) === 1; - var oddHeight = (rows % 2) === 1; - var widthInFullBlocks = Math.floor(columns / 2); - var heightInFullBlocks = Math.floor(rows / 2); - var _a = getPackedMatrixTextureShapeWidthHeight(rows, columns), textureWidth = _a[0], textureHeight = _a[1]; - { - var srcStride = oddWidth ? 4 : 0; - var dstStride = columns + (oddWidth ? 1 : 0); - var src = 0; - var dstRow1 = 0; - var dstRow2 = columns; - for (var blockY = 0; blockY < heightInFullBlocks; ++blockY) { - for (var blockX = 0; blockX < widthInFullBlocks; ++blockX) { - matrix[dstRow1++] = packedRGBA[src++]; - matrix[dstRow1++] = packedRGBA[src++]; - matrix[dstRow2++] = packedRGBA[src++]; - matrix[dstRow2++] = packedRGBA[src++]; - } - src += srcStride; - dstRow1 += dstStride; - dstRow2 += dstStride; - } - } - if (oddWidth) { - var src = (textureWidth - 1) * 4; - var dst = columns - 1; - var srcStride = textureWidth * 4; - var dstStride = 2 * columns; - for (var blockY = 0; blockY < heightInFullBlocks; ++blockY) { - matrix[dst] = packedRGBA[src]; - matrix[dst + columns] = packedRGBA[src + 2]; - src += srcStride; - dst += dstStride; - } - } - if (oddHeight) { - var src = (textureHeight - 1) * textureWidth * 4; - var dst = (rows - 1) * columns; - for (var blockX = 0; blockX < widthInFullBlocks; ++blockX) { - matrix[dst++] = packedRGBA[src++]; - matrix[dst++] = packedRGBA[src++]; - src += 2; - } - } - if (oddWidth && oddHeight) { - matrix[matrix.length - 1] = packedRGBA[packedRGBA.length - 4]; - } - return matrix; - } - - function makeShader(inputsInfo, outputShape, userCode, broadcast) { - var sampleSnippet = getSampleSnippet(); - var setOutputSnippet = getSetOutputSnippet(); - var inputPrefixSnippet = inputsInfo.map(function (x) { return "uniform sampler2D " + x.name + ";"; }).join('\n'); - var inputSamplingSnippet = inputsInfo.map(function (x) { return getInputSamplingSnippet(x, outputShape, broadcast); }) - .join('\n'); - var outTexShape = outputShape.texShape; - var outputSamplingSnippet = getOutputSamplingSnippet(outputShape.logicalShape, outTexShape); - var source = [ - SHADER_PREFIX, sampleSnippet, setOutputSnippet, inputPrefixSnippet, - outputSamplingSnippet, inputSamplingSnippet, userCode - ].join('\n'); - return source; - } - function getSampleSnippet() { - return ENV.get('WEBGL_FLOAT_TEXTURE_ENABLED') ? - FLOAT_TEXTURE_SAMPLE_SNIPPET : - UNSIGNED_BYTE_TEXTURE_SAMPLE_SNIPPET; - } - function getSetOutputSnippet() { - return ENV.get('WEBGL_FLOAT_TEXTURE_ENABLED') ? - FLOAT_TEXTURE_SETOUTPUT_SNIPPET : - UNSIGNED_BYTE_TEXTURE_SETOUTPUT_SNIPPET; - } - function getSamplerFromInInfo(inInfo) { - var shape = inInfo.shapeInfo.logicalShape; - switch (shape.length) { - case 0: - return getSamplerScalar(inInfo); - case 1: - return getSampler1D(inInfo); - case 2: - return getSampler2D(inInfo); - case 3: - return getSampler3D(inInfo); - case 4: - return getSampler4D(inInfo); - default: - throw new Error(shape.length + "-D input sampling" + - " is not yet supported"); - } - } - function getInputSamplingSnippet(inInfo, outShapeInfo, broadcast) { - var res = getSamplerFlat(inInfo); - res += getSamplerFromInInfo(inInfo); - if (broadcast || - arraysEqual(inInfo.shapeInfo.logicalShape, outShapeInfo.logicalShape)) { - res += getSamplerAtOutputCoords(inInfo, outShapeInfo, broadcast); - } - return res; - } - function getOutputSamplingSnippet(outShape, outTexShape) { - switch (outShape.length) { - case 0: - return getOutputScalarCoords(); - case 1: - return getOutput1DCoords(outShape, outTexShape); - case 2: - return getOutput2DCoords(outShape, outTexShape); - case 3: - return getOutput3DCoords(outShape, outTexShape); - case 4: - return getOutput4DCoords(outShape, outTexShape); - default: - throw new Error(outShape.length + "-D output sampling is not yet supported"); - } - } - var SAMPLE_1D_SNIPPET = "\nvec2 UVfrom1D(int texNumR, int texNumC, int index) {\n int texR = index / texNumC;\n int texC = index - texR * texNumC;\n return (vec2(texC, texR) + halfCR) / vec2(texNumC, texNumR);\n}\n"; - var SAMPLE_2D_SNIPPET = "\nvec2 UVfrom2D(int texNumR, int texNumC, int numC, int row, int col) {\n int index = row * numC + col;\n int texR = index / texNumC;\n int texC = index - texR * texNumC;\n return (vec2(texC, texR) + halfCR) / vec2(texNumC, texNumR);\n}\n"; - var SAMPLE_3D_SNIPPET = "\nvec2 UVfrom3D(int texNumR, int texNumC, int stride0,\n int stride1, int row, int col, int depth) {\n // Explicitly use integer operations as dot() only works on floats.\n int index = row * stride0 + col * stride1 + depth;\n int texR = index / texNumC;\n int texC = index - texR * texNumC;\n return (vec2(texC, texR) + halfCR) / vec2(texNumC, texNumR);\n}\n"; - var SAMPLE_4D_SNIPPET = "\nvec2 UVfrom4D(int texNumR, int texNumC, int stride0,\n int stride1, int stride2, int row, int col, int depth,\n int depth2) {\n // Explicitly use integer operations as dot() only works on floats.\n int index = row * stride0 + col * stride1 + depth * stride2 + depth2;\n int texR = index / texNumC;\n int texC = index - texR * texNumC;\n return (vec2(texC, texR) + halfCR) / vec2(texNumC, texNumR);\n}\n"; - var UNSIGNED_BYTE_TEXTURE_SAMPLE_SNIPPET = "\n uniform float NaN;\n\n const vec4 floatDeltas = vec4(\n 1.0,\n 1.0 / 255.0,\n 1.0 / (255.0 * 255.0),\n 1.0 / (255.0 * 255.0 * 255.0)\n );\n const float minValue = " + FLOAT_MIN + ".0;\n const float maxValue = " + FLOAT_MAX + ".0;\n const float range = (maxValue - minValue) / 255.0;\n const vec2 dotRange = vec2(1.0, range);\n\n float sampleTexture(sampler2D textureSampler, vec2 uv) {\n vec4 sampleValue = texture2D(textureSampler, uv);\n if (all(equal(sampleValue, vec4(" + BYTE_NAN_VALUE + ")))) {\n return NaN;\n }\n\n vec4 encValue = floor(sampleValue * 255.0 + 0.5);\n float decodedValue = dot(encValue, floatDeltas);\n return dot(vec2(minValue, decodedValue), dotRange);\n }\n"; - var UNSIGNED_BYTE_TEXTURE_SETOUTPUT_SNIPPET = "\n const vec4 floatPowers = vec4(\n 1.0,\n 255.0,\n 255.0 * 255.0,\n 255.0 * 255.0 * 255.0\n );\n const vec2 recipRange = vec2(1.0/range);\n const vec2 recipRange255 = vec2(1.0/(maxValue - minValue));\n\n void setOutput(float decodedValue) {\n if (isNaN(decodedValue)) {\n gl_FragColor = vec4(" + BYTE_NAN_VALUE + ");\n return;\n }\n\n float a = dot(vec2(decodedValue, -minValue), recipRange);\n float b = fract(a) * 255.0;\n float c = fract(b) * 255.0;\n float d = fract(c) * 255.0;\n gl_FragColor = floor(vec4(a, b, c, d)) / 255.0;\n\n // TODO(dsmilkov): Version above gets better accuracy but probably slower\n // than the version below. Benchmark to determine if the accuracy is worth\n // the cost.\n\n // float normValue = dot(vec2(decodedValue, -minValue), recipRange255);\n // vec4 f = normValue * floatPowers;\n // gl_FragColor = floor(fract(f) * 255.0) / 255.0;\n }\n"; - var FLOAT_TEXTURE_SAMPLE_SNIPPET = "\n float sampleTexture(sampler2D textureSampler, vec2 uv) {\n return texture2D(textureSampler, uv).r;\n }\n"; - var FLOAT_TEXTURE_SETOUTPUT_SNIPPET = "\n void setOutput(float val) {\n gl_FragColor = vec4(val, 0, 0, 0);\n }\n"; - var SHADER_PREFIX = "\n precision highp float;\n precision highp int;\n varying vec2 resultUV;\n const vec2 halfCR = vec2(0.5, 0.5);\n\n bool isNaN(float val) {\n float v1 = val * val;\n float v2 = val * val;\n return v1 == v2 ? false : true;\n }\n\n bool hasNaN(vec4 values) {\n vec4 v1 = values * values;\n vec4 v2 = values * values;\n return any(notEqual(v1, v2));\n }\n\n float getNaN(vec4 values) {\n return dot(vec4(1), values);\n }\n\n int round(float value) {\n return int(floor(value + 0.5));\n }\n\n int imod(int x, int y) {\n return x - y * (x / y);\n }\n\n //Based on the work of Dave Hoskins\n //https://www.shadertoy.com/view/4djSRW\n #define HASHSCALE1 443.8975\n float random(float seed){\n vec2 p = resultUV * seed;\n vec3 p3 = fract(vec3(p.xyx) * HASHSCALE1);\n p3 += dot(p3, p3.yzx + 19.19);\n return fract((p3.x + p3.y) * p3.z);\n }\n\n " + SAMPLE_1D_SNIPPET + "\n " + SAMPLE_2D_SNIPPET + "\n " + SAMPLE_3D_SNIPPET + "\n " + SAMPLE_4D_SNIPPET + "\n"; - function getOutputScalarCoords() { - return "\n int getOutputCoords() {\n return 0;\n }\n "; - } - function getOutput1DCoords(shape, texShape) { - if (texShape[0] === 1) { - return "\n int getOutputCoords() {\n return int(resultUV.x * " + texShape[1] + ".0);\n }\n "; - } - if (texShape[1] === 1) { - return "\n int getOutputCoords() {\n return int(resultUV.y * " + texShape[0] + ".0);\n }\n "; - } - return "\n int getOutputCoords() {\n ivec2 resTexRC = ivec2(resultUV.yx *\n vec2(" + texShape[0] + ", " + texShape[1] + "));\n return resTexRC.x * " + texShape[1] + " + resTexRC.y;\n }\n "; - } - function getOutput3DCoords(shape, texShape) { - var stride0 = shape[1] * shape[2]; - var stride1 = shape[2]; - return "\n ivec3 getOutputCoords() {\n ivec2 resTexRC = ivec2(resultUV.yx *\n vec2(" + texShape[0] + ", " + texShape[1] + "));\n int index = resTexRC.x * " + texShape[1] + " + resTexRC.y;\n int r = index / " + stride0 + ";\n index -= r * " + stride0 + ";\n int c = index / " + stride1 + ";\n int d = index - c * " + stride1 + ";\n return ivec3(r, c, d);\n }\n "; - } - function getOutput4DCoords(shape, texShape) { - var stride2 = shape[3]; - var stride1 = shape[2] * stride2; - var stride0 = shape[1] * stride1; - return "\n ivec4 getOutputCoords() {\n ivec2 resTexRC = ivec2(resultUV.yx *\n vec2(" + texShape[0] + ", " + texShape[1] + "));\n int index = resTexRC.x * " + texShape[1] + " + resTexRC.y;\n\n int r = index / " + stride0 + ";\n index -= r * " + stride0 + ";\n\n int c = index / " + stride1 + ";\n index -= c * " + stride1 + ";\n\n int d = index / " + stride2 + ";\n int d2 = index - d * " + stride2 + ";\n\n return ivec4(r, c, d, d2);\n }\n "; - } - function getOutput2DCoords(shape, texShape) { - if (arraysEqual(shape, texShape)) { - return "\n ivec2 getOutputCoords() {\n return ivec2(resultUV.yx * vec2(" + texShape[0] + ", " + texShape[1] + "));\n }\n "; - } - if (shape[1] === 1) { - return "\n ivec2 getOutputCoords() {\n ivec2 resTexRC = ivec2(resultUV.yx *\n vec2(" + texShape[0] + ", " + texShape[1] + "));\n int index = resTexRC.x * " + texShape[1] + " + resTexRC.y;\n return ivec2(index, 0);\n }\n "; - } - if (shape[0] === 1) { - return "\n ivec2 getOutputCoords() {\n ivec2 resTexRC = ivec2(resultUV.yx *\n vec2(" + texShape[0] + ", " + texShape[1] + "));\n int index = resTexRC.x * " + texShape[1] + " + resTexRC.y;\n return ivec2(0, index);\n }\n "; - } - return "\n ivec2 getOutputCoords() {\n ivec2 resTexRC = ivec2(resultUV.yx *\n vec2(" + texShape[0] + ", " + texShape[1] + "));\n int index = resTexRC.x * " + texShape[1] + " + resTexRC.y;\n int r = index / " + shape[1] + ";\n int c = index - r * " + shape[1] + ";\n return ivec2(r, c);\n }\n "; - } - function getSamplerScalar(inputInfo) { - var texName = inputInfo.name; - var funcName = 'get' + texName.charAt(0).toUpperCase() + texName.slice(1); - return "\n float " + funcName + "() {\n return sampleTexture(" + texName + ", halfCR);\n }\n "; - } - function getSampler1D(inputInfo) { - var texName = inputInfo.name; - var funcName = 'get' + texName.charAt(0).toUpperCase() + texName.slice(1); - return "\n float " + funcName + "(int index) {\n return " + funcName + "Flat(index);\n }\n "; - } - function getSampler2D(inputInfo) { - var shape = inputInfo.shapeInfo.logicalShape; - var texShape = inputInfo.shapeInfo.texShape; - var texName = inputInfo.name; - var funcName = 'get' + texName.charAt(0).toUpperCase() + texName.slice(1); - var texNumR = texShape[0]; - var texNumC = texShape[1]; - if (arraysEqual(shape, texShape)) { - return "\n float " + funcName + "(int row, int col) {\n vec2 uv = (vec2(col, row) + halfCR) / vec2(" + texNumC + ".0, " + texNumR + ".0);\n return sampleTexture(" + texName + ", uv);\n }\n "; - } - var _a = squeezeShape(shape), newShape = _a.newShape, keptDims = _a.keptDims; - var squeezedShape = newShape; - if (squeezedShape.length < shape.length) { - var newInputInfo = squeezeInputInfo(inputInfo, squeezedShape); - var params = ['row', 'col']; - return "\n " + getSamplerFromInInfo(newInputInfo) + "\n float " + funcName + "(int row, int col) {\n return " + funcName + "(" + getSqueezedParams(params, keptDims) + ");\n }\n "; - } - if (texNumC === 1) { - return "\n float " + funcName + "(int row, int col) {\n int index = row * " + shape[1] + " + col;\n vec2 uv = vec2(0.5, (float(index) + 0.5) / " + texNumR + ".0);\n return sampleTexture(" + texName + ", uv);\n }\n "; - } - if (texNumR === 1) { - return "\n float " + funcName + "(int row, int col) {\n int index = row * " + shape[1] + " + col;\n vec2 uv = vec2((float(index) + 0.5) / " + texNumC + ".0, 0.5);\n return sampleTexture(" + texName + ", uv);\n }\n "; - } - return "\n float " + funcName + "(int row, int col) {\n vec2 uv = UVfrom2D(" + texNumR + ", " + texNumC + ", " + shape[1] + ", row, col);\n return sampleTexture(" + texName + ", uv);\n }\n"; - } - function getSampler3D(inputInfo) { - var texShape = inputInfo.shapeInfo.texShape; - var shape = inputInfo.shapeInfo.logicalShape; - var texName = inputInfo.name; - var funcName = 'get' + texName.charAt(0).toUpperCase() + texName.slice(1); - var texNumR = texShape[0]; - var texNumC = texShape[1]; - var stride0 = shape[1] * shape[2]; - var stride1 = shape[2]; - var _a = squeezeShape(shape), newShape = _a.newShape, keptDims = _a.keptDims; - var squeezedShape = newShape; - if (squeezedShape.length < shape.length) { - var newInputInfo = squeezeInputInfo(inputInfo, squeezedShape); - var params = ['row', 'col', 'depth']; - return "\n " + getSamplerFromInInfo(newInputInfo) + "\n float " + funcName + "(int row, int col, int depth) {\n return " + funcName + "(" + getSqueezedParams(params, keptDims) + ");\n }\n "; - } - if (texNumC === stride0) { - return "\n float " + funcName + "(int row, int col, int depth) {\n int texR = row;\n int texC = col * " + stride1 + " + depth;\n vec2 uv = (vec2(texC, texR) + halfCR) /\n vec2(" + texNumC + ".0, " + texNumR + ".0);\n return sampleTexture(" + texName + ", uv);\n }\n "; - } - if (texNumC === stride1) { - return "\n float " + funcName + "(int row, int col, int depth) {\n int texR = row * " + shape[1] + " + col;\n int texC = depth;\n vec2 uv = (vec2(texC, texR) + halfCR) / vec2(" + texNumC + ".0, " + texNumR + ".0);\n return sampleTexture(" + texName + ", uv);\n }\n "; - } - return "\n float " + funcName + "(int row, int col, int depth) {\n vec2 uv = UVfrom3D(\n " + texNumR + ", " + texNumC + ", " + stride0 + ", " + stride1 + ", row, col, depth);\n return sampleTexture(" + texName + ", uv);\n }\n "; - } - function getSampler4D(inputInfo) { - var shape = inputInfo.shapeInfo.logicalShape; - var texShape = inputInfo.shapeInfo.texShape; - var texName = inputInfo.name; - var funcName = 'get' + texName.charAt(0).toUpperCase() + texName.slice(1); - var texNumR = texShape[0]; - var texNumC = texShape[1]; - var stride2 = shape[3]; - var stride1 = shape[2] * stride2; - var stride0 = shape[1] * stride1; - var _a = squeezeShape(shape), newShape = _a.newShape, keptDims = _a.keptDims; - if (newShape.length < shape.length) { - var newInputInfo = squeezeInputInfo(inputInfo, newShape); - var params = ['row', 'col', 'depth', 'depth2']; - return "\n " + getSamplerFromInInfo(newInputInfo) + "\n float " + funcName + "(int row, int col, int depth, int depth2) {\n return " + funcName + "(" + getSqueezedParams(params, keptDims) + ");\n }\n "; - } - if (texNumC === stride0) { - return "\n float " + funcName + "(int row, int col, int depth, int depth2) {\n int texR = row;\n int texC = col * " + stride1 + " + depth * " + stride2 + " + depth2;\n vec2 uv = (vec2(texC, texR) + halfCR) /\n vec2(" + texNumC + ".0, " + texNumR + ".0);\n return sampleTexture(" + texName + ", uv);\n }\n "; - } - if (texNumC === stride2) { - return "\n float " + funcName + "(int row, int col, int depth, int depth2) {\n int texR = row * " + shape[1] * shape[2] + " + col * " + shape[2] + " + depth;\n int texC = depth2;\n vec2 uv = (vec2(texC, texR) + halfCR) /\n vec2(" + texNumC + ".0, " + texNumR + ".0);\n return sampleTexture(" + texName + ", uv);\n }\n "; - } - return "\n float " + funcName + "(int row, int col, int depth, int depth2) {\n vec2 uv = UVfrom4D(" + texNumR + ", " + texNumC + ", " + stride0 + ", " + stride1 + ",\n " + stride2 + ", row, col, depth, depth2);\n return sampleTexture(" + texName + ", uv);\n }\n "; - } - function getSamplerFlat(inputInfo) { - var texName = inputInfo.name; - var texShape = inputInfo.shapeInfo.texShape; - var funcName = 'get' + texName.charAt(0).toUpperCase() + texName.slice(1) + 'Flat'; - var tNumR = texShape[0]; - var tNumC = texShape[1]; - if (tNumC === 1 && tNumR === 1) { - return "\n float " + funcName + "(int index) {\n return sampleTexture(" + texName + ", halfCR);\n }\n "; - } - if (tNumC === 1) { - return "\n float " + funcName + "(int index) {\n vec2 uv = vec2(0.5, (float(index) + 0.5) / " + tNumR + ".0);\n return sampleTexture(" + texName + ", uv);\n }\n "; - } - if (tNumR === 1) { - return "\n float " + funcName + "(int index) {\n vec2 uv = vec2((float(index) + 0.5) / " + tNumC + ".0, 0.5);\n return sampleTexture(" + texName + ", uv);\n }\n "; - } - return "\n float " + funcName + "(int index) {\n vec2 uv = UVfrom1D(" + tNumR + ", " + tNumC + ", index);\n return sampleTexture(" + texName + ", uv);\n }\n "; - } - function getBroadcastOutputCoordsSampler(inputInfo, outShapeInfo, texFuncSnippet, funcName) { - var inRank = inputInfo.shapeInfo.logicalShape.length; - var outRank = outShapeInfo.logicalShape.length; - var type = 'int'; - if (outRank === 2) { - type = 'ivec2'; - } - else if (outRank === 3) { - type = 'ivec3'; - } - else if (outRank === 4) { - type = 'ivec4'; - } - var broadcastDims = getBroadcastDims(inputInfo.shapeInfo.logicalShape, outShapeInfo.logicalShape); - var rankDiff = outRank - inRank; - var coordsSnippet; - if (inRank === 0) { - coordsSnippet = ''; - } - else if (outRank < 2 && broadcastDims.length >= 1) { - coordsSnippet = 'coords = 0;'; - } - else { - coordsSnippet = - broadcastDims.map(function (d) { return "coords[" + (d + rankDiff) + "] = 0;"; }).join('\n'); - } - var unpackedCoordsSnippet = ''; - if (outRank < 2 && inRank > 0) { - unpackedCoordsSnippet = 'coords'; - } - else { - unpackedCoordsSnippet = inputInfo.shapeInfo.logicalShape - .map(function (s, i) { return "coords[" + (i + rankDiff) + "]"; }) - .join(', '); - } - return "\n float " + funcName + "() {\n " + type + " coords = getOutputCoords();\n " + coordsSnippet + "\n return get" + texFuncSnippet + "(" + unpackedCoordsSnippet + ");\n }\n "; - } - function getSamplerAtOutputCoords(inputInfo, outShapeInfo, supportsBroadcasting) { - var inTexShape = inputInfo.shapeInfo.texShape; - var texName = inputInfo.name; - var texFuncSnippet = texName.charAt(0).toUpperCase() + texName.slice(1); - var funcName = 'get' + texFuncSnippet + 'AtOutCoords'; - var broadcastDims = getBroadcastDims(inputInfo.shapeInfo.logicalShape, outShapeInfo.logicalShape); - var inRank = inputInfo.shapeInfo.logicalShape.length; - var outRank = outShapeInfo.logicalShape.length; - var doBroadcast = supportsBroadcasting && ((outRank > inRank) || broadcastDims.length > 0); - var broadcastOverOuter = broadcastDimsAreOuter(broadcastDims); - if (doBroadcast && !broadcastOverOuter) { - return getBroadcastOutputCoordsSampler(inputInfo, outShapeInfo, texFuncSnippet, funcName); - } - var outTexShape = outShapeInfo.texShape; - if (arraysEqual(inTexShape, outTexShape)) { - return "\n float " + funcName + "() {\n return sampleTexture(" + texName + ", resultUV);\n }\n "; - } - var inSize = sizeFromShape(inTexShape); - var broadcastSnippet = ''; - if (doBroadcast && broadcastOverOuter) { - broadcastSnippet = "\n int mainPart = index / " + inSize + ";\n index -= mainPart * " + inSize + ";\n "; - } - return "\n float " + funcName + "() {\n ivec2 resTexRC = ivec2(resultUV.yx *\n vec2(" + outTexShape[0] + ", " + outTexShape[1] + "));\n int index = resTexRC.x * " + outTexShape[1] + " + resTexRC.y;\n " + broadcastSnippet + "\n int texR = index / " + inTexShape[1] + ";\n int texC = index - texR * " + inTexShape[1] + ";\n vec2 uv = (vec2(texC, texR) + halfCR) /\n vec2(" + inTexShape[1] + ".0, " + inTexShape[0] + ".0);\n\n return sampleTexture(" + texName + ", uv);\n }\n "; - } - function getCoordsDataType(rank) { - if (rank <= 1) { - return 'int'; - } - else if (rank === 2) { - return 'ivec2'; - } - else if (rank === 3) { - return 'ivec3'; - } - else if (rank === 4) { - return 'ivec4'; - } - else { - throw Error("GPU for rank " + rank + " is not yet supported"); - } - } - function squeezeInputInfo(inInfo, squeezedShape) { - var newInputInfo = JSON.parse(JSON.stringify(inInfo)); - newInputInfo.shapeInfo.logicalShape = squeezedShape; - return newInputInfo; - } - function getSqueezedParams(params, keptDims) { - return keptDims.map(function (d) { return params[d]; }).join(', '); - } - - var CumSumProgram = (function () { - function CumSumProgram(shape, exclusive, reverse) { - this.variableNames = ['x']; - this.outputShape = shape; - var rank = shape.length; - var finalDim = shape[shape.length - 1]; - var dtype = getCoordsDataType(rank); - var outputCoords = getCoords(rank, 'coords'); - var sourceCoords = getCoords(rank, 'adjustableCoords'); - var finalCoord = getFinalCoord(rank, 'coords'); - var finalAdjustableCoord = getFinalCoord(rank, 'adjustableCoords'); - var indexAdjuster = reverse ? "return " + finalDim + " -i - 1;" : 'return i;'; - var comparator = reverse ? '<' : '>'; - this.userCode = "\n int getIndex(int i) {\n " + indexAdjuster + "\n }\n\n void main() {\n " + dtype + " coords = getOutputCoords();\n " + dtype + " adjustableCoords = " + dtype + "(" + outputCoords + ");\n int finalCoord = int(" + finalCoord + ");\n float val = 0.0;\n for (int i = " + finalDim + " - 1; i >= 0; i -= 1) {\n int idx = getIndex(i);\n if (idx " + comparator + " finalCoord) {\n continue;\n }\n if (idx == finalCoord && " + exclusive + ") {\n continue;\n }\n " + finalAdjustableCoord + " = idx;\n val += getX(" + sourceCoords + ");\n }\n setOutput(val);\n }\n "; - } - return CumSumProgram; - }()); - function getCoords(rank, name) { - if (rank === 1) { - return "" + name; - } - else if (rank === 2) { - return name + ".x, " + name + ".y"; - } - else if (rank === 3) { - return name + ".x, " + name + ".y, " + name + ".z"; - } - else if (rank === 4) { - return name + ".x, " + name + ".y, " + name + ".z, " + name + ".w"; - } - else { - throw Error("Cumulative sum for rank " + rank + " is not yet supported"); - } - } - function getFinalCoord(rank, name) { - if (rank === 1) { - return "" + name; - } - else if (rank === 2) { - return name + ".y"; - } - else if (rank === 3) { - return name + ".z"; - } - else if (rank === 4) { - return name + ".w"; - } - else { - throw Error("Cumulative sum for rank " + rank + " is not yet supported"); - } - } - - var DepthwiseConv2DProgram = (function () { - function DepthwiseConv2DProgram(convInfo) { - this.variableNames = ['x', 'W']; - this.outputShape = convInfo.outShape; - var xNumRows = convInfo.inHeight; - var xNumCols = convInfo.inWidth; - var padTop = convInfo.padInfo.top; - var padLeft = convInfo.padInfo.left; - var strideHeight = convInfo.strideHeight; - var strideWidth = convInfo.strideWidth; - var dilationHeight = convInfo.dilationHeight; - var dilationWidth = convInfo.dilationWidth; - var filterHeight = convInfo.filterHeight; - var filterWidth = convInfo.filterWidth; - var channelMul = convInfo.outChannels / convInfo.inChannels; - this.userCode = "\n const ivec2 strides = ivec2(" + strideHeight + ", " + strideWidth + ");\n const ivec2 pads = ivec2(" + padTop + ", " + padLeft + ");\n\n void main() {\n ivec4 coords = getOutputCoords();\n int batch = coords.x;\n ivec2 xRCCorner = coords.yz * strides - pads;\n int d2 = coords.w;\n int d1 = d2 / " + channelMul + ";\n int q = d2 - d1 * " + channelMul + ";\n\n int xRCorner = xRCCorner.x;\n int xCCorner = xRCCorner.y;\n\n // Convolve x(?, ?, d1) with w(:, :, d1, q) to get y(yR, yC, d2).\n // ? = to be determined. : = across all values in that axis.\n float dotProd = 0.0;\n // TODO(dsmilkov): Flatten the two for loops and vec4 the operations.\n for (int wR = 0; wR < " + filterHeight + "; wR++) {\n int xR = xRCorner + wR * " + dilationHeight + ";\n\n if (xR < 0 || xR >= " + xNumRows + ") {\n continue;\n }\n\n for (int wC = 0; wC < " + filterWidth + "; wC++) {\n int xC = xCCorner + wC * " + dilationWidth + ";\n\n if (xC < 0 || xC >= " + xNumCols + ") {\n continue;\n }\n\n float xVal = getX(batch, xR, xC, d1);\n float wVal = getW(wR, wC, d1, q);\n dotProd += xVal * wVal;\n }\n }\n setOutput(dotProd);\n }\n "; - } - return DepthwiseConv2DProgram; - }()); - - var FromPixelsProgram = (function () { - function FromPixelsProgram(outputShape) { - this.variableNames = ['A']; - var height = outputShape[0], width = outputShape[1]; - this.outputShape = outputShape; - this.userCode = "\n void main() {\n ivec3 coords = getOutputCoords();\n int texR = coords[0];\n int texC = coords[1];\n int depth = coords[2];\n vec2 uv = (vec2(texC, texR) + halfCR) / vec2(" + width + ".0, " + height + ".0);\n\n vec4 values = texture2D(A, uv);\n float value;\n if (depth == 0) {\n value = values.r;\n } else if (depth == 1) {\n value = values.g;\n } else if (depth == 2) {\n value = values.b;\n } else if (depth == 3) {\n value = values.a;\n }\n\n setOutput(floor(value * 255.0 + 0.5));\n }\n "; - } - return FromPixelsProgram; - }()); - - var GatherProgram = (function () { - function GatherProgram(aShape, indicesLength, axis) { - this.variableNames = ['A', 'indices']; - var outputShape = aShape.slice(); - outputShape[axis] = indicesLength; - this.outputShape = outputShape; - this.rank = outputShape.length; - var dtype = getCoordsDataType(this.rank); - var sourceCoords = getSourceCoords(aShape, axis); - this.userCode = "\n void main() {\n " + dtype + " resRC = getOutputCoords();\n setOutput(getA(" + sourceCoords + "));\n }\n "; - } - return GatherProgram; - }()); - function getSourceCoords(aShape, axis) { - var rank = aShape.length; - if (rank > 4) { - throw Error("Gather for rank " + rank + " is not yet supported"); - } - if (rank === 1) { - return "int(getIndices(resRC))"; - } - var currentCoords = ['resRC.x', 'resRC.y', 'resRC.z', 'resRC.w']; - var sourceCoords = []; - for (var i = 0; i < aShape.length; i++) { - if (i === axis) { - sourceCoords.push("int(getIndices(" + currentCoords[i] + "))"); - } - else { - sourceCoords.push("" + currentCoords[i]); - } - } - return sourceCoords.join(); - } - - var MAX_TEXTURE_SIZE = null; - function createWebGLRenderingContext(attributes) { - var canvas = document.createElement('canvas'); - canvas.width = 1; - canvas.height = 1; - return createWebGLRenderingContextFromCanvas(canvas, attributes); - } - function createWebGLRenderingContextFromCanvas(canvas, attributes) { - var gl; - var webglVersion = ENV.get('WEBGL_VERSION'); - if (webglVersion === 2) { - gl = canvas.getContext('webgl2', attributes); - } - else if (webglVersion === 1) { - gl = (canvas.getContext('webgl', attributes) || - canvas.getContext('experimental-webgl', attributes)); - } - if (webglVersion === 0 || gl == null) { - throw new Error('This browser does not support WebGL.'); - } - return gl; - } - function callAndCheck(gl, func) { - var returnValue = func(); - checkWebGLError(gl); - return returnValue; - } - var webGLDebugErrorCheckingEnabled = false; - function enableDebugWebGLErrorChecking(enabled) { - webGLDebugErrorCheckingEnabled = enabled; - } - function checkWebGLError(gl) { - if (webGLDebugErrorCheckingEnabled) { - var error = gl.getError(); - if (error !== gl.NO_ERROR) { - throw new Error('WebGL Error: ' + getWebGLErrorMessage(gl, error)); - } - } - } - function getWebGLErrorMessage(gl, status) { - switch (status) { - case gl.NO_ERROR: - return 'NO_ERROR'; - case gl.INVALID_ENUM: - return 'INVALID_ENUM'; - case gl.INVALID_VALUE: - return 'INVALID_VALUE'; - case gl.INVALID_OPERATION: - return 'INVALID_OPERATION'; - case gl.INVALID_FRAMEBUFFER_OPERATION: - return 'INVALID_FRAMEBUFFER_OPERATION'; - case gl.OUT_OF_MEMORY: - return 'OUT_OF_MEMORY'; - case gl.CONTEXT_LOST_WEBGL: - return 'CONTEXT_LOST_WEBGL'; - default: - return "Unknown error code " + status; - } - } - function getExtensionOrThrow(gl, extensionName) { - return throwIfNull(gl, function () { return gl.getExtension(extensionName); }, 'Extension "' + extensionName + '" not supported on this browser.'); - } - function createVertexShader(gl, vertexShaderSource) { - var vertexShader = throwIfNull(gl, function () { return gl.createShader(gl.VERTEX_SHADER); }, 'Unable to create vertex WebGLShader.'); - callAndCheck(gl, function () { return gl.shaderSource(vertexShader, vertexShaderSource); }); - callAndCheck(gl, function () { return gl.compileShader(vertexShader); }); - if (gl.getShaderParameter(vertexShader, gl.COMPILE_STATUS) === false) { - console.log(gl.getShaderInfoLog(vertexShader)); - throw new Error('Failed to compile vertex shader.'); - } - return vertexShader; - } - function createFragmentShader(gl, fragmentShaderSource) { - var fragmentShader = throwIfNull(gl, function () { return gl.createShader(gl.FRAGMENT_SHADER); }, 'Unable to create fragment WebGLShader.'); - callAndCheck(gl, function () { return gl.shaderSource(fragmentShader, fragmentShaderSource); }); - callAndCheck(gl, function () { return gl.compileShader(fragmentShader); }); - if (gl.getShaderParameter(fragmentShader, gl.COMPILE_STATUS) === false) { - logShaderSourceAndInfoLog(fragmentShaderSource, gl.getShaderInfoLog(fragmentShader)); - throw new Error('Failed to compile fragment shader.'); - } - return fragmentShader; - } - var lineNumberRegex = /ERROR: [0-9]+:([0-9]+):/g; - function logShaderSourceAndInfoLog(shaderSource, shaderInfoLog) { - var lineNumberRegexResult = lineNumberRegex.exec(shaderInfoLog); - if (lineNumberRegexResult == null) { - console.log("Couldn't parse line number in error: " + shaderInfoLog); - console.log(shaderSource); - return; - } - var lineNumber = +lineNumberRegexResult[1]; - var shaderLines = shaderSource.split('\n'); - var pad = shaderLines.length.toString().length + 2; - var linesWithLineNumbers = shaderLines.map(function (line, lineNumber) { - return rightPad((lineNumber + 1).toString(), pad) + line; - }); - var maxLineLength = 0; - for (var i = 0; i < linesWithLineNumbers.length; i++) { - maxLineLength = Math.max(linesWithLineNumbers[i].length, maxLineLength); - } - var beforeErrorLines = linesWithLineNumbers.slice(0, lineNumber - 1); - var errorLine = linesWithLineNumbers.slice(lineNumber - 1, lineNumber); - var afterErrorLines = linesWithLineNumbers.slice(lineNumber); - console.log(beforeErrorLines.join('\n')); - console.log(shaderInfoLog.split('\n')[0]); - console.log("%c " + rightPad(errorLine[0], maxLineLength), 'border:1px solid red; background-color:#e3d2d2; color:#a61717'); - console.log(afterErrorLines.join('\n')); - } - function createProgram(gl) { - return throwIfNull(gl, function () { return gl.createProgram(); }, 'Unable to create WebGLProgram.'); - } - function linkProgram(gl, program) { - callAndCheck(gl, function () { return gl.linkProgram(program); }); - if (gl.getProgramParameter(program, gl.LINK_STATUS) === false) { - console.log(gl.getProgramInfoLog(program)); - throw new Error('Failed to link vertex and fragment shaders.'); - } - } - function validateProgram(gl, program) { - callAndCheck(gl, function () { return gl.validateProgram(program); }); - if (gl.getProgramParameter(program, gl.VALIDATE_STATUS) === false) { - console.log(gl.getProgramInfoLog(program)); - throw new Error('Shader program validation failed.'); - } - } - function createStaticVertexBuffer(gl, data) { - var buffer = throwIfNull(gl, function () { return gl.createBuffer(); }, 'Unable to create WebGLBuffer'); - callAndCheck(gl, function () { return gl.bindBuffer(gl.ARRAY_BUFFER, buffer); }); - callAndCheck(gl, function () { return gl.bufferData(gl.ARRAY_BUFFER, data, gl.STATIC_DRAW); }); - return buffer; - } - function createStaticIndexBuffer(gl, data) { - var buffer = throwIfNull(gl, function () { return gl.createBuffer(); }, 'Unable to create WebGLBuffer'); - callAndCheck(gl, function () { return gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, buffer); }); - callAndCheck(gl, function () { return gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, data, gl.STATIC_DRAW); }); - return buffer; - } - function queryMaxTextureSize(gl) { - if (MAX_TEXTURE_SIZE != null) { - return MAX_TEXTURE_SIZE; - } - MAX_TEXTURE_SIZE = - callAndCheck(gl, function () { return gl.getParameter(gl.MAX_TEXTURE_SIZE); }); - return MAX_TEXTURE_SIZE; - } - function getChannelsPerTexture() { - if (!ENV.get('WEBGL_FLOAT_TEXTURE_ENABLED')) { - return 4; - } - if (ENV.get('WEBGL_VERSION') === 2) { - return 1; - } - return 4; - } - function createTexture(gl) { - return throwIfNull(gl, function () { return gl.createTexture(); }, 'Unable to create WebGLTexture.'); - } - function validateTextureSize(gl, width, height) { - var maxTextureSize = queryMaxTextureSize(gl); - if ((width <= 0) || (height <= 0)) { - var requested = "[" + width + "x" + height + "]"; - throw new Error('Requested texture size ' + requested + ' is invalid.'); - } - if ((width > maxTextureSize) || (height > maxTextureSize)) { - var requested = "[" + width + "x" + height + "]"; - var max = "[" + maxTextureSize + "x" + maxTextureSize + "]"; - throw new Error('Requested texture size ' + requested + - ' greater than WebGL maximum on this browser / GPU ' + max + '.'); - } - } - function createFramebuffer(gl) { - return throwIfNull(gl, function () { return gl.createFramebuffer(); }, 'Unable to create WebGLFramebuffer.'); - } - function bindVertexBufferToProgramAttribute(gl, program, attribute, buffer, arrayEntriesPerItem, itemStrideInBytes, itemOffsetInBytes) { - var loc = gl.getAttribLocation(program, attribute); - if (loc === -1) { - return false; - } - callAndCheck(gl, function () { return gl.bindBuffer(gl.ARRAY_BUFFER, buffer); }); - callAndCheck(gl, function () { return gl.vertexAttribPointer(loc, arrayEntriesPerItem, gl.FLOAT, false, itemStrideInBytes, itemOffsetInBytes); }); - callAndCheck(gl, function () { return gl.enableVertexAttribArray(loc); }); - return true; - } - function bindTextureUnit(gl, texture, textureUnit) { - validateTextureUnit(gl, textureUnit); - callAndCheck(gl, function () { return gl.activeTexture(gl.TEXTURE0 + textureUnit); }); - callAndCheck(gl, function () { return gl.bindTexture(gl.TEXTURE_2D, texture); }); - } - function unbindTextureUnit(gl, textureUnit) { - validateTextureUnit(gl, textureUnit); - callAndCheck(gl, function () { return gl.activeTexture(gl.TEXTURE0 + textureUnit); }); - callAndCheck(gl, function () { return gl.bindTexture(gl.TEXTURE_2D, null); }); - } - function getProgramUniformLocationOrThrow(gl, program, uniformName) { - return throwIfNull(gl, function () { return gl.getUniformLocation(program, uniformName); }, 'uniform "' + uniformName + '" not present in program.'); - } - function getProgramUniformLocation(gl, program, uniformName) { - return gl.getUniformLocation(program, uniformName); - } - function bindTextureToProgramUniformSampler(gl, program, texture, uniformSamplerLocation, textureUnit) { - callAndCheck(gl, function () { return bindTextureUnit(gl, texture, textureUnit); }); - callAndCheck(gl, function () { return gl.uniform1i(uniformSamplerLocation, textureUnit); }); - } - function bindCanvasToFramebuffer(gl) { - callAndCheck(gl, function () { return gl.bindFramebuffer(gl.FRAMEBUFFER, null); }); - callAndCheck(gl, function () { return gl.viewport(0, 0, gl.canvas.width, gl.canvas.height); }); - callAndCheck(gl, function () { return gl.scissor(0, 0, gl.canvas.width, gl.canvas.height); }); - } - function bindColorTextureToFramebuffer(gl, texture, framebuffer) { - callAndCheck(gl, function () { return gl.bindFramebuffer(gl.FRAMEBUFFER, framebuffer); }); - callAndCheck(gl, function () { return gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, texture, 0); }); - } - function unbindColorTextureFromFramebuffer(gl, framebuffer) { - callAndCheck(gl, function () { return gl.bindFramebuffer(gl.FRAMEBUFFER, framebuffer); }); - callAndCheck(gl, function () { return gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, null, 0); }); - } - function validateFramebuffer(gl) { - var status = gl.checkFramebufferStatus(gl.FRAMEBUFFER); - if (status !== gl.FRAMEBUFFER_COMPLETE) { - throw new Error('Error binding framebuffer: ' + getFramebufferErrorMessage(gl, status)); - } - } - function getFramebufferErrorMessage(gl, status) { - switch (status) { - case gl.FRAMEBUFFER_INCOMPLETE_ATTACHMENT: - return 'FRAMEBUFFER_INCOMPLETE_ATTACHMENT'; - case gl.FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT: - return 'FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT'; - case gl.FRAMEBUFFER_INCOMPLETE_DIMENSIONS: - return 'FRAMEBUFFER_INCOMPLETE_DIMENSIONS'; - case gl.FRAMEBUFFER_UNSUPPORTED: - return 'FRAMEBUFFER_UNSUPPORTED'; - default: - return "unknown error " + status; - } - } - function throwIfNull(gl, returnTOrNull, failureMessage) { - var tOrNull = callAndCheck(gl, function () { return returnTOrNull(); }); - if (tOrNull == null) { - throw new Error(failureMessage); - } - return tOrNull; - } - function validateTextureUnit(gl, textureUnit) { - var maxTextureUnit = gl.MAX_COMBINED_TEXTURE_IMAGE_UNITS - 1; - var glTextureUnit = textureUnit + gl.TEXTURE0; - if (glTextureUnit < gl.TEXTURE0 || glTextureUnit > maxTextureUnit) { - var textureUnitRange = "[gl.TEXTURE0, gl.TEXTURE" + maxTextureUnit + "]"; - throw new Error("textureUnit must be in " + textureUnitRange + "."); - } - } - function getTextureShapeFromLogicalShape(gl, logShape) { - if (logShape.length !== 2) { - var squeezeResult = squeezeShape(logShape); - logShape = squeezeResult.newShape; - } - var maxTexSize = queryMaxTextureSize(gl); - var size = sizeFromShape(logShape); - if (logShape.length <= 1 && size <= maxTexSize) { - return [size, 1]; - } - else if (logShape.length === 2 && logShape[0] <= maxTexSize && - logShape[1] <= maxTexSize) { - return logShape; - } - else if (logShape.length === 3 && logShape[0] <= maxTexSize && - logShape[1] * logShape[2] <= maxTexSize) { - return [logShape[0], logShape[1] * logShape[2]]; - } - else if (logShape.length === 4 && logShape[0] <= maxTexSize && - logShape[1] * logShape[2] * logShape[3] <= maxTexSize) { - return [logShape[0], logShape[1] * logShape[2] * logShape[3]]; - } - else { - return sizeToSquarishShape(size); - } - } - - var webgl_util = /*#__PURE__*/Object.freeze({ - createWebGLRenderingContext: createWebGLRenderingContext, - createWebGLRenderingContextFromCanvas: createWebGLRenderingContextFromCanvas, - callAndCheck: callAndCheck, - enableDebugWebGLErrorChecking: enableDebugWebGLErrorChecking, - checkWebGLError: checkWebGLError, - getWebGLErrorMessage: getWebGLErrorMessage, - getExtensionOrThrow: getExtensionOrThrow, - createVertexShader: createVertexShader, - createFragmentShader: createFragmentShader, - createProgram: createProgram, - linkProgram: linkProgram, - validateProgram: validateProgram, - createStaticVertexBuffer: createStaticVertexBuffer, - createStaticIndexBuffer: createStaticIndexBuffer, - queryMaxTextureSize: queryMaxTextureSize, - getChannelsPerTexture: getChannelsPerTexture, - createTexture: createTexture, - validateTextureSize: validateTextureSize, - createFramebuffer: createFramebuffer, - bindVertexBufferToProgramAttribute: bindVertexBufferToProgramAttribute, - bindTextureUnit: bindTextureUnit, - unbindTextureUnit: unbindTextureUnit, - getProgramUniformLocationOrThrow: getProgramUniformLocationOrThrow, - getProgramUniformLocation: getProgramUniformLocation, - bindTextureToProgramUniformSampler: bindTextureToProgramUniformSampler, - bindCanvasToFramebuffer: bindCanvasToFramebuffer, - bindColorTextureToFramebuffer: bindColorTextureToFramebuffer, - unbindColorTextureFromFramebuffer: unbindColorTextureFromFramebuffer, - validateFramebuffer: validateFramebuffer, - getFramebufferErrorMessage: getFramebufferErrorMessage, - getTextureShapeFromLogicalShape: getTextureShapeFromLogicalShape - }); - - var __awaiter$3 = (undefined && undefined.__awaiter) || function (thisArg, _arguments, P, generator) { - return new (P || (P = Promise))(function (resolve, reject) { - function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } - function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } - function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); } - step((generator = generator.apply(thisArg, _arguments || [])).next()); - }); - }; - var __generator$3 = (undefined && undefined.__generator) || function (thisArg, body) { - var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g; - return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g; - function verb(n) { return function (v) { return step([n, v]); }; } - function step(op) { - if (f) throw new TypeError("Generator is already executing."); - while (_) try { - if (f = 1, y && (t = y[op[0] & 2 ? "return" : op[0] ? "throw" : "next"]) && !(t = t.call(y, op[1])).done) return t; - if (y = 0, t) op = [0, t.value]; - switch (op[0]) { - case 0: case 1: t = op; break; - case 4: _.label++; return { value: op[1], done: false }; - case 5: _.label++; y = op[1]; op = [0]; continue; - case 7: op = _.ops.pop(); _.trys.pop(); continue; - default: - if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; } - if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; } - if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; } - if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; } - if (t[2]) _.ops.pop(); - _.trys.pop(); continue; - } - op = body.call(thisArg, _); - } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; } - if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true }; - } - }; - function getWebGLContextAttributes() { - return { - alpha: false, - antialias: false, - premultipliedAlpha: false, - preserveDrawingBuffer: false, - depth: false, - stencil: false, - failIfMajorPerformanceCaveat: true - }; - } - function createWebGLContext(canvas) { - var attributes = getWebGLContextAttributes(); - var gl; - if (canvas != null) { - gl = createWebGLRenderingContextFromCanvas(canvas, attributes); - } - else { - gl = createWebGLRenderingContext(attributes); - } - callAndCheck(gl, function () { return gl.disable(gl.DEPTH_TEST); }); - callAndCheck(gl, function () { return gl.disable(gl.STENCIL_TEST); }); - callAndCheck(gl, function () { return gl.disable(gl.BLEND); }); - callAndCheck(gl, function () { return gl.disable(gl.DITHER); }); - callAndCheck(gl, function () { return gl.disable(gl.POLYGON_OFFSET_FILL); }); - callAndCheck(gl, function () { return gl.disable(gl.SAMPLE_COVERAGE); }); - callAndCheck(gl, function () { return gl.enable(gl.SCISSOR_TEST); }); - callAndCheck(gl, function () { return gl.enable(gl.CULL_FACE); }); - callAndCheck(gl, function () { return gl.cullFace(gl.BACK); }); - return gl; - } - function createVertexShader$1(gl) { - var vertexShaderSource = "\n precision highp float;\n attribute vec3 clipSpacePos;\n attribute vec2 uv;\n varying vec2 resultUV;\n\n void main() {\n gl_Position = vec4(clipSpacePos, 1);\n resultUV = uv;\n }"; - return createVertexShader(gl, vertexShaderSource); - } - function createVertexBuffer(gl) { - var vertexArray = new Float32Array([-1, 1, 0, 0, 1, -1, -1, 0, 0, 0, 1, 1, 0, 1, 1, 1, -1, 0, 1, 0]); - return createStaticVertexBuffer(gl, vertexArray); - } - function createIndexBuffer(gl) { - var triangleVertexIndices = new Uint16Array([0, 1, 2, 2, 1, 3]); - return createStaticIndexBuffer(gl, triangleVertexIndices); - } - function getTextureInternalFormat(gl, numChannels) { - if (!ENV.get('WEBGL_FLOAT_TEXTURE_ENABLED')) { - return gl.RGBA; - } - if (ENV.get('WEBGL_VERSION') === 2) { - if (numChannels === 4) { - return gl.RGBA32F; - } - return gl.R32F; - } - return gl.RGBA; - } - function getTextureFormat(gl, numChannels) { - if (!ENV.get('WEBGL_FLOAT_TEXTURE_ENABLED')) { - return gl.RGBA; - } - if (ENV.get('WEBGL_VERSION') === 2) { - if (numChannels === 4) { - return gl.RGBA; - } - return gl.RED; - } - return gl.RGBA; - } - function getTextureType(gl) { - if (!ENV.get('WEBGL_FLOAT_TEXTURE_ENABLED')) { - return gl.UNSIGNED_BYTE; - } - return gl.FLOAT; - } - function createAndConfigureTexture(gl, width, height, numChannels) { - validateTextureSize(gl, width, height); - var texture = createTexture(gl); - var tex2d = gl.TEXTURE_2D; - var internalFormat = getTextureInternalFormat(gl, numChannels); - var format = getTextureFormat(gl, numChannels); - callAndCheck(gl, function () { return gl.bindTexture(tex2d, texture); }); - callAndCheck(gl, function () { return gl.texParameteri(tex2d, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); }); - callAndCheck(gl, function () { return gl.texParameteri(tex2d, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); }); - callAndCheck(gl, function () { return gl.texParameteri(tex2d, gl.TEXTURE_MIN_FILTER, gl.NEAREST); }); - callAndCheck(gl, function () { return gl.texParameteri(tex2d, gl.TEXTURE_MAG_FILTER, gl.NEAREST); }); - callAndCheck(gl, function () { return gl.texImage2D(tex2d, 0, internalFormat, width, height, 0, format, getTextureType(gl), null); }); - callAndCheck(gl, function () { return gl.bindTexture(gl.TEXTURE_2D, null); }); - return texture; - } - function createMatrixTexture(gl, rows, columns) { - var _a = getUnpackedMatrixTextureShapeWidthHeight(rows, columns), width = _a[0], height = _a[1]; - var numChannels = 1; - return createAndConfigureTexture(gl, width, height, numChannels); - } - function createColorMatrixTexture(gl, rows, columns) { - var _a = getColorMatrixTextureShapeWidthHeight(rows, columns), width = _a[0], height = _a[1]; - var numChannels = 4; - return createAndConfigureTexture(gl, width, height, numChannels); - } - function createPackedMatrixTexture(gl, rows, columns) { - var _a = getPackedMatrixTextureShapeWidthHeight(rows, columns), width = _a[0], height = _a[1]; - var numChannels = 4; - return createAndConfigureTexture(gl, width, height, numChannels); - } - function bindVertexProgramAttributeStreams(gl, program, vertexBuffer) { - var posOffset = 0; - var uvOffset = 3 * 4; - var stride = (3 * 4) + (2 * 4); - callAndCheck(gl, function () { return gl.bindBuffer(gl.ARRAY_BUFFER, vertexBuffer); }); - var success = bindVertexBufferToProgramAttribute(gl, program, 'clipSpacePos', vertexBuffer, 3, stride, posOffset); - return success && - bindVertexBufferToProgramAttribute(gl, program, 'uv', vertexBuffer, 2, stride, uvOffset); - } - function uploadPixelDataToTexture(gl, texture, pixels) { - callAndCheck(gl, function () { return gl.bindTexture(gl.TEXTURE_2D, texture); }); - callAndCheck(gl, function () { return gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, pixels); }); - callAndCheck(gl, function () { return gl.bindTexture(gl.TEXTURE_2D, null); }); - } - function uploadDataToTexture(gl, texture, width, height, data, numChannels) { - var textureFormat = getTextureFormat(gl, numChannels); - validateTextureSize(gl, width, height); - callAndCheck(gl, function () { return gl.bindTexture(gl.TEXTURE_2D, texture); }); - callAndCheck(gl, function () { return gl.texSubImage2D(gl.TEXTURE_2D, 0, 0, 0, width, height, textureFormat, getTextureType(gl), data); }); - callAndCheck(gl, function () { return gl.bindTexture(gl.TEXTURE_2D, null); }); - } - function uploadMatrixToTexture(gl, texture, rows, columns, matrix, numChannels) { - var _a = getUnpackedMatrixTextureShapeWidthHeight(rows, columns), w = _a[0], h = _a[1]; - var unpackedArray; - if (ENV.get('WEBGL_FLOAT_TEXTURE_ENABLED')) { - var channelsPerTexture = numChannels === 1 ? getChannelsPerTexture() : numChannels; - if (channelsPerTexture === 1) { - unpackedArray = matrix; - } - else { - unpackedArray = - new Float32Array(getUnpackedArraySizeFromMatrixSize(matrix.length, channelsPerTexture)); - encodeMatrixToUnpackedArray(matrix, unpackedArray, channelsPerTexture); - } - } - else { - unpackedArray = encodeFloatArray(matrix); - } - uploadDataToTexture(gl, texture, w, h, unpackedArray, numChannels); - } - function uploadMatrixToPackedTexture(gl, texture, rows, columns, matrix) { - var _a = getPackedMatrixTextureShapeWidthHeight(rows, columns), w = _a[0], h = _a[1]; - var packedRGBA = new Float32Array(getPackedRGBAArraySizeFromMatrixShape(rows, columns)); - encodeMatrixToPackedRGBA(matrix, rows, columns, packedRGBA); - var numChannels = 4; - uploadDataToTexture(gl, texture, w, h, packedRGBA, numChannels); - } - function getDownloadTargetArrayBuffer(rows, columns, channelsPerTexture) { - var isFloatTexture = ENV.get('WEBGL_FLOAT_TEXTURE_ENABLED'); - var downloadTarget; - if (isFloatTexture) { - downloadTarget = - new Float32Array(getUnpackedArraySizeFromMatrixSize(rows * columns, channelsPerTexture)); - } - else { - downloadTarget = new Uint8Array(rows * columns * channelsPerTexture); - } - return downloadTarget; - } - function decodeDownloadTargetArrayBuffer(downloadTarget, rows, columns, channelsPerPixel) { - var isFloatTexture = ENV.get('WEBGL_FLOAT_TEXTURE_ENABLED'); - if (isFloatTexture) { - var matrix = new Float32Array(rows * columns); - decodeMatrixFromUnpackedArray(downloadTarget, matrix, channelsPerPixel); - return matrix; - } - else { - return decodeToFloatArray(downloadTarget); - } - } - function downloadMatrixFromOutputTextureAsync(gl, getBufferSubDataAsyncExtension, rows, columns) { - return __awaiter$3(this, void 0, void 0, function () { - var gl2, channelsPerPixel, downloadTarget, bufferSizeBytes, buffer; - return __generator$3(this, function (_a) { - switch (_a.label) { - case 0: - gl2 = gl; - channelsPerPixel = 4; - downloadTarget = getDownloadTargetArrayBuffer(rows, columns, channelsPerPixel); - bufferSizeBytes = downloadTarget instanceof Float32Array ? - downloadTarget.length * 4 : - downloadTarget; - buffer = gl.createBuffer(); - callAndCheck(gl, function () { return gl.bindBuffer(gl2.PIXEL_PACK_BUFFER, buffer); }); - callAndCheck(gl, function () { return gl.bufferData(gl2.PIXEL_PACK_BUFFER, bufferSizeBytes, gl.STATIC_DRAW); }); - callAndCheck(gl, function () { - return gl2.readPixels(0, 0, columns, rows, gl.RGBA, getTextureType(gl), 0); - }); - return [4, getBufferSubDataAsyncExtension.getBufferSubDataAsync(gl2.PIXEL_PACK_BUFFER, 0, downloadTarget)]; - case 1: - _a.sent(); - return [2, decodeDownloadTargetArrayBuffer(downloadTarget, rows, columns, channelsPerPixel)]; - } - }); - }); - } - function downloadMatrixFromOutputTexture(gl, rows, columns) { - var _a = getUnpackedMatrixTextureShapeWidthHeight(rows, columns), w = _a[0], h = _a[1]; - var channelsPerPixel = 4; - var downloadTarget = getDownloadTargetArrayBuffer(rows, columns, channelsPerPixel); - callAndCheck(gl, function () { return gl.readPixels(0, 0, w, h, gl.RGBA, getTextureType(gl), downloadTarget); }); - return decodeDownloadTargetArrayBuffer(downloadTarget, rows, columns, channelsPerPixel); - } - function downloadMatrixFromRGBAColorTexture(gl, rows, columns, channels) { - var size = rows * columns * 4; - var downloadTarget = new Uint8Array(size); - callAndCheck(gl, function () { return gl.readPixels(0, 0, columns, rows, gl.RGBA, gl.UNSIGNED_BYTE, downloadTarget); }); - var packedRGBA = new Float32Array(size); - for (var i = 0; i < downloadTarget.length; i++) { - packedRGBA[i] = downloadTarget[i]; - } - var matrix = new Float32Array(rows * columns * channels); - decodeMatrixFromUnpackedColorRGBAArray(packedRGBA, matrix, channels); - return matrix; - } - function downloadMatrixFromPackedOutputTexture(gl, rows, columns) { - var _a = getPackedMatrixTextureShapeWidthHeight(rows, columns), w = _a[0], h = _a[1]; - var packedRGBA = new Float32Array(getPackedRGBAArraySizeFromMatrixShape(rows, columns)); - callAndCheck(gl, function () { return gl.readPixels(0, 0, w, h, gl.RGBA, getTextureType(gl), packedRGBA); }); - var matrix = new Float32Array(rows * columns); - return decodeMatrixFromPackedRGBA(packedRGBA, rows, columns, matrix); - } - - var gpgpu_util = /*#__PURE__*/Object.freeze({ - getWebGLContextAttributes: getWebGLContextAttributes, - createWebGLContext: createWebGLContext, - createVertexShader: createVertexShader$1, - createVertexBuffer: createVertexBuffer, - createIndexBuffer: createIndexBuffer, - createMatrixTexture: createMatrixTexture, - createColorMatrixTexture: createColorMatrixTexture, - createPackedMatrixTexture: createPackedMatrixTexture, - bindVertexProgramAttributeStreams: bindVertexProgramAttributeStreams, - uploadPixelDataToTexture: uploadPixelDataToTexture, - uploadMatrixToTexture: uploadMatrixToTexture, - uploadMatrixToPackedTexture: uploadMatrixToPackedTexture, - downloadMatrixFromOutputTextureAsync: downloadMatrixFromOutputTextureAsync, - downloadMatrixFromOutputTexture: downloadMatrixFromOutputTexture, - downloadMatrixFromRGBAColorTexture: downloadMatrixFromRGBAColorTexture, - downloadMatrixFromPackedOutputTexture: downloadMatrixFromPackedOutputTexture - }); - - var __awaiter$4 = (undefined && undefined.__awaiter) || function (thisArg, _arguments, P, generator) { - return new (P || (P = Promise))(function (resolve, reject) { - function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } - function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } - function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); } - step((generator = generator.apply(thisArg, _arguments || [])).next()); - }); - }; - var __generator$4 = (undefined && undefined.__generator) || function (thisArg, body) { - var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g; - return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g; - function verb(n) { return function (v) { return step([n, v]); }; } - function step(op) { - if (f) throw new TypeError("Generator is already executing."); - while (_) try { - if (f = 1, y && (t = y[op[0] & 2 ? "return" : op[0] ? "throw" : "next"]) && !(t = t.call(y, op[1])).done) return t; - if (y = 0, t) op = [0, t.value]; - switch (op[0]) { - case 0: case 1: t = op; break; - case 4: _.label++; return { value: op[1], done: false }; - case 5: _.label++; y = op[1]; op = [0]; continue; - case 7: op = _.ops.pop(); _.trys.pop(); continue; - default: - if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; } - if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; } - if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; } - if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; } - if (t[2]) _.ops.pop(); - _.trys.pop(); continue; - } - op = body.call(thisArg, _); - } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; } - if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true }; - } - }; - var GPGPUContext = (function () { - function GPGPUContext(gl) { - this.outputTexture = null; - this.program = null; - this.disposed = false; - this.autoDebugValidate = false; - this.vertexAttrsAreBound = false; - if (gl != null) { - this.gl = gl; - } - else { - this.gl = createWebGLContext(); - } - if (ENV.get('WEBGL_VERSION') === 1) { - this.textureFloatExtension = - getExtensionOrThrow(this.gl, 'OES_texture_float'); - this.colorBufferFloatExtension = - this.gl.getExtension('WEBGL_color_buffer_float'); - } - else { - this.colorBufferFloatExtension = - getExtensionOrThrow(this.gl, 'EXT_color_buffer_float'); - } - this.loseContextExtension = - getExtensionOrThrow(this.gl, 'WEBGL_lose_context'); - if (ENV.get('WEBGL_GET_BUFFER_SUB_DATA_ASYNC_EXTENSION_ENABLED')) { - this.getBufferSubDataAsyncExtension = - this.gl.getExtension('WEBGL_get_buffer_sub_data_async'); - } - this.vertexBuffer = createVertexBuffer(this.gl); - this.indexBuffer = createIndexBuffer(this.gl); - this.framebuffer = createFramebuffer(this.gl); - } - GPGPUContext.prototype.dispose = function () { - var _this = this; - if (this.disposed) { - return; - } - if (this.program != null) { - console.warn('Disposing a GPGPUContext that still has a bound WebGLProgram.' + - ' This is probably a resource leak, delete the program with ' + - 'GPGPUContext.deleteProgram before disposing.'); - } - if (this.outputTexture != null) { - console.warn('Disposing a GPGPUContext that still has a bound output matrix ' + - 'texture. This is probably a resource leak, delete the output ' + - 'matrix texture with GPGPUContext.deleteMatrixTexture before ' + - 'disposing.'); - } - var gl = this.gl; - callAndCheck(gl, function () { return gl.finish(); }); - callAndCheck(gl, function () { return gl.bindFramebuffer(gl.FRAMEBUFFER, null); }); - callAndCheck(gl, function () { return gl.deleteFramebuffer(_this.framebuffer); }); - callAndCheck(gl, function () { return gl.bindBuffer(gl.ARRAY_BUFFER, null); }); - callAndCheck(gl, function () { return gl.deleteBuffer(_this.vertexBuffer); }); - callAndCheck(gl, function () { return gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, null); }); - callAndCheck(gl, function () { return gl.deleteBuffer(_this.indexBuffer); }); - this.loseContextExtension.loseContext(); - this.disposed = true; - }; - GPGPUContext.prototype.enableAutomaticDebugValidation = function (enabled) { - this.autoDebugValidate = enabled; - enableDebugWebGLErrorChecking(enabled); - }; - GPGPUContext.prototype.createMatrixTexture = function (rows, columns) { - this.throwIfDisposed(); - return createMatrixTexture(this.gl, rows, columns); - }; - GPGPUContext.prototype.uploadPixelDataToTexture = function (texture, pixels) { - this.throwIfDisposed(); - uploadPixelDataToTexture(this.gl, texture, pixels); - }; - GPGPUContext.prototype.createPackedMatrixTexture = function (rows, columns) { - this.throwIfDisposed(); - return createPackedMatrixTexture(this.gl, rows, columns); - }; - GPGPUContext.prototype.deleteMatrixTexture = function (texture) { - var _this = this; - this.throwIfDisposed(); - if (this.outputTexture === texture) { - unbindColorTextureFromFramebuffer(this.gl, this.framebuffer); - this.outputTexture = null; - } - callAndCheck(this.gl, function () { return _this.gl.deleteTexture(texture); }); - }; - GPGPUContext.prototype.uploadMatrixToTexture = function (texture, rows, columns, matrix) { - this.throwIfDisposed(); - var numChannels = 1; - return uploadMatrixToTexture(this.gl, texture, rows, columns, matrix, numChannels); - }; - GPGPUContext.prototype.uploadMatrixToPackedTexture = function (texture, rows, columns, matrix) { - this.throwIfDisposed(); - return uploadMatrixToPackedTexture(this.gl, texture, rows, columns, matrix); - }; - GPGPUContext.prototype.downloadMatrixFromTexture = function (texture, rows, columns) { - var _this = this; - return this.downloadMatrixDriver(texture, function () { - return downloadMatrixFromOutputTexture(_this.gl, rows, columns); - }); - }; - GPGPUContext.prototype.downloadMatrixFromTextureAsync = function (texture, rows, columns) { - return __awaiter$4(this, void 0, void 0, function () { - var _this = this; - return __generator$4(this, function (_a) { - if (this.getBufferSubDataAsyncExtension == null) { - throw new Error("Cannot download matrix from output texture asynchronously, " + - "WEBGL_get_buffer_sub_data_async is not enabled."); - } - return [2, this.downloadMatrixDriverAsync(texture, function () { return downloadMatrixFromOutputTextureAsync(_this.gl, _this.getBufferSubDataAsyncExtension, rows, columns); })]; - }); - }); - }; - GPGPUContext.prototype.downloadMatrixFromRGBAColorTexture = function (texture, rows, columns, channels) { - var _this = this; - return this.downloadMatrixDriver(texture, function () { return downloadMatrixFromRGBAColorTexture(_this.gl, rows, columns, channels); }); - }; - GPGPUContext.prototype.downloadMatrixFromPackedTexture = function (texture, rows, columns) { - var _this = this; - return this.downloadMatrixDriver(texture, function () { return downloadMatrixFromPackedOutputTexture(_this.gl, rows, columns); }); - }; - GPGPUContext.prototype.createProgram = function (fragmentShaderSource) { - this.throwIfDisposed(); - var gl = this.gl; - var fragmentShader = createFragmentShader(gl, fragmentShaderSource); - var vertexShader = createVertexShader$1(gl); - var program = createProgram(gl); - callAndCheck(gl, function () { return gl.attachShader(program, vertexShader); }); - callAndCheck(gl, function () { return gl.attachShader(program, fragmentShader); }); - linkProgram(gl, program); - if (this.autoDebugValidate) { - validateProgram(gl, program); - } - if (!this.vertexAttrsAreBound) { - this.setProgram(program); - this.vertexAttrsAreBound = bindVertexProgramAttributeStreams(gl, this.program, this.vertexBuffer); - } - return program; - }; - GPGPUContext.prototype.deleteProgram = function (program) { - var _this = this; - this.throwIfDisposed(); - if (program === this.program) { - this.program = null; - } - if (program != null) { - callAndCheck(this.gl, function () { return _this.gl.deleteProgram(program); }); - } - }; - GPGPUContext.prototype.setProgram = function (program) { - var _this = this; - this.throwIfDisposed(); - this.program = program; - if ((this.program != null) && this.autoDebugValidate) { - validateProgram(this.gl, this.program); - } - callAndCheck(this.gl, function () { return _this.gl.useProgram(program); }); - }; - GPGPUContext.prototype.getUniformLocation = function (program, uniformName, shouldThrow) { - if (shouldThrow === void 0) { shouldThrow = true; } - this.throwIfDisposed(); - if (shouldThrow) { - return getProgramUniformLocationOrThrow(this.gl, program, uniformName); - } - else { - return getProgramUniformLocation(this.gl, program, uniformName); - } - }; - GPGPUContext.prototype.getAttributeLocation = function (program, attribute) { - var _this = this; - this.throwIfDisposed(); - return callAndCheck(this.gl, function () { return _this.gl.getAttribLocation(program, attribute); }); - }; - GPGPUContext.prototype.getUniformLocationNoThrow = function (program, uniformName) { - this.throwIfDisposed(); - return this.gl.getUniformLocation(program, uniformName); - }; - GPGPUContext.prototype.setInputMatrixTexture = function (inputMatrixTexture, uniformLocation, textureUnit) { - this.throwIfDisposed(); - this.throwIfNoProgram(); - bindTextureToProgramUniformSampler(this.gl, this.program, inputMatrixTexture, uniformLocation, textureUnit); - }; - GPGPUContext.prototype.setOutputMatrixTexture = function (outputMatrixTexture, rows, columns) { - this.setOutputMatrixTextureDriver(outputMatrixTexture, columns, rows); - }; - GPGPUContext.prototype.setOutputPackedMatrixTexture = function (outputPackedMatrixTexture, rows, columns) { - this.throwIfDisposed(); - var _a = getPackedMatrixTextureShapeWidthHeight(rows, columns), width = _a[0], height = _a[1]; - this.setOutputMatrixTextureDriver(outputPackedMatrixTexture, width, height); - }; - GPGPUContext.prototype.setOutputMatrixWriteRegion = function (startRow, numRows, startColumn, numColumns) { - this.setOutputMatrixWriteRegionDriver(startColumn, startRow, numColumns, numRows); - }; - GPGPUContext.prototype.setOutputPackedMatrixWriteRegion = function (startRow, numRows, startColumn, numColumns) { - throw new Error('setOutputPackedMatrixWriteRegion not implemented.'); - }; - GPGPUContext.prototype.debugValidate = function () { - if (this.program != null) { - validateProgram(this.gl, this.program); - } - validateFramebuffer(this.gl); - }; - GPGPUContext.prototype.executeProgram = function () { - this.throwIfDisposed(); - this.throwIfNoProgram(); - var gl = this.gl; - if (this.autoDebugValidate) { - this.debugValidate(); - } - callAndCheck(gl, function () { return gl.drawElements(gl.TRIANGLES, 6, gl.UNSIGNED_SHORT, 0); }); - }; - GPGPUContext.prototype.blockUntilAllProgramsCompleted = function () { - var _this = this; - this.throwIfDisposed(); - callAndCheck(this.gl, function () { return _this.gl.finish(); }); - }; - GPGPUContext.prototype.getQueryTimerExtension = function () { - if (this.disjointQueryTimerExtension == null) { - this.disjointQueryTimerExtension = - getExtensionOrThrow(this.gl, ENV.get('WEBGL_DISJOINT_QUERY_TIMER_EXTENSION_VERSION') === 2 ? - 'EXT_disjoint_timer_query_webgl2' : - 'EXT_disjoint_timer_query'); - } - return this.disjointQueryTimerExtension; - }; - GPGPUContext.prototype.getQueryTimerExtensionWebGL2 = function () { - return this.getQueryTimerExtension(); - }; - GPGPUContext.prototype.getQueryTimerExtensionWebGL1 = function () { - return this.getQueryTimerExtension(); - }; - GPGPUContext.prototype.runQuery = function (queryFn) { - var query = this.beginQuery(); - queryFn(); - this.endQuery(); - return this.pollQueryTime(query); - }; - GPGPUContext.prototype.beginQuery = function () { - if (ENV.get('WEBGL_DISJOINT_QUERY_TIMER_EXTENSION_VERSION') === 2) { - var gl2 = this.gl; - var ext_1 = this.getQueryTimerExtensionWebGL2(); - var query_1 = gl2.createQuery(); - gl2.beginQuery(ext_1.TIME_ELAPSED_EXT, query_1); - return query_1; - } - var ext = this.getQueryTimerExtensionWebGL1(); - var query = ext.createQueryEXT(); - ext.beginQueryEXT(ext.TIME_ELAPSED_EXT, query); - return query; - }; - GPGPUContext.prototype.endQuery = function () { - if (ENV.get('WEBGL_DISJOINT_QUERY_TIMER_EXTENSION_VERSION') === 2) { - var gl2 = this.gl; - var ext_2 = this.getQueryTimerExtensionWebGL2(); - gl2.endQuery(ext_2.TIME_ELAPSED_EXT); - return; - } - var ext = this.getQueryTimerExtensionWebGL1(); - ext.endQueryEXT(ext.TIME_ELAPSED_EXT); - }; - GPGPUContext.prototype.isQueryAvailable = function (query, queryTimerVersion) { - if (queryTimerVersion === 0) { - return true; - } - if (queryTimerVersion === 2) { - var gl2 = this.gl; - var ext = this.getQueryTimerExtensionWebGL2(); - var available = gl2.getQueryParameter(query, gl2.QUERY_RESULT_AVAILABLE); - var disjoint = this.gl.getParameter(ext.GPU_DISJOINT_EXT); - return available && !disjoint; - } - else { - var ext = this.getQueryTimerExtensionWebGL1(); - var available = ext.getQueryObjectEXT(query, ext.QUERY_RESULT_AVAILABLE_EXT); - var disjoint = this.gl.getParameter(ext.GPU_DISJOINT_EXT); - return available && !disjoint; - } - }; - GPGPUContext.prototype.pollQueryTime = function (query) { - var _this = this; - return new Promise(function (resolve, reject) { - var resolveWithWarning = function () { - console.warn('Disjoint query timer never available.'); - resolve(-1); - }; - var queryTimerVersion = ENV.get('WEBGL_DISJOINT_QUERY_TIMER_EXTENSION_VERSION'); - repeatedTry(function () { return _this.isQueryAvailable(query, queryTimerVersion); }) - .then(function () { return resolve(_this.getQueryTime(query, queryTimerVersion)); }) - .catch(resolveWithWarning); - }); - }; - GPGPUContext.prototype.getQueryTime = function (query, queryTimerVersion) { - if (queryTimerVersion === 0) { - return null; - } - if (queryTimerVersion === 2) { - var gl2 = this.gl; - var timeElapsedNanos = gl2.getQueryParameter(query, gl2.QUERY_RESULT); - return timeElapsedNanos / 1000000; - } - else { - var ext = this.getQueryTimerExtensionWebGL1(); - var timeElapsedNanos = ext.getQueryObjectEXT(query, ext.QUERY_RESULT_EXT); - return timeElapsedNanos / 1000000; - } - }; - GPGPUContext.prototype.downloadMatrixDriverSetup = function (texture) { - this.throwIfDisposed(); - bindColorTextureToFramebuffer(this.gl, texture, this.framebuffer); - if (this.autoDebugValidate) { - validateFramebuffer(this.gl); - } - }; - GPGPUContext.prototype.downloadMatrixDriverTeardown = function () { - if (this.outputTexture != null) { - bindColorTextureToFramebuffer(this.gl, this.outputTexture, this.framebuffer); - if (this.autoDebugValidate) { - validateFramebuffer(this.gl); - } - } - else { - unbindColorTextureFromFramebuffer(this.gl, this.framebuffer); - } - }; - GPGPUContext.prototype.downloadMatrixDriver = function (texture, downloadAndDecode) { - this.downloadMatrixDriverSetup(texture); - var result = downloadAndDecode(); - this.downloadMatrixDriverTeardown(); - return result; - }; - GPGPUContext.prototype.downloadMatrixDriverAsync = function (texture, downloadAndDecode) { - return __awaiter$4(this, void 0, void 0, function () { - var result; - return __generator$4(this, function (_a) { - switch (_a.label) { - case 0: - this.downloadMatrixDriverSetup(texture); - return [4, downloadAndDecode()]; - case 1: - result = _a.sent(); - this.downloadMatrixDriverTeardown(); - return [2, result]; - } - }); - }); - }; - GPGPUContext.prototype.setOutputMatrixTextureDriver = function (outputMatrixTextureMaybePacked, width, height) { - this.throwIfDisposed(); - var gl = this.gl; - bindColorTextureToFramebuffer(gl, outputMatrixTextureMaybePacked, this.framebuffer); - if (this.autoDebugValidate) { - validateFramebuffer(gl); - } - this.outputTexture = outputMatrixTextureMaybePacked; - callAndCheck(gl, function () { return gl.viewport(0, 0, width, height); }); - callAndCheck(gl, function () { return gl.scissor(0, 0, width, height); }); - }; - GPGPUContext.prototype.setOutputMatrixWriteRegionDriver = function (x, y, width, height) { - var _this = this; - this.throwIfDisposed(); - callAndCheck(this.gl, function () { return _this.gl.scissor(x, y, width, height); }); - }; - GPGPUContext.prototype.throwIfDisposed = function () { - if (this.disposed) { - throw new Error('Attempted to use disposed GPGPUContext.'); - } - }; - GPGPUContext.prototype.throwIfNoProgram = function () { - if (this.program == null) { - throw new Error('No GPU program is currently set.'); - } - }; - return GPGPUContext; - }()); - - var NAN_UNIFORM_NAME = 'NaN'; - function shouldUploadNaNUniform() { - return !ENV.get('WEBGL_FLOAT_TEXTURE_ENABLED'); - } - function compileProgram(gpgpu, program, inputs, output) { - var userCode = program.userCode; - var inputInfos = inputs.map(function (input, i) { - var shapeInfo = { - logicalShape: input.tensor.shape, - texShape: input.texData.texShape - }; - return { name: program.variableNames[i], shapeInfo: shapeInfo }; - }); - var inShapeInfos = inputInfos.map(function (x) { return x.shapeInfo; }); - var outShapeInfo = { - logicalShape: output.tensor.shape, - texShape: output.texData.texShape - }; - var source = makeShader(inputInfos, outShapeInfo, userCode, program.supportsBroadcasting === true); - var webGLProgram = gpgpu.createProgram(source); - var uniformLocations = {}; - for (var i = 0; i < program.variableNames.length; i++) { - var uniformName = program.variableNames[i]; - uniformLocations[uniformName] = - gpgpu.getUniformLocation(webGLProgram, uniformName); - } - if (shouldUploadNaNUniform()) { - var throwIfNaNUniformIsNotUsed = false; - uniformLocations[NAN_UNIFORM_NAME] = gpgpu.getUniformLocation(webGLProgram, NAN_UNIFORM_NAME, throwIfNaNUniformIsNotUsed); - } - return { - program: program, - source: source, - webGLProgram: webGLProgram, - uniformLocations: uniformLocations, - gpgpu: gpgpu, - inShapeInfos: inShapeInfos, - outShapeInfo: outShapeInfo - }; - } - function validateBinaryAndProgram(shapeInfos, inputs) { - if (shapeInfos.length !== inputs.length) { - throw Error("Binary was compiled with " + shapeInfos.length + " inputs, but " + - ("was executed with " + inputs.length + " inputs")); - } - shapeInfos.forEach(function (s, i) { - var shapeA = s.logicalShape; - var texShapeA = s.texShape; - var shapeB = inputs[i].tensor.shape; - var texShapeB = inputs[i].texData.texShape; - if (!arraysEqual(shapeA, shapeB)) { - throw Error("Binary was compiled with different shapes than " + - ("the current args. Shapes " + shapeA + " and " + shapeB + " must match")); - } - if (!arraysEqual(texShapeA, texShapeB)) { - throw Error("Binary was compiled with different texture shapes than the" + - (" current args. Shape " + texShapeA + " and " + texShapeB + " must match")); - } - }); - } - function runProgram(binary, inputs, output, customSetup) { - validateBinaryAndProgram(binary.inShapeInfos, inputs); - validateBinaryAndProgram([binary.outShapeInfo], [output]); - var outTex = output.texData.texture; - var outTexShape = output.texData.texShape; - var gpgpu = binary.gpgpu; - gpgpu.setOutputMatrixTexture(outTex, outTexShape[0], outTexShape[1]); - gpgpu.setProgram(binary.webGLProgram); - inputs.forEach(function (input, i) { - var tex = input.texData.texture; - var variableName = binary.program.variableNames[i]; - var variableUniformLocation = binary.uniformLocations[variableName]; - gpgpu.setInputMatrixTexture(tex, variableUniformLocation, i); - }); - if (shouldUploadNaNUniform()) { - gpgpu.gl.uniform1f(binary.uniformLocations[NAN_UNIFORM_NAME], NaN); - } - if (customSetup != null) { - customSetup(gpgpu, binary.webGLProgram); - } - gpgpu.executeProgram(); - } - function makeShaderKey(program, inputs, output) { - var keyInputs = ''; - inputs.concat(output).forEach(function (x) { - keyInputs += x.tensor.shape + "_" + x.texData.texShape; - }); - var keyUserCode = program.userCode; - var keyBroadcast = (program.supportsBroadcasting === true).toString(); - var key = program.constructor.name; - key += '_' + keyBroadcast + '_' + keyInputs + '_' + keyUserCode; - return key; - } - - var WhereProgram = (function () { - function WhereProgram(cRank, shape, rank) { - this.variableNames = ['c', 'a', 'b']; - this.outputShape = shape; - var cCoords; - var abCoords; - if (rank > 4) { - throw Error("Where for rank " + rank + " is not yet supported"); - } - if (rank === 1) { - abCoords = "resRC"; - cCoords = "resRC"; - } - else { - var currentCoords = ['resRC.x', 'resRC.y', 'resRC.z', 'resRC.w']; - var cCoordVars = []; - var abCoordVars = []; - for (var i = 0; i < shape.length; i++) { - abCoordVars.push("" + currentCoords[i]); - if (i < cRank) { - cCoordVars.push("" + currentCoords[i]); - } - } - cCoords = cCoordVars.join(); - abCoords = abCoordVars.join(); - } - var dtype = getCoordsDataType(rank); - this.userCode = "\n void main() {\n " + dtype + " resRC = getOutputCoords();\n float cVal = getC(" + cCoords + ");\n if (cVal >= 1.0) {\n setOutput(getA(" + abCoords + "));\n } else {\n setOutput(getB(" + abCoords + "));\n }\n }\n "; - } - return WhereProgram; - }()); - - var LRNProgram = (function () { - function LRNProgram(xShape, radius, bias, alpha, beta) { - this.variableNames = ['x']; - this.outputShape = []; - var rad = radius; - var maxD = xShape[3] - 1; - this.outputShape = xShape; - var powOperator; - var basis = "float(" + bias + ") + float(" + alpha + ") * sum"; - if (beta === 0.5) { - powOperator = "inversesqrt(" + basis + ")"; - } - else if (beta === 1.0) { - powOperator = "1.0/(" + basis + ")"; - } - else { - powOperator = "exp(log(" + basis + ") * float(-" + beta + "));"; - } - this.userCode = "\n void main() {\n ivec4 coords = getOutputCoords();\n int b = coords[0];\n int r = coords[1];\n int c = coords[2];\n int d = coords[3];\n float x = getX(b, r, c, d);\n float sum = 0.0;\n for (int j = -" + rad + "; j <= " + rad + "; j++) {\n int idx = d + j;\n if (idx >= 0 && idx <= " + maxD + ") {\n float z = getX(b, r, c, idx);\n sum += z * z;\n }\n }\n float val = x * " + powOperator + ";\n setOutput(val);\n }\n "; - } - return LRNProgram; - }()); - - var MaxPool2DBackpropProgram = (function () { - function MaxPool2DBackpropProgram(convInfo) { - this.variableNames = ['dy', 'maxPos']; - this.outputShape = convInfo.inShape; - var filterHeight = convInfo.filterHeight; - var filterWidth = convInfo.filterWidth; - var strideHeight = convInfo.strideHeight; - var strideWidth = convInfo.strideWidth; - var padTop = filterHeight - 1 - convInfo.padInfo.top; - var padLeft = filterWidth - 1 - convInfo.padInfo.left; - var lastIndex = filterHeight * filterWidth - 1; - this.userCode = "\n const ivec2 pads = ivec2(" + padTop + ", " + padLeft + ");\n\n void main() {\n ivec4 coords = getOutputCoords();\n int b = coords[0];\n int d = coords[3];\n\n ivec2 dyRCCorner = coords.yz - pads;\n int dyRCorner = dyRCCorner.x;\n int dyCCorner = dyRCCorner.y;\n\n // Convolve dy(?, ?, d) with pos mask(:, :, d) to get dx(xR, xC, d).\n // ? = to be determined. : = across all values in that axis.\n float dotProd = 0.0;\n for (int wR = 0; wR < " + filterHeight + "; wR++) {\n float dyR = float(dyRCorner + wR) / " + strideHeight + ".0;\n\n if (dyR < 0.0 || dyR >= " + convInfo.outHeight + ".0 || fract(dyR) > 0.0) {\n continue;\n }\n int idyR = int(dyR);\n\n for (int wC = 0; wC < " + filterWidth + "; wC++) {\n float dyC = float(dyCCorner + wC) / " + strideWidth + ".0;\n\n if (dyC < 0.0 || dyC >= " + convInfo.outWidth + ".0 ||\n fract(dyC) > 0.0) {\n continue;\n }\n int idyC = int(dyC);\n\n float dyValue = getDy(b, idyR, idyC, d);\n int maxPosValue = " + lastIndex + " - int(getMaxPos(b, idyR, idyC, d));\n\n // Get the current value, check it against the value from the\n // position matrix.\n int curPosValue = wR * " + filterWidth + " + wC;\n float mask = float(maxPosValue == curPosValue ? 1.0 : 0.0);\n\n dotProd += dyValue * mask;\n }\n }\n setOutput(dotProd);\n }\n "; - } - return MaxPool2DBackpropProgram; - }()); - - var MatMulProgram = (function () { - function MatMulProgram(aShape, bShape, transposeA, transposeB) { - if (transposeA === void 0) { transposeA = false; } - if (transposeB === void 0) { transposeB = false; } - this.variableNames = ['matrixA', 'matrixB']; - var outerShapeA = transposeA ? aShape[1] : aShape[0]; - var outerShapeB = transposeB ? bShape[0] : bShape[1]; - var sharedDim = transposeA ? aShape[0] : aShape[1]; - this.outputShape = [outerShapeA, outerShapeB]; - var aSnippetFromOffset = function (vec4Offset, indexVar) { - return transposeA ? indexVar + " + " + vec4Offset + ", aRow" : - "aRow, " + indexVar + " + " + vec4Offset; - }; - var bSnippetFromOffset = function (vec4Offset, indexVar) { - return transposeB ? "bCol, " + indexVar + " + " + vec4Offset : - indexVar + " + " + vec4Offset + ", bCol"; - }; - var sharedDimNearestVec4 = Math.floor(sharedDim / 4) * 4; - var sharedDimVec4Remainder = sharedDim % 4; - this.userCode = " float dotARowBCol(int aRow, int bCol) {\n float result = 0.0;\n for (int i = 0; i < " + sharedDimNearestVec4 + "; i += 4) {\n vec4 a = vec4(\n getMatrixA(" + aSnippetFromOffset(0, 'i') + "),\n getMatrixA(" + aSnippetFromOffset(1, 'i') + "),\n getMatrixA(" + aSnippetFromOffset(2, 'i') + "),\n getMatrixA(" + aSnippetFromOffset(3, 'i') + ")\n );\n vec4 b = vec4(\n getMatrixB(" + bSnippetFromOffset(0, 'i') + "),\n getMatrixB(" + bSnippetFromOffset(1, 'i') + "),\n getMatrixB(" + bSnippetFromOffset(2, 'i') + "),\n getMatrixB(" + bSnippetFromOffset(3, 'i') + ")\n );\n\n result += dot(a, b);\n }\n\n if (" + (sharedDimVec4Remainder === 1) + ") {\n result += getMatrixA(" + aSnippetFromOffset(0, sharedDimNearestVec4) + ") *\n getMatrixB(" + bSnippetFromOffset(0, sharedDimNearestVec4) + ");\n } else if (" + (sharedDimVec4Remainder === 2) + ") {\n vec2 a = vec2(\n getMatrixA(" + aSnippetFromOffset(0, sharedDimNearestVec4) + "),\n getMatrixA(" + aSnippetFromOffset(1, sharedDimNearestVec4) + ")\n );\n vec2 b = vec2(\n getMatrixB(" + bSnippetFromOffset(0, sharedDimNearestVec4) + "),\n getMatrixB(" + bSnippetFromOffset(1, sharedDimNearestVec4) + ")\n );\n result += dot(a, b);\n } else if (" + (sharedDimVec4Remainder === 3) + ") {\n vec3 a = vec3(\n getMatrixA(" + aSnippetFromOffset(0, sharedDimNearestVec4) + "),\n getMatrixA(" + aSnippetFromOffset(1, sharedDimNearestVec4) + "),\n getMatrixA(" + aSnippetFromOffset(2, sharedDimNearestVec4) + ")\n );\n vec3 b = vec3(\n getMatrixB(" + bSnippetFromOffset(0, sharedDimNearestVec4) + "),\n getMatrixB(" + bSnippetFromOffset(1, sharedDimNearestVec4) + "),\n getMatrixB(" + bSnippetFromOffset(2, sharedDimNearestVec4) + ")\n );\n result += dot(a, b);\n }\n\n return result;\n }\n\n void main() {\n ivec2 resRC = getOutputCoords();\n setOutput(dotARowBCol(resRC.x, resRC.y));\n }\n "; - } - return MatMulProgram; - }()); - - var MultinomialProgram = (function () { - function MultinomialProgram(batchSize, numOutcomes, numSamples) { - this.variableNames = ['probs']; - this.outputShape = [batchSize, numSamples]; - this.userCode = "\n uniform float seed;\n\n void main() {\n ivec2 coords = getOutputCoords();\n int batch = coords[0];\n\n float r = random(seed);\n float cdf = 0.0;\n\n for (int i = 0; i < " + (numOutcomes - 1) + "; i++) {\n cdf += getProbs(batch, i);\n\n if (r < cdf) {\n setOutput(float(i));\n return;\n }\n }\n\n // If no other event happened, last event happened.\n setOutput(float(" + (numOutcomes - 1) + "));\n }\n "; - } - MultinomialProgram.prototype.getCustomSetupFunc = function (seed) { - var _this = this; - return function (gpgpu, webGLProgram) { - if (_this.seedLoc == null) { - _this.seedLoc = gpgpu.getUniformLocation(webGLProgram, 'seed'); - } - gpgpu.gl.uniform1f(_this.seedLoc, seed); - }; - }; - return MultinomialProgram; - }()); - - var OneHotProgram = (function () { - function OneHotProgram(numIndices, depth, onValue, offValue) { - this.variableNames = ['indices']; - this.outputShape = [numIndices, depth]; - this.userCode = "\n void main() {\n ivec2 coords = getOutputCoords();\n int index = round(getIndices(coords.x));\n setOutput(mix(float(" + offValue + "), float(" + onValue + "),\n float(index == coords.y)));\n }\n "; - } - return OneHotProgram; - }()); - - var PadProgram = (function () { - function PadProgram(xShape, paddings, constantValue) { - this.variableNames = ['x']; - this.outputShape = paddings.map(function (p, i) { return p[0] + xShape[i] + p[1]; }); - var rank = xShape.length; - var type = getCoordsDataType(rank); - var start = paddings.map(function (p) { return p[0]; }).join(','); - var end = paddings.map(function (p, i) { return p[0] + xShape[i]; }).join(','); - var unpackedCoords = ['coords[0]', 'coords[1]', 'coords[2]', 'coords[3]'].slice(0, rank); - if (rank === 1) { - this.userCode = "\n int start = " + start + ";\n int end = " + end + ";\n\n void main() {\n int outC = getOutputCoords();\n if (outC < start || outC >= end) {\n setOutput(float(" + constantValue + "));\n } else {\n setOutput(getX(outC - start));\n }\n }\n "; - return; - } - this.userCode = "\n " + type + " start = " + type + "(" + start + ");\n " + type + " end = " + type + "(" + end + ");\n\n void main() {\n " + type + " outC = getOutputCoords();\n if (any(lessThan(outC, start)) || any(greaterThanEqual(outC, end))) {\n setOutput(float(" + constantValue + "));\n } else {\n " + type + " coords = outC - start;\n setOutput(getX(" + unpackedCoords + "));\n }\n }\n "; - } - return PadProgram; - }()); - - var Pool2DProgram = (function () { - function Pool2DProgram(convInfo, poolType, computePositions) { - this.variableNames = ['x']; - if (poolType === 'avg' && computePositions) { - throw new Error('Cannot compute positions for average pool.'); - } - var filterHeight = convInfo.filterHeight; - var filterWidth = convInfo.filterWidth; - var strideHeight = convInfo.strideHeight; - var strideWidth = convInfo.strideWidth; - var padTop = convInfo.padInfo.top; - var padLeft = convInfo.padInfo.left; - this.outputShape = convInfo.outShape; - var isAvgPool = poolType === 'avg'; - var initializationValue = '0.0'; - if (!isAvgPool) { - initializationValue = '-1.0 / 0.0'; - } - if (computePositions) { - var compareOp_1 = '>='; - this.userCode = "\n const ivec2 strides = ivec2(" + strideHeight + ", " + strideWidth + ");\n const ivec2 pads = ivec2(" + padTop + ", " + padLeft + ");\n\n void main() {\n ivec4 coords = getOutputCoords();\n int batch = coords[0];\n int d = coords[3];\n\n ivec2 xRCCorner = coords.yz * strides - pads;\n int xRCorner = xRCCorner.x;\n int xCCorner = xRCCorner.y;\n\n // max/min x(?, ?, d) to get y(yR, yC, d).\n // ? = to be determined\n float minMaxValue = 0.0;\n float minMaxValueFound = 0.0;\n int minMaxPosition = 0;\n float avgValue = 0.0;\n\n for (int wR = 0; wR < " + filterHeight + "; wR++) {\n int xR = xRCorner + wR;\n\n if (xR < 0 || xR >= " + convInfo.inHeight + ") {\n continue;\n }\n\n for (int wC = 0; wC < " + filterWidth + "; wC++) {\n int xC = xCCorner + wC;\n\n if (xC < 0 || xC >= " + convInfo.inWidth + ") {\n continue;\n }\n\n float value = getX(batch, xR, xC, d);\n\n // If a min / max value has already been found, use it. If not,\n // use the current value.\n float currMinMaxValue = mix(\n value, minMaxValue, minMaxValueFound);\n if (value " + compareOp_1 + " currMinMaxValue) {\n minMaxValue = value;\n minMaxValueFound = 1.0;\n minMaxPosition = wR * " + filterWidth + " + wC;\n }\n }\n }\n setOutput(float(minMaxPosition));\n }\n "; - return; - } - var compareOp = 'max'; - var returnValue = poolType + "(" + poolType + "(" + poolType + "(" + - 'minMaxValue[0], minMaxValue[1]), minMaxValue[2]), minMaxValue[3])'; - if (poolType === 'avg') { - returnValue = "avgValue / count"; - } - var filterWidthNearestVec4 = Math.floor(filterWidth / 4) * 4; - var filterWidthVec4Remainder = filterWidth % 4; - var updateSnippet = "\n if (" + isAvgPool + ") {\n avgValue += dot(values, ones);\n } else {\n minMaxValue = " + compareOp + "(values, minMaxValue);\n }\n "; - this.userCode = "\n const ivec2 strides = ivec2(" + strideHeight + ", " + strideWidth + ");\n const ivec2 pads = ivec2(" + padTop + ", " + padLeft + ");\n const float initializationValue = " + initializationValue + ";\n const vec4 ones = vec4(1.0, 1.0, 1.0, 1.0);\n\n float count = 0.0;\n\n float getValue(int batch, int xR, int xC, int d) {\n if (xC < 0 || xC >= " + convInfo.inWidth + ") {\n return initializationValue;\n }\n count += 1.0;\n return getX(batch, xR, xC, d);\n }\n\n void main() {\n ivec4 coords = getOutputCoords();\n int batch = coords[0];\n int d = coords[3];\n\n ivec2 xRCCorner = coords.yz * strides - pads;\n int xRCorner = xRCCorner.x;\n int xCCorner = xRCCorner.y;\n\n // max/min x(?, ?, d) to get y(yR, yC, d).\n // ? = to be determined\n vec4 minMaxValue = vec4(" + initializationValue + ");\n float avgValue = 0.0;\n count = 0.0;\n\n for (int wR = 0; wR < " + filterHeight + "; wR++) {\n int xR = xRCorner + wR;\n\n if (xR < 0 || xR >= " + convInfo.inHeight + ") {\n continue;\n }\n\n for (int wC = 0; wC < " + filterWidthNearestVec4 + "; wC += 4) {\n int xC = xCCorner + wC;\n\n vec4 values = vec4(\n getValue(batch, xR, xC, d),\n getValue(batch, xR, xC + 1, d),\n getValue(batch, xR, xC + 2, d),\n getValue(batch, xR, xC + 3, d)\n );\n\n " + updateSnippet + "\n }\n\n int xC = xCCorner + " + filterWidthNearestVec4 + ";\n if (" + (filterWidthVec4Remainder === 1) + ") {\n vec4 values = vec4(\n getValue(batch, xR, xC, d),\n initializationValue,\n initializationValue,\n initializationValue\n );\n\n " + updateSnippet + "\n } else if (" + (filterWidthVec4Remainder === 2) + ") {\n vec4 values = vec4(\n getValue(batch, xR, xC, d),\n getValue(batch, xR, xC + 1, d),\n initializationValue,\n initializationValue\n );\n\n " + updateSnippet + "\n } else if (" + (filterWidthVec4Remainder === 3) + ") {\n vec4 values = vec4(\n getValue(batch, xR, xC, d),\n getValue(batch, xR, xC + 1, d),\n getValue(batch, xR, xC + 2, d),\n initializationValue\n );\n\n " + updateSnippet + "\n }\n }\n setOutput(" + returnValue + ");\n }\n "; - } - return Pool2DProgram; - }()); - - var ReduceProgram = (function () { - function ReduceProgram(reduceInfo, reduceType) { - this.variableNames = ['x']; - var windowSize = reduceInfo.windowSize; - var batchSize = reduceInfo.batchSize; - var inSize = reduceInfo.inSize; - var outSize = Math.ceil(inSize / windowSize); - this.outputShape = [batchSize, outSize]; - var isReduceSum = reduceType === 'sum'; - var initializationValue = '0.0'; - if (!isReduceSum) { - if (reduceType === 'min') { - initializationValue = '1.0 / 0.0'; - } - else { - initializationValue = '-1.0 / 0.0'; - } - } - var compareOp = reduceType === 'min' ? 'min' : 'max'; - var returnValue = reduceType + "(" + reduceType + "(" + reduceType + "(" + - 'minMaxValue[0], minMaxValue[1]), minMaxValue[2]), minMaxValue[3])'; - if (reduceType === 'sum') { - returnValue = "sumValue"; - } - var windowSizeNearestVec4 = Math.floor(windowSize / 4) * 4; - var windowSizeVec4Remainder = windowSize % 4; - var updateSnippet = "\n if (" + isReduceSum + ") {\n sumValue += dot(values, ones);\n } else {\n minMaxValue = " + compareOp + "(values, minMaxValue);\n }\n "; - var checkOutOfBounds = ''; - if (inSize % windowSize > 0) { - checkOutOfBounds = "\n if (inIdx < 0 || inIdx >= " + inSize + ") {\n return initializationValue;\n }\n "; - } - this.userCode = "\n const float initializationValue = " + initializationValue + ";\n const vec4 ones = vec4(1.0, 1.0, 1.0, 1.0);\n\n float getValue(int batch, int inIdx) {\n " + checkOutOfBounds + "\n return getX(batch, inIdx);\n }\n\n void main() {\n ivec2 coords = getOutputCoords();\n int batch = coords[0];\n int outIdx = coords[1];\n int inOffset = outIdx * " + windowSize + ";\n\n vec4 minMaxValue = vec4(" + initializationValue + ");\n float sumValue = 0.0;\n\n for (int i = 0; i < " + windowSizeNearestVec4 + "; i += 4) {\n int inIdx = inOffset + i;\n vec4 values = vec4(\n getValue(batch, inIdx),\n getValue(batch, inIdx + 1),\n getValue(batch, inIdx + 2),\n getValue(batch, inIdx + 3)\n );\n\n " + updateSnippet + "\n }\n\n int inIdx = inOffset + " + windowSizeNearestVec4 + ";\n if (" + (windowSizeVec4Remainder === 1) + ") {\n vec4 values = vec4(\n getValue(batch, inIdx),\n initializationValue,\n initializationValue,\n initializationValue\n );\n " + updateSnippet + "\n } else if (" + (windowSizeVec4Remainder === 2) + ") {\n vec4 values = vec4(\n getValue(batch, inIdx),\n getValue(batch, inIdx + 1),\n initializationValue,\n initializationValue\n );\n " + updateSnippet + "\n } else if (" + (windowSizeVec4Remainder === 3) + ") {\n vec4 values = vec4(\n getValue(batch, inIdx),\n getValue(batch, inIdx + 1),\n getValue(batch, inIdx + 2),\n initializationValue\n );\n " + updateSnippet + "\n }\n setOutput(" + returnValue + ");\n }\n "; - } - return ReduceProgram; - }()); - - var ResizeBilinearBackpropProgram = (function () { - function ResizeBilinearBackpropProgram(dy, x, alignCorners) { - this.variableNames = ['dy']; - this.outputShape = []; - this.outputShape = x.shape; - var _a = x.shape, xHeight = _a[1], xWidth = _a[2]; - var _b = dy.shape, yHeight = _b[1], yWidth = _b[2]; - var effectiveXSize = [ - (alignCorners && yHeight > 1) ? xHeight - 1 : xHeight, - (alignCorners && yWidth > 1) ? xWidth - 1 : xWidth - ]; - var effectiveYSize = [ - (alignCorners && yHeight > 1) ? yHeight - 1 : yHeight, - (alignCorners && yWidth > 1) ? yWidth - 1 : yWidth - ]; - var heightScale = effectiveXSize[0] / effectiveYSize[0]; - var widthScale = effectiveXSize[1] / effectiveYSize[1]; - var invHeightScale = 1 / heightScale; - var invWidthScale = 1 / widthScale; - var winHeight = (Math.ceil(invHeightScale) * 2) + 2; - var winWidth = (Math.ceil(invWidthScale) * 2) + 2; - this.userCode = "\n void main() {\n ivec4 coords = getOutputCoords();\n int b = coords[0];\n int d = coords[3];\n int r = coords[1];\n int c = coords[2];\n\n float accumulator = 0.0;\n\n const float heightScale = float(" + heightScale + ");\n const float widthScale = float(" + widthScale + ");\n\n const float invHeightScale = float(" + invHeightScale + ");\n const float invWidthScale = float(" + invWidthScale + ");\n\n const int winHeight = int(" + winHeight + ");\n const int winWidth = int(" + winWidth + ");\n\n // Compute bounds for where in dy we will look\n float startRLerp = floor(float(r) * invHeightScale);\n int startDyR = int(startRLerp - float(winHeight / 2));\n\n float startCLerp = floor(float(c) * invWidthScale);\n int startDyC = int(startCLerp - float(winWidth / 2));\n\n // Loop over dy\n for (int dyROffset = 0; dyROffset < winHeight; dyROffset++) {\n int dyR = dyROffset + startDyR;\n\n // Guard against the window exceeding the bounds of dy\n if (dyR < 0 || dyR >= " + yHeight + ") {\n continue;\n }\n\n for (int dyCOffset = 0; dyCOffset < winWidth; dyCOffset++) {\n int dyC = dyCOffset + startDyC;\n\n // Guard against the window exceeding the bounds of dy\n if (dyC < 0 || dyC >= " + yWidth + ") {\n continue;\n }\n\n float dxR = float(dyR) * heightScale;\n int topDxRIndex = int(floor(dxR));\n int bottomDxRIndex = int(min(ceil(dxR), " + (xHeight - 1) + ".0));\n float dxRLerp = dxR - float(topDxRIndex);\n float inverseDxRLerp = 1.0 - dxRLerp;\n\n float dxC = float(dyC) * widthScale;\n int leftDxCIndex = int(floor(dxC));\n int rightDxCIndex = int(min(ceil(dxC), " + (xWidth - 1) + ".0));\n float dxCLerp = dxC - float(leftDxCIndex);\n float inverseDxCLerp = 1.0 - dxCLerp;\n\n if (r == topDxRIndex && c == leftDxCIndex) {\n // topLeft\n accumulator +=\n getDy(b, dyR, dyC, d) * inverseDxRLerp * inverseDxCLerp;\n }\n\n if (r == topDxRIndex && c == rightDxCIndex) {\n // topRight\n accumulator += getDy(b, dyR, dyC, d) * inverseDxRLerp * dxCLerp;\n }\n\n if (r == bottomDxRIndex && c == leftDxCIndex) {\n // bottomLeft\n accumulator += getDy(b, dyR, dyC, d) * dxRLerp * inverseDxCLerp;\n }\n\n if (r == bottomDxRIndex && c == rightDxCIndex) {\n // bottomRight\n accumulator += getDy(b, dyR, dyC, d) * dxRLerp * dxCLerp;\n }\n }\n }\n // End loop over dy\n\n setOutput(accumulator);\n }\n "; - } - return ResizeBilinearBackpropProgram; - }()); - - var ResizeBilinearProgram = (function () { - function ResizeBilinearProgram(inputShape, newHeight, newWidth, alignCorners) { - this.variableNames = ['A']; - this.outputShape = []; - var batch = inputShape[0], oldHeight = inputShape[1], oldWidth = inputShape[2], depth = inputShape[3]; - this.outputShape = [batch, newHeight, newWidth, depth]; - var effectiveInSize = [ - (alignCorners && newHeight > 1) ? oldHeight - 1 : oldHeight, - (alignCorners && newWidth > 1) ? oldWidth - 1 : oldWidth - ]; - var effectiveOutSize = [ - (alignCorners && newHeight > 1) ? newHeight - 1 : newHeight, - (alignCorners && newWidth > 1) ? newWidth - 1 : newWidth - ]; - this.userCode = "\n const vec2 effectiveInputOverOutputRatioRC = vec2(\n " + effectiveInSize[0] / effectiveOutSize[0] + ",\n " + effectiveInSize[1] / effectiveOutSize[1] + ");\n const vec2 inputShapeRC = vec2(" + oldHeight + ".0, " + oldWidth + ".0);\n\n void main() {\n ivec4 coords = getOutputCoords();\n int b = coords[0];\n int d = coords[3];\n ivec2 yRC = coords.yz;\n\n // Fractional source index.\n vec2 sourceFracIndexRC = vec2(yRC) * effectiveInputOverOutputRatioRC;\n\n // Compute the four integer indices.\n ivec2 sourceFloorRC = ivec2(sourceFracIndexRC);\n ivec2 sourceCeilRC = ivec2(\n min(inputShapeRC - 1.0, ceil(sourceFracIndexRC)));\n\n float topLeft = getA(b, sourceFloorRC.x, sourceFloorRC.y, d);\n float bottomLeft = getA(b, sourceCeilRC.x, sourceFloorRC.y, d);\n float topRight = getA(b, sourceFloorRC.x, sourceCeilRC.y, d);\n float bottomRight = getA(b, sourceCeilRC.x, sourceCeilRC.y, d);\n\n vec2 fracRC = sourceFracIndexRC - vec2(sourceFloorRC);\n\n float top = topLeft + (topRight - topLeft) * fracRC.y;\n float bottom = bottomLeft + (bottomRight - bottomLeft) * fracRC.y;\n float newValue = top + (bottom - top) * fracRC.x;\n\n setOutput(newValue);\n }\n "; - } - return ResizeBilinearProgram; - }()); - - var ResizeNearestNeighborProgram = (function () { - function ResizeNearestNeighborProgram(inputShape, newHeight, newWidth, alignCorners) { - this.variableNames = ['A']; - this.outputShape = []; - var batch = inputShape[0], oldHeight = inputShape[1], oldWidth = inputShape[2], depth = inputShape[3]; - this.outputShape = [batch, newHeight, newWidth, depth]; - var effectiveInSize = alignCorners ? [oldHeight - 1, oldWidth - 1] : [oldHeight, oldWidth]; - var effectiveOutSize = alignCorners ? [newHeight - 1, newWidth - 1] : [newHeight, newWidth]; - var roundBase = alignCorners ? '0.5' : '0.0'; - this.userCode = "\n const vec2 effectiveInputOverOutputRatioRC = vec2(\n " + effectiveInSize[0] / effectiveOutSize[0] + ",\n " + effectiveInSize[1] / effectiveOutSize[1] + ");\n const vec2 inputShapeRC = vec2(" + oldHeight + ".0, " + oldWidth + ".0);\n\n void main() {\n ivec4 coords = getOutputCoords();\n int b = coords[0];\n int d = coords[3];\n ivec2 yRC = coords.yz;\n\n // Fractional source index.\n vec2 sourceFracIndexRC = vec2(yRC) * effectiveInputOverOutputRatioRC;\n\n // Compute the coordinators of nearest neighbor point.\n ivec2 sourceNearestRC = ivec2(\n min(inputShapeRC - 1.0, floor(sourceFracIndexRC + " + roundBase + ")));\n\n float newValue = getA(b, sourceNearestRC.x, sourceNearestRC.y, d);\n\n setOutput(newValue);\n }\n "; - } - return ResizeNearestNeighborProgram; - }()); - - var ReverseProgram = (function () { - function ReverseProgram(xShape, axis) { - this.variableNames = ['x']; - var rank = xShape.length; - if (rank > 4) { - throw new Error("WebGL backend: Reverse of rank-" + rank + " tensor is not yet supported"); - } - this.outputShape = xShape; - if (rank === 1) { - this.userCode = "\n void main() {\n int coord = getOutputCoords();\n setOutput(getX(" + xShape[0] + " - coord - 1));\n }\n "; - return; - } - var getInCoord = function (i) { - if (axis.indexOf(i) !== -1 && xShape[i] !== 1) { - return xShape[i] + " - coords[" + i + "] - 1"; - } - return "coords[" + i + "]"; - }; - var inCoords = xShape.map(function (_, i) { return getInCoord(i); }).join(','); - var type = getCoordsDataType(rank); - this.userCode = "\n void main() {\n " + type + " coords = getOutputCoords();\n setOutput(getX(" + inCoords + "));\n }\n "; - } - return ReverseProgram; - }()); - - var SliceProgram = (function () { - function SliceProgram(destSize) { - this.variableNames = ['source']; - this.outputShape = destSize; - this.rank = destSize.length; - var dtype = getCoordsDataType(this.rank); - var sourceCoords = getCoords$1(this.rank); - this.userCode = "\n uniform " + dtype + " start;\n\n void main() {\n " + dtype + " sourceLoc = start + getOutputCoords();\n setOutput(getSource(" + sourceCoords + "));\n }\n "; - } - SliceProgram.prototype.getCustomSetupFunc = function (start) { - var _this = this; - if (start.length !== this.rank) { - throw Error("The rank (" + this.rank + ") of the program must match the " + - ("length of start (" + start.length + ")")); - } - return function (gpgpu, webGLProgram) { - if (_this.startLoc == null) { - _this.startLoc = gpgpu.getUniformLocationNoThrow(webGLProgram, 'start'); - if (_this.startLoc == null) { - return; - } - } - if (_this.rank === 1) { - gpgpu.gl.uniform1i(_this.startLoc, start[0]); - } - else if (_this.rank === 2) { - gpgpu.gl.uniform2i(_this.startLoc, start[0], start[1]); - } - else if (_this.rank === 3) { - gpgpu.gl.uniform3i(_this.startLoc, start[0], start[1], start[2]); - } - else if (_this.rank === 4) { - gpgpu.gl.uniform4i(_this.startLoc, start[0], start[1], start[2], start[3]); - } - else { - throw Error("Slicing for rank " + _this.rank + " is not yet supported"); - } - }; - }; - return SliceProgram; - }()); - function getCoords$1(rank) { - if (rank === 1) { - return 'sourceLoc'; - } - else if (rank === 2) { - return 'sourceLoc.x, sourceLoc.y'; - } - else if (rank === 3) { - return 'sourceLoc.x, sourceLoc.y, sourceLoc.z'; - } - else if (rank === 4) { - return 'sourceLoc.x, sourceLoc.y, sourceLoc.z, sourceLoc.w'; - } - else { - throw Error("Slicing for rank " + rank + " is not yet supported"); - } - } - - var StridedSliceProgram = (function () { - function StridedSliceProgram(begin, strides, shape) { - this.variableNames = ['x']; - this.outputShape = shape; - this.rank = shape.length; - var dtype = getCoordsDataType(this.rank); - var newCoords = ''; - if (this.rank === 1) { - newCoords = 'coords * strides + begin'; - } - else { - newCoords = - shape.map(function (_, i) { return "coords[" + i + "] * strides[" + i + "] + begin[" + i + "]"; }) - .join(','); - } - this.userCode = "\n " + dtype + " begin = " + dtype + "(" + begin + ");\n " + dtype + " strides = " + dtype + "(" + strides + ");\n\n void main() {\n " + dtype + " coords = getOutputCoords();\n setOutput(getX(" + newCoords + "));\n }\n "; - } - return StridedSliceProgram; - }()); - - var TextureManager = (function () { - function TextureManager(gpgpu) { - this.gpgpu = gpgpu; - this.numUsedTextures = 0; - this.numFreeTextures = 0; - this.freeTextures = {}; - this.logEnabled = false; - this.allocatedTextures = []; - this.usedTextureCount = {}; - } - TextureManager.prototype.acquireTexture = function (shapeRC, texType) { - if (texType === void 0) { texType = TextureType.FLOAT; } - var shapeKey = getKeyFromTextureShape(shapeRC, texType); - if (!(shapeKey in this.freeTextures)) { - this.freeTextures[shapeKey] = []; - } - if (!(shapeKey in this.usedTextureCount)) { - this.usedTextureCount[shapeKey] = 0; - } - this.usedTextureCount[shapeKey]++; - if (this.freeTextures[shapeKey].length > 0) { - this.numFreeTextures--; - this.numUsedTextures++; - this.log(); - return this.freeTextures[shapeKey].shift(); - } - this.numUsedTextures++; - this.log(); - var newTexture = this.gpgpu.createMatrixTexture(shapeRC[0], shapeRC[1]); - this.allocatedTextures.push(newTexture); - return newTexture; - }; - TextureManager.prototype.releaseTexture = function (texture, shape, texType) { - if (texType === void 0) { texType = TextureType.FLOAT; } - var shapeKey = getKeyFromTextureShape(shape, texType); - if (!(shapeKey in this.freeTextures)) { - this.freeTextures[shapeKey] = []; - } - this.freeTextures[shapeKey].push(texture); - this.numFreeTextures++; - this.numUsedTextures--; - this.usedTextureCount[shapeKey]--; - this.log(); - }; - TextureManager.prototype.log = function () { - if (!this.logEnabled) { - return; - } - var total = this.numFreeTextures + this.numUsedTextures; - console.log('Free/Used', this.numFreeTextures + " / " + this.numUsedTextures, "(" + total + ")"); - }; - TextureManager.prototype.getNumUsedTextures = function () { - return this.numUsedTextures; - }; - TextureManager.prototype.getNumFreeTextures = function () { - return this.numFreeTextures; - }; - TextureManager.prototype.dispose = function () { - var _this = this; - if (this.allocatedTextures == null) { - return; - } - this.allocatedTextures.forEach(function (texture) { - _this.gpgpu.deleteMatrixTexture(texture); - }); - this.freeTextures = null; - this.allocatedTextures = null; - this.usedTextureCount = null; - this.numUsedTextures = 0; - this.numFreeTextures = 0; - }; - return TextureManager; - }()); - function getKeyFromTextureShape(shapeRowsCol, texType) { - return shapeRowsCol[0] + "_" + shapeRowsCol[1] + "_" + texType; - } - - var TileProgram = (function () { - function TileProgram(aShape, reps) { - this.variableNames = ['A']; - var outputShape = new Array(aShape.length); - for (var i = 0; i < outputShape.length; i++) { - outputShape[i] = aShape[i] * reps[i]; - } - this.outputShape = outputShape; - this.rank = outputShape.length; - var dtype = getCoordsDataType(this.rank); - var sourceCoords = getSourceCoords$1(aShape); - this.userCode = "\n void main() {\n " + dtype + " resRC = getOutputCoords();\n setOutput(getA(" + sourceCoords + "));\n }\n "; - } - return TileProgram; - }()); - function getSourceCoords$1(aShape) { - var rank = aShape.length; - if (rank > 4) { - throw Error("Tile for rank " + rank + " is not yet supported"); - } - if (rank === 1) { - return "imod(resRC, " + aShape[0] + ")"; - } - var currentCoords = ['resRC.x', 'resRC.y', 'resRC.z', 'resRC.w']; - var sourceCoords = []; - for (var i = 0; i < aShape.length; i++) { - sourceCoords.push("imod(" + currentCoords[i] + ", " + aShape[i] + ")"); - } - return sourceCoords.join(); - } - - var TransposeProgram = (function () { - function TransposeProgram(aShape, newDim) { - this.variableNames = ['A']; - var outputShape = new Array(aShape.length); - for (var i = 0; i < outputShape.length; i++) { - outputShape[i] = aShape[newDim[i]]; - } - this.outputShape = outputShape; - this.rank = outputShape.length; - var dtype = getCoordsDataType(this.rank); - var switched = getSwitchedCoords(newDim); - this.userCode = "\n void main() {\n " + dtype + " resRC = getOutputCoords();\n setOutput(getA(" + switched + "));\n }\n "; - } - return TransposeProgram; - }()); - function getSwitchedCoords(newDim) { - var rank = newDim.length; - if (rank > 4) { - throw Error("Transpose for rank " + rank + " is not yet supported"); - } - var originalOrder = ['resRC.x', 'resRC.y', 'resRC.z', 'resRC.w']; - var switchedCoords = new Array(rank); - for (var i = 0; i < newDim.length; i++) { - switchedCoords[newDim[i]] = originalOrder[i]; - } - return switchedCoords.join(); - } - - var ERF_P = 0.3275911; - var ERF_A1 = 0.254829592; - var ERF_A2 = -0.284496736; - var ERF_A3 = 1.421413741; - var ERF_A4 = -1.453152027; - var ERF_A5 = 1.061405429; - - var UnaryOpProgram = (function () { - function UnaryOpProgram(aShape, opSnippet) { - this.variableNames = ['A']; - this.outputShape = aShape; - this.userCode = "\n float unaryOperation(float x) {\n " + opSnippet + "\n }\n\n void main() {\n float x = getAAtOutCoords();\n float y = unaryOperation(x);\n\n setOutput(y);\n }\n "; - } - return UnaryOpProgram; - }()); - var CHECK_NAN_SNIPPET$1 = "if (isNaN(x)) return x;"; - var ABS = "return abs(x);"; - var RELU = CHECK_NAN_SNIPPET$1 + "\n return (x < 0.0) ? 0.0 : x;\n"; - var ELU = "return (x >= 0.0) ? x : (exp(x) - 1.0);"; - var SELU = "\n // Stable and Attracting Fixed Point (0, 1) for Normalized Weights.\n // see: https://arxiv.org/abs/1706.02515\n float scaleAlpha = " + SELU_SCALEALPHA + ";\n float scale = " + SELU_SCALE + ";\n return (x >= 0.0) ? scale * x : scaleAlpha * (exp(x) - 1.0);\n"; - function STEP(alpha) { - if (alpha === void 0) { alpha = 0.0; } - return CHECK_NAN_SNIPPET$1 + ("\n return x > 0.0 ? 1.0 : float(" + alpha + ");\n "); - } - var NEG = "return -x;"; - var CEIL = "return ceil(x);"; - var FLOOR = "return floor(x);"; - var SIGN = "\n if (isNaN(x)) { return 0.0; }\n return sign(x);\n"; - var ROUND = "\n // OpenGL ES does not support round function.\n // The algorithm is based on banker's rounding.\n float base = floor(x);\n if ((x - base) < 0.5) {\n return floor(x);\n } else if ((x - base) > 0.5) {\n return ceil(x);\n } else {\n if (mod(base, 2.0) == 0.0) {\n return base;\n } else {\n return base + 1.0;\n }\n }\n"; - var EXP = "return exp(x);"; - var EXPM1 = "return exp(x) - 1.0;"; - var LOG = "return log(x);"; - var LOG1P = "return log(1.0 + x);"; - var SQRT = "return sqrt(x);"; - var RSQRT = "return inversesqrt(x);"; - var SIGMOID = "return 1.0 / (1.0 + exp(-1.0 * x));"; - var SOFTPLUS = "\n float epsilon = 1.1920928955078125e-7;\n float threshold = log(epsilon) + 2.0;\n\n bool too_large = x > -threshold;\n bool too_small = x < threshold;\n\n float result;\n float exp_x = exp(x);\n\n if (too_large){\n result = x;\n }\n else if (too_small){\n result = exp_x;\n }\n else{\n result = log(exp_x + 1.0);\n }\n return result;\n"; - var SIN = "return sin(x);"; - var COS = "return cos(x);"; - var TAN = "return tan(x);"; - var ASIN = "return asin(x);"; - var ACOS = "return acos(x);"; - var ATAN = CHECK_NAN_SNIPPET$1 + "\n return atan(x);\n"; - var SINH = "\n float e2x = exp(x);\n return (e2x - 1.0 / e2x) / 2.0;\n"; - var COSH = "\n float e2x = exp(-x);\n return (e2x + 1.0 / e2x) / 2.0;\n"; - var TANH = "\n float e2x = exp(-2.0 * abs(x));\n return sign(x) * (1.0 - e2x) / (1.0 + e2x);\n"; - var ASINH = "return log(x + sqrt(x * x + 1.0));"; - var ACOSH = "return log(x + sqrt(x * x - 1.0));"; - var ATANH = "return (log(1.0 + x) - log(1.0 - x)) / 2.0;"; - var ERF = "\n // Error function is calculated approximately with elementary function.\n // See \"Handbook of Mathematical Functions with Formulas,\n // Graphs, and Mathematical Tables\", Abramowitz and Stegun.\n float p = " + ERF_P + ";\n float a1 = " + ERF_A1 + ";\n float a2 = " + ERF_A2 + ";\n float a3 = " + ERF_A3 + ";\n float a4 = " + ERF_A4 + ";\n float a5 = " + ERF_A5 + ";\n\n float t = 1.0 / (1.0 + p * x);\n return 1.0 - (((((a5*t + a4)*t) + a3)*t + a2)*t + a1)*t*exp(-x*x);\n"; - var SQUARE = "return x * x;"; - var RECIPROCAL = "return 1.0 / x;"; - var LOGICAL_NOT = "return float(!(x >= 1.0));"; - var TO_INT = "return float(int(x));"; - - var __awaiter$5 = (undefined && undefined.__awaiter) || function (thisArg, _arguments, P, generator) { - return new (P || (P = Promise))(function (resolve, reject) { - function fulfilled(value) { try { step$$1(generator.next(value)); } catch (e) { reject(e); } } - function rejected(value) { try { step$$1(generator["throw"](value)); } catch (e) { reject(e); } } - function step$$1(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); } - step$$1((generator = generator.apply(thisArg, _arguments || [])).next()); - }); - }; - var __generator$5 = (undefined && undefined.__generator) || function (thisArg, body) { - var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g; - return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g; - function verb(n) { return function (v) { return step$$1([n, v]); }; } - function step$$1(op) { - if (f) throw new TypeError("Generator is already executing."); - while (_) try { - if (f = 1, y && (t = y[op[0] & 2 ? "return" : op[0] ? "throw" : "next"]) && !(t = t.call(y, op[1])).done) return t; - if (y = 0, t) op = [0, t.value]; - switch (op[0]) { - case 0: case 1: t = op; break; - case 4: _.label++; return { value: op[1], done: false }; - case 5: _.label++; y = op[1]; op = [0]; continue; - case 7: op = _.ops.pop(); _.trys.pop(); continue; - default: - if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; } - if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; } - if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; } - if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; } - if (t[2]) _.ops.pop(); - _.trys.pop(); continue; - } - op = body.call(thisArg, _); - } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; } - if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true }; - } - }; - var MathBackendWebGL = (function () { - function MathBackendWebGL(gpgpu, delayedStorage) { - if (delayedStorage === void 0) { delayedStorage = true; } - this.gpgpu = gpgpu; - this.delayedStorage = delayedStorage; - this.texData = new WeakMap(); - this.uploadWaitMs = 0; - this.downloadWaitMs = 0; - this.binaryCache = {}; - this.disposed = false; - if (ENV.get('WEBGL_VERSION') < 1) { - throw new Error('WebGL is not supported on this device'); - } - if (typeof document !== 'undefined') { - this.canvas = document.createElement('canvas'); - } - if (gpgpu == null) { - this.gpgpu = new GPGPUContext(createWebGLContext(this.canvas)); - this.gpgpuCreatedLocally = true; - } - else { - this.gpgpuCreatedLocally = false; - } - this.textureManager = new TextureManager(this.gpgpu); - } - MathBackendWebGL.prototype.register = function (dataId, shape, dtype) { - if (this.texData.has(dataId)) { - throw new Error('Data buffer is already registered'); - } - this.texData.set(dataId, { - shape: shape, - dtype: dtype, - values: null, - texture: null, - texShape: null, - texType: TextureType.FLOAT - }); - }; - MathBackendWebGL.prototype.fromPixels = function (pixels, numChannels) { - if (pixels == null) { - throw new Error('MathBackendWebGL.writePixels(): pixels can not be null'); - } - var texShape = [pixels.height, pixels.width]; - var outShape = [pixels.height, pixels.width, numChannels]; - if (pixels instanceof HTMLVideoElement) { - if (this.canvas == null) { - throw new Error('Can\'t read pixels from HTMLImageElement outside ' + - 'the browser.'); - } - this.canvas.width = pixels.width; - this.canvas.height = pixels.height; - this.canvas.getContext('2d').drawImage(pixels, 0, 0, pixels.width, pixels.height); - pixels = this.canvas; - } - var tempPixelArray = Tensor.make(texShape, {}, 'int32'); - this.texData.get(tempPixelArray.dataId).texType = TextureType.UNSIGNED_BYTE; - this.gpgpu.uploadPixelDataToTexture(this.getTexture(tempPixelArray.dataId), pixels); - var program = new FromPixelsProgram(outShape); - var res = this.compileAndRun(program, [tempPixelArray]); - tempPixelArray.dispose(); - return res; - }; - MathBackendWebGL.prototype.write = function (dataId, values) { - if (values == null) { - throw new Error('MathBackendWebGL.write(): values can not be null'); - } - this.throwIfNoData(dataId); - var texData = this.texData.get(dataId); - var texture = texData.texture, texShape = texData.texShape, texType = texData.texType; - if (texture != null) { - this.textureManager.releaseTexture(texture, texShape, texType); - texData.texture = null; - texData.texShape = null; - } - texData.values = values; - if (!this.delayedStorage) { - this.uploadToGPU(dataId); - } - }; - MathBackendWebGL.prototype.readSync = function (dataId) { - this.throwIfNoData(dataId); - var texData = this.texData.get(dataId); - var texture = texData.texture, values = texData.values, texShape = texData.texShape; - if (values != null) { - this.cacheOnCPU(dataId); - return values; - } - var shouldTimeProgram = this.activeTimers != null; - var start; - if (shouldTimeProgram) { - start = performance.now(); - } - var float32Values = this.gpgpu.downloadMatrixFromTexture(texture, texShape[0], texShape[1]); - if (shouldTimeProgram) { - this.downloadWaitMs += performance.now() - start; - } - this.cacheOnCPU(dataId, float32Values); - return texData.values; - }; - MathBackendWebGL.prototype.read = function (dataId) { - return __awaiter$5(this, void 0, void 0, function () { - var texData, texture, values, texShape, float32Values; - return __generator$5(this, function (_a) { - switch (_a.label) { - case 0: - this.throwIfNoData(dataId); - texData = this.texData.get(dataId); - texture = texData.texture, values = texData.values, texShape = texData.texShape; - if (values != null) { - this.cacheOnCPU(dataId); - return [2, values]; - } - if (!ENV.get('WEBGL_GET_BUFFER_SUB_DATA_ASYNC_EXTENSION_ENABLED')) return [3, 2]; - return [4, this.gpgpu.downloadMatrixFromTextureAsync(texture, texShape[0], texShape[1])]; - case 1: - float32Values = _a.sent(); - this.cacheOnCPU(dataId, float32Values); - return [2, texData.values]; - case 2: - if (ENV.get('WEBGL_DISJOINT_QUERY_TIMER_EXTENSION_VERSION') === 0) { - return [2, this.readSync(dataId)]; - } - return [4, this.gpgpu.runQuery(function () { })]; - case 3: - _a.sent(); - return [2, this.readSync(dataId)]; - } - }); - }); - }; - MathBackendWebGL.prototype.time = function (f) { - return __awaiter$5(this, void 0, void 0, function () { - var oldActiveTimers, newActiveTimers, outerMostTime, flattenedActiveTimers, kernelMs, res; - return __generator$5(this, function (_a) { - switch (_a.label) { - case 0: - oldActiveTimers = this.activeTimers; - newActiveTimers = []; - outerMostTime = false; - if (this.programTimersStack == null) { - this.programTimersStack = newActiveTimers; - outerMostTime = true; - } - else { - this.activeTimers.push(newActiveTimers); - } - this.activeTimers = newActiveTimers; - f(); - flattenedActiveTimers = flatten(this.activeTimers); - this.activeTimers = oldActiveTimers; - if (outerMostTime) { - this.programTimersStack = null; - } - return [4, Promise.all(flattenedActiveTimers).then(function (results) { - var sum$$1 = 0; - results.forEach(function (result) { return sum$$1 += result; }); - return sum$$1; - })]; - case 1: - kernelMs = _a.sent(); - res = { - uploadWaitMs: this.uploadWaitMs, - downloadWaitMs: this.downloadWaitMs, - kernelMs: kernelMs, - wallMs: null - }; - this.uploadWaitMs = 0; - this.downloadWaitMs = 0; - return [2, res]; - } - }); - }); - }; - MathBackendWebGL.prototype.memory = function () { - return { unreliable: false }; - }; - MathBackendWebGL.prototype.startTimer = function () { - if (ENV.get('WEBGL_DISJOINT_QUERY_TIMER_EXTENSION_VERSION') > 0) { - return this.gpgpu.beginQuery(); - } - return { startMs: performance.now(), endMs: null }; - }; - MathBackendWebGL.prototype.endTimer = function (query) { - if (ENV.get('WEBGL_DISJOINT_QUERY_TIMER_EXTENSION_VERSION') > 0) { - this.gpgpu.endQuery(); - return query; - } - query.endMs = performance.now(); - return query; - }; - MathBackendWebGL.prototype.getQueryTime = function (query) { - return __awaiter$5(this, void 0, void 0, function () { - var timerQuery; - return __generator$5(this, function (_a) { - if (ENV.get('WEBGL_DISJOINT_QUERY_TIMER_EXTENSION_VERSION') > 0) { - return [2, this.gpgpu.pollQueryTime(query)]; - } - timerQuery = query; - return [2, timerQuery.endMs - timerQuery.startMs]; - }); - }); - }; - MathBackendWebGL.prototype.disposeData = function (dataId) { - if (this.texData.has(dataId)) { - var _a = this.texData.get(dataId), texture = _a.texture, texShape = _a.texShape, texType = _a.texType; - if (texture != null) { - this.textureManager.releaseTexture(texture, texShape, texType); - } - this.texData.delete(dataId); - } - }; - MathBackendWebGL.prototype.getTexture = function (dataId) { - this.uploadToGPU(dataId); - return this.texData.get(dataId).texture; - }; - MathBackendWebGL.prototype.getTextureData = function (dataId) { - this.uploadToGPU(dataId); - return this.texData.get(dataId); - }; - MathBackendWebGL.prototype.getGPGPUContext = function () { - return this.gpgpu; - }; - MathBackendWebGL.prototype.getCanvas = function () { - return this.canvas; - }; - MathBackendWebGL.prototype.slice = function (x, begin, size) { - var program = new SliceProgram(size); - var customSetup = program.getCustomSetupFunc(begin); - return this.compileAndRun(program, [x], null, customSetup); - }; - MathBackendWebGL.prototype.stridedSlice = function (x, begin, end, strides, beginMask, endMask) { - var _a = getStridedSlicedInfo(x.shape, begin, end, strides, beginMask, endMask), beginIndex = _a[0], size = _a[1]; - if (size.some(function (axis) { return axis === 0; })) { - return tensor([], size); - } - var program = new StridedSliceProgram(beginIndex, strides, size); - return this.compileAndRun(program, [x]); - }; - MathBackendWebGL.prototype.reverse = function (x, axis) { - var program = new ReverseProgram(x.shape, axis); - return this.compileAndRun(program, [x]); - }; - MathBackendWebGL.prototype.concat = function (a, b) { - var program = new ConcatProgram(a.shape, b.shape); - return this.compileAndRun(program, [a, b]); - }; - MathBackendWebGL.prototype.neg = function (x) { - var program = new UnaryOpProgram(x.shape, NEG); - return this.compileAndRun(program, [x]); - }; - MathBackendWebGL.prototype.matMul = function (a, b, transposeA, transposeB) { - var program = new MatMulProgram(a.shape, b.shape, transposeA, transposeB); - return this.compileAndRun(program, [a, b]); - }; - MathBackendWebGL.prototype.multiply = function (a, b) { - var program = new BinaryOpProgram(MUL, a.shape, b.shape); - var output = this.makeOutputArray(program.outputShape, upcastType(a.dtype, b.dtype)); - return this.compileAndRun(program, [a, b], output); - }; - MathBackendWebGL.prototype.batchNormalization = function (x, mean$$1, variance, varianceEpsilon, scale, offset) { - var inputs = [x, mean$$1, variance]; - var offsetShape = null; - if (offset != null) { - offsetShape = offset.shape; - inputs.push(offset); - } - var scaleShape = null; - if (scale != null) { - scaleShape = scale.shape; - inputs.push(scale); - } - var program = new BatchNormProgram(x.shape, mean$$1.shape, variance.shape, offsetShape, scaleShape, varianceEpsilon); - return this.compileAndRun(program, inputs); - }; - MathBackendWebGL.prototype.localResponseNormalization4D = function (x, radius, bias, alpha, beta) { - var program = new LRNProgram(x.shape, radius, bias, alpha, beta); - return this.compileAndRun(program, [x]); - }; - MathBackendWebGL.prototype.tile = function (x, reps) { - var program = new TileProgram(x.shape, reps); - return this.compileAndRun(program, [x]); - }; - MathBackendWebGL.prototype.pad = function (x, paddings, constantValue) { - var program = new PadProgram(x.shape, paddings, constantValue); - return this.compileAndRun(program, [x]); - }; - MathBackendWebGL.prototype.transpose = function (x, perm) { - var program = new TransposeProgram(x.shape, perm); - return this.compileAndRun(program, [x]); - }; - MathBackendWebGL.prototype.gather = function (x, indices, axis) { - var program = new GatherProgram(x.shape, indices.size, axis); - return this.compileAndRun(program, [x, indices]); - }; - MathBackendWebGL.prototype.reduce = function (x, reduceType, dtype) { - var batchSize = x.shape[0]; - var inSize = x.shape[1]; - var windowSize = computeOptimalWindowSize(inSize); - var reduceInfo = { windowSize: windowSize, inSize: inSize, batchSize: batchSize }; - var program = new ReduceProgram(reduceInfo, reduceType); - var _a = program.outputShape, rows = _a[0], cols = _a[1]; - var output = this.makeOutputArray([rows, cols], dtype); - this.compileAndRun(program, [x], output); - if (output.shape[1] === 1) { - return output; - } - return this.reduce(output, reduceType, dtype); - }; - MathBackendWebGL.prototype.argReduce = function (x, reduceType, bestIndicesA) { - if (bestIndicesA === void 0) { bestIndicesA = null; } - var batchSize = x.shape[0]; - var inSize = x.shape[1]; - if (bestIndicesA != null) { - batchSize = bestIndicesA.shape[0]; - inSize = bestIndicesA.shape[1]; - } - var windowSize = computeOptimalWindowSize(inSize); - var reduceInfo = { windowSize: windowSize, inSize: inSize, batchSize: batchSize }; - var program = new ArgMinMaxProgram(reduceInfo, reduceType, bestIndicesA == null); - var _a = program.outputShape, rows = _a[0], cols = _a[1]; - var output = this.makeOutputArray([rows, cols], 'int32'); - var inputs = [x]; - if (bestIndicesA != null) { - inputs.push(bestIndicesA); - } - this.compileAndRun(program, inputs, output); - if (output.shape[1] === 1) { - return output; - } - return this.argReduce(x, reduceType, output); - }; - MathBackendWebGL.prototype.sum = function (x, axes) { - assertAxesAreInnerMostDims('sum', axes, x.rank); - var _a = computeOutAndReduceShapes(x.shape, axes), outShape = _a[0], reduceShape = _a[1]; - var inSize = sizeFromShape(reduceShape); - var a2D = x.as2D(-1, inSize); - var outputDType = sumOutType(x.dtype); - return this.reduce(a2D, 'sum', outputDType).reshape(outShape); - }; - MathBackendWebGL.prototype.argMin = function (x, axis) { - var axes = [axis]; - assertAxesAreInnerMostDims('argMin', axes, x.rank); - var _a = computeOutAndReduceShapes(x.shape, axes), outShape = _a[0], reduceShape = _a[1]; - var inSize = sizeFromShape(reduceShape); - var a2D = x.as2D(-1, inSize); - return this.argReduce(a2D, 'min').reshape(outShape); - }; - MathBackendWebGL.prototype.argMax = function (x, axis) { - var axes = [axis]; - assertAxesAreInnerMostDims('argMax', axes, x.rank); - var _a = computeOutAndReduceShapes(x.shape, axes), outShape = _a[0], reduceShape = _a[1]; - var inSize = sizeFromShape(reduceShape); - var a2D = x.as2D(-1, inSize); - return this.argReduce(a2D, 'max').reshape(outShape); - }; - MathBackendWebGL.prototype.cumsum = function (x, axis, exclusive, reverse$$1) { - var program = new CumSumProgram(x.shape, exclusive, reverse$$1); - return this.compileAndRun(program, [x]); - }; - MathBackendWebGL.prototype.equal = function (a, b) { - var program = new BinaryOpProgram(EQUAL, a.shape, b.shape); - var output = this.makeOutputArray(program.outputShape, 'bool'); - return this.compileAndRun(program, [a, b], output); - }; - MathBackendWebGL.prototype.notEqual = function (a, b) { - var program = new BinaryOpProgram(NOT_EQUAL, a.shape, b.shape); - var output = this.makeOutputArray(program.outputShape, 'bool'); - return this.compileAndRun(program, [a, b], output); - }; - MathBackendWebGL.prototype.less = function (a, b) { - var program = new BinaryOpProgram(LESS, a.shape, b.shape); - var output = this.makeOutputArray(program.outputShape, 'bool'); - return this.compileAndRun(program, [a, b], output); - }; - MathBackendWebGL.prototype.lessEqual = function (a, b) { - var program = new BinaryOpProgram(LESS_EQUAL, a.shape, b.shape); - var output = this.makeOutputArray(program.outputShape, 'bool'); - return this.compileAndRun(program, [a, b], output); - }; - MathBackendWebGL.prototype.greater = function (a, b) { - var program = new BinaryOpProgram(GREATER, a.shape, b.shape); - var output = this.makeOutputArray(program.outputShape, 'bool'); - return this.compileAndRun(program, [a, b], output); - }; - MathBackendWebGL.prototype.greaterEqual = function (a, b) { - var program = new BinaryOpProgram(GREATER_EQUAL, a.shape, b.shape); - var output = this.makeOutputArray(program.outputShape, 'bool'); - return this.compileAndRun(program, [a, b], output); - }; - MathBackendWebGL.prototype.logicalNot = function (x) { - var program = new UnaryOpProgram(x.shape, LOGICAL_NOT); - return this.compileAndRun(program, [x]); - }; - MathBackendWebGL.prototype.logicalAnd = function (a, b) { - var program = new BinaryOpProgram(LOGICAL_AND, a.shape, b.shape); - var output = this.makeOutputArray(program.outputShape, 'bool'); - return this.compileAndRun(program, [a, b], output); - }; - MathBackendWebGL.prototype.logicalOr = function (a, b) { - var program = new BinaryOpProgram(LOGICAL_OR, a.shape, b.shape); - var output = this.makeOutputArray(program.outputShape, 'bool'); - return this.compileAndRun(program, [a, b], output); - }; - MathBackendWebGL.prototype.where = function (condition, a, b, dtype) { - var program = new WhereProgram(condition.rank, a.shape, a.rank); - var output = this.makeOutputArray(program.outputShape, dtype); - return this.compileAndRun(program, [condition, a, b], output); - }; - MathBackendWebGL.prototype.topKValues = function (x, k) { - throw new Error('topKValues GPU not yet implemented!'); - }; - MathBackendWebGL.prototype.topKIndices = function (x, k) { - throw new Error('topKIndices GPU not yet implemented!'); - }; - MathBackendWebGL.prototype.min = function (x, axes) { - assertAxesAreInnerMostDims('min', axes, x.rank); - var _a = computeOutAndReduceShapes(x.shape, axes), outShape = _a[0], reduceShape = _a[1]; - var inSize = sizeFromShape(reduceShape); - var a2D = x.as2D(-1, inSize); - return this.reduce(a2D, 'min', a2D.dtype).reshape(outShape); - }; - MathBackendWebGL.prototype.minimum = function (a, b) { - var program = new BinaryOpProgram(MIN, a.shape, b.shape); - return this.compileAndRun(program, [a, b]); - }; - MathBackendWebGL.prototype.mod = function (a, b) { - var program = new BinaryOpProgram(MOD, a.shape, b.shape); - return this.compileAndRun(program, [a, b]); - }; - MathBackendWebGL.prototype.max = function (x, axes) { - assertAxesAreInnerMostDims('max', axes, x.rank); - var _a = computeOutAndReduceShapes(x.shape, axes), outShape = _a[0], reduceShape = _a[1]; - var inSize = sizeFromShape(reduceShape); - var a2D = x.as2D(-1, inSize); - return this.reduce(a2D, 'max', a2D.dtype).reshape(outShape); - }; - MathBackendWebGL.prototype.maximum = function (a, b) { - var program = new BinaryOpProgram(MAX, a.shape, b.shape); - return this.compileAndRun(program, [a, b]); - }; - MathBackendWebGL.prototype.squaredDifference = function (a, b) { - var program = new BinaryOpProgram(SQUARED_DIFFERENCE, a.shape, b.shape); - return this.compileAndRun(program, [a, b]); - }; - MathBackendWebGL.prototype.divide = function (a, b) { - var op; - var outputDtype; - if (a.dtype === 'int32' && b.dtype === 'int32') { - op = INT_DIV; - outputDtype = 'int32'; - } - else { - op = DIV; - outputDtype = 'float32'; - } - var program = new BinaryOpProgram(op, a.shape, b.shape); - var output = this.makeOutputArray(program.outputShape, outputDtype); - return this.compileAndRun(program, [a, b], output); - }; - MathBackendWebGL.prototype.add = function (a, b) { - var program = new BinaryOpProgram(ADD, a.shape, b.shape); - var output = this.makeOutputArray(program.outputShape, upcastType(a.dtype, b.dtype)); - return this.compileAndRun(program, [a, b], output); - }; - MathBackendWebGL.prototype.subtract = function (a, b) { - var program = new BinaryOpProgram(SUB, a.shape, b.shape); - var output = this.makeOutputArray(program.outputShape, upcastType(a.dtype, b.dtype)); - return this.compileAndRun(program, [a, b], output); - }; - MathBackendWebGL.prototype.pow = function (a, b) { - var program = new BinaryOpProgram(POW, a.shape, b.shape); - var output = this.makeOutputArray(program.outputShape, upcastType(a.dtype, b.dtype)); - return this.compileAndRun(program, [a, b], output); - }; - MathBackendWebGL.prototype.ceil = function (x) { - var program = new UnaryOpProgram(x.shape, CEIL); - return this.compileAndRun(program, [x]); - }; - MathBackendWebGL.prototype.floor = function (x) { - var program = new UnaryOpProgram(x.shape, FLOOR); - return this.compileAndRun(program, [x]); - }; - MathBackendWebGL.prototype.sign = function (x) { - var program = new UnaryOpProgram(x.shape, SIGN); - return this.compileAndRun(program, [x]); - }; - MathBackendWebGL.prototype.round = function (x) { - var program = new UnaryOpProgram(x.shape, ROUND); - return this.compileAndRun(program, [x]); - }; - MathBackendWebGL.prototype.exp = function (x) { - var program = new UnaryOpProgram(x.shape, EXP); - return this.compileAndRun(program, [x]); - }; - MathBackendWebGL.prototype.expm1 = function (x) { - var program = new UnaryOpProgram(x.shape, EXPM1); - return this.compileAndRun(program, [x]); - }; - MathBackendWebGL.prototype.log = function (x) { - var program = new UnaryOpProgram(x.shape, LOG); - return this.compileAndRun(program, [x]); - }; - MathBackendWebGL.prototype.log1p = function (x) { - var program = new UnaryOpProgram(x.shape, LOG1P); - return this.compileAndRun(program, [x]); - }; - MathBackendWebGL.prototype.sqrt = function (x) { - var program = new UnaryOpProgram(x.shape, SQRT); - return this.compileAndRun(program, [x]); - }; - MathBackendWebGL.prototype.rsqrt = function (x) { - var program = new UnaryOpProgram(x.shape, RSQRT); - return this.compileAndRun(program, [x]); - }; - MathBackendWebGL.prototype.square = function (x) { - var program = new UnaryOpProgram(x.shape, SQUARE); - return this.compileAndRun(program, [x]); - }; - MathBackendWebGL.prototype.reciprocal = function (x) { - var program = new UnaryOpProgram(x.shape, RECIPROCAL); - return this.compileAndRun(program, [x]); - }; - MathBackendWebGL.prototype.relu = function (x) { - var program = new UnaryOpProgram(x.shape, RELU); - return this.compileAndRun(program, [x]); - }; - MathBackendWebGL.prototype.elu = function (x) { - var program = new UnaryOpProgram(x.shape, ELU); - return this.compileAndRun(program, [x]); - }; - MathBackendWebGL.prototype.eluDer = function (dy, y) { - var program = new BinaryOpProgram(ELU_DER, dy.shape, y.shape); - return this.compileAndRun(program, [dy, y]); - }; - MathBackendWebGL.prototype.selu = function (x) { - var program = new UnaryOpProgram(x.shape, SELU); - return this.compileAndRun(program, [x]); - }; - MathBackendWebGL.prototype.int = function (x) { - var program = new UnaryOpProgram(x.shape, TO_INT); - var output = this.makeOutputArray(program.outputShape, 'int32'); - return this.compileAndRun(program, [x], output); - }; - MathBackendWebGL.prototype.clip = function (x, min$$1, max$$1) { - var program = new ClipProgram(x.shape, min$$1, max$$1); - return this.compileAndRun(program, [x]); - }; - MathBackendWebGL.prototype.abs = function (x) { - var program = new UnaryOpProgram(x.shape, ABS); - return this.compileAndRun(program, [x]); - }; - MathBackendWebGL.prototype.sigmoid = function (x) { - var program = new UnaryOpProgram(x.shape, SIGMOID); - return this.compileAndRun(program, [x]); - }; - MathBackendWebGL.prototype.softplus = function (x) { - var program = new UnaryOpProgram(x.shape, SOFTPLUS); - return this.compileAndRun(program, [x]); - }; - MathBackendWebGL.prototype.sin = function (x) { - var program = new UnaryOpProgram(x.shape, SIN); - return this.compileAndRun(program, [x]); - }; - MathBackendWebGL.prototype.cos = function (x) { - var program = new UnaryOpProgram(x.shape, COS); - return this.compileAndRun(program, [x]); - }; - MathBackendWebGL.prototype.tan = function (x) { - var program = new UnaryOpProgram(x.shape, TAN); - return this.compileAndRun(program, [x]); - }; - MathBackendWebGL.prototype.asin = function (x) { - var program = new UnaryOpProgram(x.shape, ASIN); - return this.compileAndRun(program, [x]); - }; - MathBackendWebGL.prototype.acos = function (x) { - var program = new UnaryOpProgram(x.shape, ACOS); - return this.compileAndRun(program, [x]); - }; - MathBackendWebGL.prototype.atan = function (x) { - var program = new UnaryOpProgram(x.shape, ATAN); - return this.compileAndRun(program, [x]); - }; - MathBackendWebGL.prototype.atan2 = function (a, b) { - var program = new BinaryOpProgram(ATAN2, a.shape, b.shape); - return this.compileAndRun(program, [a, b]); - }; - MathBackendWebGL.prototype.sinh = function (x) { - var program = new UnaryOpProgram(x.shape, SINH); - return this.compileAndRun(program, [x]); - }; - MathBackendWebGL.prototype.cosh = function (x) { - var program = new UnaryOpProgram(x.shape, COSH); - return this.compileAndRun(program, [x]); - }; - MathBackendWebGL.prototype.tanh = function (x) { - var program = new UnaryOpProgram(x.shape, TANH); - return this.compileAndRun(program, [x]); - }; - MathBackendWebGL.prototype.asinh = function (x) { - var program = new UnaryOpProgram(x.shape, ASINH); - return this.compileAndRun(program, [x]); - }; - MathBackendWebGL.prototype.acosh = function (x) { - var program = new UnaryOpProgram(x.shape, ACOSH); - return this.compileAndRun(program, [x]); - }; - MathBackendWebGL.prototype.atanh = function (x) { - var program = new UnaryOpProgram(x.shape, ATANH); - return this.compileAndRun(program, [x]); - }; - MathBackendWebGL.prototype.erf = function (x) { - var program = new UnaryOpProgram(x.shape, ERF); - return this.compileAndRun(program, [x]); - }; - MathBackendWebGL.prototype.step = function (x, alpha) { - var program = new UnaryOpProgram(x.shape, STEP(alpha)); - return this.compileAndRun(program, [x]); - }; - MathBackendWebGL.prototype.conv2d = function (x, filter, convInfo) { - var program = new Conv2DProgram(convInfo); - return this.compileAndRun(program, [x, filter]); - }; - MathBackendWebGL.prototype.conv2dDerInput = function (dy, filter, convInfo) { - var program = new Conv2DDerInputProgram(convInfo); - return this.compileAndRun(program, [dy, filter]); - }; - MathBackendWebGL.prototype.conv2dDerFilter = function (x, dy, convInfo) { - var program = new Conv2DDerFilterProgram(convInfo); - return this.compileAndRun(program, [x, dy]); - }; - MathBackendWebGL.prototype.depthwiseConv2D = function (x, filter, convInfo) { - var program = new DepthwiseConv2DProgram(convInfo); - return this.compileAndRun(program, [x, filter]); - }; - MathBackendWebGL.prototype.maxPool = function (x, convInfo) { - var program = new Pool2DProgram(convInfo, 'max', false); - var output = this.makeOutputArray(program.outputShape, x.dtype); - return this.compileAndRun(program, [x], output); - }; - MathBackendWebGL.prototype.avgPool = function (x, convInfo) { - var program = new Pool2DProgram(convInfo, 'avg', false); - var output = this.makeOutputArray(program.outputShape, 'float32'); - return this.compileAndRun(program, [x], output); - }; - MathBackendWebGL.prototype.maxPoolBackprop = function (dy, x, y, convInfo) { - var getPositions = true; - var maxPoolPositionsProgram = new Pool2DProgram(convInfo, 'max', getPositions); - var maxPoolPositions = this.compileAndRun(maxPoolPositionsProgram, [x]); - var maxPoolBackPropProgram = new MaxPool2DBackpropProgram(convInfo); - var output = this.makeOutputArray(maxPoolBackPropProgram.outputShape, x.dtype); - var result = this.compileAndRun(maxPoolBackPropProgram, [dy, maxPoolPositions], output); - maxPoolPositions.dispose(); - return result; - }; - MathBackendWebGL.prototype.avgPoolBackprop = function (dy, x, convInfo) { - var avgPoolBackpropProgram = new AvgPool2DBackpropProgram(convInfo); - var output = this.makeOutputArray(avgPoolBackpropProgram.outputShape, x.dtype); - return this.compileAndRun(avgPoolBackpropProgram, [dy], output); - }; - MathBackendWebGL.prototype.cast = function (x, dtype) { - return castTensor(x, dtype, this); - }; - MathBackendWebGL.prototype.reshape = function (x, shape) { - return reshapeTensor(x, shape); - }; - MathBackendWebGL.prototype.resizeBilinear = function (x, newHeight, newWidth, alignCorners) { - var program = new ResizeBilinearProgram(x.shape, newHeight, newWidth, alignCorners); - return this.compileAndRun(program, [x]); - }; - MathBackendWebGL.prototype.resizeBilinearBackprop = function (dy, x, alignCorners) { - var program = new ResizeBilinearBackpropProgram(dy, x, alignCorners); - return this.compileAndRun(program, [dy]); - }; - MathBackendWebGL.prototype.resizeNearestNeighbor = function (x, newHeight, newWidth, alignCorners) { - var program = new ResizeNearestNeighborProgram(x.shape, newHeight, newWidth, alignCorners); - return this.compileAndRun(program, [x]); - }; - MathBackendWebGL.prototype.multinomial = function (logits, normalized, numSamples, seed) { - var probs = normalized ? logits : softmax(logits); - var batchSize = probs.shape[0]; - var numOutcomes = probs.shape[1]; - var program = new MultinomialProgram(batchSize, numOutcomes, numSamples); - var output = this.makeOutputArray(program.outputShape, 'int32'); - var customSetup = program.getCustomSetupFunc(seed); - return this.compileAndRun(program, [probs], output, customSetup); - }; - MathBackendWebGL.prototype.oneHot = function (indices, depth, onValue, offValue) { - var program = new OneHotProgram(indices.size, depth, onValue, offValue); - return this.compileAndRun(program, [indices]); - }; - MathBackendWebGL.prototype.makeOutputArray = function (shape, dtype) { - return Tensor.make(shape, {}, dtype); - }; - MathBackendWebGL.prototype.compileAndRun = function (program, inputs, output, customSetup) { - var _this = this; - if (output == null) { - output = this.makeOutputArray(program.outputShape, inputs[0].dtype); - } - var inputsData = inputs.map(function (input) { - _this.uploadToGPU(input.dataId); - return { tensor: input, texData: _this.texData.get(input.dataId) }; - }); - this.uploadToGPU(output.dataId); - var outputData = { - tensor: output, - texData: this.texData.get(output.dataId) - }; - var key = makeShaderKey(program, inputsData, outputData); - var binary = this.getAndSaveBinary(key, function () { - return compileProgram(_this.gpgpu, program, inputsData, outputData); - }); - var shouldTimeProgram = this.activeTimers != null; - var query; - if (shouldTimeProgram) { - query = this.startTimer(); - } - runProgram(binary, inputsData, outputData, customSetup); - if (shouldTimeProgram) { - query = this.endTimer(query); - this.activeTimers.push(this.getQueryTime(query)); - } - return output; - }; - MathBackendWebGL.prototype.getAndSaveBinary = function (key, getBinary) { - if (!(key in this.binaryCache)) { - this.binaryCache[key] = getBinary(); - } - return this.binaryCache[key]; - }; - MathBackendWebGL.prototype.getTextureManager = function () { - return this.textureManager; - }; - MathBackendWebGL.prototype.dispose = function () { - if (this.disposed) { - return; - } - for (var key in this.binaryCache) { - this.gpgpu.deleteProgram(this.binaryCache[key].webGLProgram); - } - this.textureManager.dispose(); - this.canvas.remove(); - if (this.gpgpuCreatedLocally) { - this.gpgpu.dispose(); - } - this.disposed = true; - }; - MathBackendWebGL.prototype.throwIfNoData = function (dataId) { - if (!this.texData.has(dataId)) { - throw new Error("WebGL backend: No data found for this tensor. " + - "Did you change your backend in the middle of the program? " + - "New backends can't use Tensors created with previous backends"); - } - }; - MathBackendWebGL.prototype.uploadToGPU = function (dataId) { - this.throwIfNoData(dataId); - var texData = this.texData.get(dataId); - var shape = texData.shape, values = texData.values, texture = texData.texture, dtype = texData.dtype, texType = texData.texType; - if (texture != null) { - return; - } - var shouldTimeProgram = this.activeTimers != null; - var start; - if (shouldTimeProgram) { - start = performance.now(); - } - var texShape = getTextureShapeFromLogicalShape(this.gpgpu.gl, shape); - texData.texShape = texShape; - var newTexture = this.textureManager.acquireTexture(texShape, texType); - texData.texture = newTexture; - if (values != null) { - this.gpgpu.uploadMatrixToTexture(newTexture, texShape[0], texShape[1], typedArrayToFloat32(values, dtype)); - texData.values = null; - if (shouldTimeProgram) { - this.uploadWaitMs += performance.now() - start; - } - } - }; - MathBackendWebGL.prototype.cacheOnCPU = function (dataId, float32Values) { - var dontKeepCopyOnGPU = this.delayedStorage; - var texData = this.texData.get(dataId); - var texture = texData.texture, texShape = texData.texShape, dtype = texData.dtype, texType = texData.texType; - if (dontKeepCopyOnGPU && texture != null) { - this.textureManager.releaseTexture(texture, texShape, texType); - texData.texture = null; - texData.texShape = null; - } - if (float32Values != null) { - texData.values = float32ToTypedArray(float32Values, dtype); - } - }; - return MathBackendWebGL; - }()); - ENV.registerBackend('webgl', function () { return new MathBackendWebGL(); }, 2); - function float32ToTypedArray(a, dtype) { - if (dtype === 'float32') { - return a; - } - else if (dtype === 'int32' || dtype === 'bool') { - var result = (dtype === 'int32') ? new Int32Array(a.length) : - new Uint8Array(a.length); - for (var i = 0; i < result.length; ++i) { - result[i] = Math.round(a[i]); - } - return result; - } - else { - throw new Error("Unknown dtype " + dtype); - } - } - function typedArrayToFloat32(a, dtype) { - return (a instanceof Float32Array) ? a : new Float32Array(a); - } - - var __awaiter$6 = (undefined && undefined.__awaiter) || function (thisArg, _arguments, P, generator) { - return new (P || (P = Promise))(function (resolve, reject) { - function fulfilled(value) { try { step$$1(generator.next(value)); } catch (e) { reject(e); } } - function rejected(value) { try { step$$1(generator["throw"](value)); } catch (e) { reject(e); } } - function step$$1(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); } - step$$1((generator = generator.apply(thisArg, _arguments || [])).next()); - }); - }; - var __generator$6 = (undefined && undefined.__generator) || function (thisArg, body) { - var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g; - return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g; - function verb(n) { return function (v) { return step$$1([n, v]); }; } - function step$$1(op) { - if (f) throw new TypeError("Generator is already executing."); - while (_) try { - if (f = 1, y && (t = y[op[0] & 2 ? "return" : op[0] ? "throw" : "next"]) && !(t = t.call(y, op[1])).done) return t; - if (y = 0, t) op = [0, t.value]; - switch (op[0]) { - case 0: case 1: t = op; break; - case 4: _.label++; return { value: op[1], done: false }; - case 5: _.label++; y = op[1]; op = [0]; continue; - case 7: op = _.ops.pop(); _.trys.pop(); continue; - default: - if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; } - if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; } - if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; } - if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; } - if (t[2]) _.ops.pop(); - _.trys.pop(); continue; - } - op = body.call(thisArg, _); - } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; } - if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true }; - } - }; - var MathBackendCPU = (function () { - function MathBackendCPU() { - this.data = new WeakMap(); - if (typeof document !== 'undefined') { - this.canvas = document.createElement('canvas'); - } - } - MathBackendCPU.prototype.register = function (dataId, shape, dtype) { - if (this.data.has(dataId)) { - throw new Error("Data buffer is already registered"); - } - this.data.set(dataId, null); - }; - MathBackendCPU.prototype.write = function (dataId, values) { - if (values == null) { - throw new Error('MathBackendCPU.write(): values can not be null'); - } - this.throwIfNoData(dataId); - this.data.set(dataId, values); - }; - MathBackendCPU.prototype.fromPixels = function (pixels, numChannels) { - if (pixels == null) { - throw new Error('MathBackendCPU.writePixels(): pixels can not be null'); - } - var vals; - if (pixels instanceof ImageData) { - vals = pixels.data; - } - else if (pixels instanceof HTMLCanvasElement) { - vals = pixels.getContext('2d') - .getImageData(0, 0, pixels.width, pixels.height) - .data; - } - else if (pixels instanceof HTMLImageElement || - pixels instanceof HTMLVideoElement) { - if (this.canvas == null) { - throw new Error('Can\'t read pixels from HTMLImageElement outside ' + - 'the browser.'); - } - this.canvas.width = pixels.width; - this.canvas.height = pixels.height; - this.canvas.getContext('2d').drawImage(pixels, 0, 0, pixels.width, pixels.height); - vals = this.canvas.getContext('2d') - .getImageData(0, 0, pixels.width, pixels.height) - .data; - } - else { - throw new Error("pixels is of unknown type: " + pixels.constructor.name); - } - var values; - if (numChannels === 4) { - values = new Int32Array(vals); - } - else { - var numPixels = pixels.width * pixels.height; - values = new Int32Array(numPixels * numChannels); - for (var i = 0; i < numPixels; i++) { - for (var channel = 0; channel < numChannels; ++channel) { - values[i * numChannels + channel] = vals[i * 4 + channel]; - } - } - } - var outShape = [pixels.height, pixels.width, numChannels]; - return tensor3d(values, outShape, 'int32'); - }; - MathBackendCPU.prototype.read = function (dataId) { - return __awaiter$6(this, void 0, void 0, function () { - return __generator$6(this, function (_a) { - return [2, this.readSync(dataId)]; - }); - }); - }; - MathBackendCPU.prototype.readSync = function (dataId) { - this.throwIfNoData(dataId); - return this.data.get(dataId); - }; - MathBackendCPU.prototype.disposeData = function (dataId) { - if (this.data.has(dataId)) { - this.data.delete(dataId); - } - }; - MathBackendCPU.prototype.time = function (f) { - return __awaiter$6(this, void 0, void 0, function () { - var start, kernelMs; - return __generator$6(this, function (_a) { - start = performance.now(); - f(); - kernelMs = performance.now() - start; - return [2, { kernelMs: kernelMs }]; - }); - }); - }; - MathBackendCPU.prototype.memory = function () { - return { - unreliable: true - }; - }; - MathBackendCPU.prototype.throwIfNoData = function (dataId) { - if (!this.data.has(dataId)) { - throw new Error("CPU backend: No data found for this tensor. " + - "Did you change your backend in the middle of the program? " + - "New backends can't use Tensors created with previous backends"); - } - }; - MathBackendCPU.prototype.slice = function (x, begin, size) { - var buffer$$1 = buffer(size, x.dtype); - for (var i = 0; i < buffer$$1.size; ++i) { - var loc = buffer$$1.indexToLoc(i); - var xLoc = loc.map(function (idx, j) { return idx + begin[j]; }); - buffer$$1.set.apply(buffer$$1, [x.get.apply(x, xLoc)].concat(loc)); - } - return buffer$$1.toTensor(); - }; - MathBackendCPU.prototype.stridedSlice = function (x, begin, end, strides, beginMask, endMask) { - var _a = getStridedSlicedInfo(x.shape, begin, end, strides, beginMask, endMask), beginIndex = _a[0], size = _a[1]; - if (size.some(function (axis) { return axis === 0; })) { - return tensor([], size); - } - var buffer$$1 = buffer(size, x.dtype); - for (var i = 0; i < buffer$$1.size; i++) { - var loc = buffer$$1.indexToLoc(i); - var newLoc = new Array(loc.length); - for (var j = 0; j < newLoc.length; j++) { - newLoc[j] = loc[j] * strides[j] + beginIndex[j]; - } - buffer$$1.set.apply(buffer$$1, [x.get.apply(x, newLoc)].concat(loc)); - } - return buffer$$1.toTensor(); - }; - MathBackendCPU.prototype.reverse = function (x, axis) { - var buffer$$1 = buffer(x.shape, x.dtype); - var xBuffer = x.buffer(); - var _loop_1 = function (i) { - var outLoc = buffer$$1.indexToLoc(i); - var inLoc = outLoc.slice(); - axis.forEach(function (ax) { return inLoc[ax] = x.shape[ax] - 1 - inLoc[ax]; }); - buffer$$1.set.apply(buffer$$1, [xBuffer.get.apply(xBuffer, inLoc)].concat(outLoc)); - }; - for (var i = 0; i < buffer$$1.size; i++) { - _loop_1(i); - } - return buffer$$1.toTensor(); - }; - MathBackendCPU.prototype.concat = function (a, b) { - var outShape = computeOutShape(a.shape, b.shape, 1); - var buffer$$1 = buffer(outShape, a.dtype); - if (a.shape[0] === 1 && b.shape[0] === 1) { - var aVals = a.dataSync(); - var bVals = b.dataSync(); - var vals = buffer$$1.values; - vals.set(aVals, 0); - vals.set(bVals, a.size); - return buffer$$1.toTensor(); - } - for (var i = 0; i < outShape[0]; ++i) { - for (var j = 0; j < a.shape[1]; ++j) { - buffer$$1.set(a.get(i, j), i, j); - } - for (var j = 0; j < b.shape[1]; ++j) { - buffer$$1.set(b.get(i, j), i, j + a.shape[1]); - } - } - return buffer$$1.toTensor(); - }; - MathBackendCPU.prototype.neg = function (x) { - return this.multiply(scalar(-1), x); - }; - MathBackendCPU.prototype.add = function (a, b) { - return this.broadcastedBinaryOp(a, b, upcastType(a.dtype, b.dtype), function (aValue, bValue) { return aValue + bValue; }); - }; - MathBackendCPU.prototype.subtract = function (a, b) { - return this.broadcastedBinaryOp(a, b, upcastType(a.dtype, b.dtype), function (aValue, bValue) { return aValue - bValue; }); - }; - MathBackendCPU.prototype.pow = function (a, b) { - return this.broadcastedBinaryOp(a, b, a.dtype, function (aValue, bValue) { return Math.pow(aValue, bValue); }); - }; - MathBackendCPU.prototype.matMul = function (a, b, transposeA, transposeB) { - var sharedDim = transposeA ? a.shape[0] : a.shape[1]; - var leftDim = transposeA ? a.shape[1] : a.shape[0]; - var rightDim = transposeB ? b.shape[0] : b.shape[1]; - var aValues = a.dataSync(); - var bValues = b.dataSync(); - var _a = transposeA ? [1, a.strides[0]] : [a.strides[0], 1], aOuterStep = _a[0], aInnerStep = _a[1]; - var _b = transposeB ? [b.strides[0], 1] : [1, b.strides[0]], bOuterStep = _b[0], bInnerStep = _b[1]; - var aOuterEnd = leftDim * aOuterStep; - var bOuterEnd = rightDim * bOuterStep; - var result = new Float32Array(leftDim * rightDim); - var resultIndex = 0; - for (var aOuter = 0; aOuter < aOuterEnd; aOuter += aOuterStep) { - for (var bOuter = 0; bOuter < bOuterEnd; bOuter += bOuterStep) { - var aInner = aOuter; - var bInner = bOuter; - var sum$$1 = 0; - for (var k = 0; k < sharedDim; ++k) { - sum$$1 += aValues[aInner] * bValues[bInner]; - aInner += aInnerStep; - bInner += bInnerStep; - } - result[resultIndex++] = sum$$1; - } - } - return tensor2d(result, [leftDim, rightDim]); - }; - MathBackendCPU.prototype.multiply = function (a, b) { - return this.broadcastedBinaryOp(a, b, upcastType(a.dtype, b.dtype), function (aValue, bValue) { return aValue * bValue; }); - }; - MathBackendCPU.prototype.divide = function (a, b) { - var op; - var outputDtype; - if (a.dtype === 'int32' && b.dtype === 'int32') { - outputDtype = 'int32'; - op = function (a, b) { return Math.floor(a / b); }; - } - else { - outputDtype = 'float32'; - op = function (a, b) { return a / b; }; - } - return this.broadcastedBinaryOp(a, b, outputDtype, op); - }; - MathBackendCPU.prototype.sum = function (x, axes) { - assertAxesAreInnerMostDims('sum', axes, x.rank); - var _a = computeOutAndReduceShapes(x.shape, axes), outShape = _a[0], reduceShape = _a[1]; - var resultDtype = upcastType(x.dtype, 'int32'); - var result = zeros(outShape, resultDtype); - var reduceSize = sizeFromShape(reduceShape); - var vals = result.dataSync(); - var aVals = x.dataSync(); - for (var i = 0; i < vals.length; ++i) { - var offset = i * reduceSize; - var sum$$1 = 0; - for (var j = 0; j < reduceSize; ++j) { - sum$$1 += aVals[offset + j]; - } - vals[i] = sum$$1; - } - return result; - }; - MathBackendCPU.prototype.argMin = function (x, axis) { - var axes = [axis]; - assertAxesAreInnerMostDims('argMin', axes, x.rank); - var _a = computeOutAndReduceShapes(x.shape, axes), outShape = _a[0], reduceShape = _a[1]; - var result = zeros(outShape, 'int32'); - var reduceSize = sizeFromShape(reduceShape); - var vals = result.dataSync(); - var aVals = x.dataSync(); - for (var i = 0; i < vals.length; ++i) { - var offset = i * reduceSize; - var min$$1 = aVals[offset]; - var minIndex = 0; - for (var j = 0; j < reduceSize; ++j) { - var value = aVals[offset + j]; - if (value < min$$1) { - min$$1 = value; - minIndex = j; - } - } - vals[i] = minIndex; - } - return result; - }; - MathBackendCPU.prototype.argMax = function (x, axis) { - var axes = [axis]; - assertAxesAreInnerMostDims('argMax', axes, x.rank); - var _a = computeOutAndReduceShapes(x.shape, axes), outShape = _a[0], reduceShape = _a[1]; - var result = zeros(outShape, 'int32'); - var reduceSize = sizeFromShape(reduceShape); - var vals = result.dataSync(); - var aVals = x.dataSync(); - for (var i = 0; i < vals.length; ++i) { - var offset = i * reduceSize; - var max$$1 = aVals[offset]; - var maxIndex = 0; - for (var j = 0; j < reduceSize; ++j) { - var value = aVals[offset + j]; - if (value > max$$1) { - max$$1 = value; - maxIndex = j; - } - } - vals[i] = maxIndex; - } - return result; - }; - MathBackendCPU.prototype.cumsum = function (x, axis, exclusive, reverse$$1) { - var resultDtype = upcastType(x.dtype, 'int32'); - var result = zeros(x.shape, resultDtype); - var vals = result.dataSync(); - var aVals = x.dataSync(); - var finalDim = x.shape[x.rank - 1]; - var indexAdjuster = reverse$$1 ? - function (i, j) { return i + finalDim - j - 1; } : - function (i, j) { return i + j; }; - for (var i = 0; i < aVals.length; i += finalDim) { - for (var j = 0; j < finalDim; j++) { - var idx = indexAdjuster(i, j); - if (j === 0) { - vals[idx] = exclusive ? 0 : aVals[idx]; - } - else { - var prevIdx = indexAdjuster(i, j - 1); - vals[idx] = exclusive ? aVals[prevIdx] + vals[prevIdx] : - aVals[idx] + vals[prevIdx]; - } - } - } - return result; - }; - MathBackendCPU.prototype.equal = function (a, b) { - return this.broadcastedBinaryOp(a, b, 'bool', function (aVal, bVal) { - return (aVal === bVal) ? 1 : 0; - }); - }; - MathBackendCPU.prototype.notEqual = function (a, b) { - return this.broadcastedBinaryOp(a, b, 'bool', function (aVal, bVal) { - return (aVal !== bVal) ? 1 : 0; - }); - }; - MathBackendCPU.prototype.less = function (a, b) { - return this.broadcastedBinaryOp(a, b, 'bool', function (aVal, bVal) { - return (aVal < bVal) ? 1 : 0; - }); - }; - MathBackendCPU.prototype.lessEqual = function (a, b) { - return this.broadcastedBinaryOp(a, b, 'bool', function (aVal, bVal) { - return (aVal <= bVal) ? 1 : 0; - }); - }; - MathBackendCPU.prototype.greater = function (a, b) { - return this.broadcastedBinaryOp(a, b, 'bool', function (aVal, bVal) { - return (aVal > bVal) ? 1 : 0; - }); - }; - MathBackendCPU.prototype.greaterEqual = function (a, b) { - return this.broadcastedBinaryOp(a, b, 'bool', function (aVal, bVal) { - return (aVal >= bVal) ? 1 : 0; - }); - }; - MathBackendCPU.prototype.logicalNot = function (x) { - var values = x.dataSync(); - var newValues = new Int32Array(values.length); - for (var i = 0; i < values.length; ++i) { - newValues[i] = values[i] ? 0 : 1; - } - return Tensor.make(x.shape, { values: newValues }, 'bool'); - }; - MathBackendCPU.prototype.logicalAnd = function (a, b) { - return this.broadcastedBinaryOp(a, b, 'bool', function (aVal, bVal) { - return aVal && bVal; - }); - }; - MathBackendCPU.prototype.logicalOr = function (a, b) { - return this.broadcastedBinaryOp(a, b, 'bool', function (aVal, bVal) { - return aVal || bVal; - }); - }; - MathBackendCPU.prototype.where = function (condition, a, b, dtype) { - var values = condition.dataSync(); - var aValues = a.dataSync(); - var bValues = b.dataSync(); - var result = zeros(a.shape, dtype); - var newValues = result.dataSync(); - var index = 0; - var offset = condition.rank === 0 || condition.rank > 1 || a.rank === 1 ? - 1 : - a.shape[1]; - for (var i = 0; i < values.length; i++) { - for (var j = 0; j < offset; j++) { - if (values[i] === 1) { - newValues[index++] = aValues[i]; - } - else { - newValues[index++] = bValues[i]; - } - } - } - return result; - }; - MathBackendCPU.prototype.topKValues = function (x, k) { - return this.topK(x, k).values; - }; - MathBackendCPU.prototype.topKIndices = function (x, k) { - return this.topK(x, k).indices; - }; - MathBackendCPU.prototype.topK = function (x, k) { - var values = x.dataSync(); - var valuesAndIndices = []; - for (var i = 0; i < values.length; i++) { - valuesAndIndices.push({ value: values[i], index: i }); - } - valuesAndIndices.sort(function (a, b) { - return b.value - a.value; - }); - var topkValues = getTypedArrayFromDType(x.dtype, k); - var topkIndices = new Int32Array(k); - for (var i = 0; i < k; i++) { - topkValues[i] = valuesAndIndices[i].value; - topkIndices[i] = valuesAndIndices[i].index; - } - return { - values: tensor1d(topkValues, x.dtype), - indices: tensor1d(topkIndices, 'int32') - }; - }; - MathBackendCPU.prototype.min = function (x, axes) { - assertAxesAreInnerMostDims('min', axes, x.rank); - var _a = computeOutAndReduceShapes(x.shape, axes), outShape = _a[0], reduceShape = _a[1]; - var result = zeros(outShape, x.dtype); - var reduceSize = sizeFromShape(reduceShape); - var vals = result.dataSync(); - var aVals = x.dataSync(); - for (var i = 0; i < vals.length; ++i) { - var offset = i * reduceSize; - var min$$1 = aVals[0]; - for (var j = 0; j < reduceSize; ++j) { - var value = aVals[offset + j]; - if (value < min$$1) { - min$$1 = value; - } - } - vals[i] = min$$1; - } - return result; - }; - MathBackendCPU.prototype.minimum = function (a, b) { - return this.broadcastedBinaryOp(a, b, a.dtype, function (aVal, bVal) { return Math.min(aVal, bVal); }); - }; - MathBackendCPU.prototype.mod = function (a, b) { - return this.broadcastedBinaryOp(a, b, a.dtype, function (aVal, bVal) { - var rem = aVal % bVal; - if ((aVal < 0 && bVal < 0) || (aVal >= 0 && bVal >= 0)) { - return rem; - } - else { - return (rem + bVal) % bVal; - } - }); - }; - MathBackendCPU.prototype.max = function (x, axes) { - assertAxesAreInnerMostDims('max', axes, x.rank); - var _a = computeOutAndReduceShapes(x.shape, axes), outShape = _a[0], reduceShape = _a[1]; - var result = zeros(outShape, x.dtype); - var reduceSize = sizeFromShape(reduceShape); - var vals = result.dataSync(); - var aVals = x.dataSync(); - for (var i = 0; i < vals.length; ++i) { - var offset = i * reduceSize; - var max$$1 = aVals[offset]; - for (var j = 0; j < reduceSize; ++j) { - var value = aVals[offset + j]; - if (value > max$$1) { - max$$1 = value; - } - } - vals[i] = max$$1; - } - return result; - }; - MathBackendCPU.prototype.maximum = function (a, b) { - return this.broadcastedBinaryOp(a, b, a.dtype, function (aVal, bVal) { return Math.max(aVal, bVal); }); - }; - MathBackendCPU.prototype.squaredDifference = function (a, b) { - return this.broadcastedBinaryOp(a, b, a.dtype, function (aVal, bVal) { - var diff = aVal - bVal; - return diff * diff; - }); - }; - MathBackendCPU.prototype.ceil = function (x) { - var values = x.dataSync(); - var newValues = new Float32Array(values.length); - for (var i = 0; i < values.length; ++i) { - newValues[i] = Math.ceil(values[i]); - } - return Tensor.make(x.shape, { values: newValues }); - }; - MathBackendCPU.prototype.floor = function (x) { - var values = x.dataSync(); - var newValues = new Float32Array(values.length); - for (var i = 0; i < values.length; ++i) { - newValues[i] = Math.floor(values[i]); - } - return Tensor.make(x.shape, { values: newValues }); - }; - MathBackendCPU.prototype.sign = function (x) { - var values = x.dataSync(); - var newValues = new Float32Array(values.length); - for (var i = 0; i < values.length; ++i) { - if (values[i] < 0) { - newValues[i] = -1; - } - else if (values[i] > 0) { - newValues[i] = 1; - } - else { - newValues[i] = 0; - } - } - return Tensor.make(x.shape, { values: newValues }); - }; - MathBackendCPU.prototype.round = function (x) { - var values = x.dataSync(); - var newValues = new Float32Array(values.length); - for (var i = 0; i < values.length; ++i) { - var base = Math.floor(values[i]); - if (values[i] - base < 0.5) { - newValues[i] = Math.floor(values[i]); - } - else if (values[i] - base > 0.5) { - newValues[i] = Math.ceil(values[i]); - } - else { - if (base % 2.0 === 0.0) { - newValues[i] = base; - } - else { - newValues[i] = base + 1.0; - } - } - } - return Tensor.make(x.shape, { values: newValues }); - }; - MathBackendCPU.prototype.exp = function (x) { - var values = x.dataSync(); - var newValues = new Float32Array(values.length); - for (var i = 0; i < values.length; ++i) { - newValues[i] = Math.exp(values[i]); - } - return Tensor.make(x.shape, { values: newValues }); - }; - MathBackendCPU.prototype.expm1 = function (x) { - var values = x.dataSync(); - var newValues = new Float32Array(values.length); - for (var i = 0; i < values.length; ++i) { - newValues[i] = Math.expm1(values[i]); - } - return Tensor.make(x.shape, { values: newValues }); - }; - MathBackendCPU.prototype.log = function (x) { - var values = x.dataSync(); - var newValues = new Float32Array(values.length); - for (var i = 0; i < values.length; ++i) { - var value = values[i]; - newValues[i] = Math.log(value); - } - return Tensor.make(x.shape, { values: newValues }); - }; - MathBackendCPU.prototype.log1p = function (x) { - var values = x.dataSync(); - var newValues = new Float32Array(values.length); - for (var i = 0; i < values.length; ++i) { - var value = values[i]; - newValues[i] = Math.log1p(value); - } - return Tensor.make(x.shape, { values: newValues }); - }; - MathBackendCPU.prototype.sqrt = function (x) { - var values = x.dataSync(); - var newValues = new Float32Array(values.length); - for (var i = 0; i < values.length; ++i) { - var value = values[i]; - newValues[i] = Math.sqrt(value); - } - return Tensor.make(x.shape, { values: newValues }); - }; - MathBackendCPU.prototype.rsqrt = function (x) { - var values = x.dataSync(); - var newValues = new Float32Array(values.length); - for (var i = 0; i < values.length; ++i) { - var value = values[i]; - newValues[i] = 1 / Math.sqrt(value); - } - return Tensor.make(x.shape, { values: newValues }); - }; - MathBackendCPU.prototype.square = function (x) { - var values = x.dataSync(); - var newValues = new Float32Array(values.length); - for (var i = 0; i < values.length; ++i) { - var value = values[i]; - newValues[i] = value * value; - } - return Tensor.make(x.shape, { values: newValues }); - }; - MathBackendCPU.prototype.reciprocal = function (x) { - var values = x.dataSync(); - var newValues = new Float32Array(values.length); - for (var i = 0; i < values.length; ++i) { - newValues[i] = 1 / values[i]; - } - return Tensor.make(x.shape, { values: newValues }); - }; - MathBackendCPU.prototype.relu = function (x) { - var res = zeros(x.shape, x.dtype); - var resVals = res.dataSync(); - var inVals = x.dataSync(); - for (var i = 0; i < inVals.length; ++i) { - resVals[i] = Math.max(0, inVals[i]); - } - return res; - }; - MathBackendCPU.prototype.elu = function (x) { - var resultValues = new Float32Array(x.size); - var values = x.dataSync(); - for (var i = 0; i < values.length; ++i) { - var v = values[i]; - if (v >= 0) { - resultValues[i] = v; - } - else { - resultValues[i] = (Math.exp(v) - 1); - } - } - return Tensor.make(x.shape, { values: resultValues }); - }; - MathBackendCPU.prototype.eluDer = function (dy, y) { - var resultValues = new Float32Array(y.size); - var values = y.dataSync(); - var dyValues = dy.dataSync(); - for (var i = 0; i < values.length; ++i) { - var v = values[i]; - if (v >= 1) { - resultValues[i] = dyValues[i]; - } - else { - resultValues[i] = dyValues[i] * (v + 1); - } - } - return Tensor.make(y.shape, { values: resultValues }); - }; - MathBackendCPU.prototype.selu = function (x) { - var scaleAlpha = SELU_SCALEALPHA; - var scale = SELU_SCALE; - var resultValues = new Float32Array(x.size); - var values = x.dataSync(); - for (var i = 0; i < values.length; ++i) { - var v = values[i]; - if (v >= 0) { - resultValues[i] = scale * v; - } - else { - resultValues[i] = scaleAlpha * (Math.exp(v) - 1); - } - } - return Tensor.make(x.shape, { values: resultValues }); - }; - MathBackendCPU.prototype.clip = function (x, min$$1, max$$1) { - var resultValues = new Float32Array(x.size); - var values = x.dataSync(); - for (var i = 0; i < values.length; ++i) { - resultValues[i] = Math.min(max$$1, Math.max(min$$1, values[i])); - } - return Tensor.make(x.shape, { values: resultValues }); - }; - MathBackendCPU.prototype.abs = function (x) { - var resultValues = new Float32Array(x.size); - var values = x.dataSync(); - for (var i = 0; i < values.length; ++i) { - resultValues[i] = Math.abs(values[i]); - } - return Tensor.make(x.shape, { values: resultValues }); - }; - MathBackendCPU.prototype.int = function (x) { - var resultValues = new Int32Array(x.size); - var values = x.dataSync(); - for (var i = 0; i < values.length; ++i) { - resultValues[i] = values[i]; - } - return Tensor.make(x.shape, { values: resultValues }, 'int32'); - }; - MathBackendCPU.prototype.sigmoid = function (x) { - var resultValues = new Float32Array(x.size); - var values = x.dataSync(); - for (var i = 0; i < values.length; ++i) { - resultValues[i] = 1 / (1 + Math.exp(-values[i])); - } - return Tensor.make(x.shape, { values: resultValues }); - }; - MathBackendCPU.prototype.softplus = function (x) { - var epsilon = 1.1920928955078125e-7; - var threshold = Math.log(epsilon) + 2.0; - var resultValues = new Float32Array(x.size); - var values = x.dataSync(); - for (var i = 0; i < values.length; ++i) { - var tooLarge = values[i] > -threshold; - var tooSmall = values[i] < threshold; - var expX = Math.exp(values[i]); - var result = void 0; - if (tooSmall) { - result = expX; - } - else if (tooLarge) { - result = values[i]; - } - else { - result = Math.log(1.0 + expX); - } - resultValues[i] = result; - } - return Tensor.make(x.shape, { values: resultValues }); - }; - MathBackendCPU.prototype.sin = function (x) { - var resultValues = new Float32Array(x.size); - var values = x.dataSync(); - for (var i = 0; i < values.length; ++i) { - resultValues[i] = Math.sin(values[i]); - } - return Tensor.make(x.shape, { values: resultValues }); - }; - MathBackendCPU.prototype.cos = function (x) { - var resultValues = new Float32Array(x.size); - var values = x.dataSync(); - for (var i = 0; i < values.length; ++i) { - resultValues[i] = Math.cos(values[i]); - } - return Tensor.make(x.shape, { values: resultValues }); - }; - MathBackendCPU.prototype.tan = function (x) { - var resultValues = new Float32Array(x.size); - var values = x.dataSync(); - for (var i = 0; i < values.length; ++i) { - resultValues[i] = Math.tan(values[i]); - } - return Tensor.make(x.shape, { values: resultValues }); - }; - MathBackendCPU.prototype.asin = function (x) { - var resultValues = new Float32Array(x.size); - var values = x.dataSync(); - for (var i = 0; i < values.length; ++i) { - resultValues[i] = Math.asin(values[i]); - } - return Tensor.make(x.shape, { values: resultValues }); - }; - MathBackendCPU.prototype.acos = function (x) { - var resultValues = new Float32Array(x.size); - var values = x.dataSync(); - for (var i = 0; i < values.length; ++i) { - resultValues[i] = Math.acos(values[i]); - } - return Tensor.make(x.shape, { values: resultValues }); - }; - MathBackendCPU.prototype.atan = function (x) { - var resultValues = new Float32Array(x.size); - var values = x.dataSync(); - for (var i = 0; i < values.length; ++i) { - resultValues[i] = Math.atan(values[i]); - } - return Tensor.make(x.shape, { values: resultValues }); - }; - MathBackendCPU.prototype.atan2 = function (a, b) { - return this.broadcastedBinaryOp(a, b, a.dtype, function (aValue, bValue) { return Math.atan2(aValue, bValue); }); - }; - MathBackendCPU.prototype.sinh = function (x) { - var resultValues = new Float32Array(x.size); - var values = x.dataSync(); - for (var i = 0; i < values.length; ++i) { - resultValues[i] = Math.sinh(values[i]); - } - return Tensor.make(x.shape, { values: resultValues }); - }; - MathBackendCPU.prototype.cosh = function (x) { - var resultValues = new Float32Array(x.size); - var values = x.dataSync(); - for (var i = 0; i < values.length; ++i) { - resultValues[i] = Math.cosh(values[i]); - } - return Tensor.make(x.shape, { values: resultValues }); - }; - MathBackendCPU.prototype.tanh = function (x) { - var resultValues = new Float32Array(x.size); - var values = x.dataSync(); - for (var i = 0; i < values.length; ++i) { - resultValues[i] = tanh(values[i]); - } - return Tensor.make(x.shape, { values: resultValues }); - }; - MathBackendCPU.prototype.asinh = function (x) { - var resultValues = new Float32Array(x.size); - var values = x.dataSync(); - for (var i = 0; i < values.length; ++i) { - resultValues[i] = Math.asinh(values[i]); - } - return Tensor.make(x.shape, { values: resultValues }); - }; - MathBackendCPU.prototype.acosh = function (x) { - var resultValues = new Float32Array(x.size); - var values = x.dataSync(); - for (var i = 0; i < values.length; ++i) { - resultValues[i] = Math.acosh(values[i]); - } - return Tensor.make(x.shape, { values: resultValues }); - }; - MathBackendCPU.prototype.atanh = function (x) { - var resultValues = new Float32Array(x.size); - var values = x.dataSync(); - for (var i = 0; i < values.length; ++i) { - resultValues[i] = Math.atanh(values[i]); - } - return Tensor.make(x.shape, { values: resultValues }); - }; - MathBackendCPU.prototype.erf = function (x) { - var resultValues = new Float32Array(x.size); - var values = x.dataSync(); - var p = ERF_P; - var a1 = ERF_A1; - var a2 = ERF_A2; - var a3 = ERF_A3; - var a4 = ERF_A4; - var a5 = ERF_A5; - for (var i = 0; i < values.length; ++i) { - var v = values[i]; - var t = 1.0 / (1.0 + p * v); - resultValues[i] = 1.0 - - (((((a5 * t + a4) * t) + a3) * t + a2) * t + a1) * t * - Math.exp(-v * v); - } - return Tensor.make(x.shape, { values: resultValues }); - }; - MathBackendCPU.prototype.step = function (x, alpha) { - if (alpha === void 0) { alpha = 0; } - var resultValues = new Float32Array(x.size); - var values = x.dataSync(); - for (var i = 0; i < values.length; ++i) { - var value = values[i]; - if (isNaN(value)) { - resultValues[i] = NaN; - } - else { - resultValues[i] = value > 0 ? 1 : alpha; - } - } - return Tensor.make(x.shape, { values: resultValues }); - }; - MathBackendCPU.prototype.conv2d = function (x, filter, convInfo) { - var filterHeight = convInfo.filterHeight; - var filterWidth = convInfo.filterWidth; - var dilationHeight = convInfo.dilationHeight; - var dilationWidth = convInfo.dilationWidth; - var padLeft = convInfo.padInfo.left; - var padTop = convInfo.padInfo.top; - var y = buffer(convInfo.outShape, x.dtype); - for (var b = 0; b < convInfo.batchSize; ++b) { - for (var d2 = 0; d2 < convInfo.outChannels; ++d2) { - for (var yR = 0; yR < convInfo.outHeight; ++yR) { - var xRCorner = yR * convInfo.strideHeight - padLeft; - for (var yC = 0; yC < convInfo.outWidth; ++yC) { - var xCCorner = yC * convInfo.strideWidth - padTop; - var dotProd = 0; - for (var wR = 0; wR < filterHeight; wR++) { - var xR = xRCorner + wR * dilationHeight; - if (xR < 0 || xR >= convInfo.inHeight) { - continue; - } - for (var wC = 0; wC < filterWidth; wC++) { - var xC = xCCorner + wC * dilationWidth; - if (xC < 0 || xC >= convInfo.inWidth) { - continue; - } - for (var d1 = 0; d1 < convInfo.inChannels; ++d1) { - var pixel = x.get(b, xR, xC, d1); - var weight = filter.get(wR, wC, d1, d2); - dotProd += pixel * weight; - } - } - } - y.set(dotProd, b, yR, yC, d2); - } - } - } - } - return y.toTensor(); - }; - MathBackendCPU.prototype.conv2dDerInput = function (dy, filter, convInfo) { - var dx = buffer(convInfo.inShape, 'float32'); - var dxValues = dx.values; - var _a = dx.strides, dxS0 = _a[0], dxS1 = _a[1], dxS2 = _a[2]; - var dyValues = dy.dataSync(); - var _b = dy.strides, dyS0 = _b[0], dyS1 = _b[1], dyS2 = _b[2]; - var fltValues = filter.dataSync(); - var _c = filter.strides, fltS0 = _c[0], fltS1 = _c[1], fltS2 = _c[2]; - var batchSize = convInfo.batchSize, filterHeight = convInfo.filterHeight, filterWidth = convInfo.filterWidth, inChannels = convInfo.inChannels, inHeight = convInfo.inHeight, inWidth = convInfo.inWidth, outChannels = convInfo.outChannels, outHeight = convInfo.outHeight, outWidth = convInfo.outWidth, strideHeight = convInfo.strideHeight, strideWidth = convInfo.strideWidth; - var topPad = filterHeight - 1 - convInfo.padInfo.top; - var leftPad = filterWidth - 1 - convInfo.padInfo.left; - for (var b = 0; b < batchSize; ++b) { - for (var d1 = 0; d1 < inChannels; ++d1) { - for (var xR = 0; xR < inHeight; ++xR) { - var xRCorner = xR - topPad; - var xRMin = Math.max(0, Math.ceil(xRCorner / strideHeight)); - var yRMax = Math.min(outHeight, (filterHeight + xRCorner) / strideHeight); - for (var xC = 0; xC < inWidth; ++xC) { - var xCCorner = xC - leftPad; - var xCMin = Math.max(0, Math.ceil(xCCorner / strideWidth)); - var yCMax = Math.min(outWidth, (filterWidth + xCCorner) / strideWidth); - var dotProd = 0; - for (var yR = xRMin; yR < yRMax; ++yR) { - var wR = yR * strideHeight - xRCorner; - for (var yC = xCMin; yC < yCMax; ++yC) { - var wC = yC * strideWidth - xCCorner; - var dyOffset = dyS0 * b + dyS1 * yR + dyS2 * yC; - var fltOffset = fltS0 * (filterHeight - 1 - wR) + - fltS1 * (filterWidth - 1 - wC) + fltS2 * d1; - for (var d2 = 0; d2 < outChannels; ++d2) { - var pixel = dyValues[dyOffset + d2]; - var weight = fltValues[fltOffset + d2]; - dotProd += pixel * weight; - } - } - } - dxValues[dxS0 * b + dxS1 * xR + dxS2 * xC + d1] = dotProd; - } - } - } - } - return dx.toTensor(); - }; - MathBackendCPU.prototype.conv2dDerFilter = function (x, dy, convInfo) { - var strideHeight = convInfo.strideHeight; - var strideWidth = convInfo.strideWidth; - var filterHeight = convInfo.filterHeight; - var filterWidth = convInfo.filterWidth; - var dW = buffer(convInfo.filterShape, 'float32'); - var leftPad = convInfo.padInfo.left; - var topPad = convInfo.padInfo.top; - for (var wR = 0; wR < filterHeight; ++wR) { - var yRMin = Math.max(0, Math.ceil((topPad - wR) / strideHeight)); - var yRMax = Math.min(convInfo.outHeight, (convInfo.inHeight + topPad - wR) / strideHeight); - for (var wC = 0; wC < filterWidth; ++wC) { - var yCMin = Math.max(0, Math.ceil((leftPad - wC) / strideWidth)); - var yCMax = Math.min(convInfo.outWidth, (convInfo.inWidth + leftPad - wC) / strideWidth); - for (var d1 = 0; d1 < convInfo.inChannels; ++d1) { - for (var d2 = 0; d2 < convInfo.outChannels; ++d2) { - var dotProd = 0; - for (var b = 0; b < convInfo.batchSize; ++b) { - for (var yR = yRMin; yR < yRMax; ++yR) { - var xR = wR + yR * strideHeight - topPad; - for (var yC = yCMin; yC < yCMax; ++yC) { - var xC = wC + yC * strideWidth - leftPad; - dotProd += x.get(b, xR, xC, d1) * dy.get(b, yR, yC, d2); - } - } - } - dW.set(dotProd, wR, wC, d1, d2); - } - } - } - } - return dW.toTensor(); - }; - MathBackendCPU.prototype.depthwiseConv2D = function (x, filter, convInfo) { - var filterHeight = convInfo.filterHeight; - var filterWidth = convInfo.filterWidth; - var dilationHeight = convInfo.dilationHeight; - var dilationWidth = convInfo.dilationWidth; - var padLeft = convInfo.padInfo.left; - var padTop = convInfo.padInfo.top; - var chMul = convInfo.outChannels / convInfo.inChannels; - var y = buffer(convInfo.outShape, x.dtype); - for (var b = 0; b < convInfo.batchSize; ++b) { - for (var d1 = 0; d1 < convInfo.inChannels; ++d1) { - for (var yR = 0; yR < convInfo.outHeight; ++yR) { - var xRCorner = yR * convInfo.strideHeight - padLeft; - for (var yC = 0; yC < convInfo.outWidth; ++yC) { - var xCCorner = yC * convInfo.strideWidth - padTop; - for (var q = 0; q < chMul; ++q) { - var dotProd = 0; - for (var wR = 0; wR < filterHeight; ++wR) { - var xR = xRCorner + wR * dilationHeight; - if (xR < 0 || xR >= convInfo.inHeight) { - continue; - } - for (var wC = 0; wC < filterWidth; ++wC) { - var xC = xCCorner + wC * dilationWidth; - if (xC < 0 || xC >= convInfo.inWidth) { - continue; - } - var pixel = x.get(b, xR, xC, d1); - var weight = filter.get(wR, wC, d1, q); - dotProd += pixel * weight; - } - } - y.set(dotProd, b, yR, yC, d1 * chMul + q); - } - } - } - } - } - return y.toTensor(); - }; - MathBackendCPU.prototype.tile = function (x, reps) { - var newShape = new Array(x.rank); - for (var i = 0; i < newShape.length; i++) { - newShape[i] = x.shape[i] * reps[i]; - } - var result = buffer(newShape, x.dtype); - var xBuf = x.buffer(); - for (var i = 0; i < result.values.length; ++i) { - var newLoc = result.indexToLoc(i); - var originalLoc = new Array(x.rank); - for (var i_1 = 0; i_1 < originalLoc.length; i_1++) { - originalLoc[i_1] = newLoc[i_1] % x.shape[i_1]; - } - var originalIndex = xBuf.locToIndex(originalLoc); - result.values[i] = xBuf.values[originalIndex]; - } - return result.toTensor(); - }; - MathBackendCPU.prototype.pad = function (x, paddings, constantValue) { - var outShape = paddings.map(function (p, i) { return p[0] + x.shape[i] + p[1]; }); - var start = paddings.map(function (p) { return p[0]; }); - var xBuffer = x.buffer(); - var buffer$$1 = buffer(outShape, x.dtype); - if (constantValue !== 0) { - buffer$$1.values.fill(constantValue); - } - for (var i = 0; i < x.size; i++) { - var coords = xBuffer.indexToLoc(i); - var outCoords = coords.map(function (c, i) { return c + start[i]; }); - buffer$$1.set.apply(buffer$$1, [x.get.apply(x, coords)].concat(outCoords)); - } - return buffer$$1.toTensor(); - }; - MathBackendCPU.prototype.transpose = function (x, perm) { - var newShape = new Array(x.rank); - for (var i = 0; i < newShape.length; i++) { - newShape[i] = x.shape[perm[i]]; - } - var values = x.dataSync(); - var result = buffer(newShape, x.dtype); - var xBuf = x.buffer(); - for (var i = 0; i < x.size; ++i) { - var loc = xBuf.indexToLoc(i); - var newLoc = new Array(loc.length); - for (var i_2 = 0; i_2 < newLoc.length; i_2++) { - newLoc[i_2] = loc[perm[i_2]]; - } - var newIndex = result.locToIndex(newLoc); - result.values[newIndex] = values[i]; - } - return result.toTensor(); - }; - MathBackendCPU.prototype.gather = function (x, indices, axis) { - var newShape = x.shape.slice(); - var indicesValues = indices.dataSync(); - newShape[axis] = indicesValues.length; - var result = buffer(newShape, x.dtype); - var xBuf = x.buffer(); - for (var i = 0; i < result.size; ++i) { - var newLoc = result.indexToLoc(i); - var originalLoc = newLoc.slice(); - originalLoc[axis] = indicesValues[newLoc[axis]]; - var originalIndex = xBuf.locToIndex(originalLoc); - result.values[i] = xBuf.values[originalIndex]; - } - return result.toTensor(); - }; - MathBackendCPU.prototype.pool = function (x, convInfo, poolType) { - var strideHeight = convInfo.strideHeight; - var strideWidth = convInfo.strideWidth; - var filterHeight = convInfo.filterHeight; - var filterWidth = convInfo.filterWidth; - var y = buffer(convInfo.outShape, 'float32'); - var padTop = convInfo.padInfo.top; - var padLeft = convInfo.padInfo.left; - for (var b = 0; b < convInfo.batchSize; ++b) { - for (var d = 0; d < convInfo.inChannels; ++d) { - for (var yR = 0; yR < convInfo.outHeight; ++yR) { - var xRCorner = yR * strideHeight - padTop; - var xRMin = Math.max(0, xRCorner); - var xRMax = Math.min(convInfo.inHeight, filterHeight + xRCorner); - for (var yC = 0; yC < convInfo.outWidth; ++yC) { - var xCCorner = yC * strideWidth - padLeft; - var xCMin = Math.max(0, xCCorner); - var xCMax = Math.min(convInfo.inWidth, filterWidth + xCCorner); - var minMaxValue = (poolType === 'max' ? Number.NEGATIVE_INFINITY : - Number.POSITIVE_INFINITY); - var avgValue = 0; - var count = 0; - for (var xR = xRMin; xR < xRMax; ++xR) { - for (var xC = xCMin; xC < xCMax; ++xC) { - var pixel = x.get(b, xR, xC, d); - if ((poolType === 'max' && pixel > minMaxValue)) { - minMaxValue = pixel; - } - else if (poolType === 'avg') { - avgValue += pixel; - count++; - } - } - if (isNaN(minMaxValue)) { - break; - } - } - y.set(poolType === 'avg' ? avgValue / count : minMaxValue, b, yR, yC, d); - } - } - } - } - return y.toTensor(); - }; - MathBackendCPU.prototype.maxPool = function (x, convInfo) { - return this.pool(x, convInfo, 'max'); - }; - MathBackendCPU.prototype.maxPoolPositions = function (x, convInfo) { - var maxPositions = buffer(convInfo.outShape, 'int32'); - var strideHeight = convInfo.strideHeight; - var strideWidth = convInfo.strideWidth; - var filterHeight = convInfo.filterHeight; - var filterWidth = convInfo.filterWidth; - var padTop = convInfo.padInfo.top; - var padLeft = convInfo.padInfo.left; - for (var b = 0; b < convInfo.batchSize; ++b) { - for (var d = 0; d < convInfo.inChannels; ++d) { - for (var yR = 0; yR < convInfo.outHeight; ++yR) { - var xRCorner = yR * strideHeight - padTop; - var xRMin = Math.max(0, xRCorner); - var xRMax = Math.min(convInfo.inHeight, filterHeight + xRCorner); - for (var yC = 0; yC < convInfo.outWidth; ++yC) { - var xCCorner = yC * strideWidth - padLeft; - var xCMin = Math.max(0, xCCorner); - var xCMax = Math.min(convInfo.inWidth, filterWidth + xCCorner); - var maxValue = Number.NEGATIVE_INFINITY; - var maxPosition = -1; - for (var xR = xRMin; xR < xRMax; ++xR) { - var wR = xR - xRCorner; - for (var xC = xCMin; xC < xCMax; ++xC) { - var wC = xC - xCCorner; - var pixel = x.get(b, xR, xC, d); - if (pixel > maxValue) { - maxValue = pixel; - maxPosition = wR * filterWidth + wC; - } - } - } - maxPositions.set(maxPosition, b, yR, yC, d); - } - } - } - } - return maxPositions.toTensor(); - }; - MathBackendCPU.prototype.maxPoolBackprop = function (dy, x, y, convInfo) { - var maxPositions = this.maxPoolPositions(x, convInfo); - var strideHeight = convInfo.strideHeight; - var strideWidth = convInfo.strideWidth; - var filterHeight = convInfo.filterHeight; - var filterWidth = convInfo.filterWidth; - var padLeft = filterWidth - 1 - convInfo.padInfo.left; - var padTop = filterHeight - 1 - convInfo.padInfo.top; - var dx = buffer(x.shape, 'float32'); - for (var b = 0; b < convInfo.batchSize; ++b) { - for (var d = 0; d < convInfo.inChannels; ++d) { - for (var dxR = 0; dxR < convInfo.inHeight; ++dxR) { - for (var dxC = 0; dxC < convInfo.inWidth; ++dxC) { - var dyRCorner = dxR - padTop; - var dyCCorner = dxC - padLeft; - var dotProd = 0; - for (var wR = 0; wR < filterHeight; ++wR) { - var dyR = (dyRCorner + wR) / strideHeight; - if (dyR < 0 || dyR >= convInfo.outHeight || - Math.floor(dyR) !== dyR) { - continue; - } - for (var wC = 0; wC < filterWidth; ++wC) { - var dyC = (dyCCorner + wC) / strideWidth; - if (dyC < 0 || dyC >= convInfo.outWidth || - Math.floor(dyC) !== dyC) { - continue; - } - var maxPos = filterHeight * filterWidth - 1 - - maxPositions.get(b, dyR, dyC, d); - var curPos = wR * filterWidth + wC; - var mask = maxPos === curPos ? 1 : 0; - if (mask === 0) { - continue; - } - var pixel = dy.get(b, dyR, dyC, d); - dotProd += pixel * mask; - } - } - dx.set(dotProd, b, dxR, dxC, d); - } - } - } - } - return dx.toTensor(); - }; - MathBackendCPU.prototype.avgPoolBackprop = function (dy, x, convInfo) { - var strideHeight = convInfo.strideHeight; - var strideWidth = convInfo.strideWidth; - var filterHeight = convInfo.filterHeight; - var filterWidth = convInfo.filterWidth; - var padLeft = filterWidth - 1 - convInfo.padInfo.left; - var padTop = filterHeight - 1 - convInfo.padInfo.top; - var dx = buffer(x.shape, 'float32'); - var avgMultiplier = 1 / (filterHeight * filterWidth); - for (var b = 0; b < convInfo.batchSize; ++b) { - for (var d = 0; d < convInfo.inChannels; ++d) { - for (var dxR = 0; dxR < convInfo.inHeight; ++dxR) { - for (var dxC = 0; dxC < convInfo.inWidth; ++dxC) { - var dyRCorner = dxR - padTop; - var dyCCorner = dxC - padLeft; - var dotProd = 0; - for (var wR = 0; wR < filterHeight; ++wR) { - var dyR = (dyRCorner + wR) / strideHeight; - if (dyR < 0 || dyR >= convInfo.outHeight || - Math.floor(dyR) !== dyR) { - continue; - } - for (var wC = 0; wC < filterWidth; ++wC) { - var dyC = (dyCCorner + wC) / strideWidth; - if (dyC < 0 || dyC >= convInfo.outWidth || - Math.floor(dyC) !== dyC) { - continue; - } - var pixel = dy.get(b, dyR, dyC, d); - dotProd += pixel; - } - } - dx.set(dotProd * avgMultiplier, b, dxR, dxC, d); - } - } - } - } - return dx.toTensor(); - }; - MathBackendCPU.prototype.cast = function (x, dtype) { - return castTensor(x, dtype, this); - }; - MathBackendCPU.prototype.reshape = function (x, shape) { - return reshapeTensor(x, shape); - }; - MathBackendCPU.prototype.avgPool = function (x, convInfo) { - return this.pool(x, convInfo, 'avg').toFloat(); - }; - MathBackendCPU.prototype.resizeBilinear = function (x, newHeight, newWidth, alignCorners) { - var _a = x.shape, batch = _a[0], oldHeight = _a[1], oldWidth = _a[2], numChannels = _a[3]; - var output = buffer([batch, newHeight, newWidth, numChannels], x.dtype); - var effectiveInputSize = [ - (alignCorners && newHeight > 1) ? oldHeight - 1 : oldHeight, - (alignCorners && newWidth > 1) ? oldWidth - 1 : oldWidth - ]; - var effectiveOutputSize = [ - (alignCorners && newHeight > 1) ? newHeight - 1 : newHeight, - (alignCorners && newWidth > 1) ? newWidth - 1 : newWidth - ]; - for (var b = 0; b < batch; b++) { - for (var r = 0; r < newHeight; r++) { - for (var c = 0; c < newWidth; c++) { - for (var d = 0; d < numChannels; d++) { - var sourceFracRow = (effectiveInputSize[0]) * r / (effectiveOutputSize[0]); - var sourceFracCol = (effectiveInputSize[1]) * c / (effectiveOutputSize[1]); - var sourceRowFloor = Math.floor(sourceFracRow); - var sourceRowCeil = Math.min(oldHeight - 1, Math.ceil(sourceFracRow)); - var sourceColFloor = Math.floor(sourceFracCol); - var sourceColCeil = Math.min(oldWidth - 1, Math.ceil(sourceFracCol)); - var topLeft = x.get(b, sourceRowFloor, sourceColFloor, d); - var bottomLeft = x.get(b, sourceRowCeil, sourceColFloor, d); - var topRight = x.get(b, sourceRowFloor, sourceColCeil, d); - var bottomRight = x.get(b, sourceRowCeil, sourceColCeil, d); - var rowFrac = sourceFracRow - sourceRowFloor; - var colFrac = sourceFracCol - sourceColFloor; - var top_1 = topLeft + (topRight - topLeft) * colFrac; - var bottom = bottomLeft + (bottomRight - bottomLeft) * colFrac; - var newValue = top_1 + (bottom - top_1) * rowFrac; - output.set(newValue, b, r, c, d); - } - } - } - } - return output.toTensor(); - }; - MathBackendCPU.prototype.resizeBilinearBackprop = function (dy, x, alignCorners) { - var _a = x.shape, batch = _a[0], xHeight = _a[1], xWidth = _a[2], depth = _a[3]; - var _b = dy.shape, yHeight = _b[1], yWidth = _b[2]; - var output = buffer([batch, xHeight, xWidth, depth], x.dtype); - var effectiveXSize = [ - (alignCorners && yHeight > 1) ? xHeight - 1 : xHeight, - (alignCorners && yWidth > 1) ? xWidth - 1 : xWidth - ]; - var effectiveYSize = [ - (alignCorners && yHeight > 1) ? yHeight - 1 : yHeight, - (alignCorners && yWidth > 1) ? yWidth - 1 : yWidth - ]; - var heightScale = effectiveXSize[0] / effectiveYSize[0]; - var widthScale = effectiveXSize[1] / effectiveYSize[1]; - for (var b = 0; b < batch; b++) { - for (var r = 0; r < yHeight; r++) { - var dxR = r * heightScale; - var topDxRIndex = Math.floor(dxR); - var bottomDxRIndex = Math.min(Math.ceil(dxR), xHeight - 1); - var dxRLerp = dxR - topDxRIndex; - var inverseDxRLerp = 1.0 - dxRLerp; - for (var c = 0; c < yWidth; c++) { - var dxC = c * widthScale; - var leftDxCIndex = Math.floor(dxC); - var rightDxCIndex = Math.min(Math.ceil(dxC), xWidth - 1); - var dxCLerp = dxC - leftDxCIndex; - var inverseDxCLerp = 1.0 - dxCLerp; - for (var d = 0; d < depth; d++) { - var dyVal = dy.get(b, r, c, d); - var topLeft = output.get(b, topDxRIndex, leftDxCIndex, d); - topLeft += dyVal * inverseDxRLerp * inverseDxCLerp; - output.set(topLeft, b, topDxRIndex, leftDxCIndex, d); - var topRight = output.get(b, topDxRIndex, rightDxCIndex, d); - topRight += dyVal * inverseDxRLerp * dxCLerp; - output.set(topRight, b, topDxRIndex, rightDxCIndex, d); - var bottomLeft = output.get(b, bottomDxRIndex, leftDxCIndex, d); - bottomLeft += dyVal * dxRLerp * inverseDxCLerp; - output.set(bottomLeft, b, bottomDxRIndex, leftDxCIndex, d); - var bottomRight = output.get(b, bottomDxRIndex, rightDxCIndex, d); - bottomRight += dyVal * dxRLerp * dxCLerp; - output.set(bottomRight, b, bottomDxRIndex, rightDxCIndex, d); - } - } - } - } - return output.toTensor(); - }; - MathBackendCPU.prototype.resizeNearestNeighbor = function (x, newHeight, newWidth, alignCorners) { - var _a = x.shape, batch = _a[0], oldHeight = _a[1], oldWidth = _a[2], numChannels = _a[3]; - var output = buffer([batch, newHeight, newWidth, numChannels], x.dtype); - var effectiveInputSize = alignCorners ? [oldHeight - 1, oldWidth - 1] : [oldHeight, oldWidth]; - var effectiveOutputSize = alignCorners ? [newHeight - 1, newWidth - 1] : [newHeight, newWidth]; - for (var b = 0; b < batch; b++) { - for (var r = 0; r < newHeight; r++) { - for (var c = 0; c < newWidth; c++) { - for (var d = 0; d < numChannels; d++) { - var sourceFracRow = (effectiveInputSize[0]) * r / (effectiveOutputSize[0]); - var sourceFracCol = (effectiveInputSize[1]) * c / (effectiveOutputSize[1]); - var sourceNearestRow = Math.min(oldHeight - 1, alignCorners ? Math.round(sourceFracRow) : - Math.floor(sourceFracRow)); - var sourceNearestCol = Math.min(oldWidth - 1, alignCorners ? Math.round(sourceFracCol) : - Math.floor(sourceFracCol)); - var newValue = x.get(b, sourceNearestRow, sourceNearestCol, d); - output.set(newValue, b, r, c, d); - } - } - } - } - return output.toTensor(); - }; - MathBackendCPU.prototype.batchNormalization = function (x, mean$$1, variance, varianceEpsilon, scale, offset) { - var xValues = x.dataSync(); - var meanValues = mean$$1.dataSync(); - var varianceValues = variance.dataSync(); - var scaleValues = scale ? scale.dataSync() : new Float32Array([1]); - var offsetValues = offset ? offset.dataSync() : new Float32Array([0]); - var outValues = new Float32Array(xValues.length); - for (var i = 0; i < xValues.length; i++) { - outValues[i] = offsetValues[i % offsetValues.length] + - (xValues[i] - meanValues[i % meanValues.length]) * - scaleValues[i % scaleValues.length] / - Math.sqrt(varianceValues[i % varianceValues.length] + varianceEpsilon); - } - return tensor4d(outValues, x.shape); - }; - MathBackendCPU.prototype.localResponseNormalization4D = function (x, radius, bias, alpha, beta) { - var output = buffer(x.shape, 'float32'); - var rad = radius; - var maxD = output.shape[3] - 1; - function sumAcrossChannels(b, r, c, d) { - var sum$$1 = 0.0; - for (var j = Math.max(0, d - rad); j <= Math.min(d + rad, maxD); j++) { - var z = x.get(b, r, c, j); - sum$$1 += z * z; - } - return sum$$1; - } - for (var b = 0; b < output.shape[0]; b++) { - for (var r = 0; r <= output.shape[1]; r++) { - for (var c = 0; c < output.shape[2]; c++) { - for (var d = 0; d < output.shape[3]; d++) { - var sum$$1 = sumAcrossChannels(b, r, c, d); - var val = x.get(b, r, c, d) * Math.pow(bias + alpha * sum$$1, -beta); - output.set(val, b, r, c, d); - } - } - } - } - return output.toTensor(); - }; - MathBackendCPU.prototype.multinomial = function (logits, normalized, numSamples, seed) { - var probabilities = normalized ? logits : softmax(logits); - var batchSize = probabilities.shape[0]; - var numEvents = probabilities.shape[1]; - var res = zeros([batchSize, numSamples], 'int32'); - var resVals = res.dataSync(); - var probVals = probabilities.dataSync(); - for (var b = 0; b < batchSize; ++b) { - var offset = b * numEvents; - var cdf = new Float32Array(numEvents - 1); - cdf[0] = probVals[offset]; - for (var event_1 = 1; event_1 < cdf.length; ++event_1) { - cdf[event_1] = cdf[event_1 - 1] + probVals[offset + event_1]; - } - var random = undefined(seed.toString()); - var outOffset = b * numSamples; - for (var sampleId = 0; sampleId < numSamples; ++sampleId) { - var r = random(); - resVals[outOffset + sampleId] = cdf.length; - for (var event_2 = 0; event_2 < cdf.length; event_2++) { - if (r < cdf[event_2]) { - resVals[outOffset + sampleId] = event_2; - break; - } - } - } - } - return res; - }; - MathBackendCPU.prototype.oneHot = function (indices, depth, onValue, offValue) { - var res = new Float32Array(indices.size * depth); - res.fill(offValue); - for (var event_3 = 0; event_3 < indices.size; ++event_3) { - res[event_3 * depth + indices.get(event_3)] = onValue; - } - return tensor2d(res, [indices.size, depth]); - }; - MathBackendCPU.prototype.broadcastedBinaryOp = function (a, b, dtype, op) { - var newShape = assertAndGetBroadcastShape(a.shape, b.shape); - var result = buffer(newShape, dtype); - var aValues = a.dataSync(); - var bValues = b.dataSync(); - var aBroadcastDims = getBroadcastDims(a.shape, newShape); - var bBroadcastDims = getBroadcastDims(b.shape, newShape); - var aBuf = a.buffer(); - var bBuf = b.buffer(); - var _loop_2 = function (i) { - var loc = result.indexToLoc(i); - var aLoc = loc.slice(-a.rank); - aBroadcastDims.forEach(function (d) { return aLoc[d] = 0; }); - var aIndex = aBuf.locToIndex(aLoc); - var bLoc = loc.slice(-b.rank); - bBroadcastDims.forEach(function (d) { return bLoc[d] = 0; }); - var bIndex = bBuf.locToIndex(bLoc); - result.values[i] = op(aValues[aIndex], bValues[bIndex]); - }; - for (var i = 0; i < result.values.length; ++i) { - _loop_2(i); - } - return result.toTensor(); - }; - MathBackendCPU.prototype.dispose = function () { }; - return MathBackendCPU; - }()); - ENV.registerBackend('cpu', function () { return new MathBackendCPU(); }, 1); - - var __decorate$r = (undefined && undefined.__decorate) || function (decorators, target, key, desc) { - var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; - if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); - else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; - return c > 3 && r && Object.defineProperty(target, key, r), r; - }; - var BrowserUtil = (function () { - function BrowserUtil() { - } - BrowserUtil.nextFrame = function () { - return new Promise(function (resolve) { return requestAnimationFrame(function () { return resolve(); }); }); - }; - __decorate$r([ - doc({ heading: 'Performance', subheading: 'Timing' }) - ], BrowserUtil, "nextFrame", null); - return BrowserUtil; - }()); - - var DTYPE_VALUE_SIZE_MAP = { - 'float32': 4, - 'int32': 4, - 'uint16': 2, - 'uint8': 1, - 'bool': 1, - }; - - var __awaiter$7 = (undefined && undefined.__awaiter) || function (thisArg, _arguments, P, generator) { - return new (P || (P = Promise))(function (resolve, reject) { - function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } - function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } - function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); } - step((generator = generator.apply(thisArg, _arguments || [])).next()); - }); - }; - var __generator$7 = (undefined && undefined.__generator) || function (thisArg, body) { - var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g; - return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g; - function verb(n) { return function (v) { return step([n, v]); }; } - function step(op) { - if (f) throw new TypeError("Generator is already executing."); - while (_) try { - if (f = 1, y && (t = y[op[0] & 2 ? "return" : op[0] ? "throw" : "next"]) && !(t = t.call(y, op[1])).done) return t; - if (y = 0, t) op = [0, t.value]; - switch (op[0]) { - case 0: case 1: t = op; break; - case 4: _.label++; return { value: op[1], done: false }; - case 5: _.label++; y = op[1]; op = [0]; continue; - case 7: op = _.ops.pop(); _.trys.pop(); continue; - default: - if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; } - if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; } - if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; } - if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; } - if (t[2]) _.ops.pop(); - _.trys.pop(); continue; - } - op = body.call(thisArg, _); - } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; } - if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true }; - } - }; - function encodeWeights(tensors) { - return __awaiter$7(this, void 0, void 0, function () { - var specs, dataPromises, name_1, t, tensorValues; - return __generator$7(this, function (_a) { - switch (_a.label) { - case 0: - specs = []; - dataPromises = []; - for (name_1 in tensors) { - t = tensors[name_1]; - if (t.dtype !== 'float32' && t.dtype !== 'int32' && t.dtype !== 'bool') { - throw new Error("Unsupported dtype in weight '" + name_1 + "': " + t.dtype); - } - specs.push({ name: name_1, shape: t.shape, dtype: t.dtype }); - dataPromises.push(t.data()); - } - return [4, Promise.all(dataPromises)]; - case 1: - tensorValues = _a.sent(); - return [2, { data: concatenateTypedArrays(tensorValues), specs: specs }]; - } - }); - }); - } - function decodeWeights(buffer, specs) { - var out = {}; - var offset = 0; - for (var _i = 0, specs_1 = specs; _i < specs_1.length; _i++) { - var spec = specs_1[_i]; - var name_2 = spec.name; - var dtype = spec.dtype; - var shape = spec.shape; - if (spec.quantization != null) { - throw new Error("decodeWeights does not support quantization yet, but encountered " + - ("weight '" + name_2 + " with quantization.'")); - } - var size = sizeFromShape(shape); - var value = void 0; - if (dtype === 'float32') { - value = ArrayOps.tensor(new Float32Array(buffer, offset, size), shape, 'float32'); - } - else if (dtype === 'int32') { - value = - ArrayOps.tensor(new Int32Array(buffer, offset, size), shape, 'int32'); - } - else if (dtype === 'bool') { - value = - ArrayOps.tensor(new Uint8Array(buffer, offset, size), shape, 'bool'); - } - else { - throw new Error("Unsupported dtype in weight '" + name_2 + "': " + dtype); - } - out[name_2] = value; - offset += size * DTYPE_VALUE_SIZE_MAP[dtype]; - } - return out; - } - function concatenateTypedArrays(xs) { - if (xs === null) { - throw new Error("Invalid input value: " + JSON.stringify(xs)); - } - var totalByteLength = 0; - xs.forEach(function (x) { - if (x instanceof Float32Array || x instanceof Int32Array) { - totalByteLength += x.length * 4; - } - else if (x instanceof Uint8Array) { - totalByteLength += x.length; - } - else { - throw new Error("Unsupported TypedArray subtype: " + x.constructor.name); - } - }); - var y = new Uint8Array(totalByteLength); - var offset = 0; - xs.forEach(function (x) { - y.set(new Uint8Array(x.buffer), offset); - if (x instanceof Float32Array || x instanceof Int32Array) { - offset += x.length * 4; - } - else { - offset += x.length; - } - }); - return y.buffer; - } - function stringByteLength(str) { - return new Blob([str]).size; - } - function arrayBufferToBase64String(buffer) { - return btoa(String.fromCharCode.apply(null, new Uint8Array(buffer))); - } - function base64StringToArrayBuffer(str) { - var s = atob(str); - var buffer = new Uint8Array(s.length); - for (var i = 0; i < s.length; ++i) { - buffer.set([s.charCodeAt(i)], i); - } - return buffer.buffer; - } - function concatenateArrayBuffers(buffers) { - var totalByteLength = 0; - buffers.forEach(function (buffer) { - totalByteLength += buffer.byteLength; - }); - var temp = new Uint8Array(totalByteLength); - var offset = 0; - buffers.forEach(function (buffer) { - temp.set(new Uint8Array(buffer), offset); - offset += buffer.byteLength; - }); - return temp.buffer; - } - function basename(path) { - var SEPARATOR = '/'; - path = path.trim(); - while (path.endsWith(SEPARATOR)) { - path = path.slice(0, path.length - 1); - } - var items = path.split(SEPARATOR); - return items[items.length - 1]; - } - function getModelArtifactsInfoForJSON(modelArtifacts) { - if (modelArtifacts.modelTopology instanceof ArrayBuffer) { - throw new Error('Expected JSON model topology, received ArrayBuffer.'); - } - return { - dateSaved: new Date(), - modelTopologyType: 'JSON', - modelTopologyBytes: modelArtifacts.modelTopology == null ? - 0 : - stringByteLength(JSON.stringify(modelArtifacts.modelTopology)), - weightSpecsBytes: modelArtifacts.weightSpecs == null ? - 0 : - stringByteLength(JSON.stringify(modelArtifacts.weightSpecs)), - weightDataBytes: modelArtifacts.weightData == null ? - 0 : - modelArtifacts.weightData.byteLength, - }; - } - - var IORouterRegistry = (function () { - function IORouterRegistry() { - this.saveRouters = []; - this.loadRouters = []; - } - IORouterRegistry.getInstance = function () { - if (IORouterRegistry.instance == null) { - IORouterRegistry.instance = new IORouterRegistry(); - } - return IORouterRegistry.instance; - }; - IORouterRegistry.registerSaveRouter = function (saveRouter) { - IORouterRegistry.getInstance().saveRouters.push(saveRouter); - }; - IORouterRegistry.registerLoadRouter = function (loadRouter) { - IORouterRegistry.getInstance().loadRouters.push(loadRouter); - }; - IORouterRegistry.getSaveHandlers = function (url) { - return IORouterRegistry.getHandlers(url, 'save'); - }; - IORouterRegistry.getLoadHandlers = function (url) { - return IORouterRegistry.getHandlers(url, 'load'); - }; - IORouterRegistry.getHandlers = function (url, handlerType) { - var validHandlers = []; - var routers = handlerType === 'load' ? this.getInstance().loadRouters : - this.getInstance().saveRouters; - routers.forEach(function (router) { - var handler = router(url); - if (handler !== null) { - validHandlers.push(handler); - } - }); - return validHandlers; - }; - return IORouterRegistry; - }()); - - var __awaiter$8 = (undefined && undefined.__awaiter) || function (thisArg, _arguments, P, generator) { - return new (P || (P = Promise))(function (resolve, reject) { - function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } - function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } - function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); } - step((generator = generator.apply(thisArg, _arguments || [])).next()); - }); - }; - var __generator$8 = (undefined && undefined.__generator) || function (thisArg, body) { - var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g; - return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g; - function verb(n) { return function (v) { return step([n, v]); }; } - function step(op) { - if (f) throw new TypeError("Generator is already executing."); - while (_) try { - if (f = 1, y && (t = y[op[0] & 2 ? "return" : op[0] ? "throw" : "next"]) && !(t = t.call(y, op[1])).done) return t; - if (y = 0, t) op = [0, t.value]; - switch (op[0]) { - case 0: case 1: t = op; break; - case 4: _.label++; return { value: op[1], done: false }; - case 5: _.label++; y = op[1]; op = [0]; continue; - case 7: op = _.ops.pop(); _.trys.pop(); continue; - default: - if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; } - if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; } - if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; } - if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; } - if (t[2]) _.ops.pop(); - _.trys.pop(); continue; - } - op = body.call(thisArg, _); - } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; } - if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true }; - } - }; - var URL_SCHEME_SUFFIX = '://'; - var ModelStoreManagerRegistry = (function () { - function ModelStoreManagerRegistry() { - this.managers = {}; - } - ModelStoreManagerRegistry.getInstance = function () { - if (ModelStoreManagerRegistry.instance == null) { - ModelStoreManagerRegistry.instance = new ModelStoreManagerRegistry(); - } - return ModelStoreManagerRegistry.instance; - }; - ModelStoreManagerRegistry.registerManager = function (scheme, manager) { - assert(scheme != null, 'scheme must not be undefined or null.'); - if (scheme.endsWith(URL_SCHEME_SUFFIX)) { - scheme = scheme.slice(0, scheme.indexOf(URL_SCHEME_SUFFIX)); - } - assert(scheme.length > 0, 'scheme must not be an empty string.'); - var registry = ModelStoreManagerRegistry.getInstance(); - assert(registry.managers[scheme] == null, "A model store manager is already registered for scheme '" + scheme + "'."); - registry.managers[scheme] = manager; - }; - ModelStoreManagerRegistry.getManager = function (scheme) { - var manager = this.getInstance().managers[scheme]; - if (manager == null) { - throw new Error("Cannot find model manager for scheme '" + scheme + "'"); - } - return manager; - }; - ModelStoreManagerRegistry.getSchemes = function () { - return Object.keys(this.getInstance().managers); - }; - return ModelStoreManagerRegistry; - }()); - function parseURL(url) { - if (url.indexOf(URL_SCHEME_SUFFIX) === -1) { - throw new Error("The url string provided does not contain a scheme. " + - "Supported schemes are: " + - ("" + ModelStoreManagerRegistry.getSchemes().join(','))); - } - return { - scheme: url.split(URL_SCHEME_SUFFIX)[0], - path: url.split(URL_SCHEME_SUFFIX)[1], - }; - } - function listModels() { - return __awaiter$8(this, void 0, void 0, function () { - var schemes, out, _i, schemes_1, scheme, schemeOut, path, url; - return __generator$8(this, function (_a) { - switch (_a.label) { - case 0: - schemes = ModelStoreManagerRegistry.getSchemes(); - out = {}; - _i = 0, schemes_1 = schemes; - _a.label = 1; - case 1: - if (!(_i < schemes_1.length)) return [3, 4]; - scheme = schemes_1[_i]; - return [4, ModelStoreManagerRegistry.getManager(scheme).listModels()]; - case 2: - schemeOut = _a.sent(); - for (path in schemeOut) { - url = scheme + URL_SCHEME_SUFFIX + path; - out[url] = schemeOut[path]; - } - _a.label = 3; - case 3: - _i++; - return [3, 1]; - case 4: return [2, out]; - } - }); - }); - } - function removeModel(url) { - return __awaiter$8(this, void 0, void 0, function () { - var schemeAndPath, manager; - return __generator$8(this, function (_a) { - switch (_a.label) { - case 0: - schemeAndPath = parseURL(url); - manager = ModelStoreManagerRegistry.getManager(schemeAndPath.scheme); - return [4, manager.removeModel(schemeAndPath.path)]; - case 1: return [2, _a.sent()]; - } - }); - }); - } - function cloneModelInternal(sourceURL, destURL, deleteSource) { - if (deleteSource === void 0) { deleteSource = false; } - return __awaiter$8(this, void 0, void 0, function () { - var loadHandlers, loadHandler, saveHandlers, saveHandler, sourceScheme, sourcePath, sameMedium, modelArtifacts, saveResult; - return __generator$8(this, function (_a) { - switch (_a.label) { - case 0: - assert(sourceURL !== destURL, "Old path and new path are the same: '" + sourceURL + "'"); - loadHandlers = IORouterRegistry.getLoadHandlers(sourceURL); - assert(loadHandlers.length > 0, "Copying failed because no load handler is found for source URL " + sourceURL + "."); - assert(loadHandlers.length < 2, "Copying failed because more than one (" + loadHandlers.length + ") " + - ("load handlers for source URL " + sourceURL + ".")); - loadHandler = loadHandlers[0]; - saveHandlers = IORouterRegistry.getSaveHandlers(destURL); - assert(saveHandlers.length > 0, "Copying failed because no save handler is found for destination URL " + - (destURL + ".")); - assert(saveHandlers.length < 2, "Copying failed because more than one (" + loadHandlers.length + ") " + - ("save handlers for destination URL " + destURL + ".")); - saveHandler = saveHandlers[0]; - sourceScheme = parseURL(sourceURL).scheme; - sourcePath = parseURL(sourceURL).path; - sameMedium = sourceScheme === parseURL(sourceURL).scheme; - return [4, loadHandler.load()]; - case 1: - modelArtifacts = _a.sent(); - if (!(deleteSource && sameMedium)) return [3, 3]; - return [4, ModelStoreManagerRegistry.getManager(sourceScheme) - .removeModel(sourcePath)]; - case 2: - _a.sent(); - _a.label = 3; - case 3: return [4, saveHandler.save(modelArtifacts)]; - case 4: - saveResult = _a.sent(); - if (!(deleteSource && !sameMedium)) return [3, 6]; - return [4, ModelStoreManagerRegistry.getManager(sourceScheme) - .removeModel(sourcePath)]; - case 5: - _a.sent(); - _a.label = 6; - case 6: return [2, saveResult.modelArtifactsInfo]; - } - }); - }); - } - function copyModel(sourceURL, destURL) { - return __awaiter$8(this, void 0, void 0, function () { - var deleteSource; - return __generator$8(this, function (_a) { - switch (_a.label) { - case 0: - deleteSource = false; - return [4, cloneModelInternal(sourceURL, destURL, deleteSource)]; - case 1: return [2, _a.sent()]; - } - }); - }); - } - function moveModel(sourceURL, destURL) { - return __awaiter$8(this, void 0, void 0, function () { - var deleteSource; - return __generator$8(this, function (_a) { - switch (_a.label) { - case 0: - deleteSource = true; - return [4, cloneModelInternal(sourceURL, destURL, deleteSource)]; - case 1: return [2, _a.sent()]; - } - }); - }); - } - - var __awaiter$9 = (undefined && undefined.__awaiter) || function (thisArg, _arguments, P, generator) { - return new (P || (P = Promise))(function (resolve, reject) { - function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } - function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } - function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); } - step((generator = generator.apply(thisArg, _arguments || [])).next()); - }); - }; - var __generator$9 = (undefined && undefined.__generator) || function (thisArg, body) { - var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g; - return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g; - function verb(n) { return function (v) { return step([n, v]); }; } - function step(op) { - if (f) throw new TypeError("Generator is already executing."); - while (_) try { - if (f = 1, y && (t = y[op[0] & 2 ? "return" : op[0] ? "throw" : "next"]) && !(t = t.call(y, op[1])).done) return t; - if (y = 0, t) op = [0, t.value]; - switch (op[0]) { - case 0: case 1: t = op; break; - case 4: _.label++; return { value: op[1], done: false }; - case 5: _.label++; y = op[1]; op = [0]; continue; - case 7: op = _.ops.pop(); _.trys.pop(); continue; - default: - if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; } - if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; } - if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; } - if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; } - if (t[2]) _.ops.pop(); - _.trys.pop(); continue; - } - op = body.call(thisArg, _); - } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; } - if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true }; - } - }; - var DATABASE_NAME = 'tensorflowjs'; - var DATABASE_VERSION = 1; - var MODEL_STORE_NAME = 'models_store'; - var INFO_STORE_NAME = 'model_info_store'; - function getIndexedDBFactory() { - if (!ENV.get('IS_BROWSER')) { - throw new Error('Failed to obtain IndexedDB factory because the current environment' + - 'is not a web browser.'); - } - var theWindow = window; - var factory = theWindow.indexedDB || theWindow.mozIndexedDB || - theWindow.webkitIndexedDB || theWindow.msIndexedDB || - theWindow.shimIndexedDB; - if (factory == null) { - throw new Error('The current browser does not appear to support IndexedDB.'); - } - return factory; - } - function setUpDatabase(openRequest) { - var db = openRequest.result; - db.createObjectStore(MODEL_STORE_NAME, { keyPath: 'modelPath' }); - db.createObjectStore(INFO_STORE_NAME, { keyPath: 'modelPath' }); - } - var BrowserIndexedDB = (function () { - function BrowserIndexedDB(modelPath) { - this.indexedDB = getIndexedDBFactory(); - if (modelPath == null || !modelPath) { - throw new Error('For IndexedDB, modelPath must not be null, undefined or empty.'); - } - this.modelPath = modelPath; - } - BrowserIndexedDB.prototype.save = function (modelArtifacts) { - return __awaiter$9(this, void 0, void 0, function () { - return __generator$9(this, function (_a) { - if (modelArtifacts.modelTopology instanceof ArrayBuffer) { - throw new Error('BrowserLocalStorage.save() does not support saving model topology ' + - 'in binary formats yet.'); - } - return [2, this.databaseAction(this.modelPath, modelArtifacts)]; - }); - }); - }; - BrowserIndexedDB.prototype.load = function () { - return __awaiter$9(this, void 0, void 0, function () { - return __generator$9(this, function (_a) { - return [2, this.databaseAction(this.modelPath)]; - }); - }); - }; - BrowserIndexedDB.prototype.databaseAction = function (modelPath, modelArtifacts) { - var _this = this; - return new Promise(function (resolve, reject) { - var openRequest = _this.indexedDB.open(DATABASE_NAME, DATABASE_VERSION); - openRequest.onupgradeneeded = function () { return setUpDatabase(openRequest); }; - openRequest.onsuccess = function () { - var db = openRequest.result; - if (modelArtifacts == null) { - var modelTx = db.transaction(MODEL_STORE_NAME, 'readonly'); - var modelStore = modelTx.objectStore(MODEL_STORE_NAME); - var getRequest_1 = modelStore.get(_this.modelPath); - getRequest_1.onsuccess = function () { - if (getRequest_1.result == null) { - db.close(); - return reject(new Error("Cannot find model with path '" + _this.modelPath + "' " + - "in IndexedDB.")); - } - else { - resolve(getRequest_1.result.modelArtifacts); - } - }; - getRequest_1.onerror = function (error) { - db.close(); - return reject(getRequest_1.error); - }; - modelTx.oncomplete = function () { return db.close(); }; - } - else { - var modelArtifactsInfo_1 = getModelArtifactsInfoForJSON(modelArtifacts); - var infoTx_1 = db.transaction(INFO_STORE_NAME, 'readwrite'); - var infoStore_1 = infoTx_1.objectStore(INFO_STORE_NAME); - var putInfoRequest_1 = infoStore_1.put({ modelPath: _this.modelPath, modelArtifactsInfo: modelArtifactsInfo_1 }); - var modelTx_1; - putInfoRequest_1.onsuccess = function () { - modelTx_1 = db.transaction(MODEL_STORE_NAME, 'readwrite'); - var modelStore = modelTx_1.objectStore(MODEL_STORE_NAME); - var putModelRequest = modelStore.put({ - modelPath: _this.modelPath, - modelArtifacts: modelArtifacts, - modelArtifactsInfo: modelArtifactsInfo_1 - }); - putModelRequest.onsuccess = function () { return resolve({ modelArtifactsInfo: modelArtifactsInfo_1 }); }; - putModelRequest.onerror = function (error) { - infoStore_1 = infoTx_1.objectStore(INFO_STORE_NAME); - var deleteInfoRequest = infoStore_1.delete(_this.modelPath); - deleteInfoRequest.onsuccess = function () { - db.close(); - return reject(putModelRequest.error); - }; - deleteInfoRequest.onerror = function (error) { - db.close(); - return reject(putModelRequest.error); - }; - }; - }; - putInfoRequest_1.onerror = function (error) { - db.close(); - return reject(putInfoRequest_1.error); - }; - infoTx_1.oncomplete = function () { - if (modelTx_1 == null) { - db.close(); - } - else { - modelTx_1.oncomplete = function () { return db.close(); }; - } - }; - } - }; - openRequest.onerror = function (error) { return reject(openRequest.error); }; - }); - }; - BrowserIndexedDB.URL_SCHEME = 'indexeddb://'; - return BrowserIndexedDB; - }()); - var indexedDBRouter = function (url) { - if (!ENV.get('IS_BROWSER')) { - return null; - } - else { - if (url.startsWith(BrowserIndexedDB.URL_SCHEME)) { - return browserIndexedDB(url.slice(BrowserIndexedDB.URL_SCHEME.length)); - } - else { - return null; - } - } - }; - IORouterRegistry.registerSaveRouter(indexedDBRouter); - IORouterRegistry.registerLoadRouter(indexedDBRouter); - function browserIndexedDB(modelPath) { - return new BrowserIndexedDB(modelPath); - } - function maybeStripScheme(key) { - return key.startsWith(BrowserIndexedDB.URL_SCHEME) ? - key.slice(BrowserIndexedDB.URL_SCHEME.length) : - key; - } - var BrowserIndexedDBManager = (function () { - function BrowserIndexedDBManager() { - this.indexedDB = getIndexedDBFactory(); - } - BrowserIndexedDBManager.prototype.listModels = function () { - return __awaiter$9(this, void 0, void 0, function () { - var _this = this; - return __generator$9(this, function (_a) { - return [2, new Promise(function (resolve, reject) { - var openRequest = _this.indexedDB.open(DATABASE_NAME, DATABASE_VERSION); - openRequest.onupgradeneeded = function () { return setUpDatabase(openRequest); }; - openRequest.onsuccess = function () { - var db = openRequest.result; - var tx = db.transaction(INFO_STORE_NAME, 'readonly'); - var store = tx.objectStore(INFO_STORE_NAME); - var getAllInfoRequest = store.getAll(); - getAllInfoRequest.onsuccess = function () { - var out = {}; - for (var _i = 0, _a = getAllInfoRequest.result; _i < _a.length; _i++) { - var item = _a[_i]; - out[item.modelPath] = item.modelArtifactsInfo; - } - resolve(out); - }; - getAllInfoRequest.onerror = function (error) { - db.close(); - return reject(getAllInfoRequest.error); - }; - tx.oncomplete = function () { return db.close(); }; - }; - openRequest.onerror = function (error) { return reject(openRequest.error); }; - })]; - }); - }); - }; - BrowserIndexedDBManager.prototype.removeModel = function (path) { - return __awaiter$9(this, void 0, void 0, function () { - var _this = this; - return __generator$9(this, function (_a) { - path = maybeStripScheme(path); - return [2, new Promise(function (resolve, reject) { - var openRequest = _this.indexedDB.open(DATABASE_NAME, DATABASE_VERSION); - openRequest.onupgradeneeded = function () { return setUpDatabase(openRequest); }; - openRequest.onsuccess = function () { - var db = openRequest.result; - var infoTx = db.transaction(INFO_STORE_NAME, 'readwrite'); - var infoStore = infoTx.objectStore(INFO_STORE_NAME); - var getInfoRequest = infoStore.get(path); - var modelTx; - getInfoRequest.onsuccess = function () { - if (getInfoRequest.result == null) { - db.close(); - return reject(new Error("Cannot find model with path '" + path + "' " + - "in IndexedDB.")); - } - else { - var deleteInfoRequest = infoStore.delete(path); - var deleteModelData_1 = function () { - modelTx = db.transaction(MODEL_STORE_NAME, 'readwrite'); - var modelStore = modelTx.objectStore(MODEL_STORE_NAME); - var deleteModelRequest = modelStore.delete(path); - deleteModelRequest.onsuccess = function () { - return resolve(getInfoRequest.result.modelArtifactsInfo); - }; - deleteModelRequest.onerror = function (error) { - return reject(getInfoRequest.error); - }; - }; - deleteInfoRequest.onsuccess = deleteModelData_1; - deleteInfoRequest.onerror = function (error) { - deleteModelData_1(); - db.close(); - return reject(getInfoRequest.error); - }; - } - }; - getInfoRequest.onerror = function (error) { - db.close(); - return reject(getInfoRequest.error); - }; - infoTx.oncomplete = function () { - if (modelTx == null) { - db.close(); - } - else { - modelTx.oncomplete = function () { return db.close(); }; - } - }; - }; - openRequest.onerror = function (error) { return reject(openRequest.error); }; - })]; - }); - }); - }; - return BrowserIndexedDBManager; - }()); - if (ENV.get('IS_BROWSER')) { - try { - ModelStoreManagerRegistry.registerManager(BrowserIndexedDB.URL_SCHEME, new BrowserIndexedDBManager()); - } - catch (err) { - } - } - - var __awaiter$a = (undefined && undefined.__awaiter) || function (thisArg, _arguments, P, generator) { - return new (P || (P = Promise))(function (resolve, reject) { - function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } - function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } - function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); } - step((generator = generator.apply(thisArg, _arguments || [])).next()); - }); - }; - var __generator$a = (undefined && undefined.__generator) || function (thisArg, body) { - var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g; - return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g; - function verb(n) { return function (v) { return step([n, v]); }; } - function step(op) { - if (f) throw new TypeError("Generator is already executing."); - while (_) try { - if (f = 1, y && (t = y[op[0] & 2 ? "return" : op[0] ? "throw" : "next"]) && !(t = t.call(y, op[1])).done) return t; - if (y = 0, t) op = [0, t.value]; - switch (op[0]) { - case 0: case 1: t = op; break; - case 4: _.label++; return { value: op[1], done: false }; - case 5: _.label++; y = op[1]; op = [0]; continue; - case 7: op = _.ops.pop(); _.trys.pop(); continue; - default: - if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; } - if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; } - if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; } - if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; } - if (t[2]) _.ops.pop(); - _.trys.pop(); continue; - } - op = body.call(thisArg, _); - } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; } - if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true }; - } - }; - var PATH_SEPARATOR = '/'; - var PATH_PREFIX = 'tensorflowjs_models'; - var INFO_SUFFIX = 'info'; - var MODEL_TOPOLOGY_SUFFIX = 'model_topology'; - var WEIGHT_SPECS_SUFFIX = 'weight_specs'; - var WEIGHT_DATA_SUFFIX = 'weight_data'; - function getModelKeys(path) { - return { - info: [PATH_PREFIX, path, INFO_SUFFIX].join(PATH_SEPARATOR), - topology: [PATH_PREFIX, path, MODEL_TOPOLOGY_SUFFIX].join(PATH_SEPARATOR), - weightSpecs: [PATH_PREFIX, path, WEIGHT_SPECS_SUFFIX].join(PATH_SEPARATOR), - weightData: [PATH_PREFIX, path, WEIGHT_DATA_SUFFIX].join(PATH_SEPARATOR) - }; - } - function getModelPathFromKey(key) { - var items = key.split(PATH_SEPARATOR); - if (items.length < 3) { - throw new Error("Invalid key format: " + key); - } - return items.slice(1, items.length - 1).join(PATH_SEPARATOR); - } - function maybeStripScheme$1(key) { - return key.startsWith(BrowserLocalStorage.URL_SCHEME) ? - key.slice(BrowserLocalStorage.URL_SCHEME.length) : - key; - } - var BrowserLocalStorage = (function () { - function BrowserLocalStorage(modelPath) { - if (!ENV.get('IS_BROWSER') || typeof window.localStorage === 'undefined') { - throw new Error('The current environment does not support local storage.'); - } - this.LS = window.localStorage; - if (modelPath == null || !modelPath) { - throw new Error('For local storage, modelPath must not be null, undefined or empty.'); - } - this.modelPath = modelPath; - this.keys = getModelKeys(this.modelPath); - } - BrowserLocalStorage.prototype.save = function (modelArtifacts) { - return __awaiter$a(this, void 0, void 0, function () { - var topology, weightSpecs, modelArtifactsInfo, key; - return __generator$a(this, function (_a) { - if (modelArtifacts.modelTopology instanceof ArrayBuffer) { - throw new Error('BrowserLocalStorage.save() does not support saving model topology ' + - 'in binary formats yet.'); - } - else { - topology = JSON.stringify(modelArtifacts.modelTopology); - weightSpecs = JSON.stringify(modelArtifacts.weightSpecs); - modelArtifactsInfo = getModelArtifactsInfoForJSON(modelArtifacts); - try { - this.LS.setItem(this.keys.info, JSON.stringify(modelArtifactsInfo)); - this.LS.setItem(this.keys.topology, topology); - this.LS.setItem(this.keys.weightSpecs, weightSpecs); - this.LS.setItem(this.keys.weightData, arrayBufferToBase64String(modelArtifacts.weightData)); - return [2, { modelArtifactsInfo: modelArtifactsInfo }]; - } - catch (err) { - for (key in this.keys) { - this.LS.removeItem(this.keys[key]); - } - throw new Error("Failed to save model '" + this.modelPath + "' to local storage: " + - "size quota being exceeded is a possible cause of this failure: " + - ("modelTopologyBytes=" + modelArtifactsInfo.modelTopologyBytes + ", ") + - ("weightSpecsBytes=" + modelArtifactsInfo.weightSpecsBytes + ", ") + - ("weightDataBytes=" + modelArtifactsInfo.weightDataBytes + ".")); - } - } - return [2]; - }); - }); - }; - BrowserLocalStorage.prototype.load = function () { - return __awaiter$a(this, void 0, void 0, function () { - var info, out, topology, weightSpecs, weightDataBase64; - return __generator$a(this, function (_a) { - info = JSON.parse(this.LS.getItem(this.keys.info)); - if (info == null) { - throw new Error("In local storage, there is no model with name '" + this.modelPath + "'"); - } - if (info.modelTopologyType !== 'JSON') { - throw new Error('BrowserLocalStorage does not support loading non-JSON model ' + - 'topology yet.'); - } - out = {}; - topology = JSON.parse(this.LS.getItem(this.keys.topology)); - if (topology == null) { - throw new Error("In local storage, the topology of model '" + this.modelPath + "' " + - "is missing."); - } - out.modelTopology = topology; - weightSpecs = JSON.parse(this.LS.getItem(this.keys.weightSpecs)); - if (weightSpecs == null) { - throw new Error("In local storage, the weight specs of model '" + this.modelPath + "' " + - "are missing."); - } - out.weightSpecs = weightSpecs; - weightDataBase64 = this.LS.getItem(this.keys.weightData); - if (weightDataBase64 == null) { - throw new Error("In local storage, the binary weight values of model " + - ("'" + this.modelPath + "' are missing.")); - } - out.weightData = base64StringToArrayBuffer(weightDataBase64); - return [2, out]; - }); - }); - }; - BrowserLocalStorage.URL_SCHEME = 'localstorage://'; - return BrowserLocalStorage; - }()); - var localStorageRouter = function (url) { - if (!ENV.get('IS_BROWSER')) { - return null; - } - else { - if (url.startsWith(BrowserLocalStorage.URL_SCHEME)) { - return browserLocalStorage(url.slice(BrowserLocalStorage.URL_SCHEME.length)); - } - else { - return null; - } - } - }; - IORouterRegistry.registerSaveRouter(localStorageRouter); - IORouterRegistry.registerLoadRouter(localStorageRouter); - function browserLocalStorage(modelPath) { - return new BrowserLocalStorage(modelPath); - } - var BrowserLocalStorageManager = (function () { - function BrowserLocalStorageManager() { - assert(ENV.get('IS_BROWSER'), 'Current environment is not a web browser'); - assert(typeof window.localStorage !== 'undefined', 'Current browser does not appear to support localStorage'); - this.LS = window.localStorage; - } - BrowserLocalStorageManager.prototype.listModels = function () { - return __awaiter$a(this, void 0, void 0, function () { - var out, prefix, suffix, i, key, modelPath; - return __generator$a(this, function (_a) { - out = {}; - prefix = PATH_PREFIX + PATH_SEPARATOR; - suffix = PATH_SEPARATOR + INFO_SUFFIX; - for (i = 0; i < this.LS.length; ++i) { - key = this.LS.key(i); - if (key.startsWith(prefix) && key.endsWith(suffix)) { - modelPath = getModelPathFromKey(key); - out[modelPath] = JSON.parse(this.LS.getItem(key)); - } - } - return [2, out]; - }); - }); - }; - BrowserLocalStorageManager.prototype.removeModel = function (path) { - return __awaiter$a(this, void 0, void 0, function () { - var keys, info; - return __generator$a(this, function (_a) { - path = maybeStripScheme$1(path); - keys = getModelKeys(path); - if (this.LS.getItem(keys.info) == null) { - throw new Error("Cannot find model at path '" + path + "'"); - } - info = JSON.parse(this.LS.getItem(keys.info)); - this.LS.removeItem(keys.info); - this.LS.removeItem(keys.topology); - this.LS.removeItem(keys.weightSpecs); - this.LS.removeItem(keys.weightData); - return [2, info]; - }); - }); - }; - return BrowserLocalStorageManager; - }()); - if (ENV.get('IS_BROWSER')) { - try { - ModelStoreManagerRegistry.registerManager(BrowserLocalStorage.URL_SCHEME, new BrowserLocalStorageManager()); - } - catch (err) { - } - } - - var __awaiter$b = (undefined && undefined.__awaiter) || function (thisArg, _arguments, P, generator) { - return new (P || (P = Promise))(function (resolve, reject) { - function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } - function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } - function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); } - step((generator = generator.apply(thisArg, _arguments || [])).next()); - }); - }; - var __generator$b = (undefined && undefined.__generator) || function (thisArg, body) { - var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g; - return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g; - function verb(n) { return function (v) { return step([n, v]); }; } - function step(op) { - if (f) throw new TypeError("Generator is already executing."); - while (_) try { - if (f = 1, y && (t = y[op[0] & 2 ? "return" : op[0] ? "throw" : "next"]) && !(t = t.call(y, op[1])).done) return t; - if (y = 0, t) op = [0, t.value]; - switch (op[0]) { - case 0: case 1: t = op; break; - case 4: _.label++; return { value: op[1], done: false }; - case 5: _.label++; y = op[1]; op = [0]; continue; - case 7: op = _.ops.pop(); _.trys.pop(); continue; - default: - if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; } - if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; } - if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; } - if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; } - if (t[2]) _.ops.pop(); - _.trys.pop(); continue; - } - op = body.call(thisArg, _); - } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; } - if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true }; - } - }; - var DEFAULT_FILE_NAME_PREFIX = 'model'; - var DEFAULT_JSON_EXTENSION_NAME = '.json'; - var DEFAULT_WEIGHT_DATA_EXTENSION_NAME = '.weights.bin'; - var BrowserDownloads = (function () { - function BrowserDownloads(fileNamePrefix) { - if (!ENV.get('IS_BROWSER')) { - throw new Error('triggerDownloads() cannot proceed because the current environment ' + - 'is not a browser.'); - } - if (fileNamePrefix.startsWith(BrowserDownloads.URL_SCHEME)) { - fileNamePrefix = fileNamePrefix.slice(BrowserDownloads.URL_SCHEME.length); - } - if (fileNamePrefix == null || fileNamePrefix.length === 0) { - fileNamePrefix = DEFAULT_FILE_NAME_PREFIX; - } - this.modelTopologyFileName = fileNamePrefix + DEFAULT_JSON_EXTENSION_NAME; - this.weightDataFileName = - fileNamePrefix + DEFAULT_WEIGHT_DATA_EXTENSION_NAME; - } - BrowserDownloads.prototype.save = function (modelArtifacts) { - return __awaiter$b(this, void 0, void 0, function () { - var weightsURL, weightsManifest, modelTopologyAndWeightManifest, modelTopologyAndWeightManifestURL, jsonAnchor, weightDataAnchor; - return __generator$b(this, function (_a) { - weightsURL = window.URL.createObjectURL(new Blob([modelArtifacts.weightData], { type: 'application/octet-stream' })); - if (modelArtifacts.modelTopology instanceof ArrayBuffer) { - throw new Error('DownloadTrigger.save() does not support saving model topology ' + - 'in binary formats yet.'); - } - else { - weightsManifest = [{ - paths: ['./' + this.weightDataFileName], - weights: modelArtifacts.weightSpecs - }]; - modelTopologyAndWeightManifest = { - modelTopology: modelArtifacts.modelTopology, - weightsManifest: weightsManifest - }; - modelTopologyAndWeightManifestURL = window.URL.createObjectURL(new Blob([JSON.stringify(modelTopologyAndWeightManifest)], { type: 'application/json' })); - jsonAnchor = this.jsonAnchor == null ? document.createElement('a') : - this.jsonAnchor; - jsonAnchor.download = this.modelTopologyFileName; - jsonAnchor.href = modelTopologyAndWeightManifestURL; - jsonAnchor.click(); - if (modelArtifacts.weightData != null) { - weightDataAnchor = this.weightDataAnchor == null ? - document.createElement('a') : - this.weightDataAnchor; - weightDataAnchor.download = this.weightDataFileName; - weightDataAnchor.href = weightsURL; - weightDataAnchor.click(); - } - return [2, { modelArtifactsInfo: getModelArtifactsInfoForJSON(modelArtifacts) }]; - } - return [2]; - }); - }); - }; - BrowserDownloads.URL_SCHEME = 'downloads://'; - return BrowserDownloads; - }()); - var BrowserFiles = (function () { - function BrowserFiles(files) { - if (files == null || files.length < 1) { - throw new Error("When calling browserFiles, at least 1 file is required, " + - ("but received " + files)); - } - this.files = files; - } - BrowserFiles.prototype.load = function () { - return __awaiter$b(this, void 0, void 0, function () { - var _this = this; - var jsonFile, weightFiles; - return __generator$b(this, function (_a) { - jsonFile = this.files[0]; - weightFiles = this.files.slice(1); - return [2, new Promise(function (resolve, reject) { - var jsonReader = new FileReader(); - jsonReader.onload = function (event) { - var modelJSON = JSON.parse(event.target.result); - var modelTopology = modelJSON.modelTopology; - if (modelTopology == null) { - reject(new Error("modelTopology field is missing from file " + jsonFile.name)); - return; - } - if (weightFiles.length === 0) { - resolve({ modelTopology: modelTopology }); - } - var weightsManifest = modelJSON.weightsManifest; - if (weightsManifest == null) { - reject(new Error("weightManifest field is missing from file " + jsonFile.name)); - return; - } - var pathToFile; - try { - pathToFile = - _this.checkManifestAndWeightFiles(weightsManifest, weightFiles); - } - catch (err) { - reject(err); - return; - } - var weightSpecs = []; - var paths = []; - var perFileBuffers = []; - weightsManifest.forEach(function (weightsGroup) { - weightsGroup.paths.forEach(function (path) { - paths.push(path); - perFileBuffers.push(null); - }); - weightSpecs.push.apply(weightSpecs, weightsGroup.weights); - }); - weightsManifest.forEach(function (weightsGroup) { - weightsGroup.paths.forEach(function (path) { - var weightFileReader = new FileReader(); - weightFileReader.onload = function (event) { - var weightData = event.target.result; - var index = paths.indexOf(path); - perFileBuffers[index] = weightData; - if (perFileBuffers.indexOf(null) === -1) { - resolve({ - modelTopology: modelTopology, - weightSpecs: weightSpecs, - weightData: concatenateArrayBuffers(perFileBuffers), - }); - } - }; - weightFileReader.onerror = function (error) { - reject("Failed to weights data from file of path '" + path + "'."); - return; - }; - weightFileReader.readAsArrayBuffer(pathToFile[path]); - }); - }); - }; - jsonReader.onerror = function (error) { - reject("Failed to read model topology and weights manifest JSON " + - ("from file '" + jsonFile.name + "'. BrowserFiles supports loading ") + - "Keras-style tf.Model artifacts only."); - return; - }; - jsonReader.readAsText(jsonFile); - })]; - }); - }); - }; - BrowserFiles.prototype.checkManifestAndWeightFiles = function (manifest, files) { - var basenames = []; - var fileNames = files.map(function (file) { return basename(file.name); }); - var pathToFile = {}; - for (var _i = 0, manifest_1 = manifest; _i < manifest_1.length; _i++) { - var group = manifest_1[_i]; - group.paths.forEach(function (path) { - var pathBasename = basename(path); - if (basenames.indexOf(pathBasename) !== -1) { - throw new Error("Duplicate file basename found in weights manifest: " + - ("'" + pathBasename + "'")); - } - basenames.push(pathBasename); - if (fileNames.indexOf(pathBasename) === -1) { - throw new Error("Weight file with basename '" + pathBasename + "' is not provided."); - } - else { - pathToFile[path] = files[fileNames.indexOf(pathBasename)]; - } - }); - } - if (basenames.length !== files.length) { - throw new Error("Mismatch in the number of files in weights manifest " + - ("(" + basenames.length + ") and the number of weight files provided ") + - ("(" + files.length + ").")); - } - return pathToFile; - }; - return BrowserFiles; - }()); - var browserDownloadsRouter = function (url) { - if (!ENV.get('IS_BROWSER')) { - return null; - } - else { - if (url.startsWith(BrowserDownloads.URL_SCHEME)) { - return browserDownloads(url.slice(BrowserDownloads.URL_SCHEME.length)); - } - else { - return null; - } - } - }; - IORouterRegistry.registerSaveRouter(browserDownloadsRouter); - function browserDownloads(fileNamePrefix) { - if (fileNamePrefix === void 0) { fileNamePrefix = 'model'; } - return new BrowserDownloads(fileNamePrefix); - } - function browserFiles(files) { - return new BrowserFiles(files); - } - - var __awaiter$c = (undefined && undefined.__awaiter) || function (thisArg, _arguments, P, generator) { - return new (P || (P = Promise))(function (resolve, reject) { - function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } - function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } - function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); } - step((generator = generator.apply(thisArg, _arguments || [])).next()); - }); - }; - var __generator$c = (undefined && undefined.__generator) || function (thisArg, body) { - var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g; - return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g; - function verb(n) { return function (v) { return step([n, v]); }; } - function step(op) { - if (f) throw new TypeError("Generator is already executing."); - while (_) try { - if (f = 1, y && (t = y[op[0] & 2 ? "return" : op[0] ? "throw" : "next"]) && !(t = t.call(y, op[1])).done) return t; - if (y = 0, t) op = [0, t.value]; - switch (op[0]) { - case 0: case 1: t = op; break; - case 4: _.label++; return { value: op[1], done: false }; - case 5: _.label++; y = op[1]; op = [0]; continue; - case 7: op = _.ops.pop(); _.trys.pop(); continue; - default: - if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; } - if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; } - if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; } - if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; } - if (t[2]) _.ops.pop(); - _.trys.pop(); continue; - } - op = body.call(thisArg, _); - } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; } - if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true }; - } - }; - var BrowserHTTPRequest = (function () { - function BrowserHTTPRequest(path, requestInit) { - this.DEFAULT_METHOD = 'POST'; - if (!ENV.get('IS_BROWSER')) { - throw new Error('browserHTTPRequest is not supported outside the web browser.'); - } - assert(path != null && path.length > 0, 'URL path for browserHTTPRequest must not be null, undefined or ' + - 'empty.'); - this.path = path; - if (requestInit != null && requestInit.body != null) { - throw new Error('requestInit is expected to have no pre-existing body, but has one.'); - } - this.requestInit = requestInit || {}; - } - BrowserHTTPRequest.prototype.save = function (modelArtifacts) { - return __awaiter$c(this, void 0, void 0, function () { - var init, weightsManifest, modelTopologyAndWeightManifest, response; - return __generator$c(this, function (_a) { - switch (_a.label) { - case 0: - if (modelArtifacts.modelTopology instanceof ArrayBuffer) { - throw new Error('BrowserHTTPRequest.save() does not support saving model topology ' + - 'in binary formats yet.'); - } - init = Object.assign({ method: this.DEFAULT_METHOD }, this.requestInit); - init.body = new FormData(); - weightsManifest = [{ - paths: ['./model.weights.bin'], - weights: modelArtifacts.weightSpecs, - }]; - modelTopologyAndWeightManifest = { - modelTopology: modelArtifacts.modelTopology, - weightsManifest: weightsManifest - }; - init.body.append('model.json', new Blob([JSON.stringify(modelTopologyAndWeightManifest)], { type: 'application/json' }), 'model.json'); - if (modelArtifacts.weightData != null) { - init.body.append('model.weights.bin', new Blob([modelArtifacts.weightData], { type: 'application/octet-stream' }), 'model.weights.bin'); - } - return [4, fetch(this.path, init)]; - case 1: - response = _a.sent(); - if (response.status === 200) { - return [2, { - modelArtifactsInfo: getModelArtifactsInfoForJSON(modelArtifacts), - responses: [response], - }]; - } - else { - throw new Error("BrowserHTTPRequest.save() failed due to HTTP response status " + - (response.status + ".")); - } - return [2]; - } - }); - }); - }; - BrowserHTTPRequest.URL_SCHEMES = ['http://', 'https://']; - return BrowserHTTPRequest; - }()); - var httpRequestRouter = function (url) { - if (!ENV.get('IS_BROWSER')) { - return null; - } - else { - for (var _i = 0, _a = BrowserHTTPRequest.URL_SCHEMES; _i < _a.length; _i++) { - var scheme = _a[_i]; - if (url.startsWith(scheme)) { - return browserHTTPRequest(url); - } - } - return null; - } - }; - IORouterRegistry.registerSaveRouter(httpRequestRouter); - function browserHTTPRequest(path, requestInit) { - return new BrowserHTTPRequest(path, requestInit); - } - - var __awaiter$d = (undefined && undefined.__awaiter) || function (thisArg, _arguments, P, generator) { - return new (P || (P = Promise))(function (resolve, reject) { - function fulfilled(value) { try { step$$1(generator.next(value)); } catch (e) { reject(e); } } - function rejected(value) { try { step$$1(generator["throw"](value)); } catch (e) { reject(e); } } - function step$$1(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); } - step$$1((generator = generator.apply(thisArg, _arguments || [])).next()); - }); - }; - var __generator$d = (undefined && undefined.__generator) || function (thisArg, body) { - var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g; - return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g; - function verb(n) { return function (v) { return step$$1([n, v]); }; } - function step$$1(op) { - if (f) throw new TypeError("Generator is already executing."); - while (_) try { - if (f = 1, y && (t = y[op[0] & 2 ? "return" : op[0] ? "throw" : "next"]) && !(t = t.call(y, op[1])).done) return t; - if (y = 0, t) op = [0, t.value]; - switch (op[0]) { - case 0: case 1: t = op; break; - case 4: _.label++; return { value: op[1], done: false }; - case 5: _.label++; y = op[1]; op = [0]; continue; - case 7: op = _.ops.pop(); _.trys.pop(); continue; - default: - if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; } - if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; } - if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; } - if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; } - if (t[2]) _.ops.pop(); - _.trys.pop(); continue; - } - op = body.call(thisArg, _); - } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; } - if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true }; - } - }; - function loadWeights(manifest, filePathPrefix, weightNames, requestOptions) { - if (filePathPrefix === void 0) { filePathPrefix = ''; } - return __awaiter$d(this, void 0, void 0, function () { - var groupIndicesToFetchMap, groupWeightsToFetch, weightsFound, allManifestWeightNames, weightsNotFound, groupIndicesToFetch, requests, responses, buffers, weightsTensorMap, bufferIndexOffset; - return __generator$d(this, function (_a) { - switch (_a.label) { - case 0: - groupIndicesToFetchMap = manifest.map(function () { return false; }); - groupWeightsToFetch = {}; - weightsFound = weightNames != null ? weightNames.map(function () { return false; }) : []; - allManifestWeightNames = []; - manifest.forEach(function (manifestGroupConfig, groupIndex) { - var groupOffset = 0; - manifestGroupConfig.weights.forEach(function (weightsEntry) { - var rawDtype = ('quantization' in weightsEntry) ? - weightsEntry.quantization.dtype : - weightsEntry.dtype; - var weightsBytes = DTYPE_VALUE_SIZE_MAP[rawDtype] * - sizeFromShape(weightsEntry.shape); - var enqueueWeightsForFetchingFn = function () { - groupIndicesToFetchMap[groupIndex] = true; - if (groupWeightsToFetch[groupIndex] == null) { - groupWeightsToFetch[groupIndex] = []; - } - groupWeightsToFetch[groupIndex].push({ - manifestEntry: weightsEntry, - groupOffset: groupOffset, - sizeBytes: weightsBytes - }); - }; - if (weightNames != null) { - weightNames.forEach(function (weightName, weightIndex) { - if (weightName === weightsEntry.name) { - enqueueWeightsForFetchingFn(); - weightsFound[weightIndex] = true; - } - }); - } - else { - enqueueWeightsForFetchingFn(); - } - allManifestWeightNames.push(weightsEntry.name); - groupOffset += weightsBytes; - }); - }); - if (!weightsFound.every(function (found) { return found; })) { - weightsNotFound = weightNames.filter(function (weight, i) { return !weightsFound[i]; }); - throw new Error("Could not find weights in manifest with names: " + - (weightsNotFound.join(', ') + ". \n") + - "Manifest JSON has weights with names: " + - (allManifestWeightNames.join(', ') + ".")); - } - groupIndicesToFetch = groupIndicesToFetchMap.reduce(function (accumulator, shouldFetch, i) { - if (shouldFetch) { - accumulator.push(i); - } - return accumulator; - }, []); - requests = []; - groupIndicesToFetch.forEach(function (i) { - manifest[i].paths.forEach(function (filepath) { - var fetchUrl = filePathPrefix + - (!filePathPrefix.endsWith('/') ? '/' : '') + filepath; - requests.push(fetch(fetchUrl, requestOptions)); - }); - }); - return [4, Promise.all(requests)]; - case 1: - responses = _a.sent(); - return [4, Promise.all(responses.map(function (response) { return response.arrayBuffer(); }))]; - case 2: - buffers = _a.sent(); - weightsTensorMap = {}; - bufferIndexOffset = 0; - groupIndicesToFetch.forEach(function (i) { - var numBuffers = manifest[i].paths.length; - var groupBytes = 0; - for (var i_1 = 0; i_1 < numBuffers; i_1++) { - groupBytes += buffers[bufferIndexOffset + i_1].byteLength; - } - var groupBuffer = new ArrayBuffer(groupBytes); - var groupByteBuffer = new Uint8Array(groupBuffer); - var groupBufferOffset = 0; - for (var i_2 = 0; i_2 < numBuffers; i_2++) { - var buffer$$1 = new Uint8Array(buffers[bufferIndexOffset + i_2]); - groupByteBuffer.set(buffer$$1, groupBufferOffset); - groupBufferOffset += buffer$$1.byteLength; - } - var weightsEntries = groupWeightsToFetch[i]; - weightsEntries.forEach(function (weightsEntry) { - var byteBuffer = groupBuffer.slice(weightsEntry.groupOffset, weightsEntry.groupOffset + weightsEntry.sizeBytes); - var typedArray; - var dtype = weightsEntry.manifestEntry.dtype; - if ('quantization' in weightsEntry.manifestEntry) { - var quantization_1 = weightsEntry.manifestEntry.quantization; - if (quantization_1.dtype !== 'uint8' && quantization_1.dtype !== 'uint16') { - throw new Error("Weight " + weightsEntry.manifestEntry.name + " has unknown " + - ("quantization dtype " + quantization_1.dtype + ".")); - } - var quantizedArray = (quantization_1.dtype === 'uint8') ? - new Uint8Array(byteBuffer) : - new Uint16Array(byteBuffer); - if (dtype === 'float32') { - typedArray = Float32Array.from(quantizedArray, function (v) { return v * quantization_1.scale + quantization_1.min; }); - } - else if (dtype === 'int32') { - typedArray = Int32Array.from(quantizedArray, function (v) { return Math.round(v * quantization_1.scale + quantization_1.min); }); - } - else { - throw new Error("Weight " + weightsEntry.manifestEntry.name + " has a dtype not " + - ("supported by quantization: " + dtype)); - } - } - else { - if (dtype === 'float32') { - typedArray = new Float32Array(byteBuffer); - } - else if (dtype === 'int32') { - typedArray = new Int32Array(byteBuffer); - } - else { - throw new Error("Weight " + weightsEntry.manifestEntry.name + " has unknown dtype " + - (dtype + ".")); - } - } - var weightName = weightsEntry.manifestEntry.name; - if (weightsTensorMap[weightName] != null) { - throw new Error("Duplicate weight with name " + weightName + ". " + - "Please make sure weights names are unique in the manifest JSON."); - } - weightsTensorMap[weightName] = tensor(typedArray, weightsEntry.manifestEntry.shape, weightsEntry.manifestEntry.dtype); - }); - bufferIndexOffset += numBuffers; - }); - return [2, weightsTensorMap]; - } - }); - }); - } - - var registerSaveRouter = IORouterRegistry.registerSaveRouter; - var registerLoadRouter = IORouterRegistry.registerLoadRouter; - var getSaveHandlers = IORouterRegistry.getSaveHandlers; - var getLoadHandlers = IORouterRegistry.getLoadHandlers; - - var io = /*#__PURE__*/Object.freeze({ - browserFiles: browserFiles, - browserHTTPRequest: browserHTTPRequest, - copyModel: copyModel, - decodeWeights: decodeWeights, - encodeWeights: encodeWeights, - getLoadHandlers: getLoadHandlers, - getSaveHandlers: getSaveHandlers, - listModels: listModels, - loadWeights: loadWeights, - moveModel: moveModel, - registerLoadRouter: registerLoadRouter, - registerSaveRouter: registerSaveRouter, - removeModel: removeModel - }); - - var Serializable = (function () { - function Serializable() { - } - Serializable.prototype.getClassName = function () { - return this.constructor - .className; - }; - Serializable.fromConfig = function (cls, config) { - return new cls(config); - }; - return Serializable; - }()); - var SerializationMap = (function () { - function SerializationMap() { - this.classNameMap = {}; - } - SerializationMap.getMap = function () { - if (SerializationMap.instance == null) { - SerializationMap.instance = new SerializationMap(); - } - return SerializationMap.instance; - }; - SerializationMap.register = function (cls) { - this.getMap().classNameMap[cls.className] = [cls, cls.fromConfig]; - }; - return SerializationMap; - }()); - - var serialization = /*#__PURE__*/Object.freeze({ - Serializable: Serializable, - SerializationMap: SerializationMap - }); - - var WEBGL_ENVS = { - 'BACKEND': 'test-webgl' - }; - var CPU_ENVS = { - 'BACKEND': 'test-cpu' - }; - var ALL_ENVS = {}; - var TEST_EPSILON = 1e-3; - function expectArraysClose(actual, expected, epsilon) { - if (epsilon === void 0) { epsilon = TEST_EPSILON; } - if (!(actual instanceof Tensor) && !(expected instanceof Tensor)) { - var aType = actual.constructor.name; - var bType = expected.constructor.name; - if (aType !== bType) { - throw new Error("Arrays are of different type actual: " + aType + " " + - ("vs expected: " + bType)); - } - } - else if (actual instanceof Tensor && expected instanceof Tensor) { - if (actual.dtype !== expected.dtype) { - throw new Error("Arrays are of different type actual: " + actual.dtype + " " + - ("vs expected: " + expected.dtype + ".")); - } - if (!arraysEqual(actual.shape, expected.shape)) { - throw new Error("Arrays are of different shape actual: " + actual.shape + " " + - ("vs expected: " + expected.shape + ".")); - } - } - var actualValues; - var expectedValues; - if (actual instanceof Tensor) { - actualValues = actual.dataSync(); - } - else { - actualValues = actual; - } - if (expected instanceof Tensor) { - expectedValues = expected.dataSync(); - } - else { - expectedValues = expected; - } - if (actualValues.length !== expectedValues.length) { - throw new Error("Arrays have different lengths actual: " + actualValues.length + " vs " + - ("expected: " + expectedValues.length + ".\n") + - ("Actual: " + actualValues + ".\n") + - ("Expected: " + expectedValues + ".")); - } - for (var i = 0; i < expectedValues.length; ++i) { - var a = actualValues[i]; - var e = expectedValues[i]; - if (!areClose(a, Number(e), epsilon)) { - throw new Error("Arrays differ: actual[" + i + "] = " + a + ", expected[" + i + "] = " + e + ".\n" + - ("Actual: " + actualValues + ".\n") + - ("Expected: " + expectedValues + ".")); - } - } - } - function expectPromiseToFail(fn, done) { - fn().then(function () { return done.fail(); }, function () { return done(); }); - } - function expectArraysEqual(actual, expected) { - return expectArraysClose(actual, expected, 0); - } - function expectNumbersClose(a, e, epsilon) { - if (epsilon === void 0) { epsilon = TEST_EPSILON; } - if (!areClose(a, e, epsilon)) { - throw new Error("Numbers differ: actual === " + a + ", expected === " + e); - } - } - function areClose(a, e, epsilon) { - if (isNaN(a) && isNaN(e)) { - return true; - } - if (isNaN(a) || isNaN(e) || Math.abs(a - e) > epsilon) { - return false; - } - return true; - } - function expectValuesInRange(actual, low, high) { - var actualVals; - if (actual instanceof Tensor) { - actualVals = actual.dataSync(); - } - else { - actualVals = actual; - } - for (var i = 0; i < actualVals.length; i++) { - if (actualVals[i] < low || actualVals[i] > high) { - throw new Error("Value out of range:" + actualVals[i] + " low: " + low + ", high: " + high); - } - } - } - - var test_util = /*#__PURE__*/Object.freeze({ - WEBGL_ENVS: WEBGL_ENVS, - CPU_ENVS: CPU_ENVS, - ALL_ENVS: ALL_ENVS, - TEST_EPSILON: TEST_EPSILON, - expectArraysClose: expectArraysClose, - expectPromiseToFail: expectPromiseToFail, - expectArraysEqual: expectArraysEqual, - expectNumbersClose: expectNumbersClose, - expectValuesInRange: expectValuesInRange - }); - - var version = '0.11.0'; - - - - var webgl = /*#__PURE__*/Object.freeze({ - gpgpu_util: gpgpu_util, - webgl_util: webgl_util, - MathBackendWebGL: MathBackendWebGL, - GPGPUContext: GPGPUContext - }); - - var __extends$1 = (undefined && undefined.__extends) || (function () { - var extendStatics = Object.setPrototypeOf || - ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || - function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; }; - return function (d, b) { - extendStatics(d, b); - function __() { this.constructor = d; } - d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); - }; - })(); - var __decorate$s = (undefined && undefined.__decorate) || function (decorators, target, key, desc) { - var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; - if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); - else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; - return c > 3 && r && Object.defineProperty(target, key, r), r; - }; - var Optimizer = (function (_super) { - __extends$1(Optimizer, _super); - function Optimizer() { - return _super !== null && _super.apply(this, arguments) || this; - } - Optimizer.prototype.minimize = function (f, returnCost, varList) { - if (returnCost === void 0) { returnCost = false; } - var _a = this.computeGradients(f, varList), value = _a.value, grads$$1 = _a.grads; - this.applyGradients(grads$$1); - var varNames = Object.keys(grads$$1); - varNames.forEach(function (varName) { return grads$$1[varName].dispose(); }); - if (returnCost) { - return value; - } - else { - value.dispose(); - return null; - } - }; - Optimizer.prototype.computeGradients = function (f, varList) { - return variableGrads(f, varList); - }; - __decorate$s([ - doc({ heading: 'Training', subheading: 'Optimizers' }) - ], Optimizer.prototype, "minimize", null); - Optimizer = __decorate$s([ - doc({ heading: 'Training', subheading: 'Classes', namespace: 'train' }) - ], Optimizer); - return Optimizer; - }(Serializable)); - - var __extends$2 = (undefined && undefined.__extends) || (function () { - var extendStatics = Object.setPrototypeOf || - ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || - function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; }; - return function (d, b) { - extendStatics(d, b); - function __() { this.constructor = d; } - d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); - }; - })(); - var AdadeltaOptimizer = (function (_super) { - __extends$2(AdadeltaOptimizer, _super); - function AdadeltaOptimizer(learningRate, rho, epsilon) { - if (epsilon === void 0) { epsilon = 1e-8; } - var _this = _super.call(this) || this; - _this.learningRate = learningRate; - _this.rho = rho; - _this.epsilon = epsilon; - _this.accumulatedGrads = {}; - _this.accumulatedUpdates = {}; - _this.c = keep(scalar(-learningRate)); - _this.epsilonScalar = keep(scalar(epsilon)); - _this.rhoScalar = keep(scalar(rho)); - _this.oneMinusRho = keep(scalar(1 - rho)); - return _this; - } - AdadeltaOptimizer.prototype.applyGradients = function (variableGradients) { - var _this = this; - var _loop_1 = function (variableName) { - var value = ENV.engine.registeredVariables[variableName]; - if (this_1.accumulatedGrads[variableName] == null) { - var trainable_1 = false; - tidy(function () { - _this.accumulatedGrads[variableName] = - zerosLike(value).variable(trainable_1); - }); - } - if (this_1.accumulatedUpdates[variableName] == null) { - var trainable_2 = false; - tidy(function () { - _this.accumulatedUpdates[variableName] = - zerosLike(value).variable(trainable_2); - }); - } - var gradient = variableGradients[variableName]; - var accumulatedGrad = this_1.accumulatedGrads[variableName]; - var accumulatedUpdate = this_1.accumulatedUpdates[variableName]; - tidy(function () { - var newAccumulatedGrad = _this.rhoScalar.mul(accumulatedGrad) - .add(_this.oneMinusRho.mul(gradient.square())); - var updates = accumulatedUpdate.add(_this.epsilonScalar) - .sqrt() - .div(accumulatedGrad.add(_this.epsilonScalar).sqrt()) - .mul(gradient); - var newAccumulatedUpdate = _this.rhoScalar.mul(accumulatedUpdate) - .add(_this.oneMinusRho.mul(updates.square())); - _this.accumulatedGrads[variableName].assign(newAccumulatedGrad); - _this.accumulatedUpdates[variableName].assign(newAccumulatedUpdate); - var newValue = _this.c.mul(updates).add(value); - value.assign(newValue); - }); - }; - var this_1 = this; - for (var variableName in variableGradients) { - _loop_1(variableName); - } - }; - AdadeltaOptimizer.prototype.dispose = function () { - var _this = this; - this.c.dispose(); - this.epsilonScalar.dispose(); - this.rhoScalar.dispose(); - this.oneMinusRho.dispose(); - if (this.accumulatedUpdates != null) { - Object.keys(this.accumulatedUpdates) - .forEach(function (name) { return _this.accumulatedUpdates[name].dispose(); }); - Object.keys(this.accumulatedGrads) - .forEach(function (name) { return _this.accumulatedGrads[name].dispose(); }); - } - }; - AdadeltaOptimizer.prototype.getConfig = function () { - return { - learningRate: this.learningRate, - rho: this.rho, - epsilon: this.epsilon - }; - }; - AdadeltaOptimizer.fromConfig = function (cls, config) { - return new cls(config.learningRate, config.rho, config.epsilon); - }; - AdadeltaOptimizer.className = 'AdadeltaOptimizer'; - return AdadeltaOptimizer; - }(Optimizer)); - SerializationMap.register(AdadeltaOptimizer); - - var __extends$3 = (undefined && undefined.__extends) || (function () { - var extendStatics = Object.setPrototypeOf || - ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || - function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; }; - return function (d, b) { - extendStatics(d, b); - function __() { this.constructor = d; } - d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); - }; - })(); - var AdagradOptimizer = (function (_super) { - __extends$3(AdagradOptimizer, _super); - function AdagradOptimizer(learningRate, initialAccumulatorValue) { - if (initialAccumulatorValue === void 0) { initialAccumulatorValue = 0.1; } - var _this = _super.call(this) || this; - _this.learningRate = learningRate; - _this.initialAccumulatorValue = initialAccumulatorValue; - _this.accumulatedGrads = {}; - _this.c = keep(scalar(-learningRate)); - _this.epsilon = keep(scalar(1e-8)); - return _this; - } - AdagradOptimizer.prototype.applyGradients = function (variableGradients) { - var _this = this; - var _loop_1 = function (variableName) { - var value = ENV.engine.registeredVariables[variableName]; - if (this_1.accumulatedGrads[variableName] == null) { - var trainable_1 = false; - tidy(function () { - _this.accumulatedGrads[variableName] = - fill(value.shape, _this.initialAccumulatorValue) - .variable(trainable_1); - }); - } - var gradient = variableGradients[variableName]; - var accumulatedGrad = this_1.accumulatedGrads[variableName]; - tidy(function () { - var newAccumulatedGrad = accumulatedGrad.add(gradient.square()); - _this.accumulatedGrads[variableName].assign(newAccumulatedGrad); - var newValue = _this.c - .mul(gradient.div(newAccumulatedGrad.add(_this.epsilon).sqrt())) - .add(value); - value.assign(newValue); - }); - }; - var this_1 = this; - for (var variableName in variableGradients) { - _loop_1(variableName); - } - }; - AdagradOptimizer.prototype.dispose = function () { - var _this = this; - this.epsilon.dispose(); - this.c.dispose(); - if (this.accumulatedGrads != null) { - Object.keys(this.accumulatedGrads) - .forEach(function (name) { return _this.accumulatedGrads[name].dispose(); }); - } - }; - AdagradOptimizer.prototype.getConfig = function () { - return { - learningRate: this.learningRate, - initialAccumulatorValue: this.initialAccumulatorValue, - }; - }; - AdagradOptimizer.fromConfig = function (cls, config) { - return new cls(config.learningRate, config.initialAccumulatorValue); - }; - AdagradOptimizer.className = 'AdagradOptimizer'; - return AdagradOptimizer; - }(Optimizer)); - SerializationMap.register(AdagradOptimizer); - - var __extends$4 = (undefined && undefined.__extends) || (function () { - var extendStatics = Object.setPrototypeOf || - ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || - function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; }; - return function (d, b) { - extendStatics(d, b); - function __() { this.constructor = d; } - d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); - }; - })(); - var AdamOptimizer = (function (_super) { - __extends$4(AdamOptimizer, _super); - function AdamOptimizer(learningRate, beta1, beta2, epsilon) { - if (epsilon === void 0) { epsilon = 1e-8; } - var _this = _super.call(this) || this; - _this.learningRate = learningRate; - _this.beta1 = beta1; - _this.beta2 = beta2; - _this.epsilon = epsilon; - _this.accumulatedFirstMoment = {}; - _this.accumulatedSecondMoment = {}; - _this.c = keep(scalar(-learningRate)); - _this.epsScalar = keep(scalar(epsilon)); - _this.beta1Scalar = keep(scalar(beta1)); - _this.beta2Scalar = keep(scalar(beta2)); - tidy(function () { - _this.accBeta1 = scalar(beta1).variable(); - _this.accBeta2 = scalar(beta2).variable(); - }); - _this.oneMinusBeta1 = keep(scalar(1 - beta1)); - _this.oneMinusBeta2 = keep(scalar(1 - beta2)); - _this.one = keep(scalar(1)); - return _this; - } - AdamOptimizer.prototype.applyGradients = function (variableGradients) { - var _this = this; - tidy(function () { - var oneMinusAccBeta1 = _this.one.sub(_this.accBeta1); - var oneMinusAccBeta2 = _this.one.sub(_this.accBeta2); - for (var variableName in variableGradients) { - var value = ENV.engine.registeredVariables[variableName]; - if (_this.accumulatedFirstMoment[variableName] == null) { - var trainable = false; - _this.accumulatedFirstMoment[variableName] = - zerosLike(value).variable(trainable); - } - if (_this.accumulatedSecondMoment[variableName] == null) { - var trainable = false; - _this.accumulatedSecondMoment[variableName] = - zerosLike(value).variable(trainable); - } - var gradient = variableGradients[variableName]; - var firstMoment = _this.accumulatedFirstMoment[variableName]; - var secondMoment = _this.accumulatedSecondMoment[variableName]; - var newFirstMoment = _this.beta1Scalar.mul(firstMoment) - .add(_this.oneMinusBeta1.mul(gradient)); - var newSecondMoment = _this.beta2Scalar.mul(secondMoment) - .add(_this.oneMinusBeta2.mul(gradient.square())); - var biasCorrectedFirstMoment = newFirstMoment.div(oneMinusAccBeta1); - var biasCorrectedSecondMoment = newSecondMoment.div(oneMinusAccBeta2); - _this.accumulatedFirstMoment[variableName].assign(newFirstMoment); - _this.accumulatedSecondMoment[variableName].assign(newSecondMoment); - var newValue = _this.c - .mul(biasCorrectedFirstMoment.div(_this.epsScalar.add(biasCorrectedSecondMoment.sqrt()))) - .add(value); - value.assign(newValue); - } - _this.accBeta1.assign(_this.accBeta1.mul(_this.beta1Scalar)); - _this.accBeta2.assign(_this.accBeta2.mul(_this.beta2Scalar)); - }); - }; - AdamOptimizer.prototype.dispose = function () { - var _this = this; - this.c.dispose(); - this.epsScalar.dispose(); - this.beta1Scalar.dispose(); - this.beta2Scalar.dispose(); - this.accBeta1.dispose(); - this.accBeta2.dispose(); - this.oneMinusBeta1.dispose(); - this.oneMinusBeta2.dispose(); - this.one.dispose(); - if (this.accumulatedFirstMoment != null) { - Object.keys(this.accumulatedFirstMoment) - .forEach(function (name) { return _this.accumulatedFirstMoment[name].dispose(); }); - } - if (this.accumulatedSecondMoment != null) { - Object.keys(this.accumulatedSecondMoment) - .forEach(function (name) { return _this.accumulatedSecondMoment[name].dispose(); }); - } - }; - AdamOptimizer.prototype.getConfig = function () { - return { - learningRate: this.learningRate, - beta1: this.beta1, - beta2: this.beta2, - epsilon: this.epsilon, - }; - }; - AdamOptimizer.fromConfig = function (cls, config) { - return new cls(config.learningRate, config.beta1, config.beta2, config.epsilon); - }; - AdamOptimizer.className = 'AdamOptimizer'; - return AdamOptimizer; - }(Optimizer)); - SerializationMap.register(AdamOptimizer); - - var __extends$5 = (undefined && undefined.__extends) || (function () { - var extendStatics = Object.setPrototypeOf || - ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || - function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; }; - return function (d, b) { - extendStatics(d, b); - function __() { this.constructor = d; } - d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); - }; - })(); - var AdamaxOptimizer = (function (_super) { - __extends$5(AdamaxOptimizer, _super); - function AdamaxOptimizer(learningRate, beta1, beta2, epsilon, decay) { - if (epsilon === void 0) { epsilon = 1e-8; } - if (decay === void 0) { decay = 0.0; } - var _this = _super.call(this) || this; - _this.learningRate = learningRate; - _this.beta1 = beta1; - _this.beta2 = beta2; - _this.epsilon = epsilon; - _this.decay = decay; - _this.accumulatedFirstMoment = {}; - _this.accumulatedWeightedInfNorm = {}; - _this.c = keep(scalar(-learningRate)); - _this.epsScalar = keep(scalar(epsilon)); - _this.beta1Scalar = keep(scalar(beta1)); - _this.beta2Scalar = keep(scalar(beta2)); - _this.decayScalar = keep(scalar(decay)); - tidy(function () { - _this.iteration = scalar(0).variable(); - _this.accBeta1 = scalar(beta1).variable(); - }); - _this.oneMinusBeta1 = keep(scalar(1 - beta1)); - _this.one = keep(scalar(1)); - return _this; - } - AdamaxOptimizer.prototype.applyGradients = function (variableGradients) { - var _this = this; - tidy(function () { - var oneMinusAccBeta1 = _this.one.sub(_this.accBeta1); - var lr = _this.c.div(_this.one.add(_this.decayScalar.mul(_this.iteration))); - for (var variableName in variableGradients) { - var value = ENV.engine.registeredVariables[variableName]; - if (_this.accumulatedFirstMoment[variableName] == null) { - var trainable = false; - _this.accumulatedFirstMoment[variableName] = - zerosLike(value).variable(trainable); - } - if (_this.accumulatedWeightedInfNorm[variableName] == null) { - var trainable = false; - _this.accumulatedWeightedInfNorm[variableName] = - zerosLike(value).variable(trainable); - } - var gradient = variableGradients[variableName]; - var firstMoment = _this.accumulatedFirstMoment[variableName]; - var weightedInfNorm = _this.accumulatedWeightedInfNorm[variableName]; - var newFirstMoment = _this.beta1Scalar.mul(firstMoment) - .add(_this.oneMinusBeta1.mul(gradient)); - var ut0 = _this.beta2Scalar.mul(weightedInfNorm); - var ut1 = gradient.abs(); - var newWeightedInfNorm = ut0.maximum(ut1); - _this.accumulatedFirstMoment[variableName].assign(newFirstMoment); - _this.accumulatedWeightedInfNorm[variableName].assign(newWeightedInfNorm); - var newValue = lr.div(oneMinusAccBeta1) - .mul(newFirstMoment.div(_this.epsScalar.add(newWeightedInfNorm))) - .add(value); - value.assign(newValue); - } - _this.iteration.assign(_this.iteration.add(_this.one)); - _this.accBeta1.assign(_this.accBeta1.mul(_this.beta1Scalar)); - }); - }; - AdamaxOptimizer.prototype.dispose = function () { - var _this = this; - this.c.dispose(); - this.epsScalar.dispose(); - this.accBeta1.dispose(); - this.beta1Scalar.dispose(); - this.beta2Scalar.dispose(); - this.oneMinusBeta1.dispose(); - this.decayScalar.dispose(); - this.iteration.dispose(); - this.one.dispose(); - if (this.accumulatedFirstMoment != null) { - Object.keys(this.accumulatedFirstMoment) - .forEach(function (name) { return _this.accumulatedFirstMoment[name].dispose(); }); - } - if (this.accumulatedWeightedInfNorm != null) { - Object.keys(this.accumulatedWeightedInfNorm) - .forEach(function (name) { return _this.accumulatedWeightedInfNorm[name].dispose(); }); - } - }; - AdamaxOptimizer.prototype.getConfig = function () { - return { - learningRate: this.learningRate, - beta1: this.beta1, - beta2: this.beta2, - epsilon: this.epsilon, - decay: this.decay - }; - }; - AdamaxOptimizer.fromConfig = function (cls, config) { - return new cls(config.learningRate, config.beta1, config.beta2, config.epsilon, config.decay); - }; - AdamaxOptimizer.className = 'AdamaxOptimizer'; - return AdamaxOptimizer; - }(Optimizer)); - SerializationMap.register(AdamaxOptimizer); - - var __extends$6 = (undefined && undefined.__extends) || (function () { - var extendStatics = Object.setPrototypeOf || - ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || - function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; }; - return function (d, b) { - extendStatics(d, b); - function __() { this.constructor = d; } - d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); - }; - })(); - var SGDOptimizer = (function (_super) { - __extends$6(SGDOptimizer, _super); - function SGDOptimizer(learningRate) { - var _this = _super.call(this) || this; - _this.learningRate = learningRate; - _this.setLearningRate(learningRate); - return _this; - } - SGDOptimizer.prototype.applyGradients = function (variableGradients) { - var _this = this; - var varNames = Object.keys(variableGradients); - varNames.forEach(function (varName) { - var gradient = variableGradients[varName]; - var value = ENV.engine.registeredVariables[varName]; - tidy(function () { - var newValue = _this.c.mul(gradient).add(value); - value.assign(newValue); - }); - }); - }; - SGDOptimizer.prototype.setLearningRate = function (learningRate) { - this.learningRate = learningRate; - if (this.c != null) { - this.c.dispose(); - } - this.c = keep(scalar(-learningRate)); - }; - SGDOptimizer.prototype.dispose = function () { - this.c.dispose(); - }; - SGDOptimizer.prototype.getConfig = function () { - return { learningRate: this.learningRate }; - }; - SGDOptimizer.fromConfig = function (cls, config) { - return new cls(config.learningRate); - }; - SGDOptimizer.className = 'SGDOptimizer'; - return SGDOptimizer; - }(Optimizer)); - SerializationMap.register(SGDOptimizer); - - var __extends$7 = (undefined && undefined.__extends) || (function () { - var extendStatics = Object.setPrototypeOf || - ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || - function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; }; - return function (d, b) { - extendStatics(d, b); - function __() { this.constructor = d; } - d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); - }; - })(); - var MomentumOptimizer = (function (_super) { - __extends$7(MomentumOptimizer, _super); - function MomentumOptimizer(learningRate, momentum, useNesterov) { - if (useNesterov === void 0) { useNesterov = false; } - var _this = _super.call(this, learningRate) || this; - _this.learningRate = learningRate; - _this.momentum = momentum; - _this.useNesterov = useNesterov; - _this.m = scalar(_this.momentum); - _this.accumulations = {}; - return _this; - } - MomentumOptimizer.prototype.applyGradients = function (variableGradients) { - var _this = this; - var _loop_1 = function (variableName) { - var value = ENV.engine.registeredVariables[variableName]; - if (this_1.accumulations[variableName] == null) { - var trainable_1 = false; - tidy(function () { - _this.accumulations[variableName] = - zerosLike(value).variable(trainable_1); - }); - } - var accumulation = this_1.accumulations[variableName]; - var gradient = variableGradients[variableName]; - tidy(function () { - var newValue; - var newAccumulation = _this.m.mul(accumulation).add(gradient); - if (_this.useNesterov) { - newValue = - _this.c.mul(gradient.add(newAccumulation.mul(_this.m))).add(value); - } - else { - newValue = _this.c.mul(newAccumulation).add(value); - } - _this.accumulations[variableName].assign(newAccumulation); - value.assign(newValue); - }); - }; - var this_1 = this; - for (var variableName in variableGradients) { - _loop_1(variableName); - } - }; - MomentumOptimizer.prototype.dispose = function () { - _super.prototype.dispose.call(this); - this.m.dispose(); - if (this.accumulations != null) { - for (var variableName in this.accumulations) { - this.accumulations[variableName].dispose(); - } - } - }; - MomentumOptimizer.prototype.setMomentum = function (momentum) { - this.momentum = momentum; - }; - MomentumOptimizer.prototype.getConfig = function () { - return { - learningRate: this.learningRate, - momentum: this.momentum, - useNesterov: this.useNesterov - }; - }; - MomentumOptimizer.fromConfig = function (cls, config) { - return new cls(config.learningRate, config.momentum, config.useNesterov); - }; - MomentumOptimizer.className = 'MomentumOptimizer'; - return MomentumOptimizer; - }(SGDOptimizer)); - SerializationMap.register(MomentumOptimizer); - - var __extends$8 = (undefined && undefined.__extends) || (function () { - var extendStatics = Object.setPrototypeOf || - ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || - function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; }; - return function (d, b) { - extendStatics(d, b); - function __() { this.constructor = d; } - d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); - }; - })(); - var RMSPropOptimizer = (function (_super) { - __extends$8(RMSPropOptimizer, _super); - function RMSPropOptimizer(learningRate, decay, momentum, epsilon, centered) { - if (decay === void 0) { decay = 0.9; } - if (momentum === void 0) { momentum = 0.0; } - if (epsilon === void 0) { epsilon = 1e-8; } - if (centered === void 0) { centered = false; } - var _this = _super.call(this) || this; - _this.learningRate = learningRate; - _this.decay = decay; - _this.momentum = momentum; - _this.epsilon = epsilon; - _this.accumulatedMeanSquares = {}; - _this.accumulatedMeanGrads = {}; - _this.accumulatedMoments = {}; - _this.c = keep(scalar(learningRate)); - _this.epsilonScalar = keep(scalar(epsilon)); - _this.decayScalar = keep(scalar(decay)); - _this.momentumScalar = keep(scalar(momentum)); - _this.oneMinusDecay = keep(scalar(1 - decay)); - _this.centered = centered; - return _this; - } - RMSPropOptimizer.prototype.applyGradients = function (variableGradients) { - var _this = this; - var _loop_1 = function (variableName) { - var value = ENV.engine.registeredVariables[variableName]; - if (this_1.accumulatedMeanSquares[variableName] == null) { - var trainable_1 = false; - tidy(function () { - _this.accumulatedMeanSquares[variableName] = - zerosLike(value).variable(trainable_1); - }); - } - if (this_1.accumulatedMeanGrads[variableName] == null && this_1.centered) { - var trainable_2 = false; - tidy(function () { - _this.accumulatedMeanGrads[variableName] = - zerosLike(value).variable(trainable_2); - }); - } - if (this_1.accumulatedMoments[variableName] == null) { - var trainable_3 = false; - tidy(function () { - _this.accumulatedMoments[variableName] = - zerosLike(value).variable(trainable_3); - }); - } - var accumulatedMeanSquare = this_1.accumulatedMeanSquares[variableName]; - var accumulatedMeanGrad = this_1.accumulatedMeanGrads[variableName]; - var accumulatedMoments = this_1.accumulatedMoments[variableName]; - var gradient = variableGradients[variableName]; - tidy(function () { - var newAccumulatedMeanSquare = _this.decayScalar.mul(accumulatedMeanSquare) - .add(_this.oneMinusDecay.mul(gradient.square())); - if (_this.centered) { - var newAccumulatedMeanGrad = _this.decayScalar.mul(accumulatedMeanGrad) - .add(_this.oneMinusDecay.mul(gradient)); - var newAccumulatedMoments = _this.momentumScalar.mul(accumulatedMoments) - .add(_this.c.mul(gradient).div(newAccumulatedMeanSquare - .sub(newAccumulatedMeanGrad.square().add(_this.epsilonScalar)) - .sqrt())); - _this.accumulatedMeanSquares[variableName].assign(newAccumulatedMeanSquare); - _this.accumulatedMeanGrads[variableName].assign(newAccumulatedMeanGrad); - _this.accumulatedMoments[variableName].assign(newAccumulatedMoments); - var newValue = value.sub(newAccumulatedMoments); - value.assign(newValue); - } - else { - var newAccumulatedMeanSquare_1 = _this.decayScalar.mul(accumulatedMeanSquare) - .add(_this.oneMinusDecay.mul(gradient.square())); - var newAccumulatedMoments = _this.momentumScalar.mul(accumulatedMoments) - .add(_this.c.mul(gradient).div(newAccumulatedMeanSquare_1.add(_this.epsilonScalar).sqrt())); - _this.accumulatedMeanSquares[variableName].assign(newAccumulatedMeanSquare_1); - _this.accumulatedMoments[variableName].assign(newAccumulatedMoments); - var newValue = value.sub(newAccumulatedMoments); - value.assign(newValue); - } - }); - }; - var this_1 = this; - for (var variableName in variableGradients) { - _loop_1(variableName); - } - }; - RMSPropOptimizer.prototype.dispose = function () { - var _this = this; - this.c.dispose(); - this.epsilonScalar.dispose(); - this.decayScalar.dispose(); - this.momentumScalar.dispose(); - this.oneMinusDecay.dispose(); - if (this.accumulatedMeanSquares != null) { - Object.keys(this.accumulatedMeanSquares) - .forEach(function (name) { return _this.accumulatedMeanSquares[name].dispose(); }); - } - if (this.accumulatedMeanGrads != null && this.centered) { - Object.keys(this.accumulatedMeanGrads) - .forEach(function (name) { return _this.accumulatedMeanGrads[name].dispose(); }); - } - if (this.accumulatedMoments != null) { - Object.keys(this.accumulatedMoments) - .forEach(function (name) { return _this.accumulatedMoments[name].dispose(); }); - } - }; - RMSPropOptimizer.prototype.getConfig = function () { - return { - learningRate: this.learningRate, - decay: this.decay, - momentum: this.momentum, - epsilon: this.epsilon, - centered: this.centered - }; - }; - RMSPropOptimizer.fromConfig = function (cls, config) { - return new cls(config.learningRate, config.decay, config.momentum, config.epsilon, config.centered); - }; - RMSPropOptimizer.className = 'RMSPropOptimizer'; - return RMSPropOptimizer; - }(Optimizer)); - SerializationMap.register(RMSPropOptimizer); - - var __decorate$t = (undefined && undefined.__decorate) || function (decorators, target, key, desc) { - var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; - if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); - else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; - return c > 3 && r && Object.defineProperty(target, key, r), r; - }; - var OptimizerConstructors = (function () { - function OptimizerConstructors() { - } - OptimizerConstructors.sgd = function (learningRate) { - return new SGDOptimizer(learningRate); - }; - OptimizerConstructors.momentum = function (learningRate, momentum, useNesterov) { - if (useNesterov === void 0) { useNesterov = false; } - return new MomentumOptimizer(learningRate, momentum, useNesterov); - }; - OptimizerConstructors.rmsprop = function (learningRate, decay, momentum, epsilon, centered) { - if (decay === void 0) { decay = .9; } - if (momentum === void 0) { momentum = 0.0; } - if (epsilon === void 0) { epsilon = 1e-8; } - if (centered === void 0) { centered = false; } - return new RMSPropOptimizer(learningRate, decay, momentum, epsilon, centered); - }; - OptimizerConstructors.adam = function (learningRate, beta1, beta2, epsilon) { - if (learningRate === void 0) { learningRate = 0.001; } - if (beta1 === void 0) { beta1 = 0.9; } - if (beta2 === void 0) { beta2 = 0.999; } - if (epsilon === void 0) { epsilon = 1e-8; } - return new AdamOptimizer(learningRate, beta1, beta2, epsilon); - }; - OptimizerConstructors.adadelta = function (learningRate, rho, epsilon) { - if (learningRate === void 0) { learningRate = .001; } - if (rho === void 0) { rho = .95; } - if (epsilon === void 0) { epsilon = 1e-8; } - return new AdadeltaOptimizer(learningRate, rho, epsilon); - }; - OptimizerConstructors.adamax = function (learningRate, beta1, beta2, epsilon, decay) { - if (learningRate === void 0) { learningRate = 0.002; } - if (beta1 === void 0) { beta1 = 0.9; } - if (beta2 === void 0) { beta2 = 0.999; } - if (epsilon === void 0) { epsilon = 1e-8; } - if (decay === void 0) { decay = 0.0; } - return new AdamaxOptimizer(learningRate, beta1, beta2, epsilon, decay); - }; - OptimizerConstructors.adagrad = function (learningRate, initialAccumulatorValue) { - if (initialAccumulatorValue === void 0) { initialAccumulatorValue = 0.1; } - return new AdagradOptimizer(learningRate, initialAccumulatorValue); - }; - __decorate$t([ - doc({ heading: 'Training', subheading: 'Optimizers', namespace: 'train' }) - ], OptimizerConstructors, "sgd", null); - __decorate$t([ - doc({ heading: 'Training', subheading: 'Optimizers', namespace: 'train' }) - ], OptimizerConstructors, "momentum", null); - __decorate$t([ - doc({ heading: 'Training', subheading: 'Optimizers', namespace: 'train' }) - ], OptimizerConstructors, "rmsprop", null); - __decorate$t([ - doc({ heading: 'Training', subheading: 'Optimizers', namespace: 'train' }) - ], OptimizerConstructors, "adam", null); - __decorate$t([ - doc({ heading: 'Training', subheading: 'Optimizers', namespace: 'train' }) - ], OptimizerConstructors, "adadelta", null); - __decorate$t([ - doc({ heading: 'Training', subheading: 'Optimizers', namespace: 'train' }) - ], OptimizerConstructors, "adamax", null); - __decorate$t([ - doc({ heading: 'Training', subheading: 'Optimizers', namespace: 'train' }) - ], OptimizerConstructors, "adagrad", null); - return OptimizerConstructors; - }()); - - var train = { - sgd: OptimizerConstructors.sgd, - momentum: OptimizerConstructors.momentum, - adadelta: OptimizerConstructors.adadelta, - adagrad: OptimizerConstructors.adagrad, - rmsprop: OptimizerConstructors.rmsprop, - adamax: OptimizerConstructors.adamax, - adam: OptimizerConstructors.adam - }; - - var setBackend = Environment.setBackend; - var getBackend = Environment.getBackend; - var disposeVariables = Environment.disposeVariables; - var memory = Environment.memory; - var nextFrame = BrowserUtil.nextFrame; - - var index = /*#__PURE__*/Object.freeze({ - setBackend: setBackend, - getBackend: getBackend, - disposeVariables: disposeVariables, - memory: memory, - version_core: version, - nextFrame: nextFrame, - environment: environment, - io: io, - serialization: serialization, - test_util: test_util, - util: util, - webgl: webgl, - AdadeltaOptimizer: AdadeltaOptimizer, - AdagradOptimizer: AdagradOptimizer, - AdamOptimizer: AdamOptimizer, - AdamaxOptimizer: AdamaxOptimizer, - MomentumOptimizer: MomentumOptimizer, - Optimizer: Optimizer, - RMSPropOptimizer: RMSPropOptimizer, - SGDOptimizer: SGDOptimizer, - Tensor: Tensor, - TensorBuffer: TensorBuffer, - variable: variable, - Variable: Variable, - get Rank () { return Rank; }, - get Reduction () { return Reduction; }, - ENV: ENV, - Environment: Environment, - doc: doc, - batchNormalization: batchNormalization, - batchNormalization2d: batchNormalization2d, - batchNormalization3d: batchNormalization3d, - batchNormalization4d: batchNormalization4d, - concat: concat, - concat1d: concat1d, - concat2d: concat2d, - concat3d: concat3d, - concat4d: concat4d, - conv1d: conv1d, - conv2d: conv2d, - conv2dTranspose: conv2dTranspose, - depthwiseConv2d: depthwiseConv2d, - separableConv2d: separableConv2d, - matMul: matMul, - matrixTimesVector: matrixTimesVector, - outerProduct: outerProduct, - vectorTimesMatrix: vectorTimesMatrix, - avgPool: avgPool, - maxPool: maxPool, - transpose: transpose, - reverse: reverse, - reverse1d: reverse1d, - reverse2d: reverse2d, - reverse3d: reverse3d, - reverse4d: reverse4d, - slice: slice, - slice1d: slice1d, - slice2d: slice2d, - slice3d: slice3d, - slice4d: slice4d, - stridedSlice: stridedSlice, - argMax: argMax, - argMin: argMin, - logSumExp: logSumExp, - max: max, - mean: mean, - min: min, - moments: moments, - sum: sum, - unsortedSegmentSum: unsortedSegmentSum, - equal: equal, - equalStrict: equalStrict, - greater: greater, - greaterStrict: greaterStrict, - greaterEqual: greaterEqual, - greaterEqualStrict: greaterEqualStrict, - less: less, - lessStrict: lessStrict, - lessEqual: lessEqual, - lessEqualStrict: lessEqualStrict, - notEqual: notEqual, - notEqualStrict: notEqualStrict, - logicalNot: logicalNot, - logicalAnd: logicalAnd, - logicalOr: logicalOr, - logicalXor: logicalXor, - where: where, - abs: abs, - acos: acos, - acosh: acosh, - asin: asin, - asinh: asinh, - atan: atan, - atanh: atanh, - ceil: ceil, - clipByValue: clipByValue, - cos: cos, - cosh: cosh, - elu: elu, - exp: exp, - expm1: expm1, - floor: floor, - sign: sign, - leakyRelu: leakyRelu, - log: log, - log1p: log1p, - logSigmoid: logSigmoid, - neg: neg, - prelu: prelu, - relu: relu, - reciprocal: reciprocal, - round: round, - selu: selu, - sigmoid: sigmoid, - sin: sin, - sinh: sinh, - softplus: softplus, - sqrt: sqrt, - rsqrt: rsqrt, - square: square, - step: step, - tan: tan, - tanh: tanh$1, - erf: erf, - add: add, - addStrict: addStrict, - atan2: atan2, - div: div, - divStrict: divStrict, - maximum: maximum, - maximumStrict: maximumStrict, - minimum: minimum, - minimumStrict: minimumStrict, - mod: mod, - modStrict: modStrict, - mul: mul, - mulStrict: mulStrict, - pow: pow, - powStrict: powStrict, - sub: sub, - subStrict: subStrict, - squaredDifference: squaredDifference, - squaredDifferenceStrict: squaredDifferenceStrict, - norm: norm, - cast: cast, - clone: clone, - fromPixels: fromPixels, - toPixels: toPixels, - ones: ones, - onesLike: onesLike, - zeros: zeros, - zerosLike: zerosLike, - eye: eye, - rand: rand, - randomNormal: randomNormal, - truncatedNormal: truncatedNormal, - randomUniform: randomUniform, - multinomial: multinomial, - reshape: reshape, - squeeze: squeeze, - tile: tile, - gather: gather, - oneHot: oneHot, - linspace: linspace, - range: range, - buffer: buffer, - fill: fill, - tensor: tensor, - scalar: scalar, - tensor1d: tensor1d, - tensor2d: tensor2d, - tensor3d: tensor3d, - tensor4d: tensor4d, - print: print, - expandDims: expandDims, - stack: stack, - unstack: unstack, - split: split, - cumsum: cumsum, - pad: pad, - pad1d: pad1d, - pad2d: pad2d, - pad3d: pad3d, - pad4d: pad4d, - movingAverage: movingAverage, - basicLSTMCell: basicLSTMCell, - multiRNNCell: multiRNNCell, - softmax: softmax, - localResponseNormalization: localResponseNormalization, - linalg: linalg, - losses: losses, - image: image, - operation: operation, - train: train, - tidy: tidy, - keep: keep, - dispose: dispose, - time: time, - grad: grad, - valueAndGrad: valueAndGrad, - grads: grads, - valueAndGrads: valueAndGrads, - variableGrads: variableGrads, - customGrad: customGrad - }); - - function euclideanDistance(arr1, arr2) { - if (arr1.length !== arr2.length) - throw new Error('euclideanDistance: arr1.length !== arr2.length'); - var desc1 = Array.from(arr1); - var desc2 = Array.from(arr2); - return Math.sqrt(desc1 - .map(function (val, i) { return val - desc2[i]; }) - .reduce(function (res, diff) { return res + Math.pow(diff, 2); }, 0)); - } - - /*! ***************************************************************************** - Copyright (c) Microsoft Corporation. All rights reserved. - Licensed under the Apache License, Version 2.0 (the "License"); you may not use - this file except in compliance with the License. You may obtain a copy of the - License at http://www.apache.org/licenses/LICENSE-2.0 - - THIS CODE IS PROVIDED ON AN *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED - WARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE, - MERCHANTABLITY OR NON-INFRINGEMENT. - - See the Apache Version 2.0 License for specific language governing permissions - and limitations under the License. - ***************************************************************************** */ - - function __awaiter$e(thisArg, _arguments, P, generator) { - return new (P || (P = Promise))(function (resolve, reject) { - function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } - function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } - function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); } - step((generator = generator.apply(thisArg, _arguments || [])).next()); - }); - } - - function __generator$e(thisArg, body) { - var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g; - return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g; - function verb(n) { return function (v) { return step([n, v]); }; } - function step(op) { - if (f) throw new TypeError("Generator is already executing."); - while (_) try { - if (f = 1, y && (t = y[op[0] & 2 ? "return" : op[0] ? "throw" : "next"]) && !(t = t.call(y, op[1])).done) return t; - if (y = 0, t) op = [0, t.value]; - switch (op[0]) { - case 0: case 1: t = op; break; - case 4: _.label++; return { value: op[1], done: false }; - case 5: _.label++; y = op[1]; op = [0]; continue; - case 7: op = _.ops.pop(); _.trys.pop(); continue; - default: - if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; } - if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; } - if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; } - if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; } - if (t[2]) _.ops.pop(); - _.trys.pop(); continue; - } - op = body.call(thisArg, _); - } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; } - if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true }; - } - } - - function isFloat(num) { - return num % 1 !== 0; - } - function isEven(num) { - return num % 2 === 0; - } - function round$1(num) { - return Math.floor(num * 100) / 100; - } - function getElement(arg) { - if (typeof arg === 'string') { - return document.getElementById(arg); - } - return arg; - } - function getContext2dOrThrow(canvas) { - var ctx = canvas.getContext('2d'); - if (!ctx) { - throw new Error('canvas 2d context is null'); - } - return ctx; - } - function createCanvas(_a) { - var width = _a.width, height = _a.height; - var canvas = document.createElement('canvas'); - canvas.width = width; - canvas.height = height; - return canvas; - } - function createCanvasFromMedia(media, dims) { - var _a = dims || getMediaDimensions(media), width = _a.width, height = _a.height; - var canvas = createCanvas({ width: width, height: height }); - getContext2dOrThrow(canvas).drawImage(media, 0, 0, width, height); - return canvas; - } - function getMediaDimensions(media) { - if (media instanceof HTMLImageElement) { - return { width: media.naturalWidth, height: media.naturalHeight }; - } - if (media instanceof HTMLVideoElement) { - return { width: media.videoWidth, height: media.videoHeight }; - } - return media; - } - function bufferToImage(buf) { - return new Promise(function (resolve, reject) { - if (!(buf instanceof Blob)) { - return reject('bufferToImage - expected buf to be of type: Blob'); - } - var reader = new FileReader(); - reader.onload = function () { - var img = new Image(); - img.onload = function () { return resolve(img); }; - img.onerror = reject; - img.src = reader.result; - }; - reader.onerror = reject; - reader.readAsDataURL(buf); - }); - } - function imageTensorToCanvas(imgTensor, canvas) { - return __awaiter$e(this, void 0, void 0, function () { - var targetCanvas, _a, _, height, width, numChannels; - return __generator$e(this, function (_b) { - switch (_b.label) { - case 0: - targetCanvas = canvas || document.createElement('canvas'); - _a = imgTensor.shape, _ = _a[0], height = _a[1], width = _a[2], numChannels = _a[3]; - return [4 /*yield*/, toPixels(imgTensor.as3D(height, width, numChannels).toInt(), targetCanvas)]; - case 1: - _b.sent(); - return [2 /*return*/, targetCanvas]; - } - }); - }); - } - function getDefaultDrawOptions() { - return { - color: 'blue', - lineWidth: 2, - fontSize: 20, - fontStyle: 'Georgia' - }; - } - function drawBox(ctx, x, y, w, h, options) { - var drawOptions = Object.assign(getDefaultDrawOptions(), (options || {})); - ctx.strokeStyle = drawOptions.color; - ctx.lineWidth = drawOptions.lineWidth; - ctx.strokeRect(x, y, w, h); - } - function drawText(ctx, x, y, text, options) { - var drawOptions = Object.assign(getDefaultDrawOptions(), (options || {})); - var padText = 2 + drawOptions.lineWidth; - ctx.fillStyle = drawOptions.color; - ctx.font = drawOptions.fontSize + "px " + drawOptions.fontStyle; - ctx.fillText(text, x + padText, y + padText + (drawOptions.fontSize * 0.6)); - } - function drawDetection(canvasArg, detection, options) { - var canvas = getElement(canvasArg); - if (!(canvas instanceof HTMLCanvasElement)) { - throw new Error('drawBox - expected canvas to be of type: HTMLCanvasElement'); - } - var detectionArray = Array.isArray(detection) - ? detection - : [detection]; - detectionArray.forEach(function (det) { - var _a = det.getBox(), x = _a.x, y = _a.y, width = _a.width, height = _a.height; - var drawOptions = Object.assign(getDefaultDrawOptions(), (options || {})); - var withScore = Object.assign({ withScore: true }, (options || {})).withScore; - var ctx = getContext2dOrThrow(canvas); - drawBox(ctx, x, y, width, height, drawOptions); - if (withScore) { - drawText(ctx, x, y, "" + round$1(det.getScore()), drawOptions); - } - }); - } - function drawContour(ctx, points, isClosed) { - if (isClosed === void 0) { isClosed = false; } - ctx.beginPath(); - points.slice(1).forEach(function (_a, prevIdx) { - var x = _a.x, y = _a.y; - var from = points[prevIdx]; - ctx.moveTo(from.x, from.y); - ctx.lineTo(x, y); - }); - if (isClosed) { - var from = points[points.length - 1]; - var to = points[0]; - if (!from || !to) { - return; - } - ctx.moveTo(from.x, from.y); - ctx.lineTo(to.x, to.y); - } - ctx.stroke(); - } - function drawLandmarks(canvasArg, faceLandmarks, options) { - var canvas = getElement(canvasArg); - if (!(canvas instanceof HTMLCanvasElement)) { - throw new Error('drawLandmarks - expected canvas to be of type: HTMLCanvasElement'); - } - var drawOptions = Object.assign(getDefaultDrawOptions(), (options || {})); - var drawLines = Object.assign({ drawLines: false }, (options || {})).drawLines; - var ctx = getContext2dOrThrow(canvas); - var lineWidth = drawOptions.lineWidth, color = drawOptions.color; - if (drawLines) { - ctx.strokeStyle = color; - ctx.lineWidth = lineWidth; - drawContour(ctx, faceLandmarks.getJawOutline()); - drawContour(ctx, faceLandmarks.getLeftEyeBrow()); - drawContour(ctx, faceLandmarks.getRightEyeBrow()); - drawContour(ctx, faceLandmarks.getNose()); - drawContour(ctx, faceLandmarks.getLeftEye(), true); - drawContour(ctx, faceLandmarks.getRightEye(), true); - drawContour(ctx, faceLandmarks.getMouth(), true); - return; - } - // else draw points - var ptOffset = lineWidth / 2; - ctx.fillStyle = color; - faceLandmarks.getPositions().forEach(function (pt) { return ctx.fillRect(pt.x - ptOffset, pt.y - ptOffset, lineWidth, lineWidth); }); - } - - var NetInput = /** @class */ (function () { - function NetInput(mediaArg, dims) { - var _this = this; - var mediaArgArray = Array.isArray(mediaArg) - ? mediaArg - : [mediaArg]; - if (!mediaArgArray.length) { - throw new Error('NetInput - empty array passed as input'); - } - var medias = mediaArgArray.map(getElement); - medias.forEach(function (media, i) { - if (!(media instanceof HTMLImageElement || media instanceof HTMLVideoElement || media instanceof HTMLCanvasElement)) { - var idxHint = Array.isArray(mediaArg) ? " at input index " + i + ":" : ''; - if (typeof mediaArgArray[i] === 'string') { - throw new Error("NetInput -" + idxHint + " string passed, but could not resolve HTMLElement for element id"); - } - throw new Error("NetInput -" + idxHint + " expected media to be of type HTMLImageElement | HTMLVideoElement | HTMLCanvasElement, or to be an element id"); - } - }); - this._canvases = []; - medias.forEach(function (m) { return _this.initCanvas(m, dims); }); - } - NetInput.prototype.initCanvas = function (media, dims) { - if (media instanceof HTMLCanvasElement) { - this._canvases.push(media); - return; - } - // if input is batch type, make sure every canvas has the same dimensions - var canvasDims = this.dims || dims; - this._canvases.push(createCanvasFromMedia(media, canvasDims)); - }; - Object.defineProperty(NetInput.prototype, "canvases", { - get: function () { - return this._canvases; - }, - enumerable: true, - configurable: true - }); - Object.defineProperty(NetInput.prototype, "width", { - get: function () { - return (this._canvases[0] || {}).width; - }, - enumerable: true, - configurable: true - }); - Object.defineProperty(NetInput.prototype, "height", { - get: function () { - return (this._canvases[0] || {}).height; - }, - enumerable: true, - configurable: true - }); - Object.defineProperty(NetInput.prototype, "dims", { - get: function () { - var _a = this, width = _a.width, height = _a.height; - return (width > 0 && height > 0) ? { width: width, height: height } : null; - }, - enumerable: true, - configurable: true - }); - return NetInput; - }()); - - function getImageTensor(input) { - return tidy(function () { - if (input instanceof Tensor) { - var rank = input.shape.length; - if (rank !== 3 && rank !== 4) { - throw new Error('input tensor must be of rank 3 or 4'); - } - return (rank === 3 ? input.expandDims(0) : input).toFloat(); - } - var netInput = input instanceof NetInput ? input : new NetInput(input); - return concat(netInput.canvases.map(function (canvas) { - return fromPixels(canvas).expandDims(0).toFloat(); - })); - }); - } - - /** - * Pads the smaller dimension of an image tensor with zeros, such that width === height. - * - * @param imgTensor The image tensor. - * @param isCenterImage (optional, default: false) If true, add padding on both sides of the image, such that the image. - * @returns The padded tensor with width === height. - */ - function padToSquare(imgTensor, isCenterImage) { - if (isCenterImage === void 0) { isCenterImage = false; } - return tidy(function () { - var _a = imgTensor.shape.slice(1), height = _a[0], width = _a[1]; - if (height === width) { - return imgTensor; - } - var dimDiff = Math.abs(height - width); - var paddingAmount = Math.floor(dimDiff * (isCenterImage ? 0.5 : 1)); - var paddingAxis = height > width ? 2 : 1; - var getPaddingTensorShape = function (isRoundUp) { - if (isRoundUp === void 0) { isRoundUp = false; } - var paddingTensorShape = imgTensor.shape.slice(); - paddingTensorShape[paddingAxis] = paddingAmount + (isRoundUp ? 1 : 0); - return paddingTensorShape; - }; - var tensorsToStack = (isCenterImage ? [fill(getPaddingTensorShape(!isEven(dimDiff)), 0)] : []) - .concat([imgTensor, fill(getPaddingTensorShape(), 0)]); - return concat(tensorsToStack, paddingAxis); - }); - } - - function extractWeightsFactory(weights) { - var remainingWeights = weights; - function extractWeights(numWeights) { - var ret = remainingWeights.slice(0, numWeights); - remainingWeights = remainingWeights.slice(numWeights); - return ret; - } - function getRemainingWeights() { - return remainingWeights; - } - return { - extractWeights: extractWeights, - getRemainingWeights: getRemainingWeights - }; - } - - function extractorsFactory(extractWeights) { - function extractDepthwiseConvParams(numChannels) { - var filters = tensor4d(extractWeights(3 * 3 * numChannels), [3, 3, numChannels, 1]); - var batch_norm_scale = tensor1d(extractWeights(numChannels)); - var batch_norm_offset = tensor1d(extractWeights(numChannels)); - var batch_norm_mean = tensor1d(extractWeights(numChannels)); - var batch_norm_variance = tensor1d(extractWeights(numChannels)); - return { - filters: filters, - batch_norm_scale: batch_norm_scale, - batch_norm_offset: batch_norm_offset, - batch_norm_mean: batch_norm_mean, - batch_norm_variance: batch_norm_variance - }; - } - function extractConvParams(channelsIn, channelsOut, filterSize) { - var filters = tensor4d(extractWeights(channelsIn * channelsOut * filterSize * filterSize), [filterSize, filterSize, channelsIn, channelsOut]); - var bias = tensor1d(extractWeights(channelsOut)); - return { - filters: filters, - bias: bias - }; - } - function extractPointwiseConvParams(channelsIn, channelsOut, filterSize) { - var _a = extractConvParams(channelsIn, channelsOut, filterSize), filters = _a.filters, bias = _a.bias; - return { - filters: filters, - batch_norm_offset: bias - }; - } - function extractConvPairParams(channelsIn, channelsOut) { - var depthwise_conv_params = extractDepthwiseConvParams(channelsIn); - var pointwise_conv_params = extractPointwiseConvParams(channelsIn, channelsOut, 1); - return { - depthwise_conv_params: depthwise_conv_params, - pointwise_conv_params: pointwise_conv_params - }; - } - function extractMobilenetV1Params() { - var conv_0_params = extractPointwiseConvParams(3, 32, 3); - var channelNumPairs = [ - [32, 64], - [64, 128], - [128, 128], - [128, 256], - [256, 256], - [256, 512], - [512, 512], - [512, 512], - [512, 512], - [512, 512], - [512, 512], - [512, 1024], - [1024, 1024] - ]; - var conv_pair_params = channelNumPairs.map(function (_a) { - var channelsIn = _a[0], channelsOut = _a[1]; - return extractConvPairParams(channelsIn, channelsOut); - }); - return { - conv_0_params: conv_0_params, - conv_pair_params: conv_pair_params - }; - } - function extractPredictionLayerParams() { - var conv_0_params = extractPointwiseConvParams(1024, 256, 1); - var conv_1_params = extractPointwiseConvParams(256, 512, 3); - var conv_2_params = extractPointwiseConvParams(512, 128, 1); - var conv_3_params = extractPointwiseConvParams(128, 256, 3); - var conv_4_params = extractPointwiseConvParams(256, 128, 1); - var conv_5_params = extractPointwiseConvParams(128, 256, 3); - var conv_6_params = extractPointwiseConvParams(256, 64, 1); - var conv_7_params = extractPointwiseConvParams(64, 128, 3); - var box_encoding_0_predictor_params = extractConvParams(512, 12, 1); - var class_predictor_0_params = extractConvParams(512, 9, 1); - var box_encoding_1_predictor_params = extractConvParams(1024, 24, 1); - var class_predictor_1_params = extractConvParams(1024, 18, 1); - var box_encoding_2_predictor_params = extractConvParams(512, 24, 1); - var class_predictor_2_params = extractConvParams(512, 18, 1); - var box_encoding_3_predictor_params = extractConvParams(256, 24, 1); - var class_predictor_3_params = extractConvParams(256, 18, 1); - var box_encoding_4_predictor_params = extractConvParams(256, 24, 1); - var class_predictor_4_params = extractConvParams(256, 18, 1); - var box_encoding_5_predictor_params = extractConvParams(128, 24, 1); - var class_predictor_5_params = extractConvParams(128, 18, 1); - var box_predictor_0_params = { - box_encoding_predictor_params: box_encoding_0_predictor_params, - class_predictor_params: class_predictor_0_params - }; - var box_predictor_1_params = { - box_encoding_predictor_params: box_encoding_1_predictor_params, - class_predictor_params: class_predictor_1_params - }; - var box_predictor_2_params = { - box_encoding_predictor_params: box_encoding_2_predictor_params, - class_predictor_params: class_predictor_2_params - }; - var box_predictor_3_params = { - box_encoding_predictor_params: box_encoding_3_predictor_params, - class_predictor_params: class_predictor_3_params - }; - var box_predictor_4_params = { - box_encoding_predictor_params: box_encoding_4_predictor_params, - class_predictor_params: class_predictor_4_params - }; - var box_predictor_5_params = { - box_encoding_predictor_params: box_encoding_5_predictor_params, - class_predictor_params: class_predictor_5_params - }; - return { - conv_0_params: conv_0_params, - conv_1_params: conv_1_params, - conv_2_params: conv_2_params, - conv_3_params: conv_3_params, - conv_4_params: conv_4_params, - conv_5_params: conv_5_params, - conv_6_params: conv_6_params, - conv_7_params: conv_7_params, - box_predictor_0_params: box_predictor_0_params, - box_predictor_1_params: box_predictor_1_params, - box_predictor_2_params: box_predictor_2_params, - box_predictor_3_params: box_predictor_3_params, - box_predictor_4_params: box_predictor_4_params, - box_predictor_5_params: box_predictor_5_params - }; - } - return { - extractMobilenetV1Params: extractMobilenetV1Params, - extractPredictionLayerParams: extractPredictionLayerParams - }; - } - function extractParams(weights) { - var _a = extractWeightsFactory(weights), extractWeights = _a.extractWeights, getRemainingWeights = _a.getRemainingWeights; - var _b = extractorsFactory(extractWeights), extractMobilenetV1Params = _b.extractMobilenetV1Params, extractPredictionLayerParams = _b.extractPredictionLayerParams; - var mobilenetv1_params = extractMobilenetV1Params(); - var prediction_layer_params = extractPredictionLayerParams(); - var extra_dim = tensor3d(extractWeights(5118 * 4), [1, 5118, 4]); - var output_layer_params = { - extra_dim: extra_dim - }; - if (getRemainingWeights().length !== 0) { - throw new Error("weights remaing after extract: " + getRemainingWeights().length); - } - return { - mobilenetv1_params: mobilenetv1_params, - prediction_layer_params: prediction_layer_params, - output_layer_params: output_layer_params - }; - } - - var Rect = /** @class */ (function () { - function Rect(x, y, width, height) { - this.x = x; - this.y = y; - this.width = width; - this.height = height; - } - Rect.prototype.floor = function () { - return new Rect(Math.floor(this.x), Math.floor(this.y), Math.floor(this.width), Math.floor(this.height)); - }; - return Rect; - }()); - - var FaceDetection = /** @class */ (function () { - function FaceDetection(score, relativeBox, imageDims) { - var width = imageDims.width, height = imageDims.height; - this._imageWidth = width; - this._imageHeight = height; - this._score = score; - this._box = new Rect(relativeBox.x * width, relativeBox.y * height, relativeBox.width * width, relativeBox.height * height); - } - FaceDetection.prototype.getScore = function () { - return this._score; - }; - FaceDetection.prototype.getBox = function () { - return this._box; - }; - FaceDetection.prototype.getImageWidth = function () { - return this._imageWidth; - }; - FaceDetection.prototype.getImageHeight = function () { - return this._imageHeight; - }; - FaceDetection.prototype.getRelativeBox = function () { - return new Rect(this._box.x / this._imageWidth, this._box.y / this._imageHeight, this._box.width / this._imageWidth, this._box.height / this._imageHeight); - }; - FaceDetection.prototype.forSize = function (width, height) { - return new FaceDetection(this._score, this.getRelativeBox(), { width: width, height: height }); - }; - return FaceDetection; - }()); - - function pointwiseConvLayer(x, params, strides) { - return tidy(function () { - var out = conv2d(x, params.filters, strides, 'same'); - out = add(out, params.batch_norm_offset); - return clipByValue(out, 0, 6); - }); - } - - var epsilon = 0.0010000000474974513; - function depthwiseConvLayer(x, params, strides) { - return tidy(function () { - var out = depthwiseConv2d(x, params.filters, strides, 'same'); - out = batchNormalization(out, params.batch_norm_mean, params.batch_norm_variance, epsilon, params.batch_norm_scale, params.batch_norm_offset); - return clipByValue(out, 0, 6); - }); - } - function getStridesForLayerIdx(layerIdx) { - return [2, 4, 6, 12].some(function (idx) { return idx === layerIdx; }) ? [2, 2] : [1, 1]; - } - function mobileNetV1(x, params) { - return tidy(function () { - var conv11 = null; - var out = pointwiseConvLayer(x, params.conv_0_params, [2, 2]); - params.conv_pair_params.forEach(function (param, i) { - var layerIdx = i + 1; - var depthwiseConvStrides = getStridesForLayerIdx(layerIdx); - out = depthwiseConvLayer(out, param.depthwise_conv_params, depthwiseConvStrides); - out = pointwiseConvLayer(out, param.pointwise_conv_params, [1, 1]); - if (layerIdx === 11) { - conv11 = out; - } - }); - if (conv11 === null) { - throw new Error('mobileNetV1 - output of conv layer 11 is null'); - } - return { - out: out, - conv11: conv11 - }; - }); - } - - function nonMaxSuppression(boxes, scores, maxOutputSize, iouThreshold, scoreThreshold) { - var numBoxes = boxes.shape[0]; - var outputSize = Math.min(maxOutputSize, numBoxes); - var candidates = scores - .map(function (score, boxIndex) { return ({ score: score, boxIndex: boxIndex }); }) - .filter(function (c) { return c.score > scoreThreshold; }) - .sort(function (c1, c2) { return c2.score - c1.score; }); - var suppressFunc = function (x) { return x <= iouThreshold ? 1 : 0; }; - var selected = []; - candidates.forEach(function (c) { - if (selected.length >= outputSize) { - return; - } - var originalScore = c.score; - for (var j = selected.length - 1; j >= 0; --j) { - var iou = IOU(boxes, c.boxIndex, selected[j]); - if (iou === 0.0) { - continue; - } - c.score *= suppressFunc(iou); - if (c.score <= scoreThreshold) { - break; - } - } - if (originalScore === c.score) { - selected.push(c.boxIndex); - } - }); - return selected; - } - function IOU(boxes, i, j) { - var yminI = Math.min(boxes.get(i, 0), boxes.get(i, 2)); - var xminI = Math.min(boxes.get(i, 1), boxes.get(i, 3)); - var ymaxI = Math.max(boxes.get(i, 0), boxes.get(i, 2)); - var xmaxI = Math.max(boxes.get(i, 1), boxes.get(i, 3)); - var yminJ = Math.min(boxes.get(j, 0), boxes.get(j, 2)); - var xminJ = Math.min(boxes.get(j, 1), boxes.get(j, 3)); - var ymaxJ = Math.max(boxes.get(j, 0), boxes.get(j, 2)); - var xmaxJ = Math.max(boxes.get(j, 1), boxes.get(j, 3)); - var areaI = (ymaxI - yminI) * (xmaxI - xminI); - var areaJ = (ymaxJ - yminJ) * (xmaxJ - xminJ); - if (areaI <= 0 || areaJ <= 0) { - return 0.0; - } - var intersectionYmin = Math.max(yminI, yminJ); - var intersectionXmin = Math.max(xminI, xminJ); - var intersectionYmax = Math.min(ymaxI, ymaxJ); - var intersectionXmax = Math.min(xmaxI, xmaxJ); - var intersectionArea = Math.max(intersectionYmax - intersectionYmin, 0.0) * - Math.max(intersectionXmax - intersectionXmin, 0.0); - return intersectionArea / (areaI + areaJ - intersectionArea); - } - - function getCenterCoordinatesAndSizesLayer(x) { - var vec = unstack(transpose(x, [1, 0])); - var sizes = [ - sub(vec[2], vec[0]), - sub(vec[3], vec[1]) - ]; - var centers = [ - add(vec[0], div(sizes[0], scalar(2))), - add(vec[1], div(sizes[1], scalar(2))) - ]; - return { - sizes: sizes, - centers: centers - }; - } - function decodeBoxesLayer(x0, x1) { - var _a = getCenterCoordinatesAndSizesLayer(x0), sizes = _a.sizes, centers = _a.centers; - var vec = unstack(transpose(x1, [1, 0])); - var div0_out = div(mul(exp(div(vec[2], scalar(5))), sizes[0]), scalar(2)); - var add0_out = add(mul(div(vec[0], scalar(10)), sizes[0]), centers[0]); - var div1_out = div(mul(exp(div(vec[3], scalar(5))), sizes[1]), scalar(2)); - var add1_out = add(mul(div(vec[1], scalar(10)), sizes[1]), centers[1]); - return transpose(stack([ - sub(add0_out, div0_out), - sub(add1_out, div1_out), - add(add0_out, div0_out), - add(add1_out, div1_out) - ]), [1, 0]); - } - function outputLayer(boxPredictions, classPredictions, params) { - return tidy(function () { - var batchSize = boxPredictions.shape[0]; - var boxes = decodeBoxesLayer(reshape(tile(params.extra_dim, [batchSize, 1, 1]), [-1, 4]), reshape(boxPredictions, [-1, 4])); - boxes = reshape(boxes, [batchSize, (boxes.shape[0] / batchSize), 4]); - var scoresAndClasses = sigmoid(slice(classPredictions, [0, 0, 1], [-1, -1, -1])); - var scores = slice(scoresAndClasses, [0, 0, 0], [-1, -1, 1]); - scores = reshape(scores, [batchSize, scores.shape[1]]); - var boxesByBatch = unstack(boxes); - var scoresByBatch = unstack(scores); - return { - boxes: boxesByBatch, - scores: scoresByBatch - }; - }); - } - - function convLayer(x, params, padding, withRelu) { - if (padding === void 0) { padding = 'same'; } - if (withRelu === void 0) { withRelu = false; } - return tidy(function () { - var out = add(conv2d(x, params.filters, [1, 1], padding), params.bias); - return withRelu ? relu(out) : out; - }); - } - - function boxPredictionLayer(x, params) { - return tidy(function () { - var batchSize = x.shape[0]; - var boxPredictionEncoding = reshape(convLayer(x, params.box_encoding_predictor_params), [batchSize, -1, 1, 4]); - var classPrediction = reshape(convLayer(x, params.class_predictor_params), [batchSize, -1, 3]); - return { - boxPredictionEncoding: boxPredictionEncoding, - classPrediction: classPrediction - }; - }); - } - - function predictionLayer(x, conv11, params) { - return tidy(function () { - var conv0 = pointwiseConvLayer(x, params.conv_0_params, [1, 1]); - var conv1 = pointwiseConvLayer(conv0, params.conv_1_params, [2, 2]); - var conv2 = pointwiseConvLayer(conv1, params.conv_2_params, [1, 1]); - var conv3 = pointwiseConvLayer(conv2, params.conv_3_params, [2, 2]); - var conv4 = pointwiseConvLayer(conv3, params.conv_4_params, [1, 1]); - var conv5 = pointwiseConvLayer(conv4, params.conv_5_params, [2, 2]); - var conv6 = pointwiseConvLayer(conv5, params.conv_6_params, [1, 1]); - var conv7 = pointwiseConvLayer(conv6, params.conv_7_params, [2, 2]); - var boxPrediction0 = boxPredictionLayer(conv11, params.box_predictor_0_params); - var boxPrediction1 = boxPredictionLayer(x, params.box_predictor_1_params); - var boxPrediction2 = boxPredictionLayer(conv1, params.box_predictor_2_params); - var boxPrediction3 = boxPredictionLayer(conv3, params.box_predictor_3_params); - var boxPrediction4 = boxPredictionLayer(conv5, params.box_predictor_4_params); - var boxPrediction5 = boxPredictionLayer(conv7, params.box_predictor_5_params); - var boxPredictions = concat([ - boxPrediction0.boxPredictionEncoding, - boxPrediction1.boxPredictionEncoding, - boxPrediction2.boxPredictionEncoding, - boxPrediction3.boxPredictionEncoding, - boxPrediction4.boxPredictionEncoding, - boxPrediction5.boxPredictionEncoding - ], 1); - var classPredictions = concat([ - boxPrediction0.classPrediction, - boxPrediction1.classPrediction, - boxPrediction2.classPrediction, - boxPrediction3.classPrediction, - boxPrediction4.classPrediction, - boxPrediction5.classPrediction - ], 1); - return { - boxPredictions: boxPredictions, - classPredictions: classPredictions - }; - }); - } - - var resizedImageSize = [512, 512]; - var weight = scalar(0.007843137718737125); - var bias = scalar(1); - function resizeLayer(x) { - return tidy(function () { - var resized = image.resizeBilinear(x, resizedImageSize, false); - return sub(mul(resized, weight), bias); - }); - } - - function faceDetectionNet(weights) { - var params = extractParams(weights); - function forwardTensor(imgTensor) { - return tidy(function () { - var resized = resizeLayer(imgTensor); - var features = mobileNetV1(resized, params.mobilenetv1_params); - var _a = predictionLayer(features.out, features.conv11, params.prediction_layer_params), boxPredictions = _a.boxPredictions, classPredictions = _a.classPredictions; - return outputLayer(boxPredictions, classPredictions, params.output_layer_params); - }); - } - function forward(input) { - return tidy(function () { return forwardTensor(padToSquare(getImageTensor(input))); }); - } - function locateFaces(input, minConfidence, maxResults) { - if (minConfidence === void 0) { minConfidence = 0.8; } - if (maxResults === void 0) { maxResults = 100; } - return __awaiter$e(this, void 0, void 0, function () { - var paddedHeightRelative, paddedWidthRelative, imageDimensions, _a, _boxes, _scores, boxes, scores, i, scoresData, _b, _c, iouThreshold, indices, results; - return __generator$e(this, function (_d) { - switch (_d.label) { - case 0: - paddedHeightRelative = 1, paddedWidthRelative = 1; - _a = tidy(function () { - var imgTensor = getImageTensor(input); - var _a = imgTensor.shape.slice(1), height = _a[0], width = _a[1]; - imageDimensions = { width: width, height: height }; - imgTensor = padToSquare(imgTensor); - paddedHeightRelative = imgTensor.shape[1] / height; - paddedWidthRelative = imgTensor.shape[2] / width; - return forwardTensor(imgTensor); - }), _boxes = _a.boxes, _scores = _a.scores; - boxes = _boxes[0]; - scores = _scores[0]; - for (i = 1; i < _boxes.length; i++) { - _boxes[i].dispose(); - _scores[i].dispose(); - } - _c = (_b = Array).from; - return [4 /*yield*/, scores.data()]; - case 1: - scoresData = _c.apply(_b, [_d.sent()]); - iouThreshold = 0.5; - indices = nonMaxSuppression(boxes, scoresData, maxResults, iouThreshold, minConfidence); - results = indices - .map(function (idx) { - var _a = [ - Math.max(0, boxes.get(idx, 0)), - Math.min(1.0, boxes.get(idx, 2)) - ].map(function (val) { return val * paddedHeightRelative; }), top = _a[0], bottom = _a[1]; - var _b = [ - Math.max(0, boxes.get(idx, 1)), - Math.min(1.0, boxes.get(idx, 3)) - ].map(function (val) { return val * paddedWidthRelative; }), left = _b[0], right = _b[1]; - return new FaceDetection(scoresData[idx], new Rect(left, top, right - left, bottom - top), imageDimensions); - }); - boxes.dispose(); - scores.dispose(); - return [2 /*return*/, results]; - } - }); - }); - } - return { - forward: forward, - locateFaces: locateFaces - }; - } - - var Point = /** @class */ (function () { - function Point(x, y) { - this.x = x; - this.y = y; - } - Point.prototype.add = function (pt) { - return new Point(this.x + pt.x, this.y + pt.y); - }; - Point.prototype.sub = function (pt) { - return new Point(this.x - pt.x, this.y - pt.y); - }; - Point.prototype.mul = function (pt) { - return new Point(this.x * pt.x, this.y * pt.y); - }; - Point.prototype.div = function (pt) { - return new Point(this.x / pt.x, this.y / pt.y); - }; - Point.prototype.abs = function () { - return new Point(Math.abs(this.x), Math.abs(this.y)); - }; - Point.prototype.magnitude = function () { - return Math.sqrt(Math.pow(this.x, 2) + Math.pow(this.y, 2)); - }; - Point.prototype.floor = function () { - return new Point(Math.floor(this.x), Math.floor(this.y)); - }; - return Point; - }()); - - function extractConvParamsFactory(extractWeights) { - return function (channelsIn, channelsOut, filterSize) { - var filters = tensor4d(extractWeights(channelsIn * channelsOut * filterSize * filterSize), [filterSize, filterSize, channelsIn, channelsOut]); - var bias = tensor1d(extractWeights(channelsOut)); - return { - filters: filters, - bias: bias - }; - }; - } - - function extractParams$1(weights) { - var _a = extractWeightsFactory(weights), extractWeights = _a.extractWeights, getRemainingWeights = _a.getRemainingWeights; - var extractConvParams = extractConvParamsFactory(extractWeights); - function extractFcParams(channelsIn, channelsOut) { - var fc_weights = tensor2d(extractWeights(channelsIn * channelsOut), [channelsIn, channelsOut]); - var fc_bias = tensor1d(extractWeights(channelsOut)); - return { - weights: fc_weights, - bias: fc_bias - }; - } - var conv0_params = extractConvParams(3, 32, 3); - var conv1_params = extractConvParams(32, 64, 3); - var conv2_params = extractConvParams(64, 64, 3); - var conv3_params = extractConvParams(64, 64, 3); - var conv4_params = extractConvParams(64, 64, 3); - var conv5_params = extractConvParams(64, 128, 3); - var conv6_params = extractConvParams(128, 128, 3); - var conv7_params = extractConvParams(128, 256, 3); - var fc0_params = extractFcParams(6400, 1024); - var fc1_params = extractFcParams(1024, 136); - if (getRemainingWeights().length !== 0) { - throw new Error("weights remaing after extract: " + getRemainingWeights().length); - } - return { - conv0_params: conv0_params, - conv1_params: conv1_params, - conv2_params: conv2_params, - conv3_params: conv3_params, - conv4_params: conv4_params, - conv5_params: conv5_params, - conv6_params: conv6_params, - conv7_params: conv7_params, - fc0_params: fc0_params, - fc1_params: fc1_params - }; - } - - function getCenterPoint(pts) { - return pts.reduce(function (sum, pt) { return sum.add(pt); }, new Point(0, 0)) - .div(new Point(pts.length, pts.length)); - } - - // face alignment constants - var relX = 0.5; - var relY = 0.43; - var relScale = 0.45; - var FaceLandmarks = /** @class */ (function () { - function FaceLandmarks(relativeFaceLandmarkPositions, imageDims, shift) { - if (shift === void 0) { shift = new Point(0, 0); } - var width = imageDims.width, height = imageDims.height; - this._imageWidth = width; - this._imageHeight = height; - this._shift = shift; - this._faceLandmarks = relativeFaceLandmarkPositions.map(function (pt) { return pt.mul(new Point(width, height)).add(shift); }); - } - FaceLandmarks.prototype.getShift = function () { - return new Point(this._shift.x, this._shift.y); - }; - FaceLandmarks.prototype.getImageWidth = function () { - return this._imageWidth; - }; - FaceLandmarks.prototype.getImageHeight = function () { - return this._imageHeight; - }; - FaceLandmarks.prototype.getPositions = function () { - return this._faceLandmarks; - }; - FaceLandmarks.prototype.getRelativePositions = function () { - var _this = this; - return this._faceLandmarks.map(function (pt) { return pt.sub(_this._shift).div(new Point(_this._imageWidth, _this._imageHeight)); }); - }; - FaceLandmarks.prototype.getJawOutline = function () { - return this._faceLandmarks.slice(0, 17); - }; - FaceLandmarks.prototype.getLeftEyeBrow = function () { - return this._faceLandmarks.slice(17, 22); - }; - FaceLandmarks.prototype.getRightEyeBrow = function () { - return this._faceLandmarks.slice(22, 27); - }; - FaceLandmarks.prototype.getNose = function () { - return this._faceLandmarks.slice(27, 36); - }; - FaceLandmarks.prototype.getLeftEye = function () { - return this._faceLandmarks.slice(36, 42); - }; - FaceLandmarks.prototype.getRightEye = function () { - return this._faceLandmarks.slice(42, 48); - }; - FaceLandmarks.prototype.getMouth = function () { - return this._faceLandmarks.slice(48, 68); - }; - FaceLandmarks.prototype.forSize = function (width, height) { - return new FaceLandmarks(this.getRelativePositions(), { width: width, height: height }); - }; - FaceLandmarks.prototype.shift = function (x, y) { - return new FaceLandmarks(this.getRelativePositions(), { width: this._imageWidth, height: this._imageHeight }, new Point(x, y)); - }; - /** - * Aligns the face landmarks after face detection from the relative positions of the faces - * bounding box, or it's current shift. This function should be used to align the face images - * after face detection has been performed, before they are passed to the face recognition net. - * This will make the computed face descriptor more accurate. - * - * @param detection (optional) The bounding box of the face or the face detection result. If - * no argument was passed the position of the face landmarks are assumed to be relative to - * it's current shift. - * @returns The bounding box of the aligned face. - */ - FaceLandmarks.prototype.align = function (detection) { - if (detection) { - var box = detection instanceof FaceDetection - ? detection.getBox().floor() - : detection; - return this.shift(box.x, box.y).align(); - } - var centers = [ - this.getLeftEye(), - this.getRightEye(), - this.getMouth() - ].map(getCenterPoint); - var leftEyeCenter = centers[0], rightEyeCenter = centers[1], mouthCenter = centers[2]; - var distToMouth = function (pt) { return mouthCenter.sub(pt).magnitude(); }; - var eyeToMouthDist = (distToMouth(leftEyeCenter) + distToMouth(rightEyeCenter)) / 2; - var size = Math.floor(eyeToMouthDist / relScale); - var refPoint = getCenterPoint(centers); - // TODO: pad in case rectangle is out of image bounds - var x = Math.floor(Math.max(0, refPoint.x - (relX * size))); - var y = Math.floor(Math.max(0, refPoint.y - (relY * size))); - return new Rect(x, y, size, size); - }; - return FaceLandmarks; - }()); - - function fullyConnectedLayer(x, params) { - return tidy(function () { - return add(matMul(x, params.weights), params.bias); - }); - } - - function conv(x, params) { - return convLayer(x, params, 'valid', true); - } - function maxPool$1(x, strides) { - if (strides === void 0) { strides = [2, 2]; } - return maxPool(x, [2, 2], strides, 'valid'); - } - function faceLandmarkNet(weights) { - var params = extractParams$1(weights); - function detectLandmarks(input) { - return __awaiter$e(this, void 0, void 0, function () { - var imageDimensions, outTensor, faceLandmarksArray, _a, _b, xCoords, yCoords; - return __generator$e(this, function (_c) { - switch (_c.label) { - case 0: - outTensor = tidy(function () { - var imgTensor = getImageTensor(input); - var _a = imgTensor.shape.slice(1), height = _a[0], width = _a[1]; - imageDimensions = { width: width, height: height }; - // work with 128 x 128 sized face images - if (imgTensor.shape[1] !== 128 || imgTensor.shape[2] !== 128) { - imgTensor = image.resizeBilinear(imgTensor, [128, 128]); - } - var out = conv(imgTensor, params.conv0_params); - out = maxPool$1(out); - out = conv(out, params.conv1_params); - out = conv(out, params.conv2_params); - out = maxPool$1(out); - out = conv(out, params.conv3_params); - out = conv(out, params.conv4_params); - out = maxPool$1(out); - out = conv(out, params.conv5_params); - out = conv(out, params.conv6_params); - out = maxPool$1(out, [1, 1]); - out = conv(out, params.conv7_params); - var fc0 = relu(fullyConnectedLayer(out.as2D(out.shape[0], -1), params.fc0_params)); - var fc1 = fullyConnectedLayer(fc0, params.fc1_params); - return fc1; - }); - _b = (_a = Array).from; - return [4 /*yield*/, outTensor.data()]; - case 1: - faceLandmarksArray = _b.apply(_a, [_c.sent()]); - outTensor.dispose(); - xCoords = faceLandmarksArray.filter(function (c, i) { return (i - 1) % 2; }); - yCoords = faceLandmarksArray.filter(function (c, i) { return i % 2; }); - return [2 /*return*/, new FaceLandmarks(Array(68).fill(0).map(function (_, i) { return new Point(xCoords[i], yCoords[i]); }), imageDimensions)]; - } - }); - }); - } - return { - detectLandmarks: detectLandmarks - }; - } - - function scale(x, params) { - return add(mul(x, params.weights), params.biases); - } - - function convLayer$1(x, params, strides, withRelu, padding) { - if (padding === void 0) { padding = 'same'; } - var _a = params.conv, filters = _a.filters, bias = _a.bias; - var out = conv2d(x, filters, strides, padding); - out = add(out, bias); - out = scale(out, params.scale); - return withRelu ? relu(out) : out; - } - function conv$1(x, params) { - return convLayer$1(x, params, [1, 1], true); - } - function convNoRelu(x, params) { - return convLayer$1(x, params, [1, 1], false); - } - function convDown(x, params) { - return convLayer$1(x, params, [2, 2], true, 'valid'); - } - - function extractorsFactory$1(extractWeights) { - function extractFilterValues(numFilterValues, numFilters, filterSize) { - var weights = extractWeights(numFilterValues); - var depth = weights.length / (numFilters * filterSize * filterSize); - if (isFloat(depth)) { - throw new Error("depth has to be an integer: " + depth + ", weights.length: " + weights.length + ", numFilters: " + numFilters + ", filterSize: " + filterSize); - } - return transpose(tensor4d(weights, [numFilters, depth, filterSize, filterSize]), [2, 3, 1, 0]); - } - function extractScaleLayerParams(numWeights) { - var weights = tensor1d(extractWeights(numWeights)); - var biases = tensor1d(extractWeights(numWeights)); - return { - weights: weights, - biases: biases - }; - } - function extractConvLayerParams(numFilterValues, numFilters, filterSize) { - var conv_filters = extractFilterValues(numFilterValues, numFilters, filterSize); - var conv_bias = tensor1d(extractWeights(numFilters)); - var scale = extractScaleLayerParams(numFilters); - return { - conv: { - filters: conv_filters, - bias: conv_bias - }, - scale: scale - }; - } - function extractResidualLayerParams(numFilterValues, numFilters, filterSize, isDown) { - if (isDown === void 0) { isDown = false; } - var conv1 = extractConvLayerParams((isDown ? 0.5 : 1) * numFilterValues, numFilters, filterSize); - var conv2 = extractConvLayerParams(numFilterValues, numFilters, filterSize); - return { - conv1: conv1, - conv2: conv2 - }; - } - return { - extractConvLayerParams: extractConvLayerParams, - extractResidualLayerParams: extractResidualLayerParams - }; - } - function extractParams$2(weights) { - var _a = extractWeightsFactory(weights), extractWeights = _a.extractWeights, getRemainingWeights = _a.getRemainingWeights; - var _b = extractorsFactory$1(extractWeights), extractConvLayerParams = _b.extractConvLayerParams, extractResidualLayerParams = _b.extractResidualLayerParams; - var conv32_down = extractConvLayerParams(4704, 32, 7); - var conv32_1 = extractResidualLayerParams(9216, 32, 3); - var conv32_2 = extractResidualLayerParams(9216, 32, 3); - var conv32_3 = extractResidualLayerParams(9216, 32, 3); - var conv64_down = extractResidualLayerParams(36864, 64, 3, true); - var conv64_1 = extractResidualLayerParams(36864, 64, 3); - var conv64_2 = extractResidualLayerParams(36864, 64, 3); - var conv64_3 = extractResidualLayerParams(36864, 64, 3); - var conv128_down = extractResidualLayerParams(147456, 128, 3, true); - var conv128_1 = extractResidualLayerParams(147456, 128, 3); - var conv128_2 = extractResidualLayerParams(147456, 128, 3); - var conv256_down = extractResidualLayerParams(589824, 256, 3, true); - var conv256_1 = extractResidualLayerParams(589824, 256, 3); - var conv256_2 = extractResidualLayerParams(589824, 256, 3); - var conv256_down_out = extractResidualLayerParams(589824, 256, 3); - var fc = transpose(tensor2d(extractWeights(256 * 128), [128, 256]), [1, 0]); - if (getRemainingWeights().length !== 0) { - throw new Error("weights remaing after extract: " + getRemainingWeights().length); - } - return { - conv32_down: conv32_down, - conv32_1: conv32_1, - conv32_2: conv32_2, - conv32_3: conv32_3, - conv64_down: conv64_down, - conv64_1: conv64_1, - conv64_2: conv64_2, - conv64_3: conv64_3, - conv128_down: conv128_down, - conv128_1: conv128_1, - conv128_2: conv128_2, - conv256_down: conv256_down, - conv256_1: conv256_1, - conv256_2: conv256_2, - conv256_down_out: conv256_down_out, - fc: fc - }; - } - - function normalize(x) { - return tidy(function () { - var avg_r = fill([1, 150, 150, 1], 122.782); - var avg_g = fill([1, 150, 150, 1], 117.001); - var avg_b = fill([1, 150, 150, 1], 104.298); - var avg_rgb = concat([avg_r, avg_g, avg_b], 3); - return div(sub(x, avg_rgb), scalar(256)); - }); - } - - function residual(x, params) { - var out = conv$1(x, params.conv1); - out = convNoRelu(out, params.conv2); - out = add(out, x); - out = relu(out); - return out; - } - function residualDown(x, params) { - var out = convDown(x, params.conv1); - out = convNoRelu(out, params.conv2); - var pooled = avgPool(x, 2, 2, 'valid'); - var zeros$$1 = zeros(pooled.shape); - var isPad = pooled.shape[3] !== out.shape[3]; - var isAdjustShape = pooled.shape[1] !== out.shape[1] || pooled.shape[2] !== out.shape[2]; - if (isAdjustShape) { - var padShapeX = out.shape.slice(); - padShapeX[1] = 1; - var zerosW = zeros(padShapeX); - out = concat([out, zerosW], 1); - var padShapeY = out.shape.slice(); - padShapeY[2] = 1; - var zerosH = zeros(padShapeY); - out = concat([out, zerosH], 2); - } - pooled = isPad ? concat([pooled, zeros$$1], 3) : pooled; - out = add(pooled, out); - out = relu(out); - return out; - } - - function faceRecognitionNet(weights) { - var _this = this; - var params = extractParams$2(weights); - function forward(input) { - return tidy(function () { - var x = padToSquare(getImageTensor(input), true); - // work with 150 x 150 sized face images - if (x.shape[1] !== 150 || x.shape[2] !== 150) { - x = image.resizeBilinear(x, [150, 150]); - } - x = normalize(x); - var out = convDown(x, params.conv32_down); - out = maxPool(out, 3, 2, 'valid'); - out = residual(out, params.conv32_1); - out = residual(out, params.conv32_2); - out = residual(out, params.conv32_3); - out = residualDown(out, params.conv64_down); - out = residual(out, params.conv64_1); - out = residual(out, params.conv64_2); - out = residual(out, params.conv64_3); - out = residualDown(out, params.conv128_down); - out = residual(out, params.conv128_1); - out = residual(out, params.conv128_2); - out = residualDown(out, params.conv256_down); - out = residual(out, params.conv256_1); - out = residual(out, params.conv256_2); - out = residualDown(out, params.conv256_down_out); - var globalAvg = out.mean([1, 2]); - var fullyConnected = matMul(globalAvg, params.fc); - return fullyConnected; - }); - } - var computeFaceDescriptor = function (input) { return __awaiter$e(_this, void 0, void 0, function () { - var result, data; - return __generator$e(this, function (_a) { - switch (_a.label) { - case 0: - result = forward(input); - return [4 /*yield*/, result.data()]; - case 1: - data = _a.sent(); - result.dispose(); - return [2 /*return*/, data]; - } - }); - }); }; - var computeFaceDescriptorSync = function (input) { - var result = forward(input); - var data = result.dataSync(); - result.dispose(); - return data; - }; - return { - computeFaceDescriptor: computeFaceDescriptor, - computeFaceDescriptorSync: computeFaceDescriptorSync, - forward: forward - }; - } - - /** - * Extracts the image regions containing the detected faces. - * - * @param input The image that face detection has been performed on. - * @param detections The face detection results or face bounding boxes for that image. - * @returns The Canvases of the corresponding image region for each detected face. - */ - function extractFaces(image, detections) { - var ctx = getContext2dOrThrow(image); - var boxes = detections.map(function (det) { return det instanceof FaceDetection - ? det.forSize(image.width, image.height).getBox().floor() - : det; }); - return boxes.map(function (_a) { - var x = _a.x, y = _a.y, width = _a.width, height = _a.height; - var faceImg = createCanvas({ width: width, height: height }); - getContext2dOrThrow(faceImg) - .putImageData(ctx.getImageData(x, y, width, height), 0, 0); - return faceImg; - }); - } - - /** - * Extracts the tensors of the image regions containing the detected faces. - * Useful if you want to compute the face descriptors for the face images. - * Using this method is faster then extracting a canvas for each face and - * converting them to tensors individually. - * - * @param input The image that face detection has been performed on. - * @param detections The face detection results or face bounding boxes for that image. - * @returns Tensors of the corresponding image region for each detected face. - */ - function extractFaceTensors(image$$1, detections) { - return tidy(function () { - var imgTensor = getImageTensor(image$$1); - // TODO handle batches - var _a = imgTensor.shape, batchSize = _a[0], imgHeight = _a[1], imgWidth = _a[2], numChannels = _a[3]; - var boxes = detections.map(function (det) { return det instanceof FaceDetection - ? det.forSize(imgWidth, imgHeight).getBox().floor() - : det; }); - var faceTensors = boxes.map(function (_a) { - var x = _a.x, y = _a.y, width = _a.width, height = _a.height; - return slice(imgTensor, [0, y, x, 0], [1, height, width, numChannels]); - }); - return faceTensors; - }); - } - - exports.euclideanDistance = euclideanDistance; - exports.faceDetectionNet = faceDetectionNet; - exports.faceLandmarkNet = faceLandmarkNet; - exports.faceRecognitionNet = faceRecognitionNet; - exports.NetInput = NetInput; - exports.tf = index; - exports.padToSquare = padToSquare; - exports.extractFaces = extractFaces; - exports.extractFaceTensors = extractFaceTensors; - exports.isFloat = isFloat; - exports.isEven = isEven; - exports.round = round$1; - exports.getElement = getElement; - exports.getContext2dOrThrow = getContext2dOrThrow; - exports.createCanvas = createCanvas; - exports.createCanvasFromMedia = createCanvasFromMedia; - exports.getMediaDimensions = getMediaDimensions; - exports.bufferToImage = bufferToImage; - exports.imageTensorToCanvas = imageTensorToCanvas; - exports.getDefaultDrawOptions = getDefaultDrawOptions; - exports.drawBox = drawBox; - exports.drawText = drawText; - exports.drawDetection = drawDetection; - exports.drawLandmarks = drawLandmarks; - - Object.defineProperty(exports, '__esModule', { value: true }); + FaceRecognitionNet.prototype.load = function (weightsOrUrl) { + return __awaiter$1(this, void 0, void 0, function () { + var _a; + return __generator$1(this, function (_b) { + switch (_b.label) { + case 0: + if (weightsOrUrl instanceof Float32Array) { + this.extractWeights(weightsOrUrl); + return [2 /*return*/]; + } + if (weightsOrUrl && typeof weightsOrUrl !== 'string') { + throw new Error('FaceLandmarkNet.load - expected model uri, or weights as Float32Array'); + } + _a = this; + return [4 /*yield*/, loadQuantizedParams$2(weightsOrUrl)]; + case 1: + _a._params = _b.sent(); + return [2 /*return*/]; + } + }); + }); + }; + FaceRecognitionNet.prototype.extractWeights = function (weights) { + this._params = extractParams$2(weights); + }; + FaceRecognitionNet.prototype.forward = function (input) { + var _this = this; + if (!this._params) { + throw new Error('FaceRecognitionNet - load model before inference'); + } + return tidy(function () { + var x = padToSquare(getImageTensor(input), true); + // work with 150 x 150 sized face images + if (x.shape[1] !== 150 || x.shape[2] !== 150) { + x = image.resizeBilinear(x, [150, 150]); + } + x = normalize(x); + var out = convDown(x, _this._params.conv32_down); + out = maxPool(out, 3, 2, 'valid'); + out = residual(out, _this._params.conv32_1); + out = residual(out, _this._params.conv32_2); + out = residual(out, _this._params.conv32_3); + out = residualDown(out, _this._params.conv64_down); + out = residual(out, _this._params.conv64_1); + out = residual(out, _this._params.conv64_2); + out = residual(out, _this._params.conv64_3); + out = residualDown(out, _this._params.conv128_down); + out = residual(out, _this._params.conv128_1); + out = residual(out, _this._params.conv128_2); + out = residualDown(out, _this._params.conv256_down); + out = residual(out, _this._params.conv256_1); + out = residual(out, _this._params.conv256_2); + out = residualDown(out, _this._params.conv256_down_out); + var globalAvg = out.mean([1, 2]); + var fullyConnected = matMul(globalAvg, _this._params.fc); + return fullyConnected; + }); + }; + FaceRecognitionNet.prototype.computeFaceDescriptor = function (input) { + return __awaiter$1(this, void 0, void 0, function () { + var result, data; + return __generator$1(this, function (_a) { + switch (_a.label) { + case 0: + result = this.forward(input); + return [4 /*yield*/, result.data()]; + case 1: + data = _a.sent(); + result.dispose(); + return [2 /*return*/, data]; + } + }); + }); + }; + FaceRecognitionNet.prototype.computeFaceDescriptorSync = function (input) { + return __awaiter$1(this, void 0, void 0, function () { + var result, data; + return __generator$1(this, function (_a) { + result = this.forward(input); + data = result.dataSync(); + result.dispose(); + return [2 /*return*/, data]; + }); + }); + }; + return FaceRecognitionNet; + }()); + + function faceRecognitionNet(weights) { + var net = new FaceRecognitionNet(); + net.extractWeights(weights); + return net; + } + + exports.euclideanDistance = euclideanDistance; + exports.NetInput = NetInput; + exports.tf = tfCore_esm; + exports.padToSquare = padToSquare; + exports.extractFaces = extractFaces; + exports.extractFaceTensors = extractFaceTensors; + exports.faceDetectionNet = faceDetectionNet; + exports.FaceDetectionNet = FaceDetectionNet; + exports.faceLandmarkNet = faceLandmarkNet; + exports.FaceLandmarkNet = FaceLandmarkNet; + exports.faceRecognitionNet = faceRecognitionNet; + exports.FaceRecognitionNet = FaceRecognitionNet; + exports.isFloat = isFloat; + exports.isEven = isEven; + exports.round = round$1; + exports.getElement = getElement; + exports.getContext2dOrThrow = getContext2dOrThrow; + exports.createCanvas = createCanvas; + exports.createCanvasFromMedia = createCanvasFromMedia; + exports.getMediaDimensions = getMediaDimensions; + exports.bufferToImage = bufferToImage; + exports.imageTensorToCanvas = imageTensorToCanvas; + exports.getDefaultDrawOptions = getDefaultDrawOptions; + exports.drawBox = drawBox; + exports.drawText = drawText; + exports.drawDetection = drawDetection; + exports.drawLandmarks = drawLandmarks; + + Object.defineProperty(exports, '__esModule', { value: true }); }))); diff --git a/dist/face-api.min.js b/dist/face-api.min.js index 63372485..36be643d 100644 --- a/dist/face-api.min.js +++ b/dist/face-api.min.js @@ -1 +1 @@ -!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?e(exports,require("crypto")):"function"==typeof define&&define.amd?define(["exports","crypto"],e):e(t.faceapi=t.faceapi||{},t.crypto)}(this,function(t,e){"use strict";function n(t){return function(){for(var t=[],e=0;e0;)r=Math.random()*e|0,n=t[--e],t[e]=t[r],t[r]=n}function i(t,e,n){return Math.max(t,Math.min(e,n))}function u(t,e){return Math.random()*(e-t)+t}function s(t,e){if(!t)throw new Error(e)}function c(t,e,n){void 0===n&&(n=""),s(d(t,e),n+" Shapes "+t+" and "+e+" must match")}function l(t,e){s(t.dtype===e.dtype," The dtypes of the first("+t.dtype+") and second("+e.dtype+") input must match")}function f(t,e){if(void 0===e&&(e=[]),Array.isArray(t))for(var n=0;n1;--e)if(t%e==0)return[e,t/e];return[1,t]}function y(t,e){return e<=t.length?t:t+" ".repeat(e-t.length)}function b(t,e,n){return void 0===e&&(e=function(t){return 0}),new Promise(function(r,o){var a=0,i=function(){if(t())r();else{var u=e(++a);null!=n&&a>=n?o():setTimeout(i,u)}};setTimeout(i,0)})}function x(t){var e={};return t.replace(/[?&]([^=?&]+)(?:=([^&]*))?/g,function(t){for(var n=[],r=1;r0)n*=t[o];else if(-1===t[o]){if(-1!==r)throw Error("Shapes can only have 1 implicit size. Found - 1 at dim "+r+" and dim "+o);r=o}else if(t[o]<=0)throw Error("Shapes can not be <= 0. Found "+t[o]+" at dim "+o);if(-1===r){if(e>0&&e!==n)throw Error("Size("+e+") must match the product of shape "+t);return t}if(e%n!=0)throw Error("The implicit shape can't be a fractional number. Got "+e+" / "+n);var a=t.slice();return a[r]=e/n,a}function E(t,e){for(var n=[],r=[],o=0,a=0;a1)throw new Error("Can't squeeze axis "+a+" since its dim '"+t[a]+"' is not 1");(null==e[o]||e[o]>a)&&1===t[a]&&(n.push(t[a]),r.push(a)),e[o]<=a&&o++}t[a]>1&&(n.push(t[a]),r.push(a))}return{newShape:n,keptDims:r}}function S(t,e){var n=null;if(null==t||"float32"===t)n=new Float32Array(e);else if("int32"===t)n=new Int32Array(e);else{if("bool"!==t)throw new Error("Unknown data type "+t);n=new Uint8Array(e)}return n}function R(t,e){for(var n=0;n1)for(var a=0;aN){var s=Array.from(e.subarray(0,L)),c=Array.from(e.subarray(i-L,i));return["["+s.map(function(t,e){return F(t,o[e])}).join(", ")+", ..., "+c.map(function(t,e){return F(t,o[i-L+e])}).join(", ")+"]"]}return["["+Array.from(e).map(function(t,e){return F(t,o[e])}).join(", ")+"]"]}var l=n.slice(1);var f=r.slice(1);var h=r[0];var p=[];if(i>N){for(var d=0;d=-n&&t=0;u--)(o=t[u])&&(i=(a<3?o(i):a>3?o(e,n,i):o(e,n))||i);return a>3&&i&&Object.defineProperty(e,n,i),i},Q=function(){function t(){}return t.concat1d=function(e){return t.concat(e,0)},t.concat2d=function(e,n){return t.concat(e,n)},t.concat3d=function(e,n){return t.concat(e,n)},t.concat4d=function(e,n){return t.concat(e,n)},t.concat=function(t,e){void 0===e&&(e=0),s(t.length>=1,"Pass at least one tensor to concat"),o({tensors:t},"concat");var n=t[0];if(1===t.length)return n;for(var r=V(e,n.shape),a=1;a=0&&n>>0,e=(r*=e)>>>0,e+=4294967296*(r-=e)}return 2.3283064365386963e-10*(e>>>0)});n.next=function(){var t=2091639*n.s0+2.3283064365386963e-10*n.c;return n.s0=n.s1,n.s1=n.s2,n.s2=t-(n.c=0|t)},n.c=1,n.s0=r(" "),n.s1=r(" "),n.s2=r(" "),n.s0-=r(t),n.s0<0&&(n.s0+=1),n.s1-=r(t),n.s1<0&&(n.s1+=1),n.s2-=r(t),n.s2<0&&(n.s2+=1),r=null}(t),o=e&&e.state,a=n.next;return a.int32=function(){return 4294967296*n.next()|0},a.double=function(){return a()+1.1102230246251565e-16*(2097152*a()|0)},a.quick=a,o&&("object"==typeof o&&r(o,n),a.state=function(){return r(n,{})}),a}e&&e.exports?e.exports=o:n&&n.amd?n(function(){return o}):this.alea=o}(0,t,!1)}),$=J(function(t){!function(t,e,n){function r(t,e){return e.x=t.x,e.y=t.y,e.z=t.z,e.w=t.w,e}function o(t,e){var n=new function(t){var e=this,n="";e.x=0,e.y=0,e.z=0,e.w=0,e.next=function(){var t=e.x^e.x<<11;return e.x=e.y,e.y=e.z,e.z=e.w,e.w^=e.w>>>19^t^t>>>8},t===(0|t)?e.x=t:n+=t;for(var r=0;r>>0)/4294967296};return a.double=function(){do{var t=((n.next()>>>11)+(n.next()>>>0)/4294967296)/(1<<21)}while(0===t);return t},a.int32=n.next,a.quick=a,o&&("object"==typeof o&&r(o,n),a.state=function(){return r(n,{})}),a}e&&e.exports?e.exports=o:n&&n.amd?n(function(){return o}):this.xor128=o}(0,t,!1)}),tt=J(function(t){!function(t,e,n){function r(t,e){return e.x=t.x,e.y=t.y,e.z=t.z,e.w=t.w,e.v=t.v,e.d=t.d,e}function o(t,e){var n=new function(t){var e=this,n="";e.next=function(){var t=e.x^e.x>>>2;return e.x=e.y,e.y=e.z,e.z=e.w,e.w=e.v,(e.d=e.d+362437|0)+(e.v=e.v^e.v<<4^t^t<<1)|0},e.x=0,e.y=0,e.z=0,e.w=0,e.v=0,t===(0|t)?e.x=t:n+=t;for(var r=0;r>>4),e.next()}(t),o=e&&e.state,a=function(){return(n.next()>>>0)/4294967296};return a.double=function(){do{var t=((n.next()>>>11)+(n.next()>>>0)/4294967296)/(1<<21)}while(0===t);return t},a.int32=n.next,a.quick=a,o&&("object"==typeof o&&r(o,n),a.state=function(){return r(n,{})}),a}e&&e.exports?e.exports=o:n&&n.amd?n(function(){return o}):this.xorwow=o}(0,t,!1)}),et=J(function(t){!function(t,e,n){function r(t,e){return e.x=t.x.slice(),e.i=t.i,e}function o(t,e){null==t&&(t=+new Date);var n=new function(t){var e=this;e.next=function(){var t,n,r=e.x,o=e.i;return t=r[o],n=(t^=t>>>7)^t<<24,n^=(t=r[o+1&7])^t>>>10,n^=(t=r[o+3&7])^t>>>3,n^=(t=r[o+4&7])^t<<7,t=r[o+7&7],n^=(t^=t<<13)^t<<9,r[o]=n,e.i=o+1&7,n},function(t,e){var n,r=[];if(e===(0|e))r[0]=e;else for(e=""+e,n=0;n0;--n)t.next()}(e,t)}(t),o=e&&e.state,a=function(){return(n.next()>>>0)/4294967296};return a.double=function(){do{var t=((n.next()>>>11)+(n.next()>>>0)/4294967296)/(1<<21)}while(0===t);return t},a.int32=n.next,a.quick=a,o&&(o.x&&r(o,n),a.state=function(){return r(n,{})}),a}e&&e.exports?e.exports=o:n&&n.amd?n(function(){return o}):this.xorshift7=o}(0,t,!1)}),nt=J(function(t){!function(t,e,n){function r(t,e){return e.i=t.i,e.w=t.w,e.X=t.X.slice(),e}function o(t,e){null==t&&(t=+new Date);var n=new function(t){var e=this;e.next=function(){var t,n,r=e.w,o=e.X,a=e.i;return e.w=r=r+1640531527|0,n=o[a+34&127],t=o[a=a+1&127],n^=n<<13,t^=t<<17,n^=n>>>15,t^=t>>>12,n=o[a]=n^t,e.i=a,n+(r^r>>>16)|0},function(t,e){var n,r,o,a,i,u=[],s=128;for(e===(0|e)?(r=e,e=null):(e+="\0",r=0,s=Math.max(s,e.length)),o=0,a=-32;a>>15,r^=r<<4,r^=r>>>13,a>=0&&(i=i+1640531527|0,o=0==(n=u[127&a]^=r+i)?o+1:0);for(o>=128&&(u[127&(e&&e.length||0)]=-1),o=127,a=512;a>0;--a)r=u[o+34&127],n=u[o=o+1&127],r^=r<<13,n^=n<<17,r^=r>>>15,n^=n>>>12,u[o]=r^n;t.w=i,t.X=u,t.i=o}(e,t)}(t),o=e&&e.state,a=function(){return(n.next()>>>0)/4294967296};return a.double=function(){do{var t=((n.next()>>>11)+(n.next()>>>0)/4294967296)/(1<<21)}while(0===t);return t},a.int32=n.next,a.quick=a,o&&(o.X&&r(o,n),a.state=function(){return r(n,{})}),a}e&&e.exports?e.exports=o:n&&n.amd?n(function(){return o}):this.xor4096=o}(0,t,!1)}),rt=J(function(t){!function(t,e,n){function r(t,e){return e.a=t.a,e.b=t.b,e.c=t.c,e.d=t.d,e}function o(t,e){var n=new function(t){var e=this,n="";e.next=function(){var t=e.b,n=e.c,r=e.d,o=e.a;return t=t<<25^t>>>7^n,n=n-r|0,r=r<<24^r>>>8^o,o=o-t|0,e.b=t=t<<20^t>>>12^n,e.c=n=n-r|0,e.d=r<<16^n>>>16^o,e.a=o-t|0},e.a=0,e.b=0,e.c=-1640531527,e.d=1367130551,t===Math.floor(t)?(e.a=t/4294967296|0,e.b=0|t):n+=t;for(var r=0;r>>0)/4294967296};return a.double=function(){do{var t=((n.next()>>>11)+(n.next()>>>0)/4294967296)/(1<<21)}while(0===t);return t},a.int32=n.next,a.quick=a,o&&("object"==typeof o&&r(o,n),a.state=function(){return r(n,{})}),a}e&&e.exports?e.exports=o:n&&n.amd?n(function(){return o}):this.tychei=o}(0,t,!1)}),ot=J(function(t){!function(n,r){var o,a=this,i=256,u=6,s="random",c=r.pow(i,u),l=r.pow(2,52),f=2*l,h=i-1;function p(t,e,p){var m=[],y=v(function t(e,n){var r,o=[],a=typeof e;if(n&&"object"==a)for(r in e)try{o.push(t(e[r],n-1))}catch(t){}return o.length?o:"string"==a?e:e+"\0"}((e=1==e?{entropy:!0}:e||{}).entropy?[t,g(n)]:null==t?function(){try{var t;return o&&(t=o.randomBytes)?t=t(i):(t=new Uint8Array(i),(a.crypto||a.msCrypto).getRandomValues(t)),g(t)}catch(t){var e=a.navigator,r=e&&e.plugins;return[+new Date,a,r,a.screen,g(n)]}}():t,3),m),b=new function(t){var e,n=t.length,r=this,o=0,a=r.i=r.j=0,u=r.S=[];n||(t=[n++]);for(;o=f;)t/=2,e/=2,n>>>=1;return(t+n)/e};return x.int32=function(){return 0|b.g(4)},x.quick=function(){return b.g(4)/4294967296},x.double=x,v(g(b.S),n),(e.pass||p||function(t,e,n,o){return o&&(o.S&&d(o,b),t.state=function(){return d(b,{})}),n?(r[s]=t,e):t})(x,y,"global"in e?e.global:this==r,e.state)}function d(t,e){return e.i=t.i,e.j=t.j,e.S=t.S.slice(),e}function v(t,e){for(var n,r=t+"",o=0;o=1||0===i);var u=Math.sqrt(-2*Math.log(i)/i);e=this.mean+this.stdDev*o*u,n=this.mean+this.stdDev*a*u,this.truncated&&!this.isValidTruncated(e)||(r=!0)}return this.truncated&&!this.isValidTruncated(n)||(this.nextVal=this.convertValue(n)),this.convertValue(e)},t.prototype.convertValue=function(t){return null==this.dtype||"float32"===this.dtype?t:Math.round(t)},t.prototype.isValidTruncated=function(t){return t<=this.upper&&t>=this.lower},t}(),it=function(t,e,n,r){var o,a=arguments.length,i=a<3?e:null===r?r=Object.getOwnPropertyDescriptor(e,n):r;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)i=Reflect.decorate(t,e,n,r);else for(var u=t.length-1;u>=0;u--)(o=t[u])&&(i=(a<3?o(i):a>3?o(e,n,i):o(e,n))||i);return a>3&&i&&Object.defineProperty(e,n,i),i},ut=function(){function t(){}return t.logSumExp=function(t,e,n){void 0===e&&(e=null),void 0===n&&(n=!1),o({x:t},"logSumExp");var r=V(e,t.shape),a=t.max(r,!0),i=t.sub(a).exp().sum(r).log(),u=a.reshape(i.shape).add(i);if(n){var s=W(u.shape,r);return u.reshape(s)}return u},t.sum=function(t,e,n){void 0===e&&(e=null),void 0===n&&(n=!1),o({x:t},"sum"),"bool"===t.dtype&&(t=t.toInt());var r=V(e,t.shape);return Ko(function(t){var e=q(r,t.rank),o=r,a=t;null!=e&&(a=t.transpose(e),o=j(o.length,t.rank));var i=fa.engine.runKernel(function(t){return t.sum(a,o)},{permutedX:a});if(n){var u=W(i.shape,r);i=i.reshape(u)}return{value:i,gradFunc:function(e){var n=t.shape.slice();return r.forEach(function(t){n[t]=1}),e.reshape(n).mul(Pr(t.shape,"float32"))}}})(t)},t.mean=function(t,e,n){void 0===e&&(e=null),void 0===n&&(n=!1),o({x:t},"mean");var r=V(e,t.shape),a=p(z(t.shape,r)[1]);return Ko(function(t){var o=no(a);return{value:(o.dtype===t.dtype?t:t.cast(o.dtype)).div(o).sum(e,n),gradFunc:function(e){var n=t.shape.slice();return r.forEach(function(t){n[t]=1}),e.reshape(n).mul(Pr(t.shape,"float32")).div(o)}}})(t)},t.min=function(t,e,n){void 0===e&&(e=null),void 0===n&&(n=!1),o({x:t},"min");var r=V(e,t.shape),a=r,i=q(a,t.rank);null!=i&&(t=t.transpose(i),a=j(a.length,t.rank));var u=fa.engine.runKernel(function(e){return e.min(t,a)},{x:t});if(n){var s=W(u.shape,r);return u.reshape(s)}return u},t.max=function(t,e,n){void 0===e&&(e=null),void 0===n&&(n=!1),o({x:t},"max");var r=V(e,t.shape),a=r,i=q(a,t.rank);null!=i&&(t=t.transpose(i),a=j(a.length,t.rank));var u=fa.engine.runKernel(function(e){return e.max(t,a)},{x:t});if(n){var s=W(u.shape,r);return u.reshape(s)}return u},t.argMin=function(t,e){void 0===e&&(e=0),o({x:t},"argMin"),null==e&&(e=0);var n=V(e,t.shape),r=q(n,t.rank);return null!=r&&(t=t.transpose(r),n=j(n.length,t.rank)),fa.engine.runKernel(function(e){return e.argMin(t,n[0])},{x:t})},t.argMax=function(t,e){void 0===e&&(e=0),o({x:t},"argMax"),null==e&&(e=0);var n=V(e,t.shape),r=q(n,t.rank);return null!=r&&(t=t.transpose(r),n=j(n.length,t.rank)),fa.engine.runKernel(function(e){return e.argMax(t,n[0])},{x:t})},t.moments=function(t,e,n){void 0===e&&(e=null),void 0===n&&(n=!1),o({x:t},"moments");var r=V(e,t.shape),a=t.mean(r,n),i=a.shape;return n||(i=W(a.shape,r)),{mean:a,variance:t.toFloat().sub(a.reshape(i)).square().mean(r,n)}},t.unsortedSegmentSum=function(t,e,n,r){void 0===r&&(r=0),o({x:t,segmentIds:e},"unsortedSegmentSum"),s("int32"===e.dtype,"Segment Ids must be of dtype `int32`"),r=V(r,t.shape)[0];for(var a=[],i=e.shape[0],u=[],c=0;c=0;u--)(o=t[u])&&(i=(a<3?o(i):a>3?o(e,n,i):o(e,n))||i);return a>3&&i&&Object.defineProperty(e,n,i),i},ct=function(t,e,n,r){return new(n||(n=Promise))(function(o,a){function i(t){try{s(r.next(t))}catch(t){a(t)}}function u(t){try{s(r.throw(t))}catch(t){a(t)}}function s(t){t.done?o(t.value):new n(function(e){e(t.value)}).then(i,u)}s((r=r.apply(t,e||[])).next())})},lt=function(t,e){var n,r,o,a,i={label:0,sent:function(){if(1&o[0])throw o[1];return o[1]},trys:[],ops:[]};return a={next:u(0),throw:u(1),return:u(2)},"function"==typeof Symbol&&(a[Symbol.iterator]=function(){return this}),a;function u(a){return function(u){return function(a){if(n)throw new TypeError("Generator is already executing.");for(;i;)try{if(n=1,r&&(o=r[2&a[0]?"return":a[0]?"throw":"next"])&&!(o=o.call(r,a[1])).done)return o;switch(r=0,o&&(a=[0,o.value]),a[0]){case 0:case 1:o=a;break;case 4:return i.label++,{value:a[1],done:!1};case 5:i.label++,r=a[1],a=[0];continue;case 7:a=i.ops.pop(),i.trys.pop();continue;default:if(!(o=(o=i.trys).length>0&&o[o.length-1])&&(6===a[0]||2===a[0])){i=0;continue}if(3===a[0]&&(!o||a[1]>o[0]&&a[1]2)throw new Error("Rank of probabilities must be 1 or 2, but is "+i);n=n||Math.random();var u=1===i?t.as2D(1,-1):t,s=fa.engine.runKernel(function(t){return t.multinomial(u,r,e,n)},{logits2D:u});return 1===i?s.as1D():s},t.oneHot=function(t,e,n,r){if(void 0===n&&(n=1),void 0===r&&(r=0),s("int32"===t.dtype,"Indices must be of dtype `int32`"),e<2)throw new Error("Error in oneHot: depth must be >=2, but it is "+e);return fa.engine.runKernel(function(o){return o.oneHot(t,e,n,r)},{indices:t})},t.fromPixels=function(t,e){if(void 0===e&&(e=3),e>4)throw new Error("Cannot construct Tensor with more than 4 channels from pixels.");return fa.engine.fromPixels(t,e)},t.toPixels=function(t,e){return ct(this,void 0,void 0,function(){var n,r,a,i,u,s,c,l,f,h,p,d,v,g,m,y,b,x,w;return lt(this,function(E){switch(E.label){case 0:if(o({img:t},"toPixels"),2!==t.rank&&3!==t.rank)throw new Error("toPixels only supports rank 2 or 3 tensors, got rank "+t.rank+".");if(n=t.shape.slice(0,2),r=n[0],a=n[1],(i=2===t.rank?1:t.shape[2])>4||2===i)throw new Error("toPixels only supports depth of size 1, 3 or 4 but got "+i);return u=t.min(),s=t.max(),[4,u.data()];case 1:return c=E.sent()[0],[4,s.data()];case 2:if(l=E.sent()[0],u.dispose(),s.dispose(),"float32"===t.dtype){if(c<0||l>1)throw new Error("Tensor values for a float32 Tensor must be in the range [0 - 1] but got range ["+c+" - "+l+"].")}else{if("int32"!==t.dtype)throw new Error("Unsupported type for toPixels: "+t.dtype+". Please use float32 or int32 tensors.");if(c<0||l>255)throw new Error("Tensor values for a int32 Tensor must be in the range [0 - 255] but got range ["+c+" - "+l+"].")}return[4,t.data()];case 3:for(f=E.sent(),h="float32"===t.dtype?255:1,p=new Uint8ClampedArray(a*r*4),d=0;d=1,"Pass at least one tensor to tf.stack"),1===t.length)return t[0].expandDims(e);var n=t[0].rank,r=t[0].shape,a=t[0].dtype;s(e<=n,"Axis must be <= rank of the tensor"),t.forEach(function(t){c(r,t.shape,"All tensors passed to stack must have matching shapes")}),t.forEach(function(t){s(a===t.dtype,"All tensors passed to stack must have matching dtypes")});var i=t.map(function(t){return t.expandDims(e)});return Q.concat(i,e)},t.unstack=function(t,e){void 0===e&&(e=0);for(var n,r=t.shape[e],o=Array(t.rank-1).fill(0),a=0,i=0;i1)return t.zeros([0],o);var a=ht(Math.abs(Math.ceil((n-e)/r)),o);n1&&1===i&&r.unshift(a)}return r}function dt(t,e){for(var n=[],r=0;r1)&&n.unshift(a)}return n}function vt(t,e){for(var n=[],r="Operands could not be broadcast together with shapes "+t+" and "+e+".",o=Math.max(t.length,e.length),a=0;a1&&u>1&&i!==u)throw Error(r);n.unshift(Math.max(i,u))}return n}var gt,mt,yt,bt,xt,wt=function(t,e,n,r){var o,a=arguments.length,i=a<3?e:null===r?r=Object.getOwnPropertyDescriptor(e,n):r;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)i=Reflect.decorate(t,e,n,r);else for(var u=t.length-1;u>=0;u--)(o=t[u])&&(i=(a<3?o(i):a>3?o(e,n,i):o(e,n))||i);return a>3&&i&&Object.defineProperty(e,n,i),i},Et=function(){function t(){}return t.batchNormalization2d=function(e,n,r,o,a,i){return void 0===o&&(o=.001),s(2===e.rank,"Error in batchNormalization3D: x must be rank 3 but got rank "+e.rank+"."),s(2===n.rank||1===n.rank,"Error in batchNormalization2D: mean must be rank 2 or rank 1 but got rank "+n.rank+"."),s(2===r.rank||1===r.rank,"Error in batchNormalization2D: variance must be rank 2 or rank 1 but got rank "+r.rank+"."),null!=a&&s(2===a.rank||1===a.rank,"Error in batchNormalization2D: scale must be rank 2 or rank 1 but got rank "+a.rank+"."),null!=i&&s(2===i.rank||1===i.rank,"Error in batchNormalization2D: offset must be rank 2 or rank 1 but got rank "+i.rank+"."),t.batchNormalization(e,n,r,o,a,i)},t.batchNormalization3d=function(e,n,r,o,a,i){return void 0===o&&(o=.001),s(3===e.rank,"Error in batchNormalization3D: x must be rank 3 but got rank "+e.rank+"."),s(3===n.rank||1===n.rank,"Error in batchNormalization3D: mean must be rank 3 or rank 1 but got rank "+n.rank+"."),s(3===r.rank||1===r.rank,"Error in batchNormalization3D: variance must be rank 3 or rank 1 but got rank "+r.rank+"."),null!=a&&s(3===a.rank||1===a.rank,"Error in batchNormalization3D: scale must be rank 3 or rank 1 but got rank "+a.rank+"."),null!=i&&s(3===i.rank||1===i.rank,"Error in batchNormalization3D: offset must be rank 3 or rank 1 but got rank "+i.rank+"."),t.batchNormalization(e,n,r,o,a,i)},t.batchNormalization4d=function(e,n,r,o,a,i){return void 0===o&&(o=.001),s(4===e.rank,"Error in batchNormalization4D: x must be rank 4 but got rank "+e.rank+"."),s(4===n.rank||1===n.rank,"Error in batchNormalization4D: mean must be rank 4 or rank 1 but got rank "+n.rank+"."),s(4===r.rank||1===r.rank,"Error in batchNormalization4D: variance must be rank 4 or rank 1 but got rank "+r.rank+"."),null!=a&&s(4===a.rank||1===a.rank,"Error in batchNormalization4D: scale must be rank 4 or rank 1 but got rank "+a.rank+"."),null!=i&&s(4===i.rank||1===i.rank,"Error in batchNormalization4D: offset must be rank 4 or rank 1 but got rank "+i.rank+"."),t.batchNormalization(e,n,r,o,a,i)},t.batchNormalization=function(t,e,n,r,a,i){var u;void 0===r&&(r=.001),o({x:t,mean:e,variance:n},"batchNormalization"),null!=a&&o({scale:a},"batchNormalization"),null!=i&&o({offset:i},"batchNormalization"),s(e.rank===n.rank,"Batch normalization gradient requires mean and variance to have equal ranks."),s(null==i||e.rank===i.rank,"Batch normalization gradient requires mean and offset to have equal ranks."),s(null==a||e.rank===a.rank,"Batch normalization gradient requires mean and scale to have equal ranks."),u=0===t.rank||1===t.rank?t.as4D(1,1,1,t.size):2===t.rank?t.as4D(1,1,t.shape[0],t.shape[1]):3===t.rank?t.as4D(1,t.shape[0],t.shape[1],t.shape[2]):t;return fa.engine.runKernel(function(t){return t.batchNormalization(u,St(e),St(n),r,St(a),St(i))},{x:t,mean:e,variance:n,scale:a,offset:i},function(o){var i=null==a?ft.scalar(1):a,s=dt(e.shape,u.shape),c=[];if(1===e.rank){for(var l=0;l=0;u--)(o=t[u])&&(i=(a<3?o(i):a>3?o(e,n,i):o(e,n))||i);return a>3&&i&&Object.defineProperty(e,n,i),i},Tt=function(){function t(){}return t.add=function(t,e){o({a:t,b:e},"add"),l(t,e);var n=vt(t.shape,e.shape);return fa.engine.runKernel(function(n){return n.add(t,e)},{a:t,b:e},function(r){return{a:function(){var e=r,o=dt(t.shape,n);return o.length>0&&(e=e.sum(o)),e.reshape(t.shape)},b:function(){var t=r,o=dt(e.shape,n);return o.length>0&&(t=t.sum(o)),t.reshape(e.shape)}}})},t.addStrict=function(t,e){return c(t.shape,e.shape,"Error in addStrict: "),t.add(e)},t.sub=function(t,e){o({a:t,b:e},"sub"),l(t,e);var n=vt(t.shape,e.shape);return fa.engine.runKernel(function(n){return n.subtract(t,e)},{a:t,b:e},function(r){return{a:function(){var e=r,o=dt(t.shape,n);return o.length>0&&(e=e.sum(o)),e.reshape(t.shape)},b:function(){var t=r,o=dt(e.shape,n);return o.length>0&&(t=t.sum(o)),t.neg().reshape(e.shape)}}})},t.subStrict=function(t,e){return c(t.shape,e.shape,"Error in subStrict: "),t.sub(e)},t.pow=function(t,e){o({base:t,exp:e},"pow");var n=vt(t.shape,e.shape);t=t.cast(kt(t.dtype,e.dtype)),e=e.cast(kt(t.dtype,e.dtype));return fa.engine.runKernel(function(n,r){return r(n.pow(t,e))},{base:t,exp:e},function(r,o){var a=o[0];return{base:function(){var o=r.mul(e.toFloat().mul(a.div(t))),i=dt(t.shape,n);return i.length>0&&(o=o.sum(i)),o.reshape(t.shape)},exp:function(){var o=r.mul(a.mul(t.log()).toFloat()),i=dt(e.shape,n);return i.length>0&&(o=o.sum(i)),o.reshape(e.shape)}}})},t.powStrict=function(t,e){return c(t.shape,e.shape,"Error in powStrict: "),t.pow(e)},t.mul=function(t,e){o({a:t,b:e},"mul"),l(t,e);var n=vt(t.shape,e.shape);return fa.engine.runKernel(function(n){return n.multiply(t,e)},{a:t,b:e},function(r){return{a:function(){var o=r.mul(e.toFloat()),a=dt(t.shape,n);return a.length>0?o.sum(a).reshape(t.shape):o},b:function(){var o=r.mul(t.toFloat()),a=dt(e.shape,n);return a.length>0?o.sum(a).reshape(e.shape):o}}})},t.mulStrict=function(t,e){return c(t.shape,e.shape,"Error in multiplyStrict: "),t.mul(e)},t.div=function(t,e){o({a:t,b:e},"div"),l(t,e);var n=vt(t.shape,e.shape);return fa.engine.runKernel(function(n){return n.divide(t,e)},{a:t,b:e},function(r){return{a:function(){var o=r.div(e.toFloat()),a=dt(t.shape,n);return a.length>0?o.sum(a).reshape(t.shape):o},b:function(){var o=r.mul(t.toFloat()),a=dt(e.shape,n);a.length>0&&(o=o.sum(a).reshape(e.shape));var i=e.square();return o.div(i.toFloat()).neg()}}})},t.divStrict=function(t,e){return c(t.shape,e.shape,"Error in divideStrict: "),t.div(e)},t.mod=function(t,e){o({a:t,b:e},"mod"),l(t,e);var n=vt(t.shape,e.shape);return fa.engine.runKernel(function(n){return n.mod(t,e)},{a:t,b:e},function(r){return{a:function(){var e=dt(t.shape,n);return e.length>0?r.sum(e).reshape(t.shape):r},b:function(){var o=r.mul(t.div(e).floor().neg()),a=dt(e.shape,n);return a.length>0?o.sum(a).reshape(e.shape):o}}})},t.modStrict=function(t,e){return c(t.shape,e.shape,"Error in modStrict: "),t.mod(e)},t.minimum=function(t,e){o({a:t,b:e},"minimum"),l(t,e),"bool"===t.dtype&&(t=t.toInt()),"bool"===e.dtype&&(e=e.toInt()),vt(t.shape,e.shape);return fa.engine.runKernel(function(n){return n.minimum(t,e)},{a:t,b:e},function(n){return{a:function(){return n.mul(t.lessEqual(e).toFloat())},b:function(){return n.mul(t.greater(e).toFloat())}}})},t.minimumStrict=function(t,e){return c(t.shape,e.shape,"Error in minimumStrict: "),t.minimum(e)},t.maximum=function(t,e){o({a:t,b:e},"maximum"),l(t,e),"bool"===t.dtype&&(t=t.toInt()),"bool"===e.dtype&&(e=e.toInt()),vt(t.shape,e.shape);return fa.engine.runKernel(function(n){return n.maximum(t,e)},{a:t,b:e},function(n){return{a:function(){return n.mul(t.greaterEqual(e).toFloat())},b:function(){return n.mul(t.less(e).toFloat())}}})},t.maximumStrict=function(t,e){return c(t.shape,e.shape,"Error in minimumStrict: "),t.maximum(e)},t.squaredDifference=function(t,e){o({a:t,b:e},"squaredDifference"),l(t,e),vt(t.shape,e.shape);return fa.engine.runKernel(function(n){return n.squaredDifference(t,e)},{a:t,b:e},function(n){var r=no(2);return{a:function(){return n.mul(t.sub(e).mul(r))},b:function(){return n.mul(e.sub(t).mul(r))}}})},t.squaredDifferenceStrict=function(t,e){return c(t.shape,e.shape,"Error in squaredDifferenceStrict: "),t.squaredDifference(e)},t.atan2=function(e,n){o({a:e,b:n},"atan2"),l(e,n);var r=vt(e.shape,n.shape);return fa.engine.runKernel(function(t){return t.atan2(e,n)},{a:e,b:n},function(o){return{a:function(){var a=t.add(ur(e),ur(n)),i=o.mul(n.div(a)),u=dt(e.shape,r);return u.length>0&&(i=i.sum(u)),i.reshape(e.shape)},b:function(){var a=t.add(ur(e),ur(n)),i=Qn(o.mul(e.div(a))),u=dt(n.shape,r);return u.length>0&&(i=i.sum(u)),i.reshape(n.shape)}}})},Ct([function(){for(var t=[],e=0;e=0;u--)(o=t[u])&&(i=(a<3?o(i):a>3?o(e,n,i):o(e,n))||i);return a>3&&i&&Object.defineProperty(e,n,i),i},At=function(){function t(){}return t.notEqual=function(t,e){return o({a:t,b:e},"notEqual"),l(t,e),vt(t.shape,e.shape),fa.engine.runKernel(function(n){return n.notEqual(t,e)},{a:t,b:e})},t.notEqualStrict=function(t,e){return c(t.shape,e.shape,"Error in notEqualStrict: "),t.notEqual(e)},t.less=function(t,e){return o({a:t,b:e},"less"),l(t,e),vt(t.shape,e.shape),fa.engine.runKernel(function(n){return n.less(t,e)},{a:t,b:e})},t.lessStrict=function(t,e){return c(t.shape,e.shape,"Error in lessStrict: "),t.less(e)},t.equal=function(t,e){return o({a:t,b:e},"equal"),l(t,e),vt(t.shape,e.shape),fa.engine.runKernel(function(n){return n.equal(t,e)},{a:t,b:e})},t.equalStrict=function(t,e){return c(t.shape,e.shape,"Error in equalStrict: "),t.equal(e)},t.lessEqual=function(t,e){return o({a:t,b:e},"lessEqual"),l(t,e),vt(t.shape,e.shape),fa.engine.runKernel(function(n){return n.lessEqual(t,e)},{a:t,b:e})},t.lessEqualStrict=function(t,e){return c(t.shape,e.shape,"Error in lessEqualStrict: "),t.lessEqual(e)},t.greater=function(t,e){return o({a:t,b:e},"greater"),l(t,e),vt(t.shape,e.shape),fa.engine.runKernel(function(n){return n.greater(t,e)},{a:t,b:e})},t.greaterStrict=function(t,e){return c(t.shape,e.shape,"Error in greaterStrict: "),t.greater(e)},t.greaterEqual=function(t,e){return o({a:t,b:e},"greaterEqual"),l(t,e),vt(t.shape,e.shape),fa.engine.runKernel(function(n){return n.greaterEqual(t,e)},{a:t,b:e})},t.greaterEqualStrict=function(t,e){return c(t.shape,e.shape,"Error in greaterEqualStrict: "),t.greaterEqual(e)},_t([function(){for(var t=[],e=0;e=0;u--)(o=t[u])&&(i=(a<3?o(i):a>3?o(e,n,i):o(e,n))||i);return a>3&&i&&Object.defineProperty(e,n,i),i},Pt=function(){function t(){}return t.conv1d=function(e,n,r,a,i,u,c){void 0===i&&(i="NWC"),void 0===u&&(u=1),o({x:e,filter:n},"conv1d");var l=e,f=!1;2===e.rank&&(f=!0,l=e.as3D(1,e.shape[0],e.shape[1])),s(3===l.rank,"Error in conv1d: input must be rank 3, but got rank "+l.rank+"."),s(3===n.rank,"Error in conv1d: filter must be rank 3, but got rank "+n.rank+"."),null!=c&&s(v(a),"Error in conv1d: pad must be an integer when using, dimRoundingMode "+c+" but got pad "+a+"."),s(l.shape[2]===n.shape[1],"Error in conv1d: depth of input ("+l.shape[2]+") must match input depth for filter "+n.shape[1]+"."),s(Ft(r,u),"Error in conv1D: Either stride or dilation must be 1.Got stride "+r+" and dilation '"+u+"'"),s("NWC"===i,"Error in conv1d: got dataFormat of "+i+" but only NWC is currently supported.");var h=n.as4D(1,n.shape[0],n.shape[1],n.shape[2]),p=l.as4D(l.shape[0],1,l.shape[1],l.shape[2]),d=[1,r],g=[1,u],m=t.conv2d(p,h,d,a,"NHWC",g,c);return f?m.as2D(m.shape[2],m.shape[3]):m.as3D(m.shape[0],m.shape[2],m.shape[3])},t.conv2d=function(e,n,r,a,i,u,c){void 0===i&&(i="NHWC"),void 0===u&&(u=[1,1]),o({x:e,filter:n},"conv2d");var l=e,f=!1;3===e.rank&&(f=!0,l=e.as4D(1,e.shape[0],e.shape[1],e.shape[2])),s(4===l.rank,"Error in conv2d: input must be rank 4, but got rank "+l.rank+"."),s(4===n.rank,"Error in conv2d: filter must be rank 4, but got rank "+n.rank+"."),null!=c&&s(v(a),"Error in conv2d: pad must be an integer when using, dimRoundingMode "+c+" but got pad "+a+"."),s(l.shape[3]===n.shape[2],"Error in conv2d: depth of input ("+l.shape[3]+") must match input depth for filter "+n.shape[2]+"."),s(Ft(r,u),"Error in conv2D: Either strides or dilations must be 1.Got strides "+r+" and dilations '"+u+"'"),s("NHWC"===i,"Error in conv2d: got dataFormat of "+i+" but only NHWC is currently supported.");var h=It(l.shape,n.shape,r,u,a,c),p=fa.engine.runKernel(function(t){return t.conv2d(l,n,h)},{x:l,filter:n},function(e){return s(Bt(u),"Error in gradient of conv2D: dilation rates greater than 1 are notyet supported in gradients. Got dilations '"+u+"'"),{x:function(){return t.conv2dDerInput(l.shape,e,n,r,a)},filter:function(){return t.conv2dDerFilter(l,e,n.shape,r,a)}}});return f?p.as3D(p.shape[1],p.shape[2],p.shape[3]):p},t.conv2dDerInput=function(t,e,n,r,a,i){o({dy:e,filter:n},"conv2dDerInput"),s(t.length===e.rank,"Length of inShape ("+t.length+") and rank of dy ("+e.rank+") must match");var u=t,c=e,l=!1;3===e.rank&&(l=!0,c=e.as4D(1,e.shape[0],e.shape[1],e.shape[2]),u=[1,t[0],t[1],t[2]]);var f=u[3],h=c.shape[3];s(4===u.length,"Error in conv2dDerInput: inShape must be length 4, but got length "+u.length+"."),s(4===c.rank,"Error in conv2dDerInput: dy must be rank 4, but got rank "+c.rank),s(4===n.rank,"Error in conv2dDerInput: filter must be rank 4, but got rank "+n.rank),s(f===n.shape[2],"Error in conv2dDerInput: depth of input ("+f+") must match input depth for filter "+n.shape[2]+"."),s(h===n.shape[3],"Error in conv2dDerInput: depth of output ("+h+") mustmatch output depth for filter "+n.shape[3]+"."),null!=i&&s(v(a),"Error in conv2dDerInput: pad must be an integer when using, dimRoundingMode "+i+" but got pad "+a+".");var p=It(u,n.shape,r,1,a,i),d=fa.engine.runKernel(function(t){return t.conv2dDerInput(c,n,p)},{dy4D:c});return l?d.as3D(d.shape[1],d.shape[2],d.shape[3]):d},t.conv2dDerFilter=function(t,e,n,r,a,i){o({x:t,dy:e},"conv2dDerFilter");var u=t;3===t.rank&&(u=t.as4D(1,t.shape[0],t.shape[1],t.shape[2]));var c=e;3===c.rank&&(c=e.as4D(1,e.shape[0],e.shape[1],e.shape[2])),s(4===u.rank,"Error in conv2dDerFilter: input must be rank 4, but got shape "+u.shape+"."),s(4===c.rank,"Error in conv2dDerFilter: dy must be rank 4, but got shape "+c.shape+"."),s(4===n.length,"Error in conv2dDerFilter: filterShape must be length 4, but got "+n+"."),s(u.shape[3]===n[2],"Error in conv2dDerFilter: depth of input "+u.shape[3]+") must match input depth in filter ("+n[2]+"."),s(c.shape[3]===n[3],"Error in conv2dDerFilter: depth of dy ("+c.shape[3]+") must match output depth for filter ("+n[3]+")."),null!=i&&s(v(a),"Error in conv2dDerFilter: pad must be an integer when using, dimRoundingMode "+i+" but got pad "+a+".");var l=It(u.shape,n,r,1,a,i);return fa.engine.runKernel(function(t){return t.conv2dDerFilter(u,c,l)},{x4D:u,dy4D:c})},t.conv2dTranspose=function(e,n,r,a,i,u){return o({x:e,filter:n},"conv2dTranspose"),t.conv2dDerInput(r,e,n,a,i,u)},t.depthwiseConv2d=function(t,e,n,r,a,i,u){void 0===a&&(a="NHWC"),void 0===i&&(i=[1,1]),o({x:t,filter:e},"depthwiseConv2d");var c=t,l=!1;3===t.rank&&(l=!0,c=t.as4D(1,t.shape[0],t.shape[1],t.shape[2])),s(4===c.rank,"Error in depthwiseConv2D: input must be rank 4, but got rank "+c.rank+"."),s(4===e.rank,"Error in depthwiseConv2D: filter must be rank 4, but got rank "+e.rank+"."),s(c.shape[3]===e.shape[2],"Error in depthwiseConv2D: number of input channels ("+c.shape[3]+") must match the inChannels dimension in filter "+e.shape[2]+"."),null==i&&(i=[1,1]),s(Ft(n,i),"Error in depthwiseConv2d: Either strides or dilations must be 1.Got strides "+n+" and dilations '"+i+"'"),null!=u&&s(v(r),"Error in depthwiseConv2D: pad must be an integer when using, dimRoundingMode "+u+" but got pad "+r+".");var f=It(c.shape,e.shape,n,i,r,u,!0),h=fa.engine.runKernel(function(t){return t.depthwiseConv2D(c,e,f)},{x4D:c,filter:e});return l?h.as3D(h.shape[1],h.shape[2],h.shape[3]):h},t.separableConv2d=function(e,n,r,a,i,u,c){void 0===u&&(u=[1,1]),void 0===c&&(c="NHWC"),o({x:e,depthwiseFilter:n,pointwiseFilter:r},"separableConv2d");var l=e,f=!1;if(3===e.rank&&(f=!0,l=e.as4D(1,e.shape[0],e.shape[1],e.shape[2])),"NCHW"===c)throw new Error("separableConv2d currently does not support dataFormat NCHW; only NHWC is supported");s(4===l.rank,"Error in separableConv2d: input must be rank 4, but got rank "+l.rank+"."),s(4===n.rank,"Error in separableConv2d: depthwise filter must be rank 4, but got rank "+n.rank+"."),s(4===r.rank,"Error in separableConv2d: pointwise filter must be rank 4, but got rank "+n.rank+"."),s(1===r.shape[0],"Error in separableConv2d: the first dimension of pointwise filter must be 1, but got "+r.shape[0]+"."),s(1===r.shape[1],"Error in separableConv2d: the second dimension of pointwise filter must be 1, but got "+r.shape[1]+".");var h=n.shape[2],p=n.shape[3];s(r.shape[2]===h*p,"Error in separableConv2d: the third dimension of pointwise filter must be "+h*p+", but got "+r.shape[2]+".");var d=t.depthwiseConv2d(l,n,a,i,c,u),v=t.conv2d(d,r,1,"valid",c);return f?v.as3D(v.shape[1],v.shape[2],v.shape[3]):v},Lt([function(){for(var t=[],e=0;e=0;u--)(o=t[u])&&(i=(a<3?o(i):a>3?o(e,n,i):o(e,n))||i);return a>3&&i&&Object.defineProperty(e,n,i),i},Wt=function(){function t(){}return t.resizeBilinear=function(t,e,n){void 0===n&&(n=!1),o({images:t},"resizeBilinear"),s(3===t.rank||4===t.rank,"Error in resizeBilinear: x must be rank 3 or 4, but got rank "+t.rank+"."),s(2===e.length,"Error in resizeBilinear: new shape must 2D, but got shape "+e+".");var r=t,a=!1;3===t.rank&&(a=!0,r=t.as4D(1,t.shape[0],t.shape[1],t.shape[2]));var i=e[0],u=e[1],c=fa.engine.runKernel(function(t,e){return t.resizeBilinear(r,i,u,n)},{batchImages:r},function(t,e){return{batchImages:function(){return fa.engine.runKernel(function(e){return e.resizeBilinearBackprop(t,r,n)},{})}}});return a?c.as3D(c.shape[1],c.shape[2],c.shape[3]):c},t.resizeNearestNeighbor=function(t,e,n){void 0===n&&(n=!1),o({images:t},"resizeNearestNeighbor"),s(3===t.rank||4===t.rank,"Error in resizeNearestNeighbor: x must be rank 3 or 4, but got rank "+t.rank+"."),s(2===e.length,"Error in resizeNearestNeighbor: new shape must 2D, but got shape "+e+"."),s("float32"===t.dtype||"int32"===t.dtype,"`images` must have `int32` or `float32` as dtype");var r=t,a=!1;3===t.rank&&(a=!0,r=t.as4D(1,t.shape[0],t.shape[1],t.shape[2]));var i=e[0],u=e[1],c=fa.engine.runKernel(function(t){return t.resizeNearestNeighbor(r,i,u,n)},{batchImages:r});return a?c.as3D(c.shape[1],c.shape[2],c.shape[3]):c},zt([function(){for(var t=[],e=0;e=0;u--)(o=t[u])&&(i=(a<3?o(i):a>3?o(e,n,i):o(e,n))||i);return a>3&&i&&Object.defineProperty(e,n,i),i},Gt=function(){function t(){}return t.tidy=function(t,e,n){void 0===n&&(n=!1);var r=null;if(null==e){if("function"!=typeof t)throw new Error("Please provide a function to tidy()");e=t}else{if("string"!=typeof t&&!(t instanceof String))throw new Error("When calling with two arguments, the first argument to tidy() must be a string");if("function"!=typeof e)throw new Error("When calling with two arguments, the 2nd argument to tidy() must be a function");r=t}fa.engine.startScope(r,n);var o=e();return o instanceof Promise&&console.error("Cannot return a Promise inside of tidy."),fa.engine.endScope(o,n),o},t.dispose=function(t){M(t).forEach(function(t){return t.dispose()})},t.keep=function(t){return fa.engine.keep(t)},t.time=function(t){return fa.engine.time(t)},Vt([function(){for(var t=[],e=0;e=0;u--)(o=t[u])&&(i=(a<3?o(i):a>3?o(e,n,i):o(e,n))||i);return a>3&&i&&Object.defineProperty(e,n,i),i},jt=function(){function t(){}return t.gramSchmidt=function(t){var e;if(Array.isArray(t)){e=!1,s(null!=t&&t.length>0,"Gram-Schmidt process: input must not be null, undefined, or empty");for(var n=t[0].shape[0],r=1;r0)for(var n=0;n=0;u--)(o=t[u])&&(i=(a<3?o(i):a>3?o(e,n,i):o(e,n))||i);return a>3&&i&&Object.defineProperty(e,n,i),i},Xt=function(){function t(){}return t.logicalNot=function(t){return o({x:t},"logicalNot"),s("bool"===t.dtype,"Error Array must be of type bool."),fa.engine.runKernel(function(e){return e.logicalNot(t)},{x:t})},t.logicalAnd=function(t,e){return o({a:t,b:e},"logicalAnd"),s("bool"===t.dtype&&"bool"===e.dtype,"Error Array must be of type bool."),vt(t.shape,e.shape),fa.engine.runKernel(function(n){return n.logicalAnd(t,e)},{a:t,b:e})},t.logicalOr=function(t,e){return o({a:t,b:e},"logicalOr"),s("bool"===t.dtype&&"bool"===e.dtype,"Error Array must be of type bool."),vt(t.shape,e.shape),fa.engine.runKernel(function(n){return n.logicalOr(t,e)},{a:t,b:e})},t.logicalXor=function(e,n){return o({a:e,b:n},"logicalXor"),s("bool"===e.dtype&&"bool"===n.dtype,"Error Array must be of type bool."),vt(e.shape,n.shape),t.logicalOr(e,n).logicalAnd(t.logicalAnd(e,n).logicalNot())},t.where=function(t,e,n){o({condition:t,a:e,b:n},"where"),s("bool"===t.dtype||"bool"===e.dtype||"bool"===n.dtype,"Error Array must be of type bool."),c(e.shape,n.shape,"Error in where: "),1===t.rank?s(t.shape[0]===e.shape[0],"The first dimension of `a` must match the size of `condition`."):c(t.shape,n.shape,"Error in where: ");var r=kt(e.dtype,n.dtype);return fa.engine.runKernel(function(o){return o.where(t,e,n,r)},{condition:t,a:e,b:n})},Ht([function(){for(var t=[],e=0;e=0;u--)(o=t[u])&&(i=(a<3?o(i):a>3?o(e,n,i):o(e,n))||i);return a>3&&i&&Object.defineProperty(e,n,i),i};!function(t){t[t.NONE=0]="NONE",t[t.MEAN=1]="MEAN",t[t.SUM=2]="SUM",t[t.SUM_BY_NONZERO_WEIGHTS=3]="SUM_BY_NONZERO_WEIGHTS"}(Ut||(Ut={}));var Qt=function(){function t(){}return t.computeWeightedLoss=function(t,e,n){void 0===n&&(n=Ut.SUM_BY_NONZERO_WEIGHTS),o({losses:t},"computeWeightedLoss"),null!=e&&o({weights:e},"computeWeightedLoss");var r=null==e?t:t.mul(e);if(n===Ut.NONE)return r;if(n===Ut.SUM)return r.sum();if(n===Ut.MEAN)return null==e?r.mean():r.sum().div(e.sum());if(n===Ut.SUM_BY_NONZERO_WEIGHTS){if(null==e)return r.sum().div(no(t.size));var a=e.notEqual(no(0)).sum().toFloat();return r.sum().div(a)}throw Error("Unknown reduction: "+n)},t.absoluteDifference=function(e,n,r,a){void 0===a&&(a=Ut.SUM_BY_NONZERO_WEIGHTS),o({labels:e,predictions:n},"absoluteDifference"),null!=r&&o({weights:r},"absoluteDifference"),c(e.shape,n.shape,"Error in absoluteDifference: ");var i=e.sub(n).abs();return t.computeWeightedLoss(i,r,a)},t.meanSquaredError=function(e,n,r,a){void 0===a&&(a=Ut.SUM_BY_NONZERO_WEIGHTS),o({labels:e,predictions:n},"meanSquaredError"),null!=r&&o({weights:r},"meanSquaredError"),c(e.shape,n.shape,"Error in meanSquaredError: ");var i=e.squaredDifference(n);return t.computeWeightedLoss(i,r,a)},t.cosineDistance=function(e,n,r,a,i){void 0===i&&(i=Ut.SUM_BY_NONZERO_WEIGHTS),o({labels:e,predictions:n},"cosineDistance"),null!=a&&o({weights:a},"cosineDistance"),c(e.shape,n.shape,"Error in cosineDistance: ");var u=no(1).sub(e.mul(n).sum(r,!0));return t.computeWeightedLoss(u,a,i)},t.hingeLoss=function(e,n,r,a){void 0===a&&(a=Ut.SUM_BY_NONZERO_WEIGHTS),o({labels:e,predictions:n},"hingeLoss"),null!=r&&o({weights:r},"hingeLoss"),c(e.shape,n.shape,"Error in hingeLoss: ");var i=no(1);e=no(2).mul(e).sub(i);var u=i.sub(e.mul(n)).relu();return t.computeWeightedLoss(u,r,a)},t.logLoss=function(e,n,r,a,i){void 0===a&&(a=1e-7),void 0===i&&(i=Ut.SUM_BY_NONZERO_WEIGHTS),o({labels:e,predictions:n},"logLoss"),null!=r&&o({weights:r},"logLoss"),c(e.shape,n.shape,"Error in logLoss: ");var u=no(1),s=no(a),l=e.mul(n.add(s).log()).neg().sub(u.sub(e).mul(u.sub(n).add(s).log()));return t.computeWeightedLoss(l,r,i)},Kt([function(){for(var t=[],e=0;e=0;u--)(o=t[u])&&(i=(a<3?o(i):a>3?o(e,n,i):o(e,n))||i);return a>3&&i&&Object.defineProperty(e,n,i),i},Jt=function(){function t(){}return t.localResponseNormalization=function(t,e,n,r,a){void 0===e&&(e=5),void 0===n&&(n=1),void 0===r&&(r=1),void 0===a&&(a=.5),o({x:t},"localResponseNormalization"),s(4===t.rank||3===t.rank,"Error in localResponseNormalization: x must be rank 3 or 4 but got\n rank "+t.rank+"."),s(v(e),"Error in localResponseNormalization3D: radius must be an integer\n but got radius "+e+".");var i=t,u=!1;3===t.rank&&(u=!0,i=t.as4D(1,t.shape[0],t.shape[1],t.shape[2]));var c=fa.engine.runKernel(function(t){return t.localResponseNormalization4D(i,e,n,r,a)},{x4D:i});return u?c.as3D(c.shape[1],c.shape[2],c.shape[3]):c},Yt([function(){for(var t=[],e=0;e=0;u--)(o=t[u])&&(i=(a<3?o(i):a>3?o(e,n,i):o(e,n))||i);return a>3&&i&&Object.defineProperty(e,n,i),i},$t=function(){function t(){}return t.multiRNNCell=function(t,e,n,r){o({data:e,c:n,h:r},"multiRNNCell");for(var a=e,i=[],u=0;u=0;u--)(o=t[u])&&(i=(a<3?o(i):a>3?o(e,n,i):o(e,n))||i);return a>3&&i&&Object.defineProperty(e,n,i),i},ee=function(){function t(){}return t.matMul=function(t,e,n,r){void 0===n&&(n=!1),void 0===r&&(r=!1),o({a:t,b:e},"matMul");var a=n?t.shape[0]:t.shape[1],i=r?e.shape[1]:e.shape[0];s(2===t.rank&&2===e.rank,"Error in matMul: inputs must be rank 2, got ranks "+t.rank+" and "+e.rank+"."),s(a===i,"Error in matMul: inner shapes ("+a+") and ("+i+") of Tensors with shapes "+t.shape+" and "+e.shape+" and transposeA="+n+" and transposeB="+r+" must match.");return fa.engine.runKernel(function(o){return o.matMul(t,e,n,r)},{a:t,b:e},function(o){return n||r?!n&&r?{a:function(){return o.matMul(e.toFloat(),!1,!1)},b:function(){return o.matMul(t.toFloat(),!0,!1)}}:n&&!r?{a:function(){return e.toFloat().matMul(o,!1,!0)},b:function(){return t.toFloat().matMul(o,!1,!1)}}:{a:function(){return e.toFloat().matMul(o,!0,!0)},b:function(){return o.matMul(t.toFloat(),!0,!0)}}:{a:function(){return o.matMul(e.toFloat(),!1,!0)},b:function(){return t.toFloat().matMul(o,!0,!1)}}})},t.vectorTimesMatrix=function(t,e){return s(1===t.rank,"Error in vectorTimesMatrix: first input must be rank 1, but got rank "+t.rank+"."),s(2===e.rank,"Error in vectorTimesMatrix: second input must be rank 2, but got rank "+e.rank+"."),s(t.size===e.shape[0],"Error in vectorTimesMatrix: size of vector ("+t.size+") must match first dimension of matrix ("+e.shape[0]+")"),t.as2D(1,-1).matMul(e).as1D()},t.matrixTimesVector=function(t,e){return s(1===e.rank,"Error in matrixTimesVector: second input must rank 1, but got rank "+e.rank+"."),s(2===t.rank,"Error in matrixTimesVector: first input must be a rank 2, but got rank "+t.rank+"."),s(e.size===t.shape[1],"Error in matrixTimesVector: size of first rank 1 input "+e.size+" must match inner dimension of second rank 2 input, but got shape "+t.shape+"."),t.matMul(e.as2D(-1,1)).as1D()},t.dotProduct=function(t,e){return s(1===t.rank&&1===e.rank,"Error in dotProduct: inputs must be rank 1, but got ranks "+t.rank+" and "+e.rank+"."),s(t.size===e.size,"Error in dotProduct: size of inputs ("+t.size+") and ("+e.size+") must match."),t.as2D(1,-1).matMul(e.as2D(-1,1)).asScalar()},t.outerProduct=function(t,e){return s(1===t.rank&&1===e.rank,"Error in outerProduct: inputs must be rank 1, but got ranks "+t.rank+" and "+e.rank+"."),t.as2D(-1,1).matMul(e.as2D(1,-1))},te([function(){for(var t=[],e=0;e=0;u--)(o=t[u])&&(i=(a<3?o(i):a>3?o(e,n,i):o(e,n))||i);return a>3&&i&&Object.defineProperty(e,n,i),i},re=function(){function t(){}return t.movingAverage=function(t,e,n,r,a){void 0===a&&(a=!0),o({v:t,x:e},"movingAverage"),l(t,e),s(d(t.shape,e.shape),"Shape mismatch in v and x");var i=ft.scalar(1);n="number"==typeof n?ft.scalar(n):n;var u=i.sub(n),c=e.sub(t).mul(u);return a&&(s(null!=r,"When using zeroDebias: true, step is required."),r="number"==typeof r?ft.scalar(r):r,c=c.div(i.sub(Tt.pow(n,r)))),t.add(c)},ne([function(){for(var t=[],e=0;e=0;u--)(o=t[u])&&(i=(a<3?o(i):a>3?o(e,n,i):o(e,n))||i);return a>3&&i&&Object.defineProperty(e,n,i),i},ae=function(){function t(){}return t.norm=function(t,e,n,r){void 0===e&&(e="euclidean"),void 0===n&&(n=null),void 0===r&&(r=!1),o({x:t},"norm");var a=function t(e,n,r){void 0===r&&(r=null);if(0===e.rank)return e.abs();if(1!==e.rank&&null===r)return t(e.reshape([-1]),n,r);if(1===e.rank||"number"==typeof r||r instanceof Array&&1===r.length){if(1===n)return e.abs().sum(r);if(n===1/0)return e.abs().max(r);if(n===-1/0)return e.abs().min(r);if("euclidean"===n||2===n)return e.abs().pow(no(2,"int32")).sum(r).sqrt();throw new Error("Error in norm: invalid ord value: "+n)}if(r instanceof Array&&2===r.length){if(1===n)return e.abs().sum(r[0]).max(r[1]-1);if(n===1/0)return e.abs().sum(r[1]).max(r[0]);if(n===-1/0)return e.abs().sum(r[1]).min(r[0]);if("fro"===n||"euclidean"===n)return e.square().sum(r).sqrt();throw new Error("Error in norm: invalid ord value: "+n)}throw new Error("Error in norm: invalid axis: "+r)}(t,e,n),i=a.shape;if(r){var u=V(n,t.shape);i=W(a.shape,u)}return a.reshape(i)},oe([function(){for(var t=[],e=0;e=0;u--)(o=t[u])&&(i=(a<3?o(i):a>3?o(e,n,i):o(e,n))||i);return a>3&&i&&Object.defineProperty(e,n,i),i},ue=function(){function t(){}return t.maxPool=function(e,n,r,a,i){o({x:e},"maxPool");var u=e,c=!1;3===e.rank&&(c=!0,u=e.as4D(1,e.shape[0],e.shape[1],e.shape[2])),s(4===u.rank,"Error in maxPool: input must be rank 4 but got rank "+u.rank+"."),null!=i&&s(v(a),"Error in maxPool: pad must be an integer when using, dimRoundingMode "+i+" but got pad "+a+".");var l=Dt(u.shape,n,r,a,i),f=fa.engine.runKernel(function(t,e){return e(t.maxPool(u,l))},{x:u},function(e,o){var i=o[0];return{x:function(){return t.maxPoolBackprop(e,u,i,n,r,a)}}});return c?f.as3D(f.shape[1],f.shape[2],f.shape[3]):f},t.maxPoolBackprop=function(t,e,n,r,a,i,u){o({dy:t,input:e,output:n},"maxPoolBackprop"),s(e.rank===t.rank,"Rank of input ("+e.rank+") does not match rank of dy ("+t.rank+")"),s(4===t.rank,"Error in maxPoolBackprop: dy must be rank 4 but got rank "+t.rank+"."),s(4===e.rank,"Error in maxPoolBackprop: input must be rank 4 but got rank "+e.rank+"."),null!=u&&s(v(i),"Error in maxPoolBackprop: pad must be an integer when using, dimRoundingMode "+u+" but got pad "+i+".");var c=Dt(e.shape,r,a,i,u);return fa.engine.runKernel(function(r){return r.maxPoolBackprop(t,e,n,c)},{dy:t,input:e})},t.avgPool=function(e,n,r,a,i){o({x:e},"avgPool"),s("float32"===e.dtype,"The input dtype to avgPool must be float32");var u=e,c=!1;3===e.rank&&(c=!0,u=e.as4D(1,e.shape[0],e.shape[1],e.shape[2])),s(4===u.rank,"Error in avgPool: x must be rank 4 but got rank "+u.rank+"."),null!=i&&s(v(a),"Error in avgPool: pad must be an integer when using, dimRoundingMode "+i+" but got pad "+a+".");var l=Dt(u.shape,n,r,a),f=fa.engine.runKernel(function(t){return t.avgPool(u,l)},{x:u},function(e){return{x:function(){return t.avgPoolBackprop(e,u,n,r,a)}}});return f=f.cast(e.dtype),c?f.as3D(f.shape[1],f.shape[2],f.shape[3]):f},t.avgPoolBackprop=function(t,e,n,r,a){o({dy:t,input:e},"avgPoolBackprop"),s(e.rank===t.rank,"Rank of input ("+e.rank+") does not match rank of dy ("+t.rank+")");var i=e,u=t,c=!1;3===e.rank&&(c=!0,i=e.as4D(1,e.shape[0],e.shape[1],e.shape[2]),u=t.as4D(1,t.shape[0],t.shape[1],t.shape[2])),s(4===u.rank,"Error in avgPoolBackprop: dy must be rank 4 but got rank "+u.rank+"."),s(4===i.rank,"Error in avgPoolBackprop: input must be rank 4 but got rank "+i.rank+".");var l=Dt(i.shape,n,r,a),f=fa.engine.runKernel(function(t){return t.avgPoolBackprop(u,i,l)},{dy4D:u,input4D:i});return c?f.as3D(f.shape[1],f.shape[2],f.shape[3]):f},ie([function(){for(var t=[],e=0;e=0;u--)(o=t[u])&&(i=(a<3?o(i):a>3?o(e,n,i):o(e,n))||i);return a>3&&i&&Object.defineProperty(e,n,i),i},ce=function(){function t(){}return t.reverse1d=function(e){return s(1===e.rank,"Error in reverse1D: x must be rank 1 but got\n rank "+e.rank+"."),t.reverse(e,0)},t.reverse2d=function(e,n){return s(2===e.rank,"Error in reverse2D: x must be rank 2 but got\n rank "+e.rank+"."),t.reverse(e,n)},t.reverse3d=function(e,n){return s(3===e.rank,"Error in reverse3D: x must be rank 3 but got\n rank "+e.rank+"."),t.reverse(e,n)},t.reverse4d=function(e,n){return s(4===e.rank,"Error in reverse4D: x must be rank 4 but got\n rank "+e.rank+"."),t.reverse(e,n)},t.reverse=function(t,e){if(o({x:t},"reverse"),0===t.rank)return t.clone();var n=V(e,t.shape);return fa.engine.runKernel(function(e){return e.reverse(t,n)},{x:t},function(t){return{x:function(){return t.reverse(n)}}}).reshapeAs(t)},se([function(){for(var t=[],e=0;e0?o>=u[e]:o<=u[e]);o+=r[e])n+=1;return n}),[i,c]}function fe(t,e,n,r,o){var a=e[o];t&1<0?Number.MIN_SAFE_INTEGER:Number.MAX_SAFE_INTEGER);var u=r[o];return a<0&&(a+=u),a=i(0,a,u-1)}function he(t,e,n,r,o){var a=e[o];t&1<0?Number.MAX_SAFE_INTEGER:Number.MIN_SAFE_INTEGER);var u=r[o];return a<0&&(a+=u),a=n[o]>0?i(0,a,u):i(-1,a,u-1)}var pe,de=function(t,e,n,r){var o,a=arguments.length,i=a<3?e:null===r?r=Object.getOwnPropertyDescriptor(e,n):r;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)i=Reflect.decorate(t,e,n,r);else for(var u=t.length-1;u>=0;u--)(o=t[u])&&(i=(a<3?o(i):a>3?o(e,n,i):o(e,n))||i);return a>3&&i&&Object.defineProperty(e,n,i),i},ve=function(){function t(){}return t.slice1d=function(e,n,r){return s(1===e.rank,"slice1d expects a rank-1 tensor, but got a rank-"+e.rank+" tensor"),t.slice(e,[n],[r])},t.slice2d=function(e,n,r){return s(2===e.rank,"slice1d expects a rank-2 tensor, but got a rank-"+e.rank+" tensor"),t.slice(e,n,r)},t.slice3d=function(e,n,r){return s(3===e.rank,"slice1d expects a rank-3 tensor, but got a rank-"+e.rank+" tensor"),t.slice(e,n,r)},t.slice4d=function(e,n,r){return s(4===e.rank,"slice1d expects a rank-4 tensor, but got a rank-"+e.rank+" tensor"),t.slice(e,n,r)},t.slice=function(t,e,n){if(o({x:t},"slice"),0===t.rank)throw new Error("Slicing scalar is not possible");var r,a;r="number"==typeof e?[e].concat(new Array(t.rank-1).fill(0)):e.length=0?e:(s(-1===e,"Bad value in size"),t.shape[n]-r[n])}),function(t,e,n){s(t.rank===e.length,"Error in slice"+t.rank+"D: Length of begin "+e+" must match the rank of the array ("+t.rank+")."),s(t.rank===n.length,"Error in slice"+t.rank+"D: Length of size "+n+" must match the rank of the array ("+t.rank+").");for(var r=0;r=0;u--)(o=t[u])&&(i=(a<3?o(i):a>3?o(e,n,i):o(e,n))||i);return a>3&&i&&Object.defineProperty(e,n,i),i},me=function(){function t(){}return t.softmax=function(t,e){if(void 0===e&&(e=-1),o({logits:t},"softmax"),-1===e&&(e=t.rank-1),e!==t.rank-1)throw Error("Softmax along a non-last dimension is not yet supported. Logits was rank "+t.rank+" and dim was "+e);return Ko(function(t){var n=t.logSumExp([e],!0),r=t.toFloat().sub(n).exp();return{value:r,gradFunc:function(t){var n=t.mul(r);return n.sub(n.sum([e],!0).mul(r))}}})(t)},t.softmaxCrossEntropy=function(t,e,n){if(void 0===n&&(n=-1),o({labels:t,logits:e},"softmaxCrossEntropy"),c(t.shape,e.shape,"Error in softmaxCrossEntropy: "),-1===n&&(n=e.rank-1),n!==e.rank-1)throw Error("Softmax cross entropy along a non-last dimension is not yet supported. Labels / logits was rank "+e.rank+" and dim was "+n);return Ko(function(t,e){var r=e.softmax(n);return{value:no(1e-5).add(r).log().mul(t).neg().sum([n]),gradFunc:function(e){var o=W(e.shape,[n]);return[e.reshape(o).mul(t.toFloat().sub(r)),e.reshape(o).mul(r.sub(t.toFloat()))]}}})(t,e)},ge([function(){for(var t=[],e=0;e=0;u--)(o=t[u])&&(i=(a<3?o(i):a>3?o(e,n,i):o(e,n))||i);return a>3&&i&&Object.defineProperty(e,n,i),i},be=function(){function t(){}return t.stridedSlice=function(t,e,n,r,a,i){return void 0===a&&(a=0),void 0===i&&(i=0),o({x:t},"stridedSlice"),fa.engine.runKernel(function(o){return o.stridedSlice(t,e,n,r,a,i)},{x:t})},ye([function(){for(var t=[],e=0;e=0;u--)(o=t[u])&&(i=(a<3?o(i):a>3?o(e,n,i):o(e,n))||i);return a>3&&i&&Object.defineProperty(e,n,i),i},we=function(){function t(){}return t.transpose=function(t,e){if(o({x:t},"transpose"),null==e&&(e=t.shape.map(function(t,e){return e}).reverse()),s(t.rank===e.length,"Error in transpose: rank of input "+t.rank+" must match length of perm "+e+"."),e.forEach(function(n){s(n>=0&&n=0;u--)(o=t[u])&&(i=(a<3?o(i):a>3?o(e,n,i):o(e,n))||i);return a>3&&i&&Object.defineProperty(e,n,i),i},Se=function(){function t(){}return t.neg=function(t){o({x:t},"neg");return fa.engine.runKernel(function(e){return e.neg(t)},{x:t},function(t){return{x:function(){return t.neg()}}})},t.ceil=function(t){o({x:t},"ceil");return fa.engine.runKernel(function(e){return e.ceil(t)},{x:t},function(t){return{x:function(){return Ur(t)}}})},t.floor=function(t){o({x:t},"floor");return fa.engine.runKernel(function(e){return e.floor(t)},{x:t},function(t){return{x:function(){return Ur(t)}}})},t.sign=function(t){o({x:t},"sign");return fa.engine.runKernel(function(e){return e.sign(t)},{x:t},function(t){return{x:function(){return Ur(t)}}})},t.round=function(t){o({x:t},"round");return fa.engine.runKernel(function(e){return e.round(t)},{x:t},function(t){return{x:function(){return Ur(t)}}})},t.exp=function(t){o({x:t},"exp");return fa.engine.runKernel(function(e,n){return n(e.exp(t))},{x:t},function(t,e){var n=e[0];return{x:function(){return t.mulStrict(n)}}})},t.expm1=function(t){o({x:t},"expm1");return fa.engine.runKernel(function(e){return e.expm1(t)},{x:t},function(e){return{x:function(){return e.mulStrict(t.exp())}}})},t.log=function(t){o({x:t},"log");return fa.engine.runKernel(function(e){return e.log(t)},{x:t},function(e){return{x:function(){return e.divStrict(t.toFloat())}}})},t.log1p=function(t){o({x:t},"log1p");return fa.engine.runKernel(function(e){return e.log1p(t)},{x:t},function(e){return{x:function(){return e.divStrict(t.add(no(1)))}}})},t.sqrt=function(t){o({x:t},"sqrt");return fa.engine.runKernel(function(e){return e.sqrt(t)},{x:t},function(e){return{x:function(){return e.divStrict(t.toFloat().sqrt().mul(no(2)))}}})},t.rsqrt=function(t){o({x:t},"rsqrt");return fa.engine.runKernel(function(e){return e.rsqrt(t)},{x:t},function(e){return{x:function(){return e.divStrict(t.pow(no(1.5)).mul(no(2))).neg()}}})},t.square=function(t){o({x:t},"square");return fa.engine.runKernel(function(e){return e.square(t)},{x:t},function(e){return{x:function(){return e.mulStrict(t.toFloat().mul(no(2)))}}})},t.reciprocal=function(t){o({x:t},"reciprocal");return fa.engine.runKernel(function(e){return e.reciprocal(t)},{x:t},function(e){return{x:function(){return e.divStrict(t.square().neg())}}})},t.abs=function(t){o({x:t},"abs");return fa.engine.runKernel(function(e){return e.abs(t)},{x:t},function(e){return{x:function(){return e.mulStrict(t.toFloat().step(-1))}}})},t.clipByValue=function(t,e,n){o({x:t},"clipByValue"),s(e<=n,"Error in clip: min ("+e+") must be less than or equal to max ("+n+").");return fa.engine.runKernel(function(r){return r.clip(t,e,n)},{x:t},function(r){return{x:function(){return r.where(t.greater(no(e)).logicalAnd(t.less(no(n))),Ur(r))}}})},t.relu=function(t){if(o({x:t},"relu"),"bool"===t.dtype)return t.toInt();return fa.engine.runKernel(function(e){return e.relu(t)},{x:t},function(e){var n=t.step();return{x:function(){return e.mulStrict(n.toFloat())}}})},t.elu=function(t){o({x:t},"elu");return fa.engine.runKernel(function(e,n){return n(e.elu(t))},{x:t},function(t,e){var n=e[0];return{x:function(){return fa.engine.runKernel(function(e){return e.eluDer(t,n)},{dy:t,y:n})}}})},t.selu=function(t){o({x:t},"selu");return fa.engine.runKernel(function(e){return e.selu(t)},{x:t},function(e){return{x:function(){var n=t.greater(no(0)),r=no(1.7580993408473768),o=no(1.0507009873554805),a=e.mul(o),i=e.mul(r).mul(t.toFloat().exp());return _n(n,a,i)}}})},t.leakyRelu=function(t,e){return void 0===e&&(e=.2),o({x:t},"leakyRelu"),mr(no(e).mul(t),t)},t.prelu=function(t,e){o({x:t,alpha:e},"prelu");var n=no(0);return mr(n,t).add(e.mul(br(n,t)))},t.sigmoid=function(t){o({x:t},"sigmoid");return fa.engine.runKernel(function(e,n){return n(e.sigmoid(t))},{x:t},function(t,e){var n=e[0];return{x:function(){return t.mulStrict(n.mul(no(1).sub(n)))}}})},t.logSigmoid=function(t){o({x:t},"logSigmoid");return fa.engine.runKernel(function(e){return e.softplus(t.neg()).neg()},{x:t},function(e){return{x:function(){return e.mulStrict(t.neg().sigmoid())}}})},t.softplus=function(t){o({x:t},"softplus");return fa.engine.runKernel(function(e){return e.softplus(t)},{x:t},function(e){return{x:function(){return e.mulStrict(t.sigmoid())}}})},t.sin=function(t){o({x:t},"sin");return fa.engine.runKernel(function(e){return e.sin(t)},{x:t},function(e){return{x:function(){return t.toFloat().cos().mulStrict(e)}}})},t.cos=function(t){o({x:t},"cos");return fa.engine.runKernel(function(e){return e.cos(t)},{x:t},function(e){return{x:function(){return t.toFloat().sin().neg().mulStrict(e)}}})},t.tan=function(t){o({x:t},"tan");return fa.engine.runKernel(function(e){return e.tan(t)},{x:t},function(e){return{x:function(){return e.divStrict(t.cos().square())}}})},t.asin=function(e){o({x:e},"asin");return fa.engine.runKernel(function(t){return t.asin(e)},{x:e},function(n){return{x:function(){return n.divStrict(t.sqrt(no(1).sub(e.toFloat().square())))}}})},t.acos=function(e){o({x:e},"acos");return fa.engine.runKernel(function(t){return t.acos(e)},{x:e},function(n){return{x:function(){return n.divStrict(t.sqrt(no(1).sub(e.toFloat().square()))).neg()}}})},t.atan=function(t){o({x:t},"atan");return fa.engine.runKernel(function(e){return e.atan(t)},{x:t},function(e){return{x:function(){return e.divStrict(no(1).add(t.toFloat().square()))}}})},t.sinh=function(t){o({x:t},"sinh");return fa.engine.runKernel(function(e){return e.sinh(t)},{x:t},function(e){return{x:function(){return t.toFloat().cosh().mulStrict(e)}}})},t.cosh=function(t){o({x:t},"cosh");return fa.engine.runKernel(function(e){return e.cosh(t)},{x:t},function(e){return{x:function(){return t.toFloat().sinh().mulStrict(e)}}})},t.tanh=function(t){o({x:t},"tanh");return fa.engine.runKernel(function(e,n){return n(e.tanh(t))},{x:t},function(t,e){var n=e[0];return{x:function(){return no(1).sub(n.square()).mulStrict(t)}}})},t.asinh=function(e){o({x:e},"asinh");return fa.engine.runKernel(function(t){return t.asinh(e)},{x:e},function(n){return{x:function(){return n.divStrict(t.sqrt(no(1).add(e.toFloat().square())))}}})},t.acosh=function(e){o({x:e},"acosh");return fa.engine.runKernel(function(t){return t.acosh(e)},{x:e},function(n){return{x:function(){return n.divStrict(t.sqrt(e.toFloat().square().sub(no(1))))}}})},t.atanh=function(t){o({x:t},"atanh");return fa.engine.runKernel(function(e){return e.atanh(t)},{x:t},function(e){return{x:function(){return e.divStrict(no(1).sub(t.toFloat().square()))}}})},t.erf=function(t){s("int32"===t.dtype||"float32"===t.dtype,"Input dtype must be `int32` or `float32`."),"int32"===t.dtype&&(t=t.toFloat());return fa.engine.runKernel(function(e){return e.erf(t)},{x:t},function(e){return{x:function(){return e.mulStrict(no(2/Math.sqrt(Math.PI)).mul(t.square().neg().exp()))}}})},t.step=function(t,e){void 0===e&&(e=0),o({x:t},"step");return fa.engine.runKernel(function(n){return n.step(t,e)},{x:t},function(t){return{x:function(){return Ur(t)}}})},Ee([function(){for(var t=[],e=0;e=0;u--)(o=t[u])&&(i=(a<3?o(i):a>3?o(e,n,i):o(e,n))||i);return a>3&&i&&Object.defineProperty(e,n,i),i},Ao=function(t,e,n,r){return new(n||(n=Promise))(function(o,a){function i(t){try{s(r.next(t))}catch(t){a(t)}}function u(t){try{s(r.throw(t))}catch(t){a(t)}}function s(t){t.done?o(t.value):new n(function(e){e(t.value)}).then(i,u)}s((r=r.apply(t,e||[])).next())})},Do=function(t,e){var n,r,o,a,i={label:0,sent:function(){if(1&o[0])throw o[1];return o[1]},trys:[],ops:[]};return a={next:u(0),throw:u(1),return:u(2)},"function"==typeof Symbol&&(a[Symbol.iterator]=function(){return this}),a;function u(a){return function(u){return function(a){if(n)throw new TypeError("Generator is already executing.");for(;i;)try{if(n=1,r&&(o=r[2&a[0]?"return":a[0]?"throw":"next"])&&!(o=o.call(r,a[1])).done)return o;switch(r=0,o&&(a=[0,o.value]),a[0]){case 0:case 1:o=a;break;case 4:return i.label++,{value:a[1],done:!1};case 5:i.label++,r=a[1],a=[0];continue;case 7:a=i.ops.pop(),i.trys.pop();continue;default:if(!(o=(o=i.trys).length>0&&o[o.length-1])&&(6===a[0]||2===a[0])){i=0;continue}if(3===a[0]&&(!o||a[1]>o[0]&&a[1]=0;--r)n[r]=n[r+1]*t[r+1];return n}var Po=function(t,e,n,r){var o,a=arguments.length,i=a<3?e:null===r?r=Object.getOwnPropertyDescriptor(e,n):r;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)i=Reflect.decorate(t,e,n,r);else for(var u=t.length-1;u>=0;u--)(o=t[u])&&(i=(a<3?o(i):a>3?o(e,n,i):o(e,n))||i);return a>3&&i&&Object.defineProperty(e,n,i),i},Bo=function(){function t(){}return t.gradScope=function(t,e){return Uo(t,e,!0)},t.grad=function(t){return s(D(t),"The f passed in grad(f) must be a function"),function(e,n){return s(e instanceof Mo,"The x passed in grad(f)(x) must be a tensor"),s(null==n||n instanceof Mo,"The dy passed in grad(f)(x, dy) must be a tensor"),Uo(function(){var r=fa.engine.gradients(function(){return t(e)},[e],n),o=r.value,a=r.grads;return null!=n&&c(o.shape,n.shape,"The shape of dy passed in grad(f)(x, dy) must match the shape returned by f(x)"),Fo(a),a[0]})}},t.grads=function(t){return s(D(t),"The f passed in grads(f) must be a function"),function(e,n){return s(Array.isArray(e)&&e.every(function(t){return t instanceof Mo}),"The args passed in grads(f)(args) must be an array of tensors"),s(null==n||n instanceof Mo,"The dy passed in grads(f)(args, dy) must be a tensor"),Uo(function(){var r=fa.engine.gradients(function(){return t.apply(void 0,e)},e,n),o=r.value,a=r.grads;return null!=n&&c(o.shape,n.shape,"The shape of dy passed in grads(f)([x1,...], dy) must match the shape returned by f([x1,...])"),Fo(a),a})}},t.valueAndGrad=function(t){return s(D(t),"The f passed in valueAndGrad(f) must be a function"),function(e,n){s(e instanceof Mo,"The x passed in valueAndGrad(f)(x) must be a tensor"),s(null==n||n instanceof Mo,"The dy passed in valueAndGrad(f)(x, dy) must be a tensor");var r=fa.engine.gradients(function(){return t(e)},[e],n),o=r.grads,a=r.value;return Fo(o),{grad:o[0],value:a}}},t.valueAndGrads=function(t){return s(D(t),"The f passed in valueAndGrads(f) must be a function"),function(e,n){s(Array.isArray(e)&&e.every(function(t){return t instanceof Mo}),"The args passed in valueAndGrads(f)(args) must be array of tensors"),s(null==n||n instanceof Mo,"The dy passed in valueAndGrads(f)(args, dy) must be a tensor");var r=fa.engine.gradients(function(){return t.apply(void 0,e)},e,n);return null!=n&&c(r.value.shape,n.shape,"The shape of dy passed in valueAndGrads(f)([x1,...], dy) must match the shape returned by f([x1,...])"),Fo(r.grads),r}},t.variableGrads=function(t,e){if(s(D(t),"The f passed in variableGrads(f) must be a function"),s(null==e||Array.isArray(e)&&e.every(function(t){return t instanceof Oo}),"The varList passed in variableGrads(f, varList) must be an array of variables"),null==e)for(var n in e=[],fa.engine.registeredVariables)e.push(fa.engine.registeredVariables[n]);var r=e.length;s((e=e.filter(function(t){return t.trainable})).length>0,"variableGrads() expects at least one of the input variables to be trainable, but none of the "+r+" variables is trainable.");var o=fa.engine.gradients(t,e,null,!0),a=o.value,i=o.grads;s(i.some(function(t){return null!=t}),"Cannot find a connection between any variable and the result of the loss function y=f(x). Please make sure the operations that use variables are inside the function f passed to minimize()."),s(0===a.rank,"The f passed in variableGrads(f) must return a scalar, but it returned a rank-"+a.rank+" tensor");var u={};return e.forEach(function(t,e){null!=i[e]&&(u[t.name]=i[e])}),{value:a,grads:u}},t.customGrad=function(t){return fa.engine.customGrad(t)},Po([function(){for(var t=[],e=0;e0)throw new Error("Cannot compute gradient of y=f(x) with respect to x. Make sure that\n the f you passed encloses all operations that lead from x to y.")}var Uo=Gt.tidy,zo=Gt.keep,Wo=Gt.dispose,Vo=Gt.time,Go=Bo.grad,qo=Bo.valueAndGrad,jo=Bo.grads,Ho=Bo.valueAndGrads,Xo=Bo.variableGrads,Ko=Bo.customGrad,Qo=function(){function t(t,e){this.backendTimer=t,this.logger=e,null==e&&(this.logger=new Yo)}return t.prototype.profileKernel=function(t,e){var n,r=this,o=this.backendTimer.time(function(){n=e()}),a=n.dataSync();return k(a,n.dtype,t),o.then(function(e){r.logger.logKernelProfile(t,n,a,e.kernelMs)}),n},t}(),Yo=function(){function t(){}return t.prototype.logKernelProfile=function(t,e,n,r){var o=y(r+"ms",9),a=y(t,25),i=e.rank,u=e.size,s=y(e.shape.toString(),14);console.log("%c"+a+"\t%c"+o+"\t%c"+i+"D "+s+"\t%c"+u,"font-weight:bold","color:red","color:blue","color: orange")},t}();var Jo,Zo=function(t,e,n,r){return new(n||(n=Promise))(function(o,a){function i(t){try{s(r.next(t))}catch(t){a(t)}}function u(t){try{s(r.throw(t))}catch(t){a(t)}}function s(t){t.done?o(t.value):new n(function(e){e(t.value)}).then(i,u)}s((r=r.apply(t,e||[])).next())})},$o=function(t,e){var n,r,o,a,i={label:0,sent:function(){if(1&o[0])throw o[1];return o[1]},trys:[],ops:[]};return a={next:u(0),throw:u(1),return:u(2)},"function"==typeof Symbol&&(a[Symbol.iterator]=function(){return this}),a;function u(a){return function(u){return function(a){if(n)throw new TypeError("Generator is already executing.");for(;i;)try{if(n=1,r&&(o=r[2&a[0]?"return":a[0]?"throw":"next"])&&!(o=o.call(r,a[1])).done)return o;switch(r=0,o&&(a=[0,o.value]),a[0]){case 0:case 1:o=a;break;case 4:return i.label++,{value:a[1],done:!1};case 5:i.label++,r=a[1],a=[0];continue;case 7:a=i.ops.pop(),i.trys.pop();continue;default:if(!(o=(o=i.trys).length>0&&o[o.length-1])&&(6===a[0]||2===a[0])){i=0;continue}if(3===a[0]&&(!o||a[1]>o[0]&&a[1] {...}) to avoid memory leaks.");return this.activeScope.keep.push(t),t},t.prototype.startScope=function(t,e){void 0===e&&(e=!1),e&&0===this.gradientScopeCount&&(this.activeTape=[]),e&&this.gradientScopeCount++;var n={keep:[],track:[]};t&&(n.name=t),this.scopeStack.push(n),this.activeScope=n},t.prototype.endScope=function(t,e){var n=this;void 0===e&&(e=!1),e&&(this.gradientScopeCount--,0===this.gradientScopeCount&&(this.activeTape=null));var r=this.activeScope.keep,o=I(t);r=r.concat(o);for(var a=0;a0,"gradients() received an empty list of xs."),Uo("gradients",function(){var a=t();s(a instanceof Mo,"The result y returned by f() must be a tensor.");var i=function(t,e,n){for(var r={},o={},a=0;a=0;a--){i=(v=t[a]).inputs;var p=[];for(p.push(v.output),l=0;l0)throw new Error("Cannot compute gradient of y=f(x) with respect to x. Make sure that the f you passed encloses all operations that lead from x to y.");var u={};return u[a.id]=null==n?Pr(a.shape):n,function(t,e){for(var n=e.length-1;n>=0;n--){var r=e[n],o=t[r.output.id];if(null==r.gradient)throw new Error("Cannot compute gradient: gradient function not found for "+r.name+".");var a=r.gradient(o);for(var i in r.inputs){if(!(i in a))throw new Error("Cannot backprop through input "+i+". Available gradients found: "+Object.keys(a)+".");var u=a[i](),s=r.inputs[i];if(!d(u.shape,s.shape))throw new Error("Error in gradient for op "+r.name+". The gradient of input '"+i+"' has shape '"+u.shape+"', which does not match the shape of the input '"+s.shape+"'");if(null==t[s.id])t[s.id]=u;else{var c=t[s.id];t[s.id]=c.add(u),c.dispose()}}}}(u,i),{value:a,grads:e.map(function(t){return u[t.id]})}},!0)},t.prototype.customGrad=function(t){var e=this;return s(D(t),"The f passed in customGrad(f) must be a function."),function(){for(var n,r=[],o=0;o {op();...}); to avoid memory leaks.");return this.activeScope.track.push(t),t},t}(),ea=function(t,e,n,r){var o,a=arguments.length,i=a<3?e:null===r?r=Object.getOwnPropertyDescriptor(e,n):r;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)i=Reflect.decorate(t,e,n,r);else for(var u=t.length-1;u>=0;u--)(o=t[u])&&(i=(a<3?o(i):a>3?o(e,n,i):o(e,n))||i);return a>3&&i&&Object.defineProperty(e,n,i),i};!function(t){t[t.NUMBER=0]="NUMBER",t[t.BOOLEAN=1]="BOOLEAN",t[t.STRING=2]="STRING"}(Jo||(Jo={}));var na=[{name:"DEBUG",type:Jo.BOOLEAN},{name:"IS_BROWSER",type:Jo.BOOLEAN},{name:"WEBGL_DISJOINT_QUERY_TIMER_EXTENSION_VERSION",type:Jo.NUMBER},{name:"WEBGL_DISJOINT_QUERY_TIMER_EXTENSION_RELIABLE",type:Jo.BOOLEAN},{name:"WEBGL_VERSION",type:Jo.NUMBER},{name:"WEBGL_FLOAT_TEXTURE_ENABLED",type:Jo.BOOLEAN},{name:"WEBGL_GET_BUFFER_SUB_DATA_ASYNC_EXTENSION_ENABLED",type:Jo.BOOLEAN},{name:"BACKEND",type:Jo.STRING}];function ra(t,e){return null!=t.getExtension(e)}function oa(t){if(0===t)throw new Error("Cannot get WebGL rendering context, WebGL is disabled.");var e=document.createElement("canvas");return 1===t?e.getContext("webgl")||e.getContext("experimental-webgl"):e.getContext("webgl2")}function aa(t){if(null!=t){var e=t.getExtension("WEBGL_lose_context");if(null==e)throw new Error("Extension WEBGL_lose_context not supported on this browser.");e.loseContext()}}function ia(t){var e=oa(t);return null!=e&&(aa(e),!0)}var ua=function(){function t(t){this.features={},this.registry={},null!=t&&(this.features=t),this.get("DEBUG")&&console.warn("Debugging mode is ON. The output of every math call will be downloaded to CPU and checked for NaNs. This significantly impacts performance.")}return t.setBackend=function(t,e){if(void 0===e&&(e=!1),!(t in fa.registry))throw new Error("Backend type '"+t+"' not found in registry");fa.initBackend(t,e)},t.getBackend=function(){return fa.initDefaultBackend(),fa.currentBackend},t.disposeVariables=function(){fa.engine.disposeVariables()},t.memory=function(){return fa.engine.memory()},t.prototype.get=function(t){return t in this.features?this.features[t]:(this.features[t]=this.evaluateFeature(t),this.features[t])},t.prototype.set=function(t,e){this.features[t]=e},t.prototype.getBestBackendType=function(){var t=this;if(0===Object.keys(this.registry).length)throw new Error("No backend found in registry.");return Object.keys(this.registry).map(function(e){return{name:e,entry:t.registry[e]}}).sort(function(t,e){return e.entry.priority-t.entry.priority})[0].name},t.prototype.evaluateFeature=function(t){if("DEBUG"===t)return!1;if("IS_BROWSER"===t)return"undefined"!=typeof window;if("BACKEND"===t)return this.getBestBackendType();if("WEBGL_DISJOINT_QUERY_TIMER_EXTENSION_VERSION"===t){var e=this.get("WEBGL_VERSION");return 0===e?0:function(t){if(0===t)return 0;var e,n=oa(t);return e=ra(n,"EXT_disjoint_timer_query_webgl2")&&2===t?2:ra(n,"EXT_disjoint_timer_query")?1:0,null!=n&&aa(n),e}(e)}if("WEBGL_DISJOINT_QUERY_TIMER_EXTENSION_RELIABLE"===t)return this.get("WEBGL_DISJOINT_QUERY_TIMER_EXTENSION_VERSION")>0&&(n=navigator.userAgent||navigator.vendor||window.opera,!(/(android|bb\d+|meego).+mobile|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\.(browser|link)|vodafone|wap|windows ce|xda|xiino/i.test(n)||/1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\-(n|u)|c55\/|capi|ccwa|cdm\-|cell|chtm|cldc|cmd\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\-s|devi|dica|dmob|do(c|p)o|ds(12|\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\-|_)|g1 u|g560|gene|gf\-5|g\-mo|go(\.w|od)|gr(ad|un)|haie|hcit|hd\-(m|p|t)|hei\-|hi(pt|ta)|hp( i|ip)|hs\-c|ht(c(\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\-(20|go|ma)|i230|iac( |\-|\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\/)|klon|kpt |kwc\-|kyo(c|k)|le(no|xi)|lg( g|\/(k|l|u)|50|54|\-[a-w])|libw|lynx|m1\-w|m3ga|m50\/|ma(te|ui|xo)|mc(01|21|ca)|m\-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\-2|po(ck|rt|se)|prox|psio|pt\-g|qa\-a|qc(07|12|21|32|60|\-[2-7]|i\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\-|oo|p\-)|sdk\/|se(c(\-|0|1)|47|mc|nd|ri)|sgh\-|shar|sie(\-|m)|sk\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\-|v\-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\-|tdg\-|tel(i|m)|tim\-|t\-mo|to(pl|sh)|ts(70|m\-|m3|m5)|tx\-9|up(\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas\-|your|zeto|zte\-/i.test(n.substr(0,4))));if("WEBGL_VERSION"===t)return ia(2)?2:ia(1)?1:0;if("WEBGL_FLOAT_TEXTURE_ENABLED"===t)return function(t){if(0===t)return!1;var e=oa(t);if(1===t){if(!ra(e,"OES_texture_float"))return!1}else if(!ra(e,"EXT_color_buffer_float"))return!1;var n=e.createFramebuffer(),r=e.createTexture();e.bindTexture(e.TEXTURE_2D,r);var o=2===t?e.RGBA32F:e.RGBA;e.texImage2D(e.TEXTURE_2D,0,o,1,1,0,e.RGBA,e.FLOAT,null),e.bindFramebuffer(e.FRAMEBUFFER,n),e.framebufferTexture2D(e.FRAMEBUFFER,e.COLOR_ATTACHMENT0,e.TEXTURE_2D,r,0);var a=e.checkFramebufferStatus(e.FRAMEBUFFER)===e.FRAMEBUFFER_COMPLETE;e.readPixels(0,0,1,1,e.RGBA,e.FLOAT,new Float32Array(4));var i=e.getError()===e.NO_ERROR;return aa(e),a&&i}(this.get("WEBGL_VERSION"));if("WEBGL_GET_BUFFER_SUB_DATA_ASYNC_EXTENSION_ENABLED"===t)return function(t){if(t>0)return!1;if(2!==t)return!1;var e=oa(t),n=ra(e,"WEBGL_get_buffer_sub_data_async");return aa(e),n}(this.get("WEBGL_VERSION"));var n;throw new Error("Unknown feature "+t+".")},t.prototype.setFeatures=function(t){this.features=t},t.prototype.reset=function(){this.features=ca(),null!=this.globalEngine&&(this.globalEngine.dispose(),this.globalEngine=null)},t.prototype.initBackend=function(t,e){void 0===e&&(e=!1),this.currentBackend=t,null!=this.globalEngine&&this.globalEngine.dispose();var n=fa.findBackend(t);this.globalEngine=new ta(n,e)},t.prototype.findBackend=function(t){return t in this.registry?this.registry[t].backend:null},t.prototype.registerBackend=function(t,e,n){void 0===n&&(n=1),t in this.registry&&console.warn(t+" backend was already registered");try{var r=e();return this.registry[t]={backend:r,priority:n},!0}catch(t){return console.warn(t.message),!1}},t.prototype.removeBackend=function(t){if(!(t in this.registry))throw new Error(t+" backend not found in registry");this.registry[t].backend.dispose(),delete this.registry[t]},Object.defineProperty(t.prototype,"engine",{get:function(){return this.initDefaultBackend(),this.globalEngine},enumerable:!0,configurable:!0}),t.prototype.initDefaultBackend=function(){null==this.globalEngine&&this.initBackend(fa.get("BACKEND"),!1)},ea([function(){for(var t=[],e=0;e":"<",s=n?"inOffset + i;":"round(getBestIndicesA(batch, inOffset + i));";this.userCode="\n void main() {\n ivec2 coords = getOutputCoords();\n int batch = coords[0];\n int outIdx = coords[1];\n int inOffset = outIdx * "+r+";\n\n int bestIndex = 0;\n float bestValue = getA(batch, inOffset);\n\n for (int i = 0; i < "+r+"; i++) {\n int inIdx = "+s+";\n float candidate = getA(batch, inIdx);\n if (candidate "+u+" bestValue) {\n bestValue = candidate;\n bestIndex = inIdx;\n }\n }\n setOutput(float(bestIndex));\n }\n "}}(),ba=function(){return function(t){this.variableNames=["dy"],this.outputShape=t.inShape;var e=t.filterHeight,n=t.filterWidth,r=t.strideHeight,o=t.strideWidth,a=e-1-t.padInfo.top,i=n-1-t.padInfo.left,u=1/(e*n);this.userCode="\n const ivec2 pads = ivec2("+a+", "+i+");\n const float avgMultiplier = float("+u+");\n\n void main() {\n ivec4 coords = getOutputCoords();\n int b = coords[0];\n int d = coords[3];\n\n ivec2 dyRCCorner = coords.yz - pads;\n int dyRCorner = dyRCCorner.x;\n int dyCCorner = dyRCCorner.y;\n\n // Convolve dy(?, ?, d) with pos mask(:, :, d) to get dx(xR, xC, d).\n // ? = to be determined. : = across all values in that axis.\n float dotProd = 0.0;\n for (int wR = 0; wR < "+e+"; wR++) {\n float dyR = float(dyRCorner + wR) / "+r+".0;\n\n if (dyR < 0.0 || dyR >= "+t.outHeight+".0 || fract(dyR) > 0.0) {\n continue;\n }\n int idyR = int(dyR);\n\n for (int wC = 0; wC < "+n+"; wC++) {\n float dyC = float(dyCCorner + wC) / "+o+".0;\n\n if (dyC < 0.0 || dyC >= "+t.outWidth+".0 ||\n fract(dyC) > 0.0) {\n continue;\n }\n int idyC = int(dyC);\n\n float dyValue = getDy(b, idyR, idyC, d);\n\n dotProd += dyValue * avgMultiplier;\n }\n }\n setOutput(dotProd);\n }\n "}}(),xa=function(){return function(t,e,n,r,o,a){this.outputShape=[],this.supportsBroadcasting=!0,this.variableNames=["x","mean","variance"],vt(t,e),vt(t,n);var i="0.0";null!=r&&(vt(t,r),this.variableNames.push("offset"),i="getOffsetAtOutCoords()");var u="1.0";null!=o&&(vt(t,o),this.variableNames.push("scale"),u="getScaleAtOutCoords()"),this.outputShape=t,this.userCode="\n void main() {\n float x = getXAtOutCoords();\n float mean = getMeanAtOutCoords();\n float variance = getVarianceAtOutCoords();\n float offset = "+i+";\n float scale = "+u+";\n float inv = scale * inversesqrt(variance + float("+a+"));\n setOutput((x - mean) * inv + offset);\n }\n "}}(),wa=function(){return function(t,e,n){this.variableNames=["A","B"],this.supportsBroadcasting=!0,this.outputShape=vt(e,n),this.userCode="\n float binaryOperation(float a, float b) {\n "+t+"\n }\n\n void main() {\n float a = getAAtOutCoords();\n float b = getBAtOutCoords();\n setOutput(binaryOperation(a, b));\n }\n "}}(),Ea=function(){return function(t,e,n){this.variableNames=["A"],this.outputShape=t;var r=e.toFixed(20),o=n.toFixed(20);this.userCode="\n void main() {\n float value = getAAtOutCoords();\n if (isNaN(value)) {\n setOutput(value);\n return;\n }\n\n setOutput(clamp(value, "+r+", "+o+"));\n }\n "}}(),Sa=function(){return function(t,e){this.variableNames=["A","B"],this.outputShape=[],this.outputShape=H(t,e,1),this.userCode="\n void main() {\n ivec2 coords = getOutputCoords();\n int yR = coords.x;\n int yC = coords.y;\n\n float value = 0.0;\n if (yC < "+t[1]+") {\n value = getA(yR, yC);\n } else {\n yC -= "+t[1]+";\n value = getB(yR, yC);\n }\n\n setOutput(value);\n }\n "}}(),Ra=function(){return function(t){this.variableNames=["x","dy"],this.outputShape=t.filterShape;var e=t.strideHeight,n=t.strideWidth,r=t.padInfo.top,o=t.padInfo.left;this.userCode="\n void main() {\n ivec4 coords = getOutputCoords();\n int wR = coords.x;\n int wC = coords.y;\n int d1 = coords.z;\n int d2 = coords.w;\n\n // Convolve x(?, ?, d1) with dy(:, :, d2) to get dw(wR, wC, d1, d2).\n // ? = to be determined. : = across all values in that axis.\n float dotProd = 0.0;\n\n for (int b = 0; b < "+t.batchSize+"; b++) {\n for (int yR = 0; yR < "+t.outHeight+"; yR++) {\n int xR = wR + yR * "+e+" - "+r+";\n\n if (xR < 0 || xR >= "+t.inHeight+") {\n continue;\n }\n\n for (int yC = 0; yC < "+t.outWidth+"; yC++) {\n int xC = wC + yC * "+n+" - "+o+";\n\n if (xC < 0 || xC >= "+t.inWidth+") {\n continue;\n }\n\n float dyValue = getDy(b, yR, yC, d2);\n float xValue = getX(b, xR, xC, d1);\n dotProd += (xValue * dyValue);\n }\n }\n }\n setOutput(dotProd);\n }\n "}}(),ka=function(){return function(t){this.variableNames=["dy","W"],this.outputShape=t.inShape;var e=t.filterHeight,n=t.filterWidth,r=t.strideHeight,o=t.strideWidth,a=e-1-t.padInfo.top,i=n-1-t.padInfo.left;this.userCode="\n const ivec2 pads = ivec2("+a+", "+i+");\n\n void main() {\n ivec4 coords = getOutputCoords();\n int batch = coords[0];\n int d1 = coords[3];\n\n ivec2 dyCorner = coords.yz - pads;\n int dyRCorner = dyCorner.x;\n int dyCCorner = dyCorner.y;\n\n // Convolve dy(?, ?, d2) with w(:, :, d1, d2) to compute dx(xR, xC, d1).\n // ? = to be determined. : = across all values in that axis.\n float dotProd = 0.0;\n for (int wR = 0; wR < "+e+"; wR++) {\n float dyR = float(dyRCorner + wR) / "+r+".0;\n\n if (dyR < 0.0 || dyR >= "+t.outHeight+".0 || fract(dyR) > 0.0) {\n continue;\n }\n int idyR = int(dyR);\n\n int wRPerm = "+e+" - 1 - wR;\n\n for (int wC = 0; wC < "+n+"; wC++) {\n float dyC = float(dyCCorner + wC) / "+o+".0;\n\n if (dyC < 0.0 || dyC >= "+t.outWidth+".0 ||\n fract(dyC) > 0.0) {\n continue;\n }\n int idyC = int(dyC);\n\n int wCPerm = "+n+" - 1 - wC;\n\n for (int d2 = 0; d2 < "+t.outChannels+"; d2++) {\n float xValue = getDy(batch, idyR, idyC, d2);\n float wValue = getW(wRPerm, wCPerm, d1, d2);\n dotProd += xValue * wValue;\n }\n }\n }\n setOutput(dotProd);\n }\n "}}(),Ca=function(){return function(t){this.variableNames=["x","W"],this.outputShape=t.outShape;var e=t.padInfo.top,n=t.padInfo.left,r=t.strideHeight,o=t.strideWidth,a=t.dilationHeight,i=t.dilationWidth,u=t.filterHeight,s=t.filterWidth,c=4*Math.floor(t.inChannels/4),l=t.inChannels%4;this.userCode="\n const ivec2 strides = ivec2("+r+", "+o+");\n const ivec2 pads = ivec2("+e+", "+n+");\n\n void main() {\n ivec4 coords = getOutputCoords();\n int batch = coords[0];\n int d2 = coords[3];\n\n ivec2 xRCCorner = coords.yz * strides - pads;\n int xRCorner = xRCCorner.x;\n int xCCorner = xRCCorner.y;\n\n // Convolve x(?, ?, d1) with w(:, :, d1, d2) to get y(yR, yC, d2).\n // ? = to be determined. : = across all values in that axis.\n float dotProd = 0.0;\n for (int wR = 0; wR < "+u+"; wR++) {\n int xR = xRCorner + wR * "+a+";\n\n if (xR < 0 || xR >= "+t.inHeight+") {\n continue;\n }\n\n for (int wC = 0; wC < "+s+"; wC++) {\n int xC = xCCorner + wC * "+i+";\n\n if (xC < 0 || xC >= "+t.inWidth+") {\n continue;\n }\n\n for (int d1 = 0; d1 < "+c+"; d1 += 4) {\n vec4 xValues = vec4(\n getX(batch, xR, xC, d1),\n getX(batch, xR, xC, d1 + 1),\n getX(batch, xR, xC, d1 + 2),\n getX(batch, xR, xC, d1 + 3)\n );\n vec4 wValues = vec4(\n getW(wR, wC, d1, d2),\n getW(wR, wC, d1 + 1, d2),\n getW(wR, wC, d1 + 2, d2),\n getW(wR, wC, d1 + 3, d2)\n );\n\n dotProd += dot(xValues, wValues);\n }\n\n if ("+(1===l)+") {\n dotProd +=\n getX(batch, xR, xC, "+c+") *\n getW(wR, wC, "+c+", d2);\n } else if ("+(2===l)+") {\n vec2 xValues = vec2(\n getX(batch, xR, xC, "+c+"),\n getX(batch, xR, xC, "+c+" + 1)\n );\n vec2 wValues = vec2(\n getW(wR, wC, "+c+", d2),\n getW(wR, wC, "+c+" + 1, d2)\n );\n dotProd += dot(xValues, wValues);\n } else if ("+(3===l)+") {\n vec3 xValues = vec3(\n getX(batch, xR, xC, "+c+"),\n getX(batch, xR, xC, "+c+" + 1),\n getX(batch, xR, xC, "+c+" + 2)\n );\n vec3 wValues = vec3(\n getW(wR, wC, "+c+", d2),\n getW(wR, wC, "+c+" + 1, d2),\n getW(wR, wC, "+c+" + 2, d2)\n );\n dotProd += dot(xValues, wValues);\n }\n }\n }\n setOutput(dotProd);\n }\n "}}();function Ta(t,e){return[e,t]}function _a(t,e){return t*e}!function(t){t[t.FLOAT=0]="FLOAT",t[t.UNSIGNED_BYTE=1]="UNSIGNED_BYTE"}(ma||(ma={}));var Aa=-2e4,Da=(2e4-Aa)/255,Ia=[1,1/255,1/65025,1/16581375],Ma=[1,255,65025],Oa=0;function Na(t,e,n){var r=function(t,e){if(t%e!=0)throw new Error("unpackedSize ("+t+") must be a multiple of "+e);return t/e}(t.length,n);if(e.length= "+r);for(var o=0,a=0;as||u.length>0),f=function(t){for(var e=0;e=1?"coords = 0;":s.map(function(t){return"coords["+(t+c)+"] = 0;"}).join("\n");var l="";l=a<2&&o>0?"coords":t.shapeInfo.logicalShape.map(function(t,e){return"coords["+(e+c)+"]"}).join(", ");return"\n float "+r+"() {\n "+i+" coords = getOutputCoords();\n "+u+"\n return get"+n+"("+l+");\n }\n "}(t,e,a,i);var h=e.texShape;if(d(r,h))return"\n float "+i+"() {\n return sampleTexture("+o+", resultUV);\n }\n ";var v=p(r),g="";l&&f&&(g="\n int mainPart = index / "+v+";\n index -= mainPart * "+v+";\n ");return"\n float "+i+"() {\n ivec2 resTexRC = ivec2(resultUV.yx *\n vec2("+h[0]+", "+h[1]+"));\n int index = resTexRC.x * "+h[1]+" + resTexRC.y;\n "+g+"\n int texR = index / "+r[1]+";\n int texC = index - texR * "+r[1]+";\n vec2 uv = (vec2(texC, texR) + halfCR) /\n vec2("+r[1]+".0, "+r[0]+".0);\n\n return sampleTexture("+o+", uv);\n }\n "}(t,e,n));return r}(t,e,r)}).join("\n"),s=e.texShape,c=function(t,e){switch(t.length){case 0:return"\n int getOutputCoords() {\n return 0;\n }\n ";case 1:return function(t,e){if(1===e[0])return"\n int getOutputCoords() {\n return int(resultUV.x * "+e[1]+".0);\n }\n ";if(1===e[1])return"\n int getOutputCoords() {\n return int(resultUV.y * "+e[0]+".0);\n }\n ";return"\n int getOutputCoords() {\n ivec2 resTexRC = ivec2(resultUV.yx *\n vec2("+e[0]+", "+e[1]+"));\n return resTexRC.x * "+e[1]+" + resTexRC.y;\n }\n "}(0,e);case 2:return function(t,e){if(d(t,e))return"\n ivec2 getOutputCoords() {\n return ivec2(resultUV.yx * vec2("+e[0]+", "+e[1]+"));\n }\n ";if(1===t[1])return"\n ivec2 getOutputCoords() {\n ivec2 resTexRC = ivec2(resultUV.yx *\n vec2("+e[0]+", "+e[1]+"));\n int index = resTexRC.x * "+e[1]+" + resTexRC.y;\n return ivec2(index, 0);\n }\n ";if(1===t[0])return"\n ivec2 getOutputCoords() {\n ivec2 resTexRC = ivec2(resultUV.yx *\n vec2("+e[0]+", "+e[1]+"));\n int index = resTexRC.x * "+e[1]+" + resTexRC.y;\n return ivec2(0, index);\n }\n ";return"\n ivec2 getOutputCoords() {\n ivec2 resTexRC = ivec2(resultUV.yx *\n vec2("+e[0]+", "+e[1]+"));\n int index = resTexRC.x * "+e[1]+" + resTexRC.y;\n int r = index / "+t[1]+";\n int c = index - r * "+t[1]+";\n return ivec2(r, c);\n }\n "}(t,e);case 3:return r=e,o=(n=t)[1]*n[2],a=n[2],"\n ivec3 getOutputCoords() {\n ivec2 resTexRC = ivec2(resultUV.yx *\n vec2("+r[0]+", "+r[1]+"));\n int index = resTexRC.x * "+r[1]+" + resTexRC.y;\n int r = index / "+o+";\n index -= r * "+o+";\n int c = index / "+a+";\n int d = index - c * "+a+";\n return ivec3(r, c, d);\n }\n ";case 4:return function(t,e){var n=t[3],r=t[2]*n,o=t[1]*r;return"\n ivec4 getOutputCoords() {\n ivec2 resTexRC = ivec2(resultUV.yx *\n vec2("+e[0]+", "+e[1]+"));\n int index = resTexRC.x * "+e[1]+" + resTexRC.y;\n\n int r = index / "+o+";\n index -= r * "+o+";\n\n int c = index / "+r+";\n index -= c * "+r+";\n\n int d = index / "+n+";\n int d2 = index - d * "+n+";\n\n return ivec4(r, c, d, d2);\n }\n "}(t,e);default:throw new Error(t.length+"-D output sampling is not yet supported")}var n,r,o,a}(e.logicalShape,s);return[Ga,o,a,i,c,u,n].join("\n")}function Fa(t){var e,n=t.shapeInfo.logicalShape;switch(n.length){case 0:return"\n float get"+(e=t.name).charAt(0).toUpperCase()+e.slice(1)+"() {\n return sampleTexture("+e+", halfCR);\n }\n ";case 1:return function(t){var e=t.name,n="get"+e.charAt(0).toUpperCase()+e.slice(1);return"\n float "+n+"(int index) {\n return "+n+"Flat(index);\n }\n "}(t);case 2:return function(t){var e=t.shapeInfo.logicalShape,n=t.shapeInfo.texShape,r=t.name,o="get"+r.charAt(0).toUpperCase()+r.slice(1),a=n[0],i=n[1];if(d(e,n))return"\n float "+o+"(int row, int col) {\n vec2 uv = (vec2(col, row) + halfCR) / vec2("+i+".0, "+a+".0);\n return sampleTexture("+r+", uv);\n }\n ";var u=E(e),s=u.newShape,c=u.keptDims,l=s;if(l.length";this.userCode="\n int getIndex(int i) {\n "+l+"\n }\n\n void main() {\n "+a+" coords = getOutputCoords();\n "+a+" adjustableCoords = "+a+"("+i+");\n int finalCoord = int("+s+");\n float val = 0.0;\n for (int i = "+o+" - 1; i >= 0; i -= 1) {\n int idx = getIndex(i);\n if (idx "+f+" finalCoord) {\n continue;\n }\n if (idx == finalCoord && "+e+") {\n continue;\n }\n "+c+" = idx;\n val += getX("+u+");\n }\n setOutput(val);\n }\n "}}();function Ka(t,e){if(1===t)return""+e;if(2===t)return e+".x, "+e+".y";if(3===t)return e+".x, "+e+".y, "+e+".z";if(4===t)return e+".x, "+e+".y, "+e+".z, "+e+".w";throw Error("Cumulative sum for rank "+t+" is not yet supported")}function Qa(t,e){if(1===t)return""+e;if(2===t)return e+".y";if(3===t)return e+".z";if(4===t)return e+".w";throw Error("Cumulative sum for rank "+t+" is not yet supported")}var Ya=function(){return function(t){this.variableNames=["x","W"],this.outputShape=t.outShape;var e=t.inHeight,n=t.inWidth,r=t.padInfo.top,o=t.padInfo.left,a=t.strideHeight,i=t.strideWidth,u=t.dilationHeight,s=t.dilationWidth,c=t.filterHeight,l=t.filterWidth,f=t.outChannels/t.inChannels;this.userCode="\n const ivec2 strides = ivec2("+a+", "+i+");\n const ivec2 pads = ivec2("+r+", "+o+");\n\n void main() {\n ivec4 coords = getOutputCoords();\n int batch = coords.x;\n ivec2 xRCCorner = coords.yz * strides - pads;\n int d2 = coords.w;\n int d1 = d2 / "+f+";\n int q = d2 - d1 * "+f+";\n\n int xRCorner = xRCCorner.x;\n int xCCorner = xRCCorner.y;\n\n // Convolve x(?, ?, d1) with w(:, :, d1, q) to get y(yR, yC, d2).\n // ? = to be determined. : = across all values in that axis.\n float dotProd = 0.0;\n // TODO(dsmilkov): Flatten the two for loops and vec4 the operations.\n for (int wR = 0; wR < "+c+"; wR++) {\n int xR = xRCorner + wR * "+u+";\n\n if (xR < 0 || xR >= "+e+") {\n continue;\n }\n\n for (int wC = 0; wC < "+l+"; wC++) {\n int xC = xCCorner + wC * "+s+";\n\n if (xC < 0 || xC >= "+n+") {\n continue;\n }\n\n float xVal = getX(batch, xR, xC, d1);\n float wVal = getW(wR, wC, d1, q);\n dotProd += xVal * wVal;\n }\n }\n setOutput(dotProd);\n }\n "}}(),Ja=function(){return function(t){this.variableNames=["A"];var e=t[0],n=t[1];this.outputShape=t,this.userCode="\n void main() {\n ivec3 coords = getOutputCoords();\n int texR = coords[0];\n int texC = coords[1];\n int depth = coords[2];\n vec2 uv = (vec2(texC, texR) + halfCR) / vec2("+n+".0, "+e+".0);\n\n vec4 values = texture2D(A, uv);\n float value;\n if (depth == 0) {\n value = values.r;\n } else if (depth == 1) {\n value = values.g;\n } else if (depth == 2) {\n value = values.b;\n } else if (depth == 3) {\n value = values.a;\n }\n\n setOutput(floor(value * 255.0 + 0.5));\n }\n "}}(),Za=function(){return function(t,e,n){this.variableNames=["A","indices"];var r=t.slice();r[n]=e,this.outputShape=r,this.rank=r.length;var o=qa(this.rank),a=function(t,e){var n=t.length;if(n>4)throw Error("Gather for rank "+n+" is not yet supported");if(1===n)return"int(getIndices(resRC))";for(var r=["resRC.x","resRC.y","resRC.z","resRC.w"],o=[],a=0;ar||n>r){o="["+e+"x"+n+"]";throw new Error("Requested texture size "+o+" greater than WebGL maximum on this browser / GPU "+("["+r+"x"+r+"]")+".")}}function xi(t){return Di(t,function(){return t.createFramebuffer()},"Unable to create WebGLFramebuffer.")}function wi(t,e,n,r,o,a,i){var u=t.getAttribLocation(e,n);return-1!==u&&(ni(t,function(){return t.bindBuffer(t.ARRAY_BUFFER,r)}),ni(t,function(){return t.vertexAttribPointer(u,o,t.FLOAT,!1,a,i)}),ni(t,function(){return t.enableVertexAttribArray(u)}),!0)}function Ei(t,e,n){Ii(t,n),ni(t,function(){return t.activeTexture(t.TEXTURE0+n)}),ni(t,function(){return t.bindTexture(t.TEXTURE_2D,e)})}function Si(t,e,n){return Di(t,function(){return t.getUniformLocation(e,n)},'uniform "'+n+'" not present in program.')}function Ri(t,e,n){return t.getUniformLocation(e,n)}function ki(t,e,n,r,o){ni(t,function(){return Ei(t,n,o)}),ni(t,function(){return t.uniform1i(r,o)})}function Ci(t,e,n){ni(t,function(){return t.bindFramebuffer(t.FRAMEBUFFER,n)}),ni(t,function(){return t.framebufferTexture2D(t.FRAMEBUFFER,t.COLOR_ATTACHMENT0,t.TEXTURE_2D,e,0)})}function Ti(t,e){ni(t,function(){return t.bindFramebuffer(t.FRAMEBUFFER,e)}),ni(t,function(){return t.framebufferTexture2D(t.FRAMEBUFFER,t.COLOR_ATTACHMENT0,t.TEXTURE_2D,null,0)})}function _i(t){var e=t.checkFramebufferStatus(t.FRAMEBUFFER);if(e!==t.FRAMEBUFFER_COMPLETE)throw new Error("Error binding framebuffer: "+Ai(t,e))}function Ai(t,e){switch(e){case t.FRAMEBUFFER_INCOMPLETE_ATTACHMENT:return"FRAMEBUFFER_INCOMPLETE_ATTACHMENT";case t.FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT:return"FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT";case t.FRAMEBUFFER_INCOMPLETE_DIMENSIONS:return"FRAMEBUFFER_INCOMPLETE_DIMENSIONS";case t.FRAMEBUFFER_UNSUPPORTED:return"FRAMEBUFFER_UNSUPPORTED";default:return"unknown error "+e}}function Di(t,e,n){var r=ni(t,function(){return e()});if(null==r)throw new Error(n);return r}function Ii(t,e){var n=t.MAX_COMBINED_TEXTURE_IMAGE_UNITS-1,r=e+t.TEXTURE0;if(rn)throw new Error("textureUnit must be in "+("[gl.TEXTURE0, gl.TEXTURE"+n+"]")+".")}function Mi(t,e){2!==e.length&&(e=E(e).newShape);var n=gi(t),r=p(e);return e.length<=1&&r<=n?[r,1]:2===e.length&&e[0]<=n&&e[1]<=n?e:3===e.length&&e[0]<=n&&e[1]*e[2]<=n?[e[0],e[1]*e[2]]:4===e.length&&e[0]<=n&&e[1]*e[2]*e[3]<=n?[e[0],e[1]*e[2]*e[3]]:m(r)}var Oi=Object.freeze({createWebGLRenderingContext:ti,createWebGLRenderingContextFromCanvas:ei,callAndCheck:ni,enableDebugWebGLErrorChecking:oi,checkWebGLError:ai,getWebGLErrorMessage:ii,getExtensionOrThrow:ui,createVertexShader:si,createFragmentShader:ci,createProgram:fi,linkProgram:hi,validateProgram:pi,createStaticVertexBuffer:di,createStaticIndexBuffer:vi,queryMaxTextureSize:gi,getChannelsPerTexture:mi,createTexture:yi,validateTextureSize:bi,createFramebuffer:xi,bindVertexBufferToProgramAttribute:wi,bindTextureUnit:Ei,unbindTextureUnit:function(t,e){Ii(t,e),ni(t,function(){return t.activeTexture(t.TEXTURE0+e)}),ni(t,function(){return t.bindTexture(t.TEXTURE_2D,null)})},getProgramUniformLocationOrThrow:Si,getProgramUniformLocation:Ri,bindTextureToProgramUniformSampler:ki,bindCanvasToFramebuffer:function(t){ni(t,function(){return t.bindFramebuffer(t.FRAMEBUFFER,null)}),ni(t,function(){return t.viewport(0,0,t.canvas.width,t.canvas.height)}),ni(t,function(){return t.scissor(0,0,t.canvas.width,t.canvas.height)})},bindColorTextureToFramebuffer:Ci,unbindColorTextureFromFramebuffer:Ti,validateFramebuffer:_i,getFramebufferErrorMessage:Ai,getTextureShapeFromLogicalShape:Mi}),Ni=function(t,e,n,r){return new(n||(n=Promise))(function(o,a){function i(t){try{s(r.next(t))}catch(t){a(t)}}function u(t){try{s(r.throw(t))}catch(t){a(t)}}function s(t){t.done?o(t.value):new n(function(e){e(t.value)}).then(i,u)}s((r=r.apply(t,e||[])).next())})},Li=function(t,e){var n,r,o,a,i={label:0,sent:function(){if(1&o[0])throw o[1];return o[1]},trys:[],ops:[]};return a={next:u(0),throw:u(1),return:u(2)},"function"==typeof Symbol&&(a[Symbol.iterator]=function(){return this}),a;function u(a){return function(u){return function(a){if(n)throw new TypeError("Generator is already executing.");for(;i;)try{if(n=1,r&&(o=r[2&a[0]?"return":a[0]?"throw":"next"])&&!(o=o.call(r,a[1])).done)return o;switch(r=0,o&&(a=[0,o.value]),a[0]){case 0:case 1:o=a;break;case 4:return i.label++,{value:a[1],done:!1};case 5:i.label++,r=a[1],a=[0];continue;case 7:a=i.ops.pop(),i.trys.pop();continue;default:if(!(o=(o=i.trys).length>0&&o[o.length-1])&&(6===a[0]||2===a[0])){i=0;continue}if(3===a[0]&&(!o||a[1]>o[0]&&a[1]= "+r);for(var o=0,a=0;a= "+o);for(var a=La(e,n),i=a[0],u=a[1],s=n%2==1,c=e%2==1,l=Math.floor(n/2),f=Math.floor(e/2),h=s?4:0,p=n,d=0,v=0;v= "+r);for(var o=0,a=0;a= "+o);for(var a=n%2==1,i=e%2==1,u=Math.floor(n/2),s=Math.floor(e/2),c=La(e,n),l=c[0],f=c[1],h=a?4:0,p=n+(a?1:0),d=0,v=0,g=n,m=0;m0&&o[o.length-1])&&(6===a[0]||2===a[0])){i=0;continue}if(3===a[0]&&(!o||a[1]>o[0]&&a[1]4)throw Error("Where for rank "+n+" is not yet supported");if(1===n)o="resRC",r="resRC";else{for(var a=["resRC.x","resRC.y","resRC.z","resRC.w"],i=[],u=[],s=0;s= 1.0) {\n setOutput(getA("+o+"));\n } else {\n setOutput(getB("+o+"));\n }\n }\n "}}(),fu=function(){return function(t,e,n,r,o){this.variableNames=["x"],this.outputShape=[];var a,i=e,u=t[3]-1;this.outputShape=t;var s="float("+n+") + float("+r+") * sum";a=.5===o?"inversesqrt("+s+")":1===o?"1.0/("+s+")":"exp(log("+s+") * float(-"+o+"));",this.userCode="\n void main() {\n ivec4 coords = getOutputCoords();\n int b = coords[0];\n int r = coords[1];\n int c = coords[2];\n int d = coords[3];\n float x = getX(b, r, c, d);\n float sum = 0.0;\n for (int j = -"+i+"; j <= "+i+"; j++) {\n int idx = d + j;\n if (idx >= 0 && idx <= "+u+") {\n float z = getX(b, r, c, idx);\n sum += z * z;\n }\n }\n float val = x * "+a+";\n setOutput(val);\n }\n "}}(),hu=function(){return function(t){this.variableNames=["dy","maxPos"],this.outputShape=t.inShape;var e=t.filterHeight,n=t.filterWidth,r=t.strideHeight,o=t.strideWidth,a=e-1-t.padInfo.top,i=n-1-t.padInfo.left,u=e*n-1;this.userCode="\n const ivec2 pads = ivec2("+a+", "+i+");\n\n void main() {\n ivec4 coords = getOutputCoords();\n int b = coords[0];\n int d = coords[3];\n\n ivec2 dyRCCorner = coords.yz - pads;\n int dyRCorner = dyRCCorner.x;\n int dyCCorner = dyRCCorner.y;\n\n // Convolve dy(?, ?, d) with pos mask(:, :, d) to get dx(xR, xC, d).\n // ? = to be determined. : = across all values in that axis.\n float dotProd = 0.0;\n for (int wR = 0; wR < "+e+"; wR++) {\n float dyR = float(dyRCorner + wR) / "+r+".0;\n\n if (dyR < 0.0 || dyR >= "+t.outHeight+".0 || fract(dyR) > 0.0) {\n continue;\n }\n int idyR = int(dyR);\n\n for (int wC = 0; wC < "+n+"; wC++) {\n float dyC = float(dyCCorner + wC) / "+o+".0;\n\n if (dyC < 0.0 || dyC >= "+t.outWidth+".0 ||\n fract(dyC) > 0.0) {\n continue;\n }\n int idyC = int(dyC);\n\n float dyValue = getDy(b, idyR, idyC, d);\n int maxPosValue = "+u+" - int(getMaxPos(b, idyR, idyC, d));\n\n // Get the current value, check it against the value from the\n // position matrix.\n int curPosValue = wR * "+n+" + wC;\n float mask = float(maxPosValue == curPosValue ? 1.0 : 0.0);\n\n dotProd += dyValue * mask;\n }\n }\n setOutput(dotProd);\n }\n "}}(),pu=function(){return function(t,e,n,r){void 0===n&&(n=!1),void 0===r&&(r=!1),this.variableNames=["matrixA","matrixB"];var o=n?t[1]:t[0],a=r?e[0]:e[1],i=n?t[0]:t[1];this.outputShape=[o,a];var u=function(t,e){return n?e+" + "+t+", aRow":"aRow, "+e+" + "+t},s=function(t,e){return r?"bCol, "+e+" + "+t:e+" + "+t+", bCol"},c=4*Math.floor(i/4),l=i%4;this.userCode=" float dotARowBCol(int aRow, int bCol) {\n float result = 0.0;\n for (int i = 0; i < "+c+"; i += 4) {\n vec4 a = vec4(\n getMatrixA("+u(0,"i")+"),\n getMatrixA("+u(1,"i")+"),\n getMatrixA("+u(2,"i")+"),\n getMatrixA("+u(3,"i")+")\n );\n vec4 b = vec4(\n getMatrixB("+s(0,"i")+"),\n getMatrixB("+s(1,"i")+"),\n getMatrixB("+s(2,"i")+"),\n getMatrixB("+s(3,"i")+")\n );\n\n result += dot(a, b);\n }\n\n if ("+(1===l)+") {\n result += getMatrixA("+u(0,c)+") *\n getMatrixB("+s(0,c)+");\n } else if ("+(2===l)+") {\n vec2 a = vec2(\n getMatrixA("+u(0,c)+"),\n getMatrixA("+u(1,c)+")\n );\n vec2 b = vec2(\n getMatrixB("+s(0,c)+"),\n getMatrixB("+s(1,c)+")\n );\n result += dot(a, b);\n } else if ("+(3===l)+") {\n vec3 a = vec3(\n getMatrixA("+u(0,c)+"),\n getMatrixA("+u(1,c)+"),\n getMatrixA("+u(2,c)+")\n );\n vec3 b = vec3(\n getMatrixB("+s(0,c)+"),\n getMatrixB("+s(1,c)+"),\n getMatrixB("+s(2,c)+")\n );\n result += dot(a, b);\n }\n\n return result;\n }\n\n void main() {\n ivec2 resRC = getOutputCoords();\n setOutput(dotARowBCol(resRC.x, resRC.y));\n }\n "}}(),du=function(){function t(t,e,n){this.variableNames=["probs"],this.outputShape=[t,n],this.userCode="\n uniform float seed;\n\n void main() {\n ivec2 coords = getOutputCoords();\n int batch = coords[0];\n\n float r = random(seed);\n float cdf = 0.0;\n\n for (int i = 0; i < "+(e-1)+"; i++) {\n cdf += getProbs(batch, i);\n\n if (r < cdf) {\n setOutput(float(i));\n return;\n }\n }\n\n // If no other event happened, last event happened.\n setOutput(float("+(e-1)+"));\n }\n "}return t.prototype.getCustomSetupFunc=function(t){var e=this;return function(n,r){null==e.seedLoc&&(e.seedLoc=n.getUniformLocation(r,"seed")),n.gl.uniform1f(e.seedLoc,t)}},t}(),vu=function(){return function(t,e,n,r){this.variableNames=["indices"],this.outputShape=[t,e],this.userCode="\n void main() {\n ivec2 coords = getOutputCoords();\n int index = round(getIndices(coords.x));\n setOutput(mix(float("+r+"), float("+n+"),\n float(index == coords.y)));\n }\n "}}(),gu=function(){return function(t,e,n){this.variableNames=["x"],this.outputShape=e.map(function(e,n){return e[0]+t[n]+e[1]});var r=t.length,o=qa(r),a=e.map(function(t){return t[0]}).join(","),i=e.map(function(e,n){return e[0]+t[n]}).join(","),u=["coords[0]","coords[1]","coords[2]","coords[3]"].slice(0,r);this.userCode=1!==r?"\n "+o+" start = "+o+"("+a+");\n "+o+" end = "+o+"("+i+");\n\n void main() {\n "+o+" outC = getOutputCoords();\n if (any(lessThan(outC, start)) || any(greaterThanEqual(outC, end))) {\n setOutput(float("+n+"));\n } else {\n "+o+" coords = outC - start;\n setOutput(getX("+u+"));\n }\n }\n ":"\n int start = "+a+";\n int end = "+i+";\n\n void main() {\n int outC = getOutputCoords();\n if (outC < start || outC >= end) {\n setOutput(float("+n+"));\n } else {\n setOutput(getX(outC - start));\n }\n }\n "}}(),mu=function(){return function(t,e,n){if(this.variableNames=["x"],"avg"===e&&n)throw new Error("Cannot compute positions for average pool.");var r=t.filterHeight,o=t.filterWidth,a=t.strideHeight,i=t.strideWidth,u=t.padInfo.top,s=t.padInfo.left;this.outputShape=t.outShape;var c="avg"===e,l="0.0";if(c||(l="-1.0 / 0.0"),n)this.userCode="\n const ivec2 strides = ivec2("+a+", "+i+");\n const ivec2 pads = ivec2("+u+", "+s+");\n\n void main() {\n ivec4 coords = getOutputCoords();\n int batch = coords[0];\n int d = coords[3];\n\n ivec2 xRCCorner = coords.yz * strides - pads;\n int xRCorner = xRCCorner.x;\n int xCCorner = xRCCorner.y;\n\n // max/min x(?, ?, d) to get y(yR, yC, d).\n // ? = to be determined\n float minMaxValue = 0.0;\n float minMaxValueFound = 0.0;\n int minMaxPosition = 0;\n float avgValue = 0.0;\n\n for (int wR = 0; wR < "+r+"; wR++) {\n int xR = xRCorner + wR;\n\n if (xR < 0 || xR >= "+t.inHeight+") {\n continue;\n }\n\n for (int wC = 0; wC < "+o+"; wC++) {\n int xC = xCCorner + wC;\n\n if (xC < 0 || xC >= "+t.inWidth+") {\n continue;\n }\n\n float value = getX(batch, xR, xC, d);\n\n // If a min / max value has already been found, use it. If not,\n // use the current value.\n float currMinMaxValue = mix(\n value, minMaxValue, minMaxValueFound);\n if (value >= currMinMaxValue) {\n minMaxValue = value;\n minMaxValueFound = 1.0;\n minMaxPosition = wR * "+o+" + wC;\n }\n }\n }\n setOutput(float(minMaxPosition));\n }\n ";else{var f=e+"("+e+"("+e+"(minMaxValue[0], minMaxValue[1]), minMaxValue[2]), minMaxValue[3])";"avg"===e&&(f="avgValue / count");var h=4*Math.floor(o/4),p=o%4,d="\n if ("+c+") {\n avgValue += dot(values, ones);\n } else {\n minMaxValue = max(values, minMaxValue);\n }\n ";this.userCode="\n const ivec2 strides = ivec2("+a+", "+i+");\n const ivec2 pads = ivec2("+u+", "+s+");\n const float initializationValue = "+l+";\n const vec4 ones = vec4(1.0, 1.0, 1.0, 1.0);\n\n float count = 0.0;\n\n float getValue(int batch, int xR, int xC, int d) {\n if (xC < 0 || xC >= "+t.inWidth+") {\n return initializationValue;\n }\n count += 1.0;\n return getX(batch, xR, xC, d);\n }\n\n void main() {\n ivec4 coords = getOutputCoords();\n int batch = coords[0];\n int d = coords[3];\n\n ivec2 xRCCorner = coords.yz * strides - pads;\n int xRCorner = xRCCorner.x;\n int xCCorner = xRCCorner.y;\n\n // max/min x(?, ?, d) to get y(yR, yC, d).\n // ? = to be determined\n vec4 minMaxValue = vec4("+l+");\n float avgValue = 0.0;\n count = 0.0;\n\n for (int wR = 0; wR < "+r+"; wR++) {\n int xR = xRCorner + wR;\n\n if (xR < 0 || xR >= "+t.inHeight+") {\n continue;\n }\n\n for (int wC = 0; wC < "+h+"; wC += 4) {\n int xC = xCCorner + wC;\n\n vec4 values = vec4(\n getValue(batch, xR, xC, d),\n getValue(batch, xR, xC + 1, d),\n getValue(batch, xR, xC + 2, d),\n getValue(batch, xR, xC + 3, d)\n );\n\n "+d+"\n }\n\n int xC = xCCorner + "+h+";\n if ("+(1===p)+") {\n vec4 values = vec4(\n getValue(batch, xR, xC, d),\n initializationValue,\n initializationValue,\n initializationValue\n );\n\n "+d+"\n } else if ("+(2===p)+") {\n vec4 values = vec4(\n getValue(batch, xR, xC, d),\n getValue(batch, xR, xC + 1, d),\n initializationValue,\n initializationValue\n );\n\n "+d+"\n } else if ("+(3===p)+") {\n vec4 values = vec4(\n getValue(batch, xR, xC, d),\n getValue(batch, xR, xC + 1, d),\n getValue(batch, xR, xC + 2, d),\n initializationValue\n );\n\n "+d+"\n }\n }\n setOutput("+f+");\n }\n "}}}(),yu=function(){return function(t,e){this.variableNames=["x"];var n=t.windowSize,r=t.batchSize,o=t.inSize,a=Math.ceil(o/n);this.outputShape=[r,a];var i="sum"===e,u="0.0";i||(u="min"===e?"1.0 / 0.0":"-1.0 / 0.0");var s="min"===e?"min":"max",c=e+"("+e+"("+e+"(minMaxValue[0], minMaxValue[1]), minMaxValue[2]), minMaxValue[3])";"sum"===e&&(c="sumValue");var l=4*Math.floor(n/4),f=n%4,h="\n if ("+i+") {\n sumValue += dot(values, ones);\n } else {\n minMaxValue = "+s+"(values, minMaxValue);\n }\n ",p="";o%n>0&&(p="\n if (inIdx < 0 || inIdx >= "+o+") {\n return initializationValue;\n }\n "),this.userCode="\n const float initializationValue = "+u+";\n const vec4 ones = vec4(1.0, 1.0, 1.0, 1.0);\n\n float getValue(int batch, int inIdx) {\n "+p+"\n return getX(batch, inIdx);\n }\n\n void main() {\n ivec2 coords = getOutputCoords();\n int batch = coords[0];\n int outIdx = coords[1];\n int inOffset = outIdx * "+n+";\n\n vec4 minMaxValue = vec4("+u+");\n float sumValue = 0.0;\n\n for (int i = 0; i < "+l+"; i += 4) {\n int inIdx = inOffset + i;\n vec4 values = vec4(\n getValue(batch, inIdx),\n getValue(batch, inIdx + 1),\n getValue(batch, inIdx + 2),\n getValue(batch, inIdx + 3)\n );\n\n "+h+"\n }\n\n int inIdx = inOffset + "+l+";\n if ("+(1===f)+") {\n vec4 values = vec4(\n getValue(batch, inIdx),\n initializationValue,\n initializationValue,\n initializationValue\n );\n "+h+"\n } else if ("+(2===f)+") {\n vec4 values = vec4(\n getValue(batch, inIdx),\n getValue(batch, inIdx + 1),\n initializationValue,\n initializationValue\n );\n "+h+"\n } else if ("+(3===f)+") {\n vec4 values = vec4(\n getValue(batch, inIdx),\n getValue(batch, inIdx + 1),\n getValue(batch, inIdx + 2),\n initializationValue\n );\n "+h+"\n }\n setOutput("+c+");\n }\n "}}(),bu=function(){return function(t,e,n){this.variableNames=["dy"],this.outputShape=[],this.outputShape=e.shape;var r=e.shape,o=r[1],a=r[2],i=t.shape,u=i[1],s=i[2],c=[n&&u>1?o-1:o,n&&s>1?a-1:a],l=[n&&u>1?u-1:u,n&&s>1?s-1:s],f=c[0]/l[0],h=c[1]/l[1],p=1/f,d=1/h,v=2*Math.ceil(p)+2,g=2*Math.ceil(d)+2;this.userCode="\n void main() {\n ivec4 coords = getOutputCoords();\n int b = coords[0];\n int d = coords[3];\n int r = coords[1];\n int c = coords[2];\n\n float accumulator = 0.0;\n\n const float heightScale = float("+f+");\n const float widthScale = float("+h+");\n\n const float invHeightScale = float("+p+");\n const float invWidthScale = float("+d+");\n\n const int winHeight = int("+v+");\n const int winWidth = int("+g+");\n\n // Compute bounds for where in dy we will look\n float startRLerp = floor(float(r) * invHeightScale);\n int startDyR = int(startRLerp - float(winHeight / 2));\n\n float startCLerp = floor(float(c) * invWidthScale);\n int startDyC = int(startCLerp - float(winWidth / 2));\n\n // Loop over dy\n for (int dyROffset = 0; dyROffset < winHeight; dyROffset++) {\n int dyR = dyROffset + startDyR;\n\n // Guard against the window exceeding the bounds of dy\n if (dyR < 0 || dyR >= "+u+") {\n continue;\n }\n\n for (int dyCOffset = 0; dyCOffset < winWidth; dyCOffset++) {\n int dyC = dyCOffset + startDyC;\n\n // Guard against the window exceeding the bounds of dy\n if (dyC < 0 || dyC >= "+s+") {\n continue;\n }\n\n float dxR = float(dyR) * heightScale;\n int topDxRIndex = int(floor(dxR));\n int bottomDxRIndex = int(min(ceil(dxR), "+(o-1)+".0));\n float dxRLerp = dxR - float(topDxRIndex);\n float inverseDxRLerp = 1.0 - dxRLerp;\n\n float dxC = float(dyC) * widthScale;\n int leftDxCIndex = int(floor(dxC));\n int rightDxCIndex = int(min(ceil(dxC), "+(a-1)+".0));\n float dxCLerp = dxC - float(leftDxCIndex);\n float inverseDxCLerp = 1.0 - dxCLerp;\n\n if (r == topDxRIndex && c == leftDxCIndex) {\n // topLeft\n accumulator +=\n getDy(b, dyR, dyC, d) * inverseDxRLerp * inverseDxCLerp;\n }\n\n if (r == topDxRIndex && c == rightDxCIndex) {\n // topRight\n accumulator += getDy(b, dyR, dyC, d) * inverseDxRLerp * dxCLerp;\n }\n\n if (r == bottomDxRIndex && c == leftDxCIndex) {\n // bottomLeft\n accumulator += getDy(b, dyR, dyC, d) * dxRLerp * inverseDxCLerp;\n }\n\n if (r == bottomDxRIndex && c == rightDxCIndex) {\n // bottomRight\n accumulator += getDy(b, dyR, dyC, d) * dxRLerp * dxCLerp;\n }\n }\n }\n // End loop over dy\n\n setOutput(accumulator);\n }\n "}}(),xu=function(){return function(t,e,n,r){this.variableNames=["A"],this.outputShape=[];var o=t[0],a=t[1],i=t[2],u=t[3];this.outputShape=[o,e,n,u];var s=[r&&e>1?a-1:a,r&&n>1?i-1:i],c=[r&&e>1?e-1:e,r&&n>1?n-1:n];this.userCode="\n const vec2 effectiveInputOverOutputRatioRC = vec2(\n "+s[0]/c[0]+",\n "+s[1]/c[1]+");\n const vec2 inputShapeRC = vec2("+a+".0, "+i+".0);\n\n void main() {\n ivec4 coords = getOutputCoords();\n int b = coords[0];\n int d = coords[3];\n ivec2 yRC = coords.yz;\n\n // Fractional source index.\n vec2 sourceFracIndexRC = vec2(yRC) * effectiveInputOverOutputRatioRC;\n\n // Compute the four integer indices.\n ivec2 sourceFloorRC = ivec2(sourceFracIndexRC);\n ivec2 sourceCeilRC = ivec2(\n min(inputShapeRC - 1.0, ceil(sourceFracIndexRC)));\n\n float topLeft = getA(b, sourceFloorRC.x, sourceFloorRC.y, d);\n float bottomLeft = getA(b, sourceCeilRC.x, sourceFloorRC.y, d);\n float topRight = getA(b, sourceFloorRC.x, sourceCeilRC.y, d);\n float bottomRight = getA(b, sourceCeilRC.x, sourceCeilRC.y, d);\n\n vec2 fracRC = sourceFracIndexRC - vec2(sourceFloorRC);\n\n float top = topLeft + (topRight - topLeft) * fracRC.y;\n float bottom = bottomLeft + (bottomRight - bottomLeft) * fracRC.y;\n float newValue = top + (bottom - top) * fracRC.x;\n\n setOutput(newValue);\n }\n "}}(),wu=function(){return function(t,e,n,r){this.variableNames=["A"],this.outputShape=[];var o=t[0],a=t[1],i=t[2],u=t[3];this.outputShape=[o,e,n,u];var s=r?[a-1,i-1]:[a,i],c=r?[e-1,n-1]:[e,n],l=r?"0.5":"0.0";this.userCode="\n const vec2 effectiveInputOverOutputRatioRC = vec2(\n "+s[0]/c[0]+",\n "+s[1]/c[1]+");\n const vec2 inputShapeRC = vec2("+a+".0, "+i+".0);\n\n void main() {\n ivec4 coords = getOutputCoords();\n int b = coords[0];\n int d = coords[3];\n ivec2 yRC = coords.yz;\n\n // Fractional source index.\n vec2 sourceFracIndexRC = vec2(yRC) * effectiveInputOverOutputRatioRC;\n\n // Compute the coordinators of nearest neighbor point.\n ivec2 sourceNearestRC = ivec2(\n min(inputShapeRC - 1.0, floor(sourceFracIndexRC + "+l+")));\n\n float newValue = getA(b, sourceNearestRC.x, sourceNearestRC.y, d);\n\n setOutput(newValue);\n }\n "}}(),Eu=function(){return function(t,e){this.variableNames=["x"];var n=t.length;if(n>4)throw new Error("WebGL backend: Reverse of rank-"+n+" tensor is not yet supported");if(this.outputShape=t,1!==n){var r=t.map(function(n,r){return function(n){return-1!==e.indexOf(n)&&1!==t[n]?t[n]+" - coords["+n+"] - 1":"coords["+n+"]"}(r)}).join(","),o=qa(n);this.userCode="\n void main() {\n "+o+" coords = getOutputCoords();\n setOutput(getX("+r+"));\n }\n "}else this.userCode="\n void main() {\n int coord = getOutputCoords();\n setOutput(getX("+t[0]+" - coord - 1));\n }\n "}}(),Su=function(){function t(t){this.variableNames=["source"],this.outputShape=t,this.rank=t.length;var e=qa(this.rank),n=function(t){if(1===t)return"sourceLoc";if(2===t)return"sourceLoc.x, sourceLoc.y";if(3===t)return"sourceLoc.x, sourceLoc.y, sourceLoc.z";if(4===t)return"sourceLoc.x, sourceLoc.y, sourceLoc.z, sourceLoc.w";throw Error("Slicing for rank "+t+" is not yet supported")}(this.rank);this.userCode="\n uniform "+e+" start;\n\n void main() {\n "+e+" sourceLoc = start + getOutputCoords();\n setOutput(getSource("+n+"));\n }\n "}return t.prototype.getCustomSetupFunc=function(t){var e=this;if(t.length!==this.rank)throw Error("The rank ("+this.rank+") of the program must match the length of start ("+t.length+")");return function(n,r){if(null!=e.startLoc||(e.startLoc=n.getUniformLocationNoThrow(r,"start"),null!=e.startLoc))if(1===e.rank)n.gl.uniform1i(e.startLoc,t[0]);else if(2===e.rank)n.gl.uniform2i(e.startLoc,t[0],t[1]);else if(3===e.rank)n.gl.uniform3i(e.startLoc,t[0],t[1],t[2]);else{if(4!==e.rank)throw Error("Slicing for rank "+e.rank+" is not yet supported");n.gl.uniform4i(e.startLoc,t[0],t[1],t[2],t[3])}}},t}();var Ru=function(){return function(t,e,n){this.variableNames=["x"],this.outputShape=n,this.rank=n.length;var r=qa(this.rank),o="";o=1===this.rank?"coords * strides + begin":n.map(function(t,e){return"coords["+e+"] * strides["+e+"] + begin["+e+"]"}).join(","),this.userCode="\n "+r+" begin = "+r+"("+t+");\n "+r+" strides = "+r+"("+e+");\n\n void main() {\n "+r+" coords = getOutputCoords();\n setOutput(getX("+o+"));\n }\n "}}(),ku=function(){function t(t){this.gpgpu=t,this.numUsedTextures=0,this.numFreeTextures=0,this.freeTextures={},this.logEnabled=!1,this.allocatedTextures=[],this.usedTextureCount={}}return t.prototype.acquireTexture=function(t,e){void 0===e&&(e=ma.FLOAT);var n=Cu(t,e);if(n in this.freeTextures||(this.freeTextures[n]=[]),n in this.usedTextureCount||(this.usedTextureCount[n]=0),this.usedTextureCount[n]++,this.freeTextures[n].length>0)return this.numFreeTextures--,this.numUsedTextures++,this.log(),this.freeTextures[n].shift();this.numUsedTextures++,this.log();var r=this.gpgpu.createMatrixTexture(t[0],t[1]);return this.allocatedTextures.push(r),r},t.prototype.releaseTexture=function(t,e,n){void 0===n&&(n=ma.FLOAT);var r=Cu(e,n);r in this.freeTextures||(this.freeTextures[r]=[]),this.freeTextures[r].push(t),this.numFreeTextures++,this.numUsedTextures--,this.usedTextureCount[r]--,this.log()},t.prototype.log=function(){if(this.logEnabled){var t=this.numFreeTextures+this.numUsedTextures;console.log("Free/Used",this.numFreeTextures+" / "+this.numUsedTextures,"("+t+")")}},t.prototype.getNumUsedTextures=function(){return this.numUsedTextures},t.prototype.getNumFreeTextures=function(){return this.numFreeTextures},t.prototype.dispose=function(){var t=this;null!=this.allocatedTextures&&(this.allocatedTextures.forEach(function(e){t.gpgpu.deleteMatrixTexture(e)}),this.freeTextures=null,this.allocatedTextures=null,this.usedTextureCount=null,this.numUsedTextures=0,this.numFreeTextures=0)},t}();function Cu(t,e){return t[0]+"_"+t[1]+"_"+e}var Tu=function(){return function(t,e){this.variableNames=["A"];for(var n=new Array(t.length),r=0;r4)throw Error("Tile for rank "+e+" is not yet supported");if(1===e)return"imod(resRC, "+t[0]+")";for(var n=["resRC.x","resRC.y","resRC.z","resRC.w"],r=[],o=0;o4)throw Error("Transpose for rank "+e+" is not yet supported");for(var n=["resRC.x","resRC.y","resRC.z","resRC.w"],r=new Array(e),o=0;o0&&o[o.length-1])&&(6===a[0]||2===a[0])){i=0;continue}if(3===a[0]&&(!o||a[1]>o[0]&&a[1]0?this.gpgpu.beginQuery():{startMs:performance.now(),endMs:null}},t.prototype.endTimer=function(t){return fa.get("WEBGL_DISJOINT_QUERY_TIMER_EXTENSION_VERSION")>0?(this.gpgpu.endQuery(),t):(t.endMs=performance.now(),t)},t.prototype.getQueryTime=function(t){return Ou(this,void 0,void 0,function(){var e;return Nu(this,function(n){return fa.get("WEBGL_DISJOINT_QUERY_TIMER_EXTENSION_VERSION")>0?[2,this.gpgpu.pollQueryTime(t)]:[2,(e=t).endMs-e.startMs]})})},t.prototype.disposeData=function(t){if(this.texData.has(t)){var e=this.texData.get(t),n=e.texture,r=e.texShape,o=e.texType;null!=n&&this.textureManager.releaseTexture(n,r,o),this.texData.delete(t)}},t.prototype.getTexture=function(t){return this.uploadToGPU(t),this.texData.get(t).texture},t.prototype.getTextureData=function(t){return this.uploadToGPU(t),this.texData.get(t)},t.prototype.getGPGPUContext=function(){return this.gpgpu},t.prototype.getCanvas=function(){return this.canvas},t.prototype.slice=function(t,e,n){var r=new Su(n),o=r.getCustomSetupFunc(e);return this.compileAndRun(r,[t],null,o)},t.prototype.stridedSlice=function(t,e,n,r,o,a){var i=le(t.shape,e,n,r,o,a),u=i[0],s=i[1];if(s.some(function(t){return 0===t}))return eo([],s);var c=new Ru(u,r,s);return this.compileAndRun(c,[t])},t.prototype.reverse=function(t,e){var n=new Eu(t.shape,e);return this.compileAndRun(n,[t])},t.prototype.concat=function(t,e){var n=new Sa(t.shape,e.shape);return this.compileAndRun(n,[t,e])},t.prototype.neg=function(t){var e=new Au(t.shape,"return -x;");return this.compileAndRun(e,[t])},t.prototype.matMul=function(t,e,n,r){var o=new pu(t.shape,e.shape,n,r);return this.compileAndRun(o,[t,e])},t.prototype.multiply=function(t,e){var n=new wa("return a * b;",t.shape,e.shape),r=this.makeOutputArray(n.outputShape,kt(t.dtype,e.dtype));return this.compileAndRun(n,[t,e],r)},t.prototype.batchNormalization=function(t,e,n,r,o,a){var i=[t,e,n],u=null;null!=a&&(u=a.shape,i.push(a));var s=null;null!=o&&(s=o.shape,i.push(o));var c=new xa(t.shape,e.shape,n.shape,u,s,r);return this.compileAndRun(c,i)},t.prototype.localResponseNormalization4D=function(t,e,n,r,o){var a=new fu(t.shape,e,n,r,o);return this.compileAndRun(a,[t])},t.prototype.tile=function(t,e){var n=new Tu(t.shape,e);return this.compileAndRun(n,[t])},t.prototype.pad=function(t,e,n){var r=new gu(t.shape,e,n);return this.compileAndRun(r,[t])},t.prototype.transpose=function(t,e){var n=new _u(t.shape,e);return this.compileAndRun(n,[t])},t.prototype.gather=function(t,e,n){var r=new Za(t.shape,e.size,n);return this.compileAndRun(r,[t,e])},t.prototype.reduce=function(t,e,n){var r=t.shape[0],o=t.shape[1],a=da(o),i=new yu({windowSize:a,inSize:o,batchSize:r},e),u=i.outputShape,s=u[0],c=u[1],l=this.makeOutputArray([s,c],n);return this.compileAndRun(i,[t],l),1===l.shape[1]?l:this.reduce(l,e,n)},t.prototype.argReduce=function(t,e,n){void 0===n&&(n=null);var r=t.shape[0],o=t.shape[1];null!=n&&(r=n.shape[0],o=n.shape[1]);var a=da(o),i=new ya({windowSize:a,inSize:o,batchSize:r},e,null==n),u=i.outputShape,s=u[0],c=u[1],l=this.makeOutputArray([s,c],"int32"),f=[t];return null!=n&&f.push(n),this.compileAndRun(i,f,l),1===l.shape[1]?l:this.argReduce(t,e,l)},t.prototype.sum=function(t,e){G("sum",e,t.rank);var n=z(t.shape,e),r=n[0],o=p(n[1]),a=t.as2D(-1,o),i=kt(t.dtype,"int32");return this.reduce(a,"sum",i).reshape(r)},t.prototype.argMin=function(t,e){var n=[e];G("argMin",n,t.rank);var r=z(t.shape,n),o=r[0],a=p(r[1]),i=t.as2D(-1,a);return this.argReduce(i,"min").reshape(o)},t.prototype.argMax=function(t,e){var n=[e];G("argMax",n,t.rank);var r=z(t.shape,n),o=r[0],a=p(r[1]),i=t.as2D(-1,a);return this.argReduce(i,"max").reshape(o)},t.prototype.cumsum=function(t,e,n,r){var o=new Xa(t.shape,n,r);return this.compileAndRun(o,[t])},t.prototype.equal=function(t,e){var n=new wa("return float(a == b);",t.shape,e.shape),r=this.makeOutputArray(n.outputShape,"bool");return this.compileAndRun(n,[t,e],r)},t.prototype.notEqual=function(t,e){var n=new wa("return float(a != b);",t.shape,e.shape),r=this.makeOutputArray(n.outputShape,"bool");return this.compileAndRun(n,[t,e],r)},t.prototype.less=function(t,e){var n=new wa("return float(a < b);",t.shape,e.shape),r=this.makeOutputArray(n.outputShape,"bool");return this.compileAndRun(n,[t,e],r)},t.prototype.lessEqual=function(t,e){var n=new wa("return float(a <= b);",t.shape,e.shape),r=this.makeOutputArray(n.outputShape,"bool");return this.compileAndRun(n,[t,e],r)},t.prototype.greater=function(t,e){var n=new wa("return float(a > b);",t.shape,e.shape),r=this.makeOutputArray(n.outputShape,"bool");return this.compileAndRun(n,[t,e],r)},t.prototype.greaterEqual=function(t,e){var n=new wa("return float(a >= b);",t.shape,e.shape),r=this.makeOutputArray(n.outputShape,"bool");return this.compileAndRun(n,[t,e],r)},t.prototype.logicalNot=function(t){var e=new Au(t.shape,"return float(!(x >= 1.0));");return this.compileAndRun(e,[t])},t.prototype.logicalAnd=function(t,e){var n=new wa("return float(a >= 1.0 && b >= 1.0);",t.shape,e.shape),r=this.makeOutputArray(n.outputShape,"bool");return this.compileAndRun(n,[t,e],r)},t.prototype.logicalOr=function(t,e){var n=new wa("return float(a >= 1.0 || b >= 1.0);",t.shape,e.shape),r=this.makeOutputArray(n.outputShape,"bool");return this.compileAndRun(n,[t,e],r)},t.prototype.where=function(t,e,n,r){var o=new lu(t.rank,e.shape,e.rank),a=this.makeOutputArray(o.outputShape,r);return this.compileAndRun(o,[t,e,n],a)},t.prototype.topKValues=function(t,e){throw new Error("topKValues GPU not yet implemented!")},t.prototype.topKIndices=function(t,e){throw new Error("topKIndices GPU not yet implemented!")},t.prototype.min=function(t,e){G("min",e,t.rank);var n=z(t.shape,e),r=n[0],o=p(n[1]),a=t.as2D(-1,o);return this.reduce(a,"min",a.dtype).reshape(r)},t.prototype.minimum=function(t,e){var n=new wa("\n if (isNaN(a)) return a;\n if (isNaN(b)) return b;\n\n return min(a, b);\n",t.shape,e.shape);return this.compileAndRun(n,[t,e])},t.prototype.mod=function(t,e){var n=new wa("return mod(a, b);",t.shape,e.shape);return this.compileAndRun(n,[t,e])},t.prototype.max=function(t,e){G("max",e,t.rank);var n=z(t.shape,e),r=n[0],o=p(n[1]),a=t.as2D(-1,o);return this.reduce(a,"max",a.dtype).reshape(r)},t.prototype.maximum=function(t,e){var n=new wa("\n if (isNaN(a)) return a;\n if (isNaN(b)) return b;\n\n return max(a, b);\n",t.shape,e.shape);return this.compileAndRun(n,[t,e])},t.prototype.squaredDifference=function(t,e){var n=new wa("return (a - b) * (a - b);",t.shape,e.shape);return this.compileAndRun(n,[t,e])},t.prototype.divide=function(t,e){var n,r;"int32"===t.dtype&&"int32"===e.dtype?(n="\n float resultSign = sign(a) * sign(b);\n int ia = round(a);\n int ib = round(b);\n int result = ia / ib;\n int amodb = ia - ib * result;\n\n if (resultSign < 0.0 && amodb != 0) {\n result -= 1;\n }\n return float(result);\n",r="int32"):(n="return a / b;",r="float32");var o=new wa(n,t.shape,e.shape),a=this.makeOutputArray(o.outputShape,r);return this.compileAndRun(o,[t,e],a)},t.prototype.add=function(t,e){var n=new wa("return a + b;",t.shape,e.shape),r=this.makeOutputArray(n.outputShape,kt(t.dtype,e.dtype));return this.compileAndRun(n,[t,e],r)},t.prototype.subtract=function(t,e){var n=new wa("return a - b;",t.shape,e.shape),r=this.makeOutputArray(n.outputShape,kt(t.dtype,e.dtype));return this.compileAndRun(n,[t,e],r)},t.prototype.pow=function(t,e){var n=new wa("\n return (round(mod(b, 2.0)) == 0 || round(mod(b, 2.0)) == 2) ?\n pow(abs(a), b) : sign(a) * pow(abs(a), b);\n",t.shape,e.shape),r=this.makeOutputArray(n.outputShape,kt(t.dtype,e.dtype));return this.compileAndRun(n,[t,e],r)},t.prototype.ceil=function(t){var e=new Au(t.shape,"return ceil(x);");return this.compileAndRun(e,[t])},t.prototype.floor=function(t){var e=new Au(t.shape,"return floor(x);");return this.compileAndRun(e,[t])},t.prototype.sign=function(t){var e=new Au(t.shape,"\n if (isNaN(x)) { return 0.0; }\n return sign(x);\n");return this.compileAndRun(e,[t])},t.prototype.round=function(t){var e=new Au(t.shape,"\n // OpenGL ES does not support round function.\n // The algorithm is based on banker's rounding.\n float base = floor(x);\n if ((x - base) < 0.5) {\n return floor(x);\n } else if ((x - base) > 0.5) {\n return ceil(x);\n } else {\n if (mod(base, 2.0) == 0.0) {\n return base;\n } else {\n return base + 1.0;\n }\n }\n");return this.compileAndRun(e,[t])},t.prototype.exp=function(t){var e=new Au(t.shape,"return exp(x);");return this.compileAndRun(e,[t])},t.prototype.expm1=function(t){var e=new Au(t.shape,"return exp(x) - 1.0;");return this.compileAndRun(e,[t])},t.prototype.log=function(t){var e=new Au(t.shape,"return log(x);");return this.compileAndRun(e,[t])},t.prototype.log1p=function(t){var e=new Au(t.shape,"return log(1.0 + x);");return this.compileAndRun(e,[t])},t.prototype.sqrt=function(t){var e=new Au(t.shape,"return sqrt(x);");return this.compileAndRun(e,[t])},t.prototype.rsqrt=function(t){var e=new Au(t.shape,"return inversesqrt(x);");return this.compileAndRun(e,[t])},t.prototype.square=function(t){var e=new Au(t.shape,"return x * x;");return this.compileAndRun(e,[t])},t.prototype.reciprocal=function(t){var e=new Au(t.shape,"return 1.0 / x;");return this.compileAndRun(e,[t])},t.prototype.relu=function(t){var e=new Au(t.shape,Iu);return this.compileAndRun(e,[t])},t.prototype.elu=function(t){var e=new Au(t.shape,"return (x >= 0.0) ? x : (exp(x) - 1.0);");return this.compileAndRun(e,[t])},t.prototype.eluDer=function(t,e){var n=new wa("return (b >= 1.0) ? a : a * (b + 1.0);",t.shape,e.shape);return this.compileAndRun(n,[t,e])},t.prototype.selu=function(t){var e=new Au(t.shape,"\n // Stable and Attracting Fixed Point (0, 1) for Normalized Weights.\n // see: https://arxiv.org/abs/1706.02515\n float scaleAlpha = 1.7580993408473768;\n float scale = 1.0507009873554805;\n return (x >= 0.0) ? scale * x : scaleAlpha * (exp(x) - 1.0);\n");return this.compileAndRun(e,[t])},t.prototype.int=function(t){var e=new Au(t.shape,"return float(int(x));"),n=this.makeOutputArray(e.outputShape,"int32");return this.compileAndRun(e,[t],n)},t.prototype.clip=function(t,e,n){var r=new Ea(t.shape,e,n);return this.compileAndRun(r,[t])},t.prototype.abs=function(t){var e=new Au(t.shape,"return abs(x);");return this.compileAndRun(e,[t])},t.prototype.sigmoid=function(t){var e=new Au(t.shape,"return 1.0 / (1.0 + exp(-1.0 * x));");return this.compileAndRun(e,[t])},t.prototype.softplus=function(t){var e=new Au(t.shape,"\n float epsilon = 1.1920928955078125e-7;\n float threshold = log(epsilon) + 2.0;\n\n bool too_large = x > -threshold;\n bool too_small = x < threshold;\n\n float result;\n float exp_x = exp(x);\n\n if (too_large){\n result = x;\n }\n else if (too_small){\n result = exp_x;\n }\n else{\n result = log(exp_x + 1.0);\n }\n return result;\n");return this.compileAndRun(e,[t])},t.prototype.sin=function(t){var e=new Au(t.shape,"return sin(x);");return this.compileAndRun(e,[t])},t.prototype.cos=function(t){var e=new Au(t.shape,"return cos(x);");return this.compileAndRun(e,[t])},t.prototype.tan=function(t){var e=new Au(t.shape,"return tan(x);");return this.compileAndRun(e,[t])},t.prototype.asin=function(t){var e=new Au(t.shape,"return asin(x);");return this.compileAndRun(e,[t])},t.prototype.acos=function(t){var e=new Au(t.shape,"return acos(x);");return this.compileAndRun(e,[t])},t.prototype.atan=function(t){var e=new Au(t.shape,Mu);return this.compileAndRun(e,[t])},t.prototype.atan2=function(t,e){var n=new wa("\n if (isNaN(a)) return a;\n if (isNaN(b)) return b;\n\n return atan(a, b);\n",t.shape,e.shape);return this.compileAndRun(n,[t,e])},t.prototype.sinh=function(t){var e=new Au(t.shape,"\n float e2x = exp(x);\n return (e2x - 1.0 / e2x) / 2.0;\n");return this.compileAndRun(e,[t])},t.prototype.cosh=function(t){var e=new Au(t.shape,"\n float e2x = exp(-x);\n return (e2x + 1.0 / e2x) / 2.0;\n");return this.compileAndRun(e,[t])},t.prototype.tanh=function(t){var e=new Au(t.shape,"\n float e2x = exp(-2.0 * abs(x));\n return sign(x) * (1.0 - e2x) / (1.0 + e2x);\n");return this.compileAndRun(e,[t])},t.prototype.asinh=function(t){var e=new Au(t.shape,"return log(x + sqrt(x * x + 1.0));");return this.compileAndRun(e,[t])},t.prototype.acosh=function(t){var e=new Au(t.shape,"return log(x + sqrt(x * x - 1.0));");return this.compileAndRun(e,[t])},t.prototype.atanh=function(t){var e=new Au(t.shape,"return (log(1.0 + x) - log(1.0 - x)) / 2.0;");return this.compileAndRun(e,[t])},t.prototype.erf=function(t){var e=new Au(t.shape,'\n // Error function is calculated approximately with elementary function.\n // See "Handbook of Mathematical Functions with Formulas,\n // Graphs, and Mathematical Tables", Abramowitz and Stegun.\n float p = 0.3275911;\n float a1 = 0.254829592;\n float a2 = -0.284496736;\n float a3 = 1.421413741;\n float a4 = -1.453152027;\n float a5 = 1.061405429;\n\n float t = 1.0 / (1.0 + p * x);\n return 1.0 - (((((a5*t + a4)*t) + a3)*t + a2)*t + a1)*t*exp(-x*x);\n');return this.compileAndRun(e,[t])},t.prototype.step=function(t,e){var n=new Au(t.shape,function(t){return void 0===t&&(t=0),Du+"\n return x > 0.0 ? 1.0 : float("+t+");\n "}(e));return this.compileAndRun(n,[t])},t.prototype.conv2d=function(t,e,n){var r=new Ca(n);return this.compileAndRun(r,[t,e])},t.prototype.conv2dDerInput=function(t,e,n){var r=new ka(n);return this.compileAndRun(r,[t,e])},t.prototype.conv2dDerFilter=function(t,e,n){var r=new Ra(n);return this.compileAndRun(r,[t,e])},t.prototype.depthwiseConv2D=function(t,e,n){var r=new Ya(n);return this.compileAndRun(r,[t,e])},t.prototype.maxPool=function(t,e){var n=new mu(e,"max",!1),r=this.makeOutputArray(n.outputShape,t.dtype);return this.compileAndRun(n,[t],r)},t.prototype.avgPool=function(t,e){var n=new mu(e,"avg",!1),r=this.makeOutputArray(n.outputShape,"float32");return this.compileAndRun(n,[t],r)},t.prototype.maxPoolBackprop=function(t,e,n,r){var o=new mu(r,"max",!0),a=this.compileAndRun(o,[e]),i=new hu(r),u=this.makeOutputArray(i.outputShape,e.dtype),s=this.compileAndRun(i,[t,a],u);return a.dispose(),s},t.prototype.avgPoolBackprop=function(t,e,n){var r=new ba(n),o=this.makeOutputArray(r.outputShape,e.dtype);return this.compileAndRun(r,[t],o)},t.prototype.cast=function(t,e){return va(t,e,this)},t.prototype.reshape=function(t,e){return ga(t,e)},t.prototype.resizeBilinear=function(t,e,n,r){var o=new xu(t.shape,e,n,r);return this.compileAndRun(o,[t])},t.prototype.resizeBilinearBackprop=function(t,e,n){var r=new bu(t,e,n);return this.compileAndRun(r,[t])},t.prototype.resizeNearestNeighbor=function(t,e,n,r){var o=new wu(t.shape,e,n,r);return this.compileAndRun(o,[t])},t.prototype.multinomial=function(t,e,n,r){var o=e?t:Eo(t),a=o.shape[0],i=o.shape[1],u=new du(a,i,n),s=this.makeOutputArray(u.outputShape,"int32"),c=u.getCustomSetupFunc(r);return this.compileAndRun(u,[o],s,c)},t.prototype.oneHot=function(t,e,n,r){var o=new vu(t.size,e,n,r);return this.compileAndRun(o,[t])},t.prototype.makeOutputArray=function(t,e){return Mo.make(t,{},e)},t.prototype.compileAndRun=function(t,e,n,r){var o=this;null==n&&(n=this.makeOutputArray(t.outputShape,e[0].dtype));var a=e.map(function(t){return o.uploadToGPU(t.dataId),{tensor:t,texData:o.texData.get(t.dataId)}});this.uploadToGPU(n.dataId);var i,u={tensor:n,texData:this.texData.get(n.dataId)},s=function(t,e,n){var r="";e.concat(n).forEach(function(t){r+=t.tensor.shape+"_"+t.texData.texShape});var o=t.userCode,a=(!0===t.supportsBroadcasting).toString(),i=t.constructor.name;return i+="_"+a+"_"+r+"_"+o}(t,a,u),c=this.getAndSaveBinary(s,function(){return function(t,e,n,r){for(var o=e.userCode,a=n.map(function(t,n){var r={logicalShape:t.tensor.shape,texShape:t.texData.texShape};return{name:e.variableNames[n],shapeInfo:r}}),i=a.map(function(t){return t.shapeInfo}),u={logicalShape:r.tensor.shape,texShape:r.texData.texShape},s=Ba(a,u,o,!0===e.supportsBroadcasting),c=t.createProgram(s),l={},f=0;f0&&o[o.length-1])&&(6===a[0]||2===a[0])){i=0;continue}if(3===a[0]&&(!o||a[1]>o[0]&&a[1]h&&(h=g,d=v)}s[l]=d}return i},t.prototype.cumsum=function(t,e,n,r){for(var o=kt(t.dtype,"int32"),a=Fr(t.shape,o),i=a.dataSync(),u=t.dataSync(),s=t.shape[t.rank-1],c=r?function(t,e){return t+s-e-1}:function(t,e){return t+e},l=0;le?1:0})},t.prototype.greaterEqual=function(t,e){return this.broadcastedBinaryOp(t,e,"bool",function(t,e){return t>=e?1:0})},t.prototype.logicalNot=function(t){for(var e=t.dataSync(),n=new Int32Array(e.length),r=0;r1||1===e.rank?1:e.shape[1],f=0;f=0&&e>=0?n:(n+e)%e})},t.prototype.max=function(t,e){G("max",e,t.rank);for(var n=z(t.shape,e),r=n[0],o=n[1],a=Fr(r,t.dtype),i=p(o),u=a.dataSync(),s=t.dataSync(),c=0;cf&&(f=d)}u[c]=f}return a},t.prototype.maximum=function(t,e){return this.broadcastedBinaryOp(t,e,t.dtype,function(t,e){return Math.max(t,e)})},t.prototype.squaredDifference=function(t,e){return this.broadcastedBinaryOp(t,e,t.dtype,function(t,e){var n=t-e;return n*n})},t.prototype.ceil=function(t){for(var e=t.dataSync(),n=new Float32Array(e.length),r=0;r0?n[r]=1:n[r]=0;return Mo.make(t.shape,{values:n})},t.prototype.round=function(t){for(var e=t.dataSync(),n=new Float32Array(e.length),r=0;r.5?n[r]=Math.ceil(e[r]):n[r]=o%2==0?o:o+1}return Mo.make(t.shape,{values:n})},t.prototype.exp=function(t){for(var e=t.dataSync(),n=new Float32Array(e.length),r=0;r=0?o:Math.exp(o)-1}return Mo.make(t.shape,{values:e})},t.prototype.eluDer=function(t,e){for(var n=new Float32Array(e.size),r=e.dataSync(),o=t.dataSync(),a=0;a=1?o[a]:o[a]*(i+1)}return Mo.make(e.shape,{values:n})},t.prototype.selu=function(t){for(var e=new Float32Array(t.size),n=t.dataSync(),r=0;r=0?1.0507009873554805*o:1.7580993408473768*(Math.exp(o)-1)}return Mo.make(t.shape,{values:e})},t.prototype.clip=function(t,e,n){for(var r=new Float32Array(t.size),o=t.dataSync(),a=0;a-e,i=r[o]0?1:e}return Mo.make(t.shape,{values:n})},t.prototype.conv2d=function(t,e,n){for(var r=n.filterHeight,o=n.filterWidth,a=n.dilationHeight,i=n.dilationWidth,u=n.padInfo.left,s=n.padInfo.top,c=$r(n.outShape,t.dtype),l=0;l=n.inHeight))for(var b=0;b=n.inWidth))for(var w=0;w=n.inHeight))for(var w=0;w=n.inWidth))y+=t.get(f,x,E,h)*e.get(b,w,h,m)}}l.set(y,f,p,v,h*c+m)}return l.toTensor()},t.prototype.tile=function(t,e){for(var n=new Array(t.rank),r=0;rx?x=k:"avg"===n&&(w+=k,E++)}if(isNaN(x))break}u.set("avg"===n?w/E:x,l,h,g,f)}return u.toTensor()},t.prototype.maxPool=function(t,e){return this.pool(t,e,"max")},t.prototype.maxPoolPositions=function(t,e){for(var n=$r(e.outShape,"int32"),r=e.strideHeight,o=e.strideWidth,a=e.filterHeight,i=e.filterWidth,u=e.padInfo.top,s=e.padInfo.left,c=0;cb&&(b=k,x=E*i+R)}n.set(x,c,f,v,l)}return n.toTensor()},t.prototype.maxPoolBackprop=function(t,e,n,r){for(var o=this.maxPoolPositions(e,r),a=r.strideHeight,i=r.strideWidth,u=r.filterHeight,s=r.filterWidth,c=s-1-r.padInfo.left,l=u-1-r.padInfo.top,f=$r(e.shape,"float32"),h=0;h=r.outHeight||Math.floor(x)!==x))for(var w=0;w=r.outWidth||Math.floor(E)!==E)){var S=u*s-1-o.get(h,x,E,p)===b*s+w?1:0;if(0!==S)y+=t.get(h,x,E,p)*S}}}f.set(y,h,d,v,p)}return f.toTensor()},t.prototype.avgPoolBackprop=function(t,e,n){for(var r=n.strideHeight,o=n.strideWidth,a=n.filterHeight,i=n.filterWidth,u=i-1-n.padInfo.left,s=a-1-n.padInfo.top,c=$r(e.shape,"float32"),l=1/(a*i),f=0;f=n.outHeight||Math.floor(b)!==b))for(var x=0;x=n.outWidth||Math.floor(w)!==w))m+=t.get(f,b,w,h)}}c.set(m*l,f,p,d,h)}return c.toTensor()},t.prototype.cast=function(t,e){return va(t,e,this)},t.prototype.reshape=function(t,e){return ga(t,e)},t.prototype.avgPool=function(t,e){return this.pool(t,e,"avg").toFloat()},t.prototype.resizeBilinear=function(t,e,n,r){for(var o=t.shape,a=o[0],i=o[1],u=o[2],s=o[3],c=$r([a,e,n,s],t.dtype),l=[r&&e>1?i-1:i,r&&n>1?u-1:u],f=[r&&e>1?e-1:e,r&&n>1?n-1:n],h=0;h1?a-1:a,n&&l>1?i-1:i],p=[n&&c>1?c-1:c,n&&l>1?l-1:l],d=h[0]/p[0],v=h[1]/p[1],g=0;g=0;u--)(o=t[u])&&(i=(a<3?o(i):a>3?o(e,n,i):o(e,n))||i);return a>3&&i&&Object.defineProperty(e,n,i),i},zu=function(){function t(){}return t.nextFrame=function(){return new Promise(function(t){return requestAnimationFrame(function(){return t()})})},Uu([function(){for(var t=[],e=0;e0&&o[o.length-1])&&(6===a[0]||2===a[0])){i=0;continue}if(3===a[0]&&(!o||a[1]>o[0]&&a[1]0&&o[o.length-1])&&(6===a[0]||2===a[0])){i=0;continue}if(3===a[0]&&(!o||a[1]>o[0]&&a[1]0,"scheme must not be an empty string.");var r=t.getInstance();s(null==r.managers[e],"A model store manager is already registered for scheme '"+e+"'."),r.managers[e]=n},t.getManager=function(t){var e=this.getInstance().managers[t];if(null==e)throw new Error("Cannot find model manager for scheme '"+t+"'");return e},t.getSchemes=function(){return Object.keys(this.getInstance().managers)},t}();function Zu(t){if(-1===t.indexOf(Yu))throw new Error("The url string provided does not contain a scheme. Supported schemes are: "+Ju.getSchemes().join(","));return{scheme:t.split(Yu)[0],path:t.split(Yu)[1]}}function $u(t,e,n){return void 0===n&&(n=!1),Ku(this,void 0,void 0,function(){var r,o,a,i,u,c,l,f,h;return Qu(this,function(p){switch(p.label){case 0:return s(t!==e,"Old path and new path are the same: '"+t+"'"),s((r=Xu.getLoadHandlers(t)).length>0,"Copying failed because no load handler is found for source URL "+t+"."),s(r.length<2,"Copying failed because more than one ("+r.length+") load handlers for source URL "+t+"."),o=r[0],s((a=Xu.getSaveHandlers(e)).length>0,"Copying failed because no save handler is found for destination URL "+e+"."),s(a.length<2,"Copying failed because more than one ("+r.length+") save handlers for destination URL "+e+"."),i=a[0],u=Zu(t).scheme,c=Zu(t).path,l=u===Zu(t).scheme,[4,o.load()];case 1:return f=p.sent(),n&&l?[4,Ju.getManager(u).removeModel(c)]:[3,3];case 2:p.sent(),p.label=3;case 3:return[4,i.save(f)];case 4:return h=p.sent(),!n||l?[3,6]:[4,Ju.getManager(u).removeModel(c)];case 5:p.sent(),p.label=6;case 6:return[2,h.modelArtifactsInfo]}})})}var ts=function(t,e,n,r){return new(n||(n=Promise))(function(o,a){function i(t){try{s(r.next(t))}catch(t){a(t)}}function u(t){try{s(r.throw(t))}catch(t){a(t)}}function s(t){t.done?o(t.value):new n(function(e){e(t.value)}).then(i,u)}s((r=r.apply(t,e||[])).next())})},es=function(t,e){var n,r,o,a,i={label:0,sent:function(){if(1&o[0])throw o[1];return o[1]},trys:[],ops:[]};return a={next:u(0),throw:u(1),return:u(2)},"function"==typeof Symbol&&(a[Symbol.iterator]=function(){return this}),a;function u(a){return function(u){return function(a){if(n)throw new TypeError("Generator is already executing.");for(;i;)try{if(n=1,r&&(o=r[2&a[0]?"return":a[0]?"throw":"next"])&&!(o=o.call(r,a[1])).done)return o;switch(r=0,o&&(a=[0,o.value]),a[0]){case 0:case 1:o=a;break;case 4:return i.label++,{value:a[1],done:!1};case 5:i.label++,r=a[1],a=[0];continue;case 7:a=i.ops.pop(),i.trys.pop();continue;default:if(!(o=(o=i.trys).length>0&&o[o.length-1])&&(6===a[0]||2===a[0])){i=0;continue}if(3===a[0]&&(!o||a[1]>o[0]&&a[1]0&&o[o.length-1])&&(6===a[0]||2===a[0])){i=0;continue}if(3===a[0]&&(!o||a[1]>o[0]&&a[1]0&&o[o.length-1])&&(6===a[0]||2===a[0])){i=0;continue}if(3===a[0]&&(!o||a[1]>o[0]&&a[1]0&&o[o.length-1])&&(6===a[0]||2===a[0])){i=0;continue}if(3===a[0]&&(!o||a[1]>o[0]&&a[1]0,"URL path for browserHTTPRequest must not be null, undefined or empty."),this.path=t,null!=e&&null!=e.body)throw new Error("requestInit is expected to have no pre-existing body, but has one.");this.requestInit=e||{}}return t.prototype.save=function(t){return As(this,void 0,void 0,function(){var e,n,r,o;return Ds(this,function(a){switch(a.label){case 0:if(t.modelTopology instanceof ArrayBuffer)throw new Error("BrowserHTTPRequest.save() does not support saving model topology in binary formats yet.");return(e=Object.assign({method:this.DEFAULT_METHOD},this.requestInit)).body=new FormData,n=[{paths:["./model.weights.bin"],weights:t.weightSpecs}],r={modelTopology:t.modelTopology,weightsManifest:n},e.body.append("model.json",new Blob([JSON.stringify(r)],{type:"application/json"}),"model.json"),null!=t.weightData&&e.body.append("model.weights.bin",new Blob([t.weightData],{type:"application/octet-stream"}),"model.weights.bin"),[4,fetch(this.path,e)];case 1:if(200===(o=a.sent()).status)return[2,{modelArtifactsInfo:Hu(t),responses:[o]}];throw new Error("BrowserHTTPRequest.save() failed due to HTTP response status "+o.status+".")}})})},t.URL_SCHEMES=["http://","https://"],t}();function Ms(t,e){return new Is(t,e)}Xu.registerSaveRouter(function(t){if(fa.get("IS_BROWSER")){for(var e=0,n=Is.URL_SCHEMES;e0&&o[o.length-1])&&(6===a[0]||2===a[0])){i=0;continue}if(3===a[0]&&(!o||a[1]>o[0]&&a[1]n)}var Hs=Object.freeze({WEBGL_ENVS:{BACKEND:"test-webgl"},CPU_ENVS:{BACKEND:"test-cpu"},ALL_ENVS:{},TEST_EPSILON:Gs,expectArraysClose:qs,expectPromiseToFail:function(t,e){t().then(function(){return e.fail()},function(){return e()})},expectArraysEqual:function(t,e){return qs(t,e,0)},expectNumbersClose:function(t,e,n){if(void 0===n&&(n=Gs),!js(t,e,n))throw new Error("Numbers differ: actual === "+t+", expected === "+e)},expectValuesInRange:function(t,e,n){var r;r=t instanceof Mo?t.dataSync():t;for(var o=0;on)throw new Error("Value out of range:"+r[o]+" low: "+e+", high: "+n)}}),Xs=Object.freeze({gpgpu_util:ru,webgl_util:Oi,MathBackendWebGL:Lu,GPGPUContext:iu}),Ks=function(){var t=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var n in e)e.hasOwnProperty(n)&&(t[n]=e[n])};return function(e,n){function r(){this.constructor=e}t(e,n),e.prototype=null===n?Object.create(n):(r.prototype=n.prototype,new r)}}(),Qs=function(t,e,n,r){var o,a=arguments.length,i=a<3?e:null===r?r=Object.getOwnPropertyDescriptor(e,n):r;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)i=Reflect.decorate(t,e,n,r);else for(var u=t.length-1;u>=0;u--)(o=t[u])&&(i=(a<3?o(i):a>3?o(e,n,i):o(e,n))||i);return a>3&&i&&Object.defineProperty(e,n,i),i},Ys=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return Ks(e,t),e.prototype.minimize=function(t,e,n){void 0===e&&(e=!1);var r=this.computeGradients(t,n),o=r.value,a=r.grads;return this.applyGradients(a),Object.keys(a).forEach(function(t){return a[t].dispose()}),e?o:(o.dispose(),null)},e.prototype.computeGradients=function(t,e){return Xo(t,e)},Qs([function(){for(var t=[],e=0;e=0;u--)(o=t[u])&&(i=(a<3?o(i):a>3?o(e,n,i):o(e,n))||i);return a>3&&i&&Object.defineProperty(e,n,i),i},hc=function(){function t(){}return t.sgd=function(t){return new ic(t)},t.momentum=function(t,e,n){return void 0===n&&(n=!1),new sc(t,e,n)},t.rmsprop=function(t,e,n,r,o){return void 0===e&&(e=.9),void 0===n&&(n=0),void 0===r&&(r=1e-8),void 0===o&&(o=!1),new lc(t,e,n,r,o)},t.adam=function(t,e,n,r){return void 0===t&&(t=.001),void 0===e&&(e=.9),void 0===n&&(n=.999),void 0===r&&(r=1e-8),new nc(t,e,n,r)},t.adadelta=function(t,e,n){return void 0===t&&(t=.001),void 0===e&&(e=.95),void 0===n&&(n=1e-8),new Zs(t,e,n)},t.adamax=function(t,e,n,r,o){return void 0===t&&(t=.002),void 0===e&&(e=.9),void 0===n&&(n=.999),void 0===r&&(r=1e-8),void 0===o&&(o=0),new oc(t,e,n,r,o)},t.adagrad=function(t,e){return void 0===e&&(e=.1),new tc(t,e)},fc([function(){for(var t=[],e=0;e0&&o[o.length-1])&&(6===a[0]||2===a[0])){i=0;continue}if(3===a[0]&&(!o||a[1]>o[0]&&a[1]0&&e>0?{width:t,height:e}:null},enumerable:!0,configurable:!0}),t}();function Lc(t){return Uo(function(){if(t instanceof Mo){var e=t.shape.length;if(3!==e&&4!==e)throw new Error("input tensor must be of rank 3 or 4");return(3===e?t.expandDims(0):t).toFloat()}var n=t instanceof Nc?t:new Nc(t);return _e(n.canvases.map(function(t){return Nr(t).expandDims(0).toFloat()}))})}function Pc(t,e){return void 0===e&&(e=!1),Uo(function(){var n=t.shape.slice(1),r=n[0],o=n[1];if(r===o)return t;var a=Math.abs(r-o),i=Math.floor(a*(e?.5:1)),u=r>o?2:1,s=function(e){void 0===e&&(e=!1);var n=t.shape.slice();return n[u]=i+(e?1:0),n},c=(e?[to(s(!Sc(a)),0)]:[]).concat([t,to(s(),0)]);return _e(c,u)})}function Bc(t){var e=t;return{extractWeights:function(t){var n=e.slice(0,t);return e=e.slice(t),n},getRemainingWeights:function(){return e}}}function Fc(t){function e(e,n,r){return{filters:io(t(e*n*r*r),[r,r,e,n]),bias:ro(t(n))}}function n(t,n,r){var o=e(t,n,r);return{filters:o.filters,batch_norm_offset:o.bias}}function r(e,r){var o;return{depthwise_conv_params:{filters:io(t(9*(o=e)),[3,3,o,1]),batch_norm_scale:ro(t(o)),batch_norm_offset:ro(t(o)),batch_norm_mean:ro(t(o)),batch_norm_variance:ro(t(o))},pointwise_conv_params:n(e,r,1)}}return{extractMobilenetV1Params:function(){return{conv_0_params:n(3,32,3),conv_pair_params:[[32,64],[64,128],[128,128],[128,256],[256,256],[256,512],[512,512],[512,512],[512,512],[512,512],[512,512],[512,1024],[1024,1024]].map(function(t){return r(t[0],t[1])})}},extractPredictionLayerParams:function(){return{conv_0_params:n(1024,256,1),conv_1_params:n(256,512,3),conv_2_params:n(512,128,1),conv_3_params:n(128,256,3),conv_4_params:n(256,128,1),conv_5_params:n(128,256,3),conv_6_params:n(256,64,1),conv_7_params:n(64,128,3),box_predictor_0_params:{box_encoding_predictor_params:e(512,12,1),class_predictor_params:e(512,9,1)},box_predictor_1_params:{box_encoding_predictor_params:e(1024,24,1),class_predictor_params:e(1024,18,1)},box_predictor_2_params:{box_encoding_predictor_params:e(512,24,1),class_predictor_params:e(512,18,1)},box_predictor_3_params:{box_encoding_predictor_params:e(256,24,1),class_predictor_params:e(256,18,1)},box_predictor_4_params:{box_encoding_predictor_params:e(256,24,1),class_predictor_params:e(256,18,1)},box_predictor_5_params:{box_encoding_predictor_params:e(128,24,1),class_predictor_params:e(128,18,1)}}}}}var Uc=function(){function t(t,e,n,r){this.x=t,this.y=e,this.width=n,this.height=r}return t.prototype.floor=function(){return new t(Math.floor(this.x),Math.floor(this.y),Math.floor(this.width),Math.floor(this.height))},t}(),zc=function(){function t(t,e,n){var r=n.width,o=n.height;this._imageWidth=r,this._imageHeight=o,this._score=t,this._box=new Uc(e.x*r,e.y*o,e.width*r,e.height*o)}return t.prototype.getScore=function(){return this._score},t.prototype.getBox=function(){return this._box},t.prototype.getImageWidth=function(){return this._imageWidth},t.prototype.getImageHeight=function(){return this._imageHeight},t.prototype.getRelativeBox=function(){return new Uc(this._box.x/this._imageWidth,this._box.y/this._imageHeight,this._box.width/this._imageWidth,this._box.height/this._imageHeight)},t.prototype.forSize=function(e,n){return new t(this._score,this.getRelativeBox(),{width:e,height:n})},t}();function Wc(t,e,n){return Uo(function(){var r=Ne(t,e.filters,n,"same");return r=hr(r,e.batch_norm_offset),Bn(r,0,6)})}var Vc=.0010000000474974513;function Gc(t,e){return Uo(function(){var n=null,r=Wc(t,e.conv_0_params,[2,2]);if(e.conv_pair_params.forEach(function(t,e){var o,a,i,u=e+1,s=function(t){return[2,4,6,12].some(function(e){return e===t})?[2,2]:[1,1]}(u);o=r,a=t.depthwise_conv_params,i=s,r=Wc(r=Uo(function(){var t=Pe(o,a.filters,i,"same");return t=Re(t,a.batch_norm_mean,a.batch_norm_variance,Vc,a.batch_norm_scale,a.batch_norm_offset),Bn(t,0,6)}),t.pointwise_conv_params,[1,1]),11===u&&(n=r)}),null===n)throw new Error("mobileNetV1 - output of conv layer 11 is null");return{out:r,conv11:n}})}function qc(t,e,n){var r=Math.min(t.get(e,0),t.get(e,2)),o=Math.min(t.get(e,1),t.get(e,3)),a=Math.max(t.get(e,0),t.get(e,2)),i=Math.max(t.get(e,1),t.get(e,3)),u=Math.min(t.get(n,0),t.get(n,2)),s=Math.min(t.get(n,1),t.get(n,3)),c=Math.max(t.get(n,0),t.get(n,2)),l=Math.max(t.get(n,1),t.get(n,3)),f=(a-r)*(i-o),h=(c-u)*(l-s);if(f<=0||h<=0)return 0;var p=Math.max(r,u),d=Math.max(o,s),v=Math.min(a,c),g=Math.min(i,l),m=Math.max(v-p,0)*Math.max(g-d,0);return m/(f+h-m)}function jc(t,e){var n=function(t){var e=lo(qe(t,[1,0])),n=[Tr(e[2],e[0]),Tr(e[3],e[1])];return{sizes:n,centers:[hr(e[0],vr(n[0],no(2))),hr(e[1],vr(n[1],no(2)))]}}(t),r=n.sizes,o=n.centers,a=lo(qe(e,[1,0])),i=vr(Sr(Wn(vr(a[2],no(5))),r[0]),no(2)),u=hr(Sr(vr(a[0],no(10)),r[0]),o[0]),s=vr(Sr(Wn(vr(a[3],no(5))),r[1]),no(2)),c=hr(Sr(vr(a[1],no(10)),r[1]),o[1]);return qe(co([Tr(u,i),Tr(c,s),hr(u,i),hr(c,s)]),[1,0])}function Hc(t,e,n,r){return void 0===n&&(n="same"),void 0===r&&(r=!1),Uo(function(){var o=hr(Ne(t,e.filters,[1,1],n),e.bias);return r?Jn(o):o})}function Xc(t,e){return Uo(function(){var n=t.shape[0];return{boxPredictionEncoding:Hr(Hc(t,e.box_encoding_predictor_params),[n,-1,1,4]),classPrediction:Hr(Hc(t,e.class_predictor_params),[n,-1,3])}})}var Kc=[512,512],Qc=no(.007843137718737125),Yc=no(1);var Jc=function(){function t(t,e){this.x=t,this.y=e}return t.prototype.add=function(e){return new t(this.x+e.x,this.y+e.y)},t.prototype.sub=function(e){return new t(this.x-e.x,this.y-e.y)},t.prototype.mul=function(e){return new t(this.x*e.x,this.y*e.y)},t.prototype.div=function(e){return new t(this.x/e.x,this.y/e.y)},t.prototype.abs=function(){return new t(Math.abs(this.x),Math.abs(this.y))},t.prototype.magnitude=function(){return Math.sqrt(Math.pow(this.x,2)+Math.pow(this.y,2))},t.prototype.floor=function(){return new t(Math.floor(this.x),Math.floor(this.y))},t}();function Zc(t){var e=Bc(t),n=e.extractWeights,r=e.getRemainingWeights,o=function(t){return function(e,n,r){return{filters:io(t(e*n*r*r),[r,r,e,n]),bias:ro(t(n))}}}(n);function a(t,e){return{weights:oo(n(t*e),[t,e]),bias:ro(n(e))}}var i=o(3,32,3),u=o(32,64,3),s=o(64,64,3),c=o(64,64,3),l=o(64,64,3),f=o(64,128,3),h=o(128,128,3),p=o(128,256,3),d=a(6400,1024),v=a(1024,136);if(0!==r().length)throw new Error("weights remaing after extract: "+r().length);return{conv0_params:i,conv1_params:u,conv2_params:s,conv3_params:c,conv4_params:l,conv5_params:f,conv6_params:h,conv7_params:p,fc0_params:d,fc1_params:v}}function $c(t){return t.reduce(function(t,e){return t.add(e)},new Jc(0,0)).div(new Jc(t.length,t.length))}var tl=function(){function t(t,e,n){void 0===n&&(n=new Jc(0,0));var r=e.width,o=e.height;this._imageWidth=r,this._imageHeight=o,this._shift=n,this._faceLandmarks=t.map(function(t){return t.mul(new Jc(r,o)).add(n)})}return t.prototype.getShift=function(){return new Jc(this._shift.x,this._shift.y)},t.prototype.getImageWidth=function(){return this._imageWidth},t.prototype.getImageHeight=function(){return this._imageHeight},t.prototype.getPositions=function(){return this._faceLandmarks},t.prototype.getRelativePositions=function(){var t=this;return this._faceLandmarks.map(function(e){return e.sub(t._shift).div(new Jc(t._imageWidth,t._imageHeight))})},t.prototype.getJawOutline=function(){return this._faceLandmarks.slice(0,17)},t.prototype.getLeftEyeBrow=function(){return this._faceLandmarks.slice(17,22)},t.prototype.getRightEyeBrow=function(){return this._faceLandmarks.slice(22,27)},t.prototype.getNose=function(){return this._faceLandmarks.slice(27,36)},t.prototype.getLeftEye=function(){return this._faceLandmarks.slice(36,42)},t.prototype.getRightEye=function(){return this._faceLandmarks.slice(42,48)},t.prototype.getMouth=function(){return this._faceLandmarks.slice(48,68)},t.prototype.forSize=function(e,n){return new t(this.getRelativePositions(),{width:e,height:n})},t.prototype.shift=function(e,n){return new t(this.getRelativePositions(),{width:this._imageWidth,height:this._imageHeight},new Jc(e,n))},t.prototype.align=function(t){if(t){var e=t instanceof zc?t.getBox().floor():t;return this.shift(e.x,e.y).align()}var n=[this.getLeftEye(),this.getRightEye(),this.getMouth()].map($c),r=n[0],o=n[1],a=n[2],i=function(t){return a.sub(t).magnitude()},u=(i(r)+i(o))/2,s=Math.floor(u/.45),c=$c(n),l=Math.floor(Math.max(0,c.x-.5*s)),f=Math.floor(Math.max(0,c.y-.43*s));return new Uc(l,f,s,s)},t}();function el(t,e){return Uo(function(){return hr(Fe(t,e.weights),e.bias)})}function nl(t,e){return Hc(t,e,"valid",!0)}function rl(t,e){return void 0===e&&(e=[2,2]),Ge(t,[2,2],e,"valid")}function ol(t,e,n,r,o){void 0===o&&(o="same");var a=e.conv,i=a.filters,u=a.bias,s=Ne(t,i,n,o);return s=function(t,e){return hr(Sr(t,e.weights),e.biases)}(s=hr(s,u),e.scale),r?Jn(s):s}function al(t,e){return ol(t,e,[1,1],!1)}function il(t,e){return ol(t,e,[2,2],!0,"valid")}function ul(t){function e(e,n,r){var o;return{conv:{filters:function(e,n,r){var o=t(e),a=o.length/(n*r*r);if(Ec(a))throw new Error("depth has to be an integer: "+a+", weights.length: "+o.length+", numFilters: "+n+", filterSize: "+r);return qe(io(o,[n,a,r,r]),[2,3,1,0])}(e,n,r),bias:ro(t(n))},scale:{weights:ro(t(o=n)),biases:ro(t(o))}}}return{extractConvLayerParams:e,extractResidualLayerParams:function(t,n,r,o){return void 0===o&&(o=!1),{conv1:e((o?.5:1)*t,n,r),conv2:e(t,n,r)}}}}function sl(t,e){var n=function(t,e){return ol(t,e,[1,1],!0)}(t,e.conv1);return n=al(n,e.conv2),n=hr(n,t),n=Jn(n)}function cl(t,e){var n=il(t,e.conv1);n=al(n,e.conv2);var r=Ve(t,2,2,"valid"),o=Fr(r.shape),a=r.shape[3]!==n.shape[3];if(r.shape[1]!==n.shape[1]||r.shape[2]!==n.shape[2]){var i=n.shape.slice();i[1]=1;var u=Fr(i),s=(n=_e([n,u],1)).shape.slice();s[2]=1;var c=Fr(s);n=_e([n,c],2)}return r=a?_e([r,o],3):r,n=hr(r,n),n=Jn(n)}t.euclideanDistance=function(t,e){if(t.length!==e.length)throw new Error("euclideanDistance: arr1.length !== arr2.length");var n=Array.from(t),r=Array.from(e);return Math.sqrt(n.map(function(t,e){return t-r[e]}).reduce(function(t,e){return t+Math.pow(e,2)},0))},t.faceDetectionNet=function(t){var e=function(t){var e=Bc(t),n=e.extractWeights,r=e.getRemainingWeights,o=Fc(n),a=o.extractMobilenetV1Params,i=o.extractPredictionLayerParams,u=a(),s=i(),c={extra_dim:ao(n(20472),[1,5118,4])};if(0!==r().length)throw new Error("weights remaing after extract: "+r().length);return{mobilenetv1_params:u,prediction_layer_params:s,output_layer_params:c}}(t);function n(t){return Uo(function(){var n,r=Gc((n=t,Uo(function(){var t=Co.resizeBilinear(n,Kc,!1);return Tr(Sr(t,Qc),Yc)})),e.mobilenetv1_params),o=function(t,e,n){return Uo(function(){var r=Wc(Wc(t,n.conv_0_params,[1,1]),n.conv_1_params,[2,2]),o=Wc(Wc(r,n.conv_2_params,[1,1]),n.conv_3_params,[2,2]),a=Wc(Wc(o,n.conv_4_params,[1,1]),n.conv_5_params,[2,2]),i=Wc(Wc(a,n.conv_6_params,[1,1]),n.conv_7_params,[2,2]),u=Xc(e,n.box_predictor_0_params),s=Xc(t,n.box_predictor_1_params),c=Xc(r,n.box_predictor_2_params),l=Xc(o,n.box_predictor_3_params),f=Xc(a,n.box_predictor_4_params),h=Xc(i,n.box_predictor_5_params);return{boxPredictions:_e([u.boxPredictionEncoding,s.boxPredictionEncoding,c.boxPredictionEncoding,l.boxPredictionEncoding,f.boxPredictionEncoding,h.boxPredictionEncoding],1),classPredictions:_e([u.classPrediction,s.classPrediction,c.classPrediction,l.classPrediction,f.classPrediction,h.classPrediction],1)}})}(r.out,r.conv11,e.prediction_layer_params);return function(t,e,n){return Uo(function(){var r=t.shape[0],o=jc(Hr(Kr(n.extra_dim,[r,1,1]),[-1,4]),Hr(t,[-1,4]));o=Hr(o,[r,o.shape[0]/r,4]);var a=er(Ye(e,[0,0,1],[-1,-1,-1])),i=Ye(a,[0,0,0],[-1,-1,1]);return i=Hr(i,[r,i.shape[1]]),{boxes:lo(o),scores:lo(i)}})}(o.boxPredictions,o.classPredictions,e.output_layer_params)})}return{forward:function(t){return Uo(function(){return n(Pc(Lc(t)))})},locateFaces:function(t,e,r){return void 0===e&&(e=.8),void 0===r&&(r=100),xc(this,void 0,void 0,function(){var o,a,i,u,s,c,l,f,h,p,d,v,g,m;return wc(this,function(y){switch(y.label){case 0:for(o=1,a=1,u=Uo(function(){var e=Lc(t),r=e.shape.slice(1),u=r[0],s=r[1];return i={width:s,height:u},e=Pc(e),o=e.shape[1]/u,a=e.shape[2]/s,n(e)}),s=u.boxes,c=u.scores,l=s[0],f=c[0],h=1;ho}).sort(function(t,e){return e.score-t.score}).forEach(function(e){if(!(u.length>=i)){for(var n=e.score,a=u.length-1;a>=0;--a){var s=qc(t,e.boxIndex,u[a]);if(0!==s&&(e.score*=s<=r?1:0,e.score<=o))break}n===e.score&&u.push(e.boxIndex)}}),u}(l,p,r,.5,e),m=g.map(function(t){var e=[Math.max(0,l.get(t,0)),Math.min(1,l.get(t,2))].map(function(t){return t*o}),n=e[0],r=e[1],u=[Math.max(0,l.get(t,1)),Math.min(1,l.get(t,3))].map(function(t){return t*a}),s=u[0],c=u[1];return new zc(p[t],new Uc(s,n,c-s,r-n),i)}),l.dispose(),f.dispose(),[2,m]}})})}}},t.faceLandmarkNet=function(t){var e=Zc(t);return{detectLandmarks:function(t){return xc(this,void 0,void 0,function(){var n,r,o,a,i,u,s;return wc(this,function(c){switch(c.label){case 0:return r=Uo(function(){var r=Lc(t),o=r.shape.slice(1),a=o[0],i=o[1];n={width:i,height:a},128===r.shape[1]&&128===r.shape[2]||(r=Co.resizeBilinear(r,[128,128]));var u=nl(r,e.conv0_params);return u=nl(u=rl(u=nl(u=nl(u=rl(u=nl(u=nl(u=rl(u=nl(u=nl(u=rl(u),e.conv1_params),e.conv2_params)),e.conv3_params),e.conv4_params)),e.conv5_params),e.conv6_params),[1,1]),e.conv7_params),el(Jn(el(u.as2D(u.shape[0],-1),e.fc0_params)),e.fc1_params)}),i=(a=Array).from,[4,r.data()];case 1:return o=i.apply(a,[c.sent()]),r.dispose(),u=o.filter(function(t,e){return(e-1)%2}),s=o.filter(function(t,e){return e%2}),[2,new tl(Array(68).fill(0).map(function(t,e){return new Jc(u[e],s[e])}),n)]}})})}}},t.faceRecognitionNet=function(t){var e=this,n=function(t){var e=Bc(t),n=e.extractWeights,r=e.getRemainingWeights,o=ul(n),a=o.extractConvLayerParams,i=o.extractResidualLayerParams,u=a(4704,32,7),s=i(9216,32,3),c=i(9216,32,3),l=i(9216,32,3),f=i(36864,64,3,!0),h=i(36864,64,3),p=i(36864,64,3),d=i(36864,64,3),v=i(147456,128,3,!0),g=i(147456,128,3),m=i(147456,128,3),y=i(589824,256,3,!0),b=i(589824,256,3),x=i(589824,256,3),w=i(589824,256,3),E=qe(oo(n(32768),[128,256]),[1,0]);if(0!==r().length)throw new Error("weights remaing after extract: "+r().length);return{conv32_down:u,conv32_1:s,conv32_2:c,conv32_3:l,conv64_down:f,conv64_1:h,conv64_2:p,conv64_3:d,conv128_down:v,conv128_1:g,conv128_2:m,conv256_down:y,conv256_1:b,conv256_2:x,conv256_down_out:w,fc:E}}(t);function r(t){return Uo(function(){var e=Pc(Lc(t),!0);150===e.shape[1]&&150===e.shape[2]||(e=Co.resizeBilinear(e,[150,150]));var r=il(e=function(t){return Uo(function(){var e=to([1,150,150,1],122.782),n=to([1,150,150,1],117.001),r=to([1,150,150,1],104.298),o=_e([e,n,r],3);return vr(Tr(t,o),no(256))})}(e),n.conv32_down),o=(r=cl(r=sl(r=sl(r=cl(r=sl(r=sl(r=cl(r=sl(r=sl(r=sl(r=cl(r=sl(r=sl(r=sl(r=Ge(r,3,2,"valid"),n.conv32_1),n.conv32_2),n.conv32_3),n.conv64_down),n.conv64_1),n.conv64_2),n.conv64_3),n.conv128_down),n.conv128_1),n.conv128_2),n.conv256_down),n.conv256_1),n.conv256_2),n.conv256_down_out)).mean([1,2]);return Fe(o,n.fc)})}return{computeFaceDescriptor:function(t){return xc(e,void 0,void 0,function(){var e,n;return wc(this,function(o){switch(o.label){case 0:return[4,(e=r(t)).data()];case 1:return n=o.sent(),e.dispose(),[2,n]}})})},computeFaceDescriptorSync:function(t){var e=r(t),n=e.dataSync();return e.dispose(),n},forward:r}},t.NetInput=Nc,t.tf=bc,t.padToSquare=Pc,t.extractFaces=function(t,e){var n=Cc(t);return e.map(function(e){return e instanceof zc?e.forSize(t.width,t.height).getBox().floor():e}).map(function(t){var e=t.x,r=t.y,o=t.width,a=t.height,i=Tc({width:o,height:a});return Cc(i).putImageData(n.getImageData(e,r,o,a),0,0),i})},t.extractFaceTensors=function(t,e){return Uo(function(){var n=Lc(t),r=n.shape,o=(r[0],r[1]),a=r[2],i=r[3];return e.map(function(t){return t instanceof zc?t.forSize(a,o).getBox().floor():t}).map(function(t){var e=t.x,r=t.y,o=t.width,a=t.height;return Ye(n,[0,r,e,0],[1,a,o,i])})})},t.isFloat=Ec,t.isEven=Sc,t.round=Rc,t.getElement=kc,t.getContext2dOrThrow=Cc,t.createCanvas=Tc,t.createCanvasFromMedia=_c,t.getMediaDimensions=Ac,t.bufferToImage=function(t){return new Promise(function(e,n){if(!(t instanceof Blob))return n("bufferToImage - expected buf to be of type: Blob");var r=new FileReader;r.onload=function(){var t=new Image;t.onload=function(){return e(t)},t.onerror=n,t.src=r.result},r.onerror=n,r.readAsDataURL(t)})},t.imageTensorToCanvas=function(t,e){return xc(this,void 0,void 0,function(){var n,r,o,a,i;return wc(this,function(u){switch(u.label){case 0:return n=e||document.createElement("canvas"),(r=t.shape)[0],o=r[1],a=r[2],i=r[3],[4,Lr(t.as3D(o,a,i).toInt(),n)];case 1:return u.sent(),[2,n]}})})},t.getDefaultDrawOptions=Dc,t.drawBox=Ic,t.drawText=Mc,t.drawDetection=function(t,e,n){var r=kc(t);if(!(r instanceof HTMLCanvasElement))throw new Error("drawBox - expected canvas to be of type: HTMLCanvasElement");(Array.isArray(e)?e:[e]).forEach(function(t){var e=t.getBox(),o=e.x,a=e.y,i=e.width,u=e.height,s=Object.assign({color:"blue",lineWidth:2,fontSize:20,fontStyle:"Georgia"},n||{}),c=Object.assign({withScore:!0},n||{}).withScore,l=Cc(r);Ic(l,o,a,i,u,s),c&&Mc(l,o,a,""+Rc(t.getScore()),s)})},t.drawLandmarks=function(t,e,n){var r=kc(t);if(!(r instanceof HTMLCanvasElement))throw new Error("drawLandmarks - expected canvas to be of type: HTMLCanvasElement");var o=Object.assign({color:"blue",lineWidth:2,fontSize:20,fontStyle:"Georgia"},n||{}),a=Object.assign({drawLines:!1},n||{}).drawLines,i=Cc(r),u=o.lineWidth,s=o.color;if(a)return i.strokeStyle=s,i.lineWidth=u,Oc(i,e.getJawOutline()),Oc(i,e.getLeftEyeBrow()),Oc(i,e.getRightEyeBrow()),Oc(i,e.getNose()),Oc(i,e.getLeftEye(),!0),Oc(i,e.getRightEye(),!0),void Oc(i,e.getMouth(),!0);var c=u/2;i.fillStyle=s,e.getPositions().forEach(function(t){return i.fillRect(t.x-c,t.y-c,u,u)})},Object.defineProperty(t,"__esModule",{value:!0})}); +!function(t,n){"object"==typeof exports&&"undefined"!=typeof module?n(exports):"function"==typeof define&&define.amd?define(["exports"],n):n(t.faceapi=t.faceapi||{})}(this,function(t){"use strict";var n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,n){t.__proto__=n}||function(t,n){for(var e in n)n.hasOwnProperty(e)&&(t[e]=n[e])};function e(t,e){function r(){this.constructor=t}n(t,e),t.prototype=null===e?Object.create(e):(r.prototype=e.prototype,new r)}function r(t,n,e,r){var o,i=arguments.length,a=i<3?n:null===r?r=Object.getOwnPropertyDescriptor(n,e):r;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)a=Reflect.decorate(t,n,e,r);else for(var u=t.length-1;u>=0;u--)(o=t[u])&&(a=(i<3?o(a):i>3?o(n,e,a):o(n,e))||a);return i>3&&a&&Object.defineProperty(n,e,a),a}function o(t,n,e,r){return new(e||(e=Promise))(function(o,i){function a(t){try{s(r.next(t))}catch(t){i(t)}}function u(t){try{s(r.throw(t))}catch(t){i(t)}}function s(t){t.done?o(t.value):new e(function(n){n(t.value)}).then(a,u)}s((r=r.apply(t,n||[])).next())})}function i(t,n){var e,r,o,i,a={label:0,sent:function(){if(1&o[0])throw o[1];return o[1]},trys:[],ops:[]};return i={next:u(0),throw:u(1),return:u(2)},"function"==typeof Symbol&&(i[Symbol.iterator]=function(){return this}),i;function u(i){return function(u){return function(i){if(e)throw new TypeError("Generator is already executing.");for(;a;)try{if(e=1,r&&(o=2&i[0]?r.return:i[0]?r.throw||((o=r.return)&&o.call(r),0):r.next)&&!(o=o.call(r,i[1])).done)return o;switch(r=0,o&&(i=[2&i[0],o.value]),i[0]){case 0:case 1:o=i;break;case 4:return a.label++,{value:i[1],done:!1};case 5:a.label++,r=i[1],i=[0];continue;case 7:i=a.ops.pop(),a.trys.pop();continue;default:if(!(o=(o=a.trys).length>0&&o[o.length-1])&&(6===i[0]||2===i[0])){a=0;continue}if(3===i[0]&&(!o||i[1]>o[0]&&i[1]0;)r=Math.random()*n|0,e=t[--n],t[n]=t[r],t[r]=e}function c(t,n,e){return Math.max(t,Math.min(n,e))}function f(t,n){return Math.random()*(n-t)+t}function h(t,n){if(!t)throw new Error(n)}function p(t,n,e){void 0===e&&(e=""),h(y(t,n),e+" Shapes "+t+" and "+n+" must match")}function d(t,n){h(t.dtype===n.dtype," The dtypes of the first("+t.dtype+") and second("+n.dtype+") input must match")}function v(t,n){if(void 0===n&&(n=[]),Array.isArray(t))for(var e=0;e1;--n)if(t%n==0)return[n,t/n];return[1,t]}function E(t,n){return n<=t.length?t:t+" ".repeat(n-t.length)}function S(t,n,e){return void 0===n&&(n=function(t){return 0}),new Promise(function(r,o){var i=0,a=function(){if(t())r();else{var u=n(++i);null!=e&&i>=e?o():setTimeout(a,u)}};a()})}function R(t){var n={};return t.replace(/[?&]([^=?&]+)(?:=([^&]*))?/g,function(t){for(var e=[],r=1;r0)e*=t[o];else if(-1===t[o]){if(-1!==r)throw Error("Shapes can only have 1 implicit size. Found - 1 at dim "+r+" and dim "+o);r=o}else if(t[o]<=0)throw Error("Shapes can not be <= 0. Found "+t[o]+" at dim "+o);if(-1===r){if(n>0&&n!==e)throw Error("Size("+n+") must match the product of shape "+t);return t}if(n%e!=0)throw Error("The implicit shape can't be a fractional number. Got "+n+" / "+e);var i=t.slice();return i[r]=n/e,i}function _(t,n){for(var e=[],r=[],o=0,i=0;i1)throw new Error("Can't squeeze axis "+i+" since its dim '"+t[i]+"' is not 1");(null==n[o]||n[o]>i)&&1===t[i]&&(e.push(t[i]),r.push(i)),n[o]<=i&&o++}t[i]>1&&(e.push(t[i]),r.push(i))}return{newShape:e,keptDims:r}}function k(t,n){var e=null;if(null==t||"float32"===t)e=new Float32Array(n);else if("int32"===t)e=new Int32Array(n);else{if("bool"!==t)throw new Error("Unknown data type "+t);e=new Uint8Array(n)}return e}function T(t,n){for(var e=0;e1)for(var i=0;iP){var s=Array.from(n.subarray(0,U)),l=Array.from(n.subarray(a-U,a));return["["+s.map(function(t,n){return V(t,o[n])}).join(", ")+", ..., "+l.map(function(t,n){return V(t,o[a-U+n])}).join(", ")+"]"]}return["["+Array.from(n).map(function(t,n){return V(t,o[n])}).join(", ")+"]"]}var c=e.slice(1),f=r.slice(1),h=r[0],p=[];if(a>P){for(var d=0;d=-e&&t=1,"Pass at least one tensor to concat"),s({tensors:t},"concat");var e=t[0];if(1===t.length)return e;for(var r=j(n,e.shape),o=1;o=0&&e>>0,n=(r*=n)>>>0,n+=4294967296*(r-=n)}return 2.3283064365386963e-10*(n>>>0)});e.next=function(){var t=2091639*e.s0+2.3283064365386963e-10*e.c;return e.s0=e.s1,e.s1=e.s2,e.s2=t-(e.c=0|t)},e.c=1,e.s0=r(" "),e.s1=r(" "),e.s2=r(" "),e.s0-=r(t),e.s0<0&&(e.s0+=1),e.s1-=r(t),e.s1<0&&(e.s1+=1),e.s2-=r(t),e.s2<0&&(e.s2+=1),r=null}(t),o=n&&n.state,i=e.next;return i.int32=function(){return 4294967296*e.next()|0},i.double=function(){return i()+1.1102230246251565e-16*(2097152*i()|0)},i.quick=i,o&&("object"==typeof o&&r(o,e),i.state=function(){return r(e,{})}),i}n&&n.exports?n.exports=o:this.alea=o}(0,t)}),rt=nt(function(t){!function(t,n,e){function r(t,n){return n.x=t.x,n.y=t.y,n.z=t.z,n.w=t.w,n}function o(t,n){var e=new function(t){var n=this,e="";n.x=0,n.y=0,n.z=0,n.w=0,n.next=function(){var t=n.x^n.x<<11;return n.x=n.y,n.y=n.z,n.z=n.w,n.w^=n.w>>>19^t^t>>>8},t===(0|t)?n.x=t:e+=t;for(var r=0;r>>0)/4294967296};return i.double=function(){do{var t=((e.next()>>>11)+(e.next()>>>0)/4294967296)/(1<<21)}while(0===t);return t},i.int32=e.next,i.quick=i,o&&("object"==typeof o&&r(o,e),i.state=function(){return r(e,{})}),i}n&&n.exports?n.exports=o:this.xor128=o}(0,t)}),ot=nt(function(t){!function(t,n,e){function r(t,n){return n.x=t.x,n.y=t.y,n.z=t.z,n.w=t.w,n.v=t.v,n.d=t.d,n}function o(t,n){var e=new function(t){var n=this,e="";n.next=function(){var t=n.x^n.x>>>2;return n.x=n.y,n.y=n.z,n.z=n.w,n.w=n.v,(n.d=n.d+362437|0)+(n.v=n.v^n.v<<4^t^t<<1)|0},n.x=0,n.y=0,n.z=0,n.w=0,n.v=0,t===(0|t)?n.x=t:e+=t;for(var r=0;r>>4),n.next()}(t),o=n&&n.state,i=function(){return(e.next()>>>0)/4294967296};return i.double=function(){do{var t=((e.next()>>>11)+(e.next()>>>0)/4294967296)/(1<<21)}while(0===t);return t},i.int32=e.next,i.quick=i,o&&("object"==typeof o&&r(o,e),i.state=function(){return r(e,{})}),i}n&&n.exports?n.exports=o:this.xorwow=o}(0,t)}),it=nt(function(t){!function(t,n,e){function r(t,n){return n.x=t.x.slice(),n.i=t.i,n}function o(t,n){null==t&&(t=+new Date);var e=new function(t){var n=this;n.next=function(){var t,e,r=n.x,o=n.i;return t=r[o],e=(t^=t>>>7)^t<<24,e^=(t=r[o+1&7])^t>>>10,e^=(t=r[o+3&7])^t>>>3,e^=(t=r[o+4&7])^t<<7,t=r[o+7&7],e^=(t^=t<<13)^t<<9,r[o]=e,n.i=o+1&7,e},function(t,n){var e,r=[];if(n===(0|n))r[0]=n;else for(n=""+n,e=0;e0;--e)t.next()}(n,t)}(t),o=n&&n.state,i=function(){return(e.next()>>>0)/4294967296};return i.double=function(){do{var t=((e.next()>>>11)+(e.next()>>>0)/4294967296)/(1<<21)}while(0===t);return t},i.int32=e.next,i.quick=i,o&&(o.x&&r(o,e),i.state=function(){return r(e,{})}),i}n&&n.exports?n.exports=o:this.xorshift7=o}(0,t)}),at=nt(function(t){!function(t,n,e){function r(t,n){return n.i=t.i,n.w=t.w,n.X=t.X.slice(),n}function o(t,n){null==t&&(t=+new Date);var e=new function(t){var n=this;n.next=function(){var t,e,r=n.w,o=n.X,i=n.i;return n.w=r=r+1640531527|0,e=o[i+34&127],t=o[i=i+1&127],e^=e<<13,t^=t<<17,e^=e>>>15,t^=t>>>12,e=o[i]=e^t,n.i=i,e+(r^r>>>16)|0},function(t,n){var e,r,o,i,a,u=[],s=128;for(n===(0|n)?(r=n,n=null):(n+="\0",r=0,s=Math.max(s,n.length)),o=0,i=-32;i>>15,r^=r<<4,r^=r>>>13,i>=0&&(a=a+1640531527|0,o=0==(e=u[127&i]^=r+a)?o+1:0);for(o>=128&&(u[127&(n&&n.length||0)]=-1),o=127,i=512;i>0;--i)r=u[o+34&127],e=u[o=o+1&127],r^=r<<13,e^=e<<17,r^=r>>>15,e^=e>>>12,u[o]=r^e;t.w=a,t.X=u,t.i=o}(n,t)}(t),o=n&&n.state,i=function(){return(e.next()>>>0)/4294967296};return i.double=function(){do{var t=((e.next()>>>11)+(e.next()>>>0)/4294967296)/(1<<21)}while(0===t);return t},i.int32=e.next,i.quick=i,o&&(o.X&&r(o,e),i.state=function(){return r(e,{})}),i}n&&n.exports?n.exports=o:this.xor4096=o}(0,t)}),ut=nt(function(t){!function(t,n,e){function r(t,n){return n.a=t.a,n.b=t.b,n.c=t.c,n.d=t.d,n}function o(t,n){var e=new function(t){var n=this,e="";n.next=function(){var t=n.b,e=n.c,r=n.d,o=n.a;return t=t<<25^t>>>7^e,e=e-r|0,r=r<<24^r>>>8^o,o=o-t|0,n.b=t=t<<20^t>>>12^e,n.c=e=e-r|0,n.d=r<<16^e>>>16^o,n.a=o-t|0},n.a=0,n.b=0,n.c=-1640531527,n.d=1367130551,t===Math.floor(t)?(n.a=t/4294967296|0,n.b=0|t):e+=t;for(var r=0;r>>0)/4294967296};return i.double=function(){do{var t=((e.next()>>>11)+(e.next()>>>0)/4294967296)/(1<<21)}while(0===t);return t},i.int32=e.next,i.quick=i,o&&("object"==typeof o&&r(o,e),i.state=function(){return r(e,{})}),i}n&&n.exports?n.exports=o:this.tychei=o}(0,t)}),st=nt(function(t){!function(n,e){var r,o=this,i=256,a=6,u="random",s=e.pow(i,a),l=e.pow(2,52),c=2*l,f=i-1;function h(t,h,m){var g=[],y=d(function t(n,e){var r,o=[],i=typeof n;if(e&&"object"==i)for(r in n)try{o.push(t(n[r],e-1))}catch(t){}return o.length?o:"string"==i?n:n+"\0"}((h=1==h?{entropy:!0}:h||{}).entropy?[t,v(n)]:null==t?function(){try{var t;return r&&(t=r.randomBytes)?t=t(i):(t=new Uint8Array(i),(o.crypto||o.msCrypto).getRandomValues(t)),v(t)}catch(t){var e=o.navigator,a=e&&e.plugins;return[+new Date,o,a,o.screen,v(n)]}}():t,3),g),x=new function(t){var n,e=t.length,r=this,o=0,a=r.i=r.j=0,u=r.S=[];for(e||(t=[e++]);o=c;)t/=2,n/=2,e>>>=1;return(t+e)/n};return w.int32=function(){return 0|x.g(4)},w.quick=function(){return x.g(4)/4294967296},w.double=w,d(v(x.S),n),(h.pass||m||function(t,n,r,o){return o&&(o.S&&p(o,x),t.state=function(){return p(x,{})}),r?(e[u]=t,n):t})(w,y,"global"in h?h.global:this==e,h.state)}function p(t,n){return n.i=t.i,n.j=t.j,n.S=t.S.slice(),n}function d(t,n){for(var e,r=t+"",o=0;o=1||0===a);var u=Math.sqrt(-2*Math.log(a)/a);n=this.mean+this.stdDev*o*u,e=this.mean+this.stdDev*i*u,this.truncated&&!this.isValidTruncated(n)||(r=!0)}return this.truncated&&!this.isValidTruncated(e)||(this.nextVal=this.convertValue(e)),this.convertValue(n)},t.prototype.convertValue=function(t){return null==this.dtype||"float32"===this.dtype?t:Math.round(t)},t.prototype.isValidTruncated=function(t){return t<=this.upper&&t>=this.lower},t}();(dt=lt||(lt={})).float32="float32",dt.int32="int32",dt.bool="bool",function(t){t.R0="R0",t.R1="R1",t.R2="R2",t.R3="R3",t.R4="R4",t.R5="R5",t.R6="R6"}(ct||(ct={})),function(t){t.float32="float32",t.int32="int32",t.bool="int32"}(ft||(ft={})),function(t){t.float32="float32",t.int32="int32",t.bool="bool"}(ht||(ht={})),function(t){t.float32="float32",t.int32="float32",t.bool="float32"}(pt||(pt={}));var gt={float32:pt,int32:ft,bool:ht};function yt(t,n){return gt[t][n]}function xt(t){return yt(t,"int32")}function wt(t,n){for(var e=t.length,r=[],o=0;o1&&1===a&&r.unshift(i)}return r}function bt(t,n){for(var e=[],r=0;r1)&&e.unshift(i)}return e}function Et(t,n){for(var e=[],r="Operands could not be broadcast together with shapes "+t+" and "+n+".",o=Math.max(t.length,n.length),i=0;i1&&u>1&&a!==u)throw Error(r);e.unshift(Math.max(a,u))}return e}var St=function(){function t(){}return t.add=function(t,n){s({a:t,b:n},"add"),d(t,n);var e=Et(t.shape,n.shape);return Xo.engine.runKernel(function(e){return e.add(t,n)},{a:t,b:n},function(r){return{a:function(){var n=r,o=bt(t.shape,e);return o.length>0&&(n=n.sum(o)),n.reshape(t.shape)},b:function(){var t=r,o=bt(n.shape,e);return o.length>0&&(t=t.sum(o)),t.reshape(n.shape)}}})},t.addStrict=function(t,n){return p(t.shape,n.shape,"Error in addStrict: "),t.add(n)},t.sub=function(t,n){s({a:t,b:n},"sub"),d(t,n);var e=Et(t.shape,n.shape);return Xo.engine.runKernel(function(e){return e.subtract(t,n)},{a:t,b:n},function(r){return{a:function(){var n=r,o=bt(t.shape,e);return o.length>0&&(n=n.sum(o)),n.reshape(t.shape)},b:function(){var t=r,o=bt(n.shape,e);return o.length>0&&(t=t.sum(o)),t.neg().reshape(n.shape)}}})},t.subStrict=function(t,n){return p(t.shape,n.shape,"Error in subStrict: "),t.sub(n)},t.pow=function(t,n){s({base:t,exp:n},"pow");var e=Et(t.shape,n.shape);return t=t.cast(yt(t.dtype,n.dtype)),n=n.cast(yt(t.dtype,n.dtype)),Xo.engine.runKernel(function(e,r){return r(e.pow(t,n))},{base:t,exp:n},function(r,o){var i=o[0];return{base:function(){var o=r.mul(n.toFloat().mul(i.div(t))),a=bt(t.shape,e);return a.length>0&&(o=o.sum(a)),o.reshape(t.shape)},exp:function(){var o=r.mul(i.mul(t.log()).toFloat()),a=bt(n.shape,e);return a.length>0&&(o=o.sum(a)),o.reshape(n.shape)}}})},t.powStrict=function(t,n){return p(t.shape,n.shape,"Error in powStrict: "),t.pow(n)},t.mul=function(t,n){s({a:t,b:n},"mul"),d(t,n);var e=Et(t.shape,n.shape);return Xo.engine.runKernel(function(e){return e.multiply(t,n)},{a:t,b:n},function(r){return{a:function(){var o=r.mul(n.toFloat()),i=bt(t.shape,e);return i.length>0?o.sum(i).reshape(t.shape):o},b:function(){var o=r.mul(t.toFloat()),i=bt(n.shape,e);return i.length>0?o.sum(i).reshape(n.shape):o}}})},t.mulStrict=function(t,n){return p(t.shape,n.shape,"Error in multiplyStrict: "),t.mul(n)},t.div=function(n,e){var r;if(s({a:n,b:e},"div"),d(n,e),"int32"===n.dtype&&"int32"===e.dtype)return t.floorDiv(n,e);r=function(t){return t.realDivide(n,e)};var o=Et(n.shape,e.shape);return Xo.engine.runKernel(r,{a:n,b:e},function(t){return{a:function(){var r=t.div(e.toFloat()),i=bt(n.shape,o);return i.length>0?r.sum(i).reshape(n.shape):r},b:function(){var r=t.mul(n.toFloat()),i=bt(e.shape,o);i.length>0&&(r=r.sum(i).reshape(e.shape));var a=e.square();return r.div(a.toFloat()).neg()}}})},t.floorDiv=function(t,n){s({a:t,b:n},"floorDiv"),d(t,n);var e=Et(t.shape,n.shape);return Xo.engine.runKernel(function(e){return e.floorDiv(t,n)},{a:t,b:n},function(r){return{a:function(){var o=r.div(n.toFloat()),i=bt(t.shape,e);return i.length>0?o.sum(i).reshape(t.shape):o},b:function(){var o=r.mul(t.toFloat()),i=bt(n.shape,e);i.length>0&&(o=o.sum(i).reshape(n.shape));var a=n.square();return o.div(a.toFloat()).neg()}}})},t.divStrict=function(t,n){return p(t.shape,n.shape,"Error in divideStrict: "),t.div(n)},t.mod=function(t,n){s({a:t,b:n},"mod"),d(t,n);var e=Et(t.shape,n.shape);return Xo.engine.runKernel(function(e){return e.mod(t,n)},{a:t,b:n},function(r){return{a:function(){var n=bt(t.shape,e);return n.length>0?r.sum(n).reshape(t.shape):r},b:function(){var o=r.mul(t.div(n).floor().neg()),i=bt(n.shape,e);return i.length>0?o.sum(i).reshape(n.shape):o}}})},t.modStrict=function(t,n){return p(t.shape,n.shape,"Error in modStrict: "),t.mod(n)},t.minimum=function(t,n){return s({a:t,b:n},"minimum"),d(t,n),"bool"===t.dtype&&(t=t.toInt()),"bool"===n.dtype&&(n=n.toInt()),Et(t.shape,n.shape),Xo.engine.runKernel(function(e){return e.minimum(t,n)},{a:t,b:n},function(e){return{a:function(){return e.mul(t.lessEqual(n).toFloat())},b:function(){return e.mul(t.greater(n).toFloat())}}})},t.minimumStrict=function(t,n){return p(t.shape,n.shape,"Error in minimumStrict: "),t.minimum(n)},t.maximum=function(t,n){return s({a:t,b:n},"maximum"),d(t,n),"bool"===t.dtype&&(t=t.toInt()),"bool"===n.dtype&&(n=n.toInt()),Et(t.shape,n.shape),Xo.engine.runKernel(function(e){return e.maximum(t,n)},{a:t,b:n},function(e){return{a:function(){return e.mul(t.greaterEqual(n).toFloat())},b:function(){return e.mul(t.less(n).toFloat())}}})},t.maximumStrict=function(t,n){return p(t.shape,n.shape,"Error in minimumStrict: "),t.maximum(n)},t.squaredDifference=function(t,n){return s({a:t,b:n},"squaredDifference"),d(t,n),Et(t.shape,n.shape),Xo.engine.runKernel(function(e){return e.squaredDifference(t,n)},{a:t,b:n},function(e){var r=qr(2);return{a:function(){return e.mul(t.sub(n).mul(r))},b:function(){return e.mul(n.sub(t).mul(r))}}})},t.squaredDifferenceStrict=function(t,n){return p(t.shape,n.shape,"Error in squaredDifferenceStrict: "),t.squaredDifference(n)},t.atan2=function(n,e){s({a:n,b:e},"atan2"),d(n,e);var r=Et(n.shape,e.shape);return Xo.engine.runKernel(function(t){return t.atan2(n,e)},{a:n,b:e},function(o){return{a:function(){var i=t.add(Xe(n),Xe(e)),a=o.mul(e.div(i)),u=bt(n.shape,r);return u.length>0&&(a=a.sum(u)),a.reshape(n.shape)},b:function(){var i=t.add(Xe(n),Xe(e)),a=Fe(o.mul(n.div(i))),u=bt(e.shape,r);return u.length>0&&(a=a.sum(u)),a.reshape(e.shape)}}})},r([function(){for(var t=[],n=0;n2)throw new Error("Rank of probabilities must be 1 or 2, but is "+i);e=e||Math.random();var a=1===i?t.as2D(1,-1):t,u=Xo.engine.runKernel(function(t){return t.multinomial(a,r,n,e)},{logits2D:a});return 1===i?u.as1D():u},t.oneHot=function(t,n,e,r){if(void 0===e&&(e=1),void 0===r&&(r=0),h("int32"===t.dtype,"Indices must be of dtype `int32`"),n<2)throw new Error("Error in oneHot: depth must be >=2, but it is "+n);return Xo.engine.runKernel(function(o){return o.oneHot(t,n,e,r)},{indices:t})},t.fromPixels=function(t,n){if(void 0===n&&(n=3),n>4)throw new Error("Cannot construct Tensor with more than 4 channels from pixels.");return Xo.engine.fromPixels(t,n)},t.toPixels=function(t,n){return o(this,void 0,void 0,function(){var e,r,o,a,u,l,c,f,h,p,d,v,m,g,y,x,w,b,E;return i(this,function(i){switch(i.label){case 0:if(s({img:t},"toPixels"),2!==t.rank&&3!==t.rank)throw new Error("toPixels only supports rank 2 or 3 tensors, got rank "+t.rank+".");if(e=t.shape.slice(0,2),r=e[0],o=e[1],(a=2===t.rank?1:t.shape[2])>4||2===a)throw new Error("toPixels only supports depth of size 1, 3 or 4 but got "+a);return u=t.min(),l=t.max(),[4,u.data()];case 1:return c=i.sent()[0],[4,l.data()];case 2:if(f=i.sent()[0],u.dispose(),l.dispose(),"float32"===t.dtype){if(c<0||f>1)throw new Error("Tensor values for a float32 Tensor must be in the range [0 - 1] but got range ["+c+" - "+f+"].")}else{if("int32"!==t.dtype)throw new Error("Unsupported type for toPixels: "+t.dtype+". Please use float32 or int32 tensors.");if(c<0||f>255)throw new Error("Tensor values for a int32 Tensor must be in the range [0 - 255] but got range ["+c+" - "+f+"].")}return[4,t.data()];case 3:for(h=i.sent(),p="float32"===t.dtype?255:1,d=new Uint8ClampedArray(o*r*4),v=0;v=1,"Pass at least one tensor to tf.stack"),1===t.length)return t[0].expandDims(n);var e=t[0].rank,r=t[0].shape,o=t[0].dtype;h(n<=e,"Axis must be <= rank of the tensor"),t.forEach(function(t){p(r,t.shape,"All tensors passed to stack must have matching shapes")}),t.forEach(function(t){h(o===t.dtype,"All tensors passed to stack must have matching dtypes")});var i=t.map(function(t){return t.expandDims(n)});return $.concat(i,n)},t.unstack=function(t,n){void 0===n&&(n=0);for(var e,r=t.shape[n],o=Array(t.rank-1).fill(0),i=0,a=0;a1)return t.zeros([0],o);var i=Tt(Math.abs(Math.ceil((e-n)/r)),o);e0,"Gram-Schmidt process: input must not be null, undefined, or empty");for(var e=t[0].shape[0],r=1;r0)for(var e=0;e0?o>=u[n]:o<=u[n]);o+=r[n])e+=1;return e}),[a,l]}function en(t,n,e,r,o){var i=n[o];t&1<0?Number.MIN_SAFE_INTEGER:Number.MAX_SAFE_INTEGER);var a=r[o];return i<0&&(i+=a),c(0,i,a-1)}function rn(t,n,e,r,o){var i=n[o];t&1<0?Number.MAX_SAFE_INTEGER:Number.MIN_SAFE_INTEGER);var a=r[o];return i<0&&(i+=a),e[o]>0?c(0,i,a):c(-1,i,a-1)}var on=function(){function t(){}return t.slice1d=function(n,e,r){return h(1===n.rank,"slice1d expects a rank-1 tensor, but got a rank-"+n.rank+" tensor"),t.slice(n,[e],[r])},t.slice2d=function(n,e,r){return h(2===n.rank,"slice1d expects a rank-2 tensor, but got a rank-"+n.rank+" tensor"),t.slice(n,e,r)},t.slice3d=function(n,e,r){return h(3===n.rank,"slice1d expects a rank-3 tensor, but got a rank-"+n.rank+" tensor"),t.slice(n,e,r)},t.slice4d=function(n,e,r){return h(4===n.rank,"slice1d expects a rank-4 tensor, but got a rank-"+n.rank+" tensor"),t.slice(n,e,r)},t.slice=function(t,n,e){if(s({x:t},"slice"),0===t.rank)throw new Error("Slicing scalar is not possible");var r,o;r="number"==typeof n?[n].concat(new Array(t.rank-1).fill(0)):n.length=0?n:(h(-1===n,"Bad value in size"),t.shape[e]-r[e])}),function(t,n,e){h(t.rank===n.length,"Error in slice"+t.rank+"D: Length of begin "+n+" must match the rank of the array ("+t.rank+")."),h(t.rank===e.length,"Error in slice"+t.rank+"D: Length of size "+e+" must match the rank of the array ("+t.rank+").");for(var r=0;r=0&&e=0;--r)e[r]=e[r+1]*t[r+1];return e}var So=function(){function t(){}return t.gradScope=function(t,n){return Co(t,n,!0)},t.grad=function(t){return h(O(t),"The f passed in grad(f) must be a function"),function(n,e){return h(n instanceof xo,"The x passed in grad(f)(x) must be a tensor"),h(null==e||e instanceof xo,"The dy passed in grad(f)(x, dy) must be a tensor"),Co(function(){var r=Xo.engine.gradients(function(){return t(n)},[n],e),o=r.value,i=r.grads;return null!=e&&p(o.shape,e.shape,"The shape of dy passed in grad(f)(x, dy) must match the shape returned by f(x)"),Ro(i),i[0]})}},t.grads=function(t){return h(O(t),"The f passed in grads(f) must be a function"),function(n,e){return h(Array.isArray(n)&&n.every(function(t){return t instanceof xo}),"The args passed in grads(f)(args) must be an array of tensors"),h(null==e||e instanceof xo,"The dy passed in grads(f)(args, dy) must be a tensor"),Co(function(){var r=Xo.engine.gradients(function(){return t.apply(void 0,n)},n,e),o=r.value,i=r.grads;return null!=e&&p(o.shape,e.shape,"The shape of dy passed in grads(f)([x1,...], dy) must match the shape returned by f([x1,...])"),Ro(i),i})}},t.valueAndGrad=function(t){return h(O(t),"The f passed in valueAndGrad(f) must be a function"),function(n,e){h(n instanceof xo,"The x passed in valueAndGrad(f)(x) must be a tensor"),h(null==e||e instanceof xo,"The dy passed in valueAndGrad(f)(x, dy) must be a tensor");var r=Xo.engine.gradients(function(){return t(n)},[n],e),o=r.grads,i=r.value;return Ro(o),{grad:o[0],value:i}}},t.valueAndGrads=function(t){return h(O(t),"The f passed in valueAndGrads(f) must be a function"),function(n,e){h(Array.isArray(n)&&n.every(function(t){return t instanceof xo}),"The args passed in valueAndGrads(f)(args) must be array of tensors"),h(null==e||e instanceof xo,"The dy passed in valueAndGrads(f)(args, dy) must be a tensor");var r=Xo.engine.gradients(function(){return t.apply(void 0,n)},n,e);return null!=e&&p(r.value.shape,e.shape,"The shape of dy passed in valueAndGrads(f)([x1,...], dy) must match the shape returned by f([x1,...])"),Ro(r.grads),r}},t.variableGrads=function(t,n){if(h(O(t),"The f passed in variableGrads(f) must be a function"),h(null==n||Array.isArray(n)&&n.every(function(t){return t instanceof wo}),"The varList passed in variableGrads(f, varList) must be an array of variables"),null==n)for(var e in n=[],Xo.engine.registeredVariables)n.push(Xo.engine.registeredVariables[e]);var r=n.length;h((n=n.filter(function(t){return t.trainable})).length>0,"variableGrads() expects at least one of the input variables to be trainable, but none of the "+r+" variables is trainable.");var o=Xo.engine.gradients(t,n,null,!0),i=o.value,a=o.grads;h(a.some(function(t){return null!=t}),"Cannot find a connection between any variable and the result of the loss function y=f(x). Please make sure the operations that use variables are inside the function f passed to minimize()."),h(0===i.rank,"The f passed in variableGrads(f) must return a scalar, but it returned a rank-"+i.rank+" tensor");var u={};return n.forEach(function(t,n){null!=a[n]&&(u[t.name]=a[n])}),{value:i,grads:u}},t.customGrad=function(t){return Xo.engine.customGrad(t)},r([function(){for(var t=[],n=0;n0)throw new Error("Cannot compute gradient of y=f(x) with respect to x. Make sure that\n the f you passed encloses all operations that lead from x to y.")}var Co=Gt.tidy,_o=Gt.keep,ko=Gt.dispose,To=Gt.time,Io=So.grad,Do=So.valueAndGrad,Ao=So.grads,Mo=So.valueAndGrads,No=So.variableGrads,Oo=So.customGrad,Lo=function(){function t(t,n){this.backendTimer=t,this.logger=n,null==n&&(this.logger=new Fo)}return t.prototype.profileKernel=function(t,n){var e,r=this,o=this.backendTimer.time(function(){e=n()}),i=e.dataSync();return I(i,e.dtype,t),o.then(function(n){r.logger.logKernelProfile(t,e,i,n.kernelMs)}),e},t}(),Fo=function(){function t(){}return t.prototype.logKernelProfile=function(t,n,e,r){var o=E(r+"ms",9),i=E(t,25),a=n.rank,u=n.size,s=E(n.shape.toString(),14);console.log("%c"+i+"\t%c"+o+"\t%c"+a+"D "+s+"\t%c"+u,"font-weight:bold","color:red","color:blue","color: orange")},t}();var Bo,Po=function(){function t(t,n){this.backend=t,this.safeMode=n,this.registeredVariables={},this.refCounter=new WeakMap,this.nextTapeNodeId=0,this.numBytes=0,this.numTensors=0,this.numDataBuffers=0,this.gradientScopeCount=0,this.customGradientDepth=0,this.keepTensors=new Set,this.activeScope={track:[]},this.scopeStack=[this.activeScope],this.profiler=new Lo(t)}return t.prototype.runKernel=function(t,n,e){var r,o=this,i=[],a=function(t){return i.push(t),t},u=this.activeScope.name;if(this.customGradientDepth++,r=Xo.get("DEBUG")?this.profiler.profileKernel(u,function(){return t(o.backend,a)}):t(this.backend,a),this.customGradientDepth--,this.shouldRecord()){var s={id:this.nextTapeNodeId++,name:u,inputs:n,output:r};null!=e&&(s.gradient=function(t){return e(t,i)}),this.activeTape.push(s)}return r},t.prototype.registerTensor=function(t){var n=this.refCounter.has(t.dataId)?this.refCounter.get(t.dataId):0;this.numTensors++,0===n&&(this.numDataBuffers++,this.numBytes+=g(t.shape)*N(t.dtype),this.backend.register(t.dataId,t.shape,t.dtype)),this.refCounter.set(t.dataId,n+1),t instanceof wo||this.track(t)},t.prototype.registerVariable=function(t){if(null!=this.registeredVariables[t.name])throw new Error("Variable with name "+t.name+" was already registered");this.registeredVariables[t.name]=t},t.prototype.disposeTensor=function(t){if(this.refCounter.has(t.dataId)){this.keepTensors.has(t.id)&&this.keepTensors.delete(t.id),this.numTensors--;var n=this.refCounter.get(t.dataId);n<=1?(this.refCounter.delete(t.dataId),this.backend.disposeData(t.dataId),this.numDataBuffers--,this.numBytes-=g(t.shape)*N(t.dtype)):this.refCounter.set(t.dataId,n-1)}},t.prototype.disposeVariables=function(){for(var t in this.registeredVariables){var n=this.registeredVariables[t];this.disposeTensor(n),delete this.registeredVariables[t]}},t.prototype.memory=function(){var t=this.backend.memory();return t.numTensors=this.numTensors,t.numDataBuffers=this.numDataBuffers,t.numBytes=this.numBytes,t},t.prototype.shouldRecord=function(){return null!=this.activeTape&&0===this.customGradientDepth},t.prototype.addTapeNode=function(t,n,e){var r={};t.forEach(function(t,n){r[n]=t});var o={id:this.nextTapeNodeId++,name:this.activeScope.name,inputs:r,output:n,gradient:function(t){var n={};return e(t).forEach(function(t,e){n[e]=function(){return t}}),n}};this.activeTape.push(o)},t.prototype.keep=function(t){if(1===this.scopeStack.length&&Xo.engine.safeMode)throw new Error("Safe mode is ON. Enclose all tensor operations inside tf.tidy(): tf.tidy(() => {...}) to avoid memory leaks.");return this.keepTensors.add(t.id),t},t.prototype.startScope=function(t,n){void 0===n&&(n=!1),n&&0===this.gradientScopeCount&&(this.activeTape=[]),n&&this.gradientScopeCount++;var e={track:[]};t&&(e.name=t),this.scopeStack.push(e),this.activeScope=e},t.prototype.endScope=function(t,n){var e=this;void 0===n&&(n=!1),n&&(this.gradientScopeCount--,0===this.gradientScopeCount&&(this.activeTape=null));var r=new Set(this.keepTensors),o=L(t);o.forEach(function(t){return r.add(t.id)});for(var i=0;i0,"gradients() received an empty list of xs."),Co("gradients",function(){var i=t();h(i instanceof xo,"The result y returned by f() must be a tensor.");var a=function(t,n,e){for(var r={},o={},i=0;i=0;i--){a=(v=t[i]).inputs;var p=[];for(p.push(v.output),c=0;c0)throw new Error("Cannot compute gradient of y=f(x) with respect to x. Make sure that the f you passed encloses all operations that lead from x to y.");var u={};return u[i.id]=null==e?Rr(i.shape):e,function(t,n){for(var e=n.length-1;e>=0;e--){var r=n[e],o=t[r.output.id];if(null==r.gradient)throw new Error("Cannot compute gradient: gradient function not found for "+r.name+".");var i=r.gradient(o);for(var a in r.inputs){if(!(a in i))throw new Error("Cannot backprop through input "+a+". Available gradients found: "+Object.keys(i)+".");var u=i[a](),s=r.inputs[a];if(!y(u.shape,s.shape))throw new Error("Error in gradient for op "+r.name+". The gradient of input '"+a+"' has shape '"+u.shape+"', which does not match the shape of the input '"+s.shape+"'");if(null==t[s.id])t[s.id]=u;else{var l=t[s.id];t[s.id]=l.add(u),l.dispose()}}}}(u,a),{value:i,grads:n.map(function(t){return u[t.id]})}},!0)},t.prototype.customGrad=function(t){var n=this;return h(O(t),"The f passed in customGrad(f) must be a function."),function(){for(var e,r=[],o=0;o {op();...}); to avoid memory leaks.");return this.activeScope.track.push(t),t},t}();!function(t){t[t.NUMBER=0]="NUMBER",t[t.BOOLEAN=1]="BOOLEAN",t[t.STRING=2]="STRING"}(Bo||(Bo={}));var Uo=[{name:"DEBUG",type:Bo.BOOLEAN},{name:"IS_BROWSER",type:Bo.BOOLEAN},{name:"WEBGL_DISJOINT_QUERY_TIMER_EXTENSION_VERSION",type:Bo.NUMBER},{name:"WEBGL_DISJOINT_QUERY_TIMER_EXTENSION_RELIABLE",type:Bo.BOOLEAN},{name:"WEBGL_VERSION",type:Bo.NUMBER},{name:"WEBGL_RENDER_FLOAT32_ENABLED",type:Bo.BOOLEAN},{name:"WEBGL_DOWNLOAD_FLOAT_ENABLED",type:Bo.BOOLEAN},{name:"WEBGL_GET_BUFFER_SUB_DATA_ASYNC_EXTENSION_ENABLED",type:Bo.BOOLEAN},{name:"BACKEND",type:Bo.STRING}];function Wo(t,n){return null!=t.getExtension(n)}function zo(t){if(0===t||!Xo.get("IS_BROWSER"))throw new Error("Cannot get WebGL rendering context, WebGL is disabled.");var n=document.createElement("canvas");return 1===t?n.getContext("webgl")||n.getContext("experimental-webgl"):n.getContext("webgl2")}function Vo(t){if(null!=t){var n=t.getExtension("WEBGL_lose_context");if(null==n)throw new Error("Extension WEBGL_lose_context not supported on this browser.");n.loseContext()}}function Go(t){var n;try{n=zo(t)}catch(t){return!1}return null!=n&&(Vo(n),!0)}function qo(t,n){var e=t.createFramebuffer(),r=t.createTexture();t.bindTexture(t.TEXTURE_2D,r);var o=2===n?t.RGBA32F:t.RGBA;t.texImage2D(t.TEXTURE_2D,0,o,1,1,0,t.RGBA,t.FLOAT,null),t.bindFramebuffer(t.FRAMEBUFFER,e),t.framebufferTexture2D(t.FRAMEBUFFER,t.COLOR_ATTACHMENT0,t.TEXTURE_2D,r,0)}var Ho=function(){function t(t){this.features={},this.registry={},null!=t&&(this.features=t),this.get("DEBUG")&&console.warn("Debugging mode is ON. The output of every math call will be downloaded to CPU and checked for NaNs. This significantly impacts performance.")}return t.setBackend=function(t,n){if(void 0===n&&(n=!1),!(t in Xo.registry))throw new Error("Backend type '"+t+"' not found in registry");Xo.initBackend(t,n)},t.getBackend=function(){return Xo.initDefaultBackend(),Xo.currentBackend},t.disposeVariables=function(){Xo.engine.disposeVariables()},t.memory=function(){return Xo.engine.memory()},t.prototype.get=function(t){return t in this.features?this.features[t]:(this.features[t]=this.evaluateFeature(t),this.features[t])},t.prototype.getFeatures=function(){return this.features},t.prototype.set=function(t,n){this.features[t]=n},t.prototype.getBestBackendType=function(){var t=this;if(0===Object.keys(this.registry).length)throw new Error("No backend found in registry.");return Object.keys(this.registry).map(function(n){return{name:n,entry:t.registry[n]}}).sort(function(t,n){return n.entry.priority-t.entry.priority})[0].name},t.prototype.evaluateFeature=function(t){if("DEBUG"===t)return!1;if("IS_BROWSER"===t)return"undefined"!=typeof window;if("IS_NODE"===t)return"undefined"!=typeof process&&void 0!==process.versions.node;if("IS_CHROME"===t)return null!=navigator&&null!=navigator.userAgent&&/Chrome/.test(navigator.userAgent)&&/Google Inc/.test(navigator.vendor);if("BACKEND"===t)return this.getBestBackendType();if("WEBGL_DISJOINT_QUERY_TIMER_EXTENSION_VERSION"===t){var n=this.get("WEBGL_VERSION");return 0===n?0:function(t){if(0===t)return 0;var n,e=zo(t);return n=Wo(e,"EXT_disjoint_timer_query_webgl2")&&2===t?2:Wo(e,"EXT_disjoint_timer_query")?1:0,null!=e&&Vo(e),n}(n)}if("WEBGL_DISJOINT_QUERY_TIMER_EXTENSION_RELIABLE"===t)return this.get("WEBGL_DISJOINT_QUERY_TIMER_EXTENSION_VERSION")>0&&!function(){var t=navigator.userAgent||navigator.vendor||window.opera;return/(android|bb\d+|meego).+mobile|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\.(browser|link)|vodafone|wap|windows ce|xda|xiino/i.test(t)||/1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\-(n|u)|c55\/|capi|ccwa|cdm\-|cell|chtm|cldc|cmd\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\-s|devi|dica|dmob|do(c|p)o|ds(12|\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\-|_)|g1 u|g560|gene|gf\-5|g\-mo|go(\.w|od)|gr(ad|un)|haie|hcit|hd\-(m|p|t)|hei\-|hi(pt|ta)|hp( i|ip)|hs\-c|ht(c(\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\-(20|go|ma)|i230|iac( |\-|\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\/)|klon|kpt |kwc\-|kyo(c|k)|le(no|xi)|lg( g|\/(k|l|u)|50|54|\-[a-w])|libw|lynx|m1\-w|m3ga|m50\/|ma(te|ui|xo)|mc(01|21|ca)|m\-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\-2|po(ck|rt|se)|prox|psio|pt\-g|qa\-a|qc(07|12|21|32|60|\-[2-7]|i\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\-|oo|p\-)|sdk\/|se(c(\-|0|1)|47|mc|nd|ri)|sgh\-|shar|sie(\-|m)|sk\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\-|v\-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\-|tdg\-|tel(i|m)|tim\-|t\-mo|to(pl|sh)|ts(70|m\-|m3|m5)|tx\-9|up(\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas\-|your|zeto|zte\-/i.test(t.substr(0,4))}();if("WEBGL_VERSION"===t)return Go(2)?2:Go(1)?1:0;if("WEBGL_RENDER_FLOAT32_ENABLED"===t)return function(t){if(0===t)return!1;var n=zo(t);if(1===t){if(!Wo(n,"OES_texture_float"))return!1}else if(!Wo(n,"EXT_color_buffer_float"))return!1;qo(n,t);var e=n.checkFramebufferStatus(n.FRAMEBUFFER)===n.FRAMEBUFFER_COMPLETE;return Vo(n),e}(this.get("WEBGL_VERSION"));if("WEBGL_DOWNLOAD_FLOAT_ENABLED"===t)return function(t){if(0===t)return!1;var n=zo(t);if(1===t){if(!Wo(n,"OES_texture_float"))return!1}else if(!Wo(n,"EXT_color_buffer_float"))return!1;qo(n,t),n.readPixels(0,0,1,1,n.RGBA,n.FLOAT,new Float32Array(4));var e=n.getError()===n.NO_ERROR;return Vo(n),e}(this.get("WEBGL_VERSION"));if("WEBGL_GET_BUFFER_SUB_DATA_ASYNC_EXTENSION_ENABLED"===t)return function(t){if(t>0)return!1;if(2!==t)return!1;var n=zo(t),e=Wo(n,"WEBGL_get_buffer_sub_data_async");return Vo(n),e}(this.get("WEBGL_VERSION"));if("TEST_EPSILON"===t)return this.get("WEBGL_RENDER_FLOAT32_ENABLED")?.001:.1;throw new Error("Unknown feature "+t+".")},t.prototype.setFeatures=function(t){this.features=t},t.prototype.reset=function(){this.features=Ko(),null!=this.globalEngine&&(this.globalEngine=null)},t.prototype.initBackend=function(t,n){void 0===n&&(n=!1),this.currentBackend=t;var e=Xo.findBackend(t);this.globalEngine=new Po(e,n)},t.prototype.findBackend=function(t){return t in this.registry?this.registry[t].backend:null},t.prototype.registerBackend=function(t,n,e){void 0===e&&(e=1),t in this.registry&&console.warn(t+" backend was already registered");try{var r=n();return this.registry[t]={backend:r,priority:e},!0}catch(n){return console.warn("Registration of backend "+t+" failed"),console.warn(n.stack||n.message),!1}},t.prototype.removeBackend=function(t){if(!(t in this.registry))throw new Error(t+" backend not found in registry");this.registry[t].backend.dispose(),delete this.registry[t]},Object.defineProperty(t.prototype,"engine",{get:function(){return this.initDefaultBackend(),this.globalEngine},enumerable:!0,configurable:!0}),t.prototype.initDefaultBackend=function(){null==this.globalEngine&&this.initBackend(Xo.get("BACKEND"),!1)},r([function(){for(var t=[],n=0;n":"<",s=e?"inOffset + i;":"round(getBestIndicesA(batch, inOffset + i));";this.userCode="\n void main() {\n ivec2 coords = getOutputCoords();\n int batch = coords[0];\n int outIdx = coords[1];\n int inOffset = outIdx * "+r+";\n\n int bestIndex = 0;\n float bestValue = getA(batch, inOffset);\n\n for (int i = 0; i < "+r+"; i++) {\n int inIdx = "+s+";\n float candidate = getA(batch, inIdx);\n if (candidate "+u+" bestValue) {\n bestValue = candidate;\n bestIndex = inIdx;\n }\n }\n setOutput(float(bestIndex));\n }\n "},ni=function(t){this.variableNames=["dy"],this.outputShape=t.inShape;var n=t.filterHeight,e=t.filterWidth,r=t.strideHeight,o=t.strideWidth,i=n-1-t.padInfo.top,a=e-1-t.padInfo.left,u=1/(n*e);this.userCode="\n const ivec2 pads = ivec2("+i+", "+a+");\n const float avgMultiplier = float("+u+");\n\n void main() {\n ivec4 coords = getOutputCoords();\n int b = coords[0];\n int d = coords[3];\n\n ivec2 dyRCCorner = coords.yz - pads;\n int dyRCorner = dyRCCorner.x;\n int dyCCorner = dyRCCorner.y;\n\n // Convolve dy(?, ?, d) with pos mask(:, :, d) to get dx(xR, xC, d).\n // ? = to be determined. : = across all values in that axis.\n float dotProd = 0.0;\n for (int wR = 0; wR < "+n+"; wR++) {\n float dyR = float(dyRCorner + wR) / "+r+".0;\n\n if (dyR < 0.0 || dyR >= "+t.outHeight+".0 || fract(dyR) > 0.0) {\n continue;\n }\n int idyR = int(dyR);\n\n for (int wC = 0; wC < "+e+"; wC++) {\n float dyC = float(dyCCorner + wC) / "+o+".0;\n\n if (dyC < 0.0 || dyC >= "+t.outWidth+".0 ||\n fract(dyC) > 0.0) {\n continue;\n }\n int idyC = int(dyC);\n\n float dyValue = getDy(b, idyR, idyC, d);\n\n dotProd += dyValue * avgMultiplier;\n }\n }\n setOutput(dotProd);\n }\n "},ei=function(t,n,e,r,o,i){this.outputShape=[],this.supportsBroadcasting=!0,this.variableNames=["x","mean","variance"],Et(t,n),Et(t,e);var a="0.0";null!=r&&(Et(t,r),this.variableNames.push("offset"),a="getOffsetAtOutCoords()");var u="1.0";null!=o&&(Et(t,o),this.variableNames.push("scale"),u="getScaleAtOutCoords()"),this.outputShape=t,this.userCode="\n void main() {\n float x = getXAtOutCoords();\n float mean = getMeanAtOutCoords();\n float variance = getVarianceAtOutCoords();\n float offset = "+a+";\n float scale = "+u+";\n float inv = scale * inversesqrt(variance + float("+i+"));\n setOutput((x - mean) * inv + offset);\n }\n "},ri=function(t,n,e){this.variableNames=["A","B"],this.supportsBroadcasting=!0,this.outputShape=Et(n,e),this.userCode="\n float binaryOperation(float a, float b) {\n "+t+"\n }\n\n void main() {\n float a = getAAtOutCoords();\n float b = getBAtOutCoords();\n setOutput(binaryOperation(a, b));\n }\n "},oi=function(t,n,e){this.variableNames=["A"],this.outputShape=t;var r=n.toFixed(20),o=e.toFixed(20);this.userCode="\n void main() {\n float value = getAAtOutCoords();\n if (isNaN(value)) {\n setOutput(value);\n return;\n }\n\n setOutput(clamp(value, "+r+", "+o+"));\n }\n "},ii=function(t,n){this.variableNames=["A","B"],this.outputShape=[],this.outputShape=J(t,n,1),this.userCode="\n void main() {\n ivec2 coords = getOutputCoords();\n int yR = coords.x;\n int yC = coords.y;\n\n float value = 0.0;\n if (yC < "+t[1]+") {\n value = getA(yR, yC);\n } else {\n yC -= "+t[1]+";\n value = getB(yR, yC);\n }\n\n setOutput(value);\n }\n "},ai=function(t){this.variableNames=["x","dy"],this.outputShape=t.filterShape;var n=t.strideHeight,e=t.strideWidth,r=t.padInfo.top,o=t.padInfo.left;this.userCode="\n void main() {\n ivec4 coords = getOutputCoords();\n int wR = coords.x;\n int wC = coords.y;\n int d1 = coords.z;\n int d2 = coords.w;\n\n // Convolve x(?, ?, d1) with dy(:, :, d2) to get dw(wR, wC, d1, d2).\n // ? = to be determined. : = across all values in that axis.\n float dotProd = 0.0;\n\n for (int b = 0; b < "+t.batchSize+"; b++) {\n for (int yR = 0; yR < "+t.outHeight+"; yR++) {\n int xR = wR + yR * "+n+" - "+r+";\n\n if (xR < 0 || xR >= "+t.inHeight+") {\n continue;\n }\n\n for (int yC = 0; yC < "+t.outWidth+"; yC++) {\n int xC = wC + yC * "+e+" - "+o+";\n\n if (xC < 0 || xC >= "+t.inWidth+") {\n continue;\n }\n\n float dyValue = getDy(b, yR, yC, d2);\n float xValue = getX(b, xR, xC, d1);\n dotProd += (xValue * dyValue);\n }\n }\n }\n setOutput(dotProd);\n }\n "},ui=function(t){this.variableNames=["dy","W"],this.outputShape=t.inShape;var n=t.filterHeight,e=t.filterWidth,r=t.strideHeight,o=t.strideWidth,i=n-1-t.padInfo.top,a=e-1-t.padInfo.left;this.userCode="\n const ivec2 pads = ivec2("+i+", "+a+");\n\n void main() {\n ivec4 coords = getOutputCoords();\n int batch = coords[0];\n int d1 = coords[3];\n\n ivec2 dyCorner = coords.yz - pads;\n int dyRCorner = dyCorner.x;\n int dyCCorner = dyCorner.y;\n\n // Convolve dy(?, ?, d2) with w(:, :, d1, d2) to compute dx(xR, xC, d1).\n // ? = to be determined. : = across all values in that axis.\n float dotProd = 0.0;\n for (int wR = 0; wR < "+n+"; wR++) {\n float dyR = float(dyRCorner + wR) / "+r+".0;\n\n if (dyR < 0.0 || dyR >= "+t.outHeight+".0 || fract(dyR) > 0.0) {\n continue;\n }\n int idyR = int(dyR);\n\n int wRPerm = "+n+" - 1 - wR;\n\n for (int wC = 0; wC < "+e+"; wC++) {\n float dyC = float(dyCCorner + wC) / "+o+".0;\n\n if (dyC < 0.0 || dyC >= "+t.outWidth+".0 ||\n fract(dyC) > 0.0) {\n continue;\n }\n int idyC = int(dyC);\n\n int wCPerm = "+e+" - 1 - wC;\n\n for (int d2 = 0; d2 < "+t.outChannels+"; d2++) {\n float xValue = getDy(batch, idyR, idyC, d2);\n float wValue = getW(wRPerm, wCPerm, d1, d2);\n dotProd += xValue * wValue;\n }\n }\n }\n setOutput(dotProd);\n }\n "},si=function(t){this.variableNames=["x","dy"],this.outputShape=t.filterShape;var n=t.strideHeight,e=t.strideWidth,r=t.padInfo.top,o=t.padInfo.left,i=t.outChannels/t.inChannels;this.userCode="\n void main() {\n ivec4 coords = getOutputCoords();\n int wR = coords.x;\n int wC = coords.y;\n int d1 = coords.z;\n int dm = coords.w;\n int d2 = d1 * "+i+" + dm;\n\n float dotProd = 0.0;\n\n // TODO: Vec4 over the batch size\n for (int b = 0; b < "+t.batchSize+"; b++) {\n for (int yR = 0; yR < "+t.outHeight+"; yR++) {\n int xR = wR + yR * "+n+" - "+r+";\n\n if (xR < 0 || xR >= "+t.inHeight+") {\n continue;\n }\n\n for (int yC = 0; yC < "+t.outWidth+"; yC++) {\n int xC = wC + yC * "+e+" - "+o+";\n\n if (xC < 0 || xC >= "+t.inWidth+") {\n continue;\n }\n\n float dyValue = getDy(b, yR, yC, d2);\n float xValue = getX(b, xR, xC, d1);\n dotProd += (xValue * dyValue);\n }\n }\n }\n setOutput(dotProd);\n }\n "},li=function(t){this.variableNames=["dy","W"],this.outputShape=t.inShape;var n=t.filterHeight,e=t.filterWidth,r=t.strideHeight,o=t.strideWidth,i=n-1-t.padInfo.top,a=e-1-t.padInfo.left,u=t.outChannels/t.inChannels;this.userCode="\n const ivec2 pads = ivec2("+i+", "+a+");\n\n void main() {\n ivec4 coords = getOutputCoords();\n int batch = coords[0];\n int d1 = coords[3];\n ivec2 dyCorner = coords.yz - pads;\n int dyRCorner = dyCorner.x;\n int dyCCorner = dyCorner.y;\n\n float dotProd = 0.0;\n\n for (int wR = 0; wR < "+n+"; wR++) {\n float dyR = float(dyRCorner + wR) / "+r+".0;\n\n if (dyR < 0.0 || dyR >= "+t.outHeight+".0 || fract(dyR) > 0.0) {\n continue;\n }\n int idyR = int(dyR);\n\n int wRPerm = "+n+" - 1 - wR;\n\n for (int wC = 0; wC < "+e+"; wC++) {\n float dyC = float(dyCCorner + wC) / "+o+".0;\n\n if (dyC < 0.0 || dyC >= "+t.outWidth+".0 ||\n fract(dyC) > 0.0) {\n continue;\n }\n int idyC = int(dyC);\n\n int wCPerm = "+e+" - 1 - wC;\n\n // TODO: Vec4 over the channelMul\n for (int dm = 0; dm < "+u+"; dm++) {\n int d2 = d1 * "+u+" + dm;\n float xValue = getDy(batch, idyR, idyC, d2);\n float wValue = getW(wRPerm, wCPerm, d1, dm);\n dotProd += xValue * wValue;\n }\n }\n }\n setOutput(dotProd);\n }\n "},ci=function(t){this.variableNames=["x","W"],this.outputShape=t.outShape;var n=t.padInfo.top,e=t.padInfo.left,r=t.strideHeight,o=t.strideWidth,i=t.dilationHeight,a=t.dilationWidth,u=t.filterHeight,s=t.filterWidth,l=4*Math.floor(t.inChannels/4),c=t.inChannels%4;this.userCode="\n const ivec2 strides = ivec2("+r+", "+o+");\n const ivec2 pads = ivec2("+n+", "+e+");\n\n void main() {\n ivec4 coords = getOutputCoords();\n int batch = coords[0];\n int d2 = coords[3];\n\n ivec2 xRCCorner = coords.yz * strides - pads;\n int xRCorner = xRCCorner.x;\n int xCCorner = xRCCorner.y;\n\n // Convolve x(?, ?, d1) with w(:, :, d1, d2) to get y(yR, yC, d2).\n // ? = to be determined. : = across all values in that axis.\n float dotProd = 0.0;\n for (int wR = 0; wR < "+u+"; wR++) {\n int xR = xRCorner + wR * "+i+";\n\n if (xR < 0 || xR >= "+t.inHeight+") {\n continue;\n }\n\n for (int wC = 0; wC < "+s+"; wC++) {\n int xC = xCCorner + wC * "+a+";\n\n if (xC < 0 || xC >= "+t.inWidth+") {\n continue;\n }\n\n for (int d1 = 0; d1 < "+l+"; d1 += 4) {\n vec4 xValues = vec4(\n getX(batch, xR, xC, d1),\n getX(batch, xR, xC, d1 + 1),\n getX(batch, xR, xC, d1 + 2),\n getX(batch, xR, xC, d1 + 3)\n );\n vec4 wValues = vec4(\n getW(wR, wC, d1, d2),\n getW(wR, wC, d1 + 1, d2),\n getW(wR, wC, d1 + 2, d2),\n getW(wR, wC, d1 + 3, d2)\n );\n\n dotProd += dot(xValues, wValues);\n }\n\n if ("+(1===c)+") {\n dotProd +=\n getX(batch, xR, xC, "+l+") *\n getW(wR, wC, "+l+", d2);\n } else if ("+(2===c)+") {\n vec2 xValues = vec2(\n getX(batch, xR, xC, "+l+"),\n getX(batch, xR, xC, "+l+" + 1)\n );\n vec2 wValues = vec2(\n getW(wR, wC, "+l+", d2),\n getW(wR, wC, "+l+" + 1, d2)\n );\n dotProd += dot(xValues, wValues);\n } else if ("+(3===c)+") {\n vec3 xValues = vec3(\n getX(batch, xR, xC, "+l+"),\n getX(batch, xR, xC, "+l+" + 1),\n getX(batch, xR, xC, "+l+" + 2)\n );\n vec3 wValues = vec3(\n getW(wR, wC, "+l+", d2),\n getW(wR, wC, "+l+" + 1, d2),\n getW(wR, wC, "+l+" + 2, d2)\n );\n dotProd += dot(xValues, wValues);\n }\n }\n }\n setOutput(dotProd);\n }\n "},fi=function(t){this.variableNames=["x","W"],this.outputShape=t.outShape;var n=t.inHeight,e=t.inWidth,r=t.padInfo.top,o=t.padInfo.left,i=t.strideHeight,a=t.strideWidth,u=t.dilationHeight,s=t.dilationWidth,l=t.filterHeight,c=t.filterWidth,f=t.outChannels/t.inChannels;this.userCode="\n const ivec2 strides = ivec2("+i+", "+a+");\n const ivec2 pads = ivec2("+r+", "+o+");\n\n void main() {\n ivec4 coords = getOutputCoords();\n int batch = coords.x;\n ivec2 xRCCorner = coords.yz * strides - pads;\n int d2 = coords.w;\n int d1 = d2 / "+f+";\n int q = d2 - d1 * "+f+";\n\n int xRCorner = xRCCorner.x;\n int xCCorner = xRCCorner.y;\n\n // Convolve x(?, ?, d1) with w(:, :, d1, q) to get y(yR, yC, d2).\n // ? = to be determined. : = across all values in that axis.\n float dotProd = 0.0;\n // TODO(dsmilkov): Flatten the two for loops and vec4 the operations.\n for (int wR = 0; wR < "+l+"; wR++) {\n int xR = xRCorner + wR * "+u+";\n\n if (xR < 0 || xR >= "+n+") {\n continue;\n }\n\n for (int wC = 0; wC < "+c+"; wC++) {\n int xC = xCCorner + wC * "+s+";\n\n if (xC < 0 || xC >= "+e+") {\n continue;\n }\n\n float xVal = getX(batch, xR, xC, d1);\n float wVal = getW(wR, wC, d1, q);\n dotProd += xVal * wVal;\n }\n }\n setOutput(dotProd);\n }\n "};function hi(t,n,e,r){var o=t.map(function(t){var n=g(t.shapeInfo.logicalShape);return t.shapeInfo.isUniform?"uniform float "+t.name+(n>1?"["+n+"]":"")+";":"uniform sampler2D "+t.name+";"});o=o.join("\n");var i=t.map(function(t){return function(t,n,e){var r=function(t){var n=t.name,e="get"+n.charAt(0).toUpperCase()+n.slice(1)+"Flat",r=g(t.shapeInfo.logicalShape);if(t.shapeInfo.isUniform)return 1===r?"float "+e+"(int index) {return "+n+";}":"\n float "+e+"(int index) {\n for (int i = 0; i < "+r+"; i++) {\n if (i == index) {\n return "+n+"[i];\n }\n }\n }\n ";var o=t.shapeInfo.texShape,i=o[0],a=o[1];return 1===a&&1===i?"\n float "+e+"(int index) {\n return sampleTexture("+n+", halfCR);\n }\n ":1===a?"\n float "+e+"(int index) {\n vec2 uv = vec2(0.5, (float(index) + 0.5) / "+i+".0);\n return sampleTexture("+n+", uv);\n }\n ":1===i?"\n float "+e+"(int index) {\n vec2 uv = vec2((float(index) + 0.5) / "+a+".0, 0.5);\n return sampleTexture("+n+", uv);\n }\n ":"\n float "+e+"(int index) {\n vec2 uv = UVfrom1D("+i+", "+a+", index);\n return sampleTexture("+n+", uv);\n }\n "}(t);return r+=pi(t),(e||y(t.shapeInfo.logicalShape,n.logicalShape))&&(r+=function(t,n,e){var r=t.name,o=r.charAt(0).toUpperCase()+r.slice(1),i="get"+o+"AtOutCoords",a=wt(t.shapeInfo.logicalShape,n.logicalShape),u=t.shapeInfo.logicalShape.length,s=n.logicalShape.length,l=e&&(s>u||a.length>0),c=function(t){for(var n=0;n=1?"coords = 0;":u.map(function(t){return"coords["+(t+s)+"] = 0;"}).join("\n"))+"\n return get"+e+"("+(i<2&&o>0?"coords":t.shapeInfo.logicalShape.map(function(t,n){return"coords["+(n+s)+"]"}).join(", "))+");\n }\n "}(t,n,o,i);var h=g(t.shapeInfo.logicalShape),p="";l&&c&&(p="\n int mainPart = index / "+h+";\n index -= mainPart * "+h+";\n ");var d=n.texShape;if(f)return 1===h?"float "+i+"() {return "+r+";}":"\n float "+i+"() {\n ivec2 resTexRC = ivec2(resultUV.yx *\n vec2("+d[0]+", "+d[1]+"));\n int index = resTexRC.x * "+d[1]+" + resTexRC.y;\n "+p+"\n return get"+o+"Flat(index);\n }\n ";var v=t.shapeInfo.texShape;return y(v,d)?"\n float "+i+"() {\n return sampleTexture("+r+", resultUV);\n }\n ":"\n float "+i+"() {\n ivec2 resTexRC = ivec2(resultUV.yx *\n vec2("+d[0]+", "+d[1]+"));\n int index = resTexRC.x * "+d[1]+" + resTexRC.y;\n "+p+"\n int texR = index / "+v[1]+";\n int texC = index - texR * "+v[1]+";\n vec2 uv = (vec2(texC, texR) + halfCR) /\n vec2("+v[1]+".0, "+v[0]+".0);\n\n return sampleTexture("+r+", uv);\n }\n "}(t,n,e)),r}(t,n,r)}).join("\n"),a=n.texShape,u=function(t,n){switch(t.length){case 0:return"\n int getOutputCoords() {\n return 0;\n }\n ";case 1:return function(t,n){return 1===n[0]?"\n int getOutputCoords() {\n return int(resultUV.x * "+n[1]+".0);\n }\n ":1===n[1]?"\n int getOutputCoords() {\n return int(resultUV.y * "+n[0]+".0);\n }\n ":"\n int getOutputCoords() {\n ivec2 resTexRC = ivec2(resultUV.yx *\n vec2("+n[0]+", "+n[1]+"));\n return resTexRC.x * "+n[1]+" + resTexRC.y;\n }\n "}(0,n);case 2:return function(t,n){return y(t,n)?"\n ivec2 getOutputCoords() {\n return ivec2(resultUV.yx * vec2("+n[0]+", "+n[1]+"));\n }\n ":1===t[1]?"\n ivec2 getOutputCoords() {\n ivec2 resTexRC = ivec2(resultUV.yx *\n vec2("+n[0]+", "+n[1]+"));\n int index = resTexRC.x * "+n[1]+" + resTexRC.y;\n return ivec2(index, 0);\n }\n ":1===t[0]?"\n ivec2 getOutputCoords() {\n ivec2 resTexRC = ivec2(resultUV.yx *\n vec2("+n[0]+", "+n[1]+"));\n int index = resTexRC.x * "+n[1]+" + resTexRC.y;\n return ivec2(0, index);\n }\n ":"\n ivec2 getOutputCoords() {\n ivec2 resTexRC = ivec2(resultUV.yx *\n vec2("+n[0]+", "+n[1]+"));\n int index = resTexRC.x * "+n[1]+" + resTexRC.y;\n int r = index / "+t[1]+";\n int c = index - r * "+t[1]+";\n return ivec2(r, c);\n }\n "}(t,n);case 3:return function(t,n){var e=t[1]*t[2],r=t[2];return"\n ivec3 getOutputCoords() {\n ivec2 resTexRC = ivec2(resultUV.yx *\n vec2("+n[0]+", "+n[1]+"));\n int index = resTexRC.x * "+n[1]+" + resTexRC.y;\n int r = index / "+e+";\n index -= r * "+e+";\n int c = index / "+r+";\n int d = index - c * "+r+";\n return ivec3(r, c, d);\n }\n "}(t,n);case 4:return function(t,n){var e=t[3],r=t[2]*e,o=t[1]*r;return"\n ivec4 getOutputCoords() {\n ivec2 resTexRC = ivec2(resultUV.yx *\n vec2("+n[0]+", "+n[1]+"));\n int index = resTexRC.x * "+n[1]+" + resTexRC.y;\n\n int r = index / "+o+";\n index -= r * "+o+";\n\n int c = index / "+r+";\n index -= c * "+r+";\n\n int d = index / "+e+";\n int d2 = index - d * "+e+";\n\n return ivec4(r, c, d, d2);\n }\n "}(t,n);case 5:return function(t,n){var e=t[4],r=t[3]*e,o=t[2]*r,i=t[1]*o;return"\n ivec5 getOutputCoords() {\n ivec2 resTexRC = ivec2(resultUV.yx * vec2("+n[0]+",\n "+n[1]+"));\n\n int index = resTexRC.x * "+n[1]+" + resTexRC.y;\n\n int r = index / "+i+";\n index -= r * "+i+";\n\n int c = index / "+o+";\n index -= c * "+o+";\n\n int d = index / "+r+";\n index -= d * "+r+";\n\n int d2 = index / "+e+";\n int d3 = index - d2 * "+e+";\n\n ivec5 outShape = ivec5(r, c, d, d2, d3);\n return outShape;\n }\n "}(t,n);case 6:return function(t,n){var e=t[5],r=t[4]*e,o=t[3]*r,i=t[2]*o,a=t[1]*i;return"\n ivec6 getOutputCoords() {\n ivec2 resTexRC = ivec2(resultUV.yx *\n vec2("+n[0]+", "+n[1]+"));\n int index = resTexRC.x * "+n[1]+" + resTexRC.y;\n\n int r = index / "+a+";\n index -= r * "+a+";\n\n int c = index / "+i+";\n index -= c * "+i+";\n\n int d = index / "+o+";\n index -= d * "+o+";\n\n int d2 = index / "+r+";\n index -= d2 * "+r+";\n\n int d3 = index / "+e+";\n int d4 = index - d3 * "+e+";\n\n ivec6 result = ivec6(r, c, d, d2, d3, d4);\n return result;\n }\n "}(t,n);default:throw new Error(t.length+"-D output sampling is not yet supported")}}(n.logicalShape,a);return[mi,di,vi,o,u,i,e].join("\n")}function pi(t){var n=t.shapeInfo.logicalShape;switch(n.length){case 0:return function(t){var n=t.name,e="get"+n.charAt(0).toUpperCase()+n.slice(1);return t.shapeInfo.isUniform?"float "+e+"() {return "+n+";}":"\n float "+e+"() {\n return sampleTexture("+n+", halfCR);\n }\n "}(t);case 1:return function(t){var n=t.name,e="get"+n.charAt(0).toUpperCase()+n.slice(1);return"\n float "+e+"(int index) {\n return "+e+"Flat(index);\n }\n "}(t);case 2:return function(t){var n=t.shapeInfo.logicalShape,e=t.name,r="get"+e.charAt(0).toUpperCase()+e.slice(1),o=t.shapeInfo.texShape;if(null!=o&&y(n,o)){var i=o[0];return"\n float "+r+"(int row, int col) {\n vec2 uv = (vec2(col, row) + halfCR) / vec2("+o[1]+".0, "+i+".0);\n return sampleTexture("+e+", uv);\n }\n "}var a=_(n),u=a.newShape,s=a.keptDims,l=u;if(l.length";this.userCode="\n int getIndex(int i) {\n "+(e?"return "+o+" -i - 1;":"return i;")+"\n }\n\n void main() {\n "+gi(r)+" coords = getOutputCoords();\n int end = "+bi(r,"coords")+";\n float val = 0.0;\n for (int i = "+o+" - 1; i >= 0; i -= 1) {\n int idx = getIndex(i);\n if (idx "+i+" end) {\n continue;\n }\n if (idx == end && "+n+") {\n continue;\n }\n "+bi(r,"coords")+" = idx;\n val += getX("+function(t,n){if(1===t)return""+n;if(2===t)return n+".x, "+n+".y";if(3===t)return n+".x, "+n+".y, "+n+".z";if(4===t)return n+".x, "+n+".y, "+n+".z, "+n+".w";throw Error("Cumulative sum for rank "+t+" is not yet supported")}(r,"coords")+");\n }\n setOutput(val);\n }\n "};function bi(t,n){if(1===t)return""+n;if(2===t)return n+".y";if(3===t)return n+".z";if(4===t)return n+".w";throw Error("Cumulative sum for rank "+t+" is not yet supported")}var Ei,Si,Ri=function(t){this.variableNames=["A"],this.outputShape=t,this.userCode="\n const float FLOAT_MAX = 1.70141184e38;\n const float FLOAT_MIN = 1.17549435e-38;\n\n lowp vec4 encode_float(highp float v) {\n if (isNaN(v)) {\n return vec4(255, 255, 255, 255);\n }\n\n highp float av = abs(v);\n\n if(av < FLOAT_MIN) {\n return vec4(0.0, 0.0, 0.0, 0.0);\n } else if(v > FLOAT_MAX) {\n return vec4(0.0, 0.0, 128.0, 127.0) / 255.0;\n } else if(v < -FLOAT_MAX) {\n return vec4(0.0, 0.0, 128.0, 255.0) / 255.0;\n }\n\n highp vec4 c = vec4(0,0,0,0);\n\n highp float e = floor(log2(av));\n highp float m = exp2(fract(log2(av))) - 1.0;\n\n c[2] = floor(128.0 * m);\n m -= c[2] / 128.0;\n c[1] = floor(32768.0 * m);\n m -= c[1] / 32768.0;\n c[0] = floor(8388608.0 * m);\n\n highp float ebias = e + 127.0;\n c[3] = floor(ebias / 2.0);\n ebias -= c[3] * 2.0;\n c[2] += floor(ebias) * 128.0;\n\n c[3] += 128.0 * step(0.0, -v);\n\n return c / 255.0;\n }\n\n void main() {\n float x = getAAtOutCoords();\n gl_FragColor = encode_float(x);\n }\n "},Ci=function(t){this.variableNames=["A"];var n=t[0],e=t[1];this.outputShape=t,this.userCode="\n void main() {\n ivec3 coords = getOutputCoords();\n int texR = coords[0];\n int texC = coords[1];\n int depth = coords[2];\n vec2 uv = (vec2(texC, texR) + halfCR) / vec2("+e+".0, "+n+".0);\n\n vec4 values = texture2D(A, uv);\n float value;\n if (depth == 0) {\n value = values.r;\n } else if (depth == 1) {\n value = values.g;\n } else if (depth == 2) {\n value = values.b;\n } else if (depth == 3) {\n value = values.a;\n }\n\n setOutput(floor(value * 255.0 + 0.5));\n }\n "},_i=function(t,n,e){this.variableNames=["A","indices"];var r=t.slice();r[e]=n,this.outputShape=r,this.rank=r.length;var o=gi(this.rank),i=function(t,n){var e=t.length;if(e>4)throw Error("Gather for rank "+e+" is not yet supported");if(1===e)return"int(getIndices(resRC))";for(var r=["resRC.x","resRC.y","resRC.z","resRC.w"],o=[],i=0;i= "+r);for(var o=0,i=0;ir||e>r)throw o="["+n+"x"+e+"]",new Error("Requested texture size "+o+" greater than WebGL maximum on this browser / GPU ["+r+"x"+r+"].")}function $i(t){return la(t,function(){return t.createFramebuffer()},"Unable to create WebGLFramebuffer.")}function ta(t,n,e,r,o,i,a){var u=t.getAttribLocation(n,e);return-1!==u&&(Li(t,function(){return t.bindBuffer(t.ARRAY_BUFFER,r)}),Li(t,function(){return t.vertexAttribPointer(u,o,t.FLOAT,!1,i,a)}),Li(t,function(){return t.enableVertexAttribArray(u)}),!0)}function na(t,n,e){ca(t,e),Li(t,function(){return t.activeTexture(t.TEXTURE0+e)}),Li(t,function(){return t.bindTexture(t.TEXTURE_2D,n)})}function ea(t,n,e){return la(t,function(){return t.getUniformLocation(n,e)},'uniform "'+e+'" not present in program.')}function ra(t,n,e){return t.getUniformLocation(n,e)}function oa(t,n,e,r,o){Li(t,function(){return na(t,e,o)}),Li(t,function(){return t.uniform1i(r,o)})}function ia(t,n,e){Li(t,function(){return t.bindFramebuffer(t.FRAMEBUFFER,e)}),Li(t,function(){return t.framebufferTexture2D(t.FRAMEBUFFER,t.COLOR_ATTACHMENT0,t.TEXTURE_2D,n,0)})}function aa(t,n){Li(t,function(){return t.bindFramebuffer(t.FRAMEBUFFER,n)}),Li(t,function(){return t.framebufferTexture2D(t.FRAMEBUFFER,t.COLOR_ATTACHMENT0,t.TEXTURE_2D,null,0)})}function ua(t){var n=t.checkFramebufferStatus(t.FRAMEBUFFER);if(n!==t.FRAMEBUFFER_COMPLETE)throw new Error("Error binding framebuffer: "+sa(t,n))}function sa(t,n){switch(n){case t.FRAMEBUFFER_INCOMPLETE_ATTACHMENT:return"FRAMEBUFFER_INCOMPLETE_ATTACHMENT";case t.FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT:return"FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT";case t.FRAMEBUFFER_INCOMPLETE_DIMENSIONS:return"FRAMEBUFFER_INCOMPLETE_DIMENSIONS";case t.FRAMEBUFFER_UNSUPPORTED:return"FRAMEBUFFER_UNSUPPORTED";default:return"unknown error "+n}}function la(t,n,e){var r=Li(t,function(){return n()});if(null==r)throw new Error(e);return r}function ca(t,n){var e=t.MAX_COMBINED_TEXTURE_IMAGE_UNITS-1,r=n+t.TEXTURE0;if(re)throw new Error("textureUnit must be in [gl.TEXTURE0, gl.TEXTURE"+e+"].")}function fa(t,n){2!==n.length&&(n=_(n).newShape);var e=Qi(t),r=g(n);return n.length<=1&&r<=e?[r,1]:2===n.length&&n[0]<=e&&n[1]<=e?n:3===n.length&&n[0]<=e&&n[1]*n[2]<=e?[n[0],n[1]*n[2]]:4===n.length&&n[0]<=e&&n[1]*n[2]*n[3]<=e?[n[0],n[1]*n[2]*n[3]]:b(r)}var ha=Object.freeze({createWebGLRenderingContext:Ni,createWebGLRenderingContextFromCanvas:Oi,callAndCheck:Li,enableDebugWebGLErrorChecking:Bi,checkWebGLError:Pi,getWebGLErrorMessage:Ui,getExtensionOrThrow:Wi,createVertexShader:zi,createFragmentShader:Vi,createProgram:qi,linkProgram:Hi,validateProgram:ji,createStaticVertexBuffer:Ki,createStaticIndexBuffer:Xi,queryMaxTextureSize:Qi,getNumChannels:Yi,createTexture:Ji,validateTextureSize:Zi,createFramebuffer:$i,bindVertexBufferToProgramAttribute:ta,bindTextureUnit:na,unbindTextureUnit:function(t,n){ca(t,n),Li(t,function(){return t.activeTexture(t.TEXTURE0+n)}),Li(t,function(){return t.bindTexture(t.TEXTURE_2D,null)})},getProgramUniformLocationOrThrow:ea,getProgramUniformLocation:ra,bindTextureToProgramUniformSampler:oa,bindCanvasToFramebuffer:function(t){Li(t,function(){return t.bindFramebuffer(t.FRAMEBUFFER,null)}),Li(t,function(){return t.viewport(0,0,t.canvas.width,t.canvas.height)}),Li(t,function(){return t.scissor(0,0,t.canvas.width,t.canvas.height)})},bindColorTextureToFramebuffer:ia,unbindColorTextureFromFramebuffer:aa,validateFramebuffer:ua,getFramebufferErrorMessage:sa,getTextureShapeFromLogicalShape:fa});function pa(){return{alpha:!1,antialias:!1,premultipliedAlpha:!1,preserveDrawingBuffer:!1,depth:!1,stencil:!1,failIfMajorPerformanceCaveat:!0}}function da(t){var n,e={alpha:!1,antialias:!1,premultipliedAlpha:!1,preserveDrawingBuffer:!1,depth:!1,stencil:!1,failIfMajorPerformanceCaveat:!0};return Li(n=null!=t?Oi(t,e):Ni(e),function(){return n.disable(n.DEPTH_TEST)}),Li(n,function(){return n.disable(n.STENCIL_TEST)}),Li(n,function(){return n.disable(n.BLEND)}),Li(n,function(){return n.disable(n.DITHER)}),Li(n,function(){return n.disable(n.POLYGON_OFFSET_FILL)}),Li(n,function(){return n.disable(n.SAMPLE_COVERAGE)}),Li(n,function(){return n.enable(n.SCISSOR_TEST)}),Li(n,function(){return n.enable(n.CULL_FACE)}),Li(n,function(){return n.cullFace(n.BACK)}),n}function va(t){return zi(t,"\n precision highp float;\n attribute vec3 clipSpacePos;\n attribute vec2 uv;\n varying vec2 resultUV;\n\n void main() {\n gl_Position = vec4(clipSpacePos, 1);\n resultUV = uv;\n }")}function ma(t){return Ki(t,new Float32Array([-1,1,0,0,1,-1,-1,0,0,0,1,1,0,1,1,1,-1,0,1,0]))}function ga(t){return Xi(t,new Uint16Array([0,1,2,2,1,3]))}function ya(t,n){var e,r,o,i,a,u,s,l=t;return 2===Xo.get("WEBGL_VERSION")?(e=l.R32F,r=l.R16F,o=l.RGBA32F,i=l.RED,a=4,u=1,s=l.HALF_FLOAT):(e=t.RGBA,r=t.RGBA,o=l.RGBA,i=t.RGBA,a=4,u=4,s=null!=n?n.HALF_FLOAT_OES:null),{internalFormatFloat:e,internalFormatHalfFloat:r,internalFormatPackedFloat:o,textureFormatFloat:i,downloadTextureFormat:t.RGBA,downloadUnpackNumChannels:a,defaultNumChannels:u,textureTypeHalfFloat:s}}function xa(t,n,e,r,o,i){Zi(t,n,e);var a=Ji(t),u=t.TEXTURE_2D;return Li(t,function(){return t.bindTexture(u,a)}),Li(t,function(){return t.texParameteri(u,t.TEXTURE_WRAP_S,t.CLAMP_TO_EDGE)}),Li(t,function(){return t.texParameteri(u,t.TEXTURE_WRAP_T,t.CLAMP_TO_EDGE)}),Li(t,function(){return t.texParameteri(u,t.TEXTURE_MIN_FILTER,t.NEAREST)}),Li(t,function(){return t.texParameteri(u,t.TEXTURE_MAG_FILTER,t.NEAREST)}),Li(t,function(){return t.texImage2D(u,0,r,n,e,0,o,i,null)}),Li(t,function(){return t.bindTexture(t.TEXTURE_2D,null)}),a}function wa(t,n,e,r){var o=ki(n,e);return xa(t,o[0],o[1],r.internalFormatFloat,r.textureFormatFloat,t.FLOAT)}function ba(t,n,e,r){var o=ki(n,e);return xa(t,o[0],o[1],r.internalFormatFloat,r.textureFormatFloat,r.textureTypeHalfFloat)}function Ea(t,n,e,r){var o=ki(n,e);return xa(t,o[0],o[1],t.RGBA,t.RGBA,t.UNSIGNED_BYTE)}function Sa(t,n,e,r){var o=Di(n,e);return xa(t,o[0],o[1],r.internalFormatPackedFloat,t.RGBA,t.FLOAT)}function Ra(t,n,e){return Li(t,function(){return t.bindBuffer(t.ARRAY_BUFFER,e)}),ta(t,n,"clipSpacePos",e,3,20,0)&&ta(t,n,"uv",e,2,20,12)}function Ca(t,n,e){Li(t,function(){return t.bindTexture(t.TEXTURE_2D,n)}),Li(t,function(){return t.texImage2D(t.TEXTURE_2D,0,t.RGBA,t.RGBA,t.UNSIGNED_BYTE,e)}),Li(t,function(){return t.bindTexture(t.TEXTURE_2D,null)})}function _a(t,n,e,r,o,i){Zi(t,e,r),Li(t,function(){return t.bindTexture(t.TEXTURE_2D,n)}),Li(t,function(){return t.texSubImage2D(t.TEXTURE_2D,0,0,0,e,r,i,t.FLOAT,o)}),Li(t,function(){return t.bindTexture(t.TEXTURE_2D,null)})}function ka(t,n,e,r,o,i,a){var u,s=ki(e,r),l=s[0],c=s[1];1===a.defaultNumChannels?u=o:function(t,n,e){var r=Ti(t.length,e);if(n.length= "+r);for(var o=0,i=0;i= "+o);for(var i=Di(n,e),a=i[0],u=i[1],s=e%2==1,l=n%2==1,c=Math.floor(e/2),f=Math.floor(n/2),h=s?4:0,p=e,d=0,v=0;v= "+o);for(var i=e%2==1,a=n%2==1,u=Math.floor(e/2),s=Math.floor(n/2),l=Di(n,e),c=l[0],f=l[1],h=i?4:0,p=e+(i?1:0),d=0,v=0,m=e,g=0;g>1;t[o]()?(r=o,n=o+1):e=o-1}return r}(this.itemsToPoll.map(function(t){return t.isDoneFn})),n=0;n<=t;++n)(0,this.itemsToPoll[n].resolveFn)();this.itemsToPoll=this.itemsToPoll.slice(t+1)},t.prototype.addItemToPoll=function(t,n){var e=this;this.itemsToPoll.push({isDoneFn:t,resolveFn:n}),this.itemsToPoll.length>1||S(function(){return e.pollItems(),0===e.itemsToPoll.length})},t.prototype.getQueryTime=function(t,n){if(0===n)return null;if(2===n){var e=this.gl;return e.getQueryParameter(t,e.QUERY_RESULT)/1e6}var r=this.getQueryTimerExtensionWebGL1();return r.getQueryObjectEXT(t,r.QUERY_RESULT_EXT)/1e6},t.prototype.downloadMatrixDriverSetup=function(t){this.throwIfDisposed(),ia(this.gl,t,this.framebuffer),this.autoDebugValidate&&ua(this.gl)},t.prototype.downloadMatrixDriverTeardown=function(){null!=this.outputTexture?(ia(this.gl,this.outputTexture,this.framebuffer),this.autoDebugValidate&&ua(this.gl)):aa(this.gl,this.framebuffer)},t.prototype.downloadMatrixDriver=function(t,n){this.downloadMatrixDriverSetup(t);var e=n();return this.downloadMatrixDriverTeardown(),e},t.prototype.downloadMatrixDriverAsync=function(t,n){return o(this,void 0,void 0,function(){var e;return i(this,function(r){switch(r.label){case 0:return this.downloadMatrixDriverSetup(t),[4,n()];case 1:return e=r.sent(),this.downloadMatrixDriverTeardown(),[2,e]}})})},t.prototype.setOutputMatrixTextureDriver=function(t,n,e){this.throwIfDisposed();var r=this.gl;ia(r,t,this.framebuffer),this.autoDebugValidate&&ua(r),this.outputTexture=t,Li(r,function(){return r.viewport(0,0,n,e)}),Li(r,function(){return r.scissor(0,0,n,e)})},t.prototype.setOutputMatrixWriteRegionDriver=function(t,n,e,r){var o=this;this.throwIfDisposed(),Li(this.gl,function(){return o.gl.scissor(t,n,e,r)})},t.prototype.throwIfDisposed=function(){if(this.disposed)throw new Error("Attempted to use disposed GPGPUContext.")},t.prototype.throwIfNoProgram=function(){if(null==this.program)throw new Error("No GPU program is currently set.")},t}();function La(t,n){if(t.length!==n.length)throw Error("Binary was compiled with "+t.length+" inputs, but was executed with "+n.length+" inputs");t.forEach(function(t,e){var r=t.logicalShape,o=n[e],i=o.tensor.shape;if(!y(r,i))throw Error("Binary was compiled with different shapes than the current args. Shapes "+r+" and "+i+" must match");if(!t.isUniform||!o.isUniform){var a=t.texShape,u=o.isUniform?null:o.texData.texShape;if(!y(a,u))throw Error("Binary was compiled with different texture shapes than the current args. Shape "+a+" and "+u+" must match")}})}var Fa=function(t,n,e){var r,o;if(this.variableNames=["c","a","b"],this.outputShape=n,e>4)throw Error("Where for rank "+e+" is not yet supported");if(1===e)o="resRC",r="resRC";else{for(var i=["resRC.x","resRC.y","resRC.z","resRC.w"],a=[],u=[],s=0;s= 1.0) {\n setOutput(getA("+o+"));\n } else {\n setOutput(getB("+o+"));\n }\n }\n "},Ba=function(t,n,e,r,o){this.variableNames=["x"],this.outputShape=[];var i,a=n,u=t[3]-1;this.outputShape=t;var s="float("+e+") + float("+r+") * sum";i=.5===o?"inversesqrt("+s+")":1===o?"1.0/("+s+")":"exp(log("+s+") * float(-"+o+"));",this.userCode="\n void main() {\n ivec4 coords = getOutputCoords();\n int b = coords[0];\n int r = coords[1];\n int c = coords[2];\n int d = coords[3];\n float x = getX(b, r, c, d);\n float sum = 0.0;\n for (int j = -"+a+"; j <= "+a+"; j++) {\n int idx = d + j;\n if (idx >= 0 && idx <= "+u+") {\n float z = getX(b, r, c, idx);\n sum += z * z;\n }\n }\n float val = x * "+i+";\n setOutput(val);\n }\n "},Pa=function(t){this.variableNames=["dy","maxPos"],this.outputShape=t.inShape;var n=t.filterHeight,e=t.filterWidth,r=t.strideHeight,o=t.strideWidth,i=n-1-t.padInfo.top,a=e-1-t.padInfo.left,u=n*e-1;this.userCode="\n const ivec2 pads = ivec2("+i+", "+a+");\n\n void main() {\n ivec4 coords = getOutputCoords();\n int b = coords[0];\n int d = coords[3];\n\n ivec2 dyRCCorner = coords.yz - pads;\n int dyRCorner = dyRCCorner.x;\n int dyCCorner = dyRCCorner.y;\n\n // Convolve dy(?, ?, d) with pos mask(:, :, d) to get dx(xR, xC, d).\n // ? = to be determined. : = across all values in that axis.\n float dotProd = 0.0;\n for (int wR = 0; wR < "+n+"; wR++) {\n float dyR = float(dyRCorner + wR) / "+r+".0;\n\n if (dyR < 0.0 || dyR >= "+t.outHeight+".0 || fract(dyR) > 0.0) {\n continue;\n }\n int idyR = int(dyR);\n\n for (int wC = 0; wC < "+e+"; wC++) {\n float dyC = float(dyCCorner + wC) / "+o+".0;\n\n if (dyC < 0.0 || dyC >= "+t.outWidth+".0 ||\n fract(dyC) > 0.0) {\n continue;\n }\n int idyC = int(dyC);\n\n float dyValue = getDy(b, idyR, idyC, d);\n int maxPosValue = "+u+" - int(getMaxPos(b, idyR, idyC, d));\n\n // Get the current value, check it against the value from the\n // position matrix.\n int curPosValue = wR * "+e+" + wC;\n float mask = float(maxPosValue == curPosValue ? 1.0 : 0.0);\n\n dotProd += dyValue * mask;\n }\n }\n setOutput(dotProd);\n }\n "},Ua=function(t,n,e,r){void 0===e&&(e=!1),void 0===r&&(r=!1),this.variableNames=["matrixA","matrixB"];var o=e?t[1]:t[0],i=r?n[0]:n[1],a=e?t[0]:t[1];this.outputShape=[o,i];var u=function(t,n){return e?n+" + "+t+", aRow":"aRow, "+n+" + "+t},s=function(t,n){return r?"bCol, "+n+" + "+t:n+" + "+t+", bCol"},l=4*Math.floor(a/4),c=a%4;this.userCode=" float dotARowBCol(int aRow, int bCol) {\n float result = 0.0;\n for (int i = 0; i < "+l+"; i += 4) {\n vec4 a = vec4(\n getMatrixA("+u(0,"i")+"),\n getMatrixA("+u(1,"i")+"),\n getMatrixA("+u(2,"i")+"),\n getMatrixA("+u(3,"i")+")\n );\n vec4 b = vec4(\n getMatrixB("+s(0,"i")+"),\n getMatrixB("+s(1,"i")+"),\n getMatrixB("+s(2,"i")+"),\n getMatrixB("+s(3,"i")+")\n );\n\n result += dot(a, b);\n }\n\n if ("+(1===c)+") {\n result += getMatrixA("+u(0,l)+") *\n getMatrixB("+s(0,l)+");\n } else if ("+(2===c)+") {\n vec2 a = vec2(\n getMatrixA("+u(0,l)+"),\n getMatrixA("+u(1,l)+")\n );\n vec2 b = vec2(\n getMatrixB("+s(0,l)+"),\n getMatrixB("+s(1,l)+")\n );\n result += dot(a, b);\n } else if ("+(3===c)+") {\n vec3 a = vec3(\n getMatrixA("+u(0,l)+"),\n getMatrixA("+u(1,l)+"),\n getMatrixA("+u(2,l)+")\n );\n vec3 b = vec3(\n getMatrixB("+s(0,l)+"),\n getMatrixB("+s(1,l)+"),\n getMatrixB("+s(2,l)+")\n );\n result += dot(a, b);\n }\n\n return result;\n }\n\n void main() {\n ivec2 resRC = getOutputCoords();\n setOutput(dotARowBCol(resRC.x, resRC.y));\n }\n "},Wa=function(){function t(t,n,e){this.variableNames=["probs"],this.outputShape=[t,e],this.userCode="\n uniform float seed;\n\n void main() {\n ivec2 coords = getOutputCoords();\n int batch = coords[0];\n\n float r = random(seed);\n float cdf = 0.0;\n\n for (int i = 0; i < "+(n-1)+"; i++) {\n cdf += getProbs(batch, i);\n\n if (r < cdf) {\n setOutput(float(i));\n return;\n }\n }\n\n // If no other event happened, last event happened.\n setOutput(float("+(n-1)+"));\n }\n "}return t.prototype.getCustomSetupFunc=function(t){var n=this;return function(e,r){null==n.seedLoc&&(n.seedLoc=e.getUniformLocation(r,"seed")),e.gl.uniform1f(n.seedLoc,t)}},t}(),za=function(t,n,e,r){this.variableNames=["indices"],this.outputShape=[t,n],this.userCode="\n void main() {\n ivec2 coords = getOutputCoords();\n int index = round(getIndices(coords.x));\n setOutput(mix(float("+r+"), float("+e+"),\n float(index == coords.y)));\n }\n "},Va=function(t,n,e){this.variableNames=["x"],this.outputShape=n.map(function(n,e){return n[0]+t[e]+n[1]});var r=t.length,o=gi(r),i=n.map(function(t){return t[0]}).join(","),a=n.map(function(n,e){return n[0]+t[e]}).join(","),u=["coords[0]","coords[1]","coords[2]","coords[3]"].slice(0,r);this.userCode=1!==r?"\n "+o+" start = "+o+"("+i+");\n "+o+" end = "+o+"("+a+");\n\n void main() {\n "+o+" outC = getOutputCoords();\n if (any(lessThan(outC, start)) || any(greaterThanEqual(outC, end))) {\n setOutput(float("+e+"));\n } else {\n "+o+" coords = outC - start;\n setOutput(getX("+u+"));\n }\n }\n ":"\n int start = "+i+";\n int end = "+a+";\n\n void main() {\n int outC = getOutputCoords();\n if (outC < start || outC >= end) {\n setOutput(float("+e+"));\n } else {\n setOutput(getX(outC - start));\n }\n }\n "},Ga=function(t,n,e){if(this.variableNames=["x"],"avg"===n&&e)throw new Error("Cannot compute positions for average pool.");var r=t.filterHeight,o=t.filterWidth,i=t.strideHeight,a=t.strideWidth,u=t.padInfo.top,s=t.padInfo.left;this.outputShape=t.outShape;var l="avg"===n,c="0.0";if(l||(c="-1.0 / 0.0"),e)this.userCode="\n const ivec2 strides = ivec2("+i+", "+a+");\n const ivec2 pads = ivec2("+u+", "+s+");\n\n void main() {\n ivec4 coords = getOutputCoords();\n int batch = coords[0];\n int d = coords[3];\n\n ivec2 xRCCorner = coords.yz * strides - pads;\n int xRCorner = xRCCorner.x;\n int xCCorner = xRCCorner.y;\n\n // max/min x(?, ?, d) to get y(yR, yC, d).\n // ? = to be determined\n float minMaxValue = 0.0;\n float minMaxValueFound = 0.0;\n int minMaxPosition = 0;\n float avgValue = 0.0;\n\n for (int wR = 0; wR < "+r+"; wR++) {\n int xR = xRCorner + wR;\n\n if (xR < 0 || xR >= "+t.inHeight+") {\n continue;\n }\n\n for (int wC = 0; wC < "+o+"; wC++) {\n int xC = xCCorner + wC;\n\n if (xC < 0 || xC >= "+t.inWidth+") {\n continue;\n }\n\n float value = getX(batch, xR, xC, d);\n\n // If a min / max value has already been found, use it. If not,\n // use the current value.\n float currMinMaxValue = mix(\n value, minMaxValue, minMaxValueFound);\n if (value >= currMinMaxValue) {\n minMaxValue = value;\n minMaxValueFound = 1.0;\n minMaxPosition = wR * "+o+" + wC;\n }\n }\n }\n setOutput(float(minMaxPosition));\n }\n ";else{var f=n+"("+n+"("+n+"(minMaxValue[0], minMaxValue[1]), minMaxValue[2]), minMaxValue[3])";"avg"===n&&(f="avgValue / count");var h=4*Math.floor(o/4),p=o%4,d="\n if ("+l+") {\n avgValue += dot(values, ones);\n } else {\n minMaxValue = max(values, minMaxValue);\n }\n ";this.userCode="\n const ivec2 strides = ivec2("+i+", "+a+");\n const ivec2 pads = ivec2("+u+", "+s+");\n const float initializationValue = "+c+";\n const vec4 ones = vec4(1.0, 1.0, 1.0, 1.0);\n\n float count = 0.0;\n\n float getValue(int batch, int xR, int xC, int d) {\n if (xC < 0 || xC >= "+t.inWidth+") {\n return initializationValue;\n }\n count += 1.0;\n return getX(batch, xR, xC, d);\n }\n\n void main() {\n ivec4 coords = getOutputCoords();\n int batch = coords[0];\n int d = coords[3];\n\n ivec2 xRCCorner = coords.yz * strides - pads;\n int xRCorner = xRCCorner.x;\n int xCCorner = xRCCorner.y;\n\n // max/min x(?, ?, d) to get y(yR, yC, d).\n // ? = to be determined\n vec4 minMaxValue = vec4("+c+");\n float avgValue = 0.0;\n count = 0.0;\n\n for (int wR = 0; wR < "+r+"; wR++) {\n int xR = xRCorner + wR;\n\n if (xR < 0 || xR >= "+t.inHeight+") {\n continue;\n }\n\n for (int wC = 0; wC < "+h+"; wC += 4) {\n int xC = xCCorner + wC;\n\n vec4 values = vec4(\n getValue(batch, xR, xC, d),\n getValue(batch, xR, xC + 1, d),\n getValue(batch, xR, xC + 2, d),\n getValue(batch, xR, xC + 3, d)\n );\n\n "+d+"\n }\n\n int xC = xCCorner + "+h+";\n if ("+(1===p)+") {\n vec4 values = vec4(\n getValue(batch, xR, xC, d),\n initializationValue,\n initializationValue,\n initializationValue\n );\n\n "+d+"\n } else if ("+(2===p)+") {\n vec4 values = vec4(\n getValue(batch, xR, xC, d),\n getValue(batch, xR, xC + 1, d),\n initializationValue,\n initializationValue\n );\n\n "+d+"\n } else if ("+(3===p)+") {\n vec4 values = vec4(\n getValue(batch, xR, xC, d),\n getValue(batch, xR, xC + 1, d),\n getValue(batch, xR, xC + 2, d),\n initializationValue\n );\n\n "+d+"\n }\n }\n setOutput("+f+");\n }\n "}},qa=function(t,n){this.variableNames=["x"];var e=t.windowSize,r=t.batchSize,o=t.inSize,i=Math.ceil(o/e);this.outputShape=[r,i];var a="0.0",u="";"min"===n?(a="1.0 / 0.0",u="min"):"max"===n&&(a="-1.0 / 0.0",u="max");var s=n+"("+n+"("+n+"(minMaxValue[0], minMaxValue[1]), minMaxValue[2]), minMaxValue[3])";"sum"===n?s="sumValue":"all"===n&&(s="allValue");var l=4*Math.floor(e/4),c=e%4,f="\n if ("+("sum"===n)+") {\n sumValue += dot(values, ones);\n } else {\n minMaxValue = "+u+"(values, minMaxValue);\n }\n ",h="vec4";"all"===n&&(a="1.0",f="\n bool reducedAllValue = all(values);\n float floatedReducedAllValue = float(reducedAllValue);\n allValue = float(allValue >= 1.0 && floatedReducedAllValue >= 1.0);\n ",h="bvec4");var p="";o%e>0&&(p="\n if (inIdx < 0 || inIdx >= "+o+") {\n return initializationValue;\n }\n "),this.userCode="\n const float initializationValue = "+a+";\n const vec4 ones = vec4(1.0, 1.0, 1.0, 1.0);\n\n float getValue(int batch, int inIdx) {\n "+p+"\n return getX(batch, inIdx);\n }\n\n void main() {\n ivec2 coords = getOutputCoords();\n int batch = coords[0];\n int outIdx = coords[1];\n int inOffset = outIdx * "+e+";\n\n vec4 minMaxValue = vec4("+a+");\n float sumValue = 0.0;\n float allValue = 1.0;\n\n for (int i = 0; i < "+l+"; i += 4) {\n int inIdx = inOffset + i;\n "+h+" values = "+h+"(\n getValue(batch, inIdx),\n getValue(batch, inIdx + 1),\n getValue(batch, inIdx + 2),\n getValue(batch, inIdx + 3)\n );\n\n "+f+"\n }\n\n int inIdx = inOffset + "+l+";\n if ("+(1===c)+") {\n "+h+" values = "+h+"(\n getValue(batch, inIdx),\n initializationValue,\n initializationValue,\n initializationValue\n );\n\n "+f+"\n } else if ("+(2===c)+") {\n "+h+" values = "+h+"(\n getValue(batch, inIdx),\n getValue(batch, inIdx + 1),\n initializationValue,\n initializationValue\n );\n\n "+f+"\n } else if ("+(3===c)+") {\n "+h+" values = "+h+"(\n getValue(batch, inIdx),\n getValue(batch, inIdx + 1),\n getValue(batch, inIdx + 2),\n initializationValue\n );\n\n "+f+"\n }\n setOutput("+s+");\n }\n "},Ha=function(t,n,e){this.variableNames=["dy"],this.outputShape=[],this.outputShape=n.shape;var r=n.shape,o=r[1],i=r[2],a=t.shape,u=a[1],s=a[2],l=[e&&u>1?o-1:o,e&&s>1?i-1:i],c=[e&&u>1?u-1:u,e&&s>1?s-1:s],f=l[0]/c[0],h=l[1]/c[1],p=1/f,d=1/h,v=2*Math.ceil(p)+2,m=2*Math.ceil(d)+2;this.userCode="\n void main() {\n ivec4 coords = getOutputCoords();\n int b = coords[0];\n int d = coords[3];\n int r = coords[1];\n int c = coords[2];\n\n float accumulator = 0.0;\n\n const float heightScale = float("+f+");\n const float widthScale = float("+h+");\n\n const float invHeightScale = float("+p+");\n const float invWidthScale = float("+d+");\n\n const int winHeight = int("+v+");\n const int winWidth = int("+m+");\n\n // Compute bounds for where in dy we will look\n float startRLerp = floor(float(r) * invHeightScale);\n int startDyR = int(startRLerp - float(winHeight / 2));\n\n float startCLerp = floor(float(c) * invWidthScale);\n int startDyC = int(startCLerp - float(winWidth / 2));\n\n // Loop over dy\n for (int dyROffset = 0; dyROffset < winHeight; dyROffset++) {\n int dyR = dyROffset + startDyR;\n\n // Guard against the window exceeding the bounds of dy\n if (dyR < 0 || dyR >= "+u+") {\n continue;\n }\n\n for (int dyCOffset = 0; dyCOffset < winWidth; dyCOffset++) {\n int dyC = dyCOffset + startDyC;\n\n // Guard against the window exceeding the bounds of dy\n if (dyC < 0 || dyC >= "+s+") {\n continue;\n }\n\n float dxR = float(dyR) * heightScale;\n int topDxRIndex = int(floor(dxR));\n int bottomDxRIndex = int(min(ceil(dxR), "+(o-1)+".0));\n float dxRLerp = dxR - float(topDxRIndex);\n float inverseDxRLerp = 1.0 - dxRLerp;\n\n float dxC = float(dyC) * widthScale;\n int leftDxCIndex = int(floor(dxC));\n int rightDxCIndex = int(min(ceil(dxC), "+(i-1)+".0));\n float dxCLerp = dxC - float(leftDxCIndex);\n float inverseDxCLerp = 1.0 - dxCLerp;\n\n if (r == topDxRIndex && c == leftDxCIndex) {\n // topLeft\n accumulator +=\n getDy(b, dyR, dyC, d) * inverseDxRLerp * inverseDxCLerp;\n }\n\n if (r == topDxRIndex && c == rightDxCIndex) {\n // topRight\n accumulator += getDy(b, dyR, dyC, d) * inverseDxRLerp * dxCLerp;\n }\n\n if (r == bottomDxRIndex && c == leftDxCIndex) {\n // bottomLeft\n accumulator += getDy(b, dyR, dyC, d) * dxRLerp * inverseDxCLerp;\n }\n\n if (r == bottomDxRIndex && c == rightDxCIndex) {\n // bottomRight\n accumulator += getDy(b, dyR, dyC, d) * dxRLerp * dxCLerp;\n }\n }\n }\n // End loop over dy\n\n setOutput(accumulator);\n }\n "},ja=function(t,n,e,r){this.variableNames=["A"],this.outputShape=[];var o=t[0],i=t[1],a=t[2],u=t[3];this.outputShape=[o,n,e,u];var s=[r&&n>1?i-1:i,r&&e>1?a-1:a],l=[r&&n>1?n-1:n,r&&e>1?e-1:e];this.userCode="\n const vec2 effectiveInputOverOutputRatioRC = vec2(\n "+s[0]/l[0]+",\n "+s[1]/l[1]+");\n const vec2 inputShapeRC = vec2("+i+".0, "+a+".0);\n\n void main() {\n ivec4 coords = getOutputCoords();\n int b = coords[0];\n int d = coords[3];\n ivec2 yRC = coords.yz;\n\n // Fractional source index.\n vec2 sourceFracIndexRC = vec2(yRC) * effectiveInputOverOutputRatioRC;\n\n // Compute the four integer indices.\n ivec2 sourceFloorRC = ivec2(sourceFracIndexRC);\n ivec2 sourceCeilRC = ivec2(\n min(inputShapeRC - 1.0, ceil(sourceFracIndexRC)));\n\n float topLeft = getA(b, sourceFloorRC.x, sourceFloorRC.y, d);\n float bottomLeft = getA(b, sourceCeilRC.x, sourceFloorRC.y, d);\n float topRight = getA(b, sourceFloorRC.x, sourceCeilRC.y, d);\n float bottomRight = getA(b, sourceCeilRC.x, sourceCeilRC.y, d);\n\n vec2 fracRC = sourceFracIndexRC - vec2(sourceFloorRC);\n\n float top = topLeft + (topRight - topLeft) * fracRC.y;\n float bottom = bottomLeft + (bottomRight - bottomLeft) * fracRC.y;\n float newValue = top + (bottom - top) * fracRC.x;\n\n setOutput(newValue);\n }\n "},Ka=function(t,n,e,r){this.variableNames=["A"],this.outputShape=[];var o=t[0],i=t[1],a=t[2],u=t[3];this.outputShape=[o,n,e,u];var s=r?[i-1,a-1]:[i,a],l=r?[n-1,e-1]:[n,e],c=r?"0.5":"0.0";this.userCode="\n const vec2 effectiveInputOverOutputRatioRC = vec2(\n "+s[0]/l[0]+",\n "+s[1]/l[1]+");\n const vec2 inputShapeRC = vec2("+i+".0, "+a+".0);\n\n void main() {\n ivec4 coords = getOutputCoords();\n int b = coords[0];\n int d = coords[3];\n ivec2 yRC = coords.yz;\n\n // Fractional source index.\n vec2 sourceFracIndexRC = vec2(yRC) * effectiveInputOverOutputRatioRC;\n\n // Compute the coordinators of nearest neighbor point.\n ivec2 sourceNearestRC = ivec2(\n min(inputShapeRC - 1.0, floor(sourceFracIndexRC + "+c+")));\n\n float newValue = getA(b, sourceNearestRC.x, sourceNearestRC.y, d);\n\n setOutput(newValue);\n }\n "},Xa=function(t,n){this.variableNames=["x"];var e=t.length;if(e>4)throw new Error("WebGL backend: Reverse of rank-"+e+" tensor is not yet supported");if(this.outputShape=t,1!==e){var r=t.map(function(e,r){return function(e){return-1!==n.indexOf(e)&&1!==t[e]?t[e]+" - coords["+e+"] - 1":"coords["+e+"]"}(r)}).join(","),o=gi(e);this.userCode="\n void main() {\n "+o+" coords = getOutputCoords();\n setOutput(getX("+r+"));\n }\n "}else this.userCode="\n void main() {\n int coord = getOutputCoords();\n setOutput(getX("+t[0]+" - coord - 1));\n }\n "},Qa=function(t,n){this.variableNames=["x","segmentIds"];var e=t.windowSize,r=t.batchSize,o=t.inSize,i=t.numSegments,a=i*Math.ceil(o/e);this.outputShape=[r,a];var u=4*Math.floor(e/4),s=e%4,l="\n sumValue += dot(values, filter);\n ",c="";o%e>0&&(c="\n if (inIdx < 0 || inIdx >= "+o+") {\n return initializationValue;\n }\n ");var f="";o%e>0&&(f="\n if (inIdx < 0 || inIdx >= "+o+") {\n return -1.0;\n }\n "),this.userCode="\n const float initializationValue = 0.0;\n\n float getValue(int batch, int inIdx) {\n "+c+"\n return getX(batch, inIdx);\n }\n\n float getSegmentIdAtIndex(int inIdx) {\n "+f+"\n return getSegmentIds(inIdx);\n }\n\n void main() {\n ivec2 coords = getOutputCoords();\n int batch = coords[0];\n int outIdx = coords[1];\n int inOffset = int(floor(float(outIdx) / float(\n "+i+")) * float("+e+"));\n int currentSeg = int(mod(float(outIdx), float("+i+")));\n\n float sumValue = 0.0;\n\n for (int i = 0; i < "+u+"; i += 4) {\n int inIdx = inOffset + i;\n vec4 values = vec4(\n getValue(batch, inIdx),\n getValue(batch, inIdx + 1),\n getValue(batch, inIdx + 2),\n getValue(batch, inIdx + 3)\n );\n\n vec4 filter = vec4(\n int(getSegmentIdAtIndex(inIdx)) == currentSeg ? 1 : 0,\n int(getSegmentIdAtIndex(inIdx + 1)) == currentSeg ? 1 : 0,\n int(getSegmentIdAtIndex(inIdx + 2)) == currentSeg ? 1 : 0,\n int(getSegmentIdAtIndex(inIdx + 3)) == currentSeg ? 1 : 0\n );\n\n "+l+"\n }\n\n int inIdx = inOffset + "+u+";\n if ("+(1===s)+") {\n vec4 values = vec4(\n getValue(batch, inIdx),\n initializationValue,\n initializationValue,\n initializationValue\n );\n\n int inIdxSeg = int(getSegmentIdAtIndex(inIdx));\n\n vec4 filter = vec4(\n int(getSegmentIdAtIndex(inIdx)) == currentSeg ? 1 : 0,\n 0,\n 0,\n 0\n );\n\n "+l+"\n } else if ("+(2===s)+") {\n vec4 values = vec4(\n getValue(batch, inIdx),\n getValue(batch, inIdx + 1),\n initializationValue,\n initializationValue\n );\n\n vec4 filter = vec4(\n int(getSegmentIdAtIndex(inIdx)) == currentSeg ? 1 : 0,\n int(getSegmentIdAtIndex(inIdx + 1)) == currentSeg ? 1 : 0,\n 0,\n 0\n );\n\n "+l+"\n } else if ("+(3===s)+") {\n vec4 values = vec4(\n getValue(batch, inIdx),\n getValue(batch, inIdx + 1),\n getValue(batch, inIdx + 2),\n initializationValue\n );\n\n vec4 filter = vec4(\n int(getSegmentIdAtIndex(inIdx)) == currentSeg ? 1 : 0,\n int(getSegmentIdAtIndex(inIdx + 1)) == currentSeg ? 1 : 0,\n int(getSegmentIdAtIndex(inIdx + 2)) == currentSeg ? 1 : 0,\n 0\n );\n\n "+l+"\n }\n setOutput(sumValue);\n }\n "},Ya=function(){function t(t){this.variableNames=["source"],this.outputShape=t,this.rank=t.length;var n=gi(this.rank),e=function(t){if(1===t)return"sourceLoc";if(2===t)return"sourceLoc.x, sourceLoc.y";if(3===t)return"sourceLoc.x, sourceLoc.y, sourceLoc.z";if(4===t)return"sourceLoc.x, sourceLoc.y, sourceLoc.z, sourceLoc.w";throw Error("Slicing for rank "+t+" is not yet supported")}(this.rank);this.userCode="\n uniform "+n+" start;\n\n void main() {\n "+n+" sourceLoc = start + getOutputCoords();\n setOutput(getSource("+e+"));\n }\n "}return t.prototype.getCustomSetupFunc=function(t){var n=this;if(t.length!==this.rank)throw Error("The rank ("+this.rank+") of the program must match the length of start ("+t.length+")");return function(e,r){if(null!=n.startLoc||(n.startLoc=e.getUniformLocationNoThrow(r,"start"),null!=n.startLoc))if(1===n.rank)e.gl.uniform1i(n.startLoc,t[0]);else if(2===n.rank)e.gl.uniform2i(n.startLoc,t[0],t[1]);else if(3===n.rank)e.gl.uniform3i(n.startLoc,t[0],t[1],t[2]);else{if(4!==n.rank)throw Error("Slicing for rank "+n.rank+" is not yet supported");e.gl.uniform4i(n.startLoc,t[0],t[1],t[2],t[3])}}},t}();var Ja=function(t,n,e){this.variableNames=["x"],this.outputShape=e,this.rank=e.length;var r,o=gi(this.rank);r=1===this.rank?"coords * strides + begin":e.map(function(t,n){return"coords["+n+"] * strides["+n+"] + begin["+n+"]"}).join(","),this.userCode="\n "+o+" begin = "+o+"("+t+");\n "+o+" strides = "+o+"("+n+");\n\n void main() {\n "+o+" coords = getOutputCoords();\n setOutput(getX("+r+"));\n }\n "},Za=function(){function t(t){this.gpgpu=t,this.numUsedTextures=0,this.numFreeTextures=0,this.freeTextures={},this.logEnabled=!1,this.usedTextures={}}return t.prototype.acquireTexture=function(t,n){var e,r=$a(n),o=tu(t,r);if(o in this.freeTextures||(this.freeTextures[o]=[]),o in this.usedTextures||(this.usedTextures[o]=[]),this.freeTextures[o].length>0){this.numFreeTextures--,this.numUsedTextures++,this.log();var i=this.freeTextures[o].shift();return this.usedTextures[o].push(i),i}return this.numUsedTextures++,this.log(),r===Si.FLOAT32?e=this.gpgpu.createFloat32MatrixTexture(t[0],t[1]):r===Si.FLOAT16?e=this.gpgpu.createFloat16MatrixTexture(t[0],t[1]):r===Si.UNSIGNED_BYTE&&(e=this.gpgpu.createUnsignedBytesMatrixTexture(t[0],t[1])),this.usedTextures[o].push(e),e},t.prototype.releaseTexture=function(t,n,e){var r=tu(n,$a(e));r in this.freeTextures||(this.freeTextures[r]=[]),this.freeTextures[r].push(t),this.numFreeTextures++,this.numUsedTextures--;var o=this.usedTextures[r],i=o.indexOf(t);if(i<0)throw new Error("Cannot release a texture that was never provided by this texture manager");o.splice(i,1),this.log()},t.prototype.log=function(){if(this.logEnabled){var t=this.numFreeTextures+this.numUsedTextures;console.log("Free/Used",this.numFreeTextures+" / "+this.numUsedTextures,"("+t+")")}},t.prototype.getNumUsedTextures=function(){return this.numUsedTextures},t.prototype.getNumFreeTextures=function(){return this.numFreeTextures},t.prototype.dispose=function(){var t=this;if(null!=this.freeTextures){for(var n in this.freeTextures)this.freeTextures[n].forEach(function(n){t.gpgpu.deleteMatrixTexture(n)});for(var n in this.usedTextures)this.usedTextures[n].forEach(function(n){t.gpgpu.deleteMatrixTexture(n)});this.freeTextures=null,this.usedTextures=null,this.numUsedTextures=0,this.numFreeTextures=0}},t}();function $a(t){if(t===Ei.DOWNLOAD||t===Ei.PIXELS)return Si.UNSIGNED_BYTE;if(t===Ei.UPLOAD)return Si.FLOAT32;if(t===Ei.RENDER)return Xo.get("WEBGL_RENDER_FLOAT32_ENABLED")?Si.FLOAT32:Si.FLOAT16;throw new Error("Unknown logical texture type "+t)}function tu(t,n){return t[0]+"_"+t[1]+"_"+n}var nu=function(t,n){this.variableNames=["A"];for(var e=new Array(t.length),r=0;r5)throw Error("Tile for rank "+n+" is not yet supported");if(1===n)return"imod(resRC, "+t[0]+")";for(var e=["resRC.x","resRC.y","resRC.z","resRC.w","resRC.u"],r=[],o=0;o6)throw Error("Transpose for rank "+n+" is not yet supported");for(var e=["resRC.x","resRC.y","resRC.z","resRC.w","resRC.u","resRC.v"],r=new Array(n),o=0;o0?this.gpgpu.beginQuery():{startMs:performance.now(),endMs:null}},t.prototype.endTimer=function(t){return Xo.get("WEBGL_DISJOINT_QUERY_TIMER_EXTENSION_VERSION")>0?(this.gpgpu.endQuery(),t):(t.endMs=performance.now(),t)},t.prototype.getQueryTime=function(t){return o(this,void 0,void 0,function(){var n;return i(this,function(e){return Xo.get("WEBGL_DISJOINT_QUERY_TIMER_EXTENSION_VERSION")>0?[2,this.gpgpu.pollQueryTime(t)]:[2,(n=t).endMs-n.startMs]})})},t.prototype.disposeData=function(t){if(!this.pendingDisposal.has(t))if(this.pendingRead.has(t))this.pendingDisposal.add(t);else if(this.texData.has(t)){var n=this.texData.get(t),e=n.texture,r=n.texShape,o=n.usage;null!=e&&this.releaseTexture(t,e,r,o),this.texData.delete(t)}},t.prototype.getTexture=function(t){return this.uploadToGPU(t),this.texData.get(t).texture},t.prototype.getGPGPUContext=function(){return this.gpgpu},t.prototype.getCanvas=function(){return this.canvas},t.prototype.slice=function(t,n,e){var r=new Ya(e),o=r.getCustomSetupFunc(n);return this.compileAndRun(r,[t],null,o)},t.prototype.stridedSlice=function(t,n,e,r,o,i){var a=nn(t.shape,n,e,r,o,i),u=a[0],s=a[1];if(s.some(function(t){return 0===t}))return Gr([],s);var l=new Ja(u,r,s);return this.compileAndRun(l,[t])},t.prototype.reverse=function(t,n){var e=new Xa(t.shape,n);return this.compileAndRun(e,[t])},t.prototype.concat=function(t,n){var e=new ii(t.shape,n.shape);return this.compileAndRun(e,[t,n])},t.prototype.neg=function(t){var n=new ru(t.shape,"return -x;");return this.compileAndRun(n,[t])},t.prototype.matMul=function(t,n,e,r){var o=new Ua(t.shape,n.shape,e,r);return this.compileAndRun(o,[t,n])},t.prototype.multiply=function(t,n){var e=new ri("return a * b;",t.shape,n.shape),r=this.makeOutputArray(e.outputShape,yt(t.dtype,n.dtype));return this.compileAndRun(e,[t,n],r)},t.prototype.batchNormalization=function(t,n,e,r,o,i){var a=[t,n,e],u=null;null!=i&&(u=i.shape,a.push(i));var s=null;null!=o&&(s=o.shape,a.push(o));var l=new ei(t.shape,n.shape,e.shape,u,s,r);return this.compileAndRun(l,a)},t.prototype.localResponseNormalization4D=function(t,n,e,r,o){var i=new Ba(t.shape,n,e,r,o);return this.compileAndRun(i,[t])},t.prototype.tile=function(t,n){var e=new nu(t.shape,n);return this.compileAndRun(e,[t])},t.prototype.pad=function(t,n,e){var r=new Va(t.shape,n,e);return this.compileAndRun(r,[t])},t.prototype.transpose=function(t,n){var e=new eu(t.shape,n);return this.compileAndRun(e,[t])},t.prototype.gather=function(t,n,e){var r=new _i(t.shape,n.size,e);return this.compileAndRun(r,[t,n])},t.prototype.reduce=function(t,n,e){var r=t.shape[0],o=t.shape[1],i=Jo(o),a=new qa({windowSize:i,inSize:o,batchSize:r},n),u=a.outputShape,s=u[0],l=u[1],c=this.makeOutputArray([s,l],e);return this.compileAndRun(a,[t],c),1===c.shape[1]?c:this.reduce(c,n,e)},t.prototype.argReduce=function(t,n,e){void 0===e&&(e=null);var r=t.shape[0],o=t.shape[1];null!=e&&(r=e.shape[0],o=e.shape[1]);var i=Jo(o),a=new ti({windowSize:i,inSize:o,batchSize:r},n,null==e),u=a.outputShape,s=u[0],l=u[1],c=this.makeOutputArray([s,l],"int32"),f=[t];return null!=e&&f.push(e),this.compileAndRun(a,f,c),1===c.shape[1]?c:this.argReduce(t,n,c)},t.prototype.sum=function(t,n){K("sum",n,t.rank);var e=q(t.shape,n),r=e[0],o=g(e[1]),i=t.as2D(-1,o),a=xt(t.dtype);return this.reduce(i,"sum",a).reshape(r)},t.prototype.unsortedSegmentSum=function(t,n,e){var r=0,o=X([r],t.rank),i=t;null!=o&&(i=t.transpose(o),r=Y(1,t.rank)[0]);var a=function(t,n,e){for(var r=[],o=t.length,i=0;in||e===t){r=!0;break}e=F(t,e+1)}return e}(a,o),s=new Qa({windowSize:u,inSize:a,batchSize:i,numSegments:o},n),l=s.outputShape,c=l[0],f=l[1],h=this.makeOutputArray([c,f],r);return this.compileAndRun(s,[t,e],h),h.shape[1]===o?h:(e=Wr(0,o).tile([a/u]),this.segOpCompute(h,n,e,r,o))},t.prototype.argMin=function(t,n){var e=[n];K("argMin",e,t.rank);var r=q(t.shape,e),o=r[0],i=g(r[1]),a=t.as2D(-1,i);return this.argReduce(a,"min").reshape(o)},t.prototype.argMax=function(t,n){var e=[n];K("argMax",e,t.rank);var r=q(t.shape,e),o=r[0],i=g(r[1]),a=t.as2D(-1,i);return this.argReduce(a,"max").reshape(o)},t.prototype.cumsum=function(t,n,e,r){if(n!==t.rank-1)throw new Error("WebGL cumsum shader expects an inner-most axis="+(t.rank-1)+" but got axis="+n);var o=new wi(t.shape,e,r);return this.compileAndRun(o,[t])},t.prototype.equal=function(t,n){var e=new ri("return float(a == b);",t.shape,n.shape),r=this.makeOutputArray(e.outputShape,"bool");return this.compileAndRun(e,[t,n],r)},t.prototype.notEqual=function(t,n){var e=new ri("return float(a != b);",t.shape,n.shape),r=this.makeOutputArray(e.outputShape,"bool");return this.compileAndRun(e,[t,n],r)},t.prototype.less=function(t,n){var e=new ri("return float(a < b);",t.shape,n.shape),r=this.makeOutputArray(e.outputShape,"bool");return this.compileAndRun(e,[t,n],r)},t.prototype.lessEqual=function(t,n){var e=new ri("return float(a <= b);",t.shape,n.shape),r=this.makeOutputArray(e.outputShape,"bool");return this.compileAndRun(e,[t,n],r)},t.prototype.greater=function(t,n){var e=new ri("return float(a > b);",t.shape,n.shape),r=this.makeOutputArray(e.outputShape,"bool");return this.compileAndRun(e,[t,n],r)},t.prototype.greaterEqual=function(t,n){var e=new ri("return float(a >= b);",t.shape,n.shape),r=this.makeOutputArray(e.outputShape,"bool");return this.compileAndRun(e,[t,n],r)},t.prototype.logicalNot=function(t){var n=new ru(t.shape,"return float(!(x >= 1.0));");return this.compileAndRun(n,[t])},t.prototype.logicalAnd=function(t,n){var e=new ri("return float(a >= 1.0 && b >= 1.0);",t.shape,n.shape),r=this.makeOutputArray(e.outputShape,"bool");return this.compileAndRun(e,[t,n],r)},t.prototype.logicalOr=function(t,n){var e=new ri("return float(a >= 1.0 || b >= 1.0);",t.shape,n.shape),r=this.makeOutputArray(e.outputShape,"bool");return this.compileAndRun(e,[t,n],r)},t.prototype.where=function(t,n,e,r){var o=new Fa(t.rank,n.shape,n.rank),i=this.makeOutputArray(o.outputShape,r);return this.compileAndRun(o,[t,n,e],i)},t.prototype.topKValues=function(t,n){throw new Error("topKValues GPU not yet implemented!")},t.prototype.topKIndices=function(t,n){throw new Error("topKIndices GPU not yet implemented!")},t.prototype.min=function(t,n){K("min",n,t.rank);var e=q(t.shape,n),r=e[0],o=g(e[1]),i=t.as2D(-1,o);return this.reduce(i,"min",i.dtype).reshape(r)},t.prototype.minimum=function(t,n){var e=new ri("\n if (isNaN(a)) return a;\n if (isNaN(b)) return b;\n\n return min(a, b);\n",t.shape,n.shape);return this.compileAndRun(e,[t,n])},t.prototype.mod=function(t,n){var e=new ri("return mod(a, b);",t.shape,n.shape);return this.compileAndRun(e,[t,n])},t.prototype.max=function(t,n){K("max",n,t.rank);var e=q(t.shape,n),r=e[0],o=g(e[1]),i=t.as2D(-1,o);return this.reduce(i,"max",i.dtype).reshape(r)},t.prototype.maximum=function(t,n){var e=new ri("\n if (isNaN(a)) return a;\n if (isNaN(b)) return b;\n\n return max(a, b);\n",t.shape,n.shape);return this.compileAndRun(e,[t,n])},t.prototype.all=function(t,n){K("all",n,t.rank);var e=q(t.shape,n),r=e[0],o=g(e[1]),i=t.as2D(-1,o);return this.reduce(i,"all",i.dtype).reshape(r)},t.prototype.squaredDifference=function(t,n){var e=new ri("return (a - b) * (a - b);",t.shape,n.shape);return this.compileAndRun(e,[t,n])},t.prototype.realDivide=function(t,n){var e=new ri("return a / b;",t.shape,n.shape),r=this.makeOutputArray(e.outputShape,"float32");return this.compileAndRun(e,[t,n],r)},t.prototype.floorDiv=function(t,n){var e=new ri("\n float resultSign = sign(a) * sign(b);\n int ia = round(a);\n int ib = round(b);\n int result = ia / ib;\n int amodb = ia - ib * result;\n\n if (resultSign < 0.0 && amodb != 0) {\n result -= 1;\n }\n return float(result);\n",t.shape,n.shape),r=this.makeOutputArray(e.outputShape,"int32");return this.compileAndRun(e,[t,n],r)},t.prototype.add=function(t,n){var e=new ri("return a + b;",t.shape,n.shape),r=this.makeOutputArray(e.outputShape,yt(t.dtype,n.dtype));return this.compileAndRun(e,[t,n],r)},t.prototype.subtract=function(t,n){var e=new ri("return a - b;",t.shape,n.shape),r=this.makeOutputArray(e.outputShape,yt(t.dtype,n.dtype));return this.compileAndRun(e,[t,n],r)},t.prototype.pow=function(t,n){var e=new ri("\n return (round(mod(b, 2.0)) == 0 || round(mod(b, 2.0)) == 2) ?\n pow(abs(a), b) : sign(a) * pow(abs(a), b);\n",t.shape,n.shape),r=this.makeOutputArray(e.outputShape,yt(t.dtype,n.dtype));return this.compileAndRun(e,[t,n],r)},t.prototype.ceil=function(t){var n=new ru(t.shape,"return ceil(x);");return this.compileAndRun(n,[t])},t.prototype.floor=function(t){var n=new ru(t.shape,"return floor(x);");return this.compileAndRun(n,[t])},t.prototype.sign=function(t){var n=new ru(t.shape,"\n if (isNaN(x)) { return 0.0; }\n return sign(x);\n");return this.compileAndRun(n,[t])},t.prototype.round=function(t){var n=new ru(t.shape,"\n // OpenGL ES does not support round function.\n // The algorithm is based on banker's rounding.\n float base = floor(x);\n if ((x - base) < 0.5) {\n return floor(x);\n } else if ((x - base) > 0.5) {\n return ceil(x);\n } else {\n if (mod(base, 2.0) == 0.0) {\n return base;\n } else {\n return base + 1.0;\n }\n }\n");return this.compileAndRun(n,[t])},t.prototype.exp=function(t){var n=new ru(t.shape,"return exp(x);");return this.compileAndRun(n,[t])},t.prototype.expm1=function(t){var n=new ru(t.shape,"return exp(x) - 1.0;");return this.compileAndRun(n,[t])},t.prototype.log=function(t){var n=new ru(t.shape,"return log(x);");return this.compileAndRun(n,[t])},t.prototype.log1p=function(t){var n=new ru(t.shape,"return log(1.0 + x);");return this.compileAndRun(n,[t])},t.prototype.sqrt=function(t){var n=new ru(t.shape,"return sqrt(x);");return this.compileAndRun(n,[t])},t.prototype.rsqrt=function(t){var n=new ru(t.shape,"return inversesqrt(x);");return this.compileAndRun(n,[t])},t.prototype.square=function(t){var n=new ru(t.shape,"return x * x;");return this.compileAndRun(n,[t])},t.prototype.reciprocal=function(t){var n=new ru(t.shape,"return 1.0 / x;");return this.compileAndRun(n,[t])},t.prototype.relu=function(t){var n=new ru(t.shape,iu);return this.compileAndRun(n,[t])},t.prototype.elu=function(t){var n=new ru(t.shape,"return (x >= 0.0) ? x : (exp(x) - 1.0);");return this.compileAndRun(n,[t])},t.prototype.eluDer=function(t,n){var e=new ri("return (b >= 1.0) ? a : a * (b + 1.0);",t.shape,n.shape);return this.compileAndRun(e,[t,n])},t.prototype.selu=function(t){var n=new ru(t.shape,"\n // Stable and Attracting Fixed Point (0, 1) for Normalized Weights.\n // see: https://arxiv.org/abs/1706.02515\n float scaleAlpha = 1.7580993408473768;\n float scale = 1.0507009873554805;\n return (x >= 0.0) ? scale * x : scaleAlpha * (exp(x) - 1.0);\n");return this.compileAndRun(n,[t])},t.prototype.int=function(t){var n=new ru(t.shape,"return float(int(x));"),e=this.makeOutputArray(n.outputShape,"int32");return this.compileAndRun(n,[t],e)},t.prototype.clip=function(t,n,e){var r=new oi(t.shape,n,e);return this.compileAndRun(r,[t])},t.prototype.abs=function(t){var n=new ru(t.shape,"return abs(x);");return this.compileAndRun(n,[t])},t.prototype.sigmoid=function(t){var n=new ru(t.shape,"return 1.0 / (1.0 + exp(-1.0 * x));");return this.compileAndRun(n,[t])},t.prototype.softplus=function(t){var n=new ru(t.shape,"\n float epsilon = 1.1920928955078125e-7;\n float threshold = log(epsilon) + 2.0;\n\n bool too_large = x > -threshold;\n bool too_small = x < threshold;\n\n float result;\n float exp_x = exp(x);\n\n if (too_large){\n result = x;\n }\n else if (too_small){\n result = exp_x;\n }\n else{\n result = log(exp_x + 1.0);\n }\n return result;\n");return this.compileAndRun(n,[t])},t.prototype.sin=function(t){var n=new ru(t.shape,au);return this.compileAndRun(n,[t])},t.prototype.cos=function(t){var n=new ru(t.shape,uu);return this.compileAndRun(n,[t])},t.prototype.tan=function(t){var n=new ru(t.shape,"return tan(x);");return this.compileAndRun(n,[t])},t.prototype.asin=function(t){var n=new ru(t.shape,"return asin(x);");return this.compileAndRun(n,[t])},t.prototype.acos=function(t){var n=new ru(t.shape,"return acos(x);");return this.compileAndRun(n,[t])},t.prototype.atan=function(t){var n=new ru(t.shape,su);return this.compileAndRun(n,[t])},t.prototype.atan2=function(t,n){var e=new ri("\n if (isNaN(a)) return a;\n if (isNaN(b)) return b;\n\n return atan(a, b);\n",t.shape,n.shape);return this.compileAndRun(e,[t,n])},t.prototype.sinh=function(t){var n=new ru(t.shape,"\n float e2x = exp(x);\n return (e2x - 1.0 / e2x) / 2.0;\n");return this.compileAndRun(n,[t])},t.prototype.cosh=function(t){var n=new ru(t.shape,"\n float e2x = exp(-x);\n return (e2x + 1.0 / e2x) / 2.0;\n");return this.compileAndRun(n,[t])},t.prototype.tanh=function(t){var n=new ru(t.shape,"\n float e2x = exp(-2.0 * abs(x));\n return sign(x) * (1.0 - e2x) / (1.0 + e2x);\n");return this.compileAndRun(n,[t])},t.prototype.asinh=function(t){var n=new ru(t.shape,"return log(x + sqrt(x * x + 1.0));");return this.compileAndRun(n,[t])},t.prototype.acosh=function(t){var n=new ru(t.shape,"return log(x + sqrt(x * x - 1.0));");return this.compileAndRun(n,[t])},t.prototype.atanh=function(t){var n=new ru(t.shape,"return (log(1.0 + x) - log(1.0 - x)) / 2.0;");return this.compileAndRun(n,[t])},t.prototype.erf=function(t){var n=new ru(t.shape,'\n // Error function is calculated approximately with elementary function.\n // See "Handbook of Mathematical Functions with Formulas,\n // Graphs, and Mathematical Tables", Abramowitz and Stegun.\n float p = 0.3275911;\n float a1 = 0.254829592;\n float a2 = -0.284496736;\n float a3 = 1.421413741;\n float a4 = -1.453152027;\n float a5 = 1.061405429;\n\n float t = 1.0 / (1.0 + p * x);\n return 1.0 - (((((a5*t + a4)*t) + a3)*t + a2)*t + a1)*t*exp(-x*x);\n');return this.compileAndRun(n,[t])},t.prototype.step=function(t,n){var e=new ru(t.shape,function(t){return void 0===t&&(t=0),ou+"\n return x > 0.0 ? 1.0 : float("+t+");\n "}(n));return this.compileAndRun(e,[t])},t.prototype.conv2d=function(t,n,e){var r=new ci(e);return this.compileAndRun(r,[t,n])},t.prototype.conv2dDerInput=function(t,n,e){var r=new ui(e);return this.compileAndRun(r,[t,n])},t.prototype.conv2dDerFilter=function(t,n,e){var r=new ai(e);return this.compileAndRun(r,[t,n])},t.prototype.depthwiseConv2D=function(t,n,e){var r=new fi(e);return this.compileAndRun(r,[t,n])},t.prototype.depthwiseConv2DDerInput=function(t,n,e){var r=new li(e);return this.compileAndRun(r,[t,n])},t.prototype.depthwiseConv2DDerFilter=function(t,n,e){var r=new si(e);return this.compileAndRun(r,[t,n])},t.prototype.maxPool=function(t,n){var e=new Ga(n,"max",!1),r=this.makeOutputArray(e.outputShape,t.dtype);return this.compileAndRun(e,[t],r)},t.prototype.avgPool=function(t,n){var e=new Ga(n,"avg",!1),r=this.makeOutputArray(e.outputShape,"float32");return this.compileAndRun(e,[t],r)},t.prototype.maxPoolBackprop=function(t,n,e,r){var o=new Ga(r,"max",!0),i=this.compileAndRun(o,[n]),a=new Pa(r),u=this.makeOutputArray(a.outputShape,n.dtype),s=this.compileAndRun(a,[t,i],u);return i.dispose(),s},t.prototype.avgPoolBackprop=function(t,n,e){var r=new ni(e),o=this.makeOutputArray(r.outputShape,n.dtype);return this.compileAndRun(r,[t],o)},t.prototype.cast=function(t,n){return Zo(t,n,this)},t.prototype.reshape=function(t,n){return $o(t,n)},t.prototype.resizeBilinear=function(t,n,e,r){var o=new ja(t.shape,n,e,r);return this.compileAndRun(o,[t])},t.prototype.resizeBilinearBackprop=function(t,n,e){var r=new Ha(t,n,e);return this.compileAndRun(r,[t])},t.prototype.resizeNearestNeighbor=function(t,n,e,r){var o=new Ka(t.shape,n,e,r);return this.compileAndRun(o,[t])},t.prototype.multinomial=function(t,n,e,r){var o=n?t:fo(t),i=o.shape[0],a=o.shape[1],u=new Wa(i,a,e),s=this.makeOutputArray(u.outputShape,"int32"),l=u.getCustomSetupFunc(r);return this.compileAndRun(u,[o],s,l)},t.prototype.oneHot=function(t,n,e,r){var o=new za(t.size,n,e,r);return this.compileAndRun(o,[t])},t.prototype.makeOutputArray=function(t,n){return xo.make(t,{},n)},t.prototype.compileAndRun=function(t,n,e,r){var o=this;null==e&&(e=this.makeOutputArray(t.outputShape,n[0].dtype));var i=n.map(function(t){var n=o.texData.get(t.dataId);return null==n.texture&&t.size<=32?{tensor:t,texData:null,isUniform:!0}:(o.uploadToGPU(t.dataId),{tensor:t,texData:n,isUniform:!1})});this.uploadToGPU(e.dataId);var a,u={tensor:e,texData:this.texData.get(e.dataId),isUniform:!1},s=function(t,n,e){var r="";n.concat(e).forEach(function(t){r+=t.tensor.shape+"_"+(t.isUniform?"uniform":t.texData.texShape)});var o=t.userCode,i=(!0===t.supportsBroadcasting).toString();return t.constructor.name+"_"+i+"_"+r+"_"+o}(t,i,u),l=this.getAndSaveBinary(s,function(){return function(t,n,e,r){for(var o=n.userCode,i=e.map(function(t,e){var r={logicalShape:t.tensor.shape,texShape:t.isUniform?null:t.texData.texShape,isUniform:t.isUniform};return{name:n.variableNames[e],shapeInfo:r}}),a=i.map(function(t){return t.shapeInfo}),u={logicalShape:r.tensor.shape,texShape:r.texData.texShape,isUniform:!1},s=hi(i,u,o,!0===n.supportsBroadcasting),l=t.createProgram(s),c={},f=0;fthis.NUM_BYTES_BEFORE_PAGING)for(var f=this.numBytesInGPU-this.NUM_BYTES_BEFORE_PAGING;f>0;){var h=this.lruDataGPU.shift(),p=this.texData.get(h),d=p.shape,v=p.dtype;f-=this.computeBytes(d,v),this.read(h)}return c&&(a=this.endTimer(a),this.activeTimers.push(this.getQueryTime(a))),e},t.prototype.getAndSaveBinary=function(t,n){return t in this.binaryCache||(this.binaryCache[t]=n()),this.binaryCache[t]},t.prototype.getTextureManager=function(){return this.textureManager},t.prototype.dispose=function(){if(!this.disposed){for(var t in this.binaryCache)this.gpgpu.deleteProgram(this.binaryCache[t].webGLProgram);this.textureManager.dispose(),this.canvas.remove(),null!=this.fromPixelsCanvas&&this.fromPixelsCanvas.remove(),this.gpgpuCreatedLocally&&this.gpgpu.dispose(),this.disposed=!0}},t.prototype.throwIfNoData=function(t){if(!this.texData.has(t))throw new Error("WebGL backend: No data found for this tensor. Did you change your backend in the middle of the program? New backends can't use Tensors created with previous backends")},t.prototype.uploadToGPU=function(t){this.throwIfNoData(t);var n=this.texData.get(t),e=n.shape,r=n.values,o=n.texture,i=(n.dtype,n.usage);if(null!=o)return this.lruDataGPU.splice(this.lruDataGPU.indexOf(t),1),void this.lruDataGPU.push(t);var a,u=null!=this.activeTimers;u&&(a=performance.now());var s=fa(this.gpgpu.gl,e);n.texShape=s;var l=this.acquireTexture(t,s,i);n.texture=l,null!=r&&(this.gpgpu.uploadMatrixToTexture(l,s[0],s[1],function(t,n){return t instanceof Float32Array?t:new Float32Array(t)}(r)),n.values=null,u&&(this.uploadWaitMs+=performance.now()-a))},t.prototype.cacheOnCPU=function(t,n){var e=this.delayedStorage,r=this.texData.get(t),o=r.texture,i=r.texShape,a=r.dtype,u=r.usage;e&&null!=o&&(this.releaseTexture(t,o,i,u),r.texture=null,r.texShape=null),null!=n&&(r.values=function(t,n){if("float32"===n)return t;if("int32"===n||"bool"===n){for(var e="int32"===n?new Int32Array(t.length):new Uint8Array(t.length),r=0;r=0&&this.lruDataGPU.splice(u,1),this.numBytesInGPU-=this.computeBytes(i,a),this.textureManager.releaseTexture(n,e,r)},t.prototype.acquireTexture=function(t,n,e){var r=this.texData.get(t),o=r.shape,i=r.dtype;return this.lruDataGPU.push(t),this.numBytesInGPU+=this.computeBytes(o,i),this.textureManager.acquireTexture(n,e)},t.prototype.computeBytes=function(t,n){return g(t)*N(n)},t}();Xo.get("IS_BROWSER")&&Xo.registerBackend("webgl",function(){return new cu},2);var fu=function(){function t(){this.data=new WeakMap,this.firstUse=!0,Xo.get("IS_BROWSER")&&(this.canvas=document.createElement("canvas"))}return t.prototype.register=function(t,n,e){if(this.firstUse&&(this.firstUse=!1,Xo.get("IS_NODE")&&console.warn("\n============================\nHi there 👋. Looks like you are running TensorFlow.js in Node.js. To speed things up dramatically, install our node backend, which binds to TensorFlow C++, by running npm i @tensorflow/tfjs-node, or npm i @tensorflow/tfjs-node-gpu if you have CUDA. Then call require('tensorflow/tfjs-node'); (-gpu suffix for CUDA) at the start of your program. Visit https://github.com/tensorflow/tfjs-node for more details.\n============================\n")),this.data.has(t))throw new Error("Data buffer is already registered");this.data.set(t,null)},t.prototype.write=function(t,n){if(null==n)throw new Error("MathBackendCPU.write(): values can not be null");this.throwIfNoData(t),this.data.set(t,n)},t.prototype.fromPixels=function(t,n){if(null==t)throw new Error("MathBackendCPU.writePixels(): pixels can not be null");var e,r;if(t instanceof ImageData)e=t.data;else if(t instanceof HTMLCanvasElement)e=t.getContext("2d").getImageData(0,0,t.width,t.height).data;else{if(!(t instanceof HTMLImageElement||t instanceof HTMLVideoElement))throw new Error("pixels is of unknown type: "+t.constructor.name);if(null==this.canvas)throw new Error("Can't read pixels from HTMLImageElement outside the browser.");this.canvas.width=t.width,this.canvas.height=t.height,this.canvas.getContext("2d").drawImage(t,0,0,t.width,t.height),e=this.canvas.getContext("2d").getImageData(0,0,t.width,t.height).data}if(4===n)r=new Int32Array(e);else{var o=t.width*t.height;r=new Int32Array(o*n);for(var i=0;ih&&(h=v,p=d)}s[c]=p}return a},t.prototype.cumsum=function(t,n,e,r){if(n!==t.rank-1)throw new Error("backend.cumsum in CPU expects an inner-most axis="+(t.rank-1)+" but got axis="+n);for(var o=yt(t.dtype,"int32"),i=_r(t.shape,o),a=i.dataSync(),u=t.dataSync(),s=t.shape[t.rank-1],l=r?function(t,n){return t+s-n-1}:function(t,n){return t+n},c=0;cn?1:0})},t.prototype.greaterEqual=function(t,n){return this.broadcastedBinaryOp(t,n,"bool",function(t,n){return t>=n?1:0})},t.prototype.logicalNot=function(t){for(var n=t.dataSync(),e=new Int32Array(n.length),r=0;r1||1===n.rank?1:n.shape[1],f=0;f=0&&n>=0?e:(e+n)%n})},t.prototype.max=function(t,n){K("max",n,t.rank);for(var e=q(t.shape,n),r=e[0],o=e[1],i=_r(r,t.dtype),a=g(o),u=i.dataSync(),s=t.dataSync(),l=0;lf&&(f=p)}u[l]=f}return i},t.prototype.maximum=function(t,n){return this.broadcastedBinaryOp(t,n,t.dtype,function(t,n){return Math.max(t,n)})},t.prototype.all=function(t,n){K("all",n,t.rank);for(var e=q(t.shape,n),r=e[0],o=e[1],i=_r(r,t.dtype),a=g(o),u=i.dataSync(),s=t.dataSync(),l=0;l0?e[r]=1:e[r]=0;return xo.make(t.shape,{values:e})},t.prototype.round=function(t){for(var n=t.dataSync(),e=new Float32Array(n.length),r=0;r.5?e[r]=Math.ceil(n[r]):e[r]=o%2==0?o:o+1}return xo.make(t.shape,{values:e})},t.prototype.exp=function(t){for(var n=t.dataSync(),e=new Float32Array(n.length),r=0;r=0?o:Math.exp(o)-1}return xo.make(t.shape,{values:n})},t.prototype.eluDer=function(t,n){for(var e=new Float32Array(n.size),r=n.dataSync(),o=t.dataSync(),i=0;i=1?o[i]:o[i]*(a+1)}return xo.make(n.shape,{values:e})},t.prototype.selu=function(t){for(var n=new Float32Array(t.size),e=t.dataSync(),r=0;r=0?1.0507009873554805*o:1.7580993408473768*(Math.exp(o)-1)}return xo.make(t.shape,{values:n})},t.prototype.clip=function(t,n,e){for(var r=new Float32Array(t.size),o=t.dataSync(),i=0;i-n,u=r[o]0?1:n}return xo.make(t.shape,{values:e})},t.prototype.conv2d=function(t,n,e){for(var r=e.filterHeight,o=e.filterWidth,i=e.dilationHeight,a=e.dilationWidth,u=e.padInfo.left,s=e.padInfo.top,l=zr(e.outShape,t.dtype),c=0;c=e.inHeight))for(var x=0;x=e.inWidth))for(var b=0;b=e.inHeight))for(var b=0;b=e.inWidth||(y+=t.get(f,w,E,h)*n.get(x,b,h,g))}}c.set(y,f,p,v,h*l+g)}return c.toTensor()},t.prototype.depthwiseConv2DDerInput=function(t,n,e){for(var r=zr(e.inShape,"float32"),o=r.values,i=r.strides,a=i[0],u=i[1],s=i[2],l=t.dataSync(),c=t.strides,f=c[0],h=c[1],p=c[2],d=n.dataSync(),v=n.strides,m=v[0],g=v[1],y=v[2],x=e.batchSize,w=e.filterHeight,b=e.filterWidth,E=e.inChannels,S=e.inHeight,R=e.inWidth,C=e.outChannels,_=e.outHeight,k=e.outWidth,T=e.strideHeight,I=e.strideWidth,D=w-1-e.padInfo.top,A=b-1-e.padInfo.left,M=C/E,N=0;Nw?w=C:"avg"===e&&(b+=C,E++)}if(isNaN(w))break}u.set("avg"===e?b/E:w,c,h,m,f)}return u.toTensor()},t.prototype.maxPool=function(t,n){return this.pool(t,n,"max")},t.prototype.maxPoolPositions=function(t,n){for(var e=zr(n.outShape,"int32"),r=n.strideHeight,o=n.strideWidth,i=n.filterHeight,a=n.filterWidth,u=n.padInfo.top,s=n.padInfo.left,l=0;lx&&(x=C,w=E*a+R)}e.set(w,l,f,v,c)}return e.toTensor()},t.prototype.maxPoolBackprop=function(t,n,e,r){for(var o=this.maxPoolPositions(n,r),i=r.strideHeight,a=r.strideWidth,u=r.filterHeight,s=r.filterWidth,l=s-1-r.padInfo.left,c=u-1-r.padInfo.top,f=zr(n.shape,"float32"),h=0;h=r.outHeight||Math.floor(w)!==w))for(var b=0;b=r.outWidth||Math.floor(E)!==E)){var S=u*s-1-o.get(h,w,E,p)===x*s+b?1:0;0!==S&&(y+=t.get(h,w,E,p)*S)}}}f.set(y,h,d,v,p)}return f.toTensor()},t.prototype.avgPoolBackprop=function(t,n,e){for(var r=e.strideHeight,o=e.strideWidth,i=e.filterHeight,a=e.filterWidth,u=a-1-e.padInfo.left,s=i-1-e.padInfo.top,l=zr(n.shape,"float32"),c=1/(i*a),f=0;f=e.outHeight||Math.floor(x)!==x))for(var w=0;w=e.outWidth||Math.floor(b)!==b||(g+=t.get(f,x,b,h))}}l.set(g*c,f,p,d,h)}return l.toTensor()},t.prototype.cast=function(t,n){return Zo(t,n,this)},t.prototype.reshape=function(t,n){return $o(t,n)},t.prototype.avgPool=function(t,n){return this.pool(t,n,"avg").toFloat()},t.prototype.resizeBilinear=function(t,n,e,r){for(var o=t.shape,i=o[0],a=o[1],u=o[2],s=o[3],l=zr([i,n,e,s],t.dtype),c=[r&&n>1?a-1:a,r&&e>1?u-1:u],f=[r&&n>1?n-1:n,r&&e>1?e-1:e],h=0;h1?i-1:i,e&&c>1?a-1:a],p=[e&&l>1?l-1:l,e&&c>1?c-1:c],d=h[0]/p[0],v=h[1]/p[1],m=0;m=0&&t.get(i)0,"scheme must not be an empty string.");var r=t.getInstance();h(null==r.managers[n],"A model store manager is already registered for scheme '"+n+"'."),r.managers[n]=e},t.getManager=function(t){var n=this.getInstance().managers[t];if(null==n)throw new Error("Cannot find model manager for scheme '"+t+"'");return n},t.getSchemes=function(){return Object.keys(this.getInstance().managers)},t}();function bu(t){if(-1===t.indexOf(xu))throw new Error("The url string provided does not contain a scheme. Supported schemes are: "+wu.getSchemes().join(","));return{scheme:t.split(xu)[0],path:t.split(xu)[1]}}function Eu(t,n,e){return void 0===e&&(e=!1),o(this,void 0,void 0,function(){var r,o,a,u,s,l,c,f,p;return i(this,function(i){switch(i.label){case 0:return h(t!==n,"Old path and new path are the same: '"+t+"'"),h((r=yu.getLoadHandlers(t)).length>0,"Copying failed because no load handler is found for source URL "+t+"."),h(r.length<2,"Copying failed because more than one ("+r.length+") load handlers for source URL "+t+"."),o=r[0],h((a=yu.getSaveHandlers(n)).length>0,"Copying failed because no save handler is found for destination URL "+n+"."),h(a.length<2,"Copying failed because more than one ("+r.length+") save handlers for destination URL "+n+"."),u=a[0],s=bu(t).scheme,l=bu(t).path,c=s===bu(t).scheme,[4,o.load()];case 1:return f=i.sent(),e&&c?[4,wu.getManager(s).removeModel(l)]:[3,3];case 2:i.sent(),i.label=3;case 3:return[4,u.save(f)];case 4:return p=i.sent(),!e||c?[3,6]:[4,wu.getManager(s).removeModel(l)];case 5:i.sent(),i.label=6;case 6:return[2,p.modelArtifactsInfo]}})})}var Su=function(){function t(){}return t.listModels=function(){return o(this,void 0,void 0,function(){var t,n,e,r,o,a,u;return i(this,function(i){switch(i.label){case 0:t=wu.getSchemes(),n={},e=0,r=t,i.label=1;case 1:return e0,"URL path for browserHTTPRequest must not be null, undefined or empty."),this.path=t,null!=n&&null!=n.body)throw new Error("requestInit is expected to have no pre-existing body, but has one.");this.requestInit=n||{}}return t.prototype.save=function(t){return o(this,void 0,void 0,function(){var n,e,r,o;return i(this,function(i){switch(i.label){case 0:if(t.modelTopology instanceof ArrayBuffer)throw new Error("BrowserHTTPRequest.save() does not support saving model topology in binary formats yet.");return(n=Object.assign({method:this.DEFAULT_METHOD},this.requestInit)).body=new FormData,e=[{paths:["./model.weights.bin"],weights:t.weightSpecs}],r={modelTopology:t.modelTopology,weightsManifest:e},n.body.append("model.json",new Blob([JSON.stringify(r)],{type:"application/json"}),"model.json"),null!=t.weightData&&n.body.append("model.weights.bin",new Blob([t.weightData],{type:"application/octet-stream"}),"model.weights.bin"),[4,fetch(this.path,n)];case 1:if(200===(o=i.sent()).status)return[2,{modelArtifactsInfo:gu(t),responses:[o]}];throw new Error("BrowserHTTPRequest.save() failed due to HTTP response status "+o.status+".")}})})},t.prototype.load=function(){return o(this,void 0,void 0,function(){var t,n,e,r,o,a,u,s,l,c,f,h;return i(this,function(i){switch(i.label){case 0:return[4,fetch(this.path,this.requestInit)];case 1:return[4,i.sent().json()];case 2:if(t=i.sent(),n=t.modelTopology,e=t.weightsManifest,null==n&&null==e)throw new Error("The JSON from HTTP path "+this.path+" contains neither model topology or manifest for weights.");if(null==e)return[3,4];for(a=t.weightsManifest,r=[],u=0,s=a;ue)}var ms=Object.freeze({WEBGL_ENVS:ls,CPU_ENVS:cs,CHROME_CPU_ENVS:[{BACKEND:"test-cpu",IS_CHROME:!0}],NATIVE_ENV:fs,BROWSER_ENVS:hs,ALL_ENVS:ps,expectArraysClose:ds,expectPromiseToFail:function(t,n){t().then(function(){return n.fail()},function(){return n()})},expectArraysEqual:function(t,n){return ds(t,n,0)},expectNumbersClose:function(t,n,e){if(null==e&&(e=Xo.get("TEST_EPSILON")),!vs(t,n,e))throw new Error("Numbers differ: actual === "+t+", expected === "+n)},expectValuesInRange:function(t,n,e){var r;r=t instanceof xo?t.dataSync():t;for(var o=0;oe)throw new Error("Value out of range:"+r[o]+" low: "+n+", high: "+e)},expectArrayBuffersEqual:function(t,n){expect(new Float32Array(t)).toEqual(new Float32Array(n))}}),gs=Object.freeze({gpgpu_util:Na,webgl_util:ha,MathBackendWebGL:cu,GPGPUContext:Oa}),ys=function(t){function n(){return null!==t&&t.apply(this,arguments)||this}return e(n,t),n.prototype.minimize=function(t,n,e){void 0===n&&(n=!1);var r=this.computeGradients(t,e),o=r.value,i=r.grads;return this.applyGradients(i),Object.keys(i).forEach(function(t){return i[t].dispose()}),n?o:(o.dispose(),null)},n.prototype.computeGradients=function(t,n){return No(t,n)},r([function(){for(var t=[],n=0;n0&&o[o.length-1])&&(6===i[0]||2===i[0])){a=0;continue}if(3===i[0]&&(!o||i[1]>o[0]&&i[1]0&&n>0?{width:t,height:n}:null},enumerable:!0,configurable:!0}),t}();function Zs(t,n){return void 0===n&&(n=!1),Co(function(){var e=t.shape.slice(1),r=e[0],o=e[1];if(r===o)return t;var i=Math.abs(r-o),a=Math.floor(i*(n?.5:1)),u=r>o?2:1,s=function(n){void 0===n&&(n=!1);var e=t.shape.slice();return e[u]=a+(n?1:0),e},l=(n?[Vr(s(!Ws(i)),0)]:[]).concat([t,Vr(s(),0)]);return dn(l,u)})}var $s=function(){function t(t,n,e,r){this.x=t,this.y=n,this.width=e,this.height=r}return t.prototype.floor=function(){return new t(Math.floor(this.x),Math.floor(this.y),Math.floor(this.width),Math.floor(this.height))},t}(),tl=function(){function t(t,n,e){var r=e.width,o=e.height;this._imageWidth=r,this._imageHeight=o,this._score=t,this._box=new $s(n.x*r,n.y*o,n.width*r,n.height*o)}return t.prototype.getScore=function(){return this._score},t.prototype.getBox=function(){return this._box},t.prototype.getImageWidth=function(){return this._imageWidth},t.prototype.getImageHeight=function(){return this._imageHeight},t.prototype.getRelativeBox=function(){return new $s(this._box.x/this._imageWidth,this._box.y/this._imageHeight,this._box.width/this._imageWidth,this._box.height/this._imageHeight)},t.prototype.forSize=function(n,e){return new t(this._score,this.getRelativeBox(),{width:n,height:e})},t}();function nl(t){return Co(function(){if(t instanceof xo){var n=t.shape.length;if(3!==n&&4!==n)throw new Error("input tensor must be of rank 3 or 4");return(3===n?t.expandDims(0):t).toFloat()}var e=t instanceof Js?t:new Js(t);return dn(e.canvases.map(function(t){return Er(t).expandDims(0).toFloat()}))})}function el(t){var n=t;return{extractWeights:function(t){var e=n.slice(0,t);return n=n.slice(t),e},getRemainingWeights:function(){return n}}}function rl(t){function n(n,e,r){return{filters:Xr(t(n*e*r*r),[r,r,n,e]),bias:Hr(t(e))}}function e(t,e,r){var o=n(t,e,r);return{filters:o.filters,batch_norm_offset:o.bias}}function r(n,r){var o;return{depthwise_conv_params:{filters:Xr(t(9*(o=n)),[3,3,o,1]),batch_norm_scale:Hr(t(o)),batch_norm_offset:Hr(t(o)),batch_norm_mean:Hr(t(o)),batch_norm_variance:Hr(t(o))},pointwise_conv_params:e(n,r,1)}}return{extractMobilenetV1Params:function(){return{conv_0_params:e(3,32,3),conv_pair_params:[[32,64],[64,128],[128,128],[128,256],[256,256],[256,512],[512,512],[512,512],[512,512],[512,512],[512,512],[512,1024],[1024,1024]].map(function(t){return r(t[0],t[1])})}},extractPredictionLayerParams:function(){return{conv_0_params:e(1024,256,1),conv_1_params:e(256,512,3),conv_2_params:e(512,128,1),conv_3_params:e(128,256,3),conv_4_params:e(256,128,1),conv_5_params:e(128,256,3),conv_6_params:e(256,64,1),conv_7_params:e(64,128,3),box_predictor_0_params:{box_encoding_predictor_params:n(512,12,1),class_predictor_params:n(512,9,1)},box_predictor_1_params:{box_encoding_predictor_params:n(1024,24,1),class_predictor_params:n(1024,18,1)},box_predictor_2_params:{box_encoding_predictor_params:n(512,24,1),class_predictor_params:n(512,18,1)},box_predictor_3_params:{box_encoding_predictor_params:n(256,24,1),class_predictor_params:n(256,18,1)},box_predictor_4_params:{box_encoding_predictor_params:n(256,24,1),class_predictor_params:n(256,18,1)},box_predictor_5_params:{box_encoding_predictor_params:n(128,24,1),class_predictor_params:n(128,18,1)}}}}}function ol(t,n){return t instanceof xo&&t.shape.length===n}function il(t){return ol(t,1)}function al(t){return ol(t,2)}function ul(t){return ol(t,4)}function sl(t,n){return Bs(this,void 0,void 0,function(){var e,r,o,i;return Ps(this,function(a){switch(a.label){case 0:return e=function(t,n){var e=(t||"").split("/"),r=((t||"").endsWith(".json")?e.slice(0,e.length-1):e).filter(function(t){return t}).join("/"),o=n+"-weights_manifest.json";return{manifestUri:t&&r?t.endsWith(".json")?t:r+"/"+o:o,modelBaseUri:r}}(t,n),r=e.manifestUri,o=e.modelBaseUri,[4,fetch(r)];case 1:return[4,a.sent().json()];case 2:return i=a.sent(),[2,is.loadWeights(i,o)]}})})}var ll="face_detection_model";function cl(t){function n(n,e){var r={filters:t[n+"/Conv2d_"+e+"_pointwise/weights"],batch_norm_offset:t[n+"/Conv2d_"+e+"_pointwise/convolution_bn_offset"]};if(!ul(r.filters))throw new Error("expected weightMap["+n+"/Conv2d_"+e+"_pointwise/weights] to be a Tensor4D, instead have "+r.filters);if(!il(r.batch_norm_offset))throw new Error("expected weightMap["+n+"/Conv2d_"+e+"_pointwise/convolution_bn_offset] to be a Tensor1D, instead have "+r.batch_norm_offset);return r}function e(n){var e={box_encoding_predictor_params:{filters:t["Prediction/BoxPredictor_"+n+"/BoxEncodingPredictor/weights"],bias:t["Prediction/BoxPredictor_"+n+"/BoxEncodingPredictor/biases"]},class_predictor_params:{filters:t["Prediction/BoxPredictor_"+n+"/ClassPredictor/weights"],bias:t["Prediction/BoxPredictor_"+n+"/ClassPredictor/biases"]}};if(!ul(e.box_encoding_predictor_params.filters))throw new Error("expected weightMap[Prediction/BoxPredictor_"+n+"/BoxEncodingPredictor/weights] to be a Tensor4D, instead have "+e.box_encoding_predictor_params.filters);if(!il(e.box_encoding_predictor_params.bias))throw new Error("expected weightMap[Prediction/BoxPredictor_"+n+"/BoxEncodingPredictor/biases] to be a Tensor1D, instead have "+e.box_encoding_predictor_params.bias);if(!ul(e.class_predictor_params.filters))throw new Error("expected weightMap[Prediction/BoxPredictor_"+n+"/ClassPredictor/weights] to be a Tensor4D, instead have "+e.class_predictor_params.filters);if(!il(e.class_predictor_params.bias))throw new Error("expected weightMap[Prediction/BoxPredictor_"+n+"/ClassPredictor/biases] to be a Tensor1D, instead have "+e.class_predictor_params.bias);return e}return{extractMobilenetV1Params:function(){return{conv_0_params:n("MobilenetV1",0),conv_pair_params:Array(13).fill(0).map(function(e,r){return function(e){var r={filters:t["MobilenetV1/Conv2d_"+e+"_depthwise/depthwise_weights"],batch_norm_scale:t["MobilenetV1/Conv2d_"+e+"_depthwise/BatchNorm/gamma"],batch_norm_offset:t["MobilenetV1/Conv2d_"+e+"_depthwise/BatchNorm/beta"],batch_norm_mean:t["MobilenetV1/Conv2d_"+e+"_depthwise/BatchNorm/moving_mean"],batch_norm_variance:t["MobilenetV1/Conv2d_"+e+"_depthwise/BatchNorm/moving_variance"]};if(!ul(r.filters))throw new Error("expected weightMap[MobilenetV1/Conv2d_"+e+"_depthwise/depthwise_weights] to be a Tensor4D, instead have "+r.filters);if(!il(r.batch_norm_scale))throw new Error("expected weightMap[MobilenetV1/Conv2d_"+e+"_depthwise/BatchNorm/gamma] to be a Tensor1D, instead have "+r.batch_norm_scale);if(!il(r.batch_norm_offset))throw new Error("expected weightMap[MobilenetV1/Conv2d_"+e+"_depthwise/BatchNorm/beta] to be a Tensor1D, instead have "+r.batch_norm_offset);if(!il(r.batch_norm_mean))throw new Error("expected weightMap[MobilenetV1/Conv2d_"+e+"_depthwise/BatchNorm/moving_mean] to be a Tensor1D, instead have "+r.batch_norm_mean);if(!il(r.batch_norm_variance))throw new Error("expected weightMap[MobilenetV1/Conv2d_"+e+"_depthwise/BatchNorm/moving_variance] to be a Tensor1D, instead have "+r.batch_norm_variance);return{depthwise_conv_params:r,pointwise_conv_params:n("MobilenetV1",e)}}(r+1)})}},extractPredictionLayerParams:function(){return{conv_0_params:n("Prediction",0),conv_1_params:n("Prediction",1),conv_2_params:n("Prediction",2),conv_3_params:n("Prediction",3),conv_4_params:n("Prediction",4),conv_5_params:n("Prediction",5),conv_6_params:n("Prediction",6),conv_7_params:n("Prediction",7),box_predictor_0_params:e(0),box_predictor_1_params:e(1),box_predictor_2_params:e(2),box_predictor_3_params:e(3),box_predictor_4_params:e(4),box_predictor_5_params:e(5)}}}}function fl(t){return Bs(this,void 0,void 0,function(){var n,e,r,o,i;return Ps(this,function(a){switch(a.label){case 0:return[4,sl(t,ll)];case 1:if(n=a.sent(),e=cl(n),r=e.extractMobilenetV1Params,o=e.extractPredictionLayerParams,i=n["Output/extra_dim"],!ol(i,3))throw new Error("expected weightMap['Output/extra_dim'] to be a Tensor3D, instead have "+i);return[2,{mobilenetv1_params:r(),prediction_layer_params:o(),output_layer_params:{extra_dim:i}}]}})})}function hl(t,n,e){return Co(function(){var r=wn(t,n.filters,e,"same");return r=$e(r,n.batch_norm_offset),Re(r,0,6)})}var pl=.0010000000474974513;function dl(t,n){return Co(function(){var e=null,r=hl(t,n.conv_0_params,[2,2]);if(n.conv_pair_params.forEach(function(t,n){var o,i,a,u=n+1,s=function(t){return[2,4,6,12].some(function(n){return n===t})?[2,2]:[1,1]}(u);o=r,i=t.depthwise_conv_params,a=s,r=hl(r=Co(function(){var t=En(o,i.filters,a,"same");return t=cn(t,i.batch_norm_mean,i.batch_norm_variance,pl,i.batch_norm_scale,i.batch_norm_offset),Re(t,0,6)}),t.pointwise_conv_params,[1,1]),11===u&&(e=r)}),null===e)throw new Error("mobileNetV1 - output of conv layer 11 is null");return{out:r,conv11:e}})}function vl(t,n,e){var r=Math.min(t.get(n,0),t.get(n,2)),o=Math.min(t.get(n,1),t.get(n,3)),i=Math.max(t.get(n,0),t.get(n,2)),a=Math.max(t.get(n,1),t.get(n,3)),u=Math.min(t.get(e,0),t.get(e,2)),s=Math.min(t.get(e,1),t.get(e,3)),l=Math.max(t.get(e,0),t.get(e,2)),c=Math.max(t.get(e,1),t.get(e,3)),f=(i-r)*(a-o),h=(l-u)*(c-s);if(f<=0||h<=0)return 0;var p=Math.max(r,u),d=Math.max(o,s),v=Math.min(i,l),m=Math.min(a,c),g=Math.max(v-p,0)*Math.max(m-d,0);return g/(f+h-g)}function ml(t,n){var e=function(t){var n=to(An(t,[1,0])),e=[vr(n[2],n[0]),vr(n[3],n[1])];return{sizes:e,centers:[$e(n[0],er(e[0],qr(2))),$e(n[1],er(e[1],qr(2)))]}}(t),r=e.sizes,o=e.centers,i=to(An(n,[1,0])),a=er(fr(Te(er(i[2],qr(5))),r[0]),qr(2)),u=$e(fr(er(i[0],qr(10)),r[0]),o[0]),s=er(fr(Te(er(i[3],qr(5))),r[1]),qr(2)),l=$e(fr(er(i[1],qr(10)),r[1]),o[1]);return An($r([vr(u,a),vr(l,s),$e(u,a),$e(l,s)]),[1,0])}function gl(t,n,e,r){return void 0===e&&(e="same"),void 0===r&&(r=!1),Co(function(){var o=$e(wn(t,n.filters,[1,1],e),n.bias);return r?Pe(o):o})}function yl(t,n){return Co(function(){var e=t.shape[0];return{boxPredictionEncoding:Or(gl(t,n.box_encoding_predictor_params),[e,-1,1,4]),classPrediction:Or(gl(t,n.class_predictor_params),[e,-1,3])}})}var xl=[512,512],wl=qr(.007843137718737125),bl=qr(1);var El=function(){function t(){}return t.prototype.load=function(t){return Bs(this,void 0,void 0,function(){var n;return Ps(this,function(e){switch(e.label){case 0:if(t instanceof Float32Array)return this.extractWeights(t),[2];if(t&&"string"!=typeof t)throw new Error("FaceDetectionNet.load - expected model uri, or weights as Float32Array");return n=this,[4,fl(t)];case 1:return n._params=e.sent(),[2]}})})},t.prototype.extractWeights=function(t){this._params=function(t){var n=el(t),e=n.extractWeights,r=n.getRemainingWeights,o=rl(e),i=o.extractMobilenetV1Params,a=o.extractPredictionLayerParams,u=i(),s=a(),l={extra_dim:Kr(e(20472),[1,5118,4])};if(0!==r().length)throw new Error("weights remaing after extract: "+r().length);return{mobilenetv1_params:u,prediction_layer_params:s,output_layer_params:l}}(t)},t.prototype.forwardTensor=function(t){var n=this;if(!this._params)throw new Error("FaceDetectionNet - load model before inference");return Co(function(){var e,r=dl((e=t,Co(function(){var t=go.resizeBilinear(e,xl,!1);return vr(fr(t,wl),bl)})),n._params.mobilenetv1_params),o=function(t,n,e){return Co(function(){var r=hl(hl(t,e.conv_0_params,[1,1]),e.conv_1_params,[2,2]),o=hl(hl(r,e.conv_2_params,[1,1]),e.conv_3_params,[2,2]),i=hl(hl(o,e.conv_4_params,[1,1]),e.conv_5_params,[2,2]),a=hl(hl(i,e.conv_6_params,[1,1]),e.conv_7_params,[2,2]),u=yl(n,e.box_predictor_0_params),s=yl(t,e.box_predictor_1_params),l=yl(r,e.box_predictor_2_params),c=yl(o,e.box_predictor_3_params),f=yl(i,e.box_predictor_4_params),h=yl(a,e.box_predictor_5_params);return{boxPredictions:dn([u.boxPredictionEncoding,s.boxPredictionEncoding,l.boxPredictionEncoding,c.boxPredictionEncoding,f.boxPredictionEncoding,h.boxPredictionEncoding],1),classPredictions:dn([u.classPrediction,s.classPrediction,l.classPrediction,c.classPrediction,f.classPrediction,h.classPrediction],1)}})}(r.out,r.conv11,n._params.prediction_layer_params);return function(t,n,e){return Co(function(){var r=t.shape[0],o=ml(Or(Fr(e.extra_dim,[r,1,1]),[-1,4]),Or(t,[-1,4]));o=Or(o,[r,o.shape[0]/r,4]);var i=Ve(Bn(n,[0,0,1],[-1,-1,-1])),a=Bn(i,[0,0,0],[-1,-1,1]);return a=Or(a,[r,a.shape[1]]),{boxes:to(o),scores:to(a)}})}(o.boxPredictions,o.classPredictions,n._params.output_layer_params)})},t.prototype.forward=function(t){var n=this;return Co(function(){return n.forwardTensor(Zs(nl(t)))})},t.prototype.locateFaces=function(t,n,e){return void 0===n&&(n=.8),void 0===e&&(e=100),Bs(this,void 0,void 0,function(){var r,o,i,a,u,s,l,c,f,h,p,d,v,m,g=this;return Ps(this,function(y){switch(y.label){case 0:for(r=1,o=1,a=Co(function(){var n=nl(t),e=n.shape.slice(1),a=e[0],u=e[1];return i={width:u,height:a},n=Zs(n),r=n.shape[1]/a,o=n.shape[2]/u,g.forwardTensor(n)}),u=a.boxes,s=a.scores,l=u[0],c=s[0],f=1;fo}).sort(function(t,n){return n.score-t.score}).forEach(function(n){if(!(u.length>=a)){for(var e=n.score,i=u.length-1;i>=0;--i){var s=vl(t,n.boxIndex,u[i]);if(0!==s&&(n.score*=s<=r?1:0,n.score<=o))break}e===n.score&&u.push(n.boxIndex)}}),u}(l,h,e,.5,n),m=v.map(function(t){var n=[Math.max(0,l.get(t,0)),Math.min(1,l.get(t,2))].map(function(t){return t*r}),e=n[0],a=n[1],u=[Math.max(0,l.get(t,1)),Math.min(1,l.get(t,3))].map(function(t){return t*o}),s=u[0],c=u[1];return new tl(h[t],new $s(s,e,c-s,a-e),i)}),l.dispose(),c.dispose(),[2,m]}})})},t}();var Sl=function(){function t(t,n){this.x=t,this.y=n}return t.prototype.add=function(n){return new t(this.x+n.x,this.y+n.y)},t.prototype.sub=function(n){return new t(this.x-n.x,this.y-n.y)},t.prototype.mul=function(n){return new t(this.x*n.x,this.y*n.y)},t.prototype.div=function(n){return new t(this.x/n.x,this.y/n.y)},t.prototype.abs=function(){return new t(Math.abs(this.x),Math.abs(this.y))},t.prototype.magnitude=function(){return Math.sqrt(Math.pow(this.x,2)+Math.pow(this.y,2))},t.prototype.floor=function(){return new t(Math.floor(this.x),Math.floor(this.y))},t}();function Rl(t){var n=el(t),e=n.extractWeights,r=n.getRemainingWeights,o=function(t){return function(n,e,r){return{filters:Xr(t(n*e*r*r),[r,r,n,e]),bias:Hr(t(e))}}}(e);function i(t,n){return{weights:jr(e(t*n),[t,n]),bias:Hr(e(n))}}var a=o(3,32,3),u=o(32,64,3),s=o(64,64,3),l=o(64,64,3),c=o(64,64,3),f=o(64,128,3),h=o(128,128,3),p=o(128,256,3),d=i(6400,1024),v=i(1024,136);if(0!==r().length)throw new Error("weights remaing after extract: "+r().length);return{conv0_params:a,conv1_params:u,conv2_params:s,conv3_params:l,conv4_params:c,conv5_params:f,conv6_params:h,conv7_params:p,fc0_params:d,fc1_params:v}}function Cl(t){return t.reduce(function(t,n){return t.add(n)},new Sl(0,0)).div(new Sl(t.length,t.length))}var _l=function(){function t(t,n,e){void 0===e&&(e=new Sl(0,0));var r=n.width,o=n.height;this._imageWidth=r,this._imageHeight=o,this._shift=e,this._faceLandmarks=t.map(function(t){return t.mul(new Sl(r,o)).add(e)})}return t.prototype.getShift=function(){return new Sl(this._shift.x,this._shift.y)},t.prototype.getImageWidth=function(){return this._imageWidth},t.prototype.getImageHeight=function(){return this._imageHeight},t.prototype.getPositions=function(){return this._faceLandmarks},t.prototype.getRelativePositions=function(){var t=this;return this._faceLandmarks.map(function(n){return n.sub(t._shift).div(new Sl(t._imageWidth,t._imageHeight))})},t.prototype.getJawOutline=function(){return this._faceLandmarks.slice(0,17)},t.prototype.getLeftEyeBrow=function(){return this._faceLandmarks.slice(17,22)},t.prototype.getRightEyeBrow=function(){return this._faceLandmarks.slice(22,27)},t.prototype.getNose=function(){return this._faceLandmarks.slice(27,36)},t.prototype.getLeftEye=function(){return this._faceLandmarks.slice(36,42)},t.prototype.getRightEye=function(){return this._faceLandmarks.slice(42,48)},t.prototype.getMouth=function(){return this._faceLandmarks.slice(48,68)},t.prototype.forSize=function(n,e){return new t(this.getRelativePositions(),{width:n,height:e})},t.prototype.shift=function(n,e){return new t(this.getRelativePositions(),{width:this._imageWidth,height:this._imageHeight},new Sl(n,e))},t.prototype.align=function(t){if(t){var n=t instanceof tl?t.getBox().floor():t;return this.shift(n.x,n.y).align()}var e=[this.getLeftEye(),this.getRightEye(),this.getMouth()].map(Cl),r=e[0],o=e[1],i=e[2],a=function(t){return i.sub(t).magnitude()},u=(a(r)+a(o))/2,s=Math.floor(u/.45),l=Cl(e),c=Math.floor(Math.max(0,l.x-.5*s)),f=Math.floor(Math.max(0,l.y-.43*s));return new $s(c,f,s,s)},t}();function kl(t,n){return Co(function(){return $e(Rn(t,n.weights),n.bias)})}var Tl="face_landmark_68_model";function Il(t){return Bs(this,void 0,void 0,function(){var n,e,r,o;return Ps(this,function(i){switch(i.label){case 0:return[4,sl(t,Tl)];case 1:return n=i.sent(),e=function(t){return{extractConvParams:function(n){var e={filters:t[n+"/kernel"],bias:t[n+"/bias"]};if(!ul(e.filters))throw new Error("expected weightMap["+n+"/kernel] to be a Tensor4D, instead have "+e.filters);if(!il(e.bias))throw new Error("expected weightMap["+n+"/bias] to be a Tensor1D, instead have "+e.bias);return e},extractFcParams:function(n){var e={weights:t[n+"/kernel"],bias:t[n+"/bias"]};if(!al(e.weights))throw new Error("expected weightMap["+n+"/kernel] to be a Tensor2D, instead have "+e.weights);if(!il(e.bias))throw new Error("expected weightMap["+n+"/bias] to be a Tensor1D, instead have "+e.bias);return e}}}(n),r=e.extractConvParams,o=e.extractFcParams,[2,{conv0_params:r("conv2d_0"),conv1_params:r("conv2d_1"),conv2_params:r("conv2d_2"),conv3_params:r("conv2d_3"),conv4_params:r("conv2d_4"),conv5_params:r("conv2d_5"),conv6_params:r("conv2d_6"),conv7_params:r("conv2d_7"),fc0_params:o("dense"),fc1_params:o("logits")}]}})})}function Dl(t,n){return gl(t,n,"valid",!0)}function Al(t,n){return void 0===n&&(n=[2,2]),Dn(t,[2,2],n,"valid")}var Ml=function(){function t(){}return t.prototype.load=function(t){return Bs(this,void 0,void 0,function(){var n;return Ps(this,function(e){switch(e.label){case 0:if(t instanceof Float32Array)return this.extractWeights(t),[2];if(t&&"string"!=typeof t)throw new Error("FaceLandmarkNet.load - expected model uri, or weights as Float32Array");return n=this,[4,Il(t)];case 1:return n._params=e.sent(),[2]}})})},t.prototype.extractWeights=function(t){this._params=Rl(t)},t.prototype.detectLandmarks=function(t){return Bs(this,void 0,void 0,function(){var n,e,r,o,i,a,u,s=this;return Ps(this,function(l){switch(l.label){case 0:if(!this._params)throw new Error("FaceLandmarkNet - load model before inference");return e=Co(function(){var e=s._params,r=nl(t),o=r.shape.slice(1),i=o[0],a=o[1];n={width:a,height:i},128===r.shape[1]&&128===r.shape[2]||(r=go.resizeBilinear(r,[128,128]));var u=Dl(r,e.conv0_params);return u=Dl(u=Al(u=Dl(u=Dl(u=Al(u=Dl(u=Dl(u=Al(u=Dl(u=Dl(u=Al(u),e.conv1_params),e.conv2_params)),e.conv3_params),e.conv4_params)),e.conv5_params),e.conv6_params),[1,1]),e.conv7_params),kl(Pe(kl(u.as2D(u.shape[0],-1),e.fc0_params)),e.fc1_params)}),i=(o=Array).from,[4,e.data()];case 1:return r=i.apply(o,[l.sent()]),e.dispose(),a=r.filter(function(t,n){return(n-1)%2}),u=r.filter(function(t,n){return n%2}),[2,new _l(Array(68).fill(0).map(function(t,n){return new Sl(a[n],u[n])}),n)]}})})},t}();function Nl(t,n,e,r,o){void 0===o&&(o="same");var i=n.conv,a=i.filters,u=i.bias,s=wn(t,a,e,o);return s=function(t,n){return $e(fr(t,n.weights),n.biases)}(s=$e(s,u),n.scale),r?Pe(s):s}function Ol(t,n){return Nl(t,n,[1,1],!1)}function Ll(t,n){return Nl(t,n,[2,2],!0,"valid")}function Fl(t){function n(n,e,r){var o;return{conv:{filters:function(n,e,r){var o=t(n),i=o.length/(e*r*r);if(Us(i))throw new Error("depth has to be an integer: "+i+", weights.length: "+o.length+", numFilters: "+e+", filterSize: "+r);return An(Xr(o,[e,i,r,r]),[2,3,1,0])}(n,e,r),bias:Hr(t(e))},scale:{weights:Hr(t(o=e)),biases:Hr(t(o))}}}return{extractConvLayerParams:n,extractResidualLayerParams:function(t,e,r,o){return void 0===o&&(o=!1),{conv1:n((o?.5:1)*t,e,r),conv2:n(t,e,r)}}}}var Bl="face_recognition_model";function Pl(t){function n(n){var e={filters:t[n+"/conv/filters"],bias:t[n+"/conv/bias"]};if(!ul(e.filters))throw new Error("expected weightMap["+n+"/conv/filters] to be a Tensor1D, instead have "+e.filters);if(!il(e.bias))throw new Error("expected weightMap["+n+"/conv/bias] to be a Tensor1D, instead have "+e.bias);return{conv:e,scale:function(n){var e={weights:t[n+"/scale/weights"],biases:t[n+"/scale/biases"]};if(!il(e.weights))throw new Error("expected weightMap["+n+"/scale/weights] to be a Tensor1D, instead have "+e.weights);if(!il(e.biases))throw new Error("expected weightMap["+n+"/scale/biases] to be a Tensor1D, instead have "+e.biases);return e}(n)}}return{extractConvLayerParams:n,extractResidualLayerParams:function(t){return{conv1:n(t+"/conv1"),conv2:n(t+"/conv2")}}}}function Ul(t,n){var e=function(t,n){return Nl(t,n,[1,1],!0)}(t,n.conv1);return e=Ol(e,n.conv2),e=$e(e,t),e=Pe(e)}function Wl(t,n){var e=Ll(t,n.conv1);e=Ol(e,n.conv2);var r=In(t,2,2,"valid"),o=_r(r.shape),i=r.shape[3]!==e.shape[3];if(r.shape[1]!==e.shape[1]||r.shape[2]!==e.shape[2]){var a=e.shape.slice();a[1]=1;var u=_r(a),s=(e=dn([e,u],1)).shape.slice();s[2]=1;var l=_r(s);e=dn([e,l],2)}return r=i?dn([r,o],3):r,e=$e(r,e),e=Pe(e)}var zl=function(){function t(){}return t.prototype.load=function(t){return Bs(this,void 0,void 0,function(){var n;return Ps(this,function(e){switch(e.label){case 0:if(t instanceof Float32Array)return this.extractWeights(t),[2];if(t&&"string"!=typeof t)throw new Error("FaceLandmarkNet.load - expected model uri, or weights as Float32Array");return n=this,[4,function(t){return Bs(this,void 0,void 0,function(){var n,e,r,o,i,a,u,s,l,c,f,h,p,d,v,m,g,y,x,w;return Ps(this,function(b){switch(b.label){case 0:return[4,sl(t,Bl)];case 1:if(n=b.sent(),e=Pl(n),r=e.extractConvLayerParams,o=e.extractResidualLayerParams,i=r("conv32_down"),a=o("conv32_1"),u=o("conv32_2"),s=o("conv32_3"),l=o("conv64_down"),c=o("conv64_1"),f=o("conv64_2"),h=o("conv64_3"),p=o("conv128_down"),d=o("conv128_1"),v=o("conv128_2"),m=o("conv256_down"),g=o("conv256_1"),y=o("conv256_2"),x=o("conv256_down_out"),!al(w=n.fc))throw new Error("expected weightMap[fc] to be a Tensor2D, instead have "+w);return[2,{conv32_down:i,conv32_1:a,conv32_2:u,conv32_3:s,conv64_down:l,conv64_1:c,conv64_2:f,conv64_3:h,conv128_down:p,conv128_1:d,conv128_2:v,conv256_down:m,conv256_1:g,conv256_2:y,conv256_down_out:x,fc:w}]}})})}(t)];case 1:return n._params=e.sent(),[2]}})})},t.prototype.extractWeights=function(t){this._params=function(t){var n=el(t),e=n.extractWeights,r=n.getRemainingWeights,o=Fl(e),i=o.extractConvLayerParams,a=o.extractResidualLayerParams,u=i(4704,32,7),s=a(9216,32,3),l=a(9216,32,3),c=a(9216,32,3),f=a(36864,64,3,!0),h=a(36864,64,3),p=a(36864,64,3),d=a(36864,64,3),v=a(147456,128,3,!0),m=a(147456,128,3),g=a(147456,128,3),y=a(589824,256,3,!0),x=a(589824,256,3),w=a(589824,256,3),b=a(589824,256,3),E=An(jr(e(32768),[128,256]),[1,0]);if(0!==r().length)throw new Error("weights remaing after extract: "+r().length);return{conv32_down:u,conv32_1:s,conv32_2:l,conv32_3:c,conv64_down:f,conv64_1:h,conv64_2:p,conv64_3:d,conv128_down:v,conv128_1:m,conv128_2:g,conv256_down:y,conv256_1:x,conv256_2:w,conv256_down_out:b,fc:E}}(t)},t.prototype.forward=function(t){var n=this;if(!this._params)throw new Error("FaceRecognitionNet - load model before inference");return Co(function(){var e=Zs(nl(t),!0);150===e.shape[1]&&150===e.shape[2]||(e=go.resizeBilinear(e,[150,150]));var r=Ll(e=function(t){return Co(function(){var n=Vr([1,150,150,1],122.782),e=Vr([1,150,150,1],117.001),r=Vr([1,150,150,1],104.298),o=dn([n,e,r],3);return er(vr(t,o),qr(256))})}(e),n._params.conv32_down),o=(r=Wl(r=Ul(r=Ul(r=Wl(r=Ul(r=Ul(r=Wl(r=Ul(r=Ul(r=Ul(r=Wl(r=Ul(r=Ul(r=Ul(r=Dn(r,3,2,"valid"),n._params.conv32_1),n._params.conv32_2),n._params.conv32_3),n._params.conv64_down),n._params.conv64_1),n._params.conv64_2),n._params.conv64_3),n._params.conv128_down),n._params.conv128_1),n._params.conv128_2),n._params.conv256_down),n._params.conv256_1),n._params.conv256_2),n._params.conv256_down_out)).mean([1,2]);return Rn(o,n._params.fc)})},t.prototype.computeFaceDescriptor=function(t){return Bs(this,void 0,void 0,function(){var n,e;return Ps(this,function(r){switch(r.label){case 0:return[4,(n=this.forward(t)).data()];case 1:return e=r.sent(),n.dispose(),[2,e]}})})},t.prototype.computeFaceDescriptorSync=function(t){return Bs(this,void 0,void 0,function(){var n,e;return Ps(this,function(r){return n=this.forward(t),e=n.dataSync(),n.dispose(),[2,e]})})},t}();t.euclideanDistance=function(t,n){if(t.length!==n.length)throw new Error("euclideanDistance: arr1.length !== arr2.length");var e=Array.from(t),r=Array.from(n);return Math.sqrt(e.map(function(t,n){return t-r[n]}).reduce(function(t,n){return t+Math.pow(n,2)},0))},t.NetInput=Js,t.tf=Fs,t.padToSquare=Zs,t.extractFaces=function(t,n){var e=Gs(t);return n.map(function(n){return n instanceof tl?n.forSize(t.width,t.height).getBox().floor():n}).map(function(t){var n=t.x,r=t.y,o=t.width,i=t.height,a=qs({width:o,height:i});return Gs(a).putImageData(e.getImageData(n,r,o,i),0,0),a})},t.extractFaceTensors=function(t,n){return Co(function(){var e=nl(t),r=e.shape,o=(r[0],r[1]),i=r[2],a=r[3];return n.map(function(t){return t instanceof tl?t.forSize(i,o).getBox().floor():t}).map(function(t){var n=t.x,r=t.y,o=t.width,i=t.height;return Bn(e,[0,r,n,0],[1,i,o,a])})})},t.faceDetectionNet=function(t){var n=new El;return n.extractWeights(t),n},t.FaceDetectionNet=El,t.faceLandmarkNet=function(t){var n=new Ml;return n.extractWeights(t),n},t.FaceLandmarkNet=Ml,t.faceRecognitionNet=function(t){var n=new zl;return n.extractWeights(t),n},t.FaceRecognitionNet=zl,t.isFloat=Us,t.isEven=Ws,t.round=zs,t.getElement=Vs,t.getContext2dOrThrow=Gs,t.createCanvas=qs,t.createCanvasFromMedia=Hs,t.getMediaDimensions=js,t.bufferToImage=function(t){return new Promise(function(n,e){if(!(t instanceof Blob))return e("bufferToImage - expected buf to be of type: Blob");var r=new FileReader;r.onload=function(){var t=new Image;t.onload=function(){return n(t)},t.onerror=e,t.src=r.result},r.onerror=e,r.readAsDataURL(t)})},t.imageTensorToCanvas=function(t,n){return Bs(this,void 0,void 0,function(){var e,r,o,i,a;return Ps(this,function(u){switch(u.label){case 0:return e=n||document.createElement("canvas"),(r=t.shape)[0],o=r[1],i=r[2],a=r[3],[4,Sr(t.as3D(o,i,a).toInt(),e)];case 1:return u.sent(),[2,e]}})})},t.getDefaultDrawOptions=Ks,t.drawBox=Xs,t.drawText=Qs,t.drawDetection=function(t,n,e){var r=Vs(t);if(!(r instanceof HTMLCanvasElement))throw new Error("drawBox - expected canvas to be of type: HTMLCanvasElement");(Array.isArray(n)?n:[n]).forEach(function(t){var n=t.getBox(),o=n.x,i=n.y,a=n.width,u=n.height,s=Object.assign({color:"blue",lineWidth:2,fontSize:20,fontStyle:"Georgia"},e||{}),l=Object.assign({withScore:!0},e||{}).withScore,c=Gs(r);Xs(c,o,i,a,u,s),l&&Qs(c,o,i,""+zs(t.getScore()),s)})},t.drawLandmarks=function(t,n,e){var r=Vs(t);if(!(r instanceof HTMLCanvasElement))throw new Error("drawLandmarks - expected canvas to be of type: HTMLCanvasElement");var o=Object.assign({color:"blue",lineWidth:2,fontSize:20,fontStyle:"Georgia"},e||{}),i=Object.assign({drawLines:!1},e||{}).drawLines,a=Gs(r),u=o.lineWidth,s=o.color;if(i)return a.strokeStyle=s,a.lineWidth=u,Ys(a,n.getJawOutline()),Ys(a,n.getLeftEyeBrow()),Ys(a,n.getRightEyeBrow()),Ys(a,n.getNose()),Ys(a,n.getLeftEye(),!0),Ys(a,n.getRightEye(),!0),void Ys(a,n.getMouth(),!0);var l=u/2;a.fillStyle=s,n.getPositions().forEach(function(t){return a.fillRect(t.x-l,t.y-l,u,u)})},Object.defineProperty(t,"__esModule",{value:!0})}); diff --git a/dist/faceDetectionNet/FaceDetectionNet.d.ts b/dist/faceDetectionNet/FaceDetectionNet.d.ts new file mode 100644 index 00000000..1125cafd --- /dev/null +++ b/dist/faceDetectionNet/FaceDetectionNet.d.ts @@ -0,0 +1,15 @@ +import * as tf from '@tensorflow/tfjs-core'; +import { NetInput } from '../NetInput'; +import { TNetInput } from '../types'; +import { FaceDetection } from './FaceDetection'; +export declare class FaceDetectionNet { + private _params; + load(weightsOrUrl?: Float32Array | string): Promise; + extractWeights(weights: Float32Array): void; + private forwardTensor(imgTensor); + forward(input: tf.Tensor | NetInput | TNetInput): { + boxes: tf.Tensor[]; + scores: tf.Tensor[]; + }; + locateFaces(input: tf.Tensor | NetInput | TNetInput, minConfidence?: number, maxResults?: number): Promise; +} diff --git a/dist/faceDetectionNet/FaceDetectionNet.js b/dist/faceDetectionNet/FaceDetectionNet.js new file mode 100644 index 00000000..d6af8d9a --- /dev/null +++ b/dist/faceDetectionNet/FaceDetectionNet.js @@ -0,0 +1,111 @@ +import * as tslib_1 from "tslib"; +import * as tf from '@tensorflow/tfjs-core'; +import { getImageTensor } from '../getImageTensor'; +import { padToSquare } from '../padToSquare'; +import { Rect } from '../Rect'; +import { extractParams } from './extractParams'; +import { FaceDetection } from './FaceDetection'; +import { loadQuantizedParams } from './loadQuantizedParams'; +import { mobileNetV1 } from './mobileNetV1'; +import { nonMaxSuppression } from './nonMaxSuppression'; +import { outputLayer } from './outputLayer'; +import { predictionLayer } from './predictionLayer'; +import { resizeLayer } from './resizeLayer'; +var FaceDetectionNet = /** @class */ (function () { + function FaceDetectionNet() { + } + FaceDetectionNet.prototype.load = function (weightsOrUrl) { + return tslib_1.__awaiter(this, void 0, void 0, function () { + var _a; + return tslib_1.__generator(this, function (_b) { + switch (_b.label) { + case 0: + if (weightsOrUrl instanceof Float32Array) { + this.extractWeights(weightsOrUrl); + return [2 /*return*/]; + } + if (weightsOrUrl && typeof weightsOrUrl !== 'string') { + throw new Error('FaceDetectionNet.load - expected model uri, or weights as Float32Array'); + } + _a = this; + return [4 /*yield*/, loadQuantizedParams(weightsOrUrl)]; + case 1: + _a._params = _b.sent(); + return [2 /*return*/]; + } + }); + }); + }; + FaceDetectionNet.prototype.extractWeights = function (weights) { + this._params = extractParams(weights); + }; + FaceDetectionNet.prototype.forwardTensor = function (imgTensor) { + var _this = this; + if (!this._params) { + throw new Error('FaceDetectionNet - load model before inference'); + } + return tf.tidy(function () { + var resized = resizeLayer(imgTensor); + var features = mobileNetV1(resized, _this._params.mobilenetv1_params); + var _a = predictionLayer(features.out, features.conv11, _this._params.prediction_layer_params), boxPredictions = _a.boxPredictions, classPredictions = _a.classPredictions; + return outputLayer(boxPredictions, classPredictions, _this._params.output_layer_params); + }); + }; + FaceDetectionNet.prototype.forward = function (input) { + var _this = this; + return tf.tidy(function () { return _this.forwardTensor(padToSquare(getImageTensor(input))); }); + }; + FaceDetectionNet.prototype.locateFaces = function (input, minConfidence, maxResults) { + if (minConfidence === void 0) { minConfidence = 0.8; } + if (maxResults === void 0) { maxResults = 100; } + return tslib_1.__awaiter(this, void 0, void 0, function () { + var _this = this; + var paddedHeightRelative, paddedWidthRelative, imageDimensions, _a, _boxes, _scores, boxes, scores, i, scoresData, _b, _c, iouThreshold, indices, results; + return tslib_1.__generator(this, function (_d) { + switch (_d.label) { + case 0: + paddedHeightRelative = 1, paddedWidthRelative = 1; + _a = tf.tidy(function () { + var imgTensor = getImageTensor(input); + var _a = imgTensor.shape.slice(1), height = _a[0], width = _a[1]; + imageDimensions = { width: width, height: height }; + imgTensor = padToSquare(imgTensor); + paddedHeightRelative = imgTensor.shape[1] / height; + paddedWidthRelative = imgTensor.shape[2] / width; + return _this.forwardTensor(imgTensor); + }), _boxes = _a.boxes, _scores = _a.scores; + boxes = _boxes[0]; + scores = _scores[0]; + for (i = 1; i < _boxes.length; i++) { + _boxes[i].dispose(); + _scores[i].dispose(); + } + _c = (_b = Array).from; + return [4 /*yield*/, scores.data()]; + case 1: + scoresData = _c.apply(_b, [_d.sent()]); + iouThreshold = 0.5; + indices = nonMaxSuppression(boxes, scoresData, maxResults, iouThreshold, minConfidence); + results = indices + .map(function (idx) { + var _a = [ + Math.max(0, boxes.get(idx, 0)), + Math.min(1.0, boxes.get(idx, 2)) + ].map(function (val) { return val * paddedHeightRelative; }), top = _a[0], bottom = _a[1]; + var _b = [ + Math.max(0, boxes.get(idx, 1)), + Math.min(1.0, boxes.get(idx, 3)) + ].map(function (val) { return val * paddedWidthRelative; }), left = _b[0], right = _b[1]; + return new FaceDetection(scoresData[idx], new Rect(left, top, right - left, bottom - top), imageDimensions); + }); + boxes.dispose(); + scores.dispose(); + return [2 /*return*/, results]; + } + }); + }); + }; + return FaceDetectionNet; +}()); +export { FaceDetectionNet }; +//# sourceMappingURL=FaceDetectionNet.js.map \ No newline at end of file diff --git a/dist/faceDetectionNet/FaceDetectionNet.js.map b/dist/faceDetectionNet/FaceDetectionNet.js.map new file mode 100644 index 00000000..8c414b1d --- /dev/null +++ b/dist/faceDetectionNet/FaceDetectionNet.js.map @@ -0,0 +1 @@ +{"version":3,"file":"FaceDetectionNet.js","sourceRoot":"","sources":["../../src/faceDetectionNet/FaceDetectionNet.ts"],"names":[],"mappings":";AAAA,OAAO,KAAK,EAAE,MAAM,uBAAuB,CAAC;AAE5C,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAEnD,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAC7C,OAAO,EAAE,IAAI,EAAE,MAAM,SAAS,CAAC;AAE/B,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChD,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChD,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAC5D,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAG5C;IAAA;IAqHA,CAAC;IAjHc,+BAAI,GAAjB,UAAkB,YAAoC;;;;;;wBACpD,IAAI,YAAY,YAAY,YAAY,EAAE;4BACxC,IAAI,CAAC,cAAc,CAAC,YAAY,CAAC,CAAA;4BACjC,sBAAM;yBACP;wBAED,IAAI,YAAY,IAAI,OAAO,YAAY,KAAK,QAAQ,EAAE;4BACpD,MAAM,IAAI,KAAK,CAAC,wEAAwE,CAAC,CAAA;yBAC1F;wBACD,KAAA,IAAI,CAAA;wBAAW,qBAAM,mBAAmB,CAAC,YAAY,CAAC,EAAA;;wBAAtD,GAAK,OAAO,GAAG,SAAuC,CAAA;;;;;KACvD;IAEM,yCAAc,GAArB,UAAsB,OAAqB;QACzC,IAAI,CAAC,OAAO,GAAG,aAAa,CAAC,OAAO,CAAC,CAAA;IACvC,CAAC;IAEO,wCAAa,GAArB,UAAsB,SAAsB;QAA5C,iBAiBC;QAhBC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE;YACjB,MAAM,IAAI,KAAK,CAAC,gDAAgD,CAAC,CAAA;SAClE;QAED,OAAO,EAAE,CAAC,IAAI,CAAC;YAEb,IAAM,OAAO,GAAG,WAAW,CAAC,SAAS,CAAgB,CAAA;YACrD,IAAM,QAAQ,GAAG,WAAW,CAAC,OAAO,EAAE,KAAI,CAAC,OAAO,CAAC,kBAAkB,CAAC,CAAA;YAEhE,IAAA,0FAGkF,EAFtF,kCAAc,EACd,sCAAgB,CACsE;YAExF,OAAO,WAAW,CAAC,cAAc,EAAE,gBAAgB,EAAE,KAAI,CAAC,OAAO,CAAC,mBAAmB,CAAC,CAAA;QACxF,CAAC,CAAC,CAAA;IACJ,CAAC;IAEM,kCAAO,GAAd,UAAe,KAAuC;QAAtD,iBAIC;QAHC,OAAO,EAAE,CAAC,IAAI,CACZ,cAAM,OAAA,KAAI,CAAC,aAAa,CAAC,WAAW,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC,CAAC,EAAtD,CAAsD,CAC7D,CAAA;IACH,CAAC;IAEY,sCAAW,GAAxB,UACE,KAAuC,EACvC,aAA2B,EAC3B,UAAwB;QADxB,8BAAA,EAAA,mBAA2B;QAC3B,2BAAA,EAAA,gBAAwB;;;;;;;wBAGpB,oBAAoB,GAAG,CAAC,EAAE,mBAAmB,GAAG,CAAC,CAAA;wBAG/C,KAGF,EAAE,CAAC,IAAI,CAAC;4BAEV,IAAI,SAAS,GAAG,cAAc,CAAC,KAAK,CAAC,CAAA;4BAC/B,IAAA,6BAA0C,EAAzC,cAAM,EAAE,aAAK,CAA4B;4BAChD,eAAe,GAAG,EAAE,KAAK,OAAA,EAAE,MAAM,QAAA,EAAE,CAAA;4BAEnC,SAAS,GAAG,WAAW,CAAC,SAAS,CAAC,CAAA;4BAClC,oBAAoB,GAAG,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,MAAM,CAAA;4BAClD,mBAAmB,GAAG,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,KAAK,CAAA;4BAEhD,OAAO,KAAI,CAAC,aAAa,CAAC,SAAS,CAAC,CAAA;wBACtC,CAAC,CAAC,EAbO,MAAM,WAAA,EACL,OAAO,YAAA,CAYf;wBAGI,KAAK,GAAG,MAAM,CAAC,CAAC,CAAC,CAAA;wBACjB,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC,CAAA;wBACzB,KAAS,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;4BACtC,MAAM,CAAC,CAAC,CAAC,CAAC,OAAO,EAAE,CAAA;4BACnB,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,EAAE,CAAA;yBACrB;wBAGkB,KAAA,CAAA,KAAA,KAAK,CAAA,CAAC,IAAI,CAAA;wBAAC,qBAAM,MAAM,CAAC,IAAI,EAAE,EAAA;;wBAA3C,UAAU,GAAG,cAAW,SAAmB,EAAC;wBAE5C,YAAY,GAAG,GAAG,CAAA;wBAClB,OAAO,GAAG,iBAAiB,CAC/B,KAAK,EACL,UAAU,EACV,UAAU,EACV,YAAY,EACZ,aAAa,CACd,CAAA;wBAEK,OAAO,GAAG,OAAO;6BACpB,GAAG,CAAC,UAAA,GAAG;4BACA,IAAA;;;wFAGkC,EAHjC,WAAG,EAAE,cAAM,CAGsB;4BAClC,IAAA;;;uFAGiC,EAHhC,YAAI,EAAE,aAAK,CAGqB;4BACvC,OAAO,IAAI,aAAa,CACtB,UAAU,CAAC,GAAG,CAAC,EACf,IAAI,IAAI,CACN,IAAI,EACJ,GAAG,EACH,KAAK,GAAG,IAAI,EACZ,MAAM,GAAG,GAAG,CACb,EACD,eAA6B,CAC9B,CAAA;wBACH,CAAC,CAAC,CAAA;wBAEJ,KAAK,CAAC,OAAO,EAAE,CAAA;wBACf,MAAM,CAAC,OAAO,EAAE,CAAA;wBAEhB,sBAAO,OAAO,EAAA;;;;KACf;IACH,uBAAC;AAAD,CAAC,AArHD,IAqHC"} \ No newline at end of file diff --git a/dist/faceDetectionNet/boxPredictionLayer.d.ts b/dist/faceDetectionNet/boxPredictionLayer.d.ts index 2d2d1ec3..bed8cd15 100644 --- a/dist/faceDetectionNet/boxPredictionLayer.d.ts +++ b/dist/faceDetectionNet/boxPredictionLayer.d.ts @@ -1,6 +1,6 @@ import * as tf from '@tensorflow/tfjs-core'; -import { FaceDetectionNet } from './types'; -export declare function boxPredictionLayer(x: tf.Tensor4D, params: FaceDetectionNet.BoxPredictionParams): { +import { BoxPredictionParams } from './types'; +export declare function boxPredictionLayer(x: tf.Tensor4D, params: BoxPredictionParams): { boxPredictionEncoding: tf.Tensor; classPrediction: tf.Tensor; }; diff --git a/dist/faceDetectionNet/boxPredictionLayer.js.map b/dist/faceDetectionNet/boxPredictionLayer.js.map index 3a002000..21d37f9d 100644 --- a/dist/faceDetectionNet/boxPredictionLayer.js.map +++ b/dist/faceDetectionNet/boxPredictionLayer.js.map @@ -1 +1 @@ -{"version":3,"file":"boxPredictionLayer.js","sourceRoot":"","sources":["../../src/faceDetectionNet/boxPredictionLayer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,uBAAuB,CAAC;AAE5C,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AAIjD,MAAM,6BACJ,CAAc,EACd,MAA4C;IAE5C,OAAO,EAAE,CAAC,IAAI,CAAC;QAEb,IAAM,SAAS,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAA;QAE5B,IAAM,qBAAqB,GAAG,EAAE,CAAC,OAAO,CACtC,SAAS,CAAC,CAAC,EAAE,MAAM,CAAC,6BAA6B,CAAC,EAClD,CAAC,SAAS,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CACtB,CAAA;QACD,IAAM,eAAe,GAAG,EAAE,CAAC,OAAO,CAChC,SAAS,CAAC,CAAC,EAAE,MAAM,CAAC,sBAAsB,CAAC,EAC3C,CAAC,SAAS,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CACnB,CAAA;QAED,OAAO;YACL,qBAAqB,uBAAA;YACrB,eAAe,iBAAA;SAChB,CAAA;IACH,CAAC,CAAC,CAAA;AACJ,CAAC"} \ No newline at end of file +{"version":3,"file":"boxPredictionLayer.js","sourceRoot":"","sources":["../../src/faceDetectionNet/boxPredictionLayer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,uBAAuB,CAAC;AAE5C,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AAIjD,MAAM,6BACJ,CAAc,EACd,MAA2B;IAE3B,OAAO,EAAE,CAAC,IAAI,CAAC;QAEb,IAAM,SAAS,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAA;QAE5B,IAAM,qBAAqB,GAAG,EAAE,CAAC,OAAO,CACtC,SAAS,CAAC,CAAC,EAAE,MAAM,CAAC,6BAA6B,CAAC,EAClD,CAAC,SAAS,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CACtB,CAAA;QACD,IAAM,eAAe,GAAG,EAAE,CAAC,OAAO,CAChC,SAAS,CAAC,CAAC,EAAE,MAAM,CAAC,sBAAsB,CAAC,EAC3C,CAAC,SAAS,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CACnB,CAAA;QAED,OAAO;YACL,qBAAqB,uBAAA;YACrB,eAAe,iBAAA;SAChB,CAAA;IACH,CAAC,CAAC,CAAA;AACJ,CAAC"} \ No newline at end of file diff --git a/dist/faceDetectionNet/extractParams.d.ts b/dist/faceDetectionNet/extractParams.d.ts index 82f31899..d90f3077 100644 --- a/dist/faceDetectionNet/extractParams.d.ts +++ b/dist/faceDetectionNet/extractParams.d.ts @@ -1,2 +1,2 @@ -import { FaceDetectionNet } from './types'; -export declare function extractParams(weights: Float32Array): FaceDetectionNet.NetParams; +import { NetParams } from './types'; +export declare function extractParams(weights: Float32Array): NetParams; diff --git a/dist/faceDetectionNet/extractParams.js.map b/dist/faceDetectionNet/extractParams.js.map index 1b15e01a..ee504e50 100644 --- a/dist/faceDetectionNet/extractParams.js.map +++ b/dist/faceDetectionNet/extractParams.js.map @@ -1 +1 @@ -{"version":3,"file":"extractParams.js","sourceRoot":"","sources":["../../src/faceDetectionNet/extractParams.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,uBAAuB,CAAC;AAE5C,OAAO,EAAE,qBAAqB,EAAE,MAAM,kCAAkC,CAAC;AAIzE,2BAA2B,cAAoD;IAE7E,oCAAoC,WAAmB;QACrD,IAAM,OAAO,GAAG,EAAE,CAAC,QAAQ,CAAC,cAAc,CAAC,CAAC,GAAG,CAAC,GAAG,WAAW,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,WAAW,EAAE,CAAC,CAAC,CAAC,CAAA;QACxF,IAAM,gBAAgB,GAAG,EAAE,CAAC,QAAQ,CAAC,cAAc,CAAC,WAAW,CAAC,CAAC,CAAA;QACjE,IAAM,iBAAiB,GAAG,EAAE,CAAC,QAAQ,CAAC,cAAc,CAAC,WAAW,CAAC,CAAC,CAAA;QAClE,IAAM,eAAe,GAAG,EAAE,CAAC,QAAQ,CAAC,cAAc,CAAC,WAAW,CAAC,CAAC,CAAA;QAChE,IAAM,mBAAmB,GAAG,EAAE,CAAC,QAAQ,CAAC,cAAc,CAAC,WAAW,CAAC,CAAC,CAAA;QAEpE,OAAO;YACL,OAAO,SAAA;YACP,gBAAgB,kBAAA;YAChB,iBAAiB,mBAAA;YACjB,eAAe,iBAAA;YACf,mBAAmB,qBAAA;SACpB,CAAA;IACH,CAAC;IAED,2BACE,UAAkB,EAClB,WAAmB,EACnB,UAAkB;QAElB,IAAM,OAAO,GAAG,EAAE,CAAC,QAAQ,CACzB,cAAc,CAAC,UAAU,GAAG,WAAW,GAAG,UAAU,GAAG,UAAU,CAAC,EAClE,CAAC,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,WAAW,CAAC,CAClD,CAAA;QACD,IAAM,IAAI,GAAG,EAAE,CAAC,QAAQ,CAAC,cAAc,CAAC,WAAW,CAAC,CAAC,CAAA;QAErD,OAAO;YACL,OAAO,SAAA;YACP,IAAI,MAAA;SACL,CAAA;IACH,CAAC;IAED,oCACE,UAAkB,EAClB,WAAmB,EACnB,UAAkB;QAEZ,IAAA,2DAGoD,EAFxD,oBAAO,EACP,cAAI,CACoD;QAE1D,OAAO;YACL,OAAO,SAAA;YACP,iBAAiB,EAAE,IAAI;SACxB,CAAA;IACH,CAAC;IAED,+BAA+B,UAAkB,EAAE,WAAmB;QACpE,IAAM,qBAAqB,GAAG,0BAA0B,CAAC,UAAU,CAAC,CAAA;QACpE,IAAM,qBAAqB,GAAG,0BAA0B,CAAC,UAAU,EAAE,WAAW,EAAE,CAAC,CAAC,CAAA;QAEpF,OAAO;YACL,qBAAqB,uBAAA;YACrB,qBAAqB,uBAAA;SACtB,CAAA;IACH,CAAC;IAED;QAEE,IAAM,aAAa,GAAG,0BAA0B,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,CAAA;QAE1D,IAAM,eAAe,GAAG;YACtB,CAAC,EAAE,EAAE,EAAE,CAAC;YACR,CAAC,EAAE,EAAE,GAAG,CAAC;YACT,CAAC,GAAG,EAAE,GAAG,CAAC;YACV,CAAC,GAAG,EAAE,GAAG,CAAC;YACV,CAAC,GAAG,EAAE,GAAG,CAAC;YACV,CAAC,GAAG,EAAE,GAAG,CAAC;YACV,CAAC,GAAG,EAAE,GAAG,CAAC;YACV,CAAC,GAAG,EAAE,GAAG,CAAC;YACV,CAAC,GAAG,EAAE,GAAG,CAAC;YACV,CAAC,GAAG,EAAE,GAAG,CAAC;YACV,CAAC,GAAG,EAAE,GAAG,CAAC;YACV,CAAC,GAAG,EAAE,IAAI,CAAC;YACX,CAAC,IAAI,EAAE,IAAI,CAAC;SACb,CAAA;QAED,IAAM,gBAAgB,GAAG,eAAe,CAAC,GAAG,CAC1C,UAAC,EAAyB;gBAAxB,kBAAU,EAAE,mBAAW;YAAM,OAAA,qBAAqB,CAAC,UAAU,EAAE,WAAW,CAAC;QAA9C,CAA8C,CAC9E,CAAA;QAED,OAAO;YACL,aAAa,eAAA;YACb,gBAAgB,kBAAA;SACjB,CAAA;IAEH,CAAC;IAED;QACE,IAAM,aAAa,GAAG,0BAA0B,CAAC,IAAI,EAAE,GAAG,EAAE,CAAC,CAAC,CAAA;QAC9D,IAAM,aAAa,GAAG,0BAA0B,CAAC,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC,CAAA;QAC7D,IAAM,aAAa,GAAG,0BAA0B,CAAC,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC,CAAA;QAC7D,IAAM,aAAa,GAAG,0BAA0B,CAAC,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC,CAAA;QAC7D,IAAM,aAAa,GAAG,0BAA0B,CAAC,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC,CAAA;QAC7D,IAAM,aAAa,GAAG,0BAA0B,CAAC,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC,CAAA;QAC7D,IAAM,aAAa,GAAG,0BAA0B,CAAC,GAAG,EAAE,EAAE,EAAE,CAAC,CAAC,CAAA;QAC5D,IAAM,aAAa,GAAG,0BAA0B,CAAC,EAAE,EAAE,GAAG,EAAE,CAAC,CAAC,CAAA;QAE5D,IAAM,+BAA+B,GAAG,iBAAiB,CAAC,GAAG,EAAE,EAAE,EAAE,CAAC,CAAC,CAAA;QACrE,IAAM,wBAAwB,GAAG,iBAAiB,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC,CAAA;QAC7D,IAAM,+BAA+B,GAAG,iBAAiB,CAAC,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC,CAAA;QACtE,IAAM,wBAAwB,GAAG,iBAAiB,CAAC,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC,CAAA;QAC/D,IAAM,+BAA+B,GAAG,iBAAiB,CAAC,GAAG,EAAE,EAAE,EAAE,CAAC,CAAC,CAAA;QACrE,IAAM,wBAAwB,GAAG,iBAAiB,CAAC,GAAG,EAAE,EAAE,EAAE,CAAC,CAAC,CAAA;QAC9D,IAAM,+BAA+B,GAAG,iBAAiB,CAAC,GAAG,EAAE,EAAE,EAAE,CAAC,CAAC,CAAA;QACrE,IAAM,wBAAwB,GAAG,iBAAiB,CAAC,GAAG,EAAE,EAAE,EAAE,CAAC,CAAC,CAAA;QAC9D,IAAM,+BAA+B,GAAG,iBAAiB,CAAC,GAAG,EAAE,EAAE,EAAE,CAAC,CAAC,CAAA;QACrE,IAAM,wBAAwB,GAAG,iBAAiB,CAAC,GAAG,EAAE,EAAE,EAAE,CAAC,CAAC,CAAA;QAC9D,IAAM,+BAA+B,GAAG,iBAAiB,CAAC,GAAG,EAAE,EAAE,EAAE,CAAC,CAAC,CAAA;QACrE,IAAM,wBAAwB,GAAG,iBAAiB,CAAC,GAAG,EAAE,EAAE,EAAE,CAAC,CAAC,CAAA;QAE9D,IAAM,sBAAsB,GAAG;YAC7B,6BAA6B,EAAE,+BAA+B;YAC9D,sBAAsB,EAAE,wBAAwB;SACjD,CAAA;QACD,IAAM,sBAAsB,GAAG;YAC7B,6BAA6B,EAAE,+BAA+B;YAC9D,sBAAsB,EAAE,wBAAwB;SACjD,CAAA;QACD,IAAM,sBAAsB,GAAG;YAC7B,6BAA6B,EAAE,+BAA+B;YAC9D,sBAAsB,EAAE,wBAAwB;SACjD,CAAA;QACD,IAAM,sBAAsB,GAAG;YAC7B,6BAA6B,EAAE,+BAA+B;YAC9D,sBAAsB,EAAE,wBAAwB;SACjD,CAAA;QACD,IAAM,sBAAsB,GAAG;YAC7B,6BAA6B,EAAE,+BAA+B;YAC9D,sBAAsB,EAAE,wBAAwB;SACjD,CAAA;QACD,IAAM,sBAAsB,GAAG;YAC7B,6BAA6B,EAAE,+BAA+B;YAC9D,sBAAsB,EAAE,wBAAwB;SACjD,CAAA;QAED,OAAO;YACL,aAAa,eAAA;YACb,aAAa,eAAA;YACb,aAAa,eAAA;YACb,aAAa,eAAA;YACb,aAAa,eAAA;YACb,aAAa,eAAA;YACb,aAAa,eAAA;YACb,aAAa,eAAA;YACb,sBAAsB,wBAAA;YACtB,sBAAsB,wBAAA;YACtB,sBAAsB,wBAAA;YACtB,sBAAsB,wBAAA;YACtB,sBAAsB,wBAAA;YACtB,sBAAsB,wBAAA;SACvB,CAAA;IACH,CAAC;IAGD,OAAO;QACL,wBAAwB,0BAAA;QACxB,4BAA4B,8BAAA;KAC7B,CAAA;AAEH,CAAC;AAED,MAAM,wBAAwB,OAAqB;IAC3C,IAAA,mCAG4B,EAFhC,kCAAc,EACd,4CAAmB,CACa;IAE5B,IAAA,sCAG+B,EAFnC,sDAAwB,EACxB,8DAA4B,CACO;IAErC,IAAM,kBAAkB,GAAG,wBAAwB,EAAE,CAAA;IACrD,IAAM,uBAAuB,GAAG,4BAA4B,EAAE,CAAA;IAC9D,IAAM,SAAS,GAAG,EAAE,CAAC,QAAQ,CAC3B,cAAc,CAAC,IAAI,GAAG,CAAC,CAAC,EACxB,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,CACb,CAAA;IACD,IAAM,mBAAmB,GAAG;QAC1B,SAAS,WAAA;KACV,CAAA;IAED,IAAI,mBAAmB,EAAE,CAAC,MAAM,KAAK,CAAC,EAAE;QACtC,MAAM,IAAI,KAAK,CAAC,oCAAkC,mBAAmB,EAAE,CAAC,MAAQ,CAAC,CAAA;KAClF;IAED,OAAO;QACL,kBAAkB,oBAAA;QAClB,uBAAuB,yBAAA;QACvB,mBAAmB,qBAAA;KACpB,CAAA;AACH,CAAC"} \ No newline at end of file +{"version":3,"file":"extractParams.js","sourceRoot":"","sources":["../../src/faceDetectionNet/extractParams.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,uBAAuB,CAAC;AAE5C,OAAO,EAAE,qBAAqB,EAAE,MAAM,kCAAkC,CAAC;AAIzE,2BAA2B,cAAoD;IAE7E,oCAAoC,WAAmB;QACrD,IAAM,OAAO,GAAG,EAAE,CAAC,QAAQ,CAAC,cAAc,CAAC,CAAC,GAAG,CAAC,GAAG,WAAW,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,WAAW,EAAE,CAAC,CAAC,CAAC,CAAA;QACxF,IAAM,gBAAgB,GAAG,EAAE,CAAC,QAAQ,CAAC,cAAc,CAAC,WAAW,CAAC,CAAC,CAAA;QACjE,IAAM,iBAAiB,GAAG,EAAE,CAAC,QAAQ,CAAC,cAAc,CAAC,WAAW,CAAC,CAAC,CAAA;QAClE,IAAM,eAAe,GAAG,EAAE,CAAC,QAAQ,CAAC,cAAc,CAAC,WAAW,CAAC,CAAC,CAAA;QAChE,IAAM,mBAAmB,GAAG,EAAE,CAAC,QAAQ,CAAC,cAAc,CAAC,WAAW,CAAC,CAAC,CAAA;QAEpE,OAAO;YACL,OAAO,SAAA;YACP,gBAAgB,kBAAA;YAChB,iBAAiB,mBAAA;YACjB,eAAe,iBAAA;YACf,mBAAmB,qBAAA;SACpB,CAAA;IACH,CAAC;IAED,2BACE,UAAkB,EAClB,WAAmB,EACnB,UAAkB;QAElB,IAAM,OAAO,GAAG,EAAE,CAAC,QAAQ,CACzB,cAAc,CAAC,UAAU,GAAG,WAAW,GAAG,UAAU,GAAG,UAAU,CAAC,EAClE,CAAC,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,WAAW,CAAC,CAClD,CAAA;QACD,IAAM,IAAI,GAAG,EAAE,CAAC,QAAQ,CAAC,cAAc,CAAC,WAAW,CAAC,CAAC,CAAA;QAErD,OAAO;YACL,OAAO,SAAA;YACP,IAAI,MAAA;SACL,CAAA;IACH,CAAC;IAED,oCACE,UAAkB,EAClB,WAAmB,EACnB,UAAkB;QAEZ,IAAA,2DAGoD,EAFxD,oBAAO,EACP,cAAI,CACoD;QAE1D,OAAO;YACL,OAAO,SAAA;YACP,iBAAiB,EAAE,IAAI;SACxB,CAAA;IACH,CAAC;IAED,+BACE,UAAkB,EAClB,WAAmB;QAEnB,IAAM,qBAAqB,GAAG,0BAA0B,CAAC,UAAU,CAAC,CAAA;QACpE,IAAM,qBAAqB,GAAG,0BAA0B,CAAC,UAAU,EAAE,WAAW,EAAE,CAAC,CAAC,CAAA;QAEpF,OAAO;YACL,qBAAqB,uBAAA;YACrB,qBAAqB,uBAAA;SACtB,CAAA;IACH,CAAC;IAED;QAEE,IAAM,aAAa,GAAG,0BAA0B,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,CAAA;QAE1D,IAAM,eAAe,GAAG;YACtB,CAAC,EAAE,EAAE,EAAE,CAAC;YACR,CAAC,EAAE,EAAE,GAAG,CAAC;YACT,CAAC,GAAG,EAAE,GAAG,CAAC;YACV,CAAC,GAAG,EAAE,GAAG,CAAC;YACV,CAAC,GAAG,EAAE,GAAG,CAAC;YACV,CAAC,GAAG,EAAE,GAAG,CAAC;YACV,CAAC,GAAG,EAAE,GAAG,CAAC;YACV,CAAC,GAAG,EAAE,GAAG,CAAC;YACV,CAAC,GAAG,EAAE,GAAG,CAAC;YACV,CAAC,GAAG,EAAE,GAAG,CAAC;YACV,CAAC,GAAG,EAAE,GAAG,CAAC;YACV,CAAC,GAAG,EAAE,IAAI,CAAC;YACX,CAAC,IAAI,EAAE,IAAI,CAAC;SACb,CAAA;QAED,IAAM,gBAAgB,GAAG,eAAe,CAAC,GAAG,CAC1C,UAAC,EAAyB;gBAAxB,kBAAU,EAAE,mBAAW;YAAM,OAAA,qBAAqB,CAAC,UAAU,EAAE,WAAW,CAAC;QAA9C,CAA8C,CAC9E,CAAA;QAED,OAAO;YACL,aAAa,eAAA;YACb,gBAAgB,kBAAA;SACjB,CAAA;IAEH,CAAC;IAED;QACE,IAAM,aAAa,GAAG,0BAA0B,CAAC,IAAI,EAAE,GAAG,EAAE,CAAC,CAAC,CAAA;QAC9D,IAAM,aAAa,GAAG,0BAA0B,CAAC,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC,CAAA;QAC7D,IAAM,aAAa,GAAG,0BAA0B,CAAC,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC,CAAA;QAC7D,IAAM,aAAa,GAAG,0BAA0B,CAAC,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC,CAAA;QAC7D,IAAM,aAAa,GAAG,0BAA0B,CAAC,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC,CAAA;QAC7D,IAAM,aAAa,GAAG,0BAA0B,CAAC,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC,CAAA;QAC7D,IAAM,aAAa,GAAG,0BAA0B,CAAC,GAAG,EAAE,EAAE,EAAE,CAAC,CAAC,CAAA;QAC5D,IAAM,aAAa,GAAG,0BAA0B,CAAC,EAAE,EAAE,GAAG,EAAE,CAAC,CAAC,CAAA;QAE5D,IAAM,+BAA+B,GAAG,iBAAiB,CAAC,GAAG,EAAE,EAAE,EAAE,CAAC,CAAC,CAAA;QACrE,IAAM,wBAAwB,GAAG,iBAAiB,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC,CAAA;QAC7D,IAAM,+BAA+B,GAAG,iBAAiB,CAAC,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC,CAAA;QACtE,IAAM,wBAAwB,GAAG,iBAAiB,CAAC,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC,CAAA;QAC/D,IAAM,+BAA+B,GAAG,iBAAiB,CAAC,GAAG,EAAE,EAAE,EAAE,CAAC,CAAC,CAAA;QACrE,IAAM,wBAAwB,GAAG,iBAAiB,CAAC,GAAG,EAAE,EAAE,EAAE,CAAC,CAAC,CAAA;QAC9D,IAAM,+BAA+B,GAAG,iBAAiB,CAAC,GAAG,EAAE,EAAE,EAAE,CAAC,CAAC,CAAA;QACrE,IAAM,wBAAwB,GAAG,iBAAiB,CAAC,GAAG,EAAE,EAAE,EAAE,CAAC,CAAC,CAAA;QAC9D,IAAM,+BAA+B,GAAG,iBAAiB,CAAC,GAAG,EAAE,EAAE,EAAE,CAAC,CAAC,CAAA;QACrE,IAAM,wBAAwB,GAAG,iBAAiB,CAAC,GAAG,EAAE,EAAE,EAAE,CAAC,CAAC,CAAA;QAC9D,IAAM,+BAA+B,GAAG,iBAAiB,CAAC,GAAG,EAAE,EAAE,EAAE,CAAC,CAAC,CAAA;QACrE,IAAM,wBAAwB,GAAG,iBAAiB,CAAC,GAAG,EAAE,EAAE,EAAE,CAAC,CAAC,CAAA;QAE9D,IAAM,sBAAsB,GAAG;YAC7B,6BAA6B,EAAE,+BAA+B;YAC9D,sBAAsB,EAAE,wBAAwB;SACjD,CAAA;QACD,IAAM,sBAAsB,GAAG;YAC7B,6BAA6B,EAAE,+BAA+B;YAC9D,sBAAsB,EAAE,wBAAwB;SACjD,CAAA;QACD,IAAM,sBAAsB,GAAG;YAC7B,6BAA6B,EAAE,+BAA+B;YAC9D,sBAAsB,EAAE,wBAAwB;SACjD,CAAA;QACD,IAAM,sBAAsB,GAAG;YAC7B,6BAA6B,EAAE,+BAA+B;YAC9D,sBAAsB,EAAE,wBAAwB;SACjD,CAAA;QACD,IAAM,sBAAsB,GAAG;YAC7B,6BAA6B,EAAE,+BAA+B;YAC9D,sBAAsB,EAAE,wBAAwB;SACjD,CAAA;QACD,IAAM,sBAAsB,GAAG;YAC7B,6BAA6B,EAAE,+BAA+B;YAC9D,sBAAsB,EAAE,wBAAwB;SACjD,CAAA;QAED,OAAO;YACL,aAAa,eAAA;YACb,aAAa,eAAA;YACb,aAAa,eAAA;YACb,aAAa,eAAA;YACb,aAAa,eAAA;YACb,aAAa,eAAA;YACb,aAAa,eAAA;YACb,aAAa,eAAA;YACb,sBAAsB,wBAAA;YACtB,sBAAsB,wBAAA;YACtB,sBAAsB,wBAAA;YACtB,sBAAsB,wBAAA;YACtB,sBAAsB,wBAAA;YACtB,sBAAsB,wBAAA;SACvB,CAAA;IACH,CAAC;IAGD,OAAO;QACL,wBAAwB,0BAAA;QACxB,4BAA4B,8BAAA;KAC7B,CAAA;AAEH,CAAC;AAED,MAAM,wBAAwB,OAAqB;IAC3C,IAAA,mCAG4B,EAFhC,kCAAc,EACd,4CAAmB,CACa;IAE5B,IAAA,sCAG+B,EAFnC,sDAAwB,EACxB,8DAA4B,CACO;IAErC,IAAM,kBAAkB,GAAG,wBAAwB,EAAE,CAAA;IACrD,IAAM,uBAAuB,GAAG,4BAA4B,EAAE,CAAA;IAC9D,IAAM,SAAS,GAAG,EAAE,CAAC,QAAQ,CAC3B,cAAc,CAAC,IAAI,GAAG,CAAC,CAAC,EACxB,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,CACb,CAAA;IACD,IAAM,mBAAmB,GAAG;QAC1B,SAAS,WAAA;KACV,CAAA;IAED,IAAI,mBAAmB,EAAE,CAAC,MAAM,KAAK,CAAC,EAAE;QACtC,MAAM,IAAI,KAAK,CAAC,oCAAkC,mBAAmB,EAAE,CAAC,MAAQ,CAAC,CAAA;KAClF;IAED,OAAO;QACL,kBAAkB,oBAAA;QAClB,uBAAuB,yBAAA;QACvB,mBAAmB,qBAAA;KACpB,CAAA;AACH,CAAC"} \ No newline at end of file diff --git a/dist/faceDetectionNet/index.d.ts b/dist/faceDetectionNet/index.d.ts index c7220e52..c51713ec 100644 --- a/dist/faceDetectionNet/index.d.ts +++ b/dist/faceDetectionNet/index.d.ts @@ -1,10 +1,3 @@ -import * as tf from '@tensorflow/tfjs-core'; -import { NetInput } from '../NetInput'; -import { FaceDetection } from './FaceDetection'; -export declare function faceDetectionNet(weights: Float32Array): { - forward: (input: string | HTMLCanvasElement | HTMLImageElement | HTMLVideoElement | (string | HTMLCanvasElement | HTMLImageElement | HTMLVideoElement)[] | tf.Tensor | NetInput) => { - boxes: tf.Tensor[]; - scores: tf.Tensor[]; - }; - locateFaces: (input: string | HTMLCanvasElement | HTMLImageElement | HTMLVideoElement | (string | HTMLCanvasElement | HTMLImageElement | HTMLVideoElement)[] | tf.Tensor | NetInput, minConfidence?: number, maxResults?: number) => Promise; -}; +import { FaceDetectionNet } from './FaceDetectionNet'; +export * from './FaceDetectionNet'; +export declare function faceDetectionNet(weights: Float32Array): FaceDetectionNet; diff --git a/dist/faceDetectionNet/index.js b/dist/faceDetectionNet/index.js index 8bc3956c..792ac434 100644 --- a/dist/faceDetectionNet/index.js +++ b/dist/faceDetectionNet/index.js @@ -1,80 +1,8 @@ -import * as tslib_1 from "tslib"; -import * as tf from '@tensorflow/tfjs-core'; -import { getImageTensor } from '../getImageTensor'; -import { padToSquare } from '../padToSquare'; -import { extractParams } from './extractParams'; -import { FaceDetection } from './FaceDetection'; -import { mobileNetV1 } from './mobileNetV1'; -import { nonMaxSuppression } from './nonMaxSuppression'; -import { outputLayer } from './outputLayer'; -import { predictionLayer } from './predictionLayer'; -import { resizeLayer } from './resizeLayer'; -import { Rect } from '../Rect'; +import { FaceDetectionNet } from './FaceDetectionNet'; +export * from './FaceDetectionNet'; export function faceDetectionNet(weights) { - var params = extractParams(weights); - function forwardTensor(imgTensor) { - return tf.tidy(function () { - var resized = resizeLayer(imgTensor); - var features = mobileNetV1(resized, params.mobilenetv1_params); - var _a = predictionLayer(features.out, features.conv11, params.prediction_layer_params), boxPredictions = _a.boxPredictions, classPredictions = _a.classPredictions; - return outputLayer(boxPredictions, classPredictions, params.output_layer_params); - }); - } - function forward(input) { - return tf.tidy(function () { return forwardTensor(padToSquare(getImageTensor(input))); }); - } - function locateFaces(input, minConfidence, maxResults) { - if (minConfidence === void 0) { minConfidence = 0.8; } - if (maxResults === void 0) { maxResults = 100; } - return tslib_1.__awaiter(this, void 0, void 0, function () { - var paddedHeightRelative, paddedWidthRelative, imageDimensions, _a, _boxes, _scores, boxes, scores, i, scoresData, _b, _c, iouThreshold, indices, results; - return tslib_1.__generator(this, function (_d) { - switch (_d.label) { - case 0: - paddedHeightRelative = 1, paddedWidthRelative = 1; - _a = tf.tidy(function () { - var imgTensor = getImageTensor(input); - var _a = imgTensor.shape.slice(1), height = _a[0], width = _a[1]; - imageDimensions = { width: width, height: height }; - imgTensor = padToSquare(imgTensor); - paddedHeightRelative = imgTensor.shape[1] / height; - paddedWidthRelative = imgTensor.shape[2] / width; - return forwardTensor(imgTensor); - }), _boxes = _a.boxes, _scores = _a.scores; - boxes = _boxes[0]; - scores = _scores[0]; - for (i = 1; i < _boxes.length; i++) { - _boxes[i].dispose(); - _scores[i].dispose(); - } - _c = (_b = Array).from; - return [4 /*yield*/, scores.data()]; - case 1: - scoresData = _c.apply(_b, [_d.sent()]); - iouThreshold = 0.5; - indices = nonMaxSuppression(boxes, scoresData, maxResults, iouThreshold, minConfidence); - results = indices - .map(function (idx) { - var _a = [ - Math.max(0, boxes.get(idx, 0)), - Math.min(1.0, boxes.get(idx, 2)) - ].map(function (val) { return val * paddedHeightRelative; }), top = _a[0], bottom = _a[1]; - var _b = [ - Math.max(0, boxes.get(idx, 1)), - Math.min(1.0, boxes.get(idx, 3)) - ].map(function (val) { return val * paddedWidthRelative; }), left = _b[0], right = _b[1]; - return new FaceDetection(scoresData[idx], new Rect(left, top, right - left, bottom - top), imageDimensions); - }); - boxes.dispose(); - scores.dispose(); - return [2 /*return*/, results]; - } - }); - }); - } - return { - forward: forward, - locateFaces: locateFaces - }; + var net = new FaceDetectionNet(); + net.extractWeights(weights); + return net; } //# sourceMappingURL=index.js.map \ No newline at end of file diff --git a/dist/faceDetectionNet/index.js.map b/dist/faceDetectionNet/index.js.map index fa05745a..7148c910 100644 --- a/dist/faceDetectionNet/index.js.map +++ b/dist/faceDetectionNet/index.js.map @@ -1 +1 @@ -{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/faceDetectionNet/index.ts"],"names":[],"mappings":";AAAA,OAAO,KAAK,EAAE,MAAM,uBAAuB,CAAC;AAE5C,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAEnD,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAE7C,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChD,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChD,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,EAAE,IAAI,EAAE,MAAM,SAAS,CAAC;AAE/B,MAAM,2BAA2B,OAAqB;IACpD,IAAM,MAAM,GAAG,aAAa,CAAC,OAAO,CAAC,CAAA;IAErC,uBAAuB,SAAsB;QAC3C,OAAO,EAAE,CAAC,IAAI,CAAC;YAEb,IAAM,OAAO,GAAG,WAAW,CAAC,SAAS,CAAgB,CAAA;YACrD,IAAM,QAAQ,GAAG,WAAW,CAAC,OAAO,EAAE,MAAM,CAAC,kBAAkB,CAAC,CAAA;YAE1D,IAAA,mFAG4E,EAFhF,kCAAc,EACd,sCAAgB,CACgE;YAElF,OAAO,WAAW,CAAC,cAAc,EAAE,gBAAgB,EAAE,MAAM,CAAC,mBAAmB,CAAC,CAAA;QAClF,CAAC,CAAC,CAAA;IACJ,CAAC;IAED,iBAAiB,KAAuC;QACtD,OAAO,EAAE,CAAC,IAAI,CACZ,cAAM,OAAA,aAAa,CAAC,WAAW,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC,CAAC,EAAjD,CAAiD,CACxD,CAAA;IACH,CAAC;IAED,qBACE,KAAuC,EACvC,aAA2B,EAC3B,UAAwB;QADxB,8BAAA,EAAA,mBAA2B;QAC3B,2BAAA,EAAA,gBAAwB;;;;;;wBAGpB,oBAAoB,GAAG,CAAC,EAAE,mBAAmB,GAAG,CAAC,CAAA;wBAG/C,KAGF,EAAE,CAAC,IAAI,CAAC;4BAEV,IAAI,SAAS,GAAG,cAAc,CAAC,KAAK,CAAC,CAAA;4BAC/B,IAAA,6BAA0C,EAAzC,cAAM,EAAE,aAAK,CAA4B;4BAChD,eAAe,GAAG,EAAE,KAAK,OAAA,EAAE,MAAM,QAAA,EAAE,CAAA;4BAEnC,SAAS,GAAG,WAAW,CAAC,SAAS,CAAC,CAAA;4BAClC,oBAAoB,GAAG,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,MAAM,CAAA;4BAClD,mBAAmB,GAAG,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,KAAK,CAAA;4BAEhD,OAAO,aAAa,CAAC,SAAS,CAAC,CAAA;wBACjC,CAAC,CAAC,EAbO,MAAM,WAAA,EACL,OAAO,YAAA,CAYf;wBAGI,KAAK,GAAG,MAAM,CAAC,CAAC,CAAC,CAAA;wBACjB,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC,CAAA;wBACzB,KAAS,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;4BACtC,MAAM,CAAC,CAAC,CAAC,CAAC,OAAO,EAAE,CAAA;4BACnB,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,EAAE,CAAA;yBACrB;wBAGkB,KAAA,CAAA,KAAA,KAAK,CAAA,CAAC,IAAI,CAAA;wBAAC,qBAAM,MAAM,CAAC,IAAI,EAAE,EAAA;;wBAA3C,UAAU,GAAG,cAAW,SAAmB,EAAC;wBAE5C,YAAY,GAAG,GAAG,CAAA;wBAClB,OAAO,GAAG,iBAAiB,CAC/B,KAAK,EACL,UAAU,EACV,UAAU,EACV,YAAY,EACZ,aAAa,CACd,CAAA;wBAEK,OAAO,GAAG,OAAO;6BACpB,GAAG,CAAC,UAAA,GAAG;4BACA,IAAA;;;wFAGkC,EAHjC,WAAG,EAAE,cAAM,CAGsB;4BAClC,IAAA;;;uFAGiC,EAHhC,YAAI,EAAE,aAAK,CAGqB;4BACvC,OAAO,IAAI,aAAa,CACtB,UAAU,CAAC,GAAG,CAAC,EACf,IAAI,IAAI,CACN,IAAI,EACJ,GAAG,EACH,KAAK,GAAG,IAAI,EACZ,MAAM,GAAG,GAAG,CACb,EACD,eAA6B,CAC9B,CAAA;wBACH,CAAC,CAAC,CAAA;wBAEJ,KAAK,CAAC,OAAO,EAAE,CAAA;wBACf,MAAM,CAAC,OAAO,EAAE,CAAA;wBAEhB,sBAAO,OAAO,EAAA;;;;KACf;IAED,OAAO;QACL,OAAO,SAAA;QACP,WAAW,aAAA;KACZ,CAAA;AACH,CAAC"} \ No newline at end of file +{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/faceDetectionNet/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAEtD,cAAc,oBAAoB,CAAC;AAEnC,MAAM,2BAA2B,OAAqB;IACpD,IAAM,GAAG,GAAG,IAAI,gBAAgB,EAAE,CAAA;IAClC,GAAG,CAAC,cAAc,CAAC,OAAO,CAAC,CAAA;IAC3B,OAAO,GAAG,CAAA;AACZ,CAAC"} \ No newline at end of file diff --git a/dist/faceDetectionNet/loadQuantizedParams.d.ts b/dist/faceDetectionNet/loadQuantizedParams.d.ts new file mode 100644 index 00000000..fbf5b119 --- /dev/null +++ b/dist/faceDetectionNet/loadQuantizedParams.d.ts @@ -0,0 +1 @@ +export declare function loadQuantizedParams(uri: string | undefined): Promise; diff --git a/dist/faceDetectionNet/loadQuantizedParams.js b/dist/faceDetectionNet/loadQuantizedParams.js new file mode 100644 index 00000000..9e52139b --- /dev/null +++ b/dist/faceDetectionNet/loadQuantizedParams.js @@ -0,0 +1,125 @@ +import * as tslib_1 from "tslib"; +import { isTensor1D, isTensor4D, isTensor3D } from '../commons/isTensor'; +import { loadWeightMap } from '../commons/loadWeightMap'; +var DEFAULT_MODEL_NAME = 'face_detection_model'; +function extractorsFactory(weightMap) { + function extractPointwiseConvParams(prefix, idx) { + var pointwise_conv_params = { + filters: weightMap[prefix + "/Conv2d_" + idx + "_pointwise/weights"], + batch_norm_offset: weightMap[prefix + "/Conv2d_" + idx + "_pointwise/convolution_bn_offset"] + }; + if (!isTensor4D(pointwise_conv_params.filters)) { + throw new Error("expected weightMap[" + prefix + "/Conv2d_" + idx + "_pointwise/weights] to be a Tensor4D, instead have " + pointwise_conv_params.filters); + } + if (!isTensor1D(pointwise_conv_params.batch_norm_offset)) { + throw new Error("expected weightMap[" + prefix + "/Conv2d_" + idx + "_pointwise/convolution_bn_offset] to be a Tensor1D, instead have " + pointwise_conv_params.batch_norm_offset); + } + return pointwise_conv_params; + } + function extractConvPairParams(idx) { + var depthwise_conv_params = { + filters: weightMap["MobilenetV1/Conv2d_" + idx + "_depthwise/depthwise_weights"], + batch_norm_scale: weightMap["MobilenetV1/Conv2d_" + idx + "_depthwise/BatchNorm/gamma"], + batch_norm_offset: weightMap["MobilenetV1/Conv2d_" + idx + "_depthwise/BatchNorm/beta"], + batch_norm_mean: weightMap["MobilenetV1/Conv2d_" + idx + "_depthwise/BatchNorm/moving_mean"], + batch_norm_variance: weightMap["MobilenetV1/Conv2d_" + idx + "_depthwise/BatchNorm/moving_variance"], + }; + if (!isTensor4D(depthwise_conv_params.filters)) { + throw new Error("expected weightMap[MobilenetV1/Conv2d_" + idx + "_depthwise/depthwise_weights] to be a Tensor4D, instead have " + depthwise_conv_params.filters); + } + if (!isTensor1D(depthwise_conv_params.batch_norm_scale)) { + throw new Error("expected weightMap[MobilenetV1/Conv2d_" + idx + "_depthwise/BatchNorm/gamma] to be a Tensor1D, instead have " + depthwise_conv_params.batch_norm_scale); + } + if (!isTensor1D(depthwise_conv_params.batch_norm_offset)) { + throw new Error("expected weightMap[MobilenetV1/Conv2d_" + idx + "_depthwise/BatchNorm/beta] to be a Tensor1D, instead have " + depthwise_conv_params.batch_norm_offset); + } + if (!isTensor1D(depthwise_conv_params.batch_norm_mean)) { + throw new Error("expected weightMap[MobilenetV1/Conv2d_" + idx + "_depthwise/BatchNorm/moving_mean] to be a Tensor1D, instead have " + depthwise_conv_params.batch_norm_mean); + } + if (!isTensor1D(depthwise_conv_params.batch_norm_variance)) { + throw new Error("expected weightMap[MobilenetV1/Conv2d_" + idx + "_depthwise/BatchNorm/moving_variance] to be a Tensor1D, instead have " + depthwise_conv_params.batch_norm_variance); + } + return { + depthwise_conv_params: depthwise_conv_params, + pointwise_conv_params: extractPointwiseConvParams('MobilenetV1', idx) + }; + } + function extractMobilenetV1Params() { + return { + conv_0_params: extractPointwiseConvParams('MobilenetV1', 0), + conv_pair_params: Array(13).fill(0).map(function (_, i) { return extractConvPairParams(i + 1); }) + }; + } + function extractBoxPredictorParams(idx) { + var params = { + box_encoding_predictor_params: { + filters: weightMap["Prediction/BoxPredictor_" + idx + "/BoxEncodingPredictor/weights"], + bias: weightMap["Prediction/BoxPredictor_" + idx + "/BoxEncodingPredictor/biases"] + }, + class_predictor_params: { + filters: weightMap["Prediction/BoxPredictor_" + idx + "/ClassPredictor/weights"], + bias: weightMap["Prediction/BoxPredictor_" + idx + "/ClassPredictor/biases"] + } + }; + if (!isTensor4D(params.box_encoding_predictor_params.filters)) { + throw new Error("expected weightMap[Prediction/BoxPredictor_" + idx + "/BoxEncodingPredictor/weights] to be a Tensor4D, instead have " + params.box_encoding_predictor_params.filters); + } + if (!isTensor1D(params.box_encoding_predictor_params.bias)) { + throw new Error("expected weightMap[Prediction/BoxPredictor_" + idx + "/BoxEncodingPredictor/biases] to be a Tensor1D, instead have " + params.box_encoding_predictor_params.bias); + } + if (!isTensor4D(params.class_predictor_params.filters)) { + throw new Error("expected weightMap[Prediction/BoxPredictor_" + idx + "/ClassPredictor/weights] to be a Tensor4D, instead have " + params.class_predictor_params.filters); + } + if (!isTensor1D(params.class_predictor_params.bias)) { + throw new Error("expected weightMap[Prediction/BoxPredictor_" + idx + "/ClassPredictor/biases] to be a Tensor1D, instead have " + params.class_predictor_params.bias); + } + return params; + } + function extractPredictionLayerParams() { + return { + conv_0_params: extractPointwiseConvParams('Prediction', 0), + conv_1_params: extractPointwiseConvParams('Prediction', 1), + conv_2_params: extractPointwiseConvParams('Prediction', 2), + conv_3_params: extractPointwiseConvParams('Prediction', 3), + conv_4_params: extractPointwiseConvParams('Prediction', 4), + conv_5_params: extractPointwiseConvParams('Prediction', 5), + conv_6_params: extractPointwiseConvParams('Prediction', 6), + conv_7_params: extractPointwiseConvParams('Prediction', 7), + box_predictor_0_params: extractBoxPredictorParams(0), + box_predictor_1_params: extractBoxPredictorParams(1), + box_predictor_2_params: extractBoxPredictorParams(2), + box_predictor_3_params: extractBoxPredictorParams(3), + box_predictor_4_params: extractBoxPredictorParams(4), + box_predictor_5_params: extractBoxPredictorParams(5) + }; + } + return { + extractMobilenetV1Params: extractMobilenetV1Params, + extractPredictionLayerParams: extractPredictionLayerParams + }; +} +export function loadQuantizedParams(uri) { + return tslib_1.__awaiter(this, void 0, void 0, function () { + var weightMap, _a, extractMobilenetV1Params, extractPredictionLayerParams, extra_dim; + return tslib_1.__generator(this, function (_b) { + switch (_b.label) { + case 0: return [4 /*yield*/, loadWeightMap(uri, DEFAULT_MODEL_NAME)]; + case 1: + weightMap = _b.sent(); + _a = extractorsFactory(weightMap), extractMobilenetV1Params = _a.extractMobilenetV1Params, extractPredictionLayerParams = _a.extractPredictionLayerParams; + extra_dim = weightMap['Output/extra_dim']; + if (!isTensor3D(extra_dim)) { + throw new Error("expected weightMap['Output/extra_dim'] to be a Tensor3D, instead have " + extra_dim); + } + return [2 /*return*/, { + mobilenetv1_params: extractMobilenetV1Params(), + prediction_layer_params: extractPredictionLayerParams(), + output_layer_params: { + extra_dim: extra_dim + } + }]; + } + }); + }); +} +//# sourceMappingURL=loadQuantizedParams.js.map \ No newline at end of file diff --git a/dist/faceDetectionNet/loadQuantizedParams.js.map b/dist/faceDetectionNet/loadQuantizedParams.js.map new file mode 100644 index 00000000..11c8f45d --- /dev/null +++ b/dist/faceDetectionNet/loadQuantizedParams.js.map @@ -0,0 +1 @@ +{"version":3,"file":"loadQuantizedParams.js","sourceRoot":"","sources":["../../src/faceDetectionNet/loadQuantizedParams.ts"],"names":[],"mappings":";AAAA,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AACzE,OAAO,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAGzD,IAAM,kBAAkB,GAAG,sBAAsB,CAAA;AAEjD,2BAA2B,SAAc;IAEvC,oCAAoC,MAAc,EAAE,GAAW;QAE7D,IAAM,qBAAqB,GAAG;YAC5B,OAAO,EAAE,SAAS,CAAI,MAAM,gBAAW,GAAG,uBAAoB,CAAC;YAC/D,iBAAiB,EAAE,SAAS,CAAI,MAAM,gBAAW,GAAG,qCAAkC,CAAC;SACxF,CAAA;QAED,IAAI,CAAC,UAAU,CAAC,qBAAqB,CAAC,OAAO,CAAC,EAAE;YAC9C,MAAM,IAAI,KAAK,CAAC,wBAAsB,MAAM,gBAAW,GAAG,2DAAsD,qBAAqB,CAAC,OAAS,CAAC,CAAA;SACjJ;QAED,IAAI,CAAC,UAAU,CAAC,qBAAqB,CAAC,iBAAiB,CAAC,EAAE;YACxD,MAAM,IAAI,KAAK,CAAC,wBAAsB,MAAM,gBAAW,GAAG,yEAAoE,qBAAqB,CAAC,iBAAmB,CAAC,CAAA;SACzK;QAED,OAAO,qBAAqB,CAAA;IAC9B,CAAC;IAED,+BAA+B,GAAW;QAExC,IAAM,qBAAqB,GAAG;YAC5B,OAAO,EAAE,SAAS,CAAC,wBAAsB,GAAG,iCAA8B,CAAC;YAC3E,gBAAgB,EAAE,SAAS,CAAC,wBAAsB,GAAG,+BAA4B,CAAC;YAClF,iBAAiB,EAAE,SAAS,CAAC,wBAAsB,GAAG,8BAA2B,CAAC;YAClF,eAAe,EAAE,SAAS,CAAC,wBAAsB,GAAG,qCAAkC,CAAC;YACvF,mBAAmB,EAAE,SAAS,CAAC,wBAAsB,GAAG,yCAAsC,CAAC;SAChG,CAAA;QAED,IAAI,CAAC,UAAU,CAAC,qBAAqB,CAAC,OAAO,CAAC,EAAE;YAC9C,MAAM,IAAI,KAAK,CAAC,2CAAyC,GAAG,qEAAgE,qBAAqB,CAAC,OAAS,CAAC,CAAA;SAC7J;QAED,IAAI,CAAC,UAAU,CAAC,qBAAqB,CAAC,gBAAgB,CAAC,EAAE;YACvD,MAAM,IAAI,KAAK,CAAC,2CAAyC,GAAG,mEAA8D,qBAAqB,CAAC,gBAAkB,CAAC,CAAA;SACpK;QAED,IAAI,CAAC,UAAU,CAAC,qBAAqB,CAAC,iBAAiB,CAAC,EAAE;YACxD,MAAM,IAAI,KAAK,CAAC,2CAAyC,GAAG,kEAA6D,qBAAqB,CAAC,iBAAmB,CAAC,CAAA;SACpK;QAED,IAAI,CAAC,UAAU,CAAC,qBAAqB,CAAC,eAAe,CAAC,EAAE;YACtD,MAAM,IAAI,KAAK,CAAC,2CAAyC,GAAG,yEAAoE,qBAAqB,CAAC,eAAiB,CAAC,CAAA;SACzK;QAED,IAAI,CAAC,UAAU,CAAC,qBAAqB,CAAC,mBAAmB,CAAC,EAAE;YAC1D,MAAM,IAAI,KAAK,CAAC,2CAAyC,GAAG,6EAAwE,qBAAqB,CAAC,mBAAqB,CAAC,CAAA;SACjL;QAED,OAAO;YACL,qBAAqB,uBAAA;YACrB,qBAAqB,EAAE,0BAA0B,CAAC,aAAa,EAAE,GAAG,CAAC;SACtE,CAAA;IACH,CAAC;IAED;QACE,OAAO;YACL,aAAa,EAAE,0BAA0B,CAAC,aAAa,EAAE,CAAC,CAAC;YAC3D,gBAAgB,EAAE,KAAK,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,UAAC,CAAC,EAAE,CAAC,IAAK,OAAA,qBAAqB,CAAC,CAAC,GAAG,CAAC,CAAC,EAA5B,CAA4B,CAAC;SAChF,CAAA;IACH,CAAC;IAED,mCAAmC,GAAW;QAE5C,IAAM,MAAM,GAAG;YACb,6BAA6B,EAAE;gBAC7B,OAAO,EAAE,SAAS,CAAC,6BAA2B,GAAG,kCAA+B,CAAC;gBACjF,IAAI,EAAE,SAAS,CAAC,6BAA2B,GAAG,iCAA8B,CAAC;aAC9E;YACD,sBAAsB,EAAE;gBACtB,OAAO,EAAE,SAAS,CAAC,6BAA2B,GAAG,4BAAyB,CAAC;gBAC3E,IAAI,EAAE,SAAS,CAAC,6BAA2B,GAAG,2BAAwB,CAAC;aACxE;SACF,CAAA;QAED,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,6BAA6B,CAAC,OAAO,CAAC,EAAE;YAC7D,MAAM,IAAI,KAAK,CAAC,gDAA8C,GAAG,sEAAiE,MAAM,CAAC,6BAA6B,CAAC,OAAS,CAAC,CAAA;SAClL;QAED,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,6BAA6B,CAAC,IAAI,CAAC,EAAE;YAC1D,MAAM,IAAI,KAAK,CAAC,gDAA8C,GAAG,qEAAgE,MAAM,CAAC,6BAA6B,CAAC,IAAM,CAAC,CAAA;SAC9K;QAED,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,sBAAsB,CAAC,OAAO,CAAC,EAAE;YACtD,MAAM,IAAI,KAAK,CAAC,gDAA8C,GAAG,gEAA2D,MAAM,CAAC,sBAAsB,CAAC,OAAS,CAAC,CAAA;SACrK;QAED,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,sBAAsB,CAAC,IAAI,CAAC,EAAE;YACnD,MAAM,IAAI,KAAK,CAAC,gDAA8C,GAAG,+DAA0D,MAAM,CAAC,sBAAsB,CAAC,IAAM,CAAC,CAAA;SACjK;QAED,OAAO,MAAM,CAAA;IACf,CAAC;IAED;QACE,OAAO;YACL,aAAa,EAAE,0BAA0B,CAAC,YAAY,EAAE,CAAC,CAAC;YAC1D,aAAa,EAAE,0BAA0B,CAAC,YAAY,EAAE,CAAC,CAAC;YAC1D,aAAa,EAAE,0BAA0B,CAAC,YAAY,EAAE,CAAC,CAAC;YAC1D,aAAa,EAAE,0BAA0B,CAAC,YAAY,EAAE,CAAC,CAAC;YAC1D,aAAa,EAAE,0BAA0B,CAAC,YAAY,EAAE,CAAC,CAAC;YAC1D,aAAa,EAAE,0BAA0B,CAAC,YAAY,EAAE,CAAC,CAAC;YAC1D,aAAa,EAAE,0BAA0B,CAAC,YAAY,EAAE,CAAC,CAAC;YAC1D,aAAa,EAAE,0BAA0B,CAAC,YAAY,EAAE,CAAC,CAAC;YAC1D,sBAAsB,EAAE,yBAAyB,CAAC,CAAC,CAAC;YACpD,sBAAsB,EAAE,yBAAyB,CAAC,CAAC,CAAC;YACpD,sBAAsB,EAAE,yBAAyB,CAAC,CAAC,CAAC;YACpD,sBAAsB,EAAE,yBAAyB,CAAC,CAAC,CAAC;YACpD,sBAAsB,EAAE,yBAAyB,CAAC,CAAC,CAAC;YACpD,sBAAsB,EAAE,yBAAyB,CAAC,CAAC,CAAC;SACrD,CAAA;IACH,CAAC;IAED,OAAO;QACL,wBAAwB,0BAAA;QACxB,4BAA4B,8BAAA;KAC7B,CAAA;AACH,CAAC;AAED,MAAM,8BAAoC,GAAuB;;;;;wBAC7C,qBAAM,aAAa,CAAC,GAAG,EAAE,kBAAkB,CAAC,EAAA;;oBAAxD,SAAS,GAAG,SAA4C;oBAExD,KAGF,iBAAiB,CAAC,SAAS,CAAC,EAF9B,wBAAwB,8BAAA,EACxB,4BAA4B,kCAAA,CACE;oBAE1B,SAAS,GAAG,SAAS,CAAC,kBAAkB,CAAC,CAAA;oBAC/C,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE;wBAC1B,MAAM,IAAI,KAAK,CAAC,2EAAyE,SAAW,CAAC,CAAA;qBACtG;oBAED,sBAAO;4BACL,kBAAkB,EAAE,wBAAwB,EAAE;4BAC9C,uBAAuB,EAAE,4BAA4B,EAAE;4BACvD,mBAAmB,EAAE;gCACnB,SAAS,WAAA;6BACV;yBACF,EAAA;;;;CACF"} \ No newline at end of file diff --git a/dist/faceDetectionNet/mobileNetV1.d.ts b/dist/faceDetectionNet/mobileNetV1.d.ts index 7dd8061a..05f5c5fe 100644 --- a/dist/faceDetectionNet/mobileNetV1.d.ts +++ b/dist/faceDetectionNet/mobileNetV1.d.ts @@ -1,6 +1,6 @@ import * as tf from '@tensorflow/tfjs-core'; -import { FaceDetectionNet } from './types'; -export declare function mobileNetV1(x: tf.Tensor4D, params: FaceDetectionNet.MobileNetV1.Params): { +import { MobileNetV1 } from './types'; +export declare function mobileNetV1(x: tf.Tensor4D, params: MobileNetV1.Params): { out: tf.Tensor; conv11: any; }; diff --git a/dist/faceDetectionNet/mobileNetV1.js.map b/dist/faceDetectionNet/mobileNetV1.js.map index c5bd0e05..489b6c3a 100644 --- a/dist/faceDetectionNet/mobileNetV1.js.map +++ b/dist/faceDetectionNet/mobileNetV1.js.map @@ -1 +1 @@ -{"version":3,"file":"mobileNetV1.js","sourceRoot":"","sources":["../../src/faceDetectionNet/mobileNetV1.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,uBAAuB,CAAC;AAE5C,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAG1D,IAAM,OAAO,GAAG,qBAAqB,CAAA;AAErC,4BACE,CAAc,EACd,MAAwD,EACxD,OAAyB;IAEzB,OAAO,EAAE,CAAC,IAAI,CAAC;QAEb,IAAI,GAAG,GAAG,EAAE,CAAC,eAAe,CAAC,CAAC,EAAE,MAAM,CAAC,OAAO,EAAE,OAAO,EAAE,MAAM,CAAC,CAAA;QAChE,GAAG,GAAG,EAAE,CAAC,kBAAkB,CACzB,GAAG,EACH,MAAM,CAAC,eAAe,EACtB,MAAM,CAAC,mBAAmB,EAC1B,OAAO,EACP,MAAM,CAAC,gBAAgB,EACvB,MAAM,CAAC,iBAAiB,CACzB,CAAA;QACD,OAAO,EAAE,CAAC,WAAW,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC,CAAA;IAElC,CAAC,CAAC,CAAA;AACJ,CAAC;AAED,+BAA+B,QAAgB;IAC7C,OAAO,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,UAAA,GAAG,IAAI,OAAA,GAAG,KAAK,QAAQ,EAAhB,CAAgB,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAA;AACtE,CAAC;AAED,MAAM,sBAAsB,CAAc,EAAE,MAA2C;IACrF,OAAO,EAAE,CAAC,IAAI,CAAC;QAEb,IAAI,MAAM,GAAG,IAAI,CAAA;QACjB,IAAI,GAAG,GAAG,kBAAkB,CAAC,CAAC,EAAE,MAAM,CAAC,aAAa,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAA;QAE7D,MAAM,CAAC,gBAAgB,CAAC,OAAO,CAAC,UAAC,KAAK,EAAE,CAAC;YACvC,IAAM,QAAQ,GAAG,CAAC,GAAG,CAAC,CAAA;YACtB,IAAM,oBAAoB,GAAG,qBAAqB,CAAC,QAAQ,CAAC,CAAA;YAC5D,GAAG,GAAG,kBAAkB,CAAC,GAAG,EAAE,KAAK,CAAC,qBAAqB,EAAE,oBAAoB,CAAC,CAAA;YAChF,GAAG,GAAG,kBAAkB,CAAC,GAAG,EAAE,KAAK,CAAC,qBAAqB,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAA;YAClE,IAAI,QAAQ,KAAK,EAAE,EAAE;gBACnB,MAAM,GAAG,GAAG,CAAA;aACb;QACH,CAAC,CAAC,CAAA;QAEF,IAAI,MAAM,KAAK,IAAI,EAAE;YACnB,MAAM,IAAI,KAAK,CAAC,+CAA+C,CAAC,CAAA;SACjE;QAED,OAAO;YACL,GAAG,KAAA;YACH,MAAM,EAAE,MAAa;SACtB,CAAA;IAEH,CAAC,CAAC,CAAA;AACJ,CAAC"} \ No newline at end of file +{"version":3,"file":"mobileNetV1.js","sourceRoot":"","sources":["../../src/faceDetectionNet/mobileNetV1.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,uBAAuB,CAAC;AAE5C,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAG1D,IAAM,OAAO,GAAG,qBAAqB,CAAA;AAErC,4BACE,CAAc,EACd,MAAuC,EACvC,OAAyB;IAEzB,OAAO,EAAE,CAAC,IAAI,CAAC;QAEb,IAAI,GAAG,GAAG,EAAE,CAAC,eAAe,CAAC,CAAC,EAAE,MAAM,CAAC,OAAO,EAAE,OAAO,EAAE,MAAM,CAAC,CAAA;QAChE,GAAG,GAAG,EAAE,CAAC,kBAAkB,CACzB,GAAG,EACH,MAAM,CAAC,eAAe,EACtB,MAAM,CAAC,mBAAmB,EAC1B,OAAO,EACP,MAAM,CAAC,gBAAgB,EACvB,MAAM,CAAC,iBAAiB,CACzB,CAAA;QACD,OAAO,EAAE,CAAC,WAAW,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC,CAAA;IAElC,CAAC,CAAC,CAAA;AACJ,CAAC;AAED,+BAA+B,QAAgB;IAC7C,OAAO,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,UAAA,GAAG,IAAI,OAAA,GAAG,KAAK,QAAQ,EAAhB,CAAgB,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAA;AACtE,CAAC;AAED,MAAM,sBAAsB,CAAc,EAAE,MAA0B;IACpE,OAAO,EAAE,CAAC,IAAI,CAAC;QAEb,IAAI,MAAM,GAAG,IAAI,CAAA;QACjB,IAAI,GAAG,GAAG,kBAAkB,CAAC,CAAC,EAAE,MAAM,CAAC,aAAa,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAA;QAE7D,MAAM,CAAC,gBAAgB,CAAC,OAAO,CAAC,UAAC,KAAK,EAAE,CAAC;YACvC,IAAM,QAAQ,GAAG,CAAC,GAAG,CAAC,CAAA;YACtB,IAAM,oBAAoB,GAAG,qBAAqB,CAAC,QAAQ,CAAC,CAAA;YAC5D,GAAG,GAAG,kBAAkB,CAAC,GAAG,EAAE,KAAK,CAAC,qBAAqB,EAAE,oBAAoB,CAAC,CAAA;YAChF,GAAG,GAAG,kBAAkB,CAAC,GAAG,EAAE,KAAK,CAAC,qBAAqB,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAA;YAClE,IAAI,QAAQ,KAAK,EAAE,EAAE;gBACnB,MAAM,GAAG,GAAG,CAAA;aACb;QACH,CAAC,CAAC,CAAA;QAEF,IAAI,MAAM,KAAK,IAAI,EAAE;YACnB,MAAM,IAAI,KAAK,CAAC,+CAA+C,CAAC,CAAA;SACjE;QAED,OAAO;YACL,GAAG,KAAA;YACH,MAAM,EAAE,MAAa;SACtB,CAAA;IAEH,CAAC,CAAC,CAAA;AACJ,CAAC"} \ No newline at end of file diff --git a/dist/faceDetectionNet/outputLayer.d.ts b/dist/faceDetectionNet/outputLayer.d.ts index 493112c3..9ce8d135 100644 --- a/dist/faceDetectionNet/outputLayer.d.ts +++ b/dist/faceDetectionNet/outputLayer.d.ts @@ -1,6 +1,6 @@ import * as tf from '@tensorflow/tfjs-core'; -import { FaceDetectionNet } from './types'; -export declare function outputLayer(boxPredictions: tf.Tensor4D, classPredictions: tf.Tensor4D, params: FaceDetectionNet.OutputLayerParams): { +import { OutputLayerParams } from './types'; +export declare function outputLayer(boxPredictions: tf.Tensor4D, classPredictions: tf.Tensor4D, params: OutputLayerParams): { boxes: tf.Tensor[]; scores: tf.Tensor[]; }; diff --git a/dist/faceDetectionNet/outputLayer.js.map b/dist/faceDetectionNet/outputLayer.js.map index 2f2e2dba..367c2b98 100644 --- a/dist/faceDetectionNet/outputLayer.js.map +++ b/dist/faceDetectionNet/outputLayer.js.map @@ -1 +1 @@ -{"version":3,"file":"outputLayer.js","sourceRoot":"","sources":["../../src/faceDetectionNet/outputLayer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,uBAAuB,CAAC;AAI5C,2CAA2C,CAAc;IACvD,IAAM,GAAG,GAAG,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAA;IAE/C,IAAM,KAAK,GAAG;QACZ,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC;QACtB,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC;KACvB,CAAA;IAED,IAAM,OAAO,GAAG;QACd,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;QAC9C,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;KAC/C,CAAA;IAED,OAAO;QACL,KAAK,OAAA;QACL,OAAO,SAAA;KACR,CAAA;AACH,CAAC;AAED,0BAA0B,EAAe,EAAE,EAAe;IAClD,IAAA,0CAGmC,EAFvC,gBAAK,EACL,oBAAO,CACgC;IAEzC,IAAM,GAAG,GAAG,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC,SAAS,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAA;IAEhD,IAAM,QAAQ,GAAG,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAA;IAC7F,IAAM,QAAQ,GAAG,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,CAAA;IAEpF,IAAM,QAAQ,GAAG,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAA;IAC7F,IAAM,QAAQ,GAAG,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,CAAA;IAEpF,OAAO,EAAE,CAAC,SAAS,CACjB,EAAE,CAAC,KAAK,CAAC;QACP,EAAE,CAAC,GAAG,CAAC,QAAQ,EAAE,QAAQ,CAAC;QAC1B,EAAE,CAAC,GAAG,CAAC,QAAQ,EAAE,QAAQ,CAAC;QAC1B,EAAE,CAAC,GAAG,CAAC,QAAQ,EAAE,QAAQ,CAAC;QAC1B,EAAE,CAAC,GAAG,CAAC,QAAQ,EAAE,QAAQ,CAAC;KAC3B,CAAC,EACF,CAAC,CAAC,EAAE,CAAC,CAAC,CACP,CAAA;AACH,CAAC;AAED,MAAM,sBACJ,cAA2B,EAC3B,gBAA6B,EAC7B,MAA0C;IAE1C,OAAO,EAAE,CAAC,IAAI,CAAC;QAEb,IAAM,SAAS,GAAG,cAAc,CAAC,KAAK,CAAC,CAAC,CAAC,CAAA;QAEzC,IAAI,KAAK,GAAG,gBAAgB,CAC1B,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE,CAAC,SAAS,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAgB,EAChF,EAAE,CAAC,OAAO,CAAC,cAAc,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAgB,CACnD,CAAA;QACD,KAAK,GAAG,EAAE,CAAC,OAAO,CAChB,KAAK,EACL,CAAC,SAAS,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC,EAAE,CAAC,CAAC,CAC7C,CAAA;QAED,IAAM,gBAAgB,GAAG,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC,KAAK,CAAC,gBAAgB,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;QACxF,IAAI,MAAM,GAAG,EAAE,CAAC,KAAK,CAAC,gBAAgB,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAc,CAAA;QAE5E,MAAM,GAAG,EAAE,CAAC,OAAO,CACjB,MAAM,EACN,CAAC,SAAS,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAC7B,CAAA;QAED,IAAM,YAAY,GAAG,EAAE,CAAC,OAAO,CAAC,KAAK,CAAkB,CAAA;QACvD,IAAM,aAAa,GAAG,EAAE,CAAC,OAAO,CAAC,MAAM,CAAkB,CAAA;QAEzD,OAAO;YACL,KAAK,EAAE,YAAY;YACnB,MAAM,EAAE,aAAa;SACtB,CAAA;IAEH,CAAC,CAAC,CAAA;AACJ,CAAC"} \ No newline at end of file +{"version":3,"file":"outputLayer.js","sourceRoot":"","sources":["../../src/faceDetectionNet/outputLayer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,uBAAuB,CAAC;AAK5C,2CAA2C,CAAc;IACvD,IAAM,GAAG,GAAG,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAA;IAE/C,IAAM,KAAK,GAAG;QACZ,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC;QACtB,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC;KACvB,CAAA;IAED,IAAM,OAAO,GAAG;QACd,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;QAC9C,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;KAC/C,CAAA;IAED,OAAO;QACL,KAAK,OAAA;QACL,OAAO,SAAA;KACR,CAAA;AACH,CAAC;AAED,0BAA0B,EAAe,EAAE,EAAe;IAClD,IAAA,0CAGmC,EAFvC,gBAAK,EACL,oBAAO,CACgC;IAEzC,IAAM,GAAG,GAAG,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC,SAAS,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAA;IAEhD,IAAM,QAAQ,GAAG,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAA;IAC7F,IAAM,QAAQ,GAAG,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,CAAA;IAEpF,IAAM,QAAQ,GAAG,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAA;IAC7F,IAAM,QAAQ,GAAG,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,CAAA;IAEpF,OAAO,EAAE,CAAC,SAAS,CACjB,EAAE,CAAC,KAAK,CAAC;QACP,EAAE,CAAC,GAAG,CAAC,QAAQ,EAAE,QAAQ,CAAC;QAC1B,EAAE,CAAC,GAAG,CAAC,QAAQ,EAAE,QAAQ,CAAC;QAC1B,EAAE,CAAC,GAAG,CAAC,QAAQ,EAAE,QAAQ,CAAC;QAC1B,EAAE,CAAC,GAAG,CAAC,QAAQ,EAAE,QAAQ,CAAC;KAC3B,CAAC,EACF,CAAC,CAAC,EAAE,CAAC,CAAC,CACP,CAAA;AACH,CAAC;AAED,MAAM,sBACJ,cAA2B,EAC3B,gBAA6B,EAC7B,MAAyB;IAEzB,OAAO,EAAE,CAAC,IAAI,CAAC;QAEb,IAAM,SAAS,GAAG,cAAc,CAAC,KAAK,CAAC,CAAC,CAAC,CAAA;QAEzC,IAAI,KAAK,GAAG,gBAAgB,CAC1B,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE,CAAC,SAAS,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAgB,EAChF,EAAE,CAAC,OAAO,CAAC,cAAc,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAgB,CACnD,CAAA;QACD,KAAK,GAAG,EAAE,CAAC,OAAO,CAChB,KAAK,EACL,CAAC,SAAS,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC,EAAE,CAAC,CAAC,CAC7C,CAAA;QAED,IAAM,gBAAgB,GAAG,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC,KAAK,CAAC,gBAAgB,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;QACxF,IAAI,MAAM,GAAG,EAAE,CAAC,KAAK,CAAC,gBAAgB,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAc,CAAA;QAE5E,MAAM,GAAG,EAAE,CAAC,OAAO,CACjB,MAAM,EACN,CAAC,SAAS,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAC7B,CAAA;QAED,IAAM,YAAY,GAAG,EAAE,CAAC,OAAO,CAAC,KAAK,CAAkB,CAAA;QACvD,IAAM,aAAa,GAAG,EAAE,CAAC,OAAO,CAAC,MAAM,CAAkB,CAAA;QAEzD,OAAO;YACL,KAAK,EAAE,YAAY;YACnB,MAAM,EAAE,aAAa;SACtB,CAAA;IAEH,CAAC,CAAC,CAAA;AACJ,CAAC"} \ No newline at end of file diff --git a/dist/faceDetectionNet/pointwiseConvLayer.d.ts b/dist/faceDetectionNet/pointwiseConvLayer.d.ts index beaa3df8..f7a92d55 100644 --- a/dist/faceDetectionNet/pointwiseConvLayer.d.ts +++ b/dist/faceDetectionNet/pointwiseConvLayer.d.ts @@ -1,3 +1,3 @@ import * as tf from '@tensorflow/tfjs-core'; -import { FaceDetectionNet } from './types'; -export declare function pointwiseConvLayer(x: tf.Tensor4D, params: FaceDetectionNet.PointwiseConvParams, strides: [number, number]): tf.Tensor; +import { PointwiseConvParams } from './types'; +export declare function pointwiseConvLayer(x: tf.Tensor4D, params: PointwiseConvParams, strides: [number, number]): tf.Tensor; diff --git a/dist/faceDetectionNet/pointwiseConvLayer.js.map b/dist/faceDetectionNet/pointwiseConvLayer.js.map index 014210c4..365403e4 100644 --- a/dist/faceDetectionNet/pointwiseConvLayer.js.map +++ b/dist/faceDetectionNet/pointwiseConvLayer.js.map @@ -1 +1 @@ -{"version":3,"file":"pointwiseConvLayer.js","sourceRoot":"","sources":["../../src/faceDetectionNet/pointwiseConvLayer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,uBAAuB,CAAC;AAI5C,MAAM,6BACJ,CAAc,EACd,MAA4C,EAC5C,OAAyB;IAEzB,OAAO,EAAE,CAAC,IAAI,CAAC;QAEb,IAAI,GAAG,GAAG,EAAE,CAAC,MAAM,CAAC,CAAC,EAAE,MAAM,CAAC,OAAO,EAAE,OAAO,EAAE,MAAM,CAAC,CAAA;QACvD,GAAG,GAAG,EAAE,CAAC,GAAG,CAAC,GAAG,EAAE,MAAM,CAAC,iBAAiB,CAAC,CAAA;QAC3C,OAAO,EAAE,CAAC,WAAW,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC,CAAA;IAElC,CAAC,CAAC,CAAA;AACJ,CAAC"} \ No newline at end of file +{"version":3,"file":"pointwiseConvLayer.js","sourceRoot":"","sources":["../../src/faceDetectionNet/pointwiseConvLayer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,uBAAuB,CAAC;AAI5C,MAAM,6BACJ,CAAc,EACd,MAA2B,EAC3B,OAAyB;IAEzB,OAAO,EAAE,CAAC,IAAI,CAAC;QAEb,IAAI,GAAG,GAAG,EAAE,CAAC,MAAM,CAAC,CAAC,EAAE,MAAM,CAAC,OAAO,EAAE,OAAO,EAAE,MAAM,CAAC,CAAA;QACvD,GAAG,GAAG,EAAE,CAAC,GAAG,CAAC,GAAG,EAAE,MAAM,CAAC,iBAAiB,CAAC,CAAA;QAC3C,OAAO,EAAE,CAAC,WAAW,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC,CAAA;IAElC,CAAC,CAAC,CAAA;AACJ,CAAC"} \ No newline at end of file diff --git a/dist/faceDetectionNet/predictionLayer.d.ts b/dist/faceDetectionNet/predictionLayer.d.ts index ccb01222..3f136062 100644 --- a/dist/faceDetectionNet/predictionLayer.d.ts +++ b/dist/faceDetectionNet/predictionLayer.d.ts @@ -1,6 +1,6 @@ import * as tf from '@tensorflow/tfjs-core'; -import { FaceDetectionNet } from './types'; -export declare function predictionLayer(x: tf.Tensor4D, conv11: tf.Tensor4D, params: FaceDetectionNet.PredictionLayerParams): { +import { PredictionLayerParams } from './types'; +export declare function predictionLayer(x: tf.Tensor4D, conv11: tf.Tensor4D, params: PredictionLayerParams): { boxPredictions: tf.Tensor; classPredictions: tf.Tensor; }; diff --git a/dist/faceDetectionNet/predictionLayer.js.map b/dist/faceDetectionNet/predictionLayer.js.map index f342b146..cf62a217 100644 --- a/dist/faceDetectionNet/predictionLayer.js.map +++ b/dist/faceDetectionNet/predictionLayer.js.map @@ -1 +1 @@ -{"version":3,"file":"predictionLayer.js","sourceRoot":"","sources":["../../src/faceDetectionNet/predictionLayer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,uBAAuB,CAAC;AAE5C,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAC1D,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAG1D,MAAM,0BACJ,CAAc,EACd,MAAmB,EACnB,MAA8C;IAE9C,OAAO,EAAE,CAAC,IAAI,CAAC;QAEb,IAAM,KAAK,GAAG,kBAAkB,CAAC,CAAC,EAAE,MAAM,CAAC,aAAa,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAA;QACjE,IAAM,KAAK,GAAG,kBAAkB,CAAC,KAAK,EAAE,MAAM,CAAC,aAAa,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAA;QACrE,IAAM,KAAK,GAAG,kBAAkB,CAAC,KAAK,EAAE,MAAM,CAAC,aAAa,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAA;QACrE,IAAM,KAAK,GAAG,kBAAkB,CAAC,KAAK,EAAE,MAAM,CAAC,aAAa,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAA;QACrE,IAAM,KAAK,GAAG,kBAAkB,CAAC,KAAK,EAAE,MAAM,CAAC,aAAa,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAA;QACrE,IAAM,KAAK,GAAG,kBAAkB,CAAC,KAAK,EAAE,MAAM,CAAC,aAAa,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAA;QACrE,IAAM,KAAK,GAAG,kBAAkB,CAAC,KAAK,EAAE,MAAM,CAAC,aAAa,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAA;QACrE,IAAM,KAAK,GAAG,kBAAkB,CAAC,KAAK,EAAE,MAAM,CAAC,aAAa,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAA;QAErE,IAAM,cAAc,GAAG,kBAAkB,CAAC,MAAM,EAAE,MAAM,CAAC,sBAAsB,CAAC,CAAA;QAChF,IAAM,cAAc,GAAG,kBAAkB,CAAC,CAAC,EAAE,MAAM,CAAC,sBAAsB,CAAC,CAAA;QAC3E,IAAM,cAAc,GAAG,kBAAkB,CAAC,KAAK,EAAE,MAAM,CAAC,sBAAsB,CAAC,CAAA;QAC/E,IAAM,cAAc,GAAG,kBAAkB,CAAC,KAAK,EAAE,MAAM,CAAC,sBAAsB,CAAC,CAAA;QAC/E,IAAM,cAAc,GAAG,kBAAkB,CAAC,KAAK,EAAE,MAAM,CAAC,sBAAsB,CAAC,CAAA;QAC/E,IAAM,cAAc,GAAG,kBAAkB,CAAC,KAAK,EAAE,MAAM,CAAC,sBAAsB,CAAC,CAAA;QAE/E,IAAM,cAAc,GAAG,EAAE,CAAC,MAAM,CAAC;YAC/B,cAAc,CAAC,qBAAqB;YACpC,cAAc,CAAC,qBAAqB;YACpC,cAAc,CAAC,qBAAqB;YACpC,cAAc,CAAC,qBAAqB;YACpC,cAAc,CAAC,qBAAqB;YACpC,cAAc,CAAC,qBAAqB;SACrC,EAAE,CAAC,CAAgB,CAAA;QAEpB,IAAM,gBAAgB,GAAG,EAAE,CAAC,MAAM,CAAC;YACjC,cAAc,CAAC,eAAe;YAC9B,cAAc,CAAC,eAAe;YAC9B,cAAc,CAAC,eAAe;YAC9B,cAAc,CAAC,eAAe;YAC9B,cAAc,CAAC,eAAe;YAC9B,cAAc,CAAC,eAAe;SAC/B,EAAE,CAAC,CAAgB,CAAA;QAEpB,OAAO;YACL,cAAc,gBAAA;YACd,gBAAgB,kBAAA;SACjB,CAAA;IACH,CAAC,CAAC,CAAA;AACJ,CAAC"} \ No newline at end of file +{"version":3,"file":"predictionLayer.js","sourceRoot":"","sources":["../../src/faceDetectionNet/predictionLayer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,uBAAuB,CAAC;AAE5C,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAC1D,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAG1D,MAAM,0BACJ,CAAc,EACd,MAAmB,EACnB,MAA6B;IAE7B,OAAO,EAAE,CAAC,IAAI,CAAC;QAEb,IAAM,KAAK,GAAG,kBAAkB,CAAC,CAAC,EAAE,MAAM,CAAC,aAAa,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAA;QACjE,IAAM,KAAK,GAAG,kBAAkB,CAAC,KAAK,EAAE,MAAM,CAAC,aAAa,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAA;QACrE,IAAM,KAAK,GAAG,kBAAkB,CAAC,KAAK,EAAE,MAAM,CAAC,aAAa,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAA;QACrE,IAAM,KAAK,GAAG,kBAAkB,CAAC,KAAK,EAAE,MAAM,CAAC,aAAa,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAA;QACrE,IAAM,KAAK,GAAG,kBAAkB,CAAC,KAAK,EAAE,MAAM,CAAC,aAAa,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAA;QACrE,IAAM,KAAK,GAAG,kBAAkB,CAAC,KAAK,EAAE,MAAM,CAAC,aAAa,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAA;QACrE,IAAM,KAAK,GAAG,kBAAkB,CAAC,KAAK,EAAE,MAAM,CAAC,aAAa,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAA;QACrE,IAAM,KAAK,GAAG,kBAAkB,CAAC,KAAK,EAAE,MAAM,CAAC,aAAa,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAA;QAErE,IAAM,cAAc,GAAG,kBAAkB,CAAC,MAAM,EAAE,MAAM,CAAC,sBAAsB,CAAC,CAAA;QAChF,IAAM,cAAc,GAAG,kBAAkB,CAAC,CAAC,EAAE,MAAM,CAAC,sBAAsB,CAAC,CAAA;QAC3E,IAAM,cAAc,GAAG,kBAAkB,CAAC,KAAK,EAAE,MAAM,CAAC,sBAAsB,CAAC,CAAA;QAC/E,IAAM,cAAc,GAAG,kBAAkB,CAAC,KAAK,EAAE,MAAM,CAAC,sBAAsB,CAAC,CAAA;QAC/E,IAAM,cAAc,GAAG,kBAAkB,CAAC,KAAK,EAAE,MAAM,CAAC,sBAAsB,CAAC,CAAA;QAC/E,IAAM,cAAc,GAAG,kBAAkB,CAAC,KAAK,EAAE,MAAM,CAAC,sBAAsB,CAAC,CAAA;QAE/E,IAAM,cAAc,GAAG,EAAE,CAAC,MAAM,CAAC;YAC/B,cAAc,CAAC,qBAAqB;YACpC,cAAc,CAAC,qBAAqB;YACpC,cAAc,CAAC,qBAAqB;YACpC,cAAc,CAAC,qBAAqB;YACpC,cAAc,CAAC,qBAAqB;YACpC,cAAc,CAAC,qBAAqB;SACrC,EAAE,CAAC,CAAgB,CAAA;QAEpB,IAAM,gBAAgB,GAAG,EAAE,CAAC,MAAM,CAAC;YACjC,cAAc,CAAC,eAAe;YAC9B,cAAc,CAAC,eAAe;YAC9B,cAAc,CAAC,eAAe;YAC9B,cAAc,CAAC,eAAe;YAC9B,cAAc,CAAC,eAAe;YAC9B,cAAc,CAAC,eAAe;SAC/B,EAAE,CAAC,CAAgB,CAAA;QAEpB,OAAO;YACL,cAAc,gBAAA;YACd,gBAAgB,kBAAA;SACjB,CAAA;IACH,CAAC,CAAC,CAAA;AACJ,CAAC"} \ No newline at end of file diff --git a/dist/faceDetectionNet/types.d.ts b/dist/faceDetectionNet/types.d.ts index 0916bb4c..08ca16bf 100644 --- a/dist/faceDetectionNet/types.d.ts +++ b/dist/faceDetectionNet/types.d.ts @@ -1,53 +1,51 @@ import * as tf from '@tensorflow/tfjs-core'; import { ConvParams } from '../commons/types'; -export declare namespace FaceDetectionNet { - type PointwiseConvParams = { +export declare type PointwiseConvParams = { + filters: tf.Tensor4D; + batch_norm_offset: tf.Tensor1D; +}; +export declare namespace MobileNetV1 { + type DepthwiseConvParams = { filters: tf.Tensor4D; + batch_norm_scale: tf.Tensor1D; batch_norm_offset: tf.Tensor1D; + batch_norm_mean: tf.Tensor1D; + batch_norm_variance: tf.Tensor1D; }; - namespace MobileNetV1 { - type DepthwiseConvParams = { - filters: tf.Tensor4D; - batch_norm_scale: tf.Tensor1D; - batch_norm_offset: tf.Tensor1D; - batch_norm_mean: tf.Tensor1D; - batch_norm_variance: tf.Tensor1D; - }; - type ConvPairParams = { - depthwise_conv_params: DepthwiseConvParams; - pointwise_conv_params: PointwiseConvParams; - }; - type Params = { - conv_0_params: PointwiseConvParams; - conv_pair_params: ConvPairParams[]; - }; - } - type BoxPredictionParams = { - box_encoding_predictor_params: ConvParams; - class_predictor_params: ConvParams; + type ConvPairParams = { + depthwise_conv_params: DepthwiseConvParams; + pointwise_conv_params: PointwiseConvParams; }; - type PredictionLayerParams = { + type Params = { conv_0_params: PointwiseConvParams; - conv_1_params: PointwiseConvParams; - conv_2_params: PointwiseConvParams; - conv_3_params: PointwiseConvParams; - conv_4_params: PointwiseConvParams; - conv_5_params: PointwiseConvParams; - conv_6_params: PointwiseConvParams; - conv_7_params: PointwiseConvParams; - box_predictor_0_params: BoxPredictionParams; - box_predictor_1_params: BoxPredictionParams; - box_predictor_2_params: BoxPredictionParams; - box_predictor_3_params: BoxPredictionParams; - box_predictor_4_params: BoxPredictionParams; - box_predictor_5_params: BoxPredictionParams; - }; - type OutputLayerParams = { - extra_dim: tf.Tensor3D; - }; - type NetParams = { - mobilenetv1_params: MobileNetV1.Params; - prediction_layer_params: PredictionLayerParams; - output_layer_params: OutputLayerParams; + conv_pair_params: ConvPairParams[]; }; } +export declare type BoxPredictionParams = { + box_encoding_predictor_params: ConvParams; + class_predictor_params: ConvParams; +}; +export declare type PredictionLayerParams = { + conv_0_params: PointwiseConvParams; + conv_1_params: PointwiseConvParams; + conv_2_params: PointwiseConvParams; + conv_3_params: PointwiseConvParams; + conv_4_params: PointwiseConvParams; + conv_5_params: PointwiseConvParams; + conv_6_params: PointwiseConvParams; + conv_7_params: PointwiseConvParams; + box_predictor_0_params: BoxPredictionParams; + box_predictor_1_params: BoxPredictionParams; + box_predictor_2_params: BoxPredictionParams; + box_predictor_3_params: BoxPredictionParams; + box_predictor_4_params: BoxPredictionParams; + box_predictor_5_params: BoxPredictionParams; +}; +export declare type OutputLayerParams = { + extra_dim: tf.Tensor3D; +}; +export declare type NetParams = { + mobilenetv1_params: MobileNetV1.Params; + prediction_layer_params: PredictionLayerParams; + output_layer_params: OutputLayerParams; +}; diff --git a/dist/faceLandmarkNet/FaceLandmarkNet.d.ts b/dist/faceLandmarkNet/FaceLandmarkNet.d.ts new file mode 100644 index 00000000..36e93ac0 --- /dev/null +++ b/dist/faceLandmarkNet/FaceLandmarkNet.d.ts @@ -0,0 +1,10 @@ +import * as tf from '@tensorflow/tfjs-core'; +import { NetInput } from '../NetInput'; +import { TNetInput } from '../types'; +import { FaceLandmarks } from './FaceLandmarks'; +export declare class FaceLandmarkNet { + private _params; + load(weightsOrUrl: Float32Array | string | undefined): Promise; + extractWeights(weights: Float32Array): void; + detectLandmarks(input: tf.Tensor | NetInput | TNetInput): Promise; +} diff --git a/dist/faceLandmarkNet/FaceLandmarkNet.js b/dist/faceLandmarkNet/FaceLandmarkNet.js new file mode 100644 index 00000000..1b7c4047 --- /dev/null +++ b/dist/faceLandmarkNet/FaceLandmarkNet.js @@ -0,0 +1,95 @@ +import * as tslib_1 from "tslib"; +import * as tf from '@tensorflow/tfjs-core'; +import { convLayer } from '../commons/convLayer'; +import { getImageTensor } from '../getImageTensor'; +import { Point } from '../Point'; +import { extractParams } from './extractParams'; +import { FaceLandmarks } from './FaceLandmarks'; +import { fullyConnectedLayer } from './fullyConnectedLayer'; +import { loadQuantizedParams } from './loadQuantizedParams'; +function conv(x, params) { + return convLayer(x, params, 'valid', true); +} +function maxPool(x, strides) { + if (strides === void 0) { strides = [2, 2]; } + return tf.maxPool(x, [2, 2], strides, 'valid'); +} +var FaceLandmarkNet = /** @class */ (function () { + function FaceLandmarkNet() { + } + FaceLandmarkNet.prototype.load = function (weightsOrUrl) { + return tslib_1.__awaiter(this, void 0, void 0, function () { + var _a; + return tslib_1.__generator(this, function (_b) { + switch (_b.label) { + case 0: + if (weightsOrUrl instanceof Float32Array) { + this.extractWeights(weightsOrUrl); + return [2 /*return*/]; + } + if (weightsOrUrl && typeof weightsOrUrl !== 'string') { + throw new Error('FaceLandmarkNet.load - expected model uri, or weights as Float32Array'); + } + _a = this; + return [4 /*yield*/, loadQuantizedParams(weightsOrUrl)]; + case 1: + _a._params = _b.sent(); + return [2 /*return*/]; + } + }); + }); + }; + FaceLandmarkNet.prototype.extractWeights = function (weights) { + this._params = extractParams(weights); + }; + FaceLandmarkNet.prototype.detectLandmarks = function (input) { + return tslib_1.__awaiter(this, void 0, void 0, function () { + var _this = this; + var imageDimensions, outTensor, faceLandmarksArray, _a, _b, xCoords, yCoords; + return tslib_1.__generator(this, function (_c) { + switch (_c.label) { + case 0: + if (!this._params) { + throw new Error('FaceLandmarkNet - load model before inference'); + } + outTensor = tf.tidy(function () { + var params = _this._params; + var imgTensor = getImageTensor(input); + var _a = imgTensor.shape.slice(1), height = _a[0], width = _a[1]; + imageDimensions = { width: width, height: height }; + // work with 128 x 128 sized face images + if (imgTensor.shape[1] !== 128 || imgTensor.shape[2] !== 128) { + imgTensor = tf.image.resizeBilinear(imgTensor, [128, 128]); + } + var out = conv(imgTensor, params.conv0_params); + out = maxPool(out); + out = conv(out, params.conv1_params); + out = conv(out, params.conv2_params); + out = maxPool(out); + out = conv(out, params.conv3_params); + out = conv(out, params.conv4_params); + out = maxPool(out); + out = conv(out, params.conv5_params); + out = conv(out, params.conv6_params); + out = maxPool(out, [1, 1]); + out = conv(out, params.conv7_params); + var fc0 = tf.relu(fullyConnectedLayer(out.as2D(out.shape[0], -1), params.fc0_params)); + var fc1 = fullyConnectedLayer(fc0, params.fc1_params); + return fc1; + }); + _b = (_a = Array).from; + return [4 /*yield*/, outTensor.data()]; + case 1: + faceLandmarksArray = _b.apply(_a, [_c.sent()]); + outTensor.dispose(); + xCoords = faceLandmarksArray.filter(function (c, i) { return (i - 1) % 2; }); + yCoords = faceLandmarksArray.filter(function (c, i) { return i % 2; }); + return [2 /*return*/, new FaceLandmarks(Array(68).fill(0).map(function (_, i) { return new Point(xCoords[i], yCoords[i]); }), imageDimensions)]; + } + }); + }); + }; + return FaceLandmarkNet; +}()); +export { FaceLandmarkNet }; +//# sourceMappingURL=FaceLandmarkNet.js.map \ No newline at end of file diff --git a/dist/faceLandmarkNet/FaceLandmarkNet.js.map b/dist/faceLandmarkNet/FaceLandmarkNet.js.map new file mode 100644 index 00000000..972ce227 --- /dev/null +++ b/dist/faceLandmarkNet/FaceLandmarkNet.js.map @@ -0,0 +1 @@ +{"version":3,"file":"FaceLandmarkNet.js","sourceRoot":"","sources":["../../src/faceLandmarkNet/FaceLandmarkNet.ts"],"names":[],"mappings":";AAAA,OAAO,KAAK,EAAE,MAAM,uBAAuB,CAAC;AAE5C,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AAEjD,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAEnD,OAAO,EAAE,KAAK,EAAE,MAAM,UAAU,CAAC;AAEjC,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChD,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChD,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAC5D,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAG5D,cAAc,CAAc,EAAE,MAAkB;IAC9C,OAAO,SAAS,CAAC,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,CAAC,CAAA;AAC5C,CAAC;AAED,iBAAiB,CAAc,EAAE,OAAkC;IAAlC,wBAAA,EAAA,WAA6B,CAAC,EAAE,CAAC,CAAC;IACjE,OAAO,EAAE,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC,CAAA;AAChD,CAAC;AAED;IAAA;IAqEA,CAAC;IAjEc,8BAAI,GAAjB,UAAkB,YAA+C;;;;;;wBAC/D,IAAI,YAAY,YAAY,YAAY,EAAE;4BACxC,IAAI,CAAC,cAAc,CAAC,YAAY,CAAC,CAAA;4BACjC,sBAAM;yBACP;wBAED,IAAI,YAAY,IAAI,OAAO,YAAY,KAAK,QAAQ,EAAE;4BACpD,MAAM,IAAI,KAAK,CAAC,uEAAuE,CAAC,CAAA;yBACzF;wBACD,KAAA,IAAI,CAAA;wBAAW,qBAAM,mBAAmB,CAAC,YAAY,CAAC,EAAA;;wBAAtD,GAAK,OAAO,GAAG,SAAuC,CAAA;;;;;KACvD;IAEM,wCAAc,GAArB,UAAsB,OAAqB;QACzC,IAAI,CAAC,OAAO,GAAG,aAAa,CAAC,OAAO,CAAC,CAAA;IACvC,CAAC;IAEY,yCAAe,GAA5B,UAA6B,KAAuC;;;;;;;wBAClE,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE;4BACjB,MAAM,IAAI,KAAK,CAAC,+CAA+C,CAAC,CAAA;yBACjE;wBAIK,SAAS,GAAG,EAAE,CAAC,IAAI,CAAC;4BACxB,IAAM,MAAM,GAAG,KAAI,CAAC,OAAO,CAAA;4BAE3B,IAAI,SAAS,GAAG,cAAc,CAAC,KAAK,CAAC,CAAA;4BAC/B,IAAA,6BAA0C,EAAzC,cAAM,EAAE,aAAK,CAA4B;4BAChD,eAAe,GAAG,EAAE,KAAK,OAAA,EAAE,MAAM,QAAA,EAAE,CAAA;4BAGnC,wCAAwC;4BACxC,IAAI,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,GAAG,IAAI,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,GAAG,EAAE;gCAC5D,SAAS,GAAG,EAAE,CAAC,KAAK,CAAC,cAAc,CAAC,SAAS,EAAE,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,CAAA;6BAC3D;4BAED,IAAI,GAAG,GAAG,IAAI,CAAC,SAAS,EAAE,MAAM,CAAC,YAAY,CAAC,CAAA;4BAC9C,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,CAAA;4BAClB,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,MAAM,CAAC,YAAY,CAAC,CAAA;4BACpC,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,MAAM,CAAC,YAAY,CAAC,CAAA;4BACpC,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,CAAA;4BAClB,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,MAAM,CAAC,YAAY,CAAC,CAAA;4BACpC,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,MAAM,CAAC,YAAY,CAAC,CAAA;4BACpC,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,CAAA;4BAClB,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,MAAM,CAAC,YAAY,CAAC,CAAA;4BACpC,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,MAAM,CAAC,YAAY,CAAC,CAAA;4BACpC,GAAG,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAA;4BAC1B,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,MAAM,CAAC,YAAY,CAAC,CAAA;4BACpC,IAAM,GAAG,GAAG,EAAE,CAAC,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC,CAAC,CAAA;4BACvF,IAAM,GAAG,GAAG,mBAAmB,CAAC,GAAG,EAAE,MAAM,CAAC,UAAU,CAAC,CAAA;4BAEvD,OAAO,GAAG,CAAA;wBACZ,CAAC,CAAC,CAAA;wBAEyB,KAAA,CAAA,KAAA,KAAK,CAAA,CAAC,IAAI,CAAA;wBAAC,qBAAM,SAAS,CAAC,IAAI,EAAE,EAAA;;wBAAtD,kBAAkB,GAAG,cAAW,SAAsB,EAAC;wBAC7D,SAAS,CAAC,OAAO,EAAE,CAAA;wBAEb,OAAO,GAAG,kBAAkB,CAAC,MAAM,CAAC,UAAC,CAAC,EAAE,CAAC,IAAK,OAAA,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,EAAX,CAAW,CAAC,CAAA;wBAC1D,OAAO,GAAG,kBAAkB,CAAC,MAAM,CAAC,UAAC,CAAC,EAAE,CAAC,IAAK,OAAA,CAAC,GAAG,CAAC,EAAL,CAAK,CAAC,CAAA;wBAE1D,sBAAO,IAAI,aAAa,CACtB,KAAK,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,UAAC,CAAC,EAAE,CAAC,IAAK,OAAA,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,EAAjC,CAAiC,CAAC,EAClE,eAA6B,CAC9B,EAAA;;;;KACF;IACH,sBAAC;AAAD,CAAC,AArED,IAqEC"} \ No newline at end of file diff --git a/dist/faceLandmarkNet/extractParams.d.ts b/dist/faceLandmarkNet/extractParams.d.ts index c62b1f51..d90f3077 100644 --- a/dist/faceLandmarkNet/extractParams.d.ts +++ b/dist/faceLandmarkNet/extractParams.d.ts @@ -1,2 +1,2 @@ -import { FaceLandmarkNet } from './types'; -export declare function extractParams(weights: Float32Array): FaceLandmarkNet.NetParams; +import { NetParams } from './types'; +export declare function extractParams(weights: Float32Array): NetParams; diff --git a/dist/faceLandmarkNet/fullyConnectedLayer.d.ts b/dist/faceLandmarkNet/fullyConnectedLayer.d.ts index 32bdd574..4a3aa900 100644 --- a/dist/faceLandmarkNet/fullyConnectedLayer.d.ts +++ b/dist/faceLandmarkNet/fullyConnectedLayer.d.ts @@ -1,3 +1,3 @@ import * as tf from '@tensorflow/tfjs-core'; -import { FaceLandmarkNet } from './types'; -export declare function fullyConnectedLayer(x: tf.Tensor2D, params: FaceLandmarkNet.FCParams): tf.Tensor2D; +import { FCParams } from './types'; +export declare function fullyConnectedLayer(x: tf.Tensor2D, params: FCParams): tf.Tensor2D; diff --git a/dist/faceLandmarkNet/fullyConnectedLayer.js.map b/dist/faceLandmarkNet/fullyConnectedLayer.js.map index 2a3417e7..fe7e75a0 100644 --- a/dist/faceLandmarkNet/fullyConnectedLayer.js.map +++ b/dist/faceLandmarkNet/fullyConnectedLayer.js.map @@ -1 +1 @@ -{"version":3,"file":"fullyConnectedLayer.js","sourceRoot":"","sources":["../../src/faceLandmarkNet/fullyConnectedLayer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,uBAAuB,CAAC;AAI5C,MAAM,8BACJ,CAAc,EACd,MAAgC;IAEhC,OAAO,EAAE,CAAC,IAAI,CAAC;QACb,OAAA,EAAE,CAAC,GAAG,CACJ,EAAE,CAAC,MAAM,CAAC,CAAC,EAAE,MAAM,CAAC,OAAO,CAAC,EAC5B,MAAM,CAAC,IAAI,CACZ;IAHD,CAGC,CACF,CAAA;AACH,CAAC"} \ No newline at end of file +{"version":3,"file":"fullyConnectedLayer.js","sourceRoot":"","sources":["../../src/faceLandmarkNet/fullyConnectedLayer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,uBAAuB,CAAC;AAI5C,MAAM,8BACJ,CAAc,EACd,MAAgB;IAEhB,OAAO,EAAE,CAAC,IAAI,CAAC;QACb,OAAA,EAAE,CAAC,GAAG,CACJ,EAAE,CAAC,MAAM,CAAC,CAAC,EAAE,MAAM,CAAC,OAAO,CAAC,EAC5B,MAAM,CAAC,IAAI,CACZ;IAHD,CAGC,CACF,CAAA;AACH,CAAC"} \ No newline at end of file diff --git a/dist/faceLandmarkNet/index.d.ts b/dist/faceLandmarkNet/index.d.ts index 001db0d7..c41b5014 100644 --- a/dist/faceLandmarkNet/index.d.ts +++ b/dist/faceLandmarkNet/index.d.ts @@ -1,6 +1,3 @@ -import * as tf from '@tensorflow/tfjs-core'; -import { NetInput } from '../NetInput'; -import { FaceLandmarks } from './FaceLandmarks'; -export declare function faceLandmarkNet(weights: Float32Array): { - detectLandmarks: (input: string | HTMLCanvasElement | HTMLImageElement | HTMLVideoElement | (string | HTMLCanvasElement | HTMLImageElement | HTMLVideoElement)[] | tf.Tensor | NetInput) => Promise; -}; +import { FaceLandmarkNet } from './FaceLandmarkNet'; +export * from './FaceLandmarkNet'; +export declare function faceLandmarkNet(weights: Float32Array): FaceLandmarkNet; diff --git a/dist/faceLandmarkNet/index.js b/dist/faceLandmarkNet/index.js index 65f06fc8..2d64b49c 100644 --- a/dist/faceLandmarkNet/index.js +++ b/dist/faceLandmarkNet/index.js @@ -1,64 +1,8 @@ -import * as tslib_1 from "tslib"; -import * as tf from '@tensorflow/tfjs-core'; -import { convLayer } from '../commons/convLayer'; -import { getImageTensor } from '../getImageTensor'; -import { Point } from '../Point'; -import { extractParams } from './extractParams'; -import { FaceLandmarks } from './FaceLandmarks'; -import { fullyConnectedLayer } from './fullyConnectedLayer'; -function conv(x, params) { - return convLayer(x, params, 'valid', true); -} -function maxPool(x, strides) { - if (strides === void 0) { strides = [2, 2]; } - return tf.maxPool(x, [2, 2], strides, 'valid'); -} +import { FaceLandmarkNet } from './FaceLandmarkNet'; +export * from './FaceLandmarkNet'; export function faceLandmarkNet(weights) { - var params = extractParams(weights); - function detectLandmarks(input) { - return tslib_1.__awaiter(this, void 0, void 0, function () { - var imageDimensions, outTensor, faceLandmarksArray, _a, _b, xCoords, yCoords; - return tslib_1.__generator(this, function (_c) { - switch (_c.label) { - case 0: - outTensor = tf.tidy(function () { - var imgTensor = getImageTensor(input); - var _a = imgTensor.shape.slice(1), height = _a[0], width = _a[1]; - imageDimensions = { width: width, height: height }; - // work with 128 x 128 sized face images - if (imgTensor.shape[1] !== 128 || imgTensor.shape[2] !== 128) { - imgTensor = tf.image.resizeBilinear(imgTensor, [128, 128]); - } - var out = conv(imgTensor, params.conv0_params); - out = maxPool(out); - out = conv(out, params.conv1_params); - out = conv(out, params.conv2_params); - out = maxPool(out); - out = conv(out, params.conv3_params); - out = conv(out, params.conv4_params); - out = maxPool(out); - out = conv(out, params.conv5_params); - out = conv(out, params.conv6_params); - out = maxPool(out, [1, 1]); - out = conv(out, params.conv7_params); - var fc0 = tf.relu(fullyConnectedLayer(out.as2D(out.shape[0], -1), params.fc0_params)); - var fc1 = fullyConnectedLayer(fc0, params.fc1_params); - return fc1; - }); - _b = (_a = Array).from; - return [4 /*yield*/, outTensor.data()]; - case 1: - faceLandmarksArray = _b.apply(_a, [_c.sent()]); - outTensor.dispose(); - xCoords = faceLandmarksArray.filter(function (c, i) { return (i - 1) % 2; }); - yCoords = faceLandmarksArray.filter(function (c, i) { return i % 2; }); - return [2 /*return*/, new FaceLandmarks(Array(68).fill(0).map(function (_, i) { return new Point(xCoords[i], yCoords[i]); }), imageDimensions)]; - } - }); - }); - } - return { - detectLandmarks: detectLandmarks - }; + var net = new FaceLandmarkNet(); + net.extractWeights(weights); + return net; } //# sourceMappingURL=index.js.map \ No newline at end of file diff --git a/dist/faceLandmarkNet/index.js.map b/dist/faceLandmarkNet/index.js.map index 221fbc28..e9e411d7 100644 --- a/dist/faceLandmarkNet/index.js.map +++ b/dist/faceLandmarkNet/index.js.map @@ -1 +1 @@ -{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/faceLandmarkNet/index.ts"],"names":[],"mappings":";AAAA,OAAO,KAAK,EAAE,MAAM,uBAAuB,CAAC;AAE5C,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AAEjD,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAEnD,OAAO,EAAE,KAAK,EAAE,MAAM,UAAU,CAAC;AAEjC,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChD,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChD,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAE5D,cAAc,CAAc,EAAE,MAAkB;IAC9C,OAAO,SAAS,CAAC,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,CAAC,CAAA;AAC5C,CAAC;AAED,iBAAiB,CAAc,EAAE,OAAkC;IAAlC,wBAAA,EAAA,WAA6B,CAAC,EAAE,CAAC,CAAC;IACjE,OAAO,EAAE,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC,CAAA;AAChD,CAAC;AAED,MAAM,0BAA0B,OAAqB;IACnD,IAAM,MAAM,GAAG,aAAa,CAAC,OAAO,CAAC,CAAA;IAErC,yBAA+B,KAAuC;;;;;;wBAG9D,SAAS,GAAG,EAAE,CAAC,IAAI,CAAC;4BACxB,IAAI,SAAS,GAAG,cAAc,CAAC,KAAK,CAAC,CAAA;4BAC/B,IAAA,6BAA0C,EAAzC,cAAM,EAAE,aAAK,CAA4B;4BAChD,eAAe,GAAG,EAAE,KAAK,OAAA,EAAE,MAAM,QAAA,EAAE,CAAA;4BAGnC,wCAAwC;4BACxC,IAAI,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,GAAG,IAAI,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,GAAG,EAAE;gCAC5D,SAAS,GAAG,EAAE,CAAC,KAAK,CAAC,cAAc,CAAC,SAAS,EAAE,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,CAAA;6BAC3D;4BAED,IAAI,GAAG,GAAG,IAAI,CAAC,SAAS,EAAE,MAAM,CAAC,YAAY,CAAC,CAAA;4BAC9C,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,CAAA;4BAClB,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,MAAM,CAAC,YAAY,CAAC,CAAA;4BACpC,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,MAAM,CAAC,YAAY,CAAC,CAAA;4BACpC,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,CAAA;4BAClB,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,MAAM,CAAC,YAAY,CAAC,CAAA;4BACpC,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,MAAM,CAAC,YAAY,CAAC,CAAA;4BACpC,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,CAAA;4BAClB,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,MAAM,CAAC,YAAY,CAAC,CAAA;4BACpC,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,MAAM,CAAC,YAAY,CAAC,CAAA;4BACpC,GAAG,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAA;4BAC1B,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,MAAM,CAAC,YAAY,CAAC,CAAA;4BACpC,IAAM,GAAG,GAAG,EAAE,CAAC,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC,CAAC,CAAA;4BACvF,IAAM,GAAG,GAAG,mBAAmB,CAAC,GAAG,EAAE,MAAM,CAAC,UAAU,CAAC,CAAA;4BAEvD,OAAO,GAAG,CAAA;wBACZ,CAAC,CAAC,CAAA;wBAEyB,KAAA,CAAA,KAAA,KAAK,CAAA,CAAC,IAAI,CAAA;wBAAC,qBAAM,SAAS,CAAC,IAAI,EAAE,EAAA;;wBAAtD,kBAAkB,GAAG,cAAW,SAAsB,EAAC;wBAC7D,SAAS,CAAC,OAAO,EAAE,CAAA;wBAEb,OAAO,GAAG,kBAAkB,CAAC,MAAM,CAAC,UAAC,CAAC,EAAE,CAAC,IAAK,OAAA,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,EAAX,CAAW,CAAC,CAAA;wBAC1D,OAAO,GAAG,kBAAkB,CAAC,MAAM,CAAC,UAAC,CAAC,EAAE,CAAC,IAAK,OAAA,CAAC,GAAG,CAAC,EAAL,CAAK,CAAC,CAAA;wBAE1D,sBAAO,IAAI,aAAa,CACtB,KAAK,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,UAAC,CAAC,EAAE,CAAC,IAAK,OAAA,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,EAAjC,CAAiC,CAAC,EAClE,eAA6B,CAC9B,EAAA;;;;KACF;IAED,OAAO;QACL,eAAe,iBAAA;KAChB,CAAA;AACH,CAAC"} \ No newline at end of file +{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/faceLandmarkNet/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAEpD,cAAc,mBAAmB,CAAC;AAElC,MAAM,0BAA0B,OAAqB;IACnD,IAAM,GAAG,GAAG,IAAI,eAAe,EAAE,CAAA;IACjC,GAAG,CAAC,cAAc,CAAC,OAAO,CAAC,CAAA;IAC3B,OAAO,GAAG,CAAA;AACZ,CAAC"} \ No newline at end of file diff --git a/dist/faceLandmarkNet/loadQuantizedParams.d.ts b/dist/faceLandmarkNet/loadQuantizedParams.d.ts new file mode 100644 index 00000000..27eaaa1d --- /dev/null +++ b/dist/faceLandmarkNet/loadQuantizedParams.d.ts @@ -0,0 +1,2 @@ +import { NetParams } from './types'; +export declare function loadQuantizedParams(uri: string | undefined): Promise; diff --git a/dist/faceLandmarkNet/loadQuantizedParams.js b/dist/faceLandmarkNet/loadQuantizedParams.js new file mode 100644 index 00000000..856a6190 --- /dev/null +++ b/dist/faceLandmarkNet/loadQuantizedParams.js @@ -0,0 +1,62 @@ +import * as tslib_1 from "tslib"; +import { loadWeightMap } from '../commons/loadWeightMap'; +import { isTensor4D, isTensor1D, isTensor2D } from '../commons/isTensor'; +var DEFAULT_MODEL_NAME = 'face_landmark_68_model'; +function extractorsFactory(weightMap) { + function extractConvParams(prefix) { + var params = { + filters: weightMap[prefix + "/kernel"], + bias: weightMap[prefix + "/bias"] + }; + if (!isTensor4D(params.filters)) { + throw new Error("expected weightMap[" + prefix + "/kernel] to be a Tensor4D, instead have " + params.filters); + } + if (!isTensor1D(params.bias)) { + throw new Error("expected weightMap[" + prefix + "/bias] to be a Tensor1D, instead have " + params.bias); + } + return params; + } + function extractFcParams(prefix) { + var params = { + weights: weightMap[prefix + "/kernel"], + bias: weightMap[prefix + "/bias"] + }; + if (!isTensor2D(params.weights)) { + throw new Error("expected weightMap[" + prefix + "/kernel] to be a Tensor2D, instead have " + params.weights); + } + if (!isTensor1D(params.bias)) { + throw new Error("expected weightMap[" + prefix + "/bias] to be a Tensor1D, instead have " + params.bias); + } + return params; + } + return { + extractConvParams: extractConvParams, + extractFcParams: extractFcParams + }; +} +export function loadQuantizedParams(uri) { + return tslib_1.__awaiter(this, void 0, void 0, function () { + var weightMap, _a, extractConvParams, extractFcParams; + return tslib_1.__generator(this, function (_b) { + switch (_b.label) { + case 0: return [4 /*yield*/, loadWeightMap(uri, DEFAULT_MODEL_NAME)]; + case 1: + weightMap = _b.sent(); + _a = extractorsFactory(weightMap), extractConvParams = _a.extractConvParams, extractFcParams = _a.extractFcParams; + return [2 /*return*/, { + conv0_params: extractConvParams('conv2d_0'), + conv1_params: extractConvParams('conv2d_1'), + conv2_params: extractConvParams('conv2d_2'), + conv3_params: extractConvParams('conv2d_3'), + conv4_params: extractConvParams('conv2d_4'), + conv5_params: extractConvParams('conv2d_5'), + conv6_params: extractConvParams('conv2d_6'), + conv7_params: extractConvParams('conv2d_7'), + fc0_params: extractFcParams('dense'), + fc1_params: extractFcParams('logits') + }]; + } + }); + }); +} +//# sourceMappingURL=loadQuantizedParams.js.map \ No newline at end of file diff --git a/dist/faceLandmarkNet/loadQuantizedParams.js.map b/dist/faceLandmarkNet/loadQuantizedParams.js.map new file mode 100644 index 00000000..63490c16 --- /dev/null +++ b/dist/faceLandmarkNet/loadQuantizedParams.js.map @@ -0,0 +1 @@ +{"version":3,"file":"loadQuantizedParams.js","sourceRoot":"","sources":["../../src/faceLandmarkNet/loadQuantizedParams.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAGzD,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAEzE,IAAM,kBAAkB,GAAG,wBAAwB,CAAA;AAEnD,2BAA2B,SAAc;IAEvC,2BAA2B,MAAc;QACvC,IAAM,MAAM,GAAG;YACb,OAAO,EAAE,SAAS,CAAI,MAAM,YAAS,CAAgB;YACrD,IAAI,EAAE,SAAS,CAAI,MAAM,UAAO,CAAgB;SACjD,CAAA;QAED,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE;YAC/B,MAAM,IAAI,KAAK,CAAC,wBAAsB,MAAM,gDAA2C,MAAM,CAAC,OAAS,CAAC,CAAA;SACzG;QAED,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE;YAC5B,MAAM,IAAI,KAAK,CAAC,wBAAsB,MAAM,8CAAyC,MAAM,CAAC,IAAM,CAAC,CAAA;SACpG;QAED,OAAO,MAAM,CAAA;IACf,CAAC;IAED,yBAAyB,MAAc;QACrC,IAAM,MAAM,GAAG;YACb,OAAO,EAAE,SAAS,CAAI,MAAM,YAAS,CAAgB;YACrD,IAAI,EAAE,SAAS,CAAI,MAAM,UAAO,CAAgB;SACjD,CAAA;QAED,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE;YAC/B,MAAM,IAAI,KAAK,CAAC,wBAAsB,MAAM,gDAA2C,MAAM,CAAC,OAAS,CAAC,CAAA;SACzG;QAED,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE;YAC5B,MAAM,IAAI,KAAK,CAAC,wBAAsB,MAAM,8CAAyC,MAAM,CAAC,IAAM,CAAC,CAAA;SACpG;QAED,OAAO,MAAM,CAAA;IACf,CAAC;IAED,OAAO;QACL,iBAAiB,mBAAA;QACjB,eAAe,iBAAA;KAChB,CAAA;AACH,CAAC;AAED,MAAM,8BAAoC,GAAuB;;;;;wBAC7C,qBAAM,aAAa,CAAC,GAAG,EAAE,kBAAkB,CAAC,EAAA;;oBAAxD,SAAS,GAAG,SAA4C;oBAExD,KAGF,iBAAiB,CAAC,SAAS,CAAC,EAF9B,iBAAiB,uBAAA,EACjB,eAAe,qBAAA,CACe;oBAEhC,sBAAO;4BACL,YAAY,EAAE,iBAAiB,CAAC,UAAU,CAAC;4BAC3C,YAAY,EAAE,iBAAiB,CAAC,UAAU,CAAC;4BAC3C,YAAY,EAAE,iBAAiB,CAAC,UAAU,CAAC;4BAC3C,YAAY,EAAE,iBAAiB,CAAC,UAAU,CAAC;4BAC3C,YAAY,EAAE,iBAAiB,CAAC,UAAU,CAAC;4BAC3C,YAAY,EAAE,iBAAiB,CAAC,UAAU,CAAC;4BAC3C,YAAY,EAAE,iBAAiB,CAAC,UAAU,CAAC;4BAC3C,YAAY,EAAE,iBAAiB,CAAC,UAAU,CAAC;4BAC3C,UAAU,EAAE,eAAe,CAAC,OAAO,CAAC;4BACpC,UAAU,EAAE,eAAe,CAAC,QAAQ,CAAC;yBACtC,EAAA;;;;CACF"} \ No newline at end of file diff --git a/dist/faceLandmarkNet/types.d.ts b/dist/faceLandmarkNet/types.d.ts index f066187c..a217fb8f 100644 --- a/dist/faceLandmarkNet/types.d.ts +++ b/dist/faceLandmarkNet/types.d.ts @@ -1,20 +1,18 @@ import * as tf from '@tensorflow/tfjs-core'; import { ConvParams } from '../commons/types'; -export declare namespace FaceLandmarkNet { - type FCParams = { - weights: tf.Tensor2D; - bias: tf.Tensor1D; - }; - type NetParams = { - conv0_params: ConvParams; - conv1_params: ConvParams; - conv2_params: ConvParams; - conv3_params: ConvParams; - conv4_params: ConvParams; - conv5_params: ConvParams; - conv6_params: ConvParams; - conv7_params: ConvParams; - fc0_params: FCParams; - fc1_params: FCParams; - }; -} +export declare type FCParams = { + weights: tf.Tensor2D; + bias: tf.Tensor1D; +}; +export declare type NetParams = { + conv0_params: ConvParams; + conv1_params: ConvParams; + conv2_params: ConvParams; + conv3_params: ConvParams; + conv4_params: ConvParams; + conv5_params: ConvParams; + conv6_params: ConvParams; + conv7_params: ConvParams; + fc0_params: FCParams; + fc1_params: FCParams; +}; diff --git a/dist/faceRecognitionNet/FaceRecognitionNet.d.ts b/dist/faceRecognitionNet/FaceRecognitionNet.d.ts new file mode 100644 index 00000000..0de81180 --- /dev/null +++ b/dist/faceRecognitionNet/FaceRecognitionNet.d.ts @@ -0,0 +1,11 @@ +import * as tf from '@tensorflow/tfjs-core'; +import { NetInput } from '../NetInput'; +import { TNetInput } from '../types'; +export declare class FaceRecognitionNet { + private _params; + load(weightsOrUrl: Float32Array | string | undefined): Promise; + extractWeights(weights: Float32Array): void; + forward(input: tf.Tensor | NetInput | TNetInput): tf.Tensor; + computeFaceDescriptor(input: tf.Tensor | NetInput | TNetInput): Promise; + computeFaceDescriptorSync(input: tf.Tensor | NetInput | TNetInput): Promise; +} diff --git a/dist/faceRecognitionNet/FaceRecognitionNet.js b/dist/faceRecognitionNet/FaceRecognitionNet.js new file mode 100644 index 00000000..bf547fdf --- /dev/null +++ b/dist/faceRecognitionNet/FaceRecognitionNet.js @@ -0,0 +1,101 @@ +import * as tslib_1 from "tslib"; +import * as tf from '@tensorflow/tfjs-core'; +import { getImageTensor } from '../getImageTensor'; +import { padToSquare } from '../padToSquare'; +import { convDown } from './convLayer'; +import { extractParams } from './extractParams'; +import { loadQuantizedParams } from './loadQuantizedParams'; +import { normalize } from './normalize'; +import { residual, residualDown } from './residualLayer'; +var FaceRecognitionNet = /** @class */ (function () { + function FaceRecognitionNet() { + } + FaceRecognitionNet.prototype.load = function (weightsOrUrl) { + return tslib_1.__awaiter(this, void 0, void 0, function () { + var _a; + return tslib_1.__generator(this, function (_b) { + switch (_b.label) { + case 0: + if (weightsOrUrl instanceof Float32Array) { + this.extractWeights(weightsOrUrl); + return [2 /*return*/]; + } + if (weightsOrUrl && typeof weightsOrUrl !== 'string') { + throw new Error('FaceLandmarkNet.load - expected model uri, or weights as Float32Array'); + } + _a = this; + return [4 /*yield*/, loadQuantizedParams(weightsOrUrl)]; + case 1: + _a._params = _b.sent(); + return [2 /*return*/]; + } + }); + }); + }; + FaceRecognitionNet.prototype.extractWeights = function (weights) { + this._params = extractParams(weights); + }; + FaceRecognitionNet.prototype.forward = function (input) { + var _this = this; + if (!this._params) { + throw new Error('FaceRecognitionNet - load model before inference'); + } + return tf.tidy(function () { + var x = padToSquare(getImageTensor(input), true); + // work with 150 x 150 sized face images + if (x.shape[1] !== 150 || x.shape[2] !== 150) { + x = tf.image.resizeBilinear(x, [150, 150]); + } + x = normalize(x); + var out = convDown(x, _this._params.conv32_down); + out = tf.maxPool(out, 3, 2, 'valid'); + out = residual(out, _this._params.conv32_1); + out = residual(out, _this._params.conv32_2); + out = residual(out, _this._params.conv32_3); + out = residualDown(out, _this._params.conv64_down); + out = residual(out, _this._params.conv64_1); + out = residual(out, _this._params.conv64_2); + out = residual(out, _this._params.conv64_3); + out = residualDown(out, _this._params.conv128_down); + out = residual(out, _this._params.conv128_1); + out = residual(out, _this._params.conv128_2); + out = residualDown(out, _this._params.conv256_down); + out = residual(out, _this._params.conv256_1); + out = residual(out, _this._params.conv256_2); + out = residualDown(out, _this._params.conv256_down_out); + var globalAvg = out.mean([1, 2]); + var fullyConnected = tf.matMul(globalAvg, _this._params.fc); + return fullyConnected; + }); + }; + FaceRecognitionNet.prototype.computeFaceDescriptor = function (input) { + return tslib_1.__awaiter(this, void 0, void 0, function () { + var result, data; + return tslib_1.__generator(this, function (_a) { + switch (_a.label) { + case 0: + result = this.forward(input); + return [4 /*yield*/, result.data()]; + case 1: + data = _a.sent(); + result.dispose(); + return [2 /*return*/, data]; + } + }); + }); + }; + FaceRecognitionNet.prototype.computeFaceDescriptorSync = function (input) { + return tslib_1.__awaiter(this, void 0, void 0, function () { + var result, data; + return tslib_1.__generator(this, function (_a) { + result = this.forward(input); + data = result.dataSync(); + result.dispose(); + return [2 /*return*/, data]; + }); + }); + }; + return FaceRecognitionNet; +}()); +export { FaceRecognitionNet }; +//# sourceMappingURL=FaceRecognitionNet.js.map \ No newline at end of file diff --git a/dist/faceRecognitionNet/FaceRecognitionNet.js.map b/dist/faceRecognitionNet/FaceRecognitionNet.js.map new file mode 100644 index 00000000..05115807 --- /dev/null +++ b/dist/faceRecognitionNet/FaceRecognitionNet.js.map @@ -0,0 +1 @@ +{"version":3,"file":"FaceRecognitionNet.js","sourceRoot":"","sources":["../../src/faceRecognitionNet/FaceRecognitionNet.ts"],"names":[],"mappings":";AAAA,OAAO,KAAK,EAAE,MAAM,uBAAuB,CAAC;AAE5C,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAEnD,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAE7C,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AACvC,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChD,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAC5D,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAGzD;IAAA;IA2EA,CAAC;IAvEc,iCAAI,GAAjB,UAAkB,YAA+C;;;;;;wBAC/D,IAAI,YAAY,YAAY,YAAY,EAAE;4BACxC,IAAI,CAAC,cAAc,CAAC,YAAY,CAAC,CAAA;4BACjC,sBAAM;yBACP;wBAED,IAAI,YAAY,IAAI,OAAO,YAAY,KAAK,QAAQ,EAAE;4BACpD,MAAM,IAAI,KAAK,CAAC,uEAAuE,CAAC,CAAA;yBACzF;wBACD,KAAA,IAAI,CAAA;wBAAW,qBAAM,mBAAmB,CAAC,YAAY,CAAC,EAAA;;wBAAtD,GAAK,OAAO,GAAG,SAAuC,CAAA;;;;;KACvD;IAEM,2CAAc,GAArB,UAAsB,OAAqB;QACzC,IAAI,CAAC,OAAO,GAAG,aAAa,CAAC,OAAO,CAAC,CAAA;IACvC,CAAC;IAEM,oCAAO,GAAd,UAAe,KAAuC;QAAtD,iBAwCC;QAvCC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE;YACjB,MAAM,IAAI,KAAK,CAAC,kDAAkD,CAAC,CAAA;SACpE;QAED,OAAO,EAAE,CAAC,IAAI,CAAC;YAEb,IAAI,CAAC,GAAG,WAAW,CAAC,cAAc,CAAC,KAAK,CAAC,EAAE,IAAI,CAAC,CAAA;YAChD,wCAAwC;YACxC,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,GAAG,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,GAAG,EAAE;gBAC5C,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC,EAAE,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,CAAA;aAC3C;YACD,CAAC,GAAG,SAAS,CAAC,CAAC,CAAC,CAAA;YAEhB,IAAI,GAAG,GAAG,QAAQ,CAAC,CAAC,EAAE,KAAI,CAAC,OAAO,CAAC,WAAW,CAAC,CAAA;YAC/C,GAAG,GAAG,EAAE,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,EAAE,OAAO,CAAC,CAAA;YAEpC,GAAG,GAAG,QAAQ,CAAC,GAAG,EAAE,KAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAA;YAC1C,GAAG,GAAG,QAAQ,CAAC,GAAG,EAAE,KAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAA;YAC1C,GAAG,GAAG,QAAQ,CAAC,GAAG,EAAE,KAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAA;YAE1C,GAAG,GAAG,YAAY,CAAC,GAAG,EAAE,KAAI,CAAC,OAAO,CAAC,WAAW,CAAC,CAAA;YACjD,GAAG,GAAG,QAAQ,CAAC,GAAG,EAAE,KAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAA;YAC1C,GAAG,GAAG,QAAQ,CAAC,GAAG,EAAE,KAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAA;YAC1C,GAAG,GAAG,QAAQ,CAAC,GAAG,EAAE,KAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAA;YAE1C,GAAG,GAAG,YAAY,CAAC,GAAG,EAAE,KAAI,CAAC,OAAO,CAAC,YAAY,CAAC,CAAA;YAClD,GAAG,GAAG,QAAQ,CAAC,GAAG,EAAE,KAAI,CAAC,OAAO,CAAC,SAAS,CAAC,CAAA;YAC3C,GAAG,GAAG,QAAQ,CAAC,GAAG,EAAE,KAAI,CAAC,OAAO,CAAC,SAAS,CAAC,CAAA;YAE3C,GAAG,GAAG,YAAY,CAAC,GAAG,EAAE,KAAI,CAAC,OAAO,CAAC,YAAY,CAAC,CAAA;YAClD,GAAG,GAAG,QAAQ,CAAC,GAAG,EAAE,KAAI,CAAC,OAAO,CAAC,SAAS,CAAC,CAAA;YAC3C,GAAG,GAAG,QAAQ,CAAC,GAAG,EAAE,KAAI,CAAC,OAAO,CAAC,SAAS,CAAC,CAAA;YAC3C,GAAG,GAAG,YAAY,CAAC,GAAG,EAAE,KAAI,CAAC,OAAO,CAAC,gBAAgB,CAAC,CAAA;YAEtD,IAAM,SAAS,GAAG,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAgB,CAAA;YACjD,IAAM,cAAc,GAAG,EAAE,CAAC,MAAM,CAAC,SAAS,EAAE,KAAI,CAAC,OAAO,CAAC,EAAE,CAAC,CAAA;YAE5D,OAAO,cAAc,CAAA;QACvB,CAAC,CAAC,CAAA;IACJ,CAAC;IAEY,kDAAqB,GAAlC,UAAmC,KAAuC;;;;;;wBAClE,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAA;wBACrB,qBAAM,MAAM,CAAC,IAAI,EAAE,EAAA;;wBAA1B,IAAI,GAAG,SAAmB;wBAChC,MAAM,CAAC,OAAO,EAAE,CAAA;wBAChB,sBAAO,IAAI,EAAA;;;;KACZ;IAEY,sDAAyB,GAAtC,UAAuC,KAAuC;;;;gBACtE,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAA;gBAC5B,IAAI,GAAG,MAAM,CAAC,QAAQ,EAAE,CAAA;gBAC9B,MAAM,CAAC,OAAO,EAAE,CAAA;gBAChB,sBAAO,IAAI,EAAA;;;KACZ;IACH,yBAAC;AAAD,CAAC,AA3ED,IA2EC"} \ No newline at end of file diff --git a/dist/faceRecognitionNet/convLayer.d.ts b/dist/faceRecognitionNet/convLayer.d.ts index f32f3757..a750f6c4 100644 --- a/dist/faceRecognitionNet/convLayer.d.ts +++ b/dist/faceRecognitionNet/convLayer.d.ts @@ -1,5 +1,5 @@ import * as tf from '@tensorflow/tfjs-core'; -import { FaceRecognitionNet } from './types'; -export declare function conv(x: tf.Tensor4D, params: FaceRecognitionNet.ConvLayerParams): tf.Tensor; -export declare function convNoRelu(x: tf.Tensor4D, params: FaceRecognitionNet.ConvLayerParams): tf.Tensor; -export declare function convDown(x: tf.Tensor4D, params: FaceRecognitionNet.ConvLayerParams): tf.Tensor; +import { ConvLayerParams } from './types'; +export declare function conv(x: tf.Tensor4D, params: ConvLayerParams): tf.Tensor; +export declare function convNoRelu(x: tf.Tensor4D, params: ConvLayerParams): tf.Tensor; +export declare function convDown(x: tf.Tensor4D, params: ConvLayerParams): tf.Tensor; diff --git a/dist/faceRecognitionNet/convLayer.js.map b/dist/faceRecognitionNet/convLayer.js.map index 5ab77a98..c2c3f4ed 100644 --- a/dist/faceRecognitionNet/convLayer.js.map +++ b/dist/faceRecognitionNet/convLayer.js.map @@ -1 +1 @@ -{"version":3,"file":"convLayer.js","sourceRoot":"","sources":["../../src/faceRecognitionNet/convLayer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,uBAAuB,CAAC;AAE5C,OAAO,EAAE,KAAK,EAAE,MAAM,cAAc,CAAC;AAIrC,mBACE,CAAc,EACd,MAA0C,EAC1C,OAAyB,EACzB,QAAiB,EACjB,OAAkC;IAAlC,wBAAA,EAAA,gBAAkC;IAE5B,IAAA,gBAA+B,EAA7B,oBAAO,EAAE,cAAI,CAAgB;IAErC,IAAI,GAAG,GAAG,EAAE,CAAC,MAAM,CAAC,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,CAAC,CAAA;IACjD,GAAG,GAAG,EAAE,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,CAAA;IACvB,GAAG,GAAG,KAAK,CAAC,GAAG,EAAE,MAAM,CAAC,KAAK,CAAC,CAAA;IAC9B,OAAO,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAA;AACtC,CAAC;AAED,MAAM,eAAe,CAAc,EAAE,MAA0C;IAC7E,OAAO,SAAS,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,IAAI,CAAC,CAAA;AAC3C,CAAC;AAED,MAAM,qBAAqB,CAAc,EAAE,MAA0C;IACnF,OAAO,SAAS,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,KAAK,CAAC,CAAA;AAC5C,CAAC;AAED,MAAM,mBAAmB,CAAc,EAAE,MAA0C;IACjF,OAAO,SAAS,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,OAAO,CAAC,CAAA;AACpD,CAAC"} \ No newline at end of file +{"version":3,"file":"convLayer.js","sourceRoot":"","sources":["../../src/faceRecognitionNet/convLayer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,uBAAuB,CAAC;AAE5C,OAAO,EAAE,KAAK,EAAE,MAAM,cAAc,CAAC;AAIrC,mBACE,CAAc,EACd,MAAuB,EACvB,OAAyB,EACzB,QAAiB,EACjB,OAAkC;IAAlC,wBAAA,EAAA,gBAAkC;IAE5B,IAAA,gBAA+B,EAA7B,oBAAO,EAAE,cAAI,CAAgB;IAErC,IAAI,GAAG,GAAG,EAAE,CAAC,MAAM,CAAC,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,CAAC,CAAA;IACjD,GAAG,GAAG,EAAE,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,CAAA;IACvB,GAAG,GAAG,KAAK,CAAC,GAAG,EAAE,MAAM,CAAC,KAAK,CAAC,CAAA;IAC9B,OAAO,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAA;AACtC,CAAC;AAED,MAAM,eAAe,CAAc,EAAE,MAAuB;IAC1D,OAAO,SAAS,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,IAAI,CAAC,CAAA;AAC3C,CAAC;AAED,MAAM,qBAAqB,CAAc,EAAE,MAAuB;IAChE,OAAO,SAAS,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,KAAK,CAAC,CAAA;AAC5C,CAAC;AAED,MAAM,mBAAmB,CAAc,EAAE,MAAuB;IAC9D,OAAO,SAAS,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,OAAO,CAAC,CAAA;AACpD,CAAC"} \ No newline at end of file diff --git a/dist/faceRecognitionNet/extractParams.d.ts b/dist/faceRecognitionNet/extractParams.d.ts index 4f6ea563..d90f3077 100644 --- a/dist/faceRecognitionNet/extractParams.d.ts +++ b/dist/faceRecognitionNet/extractParams.d.ts @@ -1,2 +1,2 @@ -import { FaceRecognitionNet } from './types'; -export declare function extractParams(weights: Float32Array): FaceRecognitionNet.NetParams; +import { NetParams } from './types'; +export declare function extractParams(weights: Float32Array): NetParams; diff --git a/dist/faceRecognitionNet/extractParams.js.map b/dist/faceRecognitionNet/extractParams.js.map index e41a3c2c..1492cece 100644 --- a/dist/faceRecognitionNet/extractParams.js.map +++ b/dist/faceRecognitionNet/extractParams.js.map @@ -1 +1 @@ -{"version":3,"file":"extractParams.js","sourceRoot":"","sources":["../../src/faceRecognitionNet/extractParams.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,uBAAuB,CAAC;AAE5C,OAAO,EAAE,qBAAqB,EAAE,MAAM,kCAAkC,CAAC;AAEzE,OAAO,EAAE,OAAO,EAAE,MAAM,UAAU,CAAC;AAGnC,2BAA2B,cAAsC;IAE/D,6BAA6B,eAAuB,EAAE,UAAkB,EAAE,UAAkB;QAC1F,IAAM,OAAO,GAAG,cAAc,CAAC,eAAe,CAAC,CAAA;QAC/C,IAAM,KAAK,GAAG,OAAO,CAAC,MAAM,GAAG,CAAC,UAAU,GAAG,UAAU,GAAG,UAAU,CAAC,CAAA;QAErE,IAAI,OAAO,CAAC,KAAK,CAAC,EAAE;YAClB,MAAM,IAAI,KAAK,CAAC,iCAA+B,KAAK,0BAAqB,OAAO,CAAC,MAAM,sBAAiB,UAAU,sBAAiB,UAAY,CAAC,CAAA;SACjJ;QAED,OAAO,EAAE,CAAC,SAAS,CACjB,EAAE,CAAC,QAAQ,CAAC,OAAO,EAAE,CAAC,UAAU,EAAE,KAAK,EAAE,UAAU,EAAE,UAAU,CAAC,CAAC,EACjE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CACb,CAAA;IACH,CAAC;IAED,iCAAiC,UAAkB;QACjD,IAAM,OAAO,GAAG,EAAE,CAAC,QAAQ,CAAC,cAAc,CAAC,UAAU,CAAC,CAAC,CAAA;QACvD,IAAM,MAAM,GAAG,EAAE,CAAC,QAAQ,CAAC,cAAc,CAAC,UAAU,CAAC,CAAC,CAAA;QACtD,OAAO;YACL,OAAO,SAAA;YACP,MAAM,QAAA;SACP,CAAA;IACH,CAAC;IAED,gCACE,eAAuB,EACvB,UAAkB,EAClB,UAAkB;QAElB,IAAM,YAAY,GAAG,mBAAmB,CAAC,eAAe,EAAE,UAAU,EAAE,UAAU,CAAC,CAAA;QACjF,IAAM,SAAS,GAAG,EAAE,CAAC,QAAQ,CAAC,cAAc,CAAC,UAAU,CAAC,CAAC,CAAA;QACzD,IAAM,KAAK,GAAG,uBAAuB,CAAC,UAAU,CAAC,CAAA;QAEjD,OAAO;YACL,IAAI,EAAE;gBACJ,OAAO,EAAE,YAAY;gBACrB,IAAI,EAAE,SAAS;aAChB;YACD,KAAK,OAAA;SACN,CAAA;IACH,CAAC;IAED,oCAAoC,eAAuB,EAAE,UAAkB,EAAE,UAAkB,EAAE,MAAuB;QAAvB,uBAAA,EAAA,cAAuB;QAC1H,IAAM,KAAK,GAAuC,sBAAsB,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,eAAe,EAAE,UAAU,EAAE,UAAU,CAAC,CAAA;QACtI,IAAM,KAAK,GAAuC,sBAAsB,CAAC,eAAe,EAAE,UAAU,EAAE,UAAU,CAAC,CAAA;QAEjH,OAAO;YACL,KAAK,OAAA;YACL,KAAK,OAAA;SACN,CAAA;IACH,CAAC;IAED,OAAO;QACL,sBAAsB,wBAAA;QACtB,0BAA0B,4BAAA;KAC3B,CAAA;AAEH,CAAC;AAED,MAAM,wBAAwB,OAAqB;IAC3C,IAAA,mCAG4B,EAFhC,kCAAc,EACd,4CAAmB,CACa;IAE5B,IAAA,sCAG+B,EAFnC,kDAAsB,EACtB,0DAA0B,CACS;IAErC,IAAM,WAAW,GAAG,sBAAsB,CAAC,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC,CAAA;IACvD,IAAM,QAAQ,GAAG,0BAA0B,CAAC,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC,CAAA;IACxD,IAAM,QAAQ,GAAG,0BAA0B,CAAC,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC,CAAA;IACxD,IAAM,QAAQ,GAAG,0BAA0B,CAAC,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC,CAAA;IAExD,IAAM,WAAW,GAAG,0BAA0B,CAAC,KAAK,EAAE,EAAE,EAAE,CAAC,EAAE,IAAI,CAAC,CAAA;IAClE,IAAM,QAAQ,GAAG,0BAA0B,CAAC,KAAK,EAAE,EAAE,EAAE,CAAC,CAAC,CAAA;IACzD,IAAM,QAAQ,GAAG,0BAA0B,CAAC,KAAK,EAAE,EAAE,EAAE,CAAC,CAAC,CAAA;IACzD,IAAM,QAAQ,GAAG,0BAA0B,CAAC,KAAK,EAAE,EAAE,EAAE,CAAC,CAAC,CAAA;IAEzD,IAAM,YAAY,GAAG,0BAA0B,CAAC,MAAM,EAAE,GAAG,EAAE,CAAC,EAAE,IAAI,CAAC,CAAA;IACrE,IAAM,SAAS,GAAG,0BAA0B,CAAC,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC,CAAA;IAC5D,IAAM,SAAS,GAAG,0BAA0B,CAAC,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC,CAAA;IAE5D,IAAM,YAAY,GAAG,0BAA0B,CAAC,MAAM,EAAE,GAAG,EAAE,CAAC,EAAE,IAAI,CAAC,CAAA;IACrE,IAAM,SAAS,GAAG,0BAA0B,CAAC,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC,CAAA;IAC5D,IAAM,SAAS,GAAG,0BAA0B,CAAC,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC,CAAA;IAC5D,IAAM,gBAAgB,GAAG,0BAA0B,CAAC,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC,CAAA;IAEnE,IAAM,EAAE,GAAG,EAAE,CAAC,SAAS,CAAC,EAAE,CAAC,QAAQ,CAAC,cAAc,CAAC,GAAG,GAAG,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAA;IAEnF,IAAI,mBAAmB,EAAE,CAAC,MAAM,KAAK,CAAC,EAAE;QACtC,MAAM,IAAI,KAAK,CAAC,oCAAkC,mBAAmB,EAAE,CAAC,MAAQ,CAAC,CAAA;KAClF;IAED,OAAO;QACL,WAAW,aAAA;QACX,QAAQ,UAAA;QACR,QAAQ,UAAA;QACR,QAAQ,UAAA;QACR,WAAW,aAAA;QACX,QAAQ,UAAA;QACR,QAAQ,UAAA;QACR,QAAQ,UAAA;QACR,YAAY,cAAA;QACZ,SAAS,WAAA;QACT,SAAS,WAAA;QACT,YAAY,cAAA;QACZ,SAAS,WAAA;QACT,SAAS,WAAA;QACT,gBAAgB,kBAAA;QAChB,EAAE,IAAA;KACH,CAAA;AACH,CAAC"} \ No newline at end of file +{"version":3,"file":"extractParams.js","sourceRoot":"","sources":["../../src/faceRecognitionNet/extractParams.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,uBAAuB,CAAC;AAE5C,OAAO,EAAE,qBAAqB,EAAE,MAAM,kCAAkC,CAAC;AAEzE,OAAO,EAAE,OAAO,EAAE,MAAM,UAAU,CAAC;AAGnC,2BAA2B,cAAsC;IAE/D,6BAA6B,eAAuB,EAAE,UAAkB,EAAE,UAAkB;QAC1F,IAAM,OAAO,GAAG,cAAc,CAAC,eAAe,CAAC,CAAA;QAC/C,IAAM,KAAK,GAAG,OAAO,CAAC,MAAM,GAAG,CAAC,UAAU,GAAG,UAAU,GAAG,UAAU,CAAC,CAAA;QAErE,IAAI,OAAO,CAAC,KAAK,CAAC,EAAE;YAClB,MAAM,IAAI,KAAK,CAAC,iCAA+B,KAAK,0BAAqB,OAAO,CAAC,MAAM,sBAAiB,UAAU,sBAAiB,UAAY,CAAC,CAAA;SACjJ;QAED,OAAO,EAAE,CAAC,SAAS,CACjB,EAAE,CAAC,QAAQ,CAAC,OAAO,EAAE,CAAC,UAAU,EAAE,KAAK,EAAE,UAAU,EAAE,UAAU,CAAC,CAAC,EACjE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CACb,CAAA;IACH,CAAC;IAED,iCAAiC,UAAkB;QACjD,IAAM,OAAO,GAAG,EAAE,CAAC,QAAQ,CAAC,cAAc,CAAC,UAAU,CAAC,CAAC,CAAA;QACvD,IAAM,MAAM,GAAG,EAAE,CAAC,QAAQ,CAAC,cAAc,CAAC,UAAU,CAAC,CAAC,CAAA;QACtD,OAAO;YACL,OAAO,SAAA;YACP,MAAM,QAAA;SACP,CAAA;IACH,CAAC;IAED,gCACE,eAAuB,EACvB,UAAkB,EAClB,UAAkB;QAElB,IAAM,YAAY,GAAG,mBAAmB,CAAC,eAAe,EAAE,UAAU,EAAE,UAAU,CAAC,CAAA;QACjF,IAAM,SAAS,GAAG,EAAE,CAAC,QAAQ,CAAC,cAAc,CAAC,UAAU,CAAC,CAAC,CAAA;QACzD,IAAM,KAAK,GAAG,uBAAuB,CAAC,UAAU,CAAC,CAAA;QAEjD,OAAO;YACL,IAAI,EAAE;gBACJ,OAAO,EAAE,YAAY;gBACrB,IAAI,EAAE,SAAS;aAChB;YACD,KAAK,OAAA;SACN,CAAA;IACH,CAAC;IAED,oCACE,eAAuB,EACvB,UAAkB,EAClB,UAAkB,EAClB,MAAuB;QAAvB,uBAAA,EAAA,cAAuB;QAEvB,IAAM,KAAK,GAAoB,sBAAsB,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,eAAe,EAAE,UAAU,EAAE,UAAU,CAAC,CAAA;QACnH,IAAM,KAAK,GAAoB,sBAAsB,CAAC,eAAe,EAAE,UAAU,EAAE,UAAU,CAAC,CAAA;QAE9F,OAAO;YACL,KAAK,OAAA;YACL,KAAK,OAAA;SACN,CAAA;IACH,CAAC;IAED,OAAO;QACL,sBAAsB,wBAAA;QACtB,0BAA0B,4BAAA;KAC3B,CAAA;AAEH,CAAC;AAED,MAAM,wBAAwB,OAAqB;IAC3C,IAAA,mCAG4B,EAFhC,kCAAc,EACd,4CAAmB,CACa;IAE5B,IAAA,sCAG+B,EAFnC,kDAAsB,EACtB,0DAA0B,CACS;IAErC,IAAM,WAAW,GAAG,sBAAsB,CAAC,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC,CAAA;IACvD,IAAM,QAAQ,GAAG,0BAA0B,CAAC,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC,CAAA;IACxD,IAAM,QAAQ,GAAG,0BAA0B,CAAC,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC,CAAA;IACxD,IAAM,QAAQ,GAAG,0BAA0B,CAAC,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC,CAAA;IAExD,IAAM,WAAW,GAAG,0BAA0B,CAAC,KAAK,EAAE,EAAE,EAAE,CAAC,EAAE,IAAI,CAAC,CAAA;IAClE,IAAM,QAAQ,GAAG,0BAA0B,CAAC,KAAK,EAAE,EAAE,EAAE,CAAC,CAAC,CAAA;IACzD,IAAM,QAAQ,GAAG,0BAA0B,CAAC,KAAK,EAAE,EAAE,EAAE,CAAC,CAAC,CAAA;IACzD,IAAM,QAAQ,GAAG,0BAA0B,CAAC,KAAK,EAAE,EAAE,EAAE,CAAC,CAAC,CAAA;IAEzD,IAAM,YAAY,GAAG,0BAA0B,CAAC,MAAM,EAAE,GAAG,EAAE,CAAC,EAAE,IAAI,CAAC,CAAA;IACrE,IAAM,SAAS,GAAG,0BAA0B,CAAC,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC,CAAA;IAC5D,IAAM,SAAS,GAAG,0BAA0B,CAAC,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC,CAAA;IAE5D,IAAM,YAAY,GAAG,0BAA0B,CAAC,MAAM,EAAE,GAAG,EAAE,CAAC,EAAE,IAAI,CAAC,CAAA;IACrE,IAAM,SAAS,GAAG,0BAA0B,CAAC,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC,CAAA;IAC5D,IAAM,SAAS,GAAG,0BAA0B,CAAC,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC,CAAA;IAC5D,IAAM,gBAAgB,GAAG,0BAA0B,CAAC,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC,CAAA;IAEnE,IAAM,EAAE,GAAG,EAAE,CAAC,SAAS,CAAC,EAAE,CAAC,QAAQ,CAAC,cAAc,CAAC,GAAG,GAAG,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAA;IAEnF,IAAI,mBAAmB,EAAE,CAAC,MAAM,KAAK,CAAC,EAAE;QACtC,MAAM,IAAI,KAAK,CAAC,oCAAkC,mBAAmB,EAAE,CAAC,MAAQ,CAAC,CAAA;KAClF;IAED,OAAO;QACL,WAAW,aAAA;QACX,QAAQ,UAAA;QACR,QAAQ,UAAA;QACR,QAAQ,UAAA;QACR,WAAW,aAAA;QACX,QAAQ,UAAA;QACR,QAAQ,UAAA;QACR,QAAQ,UAAA;QACR,YAAY,cAAA;QACZ,SAAS,WAAA;QACT,SAAS,WAAA;QACT,YAAY,cAAA;QACZ,SAAS,WAAA;QACT,SAAS,WAAA;QACT,gBAAgB,kBAAA;QAChB,EAAE,IAAA;KACH,CAAA;AACH,CAAC"} \ No newline at end of file diff --git a/dist/faceRecognitionNet/index.d.ts b/dist/faceRecognitionNet/index.d.ts index f2f9febc..47bcfaa2 100644 --- a/dist/faceRecognitionNet/index.d.ts +++ b/dist/faceRecognitionNet/index.d.ts @@ -1,7 +1,3 @@ -import * as tf from '@tensorflow/tfjs-core'; -import { NetInput } from '../NetInput'; -export declare function faceRecognitionNet(weights: Float32Array): { - computeFaceDescriptor: (input: string | HTMLCanvasElement | HTMLImageElement | HTMLVideoElement | (string | HTMLCanvasElement | HTMLImageElement | HTMLVideoElement)[] | tf.Tensor | NetInput) => Promise; - computeFaceDescriptorSync: (input: string | HTMLCanvasElement | HTMLImageElement | HTMLVideoElement | (string | HTMLCanvasElement | HTMLImageElement | HTMLVideoElement)[] | tf.Tensor | NetInput) => Int32Array | Uint8Array | Float32Array; - forward: (input: string | HTMLCanvasElement | HTMLImageElement | HTMLVideoElement | (string | HTMLCanvasElement | HTMLImageElement | HTMLVideoElement)[] | tf.Tensor | NetInput) => tf.Tensor; -}; +import { FaceRecognitionNet } from './FaceRecognitionNet'; +export * from './FaceRecognitionNet'; +export declare function faceRecognitionNet(weights: Float32Array): FaceRecognitionNet; diff --git a/dist/faceRecognitionNet/index.js b/dist/faceRecognitionNet/index.js index ee8b8cb8..4ccc43d5 100644 --- a/dist/faceRecognitionNet/index.js +++ b/dist/faceRecognitionNet/index.js @@ -1,67 +1,8 @@ -import * as tslib_1 from "tslib"; -import * as tf from '@tensorflow/tfjs-core'; -import { getImageTensor } from '../getImageTensor'; -import { padToSquare } from '../padToSquare'; -import { convDown } from './convLayer'; -import { extractParams } from './extractParams'; -import { normalize } from './normalize'; -import { residual, residualDown } from './residualLayer'; +import { FaceRecognitionNet } from './FaceRecognitionNet'; +export * from './FaceRecognitionNet'; export function faceRecognitionNet(weights) { - var _this = this; - var params = extractParams(weights); - function forward(input) { - return tf.tidy(function () { - var x = padToSquare(getImageTensor(input), true); - // work with 150 x 150 sized face images - if (x.shape[1] !== 150 || x.shape[2] !== 150) { - x = tf.image.resizeBilinear(x, [150, 150]); - } - x = normalize(x); - var out = convDown(x, params.conv32_down); - out = tf.maxPool(out, 3, 2, 'valid'); - out = residual(out, params.conv32_1); - out = residual(out, params.conv32_2); - out = residual(out, params.conv32_3); - out = residualDown(out, params.conv64_down); - out = residual(out, params.conv64_1); - out = residual(out, params.conv64_2); - out = residual(out, params.conv64_3); - out = residualDown(out, params.conv128_down); - out = residual(out, params.conv128_1); - out = residual(out, params.conv128_2); - out = residualDown(out, params.conv256_down); - out = residual(out, params.conv256_1); - out = residual(out, params.conv256_2); - out = residualDown(out, params.conv256_down_out); - var globalAvg = out.mean([1, 2]); - var fullyConnected = tf.matMul(globalAvg, params.fc); - return fullyConnected; - }); - } - var computeFaceDescriptor = function (input) { return tslib_1.__awaiter(_this, void 0, void 0, function () { - var result, data; - return tslib_1.__generator(this, function (_a) { - switch (_a.label) { - case 0: - result = forward(input); - return [4 /*yield*/, result.data()]; - case 1: - data = _a.sent(); - result.dispose(); - return [2 /*return*/, data]; - } - }); - }); }; - var computeFaceDescriptorSync = function (input) { - var result = forward(input); - var data = result.dataSync(); - result.dispose(); - return data; - }; - return { - computeFaceDescriptor: computeFaceDescriptor, - computeFaceDescriptorSync: computeFaceDescriptorSync, - forward: forward - }; + var net = new FaceRecognitionNet(); + net.extractWeights(weights); + return net; } //# sourceMappingURL=index.js.map \ No newline at end of file diff --git a/dist/faceRecognitionNet/index.js.map b/dist/faceRecognitionNet/index.js.map index 00596f2b..2b2746a0 100644 --- a/dist/faceRecognitionNet/index.js.map +++ b/dist/faceRecognitionNet/index.js.map @@ -1 +1 @@ -{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/faceRecognitionNet/index.ts"],"names":[],"mappings":";AAAA,OAAO,KAAK,EAAE,MAAM,uBAAuB,CAAC;AAE5C,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAEnD,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAE7C,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AACvC,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChD,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAEzD,MAAM,6BAA6B,OAAqB;IAAxD,iBA4DC;IA3DC,IAAM,MAAM,GAAG,aAAa,CAAC,OAAO,CAAC,CAAA;IAErC,iBAAiB,KAAuC;QACtD,OAAO,EAAE,CAAC,IAAI,CAAC;YAEb,IAAI,CAAC,GAAG,WAAW,CAAC,cAAc,CAAC,KAAK,CAAC,EAAE,IAAI,CAAC,CAAA;YAChD,wCAAwC;YACxC,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,GAAG,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,GAAG,EAAE;gBAC5C,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC,EAAE,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,CAAA;aAC3C;YACD,CAAC,GAAG,SAAS,CAAC,CAAC,CAAC,CAAA;YAEhB,IAAI,GAAG,GAAG,QAAQ,CAAC,CAAC,EAAE,MAAM,CAAC,WAAW,CAAC,CAAA;YACzC,GAAG,GAAG,EAAE,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,EAAE,OAAO,CAAC,CAAA;YAEpC,GAAG,GAAG,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC,QAAQ,CAAC,CAAA;YACpC,GAAG,GAAG,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC,QAAQ,CAAC,CAAA;YACpC,GAAG,GAAG,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC,QAAQ,CAAC,CAAA;YAEpC,GAAG,GAAG,YAAY,CAAC,GAAG,EAAE,MAAM,CAAC,WAAW,CAAC,CAAA;YAC3C,GAAG,GAAG,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC,QAAQ,CAAC,CAAA;YACpC,GAAG,GAAG,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC,QAAQ,CAAC,CAAA;YACpC,GAAG,GAAG,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC,QAAQ,CAAC,CAAA;YAEpC,GAAG,GAAG,YAAY,CAAC,GAAG,EAAE,MAAM,CAAC,YAAY,CAAC,CAAA;YAC5C,GAAG,GAAG,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC,SAAS,CAAC,CAAA;YACrC,GAAG,GAAG,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC,SAAS,CAAC,CAAA;YAErC,GAAG,GAAG,YAAY,CAAC,GAAG,EAAE,MAAM,CAAC,YAAY,CAAC,CAAA;YAC5C,GAAG,GAAG,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC,SAAS,CAAC,CAAA;YACrC,GAAG,GAAG,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC,SAAS,CAAC,CAAA;YACrC,GAAG,GAAG,YAAY,CAAC,GAAG,EAAE,MAAM,CAAC,gBAAgB,CAAC,CAAA;YAEhD,IAAM,SAAS,GAAG,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAgB,CAAA;YACjD,IAAM,cAAc,GAAG,EAAE,CAAC,MAAM,CAAC,SAAS,EAAE,MAAM,CAAC,EAAE,CAAC,CAAA;YAEtD,OAAO,cAAc,CAAA;QACvB,CAAC,CAAC,CAAA;IACJ,CAAC;IAED,IAAM,qBAAqB,GAAG,UAAO,KAAuC;;;;;oBACpE,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC,CAAA;oBAChB,qBAAM,MAAM,CAAC,IAAI,EAAE,EAAA;;oBAA1B,IAAI,GAAG,SAAmB;oBAChC,MAAM,CAAC,OAAO,EAAE,CAAA;oBAChB,sBAAO,IAAI,EAAA;;;SACZ,CAAA;IAED,IAAM,yBAAyB,GAAG,UAAC,KAAuC;QACxE,IAAM,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC,CAAA;QAC7B,IAAM,IAAI,GAAG,MAAM,CAAC,QAAQ,EAAE,CAAA;QAC9B,MAAM,CAAC,OAAO,EAAE,CAAA;QAChB,OAAO,IAAI,CAAA;IACb,CAAC,CAAA;IAED,OAAO;QACL,qBAAqB,uBAAA;QACrB,yBAAyB,2BAAA;QACzB,OAAO,SAAA;KACR,CAAA;AACH,CAAC"} \ No newline at end of file +{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/faceRecognitionNet/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAE1D,cAAc,sBAAsB,CAAC;AAErC,MAAM,6BAA6B,OAAqB;IACtD,IAAM,GAAG,GAAG,IAAI,kBAAkB,EAAE,CAAA;IACpC,GAAG,CAAC,cAAc,CAAC,OAAO,CAAC,CAAA;IAC3B,OAAO,GAAG,CAAA;AACZ,CAAC"} \ No newline at end of file diff --git a/dist/faceRecognitionNet/loadQuantizedParams.d.ts b/dist/faceRecognitionNet/loadQuantizedParams.d.ts new file mode 100644 index 00000000..fbf5b119 --- /dev/null +++ b/dist/faceRecognitionNet/loadQuantizedParams.d.ts @@ -0,0 +1 @@ +export declare function loadQuantizedParams(uri: string | undefined): Promise; diff --git a/dist/faceRecognitionNet/loadQuantizedParams.js b/dist/faceRecognitionNet/loadQuantizedParams.js new file mode 100644 index 00000000..72e1e33d --- /dev/null +++ b/dist/faceRecognitionNet/loadQuantizedParams.js @@ -0,0 +1,96 @@ +import * as tslib_1 from "tslib"; +import { isTensor1D, isTensor2D, isTensor4D } from '../commons/isTensor'; +import { loadWeightMap } from '../commons/loadWeightMap'; +var DEFAULT_MODEL_NAME = 'face_recognition_model'; +function extractorsFactory(weightMap) { + function extractScaleLayerParams(prefix) { + var params = { + weights: weightMap[prefix + "/scale/weights"], + biases: weightMap[prefix + "/scale/biases"] + }; + if (!isTensor1D(params.weights)) { + throw new Error("expected weightMap[" + prefix + "/scale/weights] to be a Tensor1D, instead have " + params.weights); + } + if (!isTensor1D(params.biases)) { + throw new Error("expected weightMap[" + prefix + "/scale/biases] to be a Tensor1D, instead have " + params.biases); + } + return params; + } + function extractConvLayerParams(prefix) { + var params = { + filters: weightMap[prefix + "/conv/filters"], + bias: weightMap[prefix + "/conv/bias"] + }; + if (!isTensor4D(params.filters)) { + throw new Error("expected weightMap[" + prefix + "/conv/filters] to be a Tensor1D, instead have " + params.filters); + } + if (!isTensor1D(params.bias)) { + throw new Error("expected weightMap[" + prefix + "/conv/bias] to be a Tensor1D, instead have " + params.bias); + } + return { + conv: params, + scale: extractScaleLayerParams(prefix) + }; + } + function extractResidualLayerParams(prefix) { + return { + conv1: extractConvLayerParams(prefix + "/conv1"), + conv2: extractConvLayerParams(prefix + "/conv2") + }; + } + return { + extractConvLayerParams: extractConvLayerParams, + extractResidualLayerParams: extractResidualLayerParams + }; +} +export function loadQuantizedParams(uri) { + return tslib_1.__awaiter(this, void 0, void 0, function () { + var weightMap, _a, extractConvLayerParams, extractResidualLayerParams, conv32_down, conv32_1, conv32_2, conv32_3, conv64_down, conv64_1, conv64_2, conv64_3, conv128_down, conv128_1, conv128_2, conv256_down, conv256_1, conv256_2, conv256_down_out, fc; + return tslib_1.__generator(this, function (_b) { + switch (_b.label) { + case 0: return [4 /*yield*/, loadWeightMap(uri, DEFAULT_MODEL_NAME)]; + case 1: + weightMap = _b.sent(); + _a = extractorsFactory(weightMap), extractConvLayerParams = _a.extractConvLayerParams, extractResidualLayerParams = _a.extractResidualLayerParams; + conv32_down = extractConvLayerParams('conv32_down'); + conv32_1 = extractResidualLayerParams('conv32_1'); + conv32_2 = extractResidualLayerParams('conv32_2'); + conv32_3 = extractResidualLayerParams('conv32_3'); + conv64_down = extractResidualLayerParams('conv64_down'); + conv64_1 = extractResidualLayerParams('conv64_1'); + conv64_2 = extractResidualLayerParams('conv64_2'); + conv64_3 = extractResidualLayerParams('conv64_3'); + conv128_down = extractResidualLayerParams('conv128_down'); + conv128_1 = extractResidualLayerParams('conv128_1'); + conv128_2 = extractResidualLayerParams('conv128_2'); + conv256_down = extractResidualLayerParams('conv256_down'); + conv256_1 = extractResidualLayerParams('conv256_1'); + conv256_2 = extractResidualLayerParams('conv256_2'); + conv256_down_out = extractResidualLayerParams('conv256_down_out'); + fc = weightMap['fc']; + if (!isTensor2D(fc)) { + throw new Error("expected weightMap[fc] to be a Tensor2D, instead have " + fc); + } + return [2 /*return*/, { + conv32_down: conv32_down, + conv32_1: conv32_1, + conv32_2: conv32_2, + conv32_3: conv32_3, + conv64_down: conv64_down, + conv64_1: conv64_1, + conv64_2: conv64_2, + conv64_3: conv64_3, + conv128_down: conv128_down, + conv128_1: conv128_1, + conv128_2: conv128_2, + conv256_down: conv256_down, + conv256_1: conv256_1, + conv256_2: conv256_2, + conv256_down_out: conv256_down_out, + fc: fc + }]; + } + }); + }); +} +//# sourceMappingURL=loadQuantizedParams.js.map \ No newline at end of file diff --git a/dist/faceRecognitionNet/loadQuantizedParams.js.map b/dist/faceRecognitionNet/loadQuantizedParams.js.map new file mode 100644 index 00000000..dd925656 --- /dev/null +++ b/dist/faceRecognitionNet/loadQuantizedParams.js.map @@ -0,0 +1 @@ +{"version":3,"file":"loadQuantizedParams.js","sourceRoot":"","sources":["../../src/faceRecognitionNet/loadQuantizedParams.ts"],"names":[],"mappings":";AAAA,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AACzE,OAAO,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAGzD,IAAM,kBAAkB,GAAG,wBAAwB,CAAA;AAEnD,2BAA2B,SAAc;IAEvC,iCAAiC,MAAc;QAC7C,IAAM,MAAM,GAAG;YACb,OAAO,EAAE,SAAS,CAAI,MAAM,mBAAgB,CAAC;YAC7C,MAAM,EAAE,SAAS,CAAI,MAAM,kBAAe,CAAC;SAC5C,CAAA;QAED,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE;YAC/B,MAAM,IAAI,KAAK,CAAC,wBAAsB,MAAM,uDAAkD,MAAM,CAAC,OAAS,CAAC,CAAA;SAChH;QAED,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE;YAC9B,MAAM,IAAI,KAAK,CAAC,wBAAsB,MAAM,sDAAiD,MAAM,CAAC,MAAQ,CAAC,CAAA;SAC9G;QAED,OAAO,MAAM,CAAA;IACf,CAAC;IAED,gCAAgC,MAAc;QAC5C,IAAM,MAAM,GAAG;YACb,OAAO,EAAE,SAAS,CAAI,MAAM,kBAAe,CAAC;YAC5C,IAAI,EAAE,SAAS,CAAI,MAAM,eAAY,CAAC;SACvC,CAAA;QAED,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE;YAC/B,MAAM,IAAI,KAAK,CAAC,wBAAsB,MAAM,sDAAiD,MAAM,CAAC,OAAS,CAAC,CAAA;SAC/G;QAED,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE;YAC5B,MAAM,IAAI,KAAK,CAAC,wBAAsB,MAAM,mDAA8C,MAAM,CAAC,IAAM,CAAC,CAAA;SACzG;QAED,OAAO;YACL,IAAI,EAAE,MAAM;YACZ,KAAK,EAAE,uBAAuB,CAAC,MAAM,CAAC;SACvC,CAAA;IACH,CAAC;IAED,oCAAoC,MAAc;QAChD,OAAO;YACL,KAAK,EAAE,sBAAsB,CAAI,MAAM,WAAQ,CAAC;YAChD,KAAK,EAAE,sBAAsB,CAAI,MAAM,WAAQ,CAAC;SACjD,CAAA;IACH,CAAC;IAED,OAAO;QACL,sBAAsB,wBAAA;QACtB,0BAA0B,4BAAA;KAC3B,CAAA;AAEH,CAAC;AAED,MAAM,8BAAoC,GAAuB;;;;;wBAC7C,qBAAM,aAAa,CAAC,GAAG,EAAE,kBAAkB,CAAC,EAAA;;oBAAxD,SAAS,GAAG,SAA4C;oBAExD,KAGF,iBAAiB,CAAC,SAAS,CAAC,EAF9B,sBAAsB,4BAAA,EACtB,0BAA0B,gCAAA,CACI;oBAE1B,WAAW,GAAG,sBAAsB,CAAC,aAAa,CAAC,CAAA;oBACnD,QAAQ,GAAG,0BAA0B,CAAC,UAAU,CAAC,CAAA;oBACjD,QAAQ,GAAG,0BAA0B,CAAC,UAAU,CAAC,CAAA;oBACjD,QAAQ,GAAG,0BAA0B,CAAC,UAAU,CAAC,CAAA;oBAEjD,WAAW,GAAG,0BAA0B,CAAC,aAAa,CAAC,CAAA;oBACvD,QAAQ,GAAG,0BAA0B,CAAC,UAAU,CAAC,CAAA;oBACjD,QAAQ,GAAG,0BAA0B,CAAC,UAAU,CAAC,CAAA;oBACjD,QAAQ,GAAG,0BAA0B,CAAC,UAAU,CAAC,CAAA;oBAEjD,YAAY,GAAG,0BAA0B,CAAC,cAAc,CAAC,CAAA;oBACzD,SAAS,GAAG,0BAA0B,CAAC,WAAW,CAAC,CAAA;oBACnD,SAAS,GAAG,0BAA0B,CAAC,WAAW,CAAC,CAAA;oBAEnD,YAAY,GAAG,0BAA0B,CAAC,cAAc,CAAC,CAAA;oBACzD,SAAS,GAAG,0BAA0B,CAAC,WAAW,CAAC,CAAA;oBACnD,SAAS,GAAG,0BAA0B,CAAC,WAAW,CAAC,CAAA;oBACnD,gBAAgB,GAAG,0BAA0B,CAAC,kBAAkB,CAAC,CAAA;oBAEjE,EAAE,GAAG,SAAS,CAAC,IAAI,CAAC,CAAA;oBAE1B,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC,EAAE;wBACnB,MAAM,IAAI,KAAK,CAAC,2DAAyD,EAAI,CAAC,CAAA;qBAC/E;oBAED,sBAAO;4BACL,WAAW,aAAA;4BACX,QAAQ,UAAA;4BACR,QAAQ,UAAA;4BACR,QAAQ,UAAA;4BACR,WAAW,aAAA;4BACX,QAAQ,UAAA;4BACR,QAAQ,UAAA;4BACR,QAAQ,UAAA;4BACR,YAAY,cAAA;4BACZ,SAAS,WAAA;4BACT,SAAS,WAAA;4BACT,YAAY,cAAA;4BACZ,SAAS,WAAA;4BACT,SAAS,WAAA;4BACT,gBAAgB,kBAAA;4BAChB,EAAE,IAAA;yBACH,EAAA;;;;CACF"} \ No newline at end of file diff --git a/dist/faceRecognitionNet/residualLayer.d.ts b/dist/faceRecognitionNet/residualLayer.d.ts index 8f20654c..1656e0a0 100644 --- a/dist/faceRecognitionNet/residualLayer.d.ts +++ b/dist/faceRecognitionNet/residualLayer.d.ts @@ -1,4 +1,4 @@ import * as tf from '@tensorflow/tfjs-core'; -import { FaceRecognitionNet } from './types'; -export declare function residual(x: tf.Tensor4D, params: FaceRecognitionNet.ResidualLayerParams): tf.Tensor4D; -export declare function residualDown(x: tf.Tensor4D, params: FaceRecognitionNet.ResidualLayerParams): tf.Tensor4D; +import { ResidualLayerParams } from './types'; +export declare function residual(x: tf.Tensor4D, params: ResidualLayerParams): tf.Tensor4D; +export declare function residualDown(x: tf.Tensor4D, params: ResidualLayerParams): tf.Tensor4D; diff --git a/dist/faceRecognitionNet/residualLayer.js.map b/dist/faceRecognitionNet/residualLayer.js.map index 15e8060d..c3c5e383 100644 --- a/dist/faceRecognitionNet/residualLayer.js.map +++ b/dist/faceRecognitionNet/residualLayer.js.map @@ -1 +1 @@ -{"version":3,"file":"residualLayer.js","sourceRoot":"","sources":["../../src/faceRecognitionNet/residualLayer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,uBAAuB,CAAC;AAE5C,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAGzD,MAAM,mBAAmB,CAAc,EAAE,MAA8C;IACrF,IAAI,GAAG,GAAG,IAAI,CAAC,CAAC,EAAE,MAAM,CAAC,KAAK,CAAC,CAAA;IAC/B,GAAG,GAAG,UAAU,CAAC,GAAG,EAAE,MAAM,CAAC,KAAK,CAAC,CAAA;IACnC,GAAG,GAAG,EAAE,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,CAAC,CAAA;IACpB,GAAG,GAAG,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;IAClB,OAAO,GAAG,CAAA;AACZ,CAAC;AAED,MAAM,uBAAuB,CAAc,EAAE,MAA8C;IACzF,IAAI,GAAG,GAAG,QAAQ,CAAC,CAAC,EAAE,MAAM,CAAC,KAAK,CAAC,CAAA;IACnC,GAAG,GAAG,UAAU,CAAC,GAAG,EAAE,MAAM,CAAC,KAAK,CAAC,CAAA;IAEnC,IAAI,MAAM,GAAG,EAAE,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,OAAO,CAAgB,CAAA;IACxD,IAAM,KAAK,GAAG,EAAE,CAAC,KAAK,CAAa,MAAM,CAAC,KAAK,CAAC,CAAA;IAChD,IAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAA;IAC9C,IAAM,aAAa,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAA;IAE1F,IAAI,aAAa,EAAE;QACjB,IAAM,SAAS,GAAO,GAAG,CAAC,KAAK,QAAqC,CAAA;QACpE,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,CAAA;QAChB,IAAM,MAAM,GAAG,EAAE,CAAC,KAAK,CAAa,SAAS,CAAC,CAAA;QAC9C,GAAG,GAAG,EAAE,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,MAAM,CAAC,EAAE,CAAC,CAAC,CAAA;QAEjC,IAAM,SAAS,GAAO,GAAG,CAAC,KAAK,QAAqC,CAAA;QACpE,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,CAAA;QAChB,IAAM,MAAM,GAAG,EAAE,CAAC,KAAK,CAAa,SAAS,CAAC,CAAA;QAC9C,GAAG,GAAG,EAAE,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,MAAM,CAAC,EAAE,CAAC,CAAC,CAAA;KAClC;IAED,MAAM,GAAG,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,MAAM,EAAE,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAA;IACvD,GAAG,GAAG,EAAE,CAAC,GAAG,CAAC,MAAM,EAAE,GAAG,CAAgB,CAAA;IAExC,GAAG,GAAG,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;IAClB,OAAO,GAAG,CAAA;AACZ,CAAC"} \ No newline at end of file +{"version":3,"file":"residualLayer.js","sourceRoot":"","sources":["../../src/faceRecognitionNet/residualLayer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,uBAAuB,CAAC;AAE5C,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAGzD,MAAM,mBAAmB,CAAc,EAAE,MAA2B;IAClE,IAAI,GAAG,GAAG,IAAI,CAAC,CAAC,EAAE,MAAM,CAAC,KAAK,CAAC,CAAA;IAC/B,GAAG,GAAG,UAAU,CAAC,GAAG,EAAE,MAAM,CAAC,KAAK,CAAC,CAAA;IACnC,GAAG,GAAG,EAAE,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,CAAC,CAAA;IACpB,GAAG,GAAG,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;IAClB,OAAO,GAAG,CAAA;AACZ,CAAC;AAED,MAAM,uBAAuB,CAAc,EAAE,MAA2B;IACtE,IAAI,GAAG,GAAG,QAAQ,CAAC,CAAC,EAAE,MAAM,CAAC,KAAK,CAAC,CAAA;IACnC,GAAG,GAAG,UAAU,CAAC,GAAG,EAAE,MAAM,CAAC,KAAK,CAAC,CAAA;IAEnC,IAAI,MAAM,GAAG,EAAE,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,OAAO,CAAgB,CAAA;IACxD,IAAM,KAAK,GAAG,EAAE,CAAC,KAAK,CAAa,MAAM,CAAC,KAAK,CAAC,CAAA;IAChD,IAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAA;IAC9C,IAAM,aAAa,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAA;IAE1F,IAAI,aAAa,EAAE;QACjB,IAAM,SAAS,GAAO,GAAG,CAAC,KAAK,QAAqC,CAAA;QACpE,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,CAAA;QAChB,IAAM,MAAM,GAAG,EAAE,CAAC,KAAK,CAAa,SAAS,CAAC,CAAA;QAC9C,GAAG,GAAG,EAAE,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,MAAM,CAAC,EAAE,CAAC,CAAC,CAAA;QAEjC,IAAM,SAAS,GAAO,GAAG,CAAC,KAAK,QAAqC,CAAA;QACpE,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,CAAA;QAChB,IAAM,MAAM,GAAG,EAAE,CAAC,KAAK,CAAa,SAAS,CAAC,CAAA;QAC9C,GAAG,GAAG,EAAE,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,MAAM,CAAC,EAAE,CAAC,CAAC,CAAA;KAClC;IAED,MAAM,GAAG,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,MAAM,EAAE,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAA;IACvD,GAAG,GAAG,EAAE,CAAC,GAAG,CAAC,MAAM,EAAE,GAAG,CAAgB,CAAA;IAExC,GAAG,GAAG,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;IAClB,OAAO,GAAG,CAAA;AACZ,CAAC"} \ No newline at end of file diff --git a/dist/faceRecognitionNet/scaleLayer.d.ts b/dist/faceRecognitionNet/scaleLayer.d.ts index c2388465..07a866ea 100644 --- a/dist/faceRecognitionNet/scaleLayer.d.ts +++ b/dist/faceRecognitionNet/scaleLayer.d.ts @@ -1,3 +1,3 @@ import * as tf from '@tensorflow/tfjs-core'; -import { FaceRecognitionNet } from './types'; -export declare function scale(x: tf.Tensor4D, params: FaceRecognitionNet.ScaleLayerParams): tf.Tensor4D; +import { ScaleLayerParams } from './types'; +export declare function scale(x: tf.Tensor4D, params: ScaleLayerParams): tf.Tensor4D; diff --git a/dist/faceRecognitionNet/scaleLayer.js.map b/dist/faceRecognitionNet/scaleLayer.js.map index 0fb5b158..50560a5c 100644 --- a/dist/faceRecognitionNet/scaleLayer.js.map +++ b/dist/faceRecognitionNet/scaleLayer.js.map @@ -1 +1 @@ -{"version":3,"file":"scaleLayer.js","sourceRoot":"","sources":["../../src/faceRecognitionNet/scaleLayer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,uBAAuB,CAAC;AAG5C,MAAM,gBAAgB,CAAc,EAAE,MAA2C;IAC/E,OAAO,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,CAAC,CAAA;AACzD,CAAC"} \ No newline at end of file +{"version":3,"file":"scaleLayer.js","sourceRoot":"","sources":["../../src/faceRecognitionNet/scaleLayer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,uBAAuB,CAAC;AAI5C,MAAM,gBAAgB,CAAc,EAAE,MAAwB;IAC5D,OAAO,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,CAAC,CAAA;AACzD,CAAC"} \ No newline at end of file diff --git a/dist/faceRecognitionNet/types.d.ts b/dist/faceRecognitionNet/types.d.ts index 8134e679..f09e93eb 100644 --- a/dist/faceRecognitionNet/types.d.ts +++ b/dist/faceRecognitionNet/types.d.ts @@ -1,34 +1,32 @@ import * as tf from '@tensorflow/tfjs-core'; import { ConvParams } from '../commons/types'; -export declare namespace FaceRecognitionNet { - type ScaleLayerParams = { - weights: tf.Tensor1D; - biases: tf.Tensor1D; - }; - type ResidualLayerParams = { - conv1: ConvLayerParams; - conv2: ConvLayerParams; - }; - type ConvLayerParams = { - conv: ConvParams; - scale: ScaleLayerParams; - }; - type NetParams = { - conv32_down: ConvLayerParams; - conv32_1: ResidualLayerParams; - conv32_2: ResidualLayerParams; - conv32_3: ResidualLayerParams; - conv64_down: ResidualLayerParams; - conv64_1: ResidualLayerParams; - conv64_2: ResidualLayerParams; - conv64_3: ResidualLayerParams; - conv128_down: ResidualLayerParams; - conv128_1: ResidualLayerParams; - conv128_2: ResidualLayerParams; - conv256_down: ResidualLayerParams; - conv256_1: ResidualLayerParams; - conv256_2: ResidualLayerParams; - conv256_down_out: ResidualLayerParams; - fc: tf.Tensor2D; - }; -} +export declare type ScaleLayerParams = { + weights: tf.Tensor1D; + biases: tf.Tensor1D; +}; +export declare type ResidualLayerParams = { + conv1: ConvLayerParams; + conv2: ConvLayerParams; +}; +export declare type ConvLayerParams = { + conv: ConvParams; + scale: ScaleLayerParams; +}; +export declare type NetParams = { + conv32_down: ConvLayerParams; + conv32_1: ResidualLayerParams; + conv32_2: ResidualLayerParams; + conv32_3: ResidualLayerParams; + conv64_down: ResidualLayerParams; + conv64_1: ResidualLayerParams; + conv64_2: ResidualLayerParams; + conv64_3: ResidualLayerParams; + conv128_down: ResidualLayerParams; + conv128_1: ResidualLayerParams; + conv128_2: ResidualLayerParams; + conv256_down: ResidualLayerParams; + conv256_1: ResidualLayerParams; + conv256_2: ResidualLayerParams; + conv256_down_out: ResidualLayerParams; + fc: tf.Tensor2D; +}; diff --git a/dist/index.d.ts b/dist/index.d.ts index eab65646..289ea045 100644 --- a/dist/index.d.ts +++ b/dist/index.d.ts @@ -1,11 +1,11 @@ import * as tf from '@tensorflow/tfjs-core'; import { euclideanDistance } from './euclideanDistance'; -import { faceDetectionNet } from './faceDetectionNet'; -import { faceLandmarkNet } from './faceLandmarkNet'; -import { faceRecognitionNet } from './faceRecognitionNet'; import { NetInput } from './NetInput'; import { padToSquare } from './padToSquare'; -export { euclideanDistance, faceDetectionNet, faceLandmarkNet, faceRecognitionNet, NetInput, tf, padToSquare }; +export { euclideanDistance, NetInput, tf, padToSquare }; export * from './extractFaces'; export * from './extractFaceTensors'; +export * from './faceDetectionNet'; +export * from './faceLandmarkNet'; +export * from './faceRecognitionNet'; export * from './utils'; diff --git a/dist/index.js b/dist/index.js index 2435b87c..0809014d 100644 --- a/dist/index.js +++ b/dist/index.js @@ -1,12 +1,12 @@ import * as tf from '@tensorflow/tfjs-core'; import { euclideanDistance } from './euclideanDistance'; -import { faceDetectionNet } from './faceDetectionNet'; -import { faceLandmarkNet } from './faceLandmarkNet'; -import { faceRecognitionNet } from './faceRecognitionNet'; import { NetInput } from './NetInput'; import { padToSquare } from './padToSquare'; -export { euclideanDistance, faceDetectionNet, faceLandmarkNet, faceRecognitionNet, NetInput, tf, padToSquare }; +export { euclideanDistance, NetInput, tf, padToSquare }; export * from './extractFaces'; export * from './extractFaceTensors'; +export * from './faceDetectionNet'; +export * from './faceLandmarkNet'; +export * from './faceRecognitionNet'; export * from './utils'; //# sourceMappingURL=index.js.map \ No newline at end of file diff --git a/dist/index.js.map b/dist/index.js.map index 413e922e..3795e297 100644 --- a/dist/index.js.map +++ b/dist/index.js.map @@ -1 +1 @@ -{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,uBAAuB,CAAC;AAE5C,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAC1D,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACtC,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAE5C,OAAO,EACL,iBAAiB,EACjB,gBAAgB,EAChB,eAAe,EACf,kBAAkB,EAClB,QAAQ,EACR,EAAE,EACF,WAAW,EACZ,CAAA;AAED,cAAc,gBAAgB,CAAA;AAC9B,cAAc,sBAAsB,CAAA;AACpC,cAAc,SAAS,CAAA"} \ No newline at end of file +{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,uBAAuB,CAAC;AAE5C,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACtC,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAE5C,OAAO,EACL,iBAAiB,EACjB,QAAQ,EACR,EAAE,EACF,WAAW,EACZ,CAAA;AAED,cAAc,gBAAgB,CAAA;AAC9B,cAAc,sBAAsB,CAAA;AACpC,cAAc,oBAAoB,CAAC;AACnC,cAAc,mBAAmB,CAAC;AAClC,cAAc,sBAAsB,CAAC;AACrC,cAAc,SAAS,CAAA"} \ No newline at end of file diff --git a/examples/package-lock.json b/examples/package-lock.json index 29881306..5b8e2a28 100644 --- a/examples/package-lock.json +++ b/examples/package-lock.json @@ -16,15 +16,6 @@ "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=" }, - "axios": { - "version": "0.18.0", - "resolved": "https://registry.npmjs.org/axios/-/axios-0.18.0.tgz", - "integrity": "sha1-MtU+SFHv3AoRmTts0AB4nXDAUQI=", - "requires": { - "follow-redirects": "1.4.1", - "is-buffer": "1.1.6" - } - }, "body-parser": { "version": "1.18.2", "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.18.2.tgz", @@ -156,24 +147,6 @@ "unpipe": "1.0.0" } }, - "follow-redirects": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.4.1.tgz", - "integrity": "sha512-uxYePVPogtya1ktGnAAXOacnbIuRMB4dkvqeNz2qTtTQsuzSfbDolV+wMMKxAmCx0bLgAKLbBOkjItMbbkR1vg==", - "requires": { - "debug": "3.1.0" - }, - "dependencies": { - "debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", - "requires": { - "ms": "2.0.0" - } - } - } - }, "forwarded": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz", @@ -210,11 +183,6 @@ "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.6.0.tgz", "integrity": "sha1-4/o1e3c9phnybpXwSdBVxyeW+Gs=" }, - "is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==" - }, "media-typer": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", diff --git a/examples/package.json b/examples/package.json index 66a0ab18..2639d0f2 100644 --- a/examples/package.json +++ b/examples/package.json @@ -5,7 +5,6 @@ "author": "justadudewhohacks", "license": "MIT", "dependencies": { - "axios": "^0.18.0", "express": "^4.16.3" } } diff --git a/examples/public/commons.js b/examples/public/commons.js index cd1c64cd..4955af3e 100644 --- a/examples/public/commons.js +++ b/examples/public/commons.js @@ -9,25 +9,7 @@ function getFaceImageUri(className, idx) { } async function fetchImage(uri) { - return (await axios.get(uri, { responseType: 'blob' })).data -} - -async function initFaceDetectionNet() { - const res = await axios.get('face_detection_model.weights', { responseType: 'arraybuffer' }) - const weights = new Float32Array(res.data) - return faceapi.faceDetectionNet(weights) -} - -async function initFaceRecognitionNet() { - const res = await axios.get('face_recognition_model.weights', { responseType: 'arraybuffer' }) - const weights = new Float32Array(res.data) - return faceapi.faceRecognitionNet(weights) -} - -async function initFaceLandmarkNet() { - const res = await axios.get('face_landmark_68_model.weights', { responseType: 'arraybuffer' }) - const weights = new Float32Array(res.data) - return faceapi.faceLandmarkNet(weights) + return (await fetch(uri)).blob() } // fetch first image of each class and compute their descriptors @@ -111,17 +93,42 @@ function renderNavBar(navbarId, exampleUri) { ] const navbar = $(navbarId).get(0) - navbar.classList.add('row') + const pageContainer = $('.page-container').get(0) + + const header = document.createElement('h3') + header.innerHTML = examples.find(ex => ex.uri === exampleUri).name + pageContainer.insertBefore(header, pageContainer.children[0]) + + const menuContent = document.createElement('ul') + menuContent.id = 'slide-out' + menuContent.classList.add('side-nav', 'fixed') + navbar.appendChild(menuContent) + + const menuButton = document.createElement('a') + menuButton.href='#' + menuButton.classList.add('button-collapse', 'show-on-large') + menuButton.setAttribute('data-activates', 'slide-out') + const menuButtonIcon = document.createElement('img') + menuButtonIcon.src = 'menu_icon.png' + menuButton.appendChild(menuButtonIcon) + navbar.appendChild(menuButton) + examples .filter(ex => ex.uri !== exampleUri) .forEach(ex => { + const li = document.createElement('li') const a = document.createElement('a') - navbar.appendChild(a) + li.appendChild(a) + menuContent.appendChild(li) - a.classList.add('waves-effect', 'waves-light', 'btn', 'margin-sm') + a.classList.add('waves-effect', 'waves-light') a.href = ex.uri a.innerHTML = ex.name }) + + $('.button-collapse').sideNav({ + menuWidth: 250 + }) } function renderSelectList(selectListId, onChange, initialValue, renderChildren) { diff --git a/examples/public/menu_icon.png b/examples/public/menu_icon.png new file mode 100644 index 00000000..8b5e0b9a Binary files /dev/null and b/examples/public/menu_icon.png differ diff --git a/examples/public/styles.css b/examples/public/styles.css index 35127454..82661710 100644 --- a/examples/public/styles.css +++ b/examples/public/styles.css @@ -3,6 +3,21 @@ right: 0; margin: auto; margin-top: 20px; + padding-left: 300px; + display: inline-flex !important; +} + +@media only screen and (max-width : 992px) { + .page-container { + padding-left: 0; + display: flex !important; + } +} + +#navbar { + position: absolute; + top: 20px; + left: 20px; } .center-content { diff --git a/examples/views/detectAndDrawFaces.html b/examples/views/detectAndDrawFaces.html index 0721507c..cbffa651 100644 --- a/examples/views/detectAndDrawFaces.html +++ b/examples/views/detectAndDrawFaces.html @@ -2,7 +2,6 @@ - @@ -10,8 +9,8 @@ +
-
@@ -80,7 +79,8 @@ } async function run() { - net = await initFaceDetectionNet() + net = new faceapi.FaceDetectionNet() + await net.load('/') $('#loader').hide() onSelectionChanged($('#selectList select').val()) } diff --git a/examples/views/detectAndDrawLandmarks.html b/examples/views/detectAndDrawLandmarks.html index a55ac1bc..8edda4f4 100644 --- a/examples/views/detectAndDrawLandmarks.html +++ b/examples/views/detectAndDrawLandmarks.html @@ -2,7 +2,6 @@ - @@ -10,8 +9,8 @@ +
-
@@ -89,8 +88,10 @@ } async function run() { - detectionNet = await initFaceDetectionNet() - landmarkNet = await initFaceLandmarkNet() + detectionNet = new faceapi.FaceDetectionNet() + await detectionNet.load('/') + landmarkNet = new faceapi.FaceLandmarkNet() + await landmarkNet.load('/') $('#loader').hide() onSelectionChanged($('#selectList select').val()) } diff --git a/examples/views/detectAndRecognizeFaces.html b/examples/views/detectAndRecognizeFaces.html index a26a7136..01c56993 100644 --- a/examples/views/detectAndRecognizeFaces.html +++ b/examples/views/detectAndRecognizeFaces.html @@ -2,7 +2,6 @@ - @@ -10,8 +9,8 @@ +
-
@@ -143,9 +142,12 @@ } async function run() { - detectionNet = await initFaceDetectionNet() - recognitionNet = await initFaceRecognitionNet() - landmarkNet = await initFaceLandmarkNet() + detectionNet = new faceapi.FaceDetectionNet() + await detectionNet.load('/') + landmarkNet = new faceapi.FaceLandmarkNet() + await landmarkNet.load('/') + recognitionNet = new faceapi.FaceRecognitionNet() + await recognitionNet.load('/') trainDescriptorsByClass = await initTrainDescriptorsByClass(recognitionNet, 1) $('#loader').hide() onSelectionChanged($('#selectList select').val()) diff --git a/examples/views/faceAlignment.html b/examples/views/faceAlignment.html index 6dc8a964..0493ac64 100644 --- a/examples/views/faceAlignment.html +++ b/examples/views/faceAlignment.html @@ -2,7 +2,6 @@ - @@ -10,8 +9,8 @@ +
-
@@ -93,8 +92,10 @@ } async function run() { - detectionNet = await initFaceDetectionNet() - landmarkNet = await initFaceLandmarkNet() + detectionNet = new faceapi.FaceDetectionNet() + await detectionNet.load('/') + landmarkNet = new faceapi.FaceLandmarkNet() + await landmarkNet.load('/') $('#loader').hide() onSelectionChanged($('#selectList select').val()) } diff --git a/examples/views/faceDetection.html b/examples/views/faceDetection.html index a448f6f7..9d1af465 100644 --- a/examples/views/faceDetection.html +++ b/examples/views/faceDetection.html @@ -2,7 +2,6 @@ - @@ -10,8 +9,8 @@ +
-
@@ -75,7 +74,8 @@ } async function run() { - net = await initFaceDetectionNet() + net = new faceapi.FaceDetectionNet() + await net.load('/') $('#loader').hide() onSelectionChanged($('#selectList select').val()) } diff --git a/examples/views/faceDetectionVideo.html b/examples/views/faceDetectionVideo.html index f2cb3bef..9c5f4e61 100644 --- a/examples/views/faceDetectionVideo.html +++ b/examples/views/faceDetectionVideo.html @@ -2,7 +2,6 @@ - @@ -10,8 +9,8 @@ +
-
@@ -87,7 +86,8 @@ } async function run() { - net = await initFaceDetectionNet() + net = new faceapi.FaceDetectionNet() + await net.load('/') $('#loader').hide() } diff --git a/examples/views/faceLandmarks.html b/examples/views/faceLandmarks.html index 6f222eee..f8e0916f 100644 --- a/examples/views/faceLandmarks.html +++ b/examples/views/faceLandmarks.html @@ -2,7 +2,6 @@ - @@ -10,9 +9,8 @@ +
- -
@@ -56,7 +54,8 @@ } async function run() { - net = await initFaceLandmarkNet() + net = new faceapi.FaceLandmarkNet() + await net.load('/') $('#loader').hide() await onSelectionChanged($('#selectList select').val()) } diff --git a/examples/views/faceRecognition.html b/examples/views/faceRecognition.html index 97f9e67f..e90c90de 100644 --- a/examples/views/faceRecognition.html +++ b/examples/views/faceRecognition.html @@ -2,7 +2,6 @@ - @@ -10,9 +9,8 @@ +
- -
@@ -137,7 +135,9 @@ try { setStatusText('loading model file...') - net = await initFaceRecognitionNet() + net = new faceapi.FaceRecognitionNet() + await net.load('/') + setStatusText('computing initial descriptors...') trainDescriptorsByClass = await initTrainDescriptorsByClass(net) diff --git a/examples/views/faceSimilarity.html b/examples/views/faceSimilarity.html index 78358d90..4c1683db 100644 --- a/examples/views/faceSimilarity.html +++ b/examples/views/faceSimilarity.html @@ -2,7 +2,6 @@ - @@ -10,9 +9,8 @@ +
- -
@@ -62,7 +60,8 @@ } async function run() { - net = await initFaceRecognitionNet() + net = new faceapi.FaceRecognitionNet() + await net.load('/') $('#loader').hide() await onSelectionChanged(1, $('#selectList1 select').val()) await onSelectionChanged(2, $('#selectList2 select').val()) diff --git a/karma.conf.js b/karma.conf.js index aaf24b1c..1c3a2f67 100644 --- a/karma.conf.js +++ b/karma.conf.js @@ -2,7 +2,7 @@ const dataFiles = [ 'test/images/*.jpg', 'test/images/*.png', 'test/data/*.json', - 'weights/*.weights' + 'weights/**/*' ].map(pattern => ({ pattern, watched: false, diff --git a/package-lock.json b/package-lock.json index bc0bb7bf..47b3ae69 100644 --- a/package-lock.json +++ b/package-lock.json @@ -12,15 +12,6 @@ "seedrandom": "2.4.3" } }, - "@types/axios": { - "version": "0.14.0", - "resolved": "https://registry.npmjs.org/@types/axios/-/axios-0.14.0.tgz", - "integrity": "sha1-7CMA++fX3d1+udOr+HmZlkyvzkY=", - "dev": true, - "requires": { - "axios": "0.18.0" - } - }, "@types/estree": { "version": "0.0.39", "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.39.tgz", @@ -376,16 +367,6 @@ "dev": true, "optional": true }, - "axios": { - "version": "0.18.0", - "resolved": "https://registry.npmjs.org/axios/-/axios-0.18.0.tgz", - "integrity": "sha1-MtU+SFHv3AoRmTts0AB4nXDAUQI=", - "dev": true, - "requires": { - "follow-redirects": "1.5.0", - "is-buffer": "1.1.6" - } - }, "backo2": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/backo2/-/backo2-1.0.2.tgz", @@ -869,6 +850,7 @@ "anymatch": "2.0.0", "async-each": "1.0.1", "braces": "2.3.2", + "fsevents": "1.2.4", "glob-parent": "3.1.0", "inherits": "2.0.3", "is-binary-path": "1.0.1", @@ -2006,6 +1988,535 @@ "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", "dev": true }, + "fsevents": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.4.tgz", + "integrity": "sha512-z8H8/diyk76B7q5wg+Ud0+CqzcAF3mBBI/bA5ne5zrRUUIvNkJY//D3BqyH571KuAC4Nr7Rw7CjWX4r0y9DvNg==", + "dev": true, + "optional": true, + "requires": { + "nan": "2.10.0", + "node-pre-gyp": "0.10.0" + }, + "dependencies": { + "abbrev": { + "version": "1.1.1", + "bundled": true, + "dev": true, + "optional": true + }, + "ansi-regex": { + "version": "2.1.1", + "bundled": true, + "dev": true + }, + "aproba": { + "version": "1.2.0", + "bundled": true, + "dev": true, + "optional": true + }, + "are-we-there-yet": { + "version": "1.1.4", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "delegates": "1.0.0", + "readable-stream": "2.3.6" + } + }, + "balanced-match": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "brace-expansion": { + "version": "1.1.11", + "bundled": true, + "dev": true, + "requires": { + "balanced-match": "1.0.0", + "concat-map": "0.0.1" + } + }, + "chownr": { + "version": "1.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "code-point-at": { + "version": "1.1.0", + "bundled": true, + "dev": true + }, + "concat-map": { + "version": "0.0.1", + "bundled": true, + "dev": true + }, + "console-control-strings": { + "version": "1.1.0", + "bundled": true, + "dev": true + }, + "core-util-is": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "debug": { + "version": "2.6.9", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "ms": "2.0.0" + } + }, + "deep-extend": { + "version": "0.5.1", + "bundled": true, + "dev": true, + "optional": true + }, + "delegates": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "detect-libc": { + "version": "1.0.3", + "bundled": true, + "dev": true, + "optional": true + }, + "fs-minipass": { + "version": "1.2.5", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "minipass": "2.2.4" + } + }, + "fs.realpath": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "gauge": { + "version": "2.7.4", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "aproba": "1.2.0", + "console-control-strings": "1.1.0", + "has-unicode": "2.0.1", + "object-assign": "4.1.1", + "signal-exit": "3.0.2", + "string-width": "1.0.2", + "strip-ansi": "3.0.1", + "wide-align": "1.1.2" + } + }, + "glob": { + "version": "7.1.2", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "fs.realpath": "1.0.0", + "inflight": "1.0.6", + "inherits": "2.0.3", + "minimatch": "3.0.4", + "once": "1.4.0", + "path-is-absolute": "1.0.1" + } + }, + "has-unicode": { + "version": "2.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "iconv-lite": { + "version": "0.4.21", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "safer-buffer": "2.1.2" + } + }, + "ignore-walk": { + "version": "3.0.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "minimatch": "3.0.4" + } + }, + "inflight": { + "version": "1.0.6", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "once": "1.4.0", + "wrappy": "1.0.2" + } + }, + "inherits": { + "version": "2.0.3", + "bundled": true, + "dev": true + }, + "ini": { + "version": "1.3.5", + "bundled": true, + "dev": true, + "optional": true + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "requires": { + "number-is-nan": "1.0.1" + } + }, + "isarray": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "minimatch": { + "version": "3.0.4", + "bundled": true, + "dev": true, + "requires": { + "brace-expansion": "1.1.11" + } + }, + "minimist": { + "version": "0.0.8", + "bundled": true, + "dev": true + }, + "minipass": { + "version": "2.2.4", + "bundled": true, + "dev": true, + "requires": { + "safe-buffer": "5.1.1", + "yallist": "3.0.2" + } + }, + "minizlib": { + "version": "1.1.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "minipass": "2.2.4" + } + }, + "mkdirp": { + "version": "0.5.1", + "bundled": true, + "dev": true, + "requires": { + "minimist": "0.0.8" + } + }, + "ms": { + "version": "2.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "needle": { + "version": "2.2.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "debug": "2.6.9", + "iconv-lite": "0.4.21", + "sax": "1.2.4" + } + }, + "node-pre-gyp": { + "version": "0.10.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "detect-libc": "1.0.3", + "mkdirp": "0.5.1", + "needle": "2.2.0", + "nopt": "4.0.1", + "npm-packlist": "1.1.10", + "npmlog": "4.1.2", + "rc": "1.2.7", + "rimraf": "2.6.2", + "semver": "5.5.0", + "tar": "4.4.1" + } + }, + "nopt": { + "version": "4.0.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "abbrev": "1.1.1", + "osenv": "0.1.5" + } + }, + "npm-bundled": { + "version": "1.0.3", + "bundled": true, + "dev": true, + "optional": true + }, + "npm-packlist": { + "version": "1.1.10", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "ignore-walk": "3.0.1", + "npm-bundled": "1.0.3" + } + }, + "npmlog": { + "version": "4.1.2", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "are-we-there-yet": "1.1.4", + "console-control-strings": "1.1.0", + "gauge": "2.7.4", + "set-blocking": "2.0.0" + } + }, + "number-is-nan": { + "version": "1.0.1", + "bundled": true, + "dev": true + }, + "object-assign": { + "version": "4.1.1", + "bundled": true, + "dev": true, + "optional": true + }, + "once": { + "version": "1.4.0", + "bundled": true, + "dev": true, + "requires": { + "wrappy": "1.0.2" + } + }, + "os-homedir": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "os-tmpdir": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "osenv": { + "version": "0.1.5", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "os-homedir": "1.0.2", + "os-tmpdir": "1.0.2" + } + }, + "path-is-absolute": { + "version": "1.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "process-nextick-args": { + "version": "2.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "rc": { + "version": "1.2.7", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "deep-extend": "0.5.1", + "ini": "1.3.5", + "minimist": "1.2.0", + "strip-json-comments": "2.0.1" + }, + "dependencies": { + "minimist": { + "version": "1.2.0", + "bundled": true, + "dev": true, + "optional": true + } + } + }, + "readable-stream": { + "version": "2.3.6", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "core-util-is": "1.0.2", + "inherits": "2.0.3", + "isarray": "1.0.0", + "process-nextick-args": "2.0.0", + "safe-buffer": "5.1.1", + "string_decoder": "1.1.1", + "util-deprecate": "1.0.2" + } + }, + "rimraf": { + "version": "2.6.2", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "glob": "7.1.2" + } + }, + "safe-buffer": { + "version": "5.1.1", + "bundled": true, + "dev": true + }, + "safer-buffer": { + "version": "2.1.2", + "bundled": true, + "dev": true, + "optional": true + }, + "sax": { + "version": "1.2.4", + "bundled": true, + "dev": true, + "optional": true + }, + "semver": { + "version": "5.5.0", + "bundled": true, + "dev": true, + "optional": true + }, + "set-blocking": { + "version": "2.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "signal-exit": { + "version": "3.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "string-width": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "requires": { + "code-point-at": "1.1.0", + "is-fullwidth-code-point": "1.0.0", + "strip-ansi": "3.0.1" + } + }, + "string_decoder": { + "version": "1.1.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "safe-buffer": "5.1.1" + } + }, + "strip-ansi": { + "version": "3.0.1", + "bundled": true, + "dev": true, + "requires": { + "ansi-regex": "2.1.1" + } + }, + "strip-json-comments": { + "version": "2.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "tar": { + "version": "4.4.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "chownr": "1.0.1", + "fs-minipass": "1.2.5", + "minipass": "2.2.4", + "minizlib": "1.1.0", + "mkdirp": "0.5.1", + "safe-buffer": "5.1.1", + "yallist": "3.0.2" + } + }, + "util-deprecate": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "wide-align": { + "version": "1.1.2", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "string-width": "1.0.2" + } + }, + "wrappy": { + "version": "1.0.2", + "bundled": true, + "dev": true + }, + "yallist": { + "version": "3.0.2", + "bundled": true, + "dev": true + } + } + }, "ftp": { "version": "0.3.10", "resolved": "https://registry.npmjs.org/ftp/-/ftp-0.3.10.tgz", @@ -3733,6 +4244,13 @@ "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", "dev": true }, + "nan": { + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.10.0.tgz", + "integrity": "sha512-bAdJv7fBLhWC+/Bls0Oza+mvTaNQtP+1RyhhhvD95pgUJz6XM5IzgmxOkItJ9tkoCiplvAnXI1tNmmUD/eScyA==", + "dev": true, + "optional": true + }, "nanomatch": { "version": "1.2.9", "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.9.tgz", diff --git a/package.json b/package.json index ab0a3555..299f6139 100644 --- a/package.json +++ b/package.json @@ -23,10 +23,8 @@ "@tensorflow/tfjs-core": "^0.11.0" }, "devDependencies": { - "@types/axios": "^0.14.0", "@types/jasmine": "^2.8.8", "@types/node": "^10.1.1", - "axios": "^0.18.0", "jasmine-core": "^3.1.0", "karma": "^2.0.3", "karma-chrome-launcher": "^2.2.0", diff --git a/src/commons/isTensor.ts b/src/commons/isTensor.ts new file mode 100644 index 00000000..be9c5dc5 --- /dev/null +++ b/src/commons/isTensor.ts @@ -0,0 +1,21 @@ +import * as tf from '@tensorflow/tfjs-core'; + +export function isTensor(tensor: tf.Tensor, dim: number) { + return tensor instanceof tf.Tensor && tensor.shape.length === dim +} + +export function isTensor1D(tensor: tf.Tensor) { + return isTensor(tensor, 1) +} + +export function isTensor2D(tensor: tf.Tensor) { + return isTensor(tensor, 2) +} + +export function isTensor3D(tensor: tf.Tensor) { + return isTensor(tensor, 3) +} + +export function isTensor4D(tensor: tf.Tensor) { + return isTensor(tensor, 4) +} \ No newline at end of file diff --git a/src/commons/loadWeightMap.ts b/src/commons/loadWeightMap.ts new file mode 100644 index 00000000..81ff9ebe --- /dev/null +++ b/src/commons/loadWeightMap.ts @@ -0,0 +1,34 @@ +import * as tf from '@tensorflow/tfjs-core'; + +export function getModelUris(uri: string | undefined, defaultModelName: string) { + const parts = (uri || '').split('/') + + const modelBaseUri = ( + (uri || '').endsWith('.json') + ? parts.slice(0, parts.length - 1) + : parts + ).filter(s => s).join('/') + + const defaultManifestFilename = `${defaultModelName}-weights_manifest.json` + const manifestUri = !uri || !modelBaseUri + ? defaultManifestFilename + : ( + uri.endsWith('.json') + ? uri + : `${modelBaseUri}/${defaultManifestFilename}` + ) + + return { manifestUri, modelBaseUri } +} + +export async function loadWeightMap( + uri: string | undefined, + defaultModelName: string +): Promise { + + const { manifestUri, modelBaseUri } = getModelUris(uri, defaultModelName) + + const manifest = await (await fetch(manifestUri)).json() + + return tf.io.loadWeights(manifest, modelBaseUri) +} \ No newline at end of file diff --git a/src/faceDetectionNet/FaceDetectionNet.ts b/src/faceDetectionNet/FaceDetectionNet.ts new file mode 100644 index 00000000..62c30e7c --- /dev/null +++ b/src/faceDetectionNet/FaceDetectionNet.ts @@ -0,0 +1,135 @@ +import * as tf from '@tensorflow/tfjs-core'; + +import { getImageTensor } from '../getImageTensor'; +import { NetInput } from '../NetInput'; +import { padToSquare } from '../padToSquare'; +import { Rect } from '../Rect'; +import { Dimensions, TNetInput } from '../types'; +import { extractParams } from './extractParams'; +import { FaceDetection } from './FaceDetection'; +import { loadQuantizedParams } from './loadQuantizedParams'; +import { mobileNetV1 } from './mobileNetV1'; +import { nonMaxSuppression } from './nonMaxSuppression'; +import { outputLayer } from './outputLayer'; +import { predictionLayer } from './predictionLayer'; +import { resizeLayer } from './resizeLayer'; +import { NetParams } from './types'; + +export class FaceDetectionNet { + + private _params: NetParams + + public async load(weightsOrUrl?: Float32Array | string): Promise { + if (weightsOrUrl instanceof Float32Array) { + this.extractWeights(weightsOrUrl) + return + } + + if (weightsOrUrl && typeof weightsOrUrl !== 'string') { + throw new Error('FaceDetectionNet.load - expected model uri, or weights as Float32Array') + } + this._params = await loadQuantizedParams(weightsOrUrl) + } + + public extractWeights(weights: Float32Array) { + this._params = extractParams(weights) + } + + private forwardTensor(imgTensor: tf.Tensor4D) { + if (!this._params) { + throw new Error('FaceDetectionNet - load model before inference') + } + + return tf.tidy(() => { + + const resized = resizeLayer(imgTensor) as tf.Tensor4D + const features = mobileNetV1(resized, this._params.mobilenetv1_params) + + const { + boxPredictions, + classPredictions + } = predictionLayer(features.out, features.conv11, this._params.prediction_layer_params) + + return outputLayer(boxPredictions, classPredictions, this._params.output_layer_params) + }) + } + + public forward(input: tf.Tensor | NetInput | TNetInput) { + return tf.tidy( + () => this.forwardTensor(padToSquare(getImageTensor(input))) + ) + } + + public async locateFaces( + input: tf.Tensor | NetInput | TNetInput, + minConfidence: number = 0.8, + maxResults: number = 100, + ): Promise { + + let paddedHeightRelative = 1, paddedWidthRelative = 1 + let imageDimensions: Dimensions | undefined + + const { + boxes: _boxes, + scores: _scores + } = tf.tidy(() => { + + let imgTensor = getImageTensor(input) + const [height, width] = imgTensor.shape.slice(1) + imageDimensions = { width, height } + + imgTensor = padToSquare(imgTensor) + paddedHeightRelative = imgTensor.shape[1] / height + paddedWidthRelative = imgTensor.shape[2] / width + + return this.forwardTensor(imgTensor) + }) + + // TODO batches + const boxes = _boxes[0] + const scores = _scores[0] + for (let i = 1; i < _boxes.length; i++) { + _boxes[i].dispose() + _scores[i].dispose() + } + + // TODO find a better way to filter by minConfidence + const scoresData = Array.from(await scores.data()) + + const iouThreshold = 0.5 + const indices = nonMaxSuppression( + boxes, + scoresData, + maxResults, + iouThreshold, + minConfidence + ) + + const results = indices + .map(idx => { + const [top, bottom] = [ + Math.max(0, boxes.get(idx, 0)), + Math.min(1.0, boxes.get(idx, 2)) + ].map(val => val * paddedHeightRelative) + const [left, right] = [ + Math.max(0, boxes.get(idx, 1)), + Math.min(1.0, boxes.get(idx, 3)) + ].map(val => val * paddedWidthRelative) + return new FaceDetection( + scoresData[idx], + new Rect( + left, + top, + right - left, + bottom - top + ), + imageDimensions as Dimensions + ) + }) + + boxes.dispose() + scores.dispose() + + return results + } +} \ No newline at end of file diff --git a/src/faceDetectionNet/boxPredictionLayer.ts b/src/faceDetectionNet/boxPredictionLayer.ts index 7aa014b5..6383593a 100644 --- a/src/faceDetectionNet/boxPredictionLayer.ts +++ b/src/faceDetectionNet/boxPredictionLayer.ts @@ -1,12 +1,12 @@ import * as tf from '@tensorflow/tfjs-core'; import { convLayer } from '../commons/convLayer'; -import { FaceDetectionNet } from './types'; +import { BoxPredictionParams } from './types'; export function boxPredictionLayer( x: tf.Tensor4D, - params: FaceDetectionNet.BoxPredictionParams + params: BoxPredictionParams ) { return tf.tidy(() => { diff --git a/src/faceDetectionNet/extractParams.ts b/src/faceDetectionNet/extractParams.ts index a53e9c61..04f1037d 100644 --- a/src/faceDetectionNet/extractParams.ts +++ b/src/faceDetectionNet/extractParams.ts @@ -2,11 +2,11 @@ import * as tf from '@tensorflow/tfjs-core'; import { extractWeightsFactory } from '../commons/extractWeightsFactory'; import { ConvParams } from '../commons/types'; -import { FaceDetectionNet } from './types'; +import { MobileNetV1, NetParams, PointwiseConvParams, PredictionLayerParams } from './types'; function extractorsFactory(extractWeights: (numWeights: number) => Float32Array) { - function extractDepthwiseConvParams(numChannels: number): FaceDetectionNet.MobileNetV1.DepthwiseConvParams { + function extractDepthwiseConvParams(numChannels: number): MobileNetV1.DepthwiseConvParams { const filters = tf.tensor4d(extractWeights(3 * 3 * numChannels), [3, 3, numChannels, 1]) const batch_norm_scale = tf.tensor1d(extractWeights(numChannels)) const batch_norm_offset = tf.tensor1d(extractWeights(numChannels)) @@ -43,7 +43,7 @@ function extractorsFactory(extractWeights: (numWeights: number) => Float32Array) channelsIn: number, channelsOut: number, filterSize: number - ): FaceDetectionNet.PointwiseConvParams { + ): PointwiseConvParams { const { filters, bias @@ -55,7 +55,10 @@ function extractorsFactory(extractWeights: (numWeights: number) => Float32Array) } } - function extractConvPairParams(channelsIn: number, channelsOut: number): FaceDetectionNet.MobileNetV1.ConvPairParams { + function extractConvPairParams( + channelsIn: number, + channelsOut: number + ): MobileNetV1.ConvPairParams { const depthwise_conv_params = extractDepthwiseConvParams(channelsIn) const pointwise_conv_params = extractPointwiseConvParams(channelsIn, channelsOut, 1) @@ -65,7 +68,7 @@ function extractorsFactory(extractWeights: (numWeights: number) => Float32Array) } } - function extractMobilenetV1Params(): FaceDetectionNet.MobileNetV1.Params { + function extractMobilenetV1Params(): MobileNetV1.Params { const conv_0_params = extractPointwiseConvParams(3, 32, 3) @@ -96,7 +99,7 @@ function extractorsFactory(extractWeights: (numWeights: number) => Float32Array) } - function extractPredictionLayerParams(): FaceDetectionNet.PredictionLayerParams { + function extractPredictionLayerParams(): PredictionLayerParams { const conv_0_params = extractPointwiseConvParams(1024, 256, 1) const conv_1_params = extractPointwiseConvParams(256, 512, 3) const conv_2_params = extractPointwiseConvParams(512, 128, 1) @@ -170,7 +173,7 @@ function extractorsFactory(extractWeights: (numWeights: number) => Float32Array) } -export function extractParams(weights: Float32Array): FaceDetectionNet.NetParams { +export function extractParams(weights: Float32Array): NetParams { const { extractWeights, getRemainingWeights diff --git a/src/faceDetectionNet/index.ts b/src/faceDetectionNet/index.ts index a90ebf12..c42984aa 100644 --- a/src/faceDetectionNet/index.ts +++ b/src/faceDetectionNet/index.ts @@ -1,117 +1,9 @@ -import * as tf from '@tensorflow/tfjs-core'; +import { FaceDetectionNet } from './FaceDetectionNet'; -import { getImageTensor } from '../getImageTensor'; -import { NetInput } from '../NetInput'; -import { padToSquare } from '../padToSquare'; -import { TNetInput, Dimensions } from '../types'; -import { extractParams } from './extractParams'; -import { FaceDetection } from './FaceDetection'; -import { mobileNetV1 } from './mobileNetV1'; -import { nonMaxSuppression } from './nonMaxSuppression'; -import { outputLayer } from './outputLayer'; -import { predictionLayer } from './predictionLayer'; -import { resizeLayer } from './resizeLayer'; -import { Rect } from '../Rect'; +export * from './FaceDetectionNet'; export function faceDetectionNet(weights: Float32Array) { - const params = extractParams(weights) - - function forwardTensor(imgTensor: tf.Tensor4D) { - return tf.tidy(() => { - - const resized = resizeLayer(imgTensor) as tf.Tensor4D - const features = mobileNetV1(resized, params.mobilenetv1_params) - - const { - boxPredictions, - classPredictions - } = predictionLayer(features.out, features.conv11, params.prediction_layer_params) - - return outputLayer(boxPredictions, classPredictions, params.output_layer_params) - }) - } - - function forward(input: tf.Tensor | NetInput | TNetInput) { - return tf.tidy( - () => forwardTensor(padToSquare(getImageTensor(input))) - ) - } - - async function locateFaces( - input: tf.Tensor | NetInput | TNetInput, - minConfidence: number = 0.8, - maxResults: number = 100, - ): Promise { - - let paddedHeightRelative = 1, paddedWidthRelative = 1 - let imageDimensions: Dimensions | undefined - - const { - boxes: _boxes, - scores: _scores - } = tf.tidy(() => { - - let imgTensor = getImageTensor(input) - const [height, width] = imgTensor.shape.slice(1) - imageDimensions = { width, height } - - imgTensor = padToSquare(imgTensor) - paddedHeightRelative = imgTensor.shape[1] / height - paddedWidthRelative = imgTensor.shape[2] / width - - return forwardTensor(imgTensor) - }) - - // TODO batches - const boxes = _boxes[0] - const scores = _scores[0] - for (let i = 1; i < _boxes.length; i++) { - _boxes[i].dispose() - _scores[i].dispose() - } - - // TODO find a better way to filter by minConfidence - const scoresData = Array.from(await scores.data()) - - const iouThreshold = 0.5 - const indices = nonMaxSuppression( - boxes, - scoresData, - maxResults, - iouThreshold, - minConfidence - ) - - const results = indices - .map(idx => { - const [top, bottom] = [ - Math.max(0, boxes.get(idx, 0)), - Math.min(1.0, boxes.get(idx, 2)) - ].map(val => val * paddedHeightRelative) - const [left, right] = [ - Math.max(0, boxes.get(idx, 1)), - Math.min(1.0, boxes.get(idx, 3)) - ].map(val => val * paddedWidthRelative) - return new FaceDetection( - scoresData[idx], - new Rect( - left, - top, - right - left, - bottom - top - ), - imageDimensions as Dimensions - ) - }) - - boxes.dispose() - scores.dispose() - - return results - } - - return { - forward, - locateFaces - } + const net = new FaceDetectionNet() + net.extractWeights(weights) + return net } \ No newline at end of file diff --git a/src/faceDetectionNet/loadQuantizedParams.ts b/src/faceDetectionNet/loadQuantizedParams.ts new file mode 100644 index 00000000..e3359e67 --- /dev/null +++ b/src/faceDetectionNet/loadQuantizedParams.ts @@ -0,0 +1,147 @@ +import { isTensor1D, isTensor4D, isTensor3D } from '../commons/isTensor'; +import { loadWeightMap } from '../commons/loadWeightMap'; +import { BoxPredictionParams, MobileNetV1, PointwiseConvParams, PredictionLayerParams } from './types'; + +const DEFAULT_MODEL_NAME = 'face_detection_model' + +function extractorsFactory(weightMap: any) { + + function extractPointwiseConvParams(prefix: string, idx: number): PointwiseConvParams { + + const pointwise_conv_params = { + filters: weightMap[`${prefix}/Conv2d_${idx}_pointwise/weights`], + batch_norm_offset: weightMap[`${prefix}/Conv2d_${idx}_pointwise/convolution_bn_offset`] + } + + if (!isTensor4D(pointwise_conv_params.filters)) { + throw new Error(`expected weightMap[${prefix}/Conv2d_${idx}_pointwise/weights] to be a Tensor4D, instead have ${pointwise_conv_params.filters}`) + } + + if (!isTensor1D(pointwise_conv_params.batch_norm_offset)) { + throw new Error(`expected weightMap[${prefix}/Conv2d_${idx}_pointwise/convolution_bn_offset] to be a Tensor1D, instead have ${pointwise_conv_params.batch_norm_offset}`) + } + + return pointwise_conv_params + } + + function extractConvPairParams(idx: number): MobileNetV1.ConvPairParams { + + const depthwise_conv_params = { + filters: weightMap[`MobilenetV1/Conv2d_${idx}_depthwise/depthwise_weights`], + batch_norm_scale: weightMap[`MobilenetV1/Conv2d_${idx}_depthwise/BatchNorm/gamma`], + batch_norm_offset: weightMap[`MobilenetV1/Conv2d_${idx}_depthwise/BatchNorm/beta`], + batch_norm_mean: weightMap[`MobilenetV1/Conv2d_${idx}_depthwise/BatchNorm/moving_mean`], + batch_norm_variance: weightMap[`MobilenetV1/Conv2d_${idx}_depthwise/BatchNorm/moving_variance`], + } + + if (!isTensor4D(depthwise_conv_params.filters)) { + throw new Error(`expected weightMap[MobilenetV1/Conv2d_${idx}_depthwise/depthwise_weights] to be a Tensor4D, instead have ${depthwise_conv_params.filters}`) + } + + if (!isTensor1D(depthwise_conv_params.batch_norm_scale)) { + throw new Error(`expected weightMap[MobilenetV1/Conv2d_${idx}_depthwise/BatchNorm/gamma] to be a Tensor1D, instead have ${depthwise_conv_params.batch_norm_scale}`) + } + + if (!isTensor1D(depthwise_conv_params.batch_norm_offset)) { + throw new Error(`expected weightMap[MobilenetV1/Conv2d_${idx}_depthwise/BatchNorm/beta] to be a Tensor1D, instead have ${depthwise_conv_params.batch_norm_offset}`) + } + + if (!isTensor1D(depthwise_conv_params.batch_norm_mean)) { + throw new Error(`expected weightMap[MobilenetV1/Conv2d_${idx}_depthwise/BatchNorm/moving_mean] to be a Tensor1D, instead have ${depthwise_conv_params.batch_norm_mean}`) + } + + if (!isTensor1D(depthwise_conv_params.batch_norm_variance)) { + throw new Error(`expected weightMap[MobilenetV1/Conv2d_${idx}_depthwise/BatchNorm/moving_variance] to be a Tensor1D, instead have ${depthwise_conv_params.batch_norm_variance}`) + } + + return { + depthwise_conv_params, + pointwise_conv_params: extractPointwiseConvParams('MobilenetV1', idx) + } + } + + function extractMobilenetV1Params(): MobileNetV1.Params { + return { + conv_0_params: extractPointwiseConvParams('MobilenetV1', 0), + conv_pair_params: Array(13).fill(0).map((_, i) => extractConvPairParams(i + 1)) + } + } + + function extractBoxPredictorParams(idx: number): BoxPredictionParams { + + const params = { + box_encoding_predictor_params: { + filters: weightMap[`Prediction/BoxPredictor_${idx}/BoxEncodingPredictor/weights`], + bias: weightMap[`Prediction/BoxPredictor_${idx}/BoxEncodingPredictor/biases`] + }, + class_predictor_params: { + filters: weightMap[`Prediction/BoxPredictor_${idx}/ClassPredictor/weights`], + bias: weightMap[`Prediction/BoxPredictor_${idx}/ClassPredictor/biases`] + } + } + + if (!isTensor4D(params.box_encoding_predictor_params.filters)) { + throw new Error(`expected weightMap[Prediction/BoxPredictor_${idx}/BoxEncodingPredictor/weights] to be a Tensor4D, instead have ${params.box_encoding_predictor_params.filters}`) + } + + if (!isTensor1D(params.box_encoding_predictor_params.bias)) { + throw new Error(`expected weightMap[Prediction/BoxPredictor_${idx}/BoxEncodingPredictor/biases] to be a Tensor1D, instead have ${params.box_encoding_predictor_params.bias}`) + } + + if (!isTensor4D(params.class_predictor_params.filters)) { + throw new Error(`expected weightMap[Prediction/BoxPredictor_${idx}/ClassPredictor/weights] to be a Tensor4D, instead have ${params.class_predictor_params.filters}`) + } + + if (!isTensor1D(params.class_predictor_params.bias)) { + throw new Error(`expected weightMap[Prediction/BoxPredictor_${idx}/ClassPredictor/biases] to be a Tensor1D, instead have ${params.class_predictor_params.bias}`) + } + + return params + } + + function extractPredictionLayerParams(): PredictionLayerParams { + return { + conv_0_params: extractPointwiseConvParams('Prediction', 0), + conv_1_params: extractPointwiseConvParams('Prediction', 1), + conv_2_params: extractPointwiseConvParams('Prediction', 2), + conv_3_params: extractPointwiseConvParams('Prediction', 3), + conv_4_params: extractPointwiseConvParams('Prediction', 4), + conv_5_params: extractPointwiseConvParams('Prediction', 5), + conv_6_params: extractPointwiseConvParams('Prediction', 6), + conv_7_params: extractPointwiseConvParams('Prediction', 7), + box_predictor_0_params: extractBoxPredictorParams(0), + box_predictor_1_params: extractBoxPredictorParams(1), + box_predictor_2_params: extractBoxPredictorParams(2), + box_predictor_3_params: extractBoxPredictorParams(3), + box_predictor_4_params: extractBoxPredictorParams(4), + box_predictor_5_params: extractBoxPredictorParams(5) + } + } + + return { + extractMobilenetV1Params, + extractPredictionLayerParams + } +} + +export async function loadQuantizedParams(uri: string | undefined): Promise {//Promise { + const weightMap = await loadWeightMap(uri, DEFAULT_MODEL_NAME) + + const { + extractMobilenetV1Params, + extractPredictionLayerParams + } = extractorsFactory(weightMap) + + const extra_dim = weightMap['Output/extra_dim'] + if (!isTensor3D(extra_dim)) { + throw new Error(`expected weightMap['Output/extra_dim'] to be a Tensor3D, instead have ${extra_dim}`) + } + + return { + mobilenetv1_params: extractMobilenetV1Params(), + prediction_layer_params: extractPredictionLayerParams(), + output_layer_params: { + extra_dim + } + } +} \ No newline at end of file diff --git a/src/faceDetectionNet/mobileNetV1.ts b/src/faceDetectionNet/mobileNetV1.ts index 1485526c..980a54da 100644 --- a/src/faceDetectionNet/mobileNetV1.ts +++ b/src/faceDetectionNet/mobileNetV1.ts @@ -1,13 +1,13 @@ import * as tf from '@tensorflow/tfjs-core'; import { pointwiseConvLayer } from './pointwiseConvLayer'; -import { FaceDetectionNet } from './types'; +import { MobileNetV1 } from './types'; const epsilon = 0.0010000000474974513 function depthwiseConvLayer( x: tf.Tensor4D, - params: FaceDetectionNet.MobileNetV1.DepthwiseConvParams, + params: MobileNetV1.DepthwiseConvParams, strides: [number, number] ) { return tf.tidy(() => { @@ -30,7 +30,7 @@ function getStridesForLayerIdx(layerIdx: number): [number, number] { return [2, 4, 6, 12].some(idx => idx === layerIdx) ? [2, 2] : [1, 1] } -export function mobileNetV1(x: tf.Tensor4D, params: FaceDetectionNet.MobileNetV1.Params) { +export function mobileNetV1(x: tf.Tensor4D, params: MobileNetV1.Params) { return tf.tidy(() => { let conv11 = null diff --git a/src/faceDetectionNet/outputLayer.ts b/src/faceDetectionNet/outputLayer.ts index 1be049ce..9a30ce72 100644 --- a/src/faceDetectionNet/outputLayer.ts +++ b/src/faceDetectionNet/outputLayer.ts @@ -1,6 +1,7 @@ import * as tf from '@tensorflow/tfjs-core'; -import { FaceDetectionNet } from './types'; +import { OutputLayerParams } from './types'; + function getCenterCoordinatesAndSizesLayer(x: tf.Tensor2D) { const vec = tf.unstack(tf.transpose(x, [1, 0])) @@ -49,7 +50,7 @@ function decodeBoxesLayer(x0: tf.Tensor2D, x1: tf.Tensor2D) { export function outputLayer( boxPredictions: tf.Tensor4D, classPredictions: tf.Tensor4D, - params: FaceDetectionNet.OutputLayerParams + params: OutputLayerParams ) { return tf.tidy(() => { diff --git a/src/faceDetectionNet/pointwiseConvLayer.ts b/src/faceDetectionNet/pointwiseConvLayer.ts index 3d668b96..f1931365 100644 --- a/src/faceDetectionNet/pointwiseConvLayer.ts +++ b/src/faceDetectionNet/pointwiseConvLayer.ts @@ -1,10 +1,10 @@ import * as tf from '@tensorflow/tfjs-core'; -import { FaceDetectionNet } from './types'; +import { PointwiseConvParams } from './types'; export function pointwiseConvLayer( x: tf.Tensor4D, - params: FaceDetectionNet.PointwiseConvParams, + params: PointwiseConvParams, strides: [number, number] ) { return tf.tidy(() => { diff --git a/src/faceDetectionNet/predictionLayer.ts b/src/faceDetectionNet/predictionLayer.ts index 7fdcad63..4c6c5b51 100644 --- a/src/faceDetectionNet/predictionLayer.ts +++ b/src/faceDetectionNet/predictionLayer.ts @@ -2,12 +2,12 @@ import * as tf from '@tensorflow/tfjs-core'; import { boxPredictionLayer } from './boxPredictionLayer'; import { pointwiseConvLayer } from './pointwiseConvLayer'; -import { FaceDetectionNet } from './types'; +import { PredictionLayerParams } from './types'; export function predictionLayer( x: tf.Tensor4D, conv11: tf.Tensor4D, - params: FaceDetectionNet.PredictionLayerParams + params: PredictionLayerParams ) { return tf.tidy(() => { diff --git a/src/faceDetectionNet/types.ts b/src/faceDetectionNet/types.ts index 1b1f123c..fcd32eda 100644 --- a/src/faceDetectionNet/types.ts +++ b/src/faceDetectionNet/types.ts @@ -2,64 +2,61 @@ import * as tf from '@tensorflow/tfjs-core'; import { ConvParams } from '../commons/types'; -export namespace FaceDetectionNet { +export type PointwiseConvParams = { + filters: tf.Tensor4D + batch_norm_offset: tf.Tensor1D +} + +export namespace MobileNetV1 { - export type PointwiseConvParams = { + export type DepthwiseConvParams = { filters: tf.Tensor4D + batch_norm_scale: tf.Tensor1D batch_norm_offset: tf.Tensor1D + batch_norm_mean: tf.Tensor1D + batch_norm_variance: tf.Tensor1D } - export namespace MobileNetV1 { - - export type DepthwiseConvParams = { - filters: tf.Tensor4D - batch_norm_scale: tf.Tensor1D - batch_norm_offset: tf.Tensor1D - batch_norm_mean: tf.Tensor1D - batch_norm_variance: tf.Tensor1D - } - - export type ConvPairParams = { - depthwise_conv_params: DepthwiseConvParams - pointwise_conv_params: PointwiseConvParams - } - - export type Params = { - conv_0_params: PointwiseConvParams - conv_pair_params: ConvPairParams[] - } - - } - - export type BoxPredictionParams = { - box_encoding_predictor_params: ConvParams - class_predictor_params: ConvParams + export type ConvPairParams = { + depthwise_conv_params: DepthwiseConvParams + pointwise_conv_params: PointwiseConvParams } - export type PredictionLayerParams = { + export type Params = { conv_0_params: PointwiseConvParams - conv_1_params: PointwiseConvParams - conv_2_params: PointwiseConvParams - conv_3_params: PointwiseConvParams - conv_4_params: PointwiseConvParams - conv_5_params: PointwiseConvParams - conv_6_params: PointwiseConvParams - conv_7_params: PointwiseConvParams - box_predictor_0_params: BoxPredictionParams - box_predictor_1_params: BoxPredictionParams - box_predictor_2_params: BoxPredictionParams - box_predictor_3_params: BoxPredictionParams - box_predictor_4_params: BoxPredictionParams - box_predictor_5_params: BoxPredictionParams + conv_pair_params: ConvPairParams[] } - export type OutputLayerParams = { - extra_dim: tf.Tensor3D - } +} - export type NetParams = { - mobilenetv1_params: MobileNetV1.Params, - prediction_layer_params: PredictionLayerParams, - output_layer_params: OutputLayerParams - } +export type BoxPredictionParams = { + box_encoding_predictor_params: ConvParams + class_predictor_params: ConvParams +} + +export type PredictionLayerParams = { + conv_0_params: PointwiseConvParams + conv_1_params: PointwiseConvParams + conv_2_params: PointwiseConvParams + conv_3_params: PointwiseConvParams + conv_4_params: PointwiseConvParams + conv_5_params: PointwiseConvParams + conv_6_params: PointwiseConvParams + conv_7_params: PointwiseConvParams + box_predictor_0_params: BoxPredictionParams + box_predictor_1_params: BoxPredictionParams + box_predictor_2_params: BoxPredictionParams + box_predictor_3_params: BoxPredictionParams + box_predictor_4_params: BoxPredictionParams + box_predictor_5_params: BoxPredictionParams +} + +export type OutputLayerParams = { + extra_dim: tf.Tensor3D +} + +export type NetParams = { + mobilenetv1_params: MobileNetV1.Params, + prediction_layer_params: PredictionLayerParams, + output_layer_params: OutputLayerParams } diff --git a/src/faceLandmarkNet/FaceLandmarkNet.ts b/src/faceLandmarkNet/FaceLandmarkNet.ts new file mode 100644 index 00000000..e8bfcc6e --- /dev/null +++ b/src/faceLandmarkNet/FaceLandmarkNet.ts @@ -0,0 +1,92 @@ +import * as tf from '@tensorflow/tfjs-core'; + +import { convLayer } from '../commons/convLayer'; +import { ConvParams } from '../commons/types'; +import { getImageTensor } from '../getImageTensor'; +import { NetInput } from '../NetInput'; +import { Point } from '../Point'; +import { Dimensions, TNetInput } from '../types'; +import { extractParams } from './extractParams'; +import { FaceLandmarks } from './FaceLandmarks'; +import { fullyConnectedLayer } from './fullyConnectedLayer'; +import { loadQuantizedParams } from './loadQuantizedParams'; +import { NetParams } from './types'; + +function conv(x: tf.Tensor4D, params: ConvParams): tf.Tensor4D { + return convLayer(x, params, 'valid', true) +} + +function maxPool(x: tf.Tensor4D, strides: [number, number] = [2, 2]): tf.Tensor4D { + return tf.maxPool(x, [2, 2], strides, 'valid') +} + +export class FaceLandmarkNet { + + private _params: NetParams + + public async load(weightsOrUrl: Float32Array | string | undefined): Promise { + if (weightsOrUrl instanceof Float32Array) { + this.extractWeights(weightsOrUrl) + return + } + + if (weightsOrUrl && typeof weightsOrUrl !== 'string') { + throw new Error('FaceLandmarkNet.load - expected model uri, or weights as Float32Array') + } + this._params = await loadQuantizedParams(weightsOrUrl) + } + + public extractWeights(weights: Float32Array) { + this._params = extractParams(weights) + } + + public async detectLandmarks(input: tf.Tensor | NetInput | TNetInput) { + if (!this._params) { + throw new Error('FaceLandmarkNet - load model before inference') + } + + let imageDimensions: Dimensions | undefined + + const outTensor = tf.tidy(() => { + const params = this._params + + let imgTensor = getImageTensor(input) + const [height, width] = imgTensor.shape.slice(1) + imageDimensions = { width, height } + + + // work with 128 x 128 sized face images + if (imgTensor.shape[1] !== 128 || imgTensor.shape[2] !== 128) { + imgTensor = tf.image.resizeBilinear(imgTensor, [128, 128]) + } + + let out = conv(imgTensor, params.conv0_params) + out = maxPool(out) + out = conv(out, params.conv1_params) + out = conv(out, params.conv2_params) + out = maxPool(out) + out = conv(out, params.conv3_params) + out = conv(out, params.conv4_params) + out = maxPool(out) + out = conv(out, params.conv5_params) + out = conv(out, params.conv6_params) + out = maxPool(out, [1, 1]) + out = conv(out, params.conv7_params) + const fc0 = tf.relu(fullyConnectedLayer(out.as2D(out.shape[0], -1), params.fc0_params)) + const fc1 = fullyConnectedLayer(fc0, params.fc1_params) + + return fc1 + }) + + const faceLandmarksArray = Array.from(await outTensor.data()) + outTensor.dispose() + + const xCoords = faceLandmarksArray.filter((c, i) => (i - 1) % 2) + const yCoords = faceLandmarksArray.filter((c, i) => i % 2) + + return new FaceLandmarks( + Array(68).fill(0).map((_, i) => new Point(xCoords[i], yCoords[i])), + imageDimensions as Dimensions + ) + } +} \ No newline at end of file diff --git a/src/faceLandmarkNet/extractParams.ts b/src/faceLandmarkNet/extractParams.ts index 4c610742..ae146f06 100644 --- a/src/faceLandmarkNet/extractParams.ts +++ b/src/faceLandmarkNet/extractParams.ts @@ -2,9 +2,9 @@ import * as tf from '@tensorflow/tfjs-core'; import { extractConvParamsFactory } from '../commons/extractConvParamsFactory'; import { extractWeightsFactory } from '../commons/extractWeightsFactory'; -import { FaceLandmarkNet } from './types'; +import { FCParams, NetParams } from './types'; -export function extractParams(weights: Float32Array): FaceLandmarkNet.NetParams { +export function extractParams(weights: Float32Array): NetParams { const { extractWeights, getRemainingWeights @@ -12,7 +12,7 @@ export function extractParams(weights: Float32Array): FaceLandmarkNet.NetParams const extractConvParams = extractConvParamsFactory(extractWeights) - function extractFcParams(channelsIn: number, channelsOut: number,): FaceLandmarkNet.FCParams { + function extractFcParams(channelsIn: number, channelsOut: number,): FCParams { const fc_weights = tf.tensor2d(extractWeights(channelsIn * channelsOut), [channelsIn, channelsOut]) const fc_bias = tf.tensor1d(extractWeights(channelsOut)) return { diff --git a/src/faceLandmarkNet/fullyConnectedLayer.ts b/src/faceLandmarkNet/fullyConnectedLayer.ts index 7e7bf280..806f7644 100644 --- a/src/faceLandmarkNet/fullyConnectedLayer.ts +++ b/src/faceLandmarkNet/fullyConnectedLayer.ts @@ -1,10 +1,10 @@ import * as tf from '@tensorflow/tfjs-core'; -import { FaceLandmarkNet } from './types'; +import { FCParams } from './types'; export function fullyConnectedLayer( x: tf.Tensor2D, - params: FaceLandmarkNet.FCParams + params: FCParams ): tf.Tensor2D { return tf.tidy(() => tf.add( diff --git a/src/faceLandmarkNet/index.ts b/src/faceLandmarkNet/index.ts index cd244031..1c23128c 100644 --- a/src/faceLandmarkNet/index.ts +++ b/src/faceLandmarkNet/index.ts @@ -1,71 +1,9 @@ -import * as tf from '@tensorflow/tfjs-core'; +import { FaceLandmarkNet } from './FaceLandmarkNet'; -import { convLayer } from '../commons/convLayer'; -import { ConvParams } from '../commons/types'; -import { getImageTensor } from '../getImageTensor'; -import { NetInput } from '../NetInput'; -import { Point } from '../Point'; -import { Dimensions, TNetInput } from '../types'; -import { extractParams } from './extractParams'; -import { FaceLandmarks } from './FaceLandmarks'; -import { fullyConnectedLayer } from './fullyConnectedLayer'; - -function conv(x: tf.Tensor4D, params: ConvParams): tf.Tensor4D { - return convLayer(x, params, 'valid', true) -} - -function maxPool(x: tf.Tensor4D, strides: [number, number] = [2, 2]): tf.Tensor4D { - return tf.maxPool(x, [2, 2], strides, 'valid') -} +export * from './FaceLandmarkNet'; export function faceLandmarkNet(weights: Float32Array) { - const params = extractParams(weights) - - async function detectLandmarks(input: tf.Tensor | NetInput | TNetInput) { - let imageDimensions: Dimensions | undefined - - const outTensor = tf.tidy(() => { - let imgTensor = getImageTensor(input) - const [height, width] = imgTensor.shape.slice(1) - imageDimensions = { width, height } - - - // work with 128 x 128 sized face images - if (imgTensor.shape[1] !== 128 || imgTensor.shape[2] !== 128) { - imgTensor = tf.image.resizeBilinear(imgTensor, [128, 128]) - } - - let out = conv(imgTensor, params.conv0_params) - out = maxPool(out) - out = conv(out, params.conv1_params) - out = conv(out, params.conv2_params) - out = maxPool(out) - out = conv(out, params.conv3_params) - out = conv(out, params.conv4_params) - out = maxPool(out) - out = conv(out, params.conv5_params) - out = conv(out, params.conv6_params) - out = maxPool(out, [1, 1]) - out = conv(out, params.conv7_params) - const fc0 = tf.relu(fullyConnectedLayer(out.as2D(out.shape[0], -1), params.fc0_params)) - const fc1 = fullyConnectedLayer(fc0, params.fc1_params) - - return fc1 - }) - - const faceLandmarksArray = Array.from(await outTensor.data()) - outTensor.dispose() - - const xCoords = faceLandmarksArray.filter((c, i) => (i - 1) % 2) - const yCoords = faceLandmarksArray.filter((c, i) => i % 2) - - return new FaceLandmarks( - Array(68).fill(0).map((_, i) => new Point(xCoords[i], yCoords[i])), - imageDimensions as Dimensions - ) - } - - return { - detectLandmarks - } + const net = new FaceLandmarkNet() + net.extractWeights(weights) + return net } \ No newline at end of file diff --git a/src/faceLandmarkNet/loadQuantizedParams.ts b/src/faceLandmarkNet/loadQuantizedParams.ts new file mode 100644 index 00000000..5ff52d67 --- /dev/null +++ b/src/faceLandmarkNet/loadQuantizedParams.ts @@ -0,0 +1,72 @@ +import * as tf from '@tensorflow/tfjs-core'; + +import { loadWeightMap } from '../commons/loadWeightMap'; +import { ConvParams } from '../commons/types'; +import { FCParams, NetParams } from './types'; +import { isTensor4D, isTensor1D, isTensor2D } from '../commons/isTensor'; + +const DEFAULT_MODEL_NAME = 'face_landmark_68_model' + +function extractorsFactory(weightMap: any) { + + function extractConvParams(prefix: string): ConvParams { + const params = { + filters: weightMap[`${prefix}/kernel`] as tf.Tensor4D, + bias: weightMap[`${prefix}/bias`] as tf.Tensor1D + } + + if (!isTensor4D(params.filters)) { + throw new Error(`expected weightMap[${prefix}/kernel] to be a Tensor4D, instead have ${params.filters}`) + } + + if (!isTensor1D(params.bias)) { + throw new Error(`expected weightMap[${prefix}/bias] to be a Tensor1D, instead have ${params.bias}`) + } + + return params + } + + function extractFcParams(prefix: string): FCParams { + const params = { + weights: weightMap[`${prefix}/kernel`] as tf.Tensor2D, + bias: weightMap[`${prefix}/bias`] as tf.Tensor1D + } + + if (!isTensor2D(params.weights)) { + throw new Error(`expected weightMap[${prefix}/kernel] to be a Tensor2D, instead have ${params.weights}`) + } + + if (!isTensor1D(params.bias)) { + throw new Error(`expected weightMap[${prefix}/bias] to be a Tensor1D, instead have ${params.bias}`) + } + + return params + } + + return { + extractConvParams, + extractFcParams + } +} + +export async function loadQuantizedParams(uri: string | undefined): Promise { + const weightMap = await loadWeightMap(uri, DEFAULT_MODEL_NAME) + + const { + extractConvParams, + extractFcParams + } = extractorsFactory(weightMap) + + return { + conv0_params: extractConvParams('conv2d_0'), + conv1_params: extractConvParams('conv2d_1'), + conv2_params: extractConvParams('conv2d_2'), + conv3_params: extractConvParams('conv2d_3'), + conv4_params: extractConvParams('conv2d_4'), + conv5_params: extractConvParams('conv2d_5'), + conv6_params: extractConvParams('conv2d_6'), + conv7_params: extractConvParams('conv2d_7'), + fc0_params: extractFcParams('dense'), + fc1_params: extractFcParams('logits') + } +} \ No newline at end of file diff --git a/src/faceLandmarkNet/types.ts b/src/faceLandmarkNet/types.ts index b44c8dd0..3335e59d 100644 --- a/src/faceLandmarkNet/types.ts +++ b/src/faceLandmarkNet/types.ts @@ -2,24 +2,20 @@ import * as tf from '@tensorflow/tfjs-core'; import { ConvParams } from '../commons/types'; -export namespace FaceLandmarkNet { - - export type FCParams = { - weights: tf.Tensor2D - bias: tf.Tensor1D - } - - export type NetParams = { - conv0_params: ConvParams - conv1_params: ConvParams - conv2_params: ConvParams - conv3_params: ConvParams - conv4_params: ConvParams - conv5_params: ConvParams - conv6_params: ConvParams - conv7_params: ConvParams - fc0_params: FCParams - fc1_params: FCParams - } +export type FCParams = { + weights: tf.Tensor2D + bias: tf.Tensor1D +} +export type NetParams = { + conv0_params: ConvParams + conv1_params: ConvParams + conv2_params: ConvParams + conv3_params: ConvParams + conv4_params: ConvParams + conv5_params: ConvParams + conv6_params: ConvParams + conv7_params: ConvParams + fc0_params: FCParams + fc1_params: FCParams } \ No newline at end of file diff --git a/src/faceRecognitionNet/FaceRecognitionNet.ts b/src/faceRecognitionNet/FaceRecognitionNet.ts new file mode 100644 index 00000000..a7c42d9e --- /dev/null +++ b/src/faceRecognitionNet/FaceRecognitionNet.ts @@ -0,0 +1,89 @@ +import * as tf from '@tensorflow/tfjs-core'; + +import { getImageTensor } from '../getImageTensor'; +import { NetInput } from '../NetInput'; +import { padToSquare } from '../padToSquare'; +import { TNetInput } from '../types'; +import { convDown } from './convLayer'; +import { extractParams } from './extractParams'; +import { loadQuantizedParams } from './loadQuantizedParams'; +import { normalize } from './normalize'; +import { residual, residualDown } from './residualLayer'; +import { NetParams } from './types'; + +export class FaceRecognitionNet { + + private _params: NetParams + + public async load(weightsOrUrl: Float32Array | string | undefined): Promise { + if (weightsOrUrl instanceof Float32Array) { + this.extractWeights(weightsOrUrl) + return + } + + if (weightsOrUrl && typeof weightsOrUrl !== 'string') { + throw new Error('FaceLandmarkNet.load - expected model uri, or weights as Float32Array') + } + this._params = await loadQuantizedParams(weightsOrUrl) + } + + public extractWeights(weights: Float32Array) { + this._params = extractParams(weights) + } + + public forward(input: tf.Tensor | NetInput | TNetInput) { + if (!this._params) { + throw new Error('FaceRecognitionNet - load model before inference') + } + + return tf.tidy(() => { + + let x = padToSquare(getImageTensor(input), true) + // work with 150 x 150 sized face images + if (x.shape[1] !== 150 || x.shape[2] !== 150) { + x = tf.image.resizeBilinear(x, [150, 150]) + } + x = normalize(x) + + let out = convDown(x, this._params.conv32_down) + out = tf.maxPool(out, 3, 2, 'valid') + + out = residual(out, this._params.conv32_1) + out = residual(out, this._params.conv32_2) + out = residual(out, this._params.conv32_3) + + out = residualDown(out, this._params.conv64_down) + out = residual(out, this._params.conv64_1) + out = residual(out, this._params.conv64_2) + out = residual(out, this._params.conv64_3) + + out = residualDown(out, this._params.conv128_down) + out = residual(out, this._params.conv128_1) + out = residual(out, this._params.conv128_2) + + out = residualDown(out, this._params.conv256_down) + out = residual(out, this._params.conv256_1) + out = residual(out, this._params.conv256_2) + out = residualDown(out, this._params.conv256_down_out) + + const globalAvg = out.mean([1, 2]) as tf.Tensor2D + const fullyConnected = tf.matMul(globalAvg, this._params.fc) + + return fullyConnected + }) + } + + public async computeFaceDescriptor(input: tf.Tensor | NetInput | TNetInput) { + const result = this.forward(input) + const data = await result.data() + result.dispose() + return data + } + + public async computeFaceDescriptorSync(input: tf.Tensor | NetInput | TNetInput) { + const result = this.forward(input) + const data = result.dataSync() + result.dispose() + return data + } +} \ No newline at end of file diff --git a/src/faceRecognitionNet/convLayer.ts b/src/faceRecognitionNet/convLayer.ts index 417e9cf2..fff3f538 100644 --- a/src/faceRecognitionNet/convLayer.ts +++ b/src/faceRecognitionNet/convLayer.ts @@ -1,12 +1,12 @@ import * as tf from '@tensorflow/tfjs-core'; import { scale } from './scaleLayer'; -import { FaceRecognitionNet } from './types'; +import { ConvLayerParams } from './types'; function convLayer( x: tf.Tensor4D, - params: FaceRecognitionNet.ConvLayerParams, + params: ConvLayerParams, strides: [number, number], withRelu: boolean, padding: 'valid' | 'same' = 'same' @@ -19,14 +19,14 @@ function convLayer( return withRelu ? tf.relu(out) : out } -export function conv(x: tf.Tensor4D, params: FaceRecognitionNet.ConvLayerParams) { +export function conv(x: tf.Tensor4D, params: ConvLayerParams) { return convLayer(x, params, [1, 1], true) } -export function convNoRelu(x: tf.Tensor4D, params: FaceRecognitionNet.ConvLayerParams) { +export function convNoRelu(x: tf.Tensor4D, params: ConvLayerParams) { return convLayer(x, params, [1, 1], false) } -export function convDown(x: tf.Tensor4D, params: FaceRecognitionNet.ConvLayerParams) { +export function convDown(x: tf.Tensor4D, params: ConvLayerParams) { return convLayer(x, params, [2, 2], true, 'valid') } \ No newline at end of file diff --git a/src/faceRecognitionNet/extractParams.ts b/src/faceRecognitionNet/extractParams.ts index e4c06c97..24ccbb8c 100644 --- a/src/faceRecognitionNet/extractParams.ts +++ b/src/faceRecognitionNet/extractParams.ts @@ -3,7 +3,7 @@ import * as tf from '@tensorflow/tfjs-core'; import { extractWeightsFactory } from '../commons/extractWeightsFactory'; import { ExtractWeightsFunction } from '../commons/types'; import { isFloat } from '../utils'; -import { FaceRecognitionNet } from './types'; +import { ConvLayerParams, NetParams, ResidualLayerParams, ScaleLayerParams } from './types'; function extractorsFactory(extractWeights: ExtractWeightsFunction) { @@ -21,7 +21,7 @@ function extractorsFactory(extractWeights: ExtractWeightsFunction) { ) } - function extractScaleLayerParams(numWeights: number): FaceRecognitionNet.ScaleLayerParams { + function extractScaleLayerParams(numWeights: number): ScaleLayerParams { const weights = tf.tensor1d(extractWeights(numWeights)) const biases = tf.tensor1d(extractWeights(numWeights)) return { @@ -34,7 +34,7 @@ function extractorsFactory(extractWeights: ExtractWeightsFunction) { numFilterValues: number, numFilters: number, filterSize: number - ): FaceRecognitionNet.ConvLayerParams { + ): ConvLayerParams { const conv_filters = extractFilterValues(numFilterValues, numFilters, filterSize) const conv_bias = tf.tensor1d(extractWeights(numFilters)) const scale = extractScaleLayerParams(numFilters) @@ -48,9 +48,14 @@ function extractorsFactory(extractWeights: ExtractWeightsFunction) { } } - function extractResidualLayerParams(numFilterValues: number, numFilters: number, filterSize: number, isDown: boolean = false): FaceRecognitionNet.ResidualLayerParams { - const conv1: FaceRecognitionNet.ConvLayerParams = extractConvLayerParams((isDown ? 0.5 : 1) * numFilterValues, numFilters, filterSize) - const conv2: FaceRecognitionNet.ConvLayerParams = extractConvLayerParams(numFilterValues, numFilters, filterSize) + function extractResidualLayerParams( + numFilterValues: number, + numFilters: number, + filterSize: number, + isDown: boolean = false + ): ResidualLayerParams { + const conv1: ConvLayerParams = extractConvLayerParams((isDown ? 0.5 : 1) * numFilterValues, numFilters, filterSize) + const conv2: ConvLayerParams = extractConvLayerParams(numFilterValues, numFilters, filterSize) return { conv1, @@ -65,7 +70,7 @@ function extractorsFactory(extractWeights: ExtractWeightsFunction) { } -export function extractParams(weights: Float32Array): FaceRecognitionNet.NetParams { +export function extractParams(weights: Float32Array): NetParams { const { extractWeights, getRemainingWeights diff --git a/src/faceRecognitionNet/index.ts b/src/faceRecognitionNet/index.ts index 5f51a262..245c8599 100644 --- a/src/faceRecognitionNet/index.ts +++ b/src/faceRecognitionNet/index.ts @@ -1,72 +1,9 @@ -import * as tf from '@tensorflow/tfjs-core'; +import { FaceRecognitionNet } from './FaceRecognitionNet'; -import { getImageTensor } from '../getImageTensor'; -import { NetInput } from '../NetInput'; -import { padToSquare } from '../padToSquare'; -import { TNetInput } from '../types'; -import { convDown } from './convLayer'; -import { extractParams } from './extractParams'; -import { normalize } from './normalize'; -import { residual, residualDown } from './residualLayer'; +export * from './FaceRecognitionNet'; export function faceRecognitionNet(weights: Float32Array) { - const params = extractParams(weights) - - function forward(input: tf.Tensor | NetInput | TNetInput) { - return tf.tidy(() => { - - let x = padToSquare(getImageTensor(input), true) - // work with 150 x 150 sized face images - if (x.shape[1] !== 150 || x.shape[2] !== 150) { - x = tf.image.resizeBilinear(x, [150, 150]) - } - x = normalize(x) - - let out = convDown(x, params.conv32_down) - out = tf.maxPool(out, 3, 2, 'valid') - - out = residual(out, params.conv32_1) - out = residual(out, params.conv32_2) - out = residual(out, params.conv32_3) - - out = residualDown(out, params.conv64_down) - out = residual(out, params.conv64_1) - out = residual(out, params.conv64_2) - out = residual(out, params.conv64_3) - - out = residualDown(out, params.conv128_down) - out = residual(out, params.conv128_1) - out = residual(out, params.conv128_2) - - out = residualDown(out, params.conv256_down) - out = residual(out, params.conv256_1) - out = residual(out, params.conv256_2) - out = residualDown(out, params.conv256_down_out) - - const globalAvg = out.mean([1, 2]) as tf.Tensor2D - const fullyConnected = tf.matMul(globalAvg, params.fc) - - return fullyConnected - }) - } - - const computeFaceDescriptor = async (input: tf.Tensor | NetInput | TNetInput) => { - const result = forward(input) - const data = await result.data() - result.dispose() - return data - } - - const computeFaceDescriptorSync = (input: tf.Tensor | NetInput | TNetInput) => { - const result = forward(input) - const data = result.dataSync() - result.dispose() - return data - } - - return { - computeFaceDescriptor, - computeFaceDescriptorSync, - forward - } + const net = new FaceRecognitionNet() + net.extractWeights(weights) + return net } \ No newline at end of file diff --git a/src/faceRecognitionNet/loadQuantizedParams.ts b/src/faceRecognitionNet/loadQuantizedParams.ts new file mode 100644 index 00000000..d896501e --- /dev/null +++ b/src/faceRecognitionNet/loadQuantizedParams.ts @@ -0,0 +1,111 @@ +import { isTensor1D, isTensor2D, isTensor4D } from '../commons/isTensor'; +import { loadWeightMap } from '../commons/loadWeightMap'; +import { ConvLayerParams, ResidualLayerParams, ScaleLayerParams } from './types'; + +const DEFAULT_MODEL_NAME = 'face_recognition_model' + +function extractorsFactory(weightMap: any) { + + function extractScaleLayerParams(prefix: string): ScaleLayerParams { + const params = { + weights: weightMap[`${prefix}/scale/weights`], + biases: weightMap[`${prefix}/scale/biases`] + } + + if (!isTensor1D(params.weights)) { + throw new Error(`expected weightMap[${prefix}/scale/weights] to be a Tensor1D, instead have ${params.weights}`) + } + + if (!isTensor1D(params.biases)) { + throw new Error(`expected weightMap[${prefix}/scale/biases] to be a Tensor1D, instead have ${params.biases}`) + } + + return params + } + + function extractConvLayerParams(prefix: string): ConvLayerParams { + const params = { + filters: weightMap[`${prefix}/conv/filters`], + bias: weightMap[`${prefix}/conv/bias`] + } + + if (!isTensor4D(params.filters)) { + throw new Error(`expected weightMap[${prefix}/conv/filters] to be a Tensor1D, instead have ${params.filters}`) + } + + if (!isTensor1D(params.bias)) { + throw new Error(`expected weightMap[${prefix}/conv/bias] to be a Tensor1D, instead have ${params.bias}`) + } + + return { + conv: params, + scale: extractScaleLayerParams(prefix) + } + } + + function extractResidualLayerParams(prefix: string): ResidualLayerParams { + return { + conv1: extractConvLayerParams(`${prefix}/conv1`), + conv2: extractConvLayerParams(`${prefix}/conv2`) + } + } + + return { + extractConvLayerParams, + extractResidualLayerParams + } + +} + +export async function loadQuantizedParams(uri: string | undefined): Promise { + const weightMap = await loadWeightMap(uri, DEFAULT_MODEL_NAME) + + const { + extractConvLayerParams, + extractResidualLayerParams + } = extractorsFactory(weightMap) + + const conv32_down = extractConvLayerParams('conv32_down') + const conv32_1 = extractResidualLayerParams('conv32_1') + const conv32_2 = extractResidualLayerParams('conv32_2') + const conv32_3 = extractResidualLayerParams('conv32_3') + + const conv64_down = extractResidualLayerParams('conv64_down') + const conv64_1 = extractResidualLayerParams('conv64_1') + const conv64_2 = extractResidualLayerParams('conv64_2') + const conv64_3 = extractResidualLayerParams('conv64_3') + + const conv128_down = extractResidualLayerParams('conv128_down') + const conv128_1 = extractResidualLayerParams('conv128_1') + const conv128_2 = extractResidualLayerParams('conv128_2') + + const conv256_down = extractResidualLayerParams('conv256_down') + const conv256_1 = extractResidualLayerParams('conv256_1') + const conv256_2 = extractResidualLayerParams('conv256_2') + const conv256_down_out = extractResidualLayerParams('conv256_down_out') + + const fc = weightMap['fc'] + + if (!isTensor2D(fc)) { + throw new Error(`expected weightMap[fc] to be a Tensor2D, instead have ${fc}`) + } + + return { + conv32_down, + conv32_1, + conv32_2, + conv32_3, + conv64_down, + conv64_1, + conv64_2, + conv64_3, + conv128_down, + conv128_1, + conv128_2, + conv256_down, + conv256_1, + conv256_2, + conv256_down_out, + fc + } +} \ No newline at end of file diff --git a/src/faceRecognitionNet/residualLayer.ts b/src/faceRecognitionNet/residualLayer.ts index 1ec796ba..edc7d8af 100644 --- a/src/faceRecognitionNet/residualLayer.ts +++ b/src/faceRecognitionNet/residualLayer.ts @@ -1,9 +1,9 @@ import * as tf from '@tensorflow/tfjs-core'; import { conv, convDown, convNoRelu } from './convLayer'; -import { FaceRecognitionNet } from './types'; +import { ResidualLayerParams } from './types'; -export function residual(x: tf.Tensor4D, params: FaceRecognitionNet.ResidualLayerParams): tf.Tensor4D { +export function residual(x: tf.Tensor4D, params: ResidualLayerParams): tf.Tensor4D { let out = conv(x, params.conv1) out = convNoRelu(out, params.conv2) out = tf.add(out, x) @@ -11,7 +11,7 @@ export function residual(x: tf.Tensor4D, params: FaceRecognitionNet.ResidualLaye return out } -export function residualDown(x: tf.Tensor4D, params: FaceRecognitionNet.ResidualLayerParams): tf.Tensor4D { +export function residualDown(x: tf.Tensor4D, params: ResidualLayerParams): tf.Tensor4D { let out = convDown(x, params.conv1) out = convNoRelu(out, params.conv2) diff --git a/src/faceRecognitionNet/scaleLayer.ts b/src/faceRecognitionNet/scaleLayer.ts index 0e5bc0e4..d85f3de9 100644 --- a/src/faceRecognitionNet/scaleLayer.ts +++ b/src/faceRecognitionNet/scaleLayer.ts @@ -1,6 +1,7 @@ import * as tf from '@tensorflow/tfjs-core'; -import { FaceRecognitionNet } from './types'; -export function scale(x: tf.Tensor4D, params: FaceRecognitionNet.ScaleLayerParams): tf.Tensor4D { +import { ScaleLayerParams } from './types'; + +export function scale(x: tf.Tensor4D, params: ScaleLayerParams): tf.Tensor4D { return tf.add(tf.mul(x, params.weights), params.biases) } diff --git a/src/faceRecognitionNet/types.ts b/src/faceRecognitionNet/types.ts index 991ef1cc..6ae26d6c 100644 --- a/src/faceRecognitionNet/types.ts +++ b/src/faceRecognitionNet/types.ts @@ -2,39 +2,35 @@ import * as tf from '@tensorflow/tfjs-core'; import { ConvParams } from '../commons/types'; -export namespace FaceRecognitionNet { +export type ScaleLayerParams = { + weights: tf.Tensor1D + biases: tf.Tensor1D +} +export type ResidualLayerParams = { + conv1: ConvLayerParams + conv2: ConvLayerParams +} - export type ScaleLayerParams = { - weights: tf.Tensor1D - biases: tf.Tensor1D - } - export type ResidualLayerParams = { - conv1: ConvLayerParams - conv2: ConvLayerParams - } - - export type ConvLayerParams = { - conv: ConvParams - scale: ScaleLayerParams - } - - export type NetParams = { - conv32_down: ConvLayerParams - conv32_1: ResidualLayerParams - conv32_2: ResidualLayerParams - conv32_3: ResidualLayerParams - conv64_down: ResidualLayerParams - conv64_1: ResidualLayerParams - conv64_2: ResidualLayerParams - conv64_3: ResidualLayerParams - conv128_down: ResidualLayerParams - conv128_1: ResidualLayerParams - conv128_2: ResidualLayerParams - conv256_down: ResidualLayerParams - conv256_1: ResidualLayerParams - conv256_2: ResidualLayerParams - conv256_down_out: ResidualLayerParams - fc: tf.Tensor2D - } +export type ConvLayerParams = { + conv: ConvParams + scale: ScaleLayerParams +} +export type NetParams = { + conv32_down: ConvLayerParams + conv32_1: ResidualLayerParams + conv32_2: ResidualLayerParams + conv32_3: ResidualLayerParams + conv64_down: ResidualLayerParams + conv64_1: ResidualLayerParams + conv64_2: ResidualLayerParams + conv64_3: ResidualLayerParams + conv128_down: ResidualLayerParams + conv128_1: ResidualLayerParams + conv128_2: ResidualLayerParams + conv256_down: ResidualLayerParams + conv256_1: ResidualLayerParams + conv256_2: ResidualLayerParams + conv256_down_out: ResidualLayerParams + fc: tf.Tensor2D } \ No newline at end of file diff --git a/src/index.ts b/src/index.ts index 5a62440b..61e0c4f8 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1,17 +1,11 @@ import * as tf from '@tensorflow/tfjs-core'; import { euclideanDistance } from './euclideanDistance'; -import { faceDetectionNet } from './faceDetectionNet'; -import { faceLandmarkNet } from './faceLandmarkNet'; -import { faceRecognitionNet } from './faceRecognitionNet'; import { NetInput } from './NetInput'; import { padToSquare } from './padToSquare'; export { euclideanDistance, - faceDetectionNet, - faceLandmarkNet, - faceRecognitionNet, NetInput, tf, padToSquare @@ -19,4 +13,7 @@ export { export * from './extractFaces' export * from './extractFaceTensors' +export * from './faceDetectionNet'; +export * from './faceLandmarkNet'; +export * from './faceRecognitionNet'; export * from './utils' \ No newline at end of file diff --git a/test/e2e/faceDetectionNet.test.ts b/test/e2e/faceDetectionNet.test.ts index d58e0b9a..b73dd99b 100644 --- a/test/e2e/faceDetectionNet.test.ts +++ b/test/e2e/faceDetectionNet.test.ts @@ -1,63 +1,113 @@ -import axios from 'axios'; - import * as faceapi from '../../src'; import { FaceDetection } from '../../src/faceDetectionNet/FaceDetection'; import { IRect } from '../../src/Rect'; +import { expectMaxDelta } from '../utils'; -function expectFaceDetectionEquals(result: FaceDetection, score: number, expectedBox: IRect) { - const { x, y, width, height } = result.getBox() - expect(result.getScore()).toBeCloseTo(score, 2) - expect(Math.floor(x)).toEqual(expectedBox.x) - expect(Math.floor(y)).toEqual(expectedBox.y) - expect(Math.floor(width)).toEqual(expectedBox.width) - expect(Math.floor(height)).toEqual(expectedBox.height) +function expectRectClose( + result: IRect, + expectedBox: IRect, + maxDelta: number +) { + const { x, y, width, height } = result + expectMaxDelta(x, expectedBox.x, maxDelta) + expectMaxDelta(y, expectedBox.y, maxDelta) + expectMaxDelta(width, expectedBox.width, maxDelta) + expectMaxDelta(height, expectedBox.height, maxDelta) } +const expectedBoxes = [ + { x: 48, y: 253, width: 104, height: 129 }, + { x: 260, y: 227, width: 76, height: 117 }, + { x: 466, y: 165, width: 88, height: 130 }, + { x: 234, y: 36, width: 84, height: 119 }, + { x: 577, y: 65, width: 84, height: 105 }, + { x: 84, y: 14, width: 79, height: 132 } +] + describe('faceDetectionNet', () => { - let faceDetectionNet: any, imgEl: HTMLImageElement + let imgEl: HTMLImageElement beforeAll(async () => { - const res = await axios.get('base/weights/face_detection_model.weights', { responseType: 'arraybuffer' }) - const weights = new Float32Array(res.data) - faceDetectionNet = faceapi.faceDetectionNet(weights) - - const img = await axios.get('base/test/images/faces.jpg', { responseType: 'blob' }) - imgEl = await faceapi.bufferToImage(img.data) + const img = await (await fetch('base/test/images/faces.jpg')).blob() + imgEl = await faceapi.bufferToImage(img) }) - it('scores > 0.9', async () => { - const { width, height } = imgEl + describe('uncompressed weights', () => { + + let faceDetectionNet: faceapi.FaceDetectionNet + + const expectedScores = [0.98, 0.89, 0.82, 0.75, 0.58, 0.55] + const maxBoxDelta = 1 + + beforeAll(async () => { + const res = await fetch('base/weights/uncompressed/face_detection_model.weights') + const weights = new Float32Array(await res.arrayBuffer()) + faceDetectionNet = faceapi.faceDetectionNet(weights) + }) + + it('scores > 0.8', async () => { + const detections = await faceDetectionNet.locateFaces(imgEl) as FaceDetection[] + + expect(detections.length).toEqual(3) + detections.forEach((det, i) => { + expect(det.getImageWidth()).toEqual(imgEl.width) + expect(det.getImageHeight()).toEqual(imgEl.height) + expect(det.getScore()).toBeCloseTo(expectedScores[i], 2) + expectRectClose(det.getBox(), expectedBoxes[i], maxBoxDelta) + }) + }) - const result = await faceDetectionNet.locateFaces(imgEl) as FaceDetection[] - expect(result.length).toEqual(3) + it('scores > 0.5', async () => { + const detections = await faceDetectionNet.locateFaces(imgEl, 0.5) as FaceDetection[] - result.forEach(res => { - expect(res.getImageWidth()).toEqual(width) - expect(res.getImageHeight()).toEqual(height) + expect(detections.length).toEqual(6) + detections.forEach((det, i) => { + expect(det.getImageWidth()).toEqual(imgEl.width) + expect(det.getImageHeight()).toEqual(imgEl.height) + expect(det.getScore()).toBeCloseTo(expectedScores[i], 2) + expectRectClose(det.getBox(), expectedBoxes[i], maxBoxDelta) + }) }) - const [d0, d1, d2] = result - expectFaceDetectionEquals(d0, 0.98, { x: 48, y: 253, width: 104, height: 129 }) - expectFaceDetectionEquals(d1, 0.89, { x: 260, y: 227, width: 76, height: 117 }) - expectFaceDetectionEquals(d2, 0.82, { x: 466, y: 165, width: 88, height: 130 }) + }) - it('scores > 0.5', async () => { - const { width, height } = imgEl + describe('quantized weights', () => { + + let faceDetectionNet: faceapi.FaceDetectionNet + + const expectedScores = [0.97, 0.88, 0.83, 0.82, 0.59, 0.52] + const maxBoxDelta = 5 + + beforeAll(async () => { + faceDetectionNet = new faceapi.FaceDetectionNet() + await faceDetectionNet.load('base/weights') + }) + + it('scores > 0.8', async () => { + const detections = await faceDetectionNet.locateFaces(imgEl) as FaceDetection[] + + expect(detections.length).toEqual(4) + detections.forEach((det, i) => { + expect(det.getImageWidth()).toEqual(imgEl.width) + expect(det.getImageHeight()).toEqual(imgEl.height) + expect(det.getScore()).toBeCloseTo(expectedScores[i], 2) + expectRectClose(det.getBox(), expectedBoxes[i], maxBoxDelta) + }) + }) - const result = await faceDetectionNet.locateFaces(imgEl, 0.5) as FaceDetection[] - expect(result.length).toEqual(6) + it('scores > 0.5', async () => { + const detections = await faceDetectionNet.locateFaces(imgEl, 0.5) as FaceDetection[] - result.forEach(res => { - expect(res.getImageWidth()).toEqual(width) - expect(res.getImageHeight()).toEqual(height) + expect(detections.length).toEqual(6) + detections.forEach((det, i) => { + expect(det.getImageWidth()).toEqual(imgEl.width) + expect(det.getImageHeight()).toEqual(imgEl.height) + expect(det.getScore()).toBeCloseTo(expectedScores[i], 2) + expectRectClose(det.getBox(), expectedBoxes[i], maxBoxDelta) + }) }) - const [d0, d1, d2, d3, d4, d5] = result - expectFaceDetectionEquals(d0, 0.98, { x: 48, y: 253, width: 104, height: 129 }) - expectFaceDetectionEquals(d1, 0.89, { x: 260, y: 227, width: 76, height: 117 }) - expectFaceDetectionEquals(d2, 0.82, { x: 466, y: 165, width: 88, height: 130 }) - expectFaceDetectionEquals(d3, 0.75, { x: 234, y: 36, width: 84, height: 119 }) - expectFaceDetectionEquals(d4, 0.58, { x: 577, y: 65, width: 84, height: 105 }) - expectFaceDetectionEquals(d5, 0.55, { x: 84, y: 14, width: 79, height: 132 }) + }) + }) \ No newline at end of file diff --git a/test/e2e/faceLandmarkNet.test.ts b/test/e2e/faceLandmarkNet.test.ts index 368b2429..6b24edcf 100644 --- a/test/e2e/faceLandmarkNet.test.ts +++ b/test/e2e/faceLandmarkNet.test.ts @@ -1,32 +1,66 @@ -import axios from 'axios'; - import * as faceapi from '../../src'; import { FaceLandmarks } from '../../src/faceLandmarkNet/FaceLandmarks'; import { Point } from '../../src/Point'; +import { expectMaxDelta } from '../utils'; describe('faceLandmarkNet', () => { - let faceLandmarkNet: any, imgEl: HTMLImageElement, faceLandmarkPositions: Point[] + let imgEl: HTMLImageElement beforeAll(async () => { - const res = await axios.get('base/weights/face_landmark_68_model.weights', { responseType: 'arraybuffer' }) - const weights = new Float32Array(res.data) - faceLandmarkNet = faceapi.faceLandmarkNet(weights) + const img = await (await fetch('base/test/images/face.png')).blob() + imgEl = await faceapi.bufferToImage(img) + }) + + describe('uncompressed weights', () => { + + let faceLandmarkNet: faceapi.FaceLandmarkNet, faceLandmarkPositions: Point[] + + beforeAll(async () => { + const res = await fetch('base/weights/uncompressed/face_landmark_68_model.weights') + const weights = new Float32Array(await res.arrayBuffer()) + faceLandmarkNet = faceapi.faceLandmarkNet(weights) + faceLandmarkPositions = await (await fetch('base/test/data/faceLandmarkPositions.json')).json() + }) + + it('computes face landmarks', async () => { + const { width, height } = imgEl + + const result = await faceLandmarkNet.detectLandmarks(imgEl) as FaceLandmarks + expect(result.getImageWidth()).toEqual(width) + expect(result.getImageHeight()).toEqual(height) + expect(result.getShift().x).toEqual(0) + expect(result.getShift().y).toEqual(0) + expect(result.getPositions().map(({ x, y }) => ({ x, y }))).toEqual(faceLandmarkPositions) + }) - const img = await axios.get('base/test/images/face.png', { responseType: 'blob' }) - imgEl = await faceapi.bufferToImage(img.data) - faceLandmarkPositions = (await axios.get('base/test/data/faceLandmarkPositions.json')).data }) - it('computes face descriptor', async () => { - const { width, height } = imgEl + describe('quantized weights', () => { + + let faceLandmarkNet: faceapi.FaceLandmarkNet, faceLandmarkPositions: Point[] + + beforeAll(async () => { + faceLandmarkNet = new faceapi.FaceLandmarkNet() + await faceLandmarkNet.load('base/weights') + faceLandmarkPositions = await (await fetch('base/test/data/faceLandmarkPositions.json')).json() + }) + + it('computes face landmarks', async () => { + const { width, height } = imgEl + + const result = await faceLandmarkNet.detectLandmarks(imgEl) as FaceLandmarks + expect(result.getImageWidth()).toEqual(width) + expect(result.getImageHeight()).toEqual(height) + expect(result.getShift().x).toEqual(0) + expect(result.getShift().y).toEqual(0) + result.getPositions().forEach(({ x, y }, i) => { + expectMaxDelta(x, faceLandmarkPositions[i].x, 2) + expectMaxDelta(y, faceLandmarkPositions[i].y, 2) + }) + }) - const result = await faceLandmarkNet.detectLandmarks(imgEl) as FaceLandmarks - expect(result.getImageWidth()).toEqual(width) - expect(result.getImageHeight()).toEqual(height) - expect(result.getShift().x).toEqual(0) - expect(result.getShift().y).toEqual(0) - expect(result.getPositions().map(({ x, y }) => ({ x, y }))).toEqual(faceLandmarkPositions) }) + }) diff --git a/test/e2e/faceRecognitionNet.test.ts b/test/e2e/faceRecognitionNet.test.ts index f304405f..07cba39b 100644 --- a/test/e2e/faceRecognitionNet.test.ts +++ b/test/e2e/faceRecognitionNet.test.ts @@ -1,5 +1,3 @@ -import axios from 'axios'; - import * as faceapi from '../../src'; describe('faceRecognitionNet', () => { @@ -7,13 +5,13 @@ describe('faceRecognitionNet', () => { let faceRecognitionNet: any, imgEl: HTMLImageElement, faceDescriptor: number[] beforeAll(async () => { - const res = await axios.get('base/weights/face_recognition_model.weights', { responseType: 'arraybuffer' }) - const weights = new Float32Array(res.data) + const res = await fetch('base/weights/uncompressed/face_recognition_model.weights') + const weights = new Float32Array(await res.arrayBuffer()) faceRecognitionNet = faceapi.faceRecognitionNet(weights) - const img = await axios.get('base/test/images/face.png', { responseType: 'blob' }) - imgEl = await faceapi.bufferToImage(img.data) - faceDescriptor = (await axios.get('base/test/data/faceDescriptor.json')).data + const img = await (await fetch('base/test/images/face.png')).blob() + imgEl = await faceapi.bufferToImage(img) + faceDescriptor = await (await fetch('base/test/data/faceDescriptor.json')).json() }) it('computes face descriptor', async () => { diff --git a/test/loadWeightMap.test.ts b/test/loadWeightMap.test.ts new file mode 100644 index 00000000..554af1b8 --- /dev/null +++ b/test/loadWeightMap.test.ts @@ -0,0 +1,56 @@ +import { getModelUris } from '../src/commons/loadWeightMap'; + +const FAKE_DEFAULT_MODEL_NAME = 'default_model_name' + +describe('loadWeightMap', () => { + + describe('getModelUris', () => { + + it('returns uris from top level url if no argument passed', () => { + const result = getModelUris(undefined, FAKE_DEFAULT_MODEL_NAME) + + expect(result.manifestUri).toEqual(`${FAKE_DEFAULT_MODEL_NAME}-weights_manifest.json`) + expect(result.modelBaseUri).toEqual('') + }) + + it('returns uris from top level url for empty string', () => { + const result = getModelUris('', FAKE_DEFAULT_MODEL_NAME) + + expect(result.manifestUri).toEqual(`${FAKE_DEFAULT_MODEL_NAME}-weights_manifest.json`) + expect(result.modelBaseUri).toEqual('') + }) + + it('returns uris for top level url', () => { + const result = getModelUris('/', FAKE_DEFAULT_MODEL_NAME) + + expect(result.manifestUri).toEqual(`${FAKE_DEFAULT_MODEL_NAME}-weights_manifest.json`) + expect(result.modelBaseUri).toEqual('') + }) + + it('returns uris, given url path', () => { + const uri = 'path/to/modelfiles' + const result = getModelUris(uri, FAKE_DEFAULT_MODEL_NAME) + + expect(result.manifestUri).toEqual(`${uri}/${FAKE_DEFAULT_MODEL_NAME}-weights_manifest.json`) + expect(result.modelBaseUri).toEqual(uri) + }) + + it('returns uris, given url path, leading slash', () => { + const uri = 'path/to/modelfiles' + const result = getModelUris(`/${uri}`, FAKE_DEFAULT_MODEL_NAME) + + expect(result.manifestUri).toEqual(`${uri}/${FAKE_DEFAULT_MODEL_NAME}-weights_manifest.json`) + expect(result.modelBaseUri).toEqual(uri) + }) + + it('returns uris, given manifest uri', () => { + const uri = 'path/to/modelfiles/model-weights_manifest.json' + const result = getModelUris(uri, FAKE_DEFAULT_MODEL_NAME) + + expect(result.manifestUri).toEqual(uri) + expect(result.modelBaseUri).toEqual('path/to/modelfiles') + }) + + }) + +}) diff --git a/test/utils.ts b/test/utils.ts index e9dc2d95..3acb939c 100644 --- a/test/utils.ts +++ b/test/utils.ts @@ -4,4 +4,8 @@ export function zeros(length: number): Float32Array { export function ones(length: number): Float32Array { return new Float32Array(length).fill(1) -} \ No newline at end of file +} + +export function expectMaxDelta(val1: number, val2: number, maxDelta: number) { + expect(Math.abs(val1 - val2)).toBeLessThan(maxDelta) +} diff --git a/weights/face_detection_model-shard1 b/weights/face_detection_model-shard1 new file mode 100644 index 00000000..d851209c Binary files /dev/null and b/weights/face_detection_model-shard1 differ diff --git a/weights/face_detection_model-shard2 b/weights/face_detection_model-shard2 new file mode 100644 index 00000000..75123b52 --- /dev/null +++ b/weights/face_detection_model-shard2 @@ -0,0 +1,137 @@ +w{wr}|}n~w||~vt~u{{qzz{~|{~wzv||~|{}}|sz{p}izu}{z{y}|wyxu}z~~i~|{qt~|w~~ysvw{zw~~}}t~xy}{|z~pvw~z}u|vu~p|}~{wrzz~||}zsy}{}|y{q}{hz|}|t}~{{~}~|~}|~z||}~us~~~~{{~{z|~w}xv}~~|}y~|x{v{~{}}~|{{u{{zx~wq}ut~|yxyxvzv{x~x}|zsyvq{{r~wzzy{v|zn|~|{}w}|z~~{~|wx{vvtz|{|~|}{zq{}x|sz|{z|vvx}|}~|w}}v}}|tz|~}s{}p}{{v|~v||uy}{g}wy~{|}}z{r|t~zzz}vzz}||~}}~yw{~z|~z|{~|~zzty|~w~x~}zt~}ur|v|vt}x}x|z|{u|{z||y||~|{|v}y{||}q{}}w|~wp~y|{zt|{|z~{xw|u{}}|v~}r~{yywyux~v}}~{u{t{zr~~}y~zp}rgxz}{xze|w|x~}yu|s{y{y~x~xy}~xzu~||y|zz~t}qxwv~zy|v}sy{}}|x}{xz}~y~}|}wvrw|ww|yz|y|q}~|~~m}}l}x~w}z{oz}x{~z}|zy{x|ypx}o|ty}{xxy}}~|ws}}|nu}wvz{|}||y~|}x~|~y~{{z|}~yy~{}|x{{x|~|mzr|p|}|~}{~rtx|}wz}s|zx}~{~z|x}|}z~}}o~~|~x}|~}}x||z{{~v}wosz}{zuwwzn}wz}~}zuw|~}|~{}xxzw|~yu}}}yy{sw~}z~}x~{z|{{~}|~t~}~~zq~y~{~}~}~y}|}~|yx}}{y}x}|v{{ysy}z{~||x~p{{}~~|q~{~u|}wx|z}|yzzzw}t}zzwz~zp|||xt~xyuq|v~~x~~x|t}|}~}|}}{{z~uu|~{yuyvty|y~s|yz}w|zx}y{y|~~~z}}vyr}~|~}~zx}zvz~n~u{|~~~|~w{{|~}}}{zu{}}{|yzx}~y}|z}{~}p|~~yyjx}yv{z}}~vsz}{|}wz}zy}yl}~z{}}{}z{}}x~}~x}n~~||yx~urc|y}y}y{xy}{lx||zyw{~x{{{wy|~}~{}uzz~z~zp{~xsz~lzs~}u}}|w{~z{{z~{z}tqz{~{}|~{|p~vzzx|{u}{~p}|}~y}|wyywzz|v~~n~wwyvxy|xy}~z{~v|~~}~kzvyupy{y}|~|{}~}q|z|{}y}xy}||z~}}{{{w~}z{z}{~tx}||{}~ytrxz~}|z|}}}{{~o~{}~{|xz~{}l~zyxp}|~{ty||v|v{~{wqz|yt}yy}s}zs|xvwt}|}xz{{z{}~y}}{|yyz{zw{zzz}y}|{|||zy}}||{yp}ty}~|~~{{vzz{z|y~|r|tx~~}s}|upxx|}zw|v|ywy{v{z~vv~|w}~zty~{xv~qy|}}yo{ypwz{}v}|}}ryvs~xq}t|{}y{}z|r|}{s}{|{z{|}~zz||uz{~~{{}|xrw}~|u{{{qzxsw~x|{n}~z}x{rxvv|w|sz{{|{~~{}~|~v~zsw|w{q{xzt|xxv~|{x~}y{r|s}|{~wsv||wx|~{u~|zu}~y}~}x~xuwr~~}~wz~{w~yzz~uq|~sxnw~~{~|u|~}}y~~w|z~x|uzz~|sry}xv}||}wn~|zwxp|~|rzw|{wst~|}zwtq{t{vzmz|w|~}z~z{|x~}v~~z|t~|tvzx~yy{|}||}~z|uyyyv|}|~y|{tv~}~}}zv{w{wuuvzz~}|t|u{~{~|ryzwxyv|t~zu}o{vzy|}yx~xzu{{wvvt|xvxyz|yx~|z|ysyz{vzz|~{}xy|}~{}x{ry}}z~|zt{xzv~|z{}|xz}z|yxxszyuwzw~}~yws|{}z~w}|j{}~}|{ywzex}z|xgy~zy{{u{yyy{yuzxu}ytys}|}~{w{~~w~wx{x{z{w{xx{~~{vzusv{{y{zy{wvw~w}~nwzzw{kz}wyh|z~~zx~|vvzuzz{}s}w||~twxzz|z}{vsyxi|}z}z|{~zv{v|swt}y|{xOv|{zmq{|t|{{|zyyyw|y{~}~nj}z{{m}{sywtyzs}xxvz|zzvv}|||rww}||yy}{uqonu}|z{|}yx{~orsx|yot{~x}u{vtz~o|z}txx{sg}yw~}||}|}{}}~ayvvz~z|w~w{{yp{|y{r||z}{|{}{z}ylv|~}z{}|m~}}ux{~zz|}}xzy|~}ny}xxzwwk~}ywzs}}pp~y}qq{{ty|zxmxzx|q|~}{v||~y||u|us~}zyv|zz{yw|~~sx|r~xw~|{|~y~u}}|~x~{}wz}|y~|~~{y~|{||}nywyz}z~|y~}zwtz}v~}uz|yy~|qt}x{yz{{x~~}z|yo|v|{y{~}zw~{qsrvxs}w~}{r{x|wz~|||}zy}y|~yvn}}{vyyz{y}z~~z~}q~}v|u~j{v}}n|ww}x|v~t{vxt{|sx{y{}wwx}~||w~x~{x}~u~r~z{zux{w}~}u{z~}vzx{~z{}}~}|}z}sw|||y}xyxzvyy{|{uzuz|nt}~y{|zs||~|zw~w}xt~{qvwzy}}r~|v~|ws~~|xwy||~yzgy|zow|{{|o{vwx}|txz~ty{y~rwx~|{y}|x}~{{~rrtuw~}py{y}~}{zyu|xz~tts}zv~i~}{{}sxy}s~s|sz{}vmw{xrvz{{zy}{{}uw}|v||q}xwzz|^z||~sty~{z}e|~m}yxlzwzs}o{}y}wvz~{{}|}~~vvvy}tk}{}tz|ww{vxzw|}}}umxut|{}vwx}||}{x|yqtz|x||zzv}y}~}{ywi}|z{~~x~y|{yzy{|y|u{r{z}zuo}uuq~v}|uu}v|}veqwv|{|zq{{wct|xvzouux~uxz}{yz|~uz{y{y{uzx}~||pt~n}{z|t{v|z~}yw|sy|wgz~}zwz}}{u{vw}}qy{}}~|{yo~w}|uwuy|{{~|x}{{z~w}~wzs~~}w}}|{~~x{y{py|{z}{~q}}{q}{}~~z~{|~vz~~|zy{}wzx}z|s||r~~|t}|s|z~~xvv}z{}|~||{}zyyxxx|{~{z||~{{vv}zwk{}}|}~ysx||qyu}}~~y{~|tz~wz}~t~wvwz|y{}{xw|~y|z|w~}}yzj}~y}||~v~y{|{||z|vmy|z~{|z}~|wuz}yv~|tz}x|~~ws||~|yyyxyz~|}|}||s|z{}~{~{}n{}vu{{}|w|tz|}y{z{|x~z~~zz|~|wvzxsywu{~}{{wi}a}zwtwptw{}z|xu}ixx{|y}~s|t{{}|yyywnw}t|s|{yz{z}x{}z||~|}}pzj|uyx}P}}|}w}{~w|t|y}vu|~}}zozxxt~}zx~wyy}}}vwxppru~|}xz{yy|zy|~{~sxv~z{{wysy|zyy|~zq}ux|x{~txxj}yy~v||}qn}~xt}vy{}{y~uwsr|{}}{xot{}~wzt}|my|zz~z{{}|vwyz~||xw|jz{y}}~zw{yu{zv|uz}|w~z}|q~|{}{g||yyvw|}w~~{u|x~v{||x|swz|r{~v~y|zrkxwuntyzz~{~{zfm}}}y}rwz}s|z}x}~wvtx~z|z|yv{zzz|t~{~zv~|||k}zwy}t{yww}}wxmrx~}u~~zxz~to~{|zw}zw{}tgrtyyt{w{t{os|zpupz|{nwyxyvwzpz~xz|}}u{yrx~yzzys~yw~y{}x~zzwz}utwz|yy{}vz}}~~iqzz|w~}|ztyx{z|vvxqwnt|y{xy~zsuzz{v}vw}vzzz|x}l|us|wu|rx{gr}~xtuxy}zzzsq{rw}ntz}wnwy{~}~|rre{kozx~}z||vs}svzxmt{}w{r|qyxwyx~yr{{y~w~{yvzz~zw|u|lyxu}z}|vyzxj||u|}vuv{xk|{zz~}v}|tr}{|y{y{~}~pz}{yx|~w~t|}vt{v~v}}y~~{}s{xvz|w}wy~z{wz{yw|z|{w~}~x~}|~wxo{~}~}}~|yw}}}{y}|~x|yx}zx|}t{|x}z{t|yv{w{}}w}zwj}~}y~sy|zx}zy}~{{yz~~|}}x~{~}x}|}|}||{|}z}~|}}{|zy}y|}|~}pn}~xxu{}~t{ts}xx{|y{t}~}||z~}ty}|z}{||z{vty|}z~}{zx}|}|~z|z||x|}z||zt~}}{|zw{|}xt~{~|o||{}~{~}usu~yxwx|yy{yzz}x|wyxx{m|xv}x{y~~y|z{|x}~v{z|~||mwyz|r{{v{}|{}}ux}|xyxqv}~~|~zx|{wm||}{~v|xtz{||{wxz~{~~x~xzw~}|mz|~xzsxu|~vv|{tx~{xv~ywy}{z|}o~y{~x~|uovwv|yv}w~}vtuj{s|z{|tvy~xvsytvtpm|}qwu~|vzv{yys}xwos}zq|s~|}|u}}wo~utzwwu}zz{xyt}{|}{z}wtz{uxs|~q}{}qv{~|rw}z}xsrpxvy}|y}|xvzyt~~zxuxu{}yywys~yt{t{}u}}||z{yyt{o||}|yp}yv|k}~{ypyuz|y||w|wy}~wyzwv|mx{|vp{p}cvywsyy{{}z}|z{r~zl|{x}uw~zr~xsxz{~wyts~{}vtxuuzwt{yltt}q{~uuqyut}vv{~w{y}~|v}z}{~~yyyr}z~~{}xz~yw||ux}}v}xv{y{w}~yy~}y|~z|||~}}v~||}yxvy|x~}~{yyx~v~xyww{y~~~|{~y}wzt|~zy}{t||xy~{z}~y{uxx}y{{v}}~}yu||zzs~zx~}tx{~z{yy}}{~w~|{q}z~x{}||}}||~{||~zy~|y~zw~w{|rswryw{|vw{||}}yy{{qz{vuv~tx~k~{|}~|{xvy|{yy~{}rxsz|uz~~ws|xz~{x{y{vz~|wz|s}s~}}~{}z}~u~yy|uwywz|{tz~|{{}zsvz||{zyzyxsy}|z|wzzrwz|owxw~rzx{zy}zx~{~zyu~~wmtuzxpwzpzwu{{p{{}z|}yx||w|zzy}wpq~v{osqxz|~{}|z}z}yzy}}xxyw{u{zp~yrpxqw~zt{|~z|{zw~~x|v}pv}z{wtuxx}zx}|y~zx|tuy{}yzqu}|}}t}~yr|y{~~||uvy~}~zxvgtz{|{uh}zw~y~ywu|t|wj{||xzzxqzusrzw{vu{twx~}v{{~{v{srwy|y}ru|zrvzw}~{ytw}pw`~}~z~v||y{pxy|x{uvxvvsv}{zxw{zy{uv||{xw||w{uu|}yzbyxz~ztvwry{{ypzy|}|zxwx|x}}q~jx{xuyw~}~xw|}q}|xyi}ywxzyevyx~w~{}m|~wvsz~}}uxwy|z~xy|r{{}y}}}{~}~|z}}q~}~^zrzw}kyv|{ty|zzwwxz~|yx~|r|xw}~{|zv}g|yxy|s~xx{w|y}w{|{{|szyt|{zx{y~|}|s}jmyrz~|mvzy~x}x|y~v}}y{sz}{y{s}|~{{~z{wv}v{rwr}v~}xxzsufw}yylzu|ux~z{uxz{zy|u{||xyzx~~zpkxa|{vz{}{y}lzs{|w|~xtxz}z}tmy~wkv~zj~~y{}{x||z~~}{|q|y}yo}~~yas|}yy{o]p{x~txy~|}zq~w{|z~nov}}}yz}{~syz}{~ks{w|~~|~~{z|}u}~yy{{}{yv{~{y~w}w~ys|~ow{in~}uyzt}zxzz|zy}}vw{|~z}}{r~sut|pwus|u}zx~}}}}~vy|u|~y~~v|xyxxwux{}u~|{wyzt{{txy||w~z~}tvzw{ox|}}~{|}{tw{yzvv{~|}}z}y~|}}{}w{{~~}xxzz}rv~szz{op}r~ust}twtk~z~r}{y||{{x{{ti{~y|zyxu|x|z}|~}z}{s{xx{|w}y}|{}|{{|wvy}wx{{{{u~xs~}v}{z}vz{ux}yy}~}vzx|vvl|{w{}|uv}{||}xy{yw|{y~}{nq{~|v|{~{xx}}wy}|roxw}{xwuszzv}{}}|zv|}y}u|y|{~zk}z}{{{~|zz}v}}uqq~{|~zz}}zxsu||xwx}}uo|uwyr}v}{{w|x~y|zy{x{{t}y~{x{y|n}x|{|}vuwwwy~tsssu~{vxx~x~x~tvxyzxxvsr{vvzx|y~}y}|vu|y|}y|zsx|~~y{|}pyur{s|xzy}~x~}r|xx|szzvzws{yrz{w|y{{xuyt|qy}{wwyzxvv}~ruyq~u|zsvux}r~|}~t{zx{|~q{{v}y~xwz|{~ru~zzqx}|txqr|{r{v{zuvqx~w~xxv{x||vz}t||~~xv{~y{ssv}xu~zxx}z|mx{t|}|{zrv}xv}wy}}|~nwtsz}|yy~{zxxyzz|zz{z}{wy}w~~{x~}~zwzux}vy~j~}}{t~}xu|}~y~||z~stuzy|v}}}y}~~ywxzz||~m}{zq|}}{x}z|{|{~w~{o~y}}qxz|{t|}{}|z}|}z{syxs}}zw}{|x|zyv|z~}~|wz|~yysx}{|{zz}~|vz}xyy~q{}vu~z~|z{}z{|zgu}~pzy{x~yxxuw|~z{|xv{}yzu~|}|v|w|}{x{z~zyzv~w{{~~~}|}yt{~yq{~}~y|}yw~~xs~ysy}|{xy}|x~v}||v}|yr{}z|st}dxyzz{}zsw}uu}}v}z~t|ryy}yw{~uvyuzx|yu{w}|||~}~{~z~|zzzz|sr}{}{qx}~|y{yy~yz~}{zyuxy|q|{|vw}}~}|||uxw}pypyz}{zy~|rw|w~ur}~{wq{uy|z{ry{}|z}v{{}xy|wpxzz|~{~|{}xxi}{||~~~x||z{q}~~w{v~usx}}}}~~{wfx|xt}vy}ztzz|vy{uq}z~t~w{z{}y|}}~|~|wu~}tn|uzy}v}y{s|pxxuqyywvp|{yz|{u{|{{z~}{xz{}u~u}zt}x|x|||x|zwsyzr}}zy}}|~|n{}~ty{wzy|y|qy|{z|{xxs}{{}yzx~~~x~y~zz|w{z~u{}zyy{{~v}{vv{|~|wx}|u||ux}~ys}~|{v}y|qr||}z}w~y}~|}yv~{{{~t~}}zwty~u|{uxy|~vuy}w|z~z~|w|{|~|{~{}{~~x|wyz~xzyy~wz~}y~x~{n{{|{|t~{}}yw~~q||zvxw||{~}}x~szyqy~~y|x{}{u{}}~}yyuvrz}{uxq~}~{|{y~x}|y|}~w~~|}szq|{w}}~w{{w}~{}l}~xtz{|}vvqy}v~|~~y~|y{~wx|{t||z||}~z{z{z{{zz{{y}{|sy{{~}}}z|{w{{z|lwx~~z}oowwtry|~y{ww|x{ww~{sug{z{zyz{{{mo{{vx}|}z~{|t|wzw|z}z}zry{}~~~}w{~x{|p{{y{uxx|{uywy|zz|v|~y{|x|x{{}y{}t{s}{u|x|}}ut~v~}wx~{s{|vy|}xt}vwz|{xwvyx{z{}}r~{}{}}x}}wy{xx}wyzw{w}~x}}~~~}xy|~}~~{yz{|~|{||s{{xyzx}pxnxxvz}z}y|y{wwxzz}|x}wxztt~~xxz~yrvyxwwww|pv~|x|u}x}{sru{v|~zzz}xz|y{w|zxw}zyro}|{}{~z|y~~uvx|~x}~{tz}xyuy{~v{w|~y}xst}y~w}r}wz}{h{s||}~n|z{|z}z{|y}|z{y{v|wx|}y~}zv~|~}w||~|||{z}xzyys{~w~|}xsx~xt{z||xyw||{}y|}|||{~~x~z}y|z~}~}|s}mx}xmz~|z}|o}ziz~|w~}vz|y~}z{}}~~}~ruwrz~~}~{z|{xz}uxz~}}x{z}vv}z{~tzy|z~yx}~zs~yx}}~y~{w}}m~~|~y}~}~{x~~}~vw|z~s}~x{w}zvn}x{}v{t|{~||}~x}~~z~yzt{~}q|z|~u~y{}~~{yy|vq~{}xz~x|{r|t{|{|z{~~xyqzq|yzz~zy~|~{x~w|{rw|qm}}kxzzs}smyyt{wu}rvuuvqy|{}{wz}{{y{z|z{|zszw}qxx{ynqwzu|}xnysvv~}xsyt{|}}z}~vxtu~}~w~l{u||sztpyuzu}{~t||h}~~wxx|x}vy~o{v{{q|z~{xv|z~x{~~xvx{x|v|yw~rxwss~~{{qw}uy{}~xwy}x||tww~y|zwz~{}t}v}}p}ryzzzs~yprzuz}}uu{ryzw~v}}z|xly}x~{}lzsx}vz}bmy~w|{{|zzx}||x{w{~xvy{t{|wh~q}vvxw|||{{vx{xrv}y~wmypuzyu}z}xzt|z~z|~~v~wvxxv||}z~u|xu{}s}}v{zzzv|z||~{u}|ju~u|tz~{|~xus}{}zu~ys~|srw{z}v}|u{z~{~{wz~yy{}}{zyzx|{|}xx}~~}{zz~z~vx{}|oy}qr|z}zzpr}o~~u~nytxtz~~h}{ys}|z~zsx}xy||vzyw~znz{yn{wy{|{~{}{oyouwzvw}{l~{{{qy}ywzuz|{}~{{}o~~|xw|wzwrsx|~y~o{|xx~z~~|}|||}w~|z}}~}y|y|tw{}{y}{}{o~y~y~}}j}}x{xz|w||~u|}|t}styz|~v}tzuuoyt{}xyzr}|juw}y{~qq}zv||y||s~z~zz~~|{|z{p~t}{zq}~xwv{~tmt{v{}||}yswvzw}|v}xszf~~}q{t{ynuwtz||w~|{{~|}ys~vx}u{xzwqu{~uu{yx|q}p~r~}t|{y{y|tu~vpjw}{~x|ztt}zyzuvt}yx{yy}~~wzz{}~zlsx}z}v|v~o}xquzu|}y|uy~~v|uz}nv|y|oy}y{||ux||~|t{zvzttxuvy{~|xut{v~srnwzzyrvv{|s~{|}vyx}uwq|}uzu|x~v}z{~xy}y}w}{wzq~zz}p{|y}qvuyvyyvu}t|n{|wzzsx~uzx{~v}t{yyx}}ux{w}|i|}rx{|zv|oxy~yyw}qyzwzz~{w~vvstz{~~|~}|~s|~rpz{}v|}zy}|~wyc{x}|yxz}}|xz{{}v~w{`}xzx|sy||ty{{uzsy|}z}y~~rxx~py{x~}~~|tnvrz~~y}z}yox}}zvzf~{y}zy~~xy}{x~s{|{z}wnx|}m{{{~{~|v||^{|zy}{~w|m{yzzm}s|y}{szrztsu{}~~xq{syzuxu|o~{wy~{pq|z{~xx~}}||w|r~w~sz~fmu|{txz{w}zwy|z{|v~ztuvx{wuwyq~}}}~|ywk}xxyu~qux~}h{{w|x{}w|{uznpvy|yw}p{tzx{z}w{~|~y~{y~mv{xu{qn}~scquz|xjk|zyz{}z|}~myzqvy{}{{yuzv|x~w|x{z}roy~~t~{zq}~{~|~~ouzyy~~{y|x{zzw}{y~zzyt}zz{}yx}|}|ww{ws|{|z}}~{x{}}y~yzn|y|wt~}u}|s}{uyyv~z{}|}{x}{}v}{||y}utyxz|yw||xzn{|~xy{{v{wwyx}|{}~||x~utw|z~zsrynyrz{tzz}~~{{~~||{zwx{xvvyq~~y{~z}y{x|~vy}|{}v}}{zt~xw|{q}|z{~}}|xw~x}}|w||}}|{}s{ot}}{}zxy}}w}szvzt{y~{{~zwx{}xzs~~{v}zw|}}yy}|y}z~}zv}z}{xy|ixt~wz}y~wyxz~qvvw~y~}l}z|}zoo~ux}z|xtz{y|~v{{{ptjwyxyxwt{{uwxpzy~z}~x}}twyy~}zy~s~{|{~}}{~x|x~}x}|}~}||hp~v}ovxz}}{quu~z}j}yszp|wq}z|}~z}{{u~l|~g~{a{x|w~xy|}}vzx{s~{}{}s{~}|zpp|uyz~kx|pz{zt}yx|{yy|}|}nyz}wzzxz~}wqy~~w~|}wz~{~w~Lzp~{}k|~zv|~|}|y{x{}v}[}{}{y}r|x}xqtvz|yuxu|{|{x}~~f{zx}w}~y|y{q|}w|}y}z|ytkqvzvvxsv}}uv~}~ty{muxw{vt|z~zxu~z}z~xequz{{tv~{}|{z~rxz{}~|{|xs}p~}z|{}~zxz}|{z~z~sv~|}~|vz|x|~~ot~|yx~z|v|s}}~}~z{|}~|{|{~}}w|zv|o}zz{}~|{|}x||~x{|z{w{~z}{|{|w{}~~|z}|}z~x}x{}|}}}v|}|yz~|~uzt{zy|{~v|~~z}xq~}}g|}|zzyzx|}}}~|~}~|~}yzw~~}x{|zzzx}~~yyzt~}}{{}w{v~~u~r}~}|z|}}|{v}z~}~wy~z|w{z{w_z|o}|v|wrzyuwv~zt{uu~||q}|{yx{y}}|rt|{||z}x{|~z{z~|~|~~||}}|{|xyy}tx|~~x|~xv}t|~~z|x|z{u{|t|{}z}|rw~|}z{w|wwx}z|~|~x~yxo~zwxr|z|{z{z}}{y{zy}xyzw}|st|}}yx~z~turx}~}y~{|}}|}o~{{ys}y}{}}w~~yy{qtx}|tuw{{y{xt{|xw~w|wz|wmq~~u|~~{wxy|{~|}|m~{~}|}~xz}v||s}r|rwx|oxy}x}{~z}|v}||{~{zz~||{|ww~y}nz|||{zx}}{|{|{y}x~|~|~{~|w}~{}}|z{zzt{z~{}|}{|{yz}yuwx|~}~}z~x{xsx}~wv|v{yyzz}~q~{|zww~nvvw~{y~|{{yy{zz{w~|q~||}y|ut}|vwy}}}}x||iu~|w||~{{||yx~v~}z|}{xu}xy{x~}|~z}}t~~z}y{{|~}y~{}x||~{}{t~xviz|}v}zx{~yi}~vy|{z}z|~{~~wt{ry~~{||~y~w~o}~j||}}v~{t|y|~~|~}|zuxx|~}uu{~{|ygn||~zt}|}o~wx~|y|~y|o|ywyz}~||}{~~}xy{|yx}{~ywr~z}x}|}vot|{t{v{z~x|yp}m|z}j}y}zuv~v~st}v}}|x~n~}t{v{~}|zyzy~wv{yw|n{}z~{v~}{||~~}{z||{x|}{vvt|xx{svz|{wy||}|lxn|{qyz{}n~z|}||sypyx~yx~~}|}{{y~}}}}{ywwx{~~v}ux|u}}|ny}~x~rz~uz}x~|{tzr{}wwz}|{{{}ry~tq|y{yy{{w~jwxxzy{}y|~txzy~x~}y~z~x}vlyo|pufp}wwp}}j~||zmtuz|~}vyy|~|yv|w||n|}r}x||y}~||{uxwyywz|~btx}{z}||nl|v~yz{z}|{yv{|tyyvuzr~xp}zit}}w{|y{}|{~~~lwv~x{yv~w~s{uwzwzkyr|rovwx~~~}{nvzwxtxx~y}|{xyyyzy{~sq{wsxxyzx||{yv||~|x~w~yqy{yb}x|zwy{~zx|xt|~~wo{x{zuywzy}|~z}yu|xoyvxww~~qvztzj|x|ew}v}|vyh~~{qq~yv}~i|w~}wzvtx{yozt{xy}yoypysxvy{}qtz{w|{y}}wxz}~tutsp~{}{t}jzv|u|q{w{{sq{zyw{zomy{n{yxx|{oz~{mq}y}~sw}r{{vqxyvw~t{{qxx~}}~s}||w|}|m|@l{||q{q}}l|xx|w{}zo|{y{w{~}xvuy}szt{}yv~z~tzywlu{xw}yzxuy}}{swu}{zu~v}uvwxkyx~ytzy}}}vz||||~~v~nozv|x~yxv}|~{oqyxwsxzv|wtt{~qdxwv{{y}w|q|ny{|xvwsypyyux}}ymz}w|~x~{vp~vsw{vywzy~}dyyjR{yvj{k{yqy~yy|}|~{lxy~{xlay|r{zVyxywzorwvutlu}{v}~vr{~zzyxpw~|}wqwx|vpp{qx~xzx}u}~vs~|v|{}t|yp~}z~y`wr~|zv|x~~|~xr~||y|z{z{z~{yu~{z|~{{|p}|tx~|wvv|y}}}w|z~zwx}xy}}{u{~{{o{}unsz{}t|y|{z|zp{y|vyzttz}{~{wxyx|{}{~yz{k|r~o~z~}z~|uz|w}xs|~}}x}}zs~vw|~{w}{oyzu|x{v|wvry~~v~}z}y|}|z{|}|~||yy}{ys|puxxuw}xzz}zz}w~~xzw~}s|zt}~yxyx{~}}}|}z}t}x}}ys||z}{v~{vzx~{~z{wzxzzzy}}wuy~ys{|vz}iy}~sx~~{sxos}uxzy|~n~}rs~u|u||wzxz~~xy}~~|xww}z~wz{{~uztxxwzvu|z|r{vzq}}wv~xs{}z}}y{}zxz}{z{~ivx|{}z|p}w}|z~~vyu~y|{y{z}nv||x|tto}zxxx}u{{}}~}y{~}}y~w~y}vxvy|{|||vxwwu~{~~{zuwyv|{iu{x}|v}o}|u|}}zx~{~m~y|z~yxu{~}|uy}{}~~yzz{yszx{~|z{w|{xys~~wt{~z~t{|{yo}y|~s~vp|vyx~z{xx||zz}x~uz{w~}wyr}{s|w~w|qq{~{v}z~}t~~yvx||m{x|uzz|r|q}~xpz~uusy|zz||~~pzz}~{tzy{z}tyz{sw~}{|}zsxv}}yytzxo|t|y{st}{qxx||y|{s}{yy}|uxws{{xuz|q{yu~|u|{}~~|zzz}y{yl{~~wxs{xvws|{{y}ysxqzr~rx{yzw~vv}t~vwxvy}zzv}u{y{uwx~zsw}y{x{mz}syzxs~zzuwvzzxz{}y|xyx|}xn{}s}zz}x}p|r~{}yv{{vww~|v}z~zvv}z}}~{u}{zs{xzu||o{z{}wyu~~n|yw{|||wy||yw}v~vvv}z~xx}}p|}~ppvy~o{~ss{xts~}{|yytw|{xzotnu{|~x|~{w{{|t{~wxx{swvz}{riy|yzy~pu|ypuy{~|}{~zu{x|u|{}x}|ztg{vyy{|~rz}yx~|v{y}|x|y|vw|v~vx|r~}xu~{w|||{yxo|||rzyz}p~z{u~w|xlz|zn~{w{{z{||~hru{{yzwk}|{{}zr{qtwu}vws}}{}u|k}|z}wzx}t{}yy|s~qzwv||r{tn}}wu}zpts}~{~uovj}sv|xz{{{~{|yw}~~uu{uuw~v{~}t{z|}{~|~{w|u~|~t||zys~z~w}wrxo~}zTo{s{yx}~yx}t|}t}|y{t|txwy~vv~wq}zw~z~}{sw|}||~vyr|z~z|zvyzxytzy|}tvy|{wz}x~y|||~t~szt}xx{|zrwzrv}w}yyz|s~y~xzv~{yx~|z|lyx{yuyzw~}{{~~|}~}w}|{|}}wzp|xzzvxy~{~vy}v}{rwyw}x~jx}wwvz}}z{zt~}{|p}vvyyx|y|v{|}w}y||z|x{{|w}||}{}}ry~xw~}st|}}yx~y}{}ur~k}|pz}py~y~wzyw}}xv|zr{|~p~w|{{yuw|{}{|~s|vy}y}|~|uz}~yuz|}zx}y}~||jz}~umz~{y|}zw{{z}}{{}}x}~~}x||}|}x|~{q{{}~y{t{~tz~~|x~yyyx|w|wvv}vzr}|{{|}wyy~us~y|}|wzs~{~~}~xw~{{||}z~y{~{wz}tztvx}}vx}zw{svz~t{s~z~xz~||yuy}mv}~t||zv{||~v}s{}~}x||}o}y}v||yzszzw|~}{{}~xy}~}{w{z|z~~zz{xys~~v{{{~}t~~z||~ywux~zd}{y{wzozyz{z{t}yxuzzwozyx{svr{{|r~~||vyv}q|~|~w~|yy{}zz|~zz{{yu}x}{rwne}s}}x|w}z{{~}z}zwx|{}y|xrz{ywgy|ztwz~tw~y~}||ty}qsp|w~}ww}xu{u|}}y|zu~xjzz}y~~xt|xs~w~uv}yxv~|zx}|{}yv}{v}|{vtxxyw}svw~vz|zy|ztq{qy|zv~yyqzzzvq}{{}{}u||u|ssx|~|~}{u~{|o}xvv}vx{q{}{zwyu~qq}m||zx|xz~{}zwx~}z}xw{}u}ywzxy}}v}|{|~z~}||v{qz{}{{qu~~tvz}x{zz|vvzxy}{zz~xvzzyz~|k{~||}x~}y{z~yw|y{y~uz{}{|}{z{t{yyy|x|oy}x|yxzu~~w{r|||yxp|~y~yu|~}}||y|y|uzzyzw~~{}w}y~z}t}x~z|~{||}~y~}~u}x|}}sz{zq|}{|||{{z}v~o}}}}z{~}z}~}~|zyyw}v~~~vrqz}ww{{{|}l{z|z~||y~|yw{w~}}w}{|u|{|~}}~}{~|}{||~w}~|{}~}z~y~~|n{{}|w~}{~|~u~~{{z|u~~y}xvy||zx|z||z{{~}||y||t~~~{|}yt~yyw~{s~~s}{|m||x~tyzz}~}y{|zzt|}|~}||~y}}x|uyzy}{}|{~tn~u~|~||~y|{}|{z~{{{v}{}|w{x~z|yqw|zy~~s{~{||}|{s{ys}~zx}|v{}zyx|{lzp~~rz{|{z~z~|||w}zxozt~|w}|{|~{v|twrxzz|wy|~}|wz~|v}}wx}~~}ws~{wt{{y|{yy{yxzrz~z}~x{}wx{||{z}zzx}pz}|~z~~~zy{||u|}{{s{v|vz}z~z}vp}uw}}{xxzwtu~{~~x~uux}wt~yy~wxwyu{zt~}{{z}xv|~sz|{y}}||}ow{t{}t}sx}|w}zo{}~|t~|x{w|uv|{{x{~h{~r}yxu~u}}}{~{wz~}}zy{~uy|z|{}}{{|y~~|}~|||pvy|t{{{rsqy|}yyw{{{w~zy}{}zzy}}~}zz{{||zxww|{|y{y~w}}~rt|~~}~}~w}t~uxs|uz{{y|{y~w|w~zz{xy~}z~z{zzxwz~t}szwvz}zyv{w~x~||y|x{{y{u}wzz{{uvy|~z~|~|uyym|u{||o~|x|ty~~|ws{~~wp~~u|~~{}z~|xy}u}}~zpt||v|zx}pv~{{z~~zqyx{yuz}|{{|xy}~yy}{y|y}yzw|}{r}|y{w}r}~|y{x}|ozz{{ytzy|x{|~~|}z|xyw{}~xxzz}|{~}~xy~lr|{uzw}xqyy|x|x|z{}|{}}y~~{}{{|}v||}|{~zo}{{x~}w}~~~z~yu|{~x|}{|vz{|xy{}{}z{{}{~yzz}|zou|~mztx}{{~v{}}uz~zy~~y}{~|{tzzoztsqt|mzy}|~|~~{|z|z}zyu{z~|yyz}z}{yy{u{v{|z}}y~|}v}wvx}y~y~wx~{x|yt{syt}~y~y{|{}z}||z}}xr|zxzzxqwvuz~u{s|l}}zz{~|vxyx{|||y|{}|vtxwy~~x{{qsz}tzpz|y~~y|z^{~y{}z~{t~|t}wx~||~zzv}yzx}t~}w|{v}}wztzvxrx{|yuy}}}~zyztwtz}t{~~}}{}|yx{}~yw|||~p{}t|sy|yy|zxzpzzy|}v|{y}t{y}q~t~}rz{|z{y|}uysy}{zz{p~syuxyzxy}{w{~zuz~{|{|~}~k|v~~|rwunsjv}}wws~x}zz|{{_m|}yxy|ml{u~|~zuspj{~znwzxzu}||v|{ny}yvst~uxu~~v}ythulw{q|}v|oo}x}}{xyyuvu}|~xt}|{|y{v{|xpwu{hxswzzi}~}tszxx~xw}uj~~~u{z_{zw{x~nzz|v{}`{m|{szd}_znov}{yxz~u|oql}x|_}uywq~|yos~umy|xs}{zl||}z||{krz}~{|ru{||uuv~~~o}z~ywxm{~xikz|xsxxny}~{z|yyyysz|}ot{wznzptry~z{{wq~ne|}zzzwvxz|zu|nsrs{w{~wo}q|oz|l}znvgxu~~~q}myrwj}yqwu|~~~~~~ou|z{vo~w||w|{{z|{}|{ts~~}{szzztyhzjzw~}}}||~}}|w~x|y}|~|s|{y}}|{w|x~y~xyz}~{}|wy|u~|~~}zz}}tynw|{|z|y~|y{wxz~}ut|{z}~~}~~y{zzt~x{z}|{|{{uw|{~r{~}~~}}{}||xy}o~}|w{}tx|xz}zvzyv{}x~p~yz|yo~~~|zztyz|~}z~t{~|y}~pswz{}}|}zo}z||{p~|{~~}uyuwu~|~~wv}t{}{qzxz}|r{y|x{|~{||~}~r|zty}~v{y}z|{~~z}z~}}u~}~~||~}|ur{|~x~y}{xyw~{|{~|t}z~x||}}s~{~uy}~{y}{~~x{x{vyx{z~yv}}~|{x}w~}{y}z{}~q}x|vvw~{}z|y}{zyvzxz~||}qwz||vx|uzx|}{|~rz~z}}{ztu~|wy|wvyy}xu{zq|}~{}x|~uv~v{{z{{zxw~|gz~|{~{y}wwv}rz~|}}~|z|y}}u}x~{x||suxw|y}}||xl~z|{w}xy|~x|yyzxz{kuzzty~s{xy~~||~}u{z{{|x{zw~|ztzv|u{}~{|vzyy{}vv}|}z{xx|up|wzwr{~~}~z{u~uz{}}uvzyz{xy~}|{yy{||ry~}}z|zw}~{|||}||zx~wz}{zrrwyxs|py|~{t|y}wt}sqz~v~|zys{{x~y{|}q{|}q{}||vj|tyqwto|y{wxy~~}y|s{r||x{wvzSnj}}v|vtx~{~~wn|y{zmy{~y}|~}~svw~|v~~ua~|vy{rr|w{}{~|{xp~y{|}}u|t~uxx{~w}|xy}}zrzmzzth|p||yt}vyx|tu}~y~z}|||{|~}tyrx~{y|~yw{zpyvu|~}|}z}{~{~x{tn|zz~zqwyy~~m|w|}}zwxnz|tzmlz~zvzzryy~vwlst||~ux}xmu|}w{z}muguo}x~z{zpyy|zt{~z~|zzx}vwx{z}zvv}m|k~}zy}z{||w|{zy||~z}~~zv~y{puzxz|w~}{jr}uyo{wv{x~}z}w~v}||s}~z{z|}y{{n|~zr{u{dv|{zk~||p{}{yvz~}yz{usvy|tv|wi}yus{{z~x|y~wty{}|pywyzxxz{}yzumy|{tzsy{}rvt|}ry}}{}x~z}y||z{ypq|s}srzx~}|~|x~|ytxu~sqwxzq}zuxzyo}}{un}|}yy{~w{w|{x{}yv~y~{zzyyyvxz{l{y~uspxu{||~tuyvxzfv{|~|xvqovww{xs~}}|ysv{}|vy{~{~z|os||qyvzoz}}{xzztt{s{~zuuky{}zvxu{v|}w{xrzx~swt{w}vzox{~{zuz}{qx~wp|n|z|vrtu}qw~}yXz~wx|ywu~z|{{z~{t}q{zp||vy}x~Y~{{u{uU}yvUev}{||kx}pzx|}{u~u}x~|{}|d~|w}{|{stv}v}z}{~m~z}~~~x||u~su~|zt|}o~rs~u{~~|}x|x{yzvy}}vx{p~|syyuy~x~zxwy~~}|}tsyz|}~r}{}vZ|}}u~}rq|yquy{{wyw|{~s}|}|~z|a}{|v|{{zu~z~fo}wxv|~h{xuy{~~syu~{o{y{~{~xv{z~tp}|v}rvy|r{uwsx{w~xt{}vtzv|x{xvwktwpz{q}yxmzv|{ytvwy|}y}~|w{|xzq|{~{||||~|}}oy{~||y~u~~xw|{z~pp}z||r~zz|nx~|qy{~y|~z~z{~|vwz||~y|||{yxp}}|y|}zz|~v~{zx{y|yyx{xpx}|u{}z|}x}}~|}{xt~z{|~y|zx~x{y}x}|yt}|}~{xzvx}}i|{|zt}z}{||wy~|~~z~~{|vzz{|r{u{y~}|x~yz}|{zv}{}vxwv~~x{}z~}q}}|{~~~h}t|zt{~{v{s}z|}|~}{w}q}|}w|~~tux{s}~}~w|uz{}{}y{o|v|{}z~xzy~wwwv~p|z{~w{x{|w}sy}|v}||x}ypw|vyy{|{~z}|rs{}qzy|k}u|m}{{~~y~}}}}vwv{{x{~}}}{y|{~py}|yv~~{z~|v~z||}xyz}z|{}yww~}{~{ty|~{~yz{vza~}i{~sy{x}}z}~}z{|~t|}y}z~|}z|x|z|{yx~rtv|zxwru|~z~|k}t}x|rw~z{my{|z{x~{~|~}x~{{~|}|}p{}|y~s}{zv{~|uy{}~k}{}v~}w|~v{~~{~{{xrryt|}|{z~}u}||{~z{||{u{yy~||m|~~||yqv~~|szy{z||{~~u|{}|{}~wt{w}wt~yy|}}|yutzw}xv{~}|w{uwy~|tw{{{x{{{}|yop{y|rwn|}~|}xxj}xv}{|x}qq~v~u{~yz~s}vv~yz}}~~}w~{s~|uvw{zwvxx{||}y~|uysz}{}{t{yw~}x}xy|{~}{}z|~v||||~z||x}|xwyxn}||zw}xttw}y~z{|||yu~y~w|~x{~uy~|{yp{||zy}{w}z~{x~}{|x}upz}}}|{~}{~y}~}~}|y~|~{v}vuxr|}zzx~w}t|w~v~w|z}~}y}w|{~~}}tw}yy}~z|~{}}y{{zz~}yz}|vzy|}v}}t}{}}w{z{}t|}y}|yxxzq~xxxy{}{~}}|}ux~~x~}|~x||~xv{|u~|zk{}~~z|}xs}~|}}yzy~x~}}{}xvwtv}}|~u{w~||z{vp~~~y|zw}~}|w}o|x~x|}|x}y{}}v~x~y~|zxuw}|y}{xqrwx{|x~{z{vv}u{||{x|s{}xr}}{{{~}yx}|p}|~}cv|{~to{o}~{xw~x{{}wvzrz|xwqrz{x~{zx~xwvx~txyyzv{z}}||}qyw}rx||~z{{rxu{z}w|rwx{~z}~~{~s{||{t|ypx|~}z~|y~{z|y|~|y|wyz~vt{{s}}ywz||v{}~y|{uw~sww~z||n{yv{z|~sxt|t}{{{|vyzv}{yw}w|}{|{{yw{|x{|y}}vzzz||yy||qryyv~wxww~x|mzy~~zxyxz}{zw~xry}u}tx|{~{}}|sr}|vu{|{zv~yv|}}y}}v~|xn{{vzzy~y~|{}sz|{}x~ww}yl{|zs|~y{v|zx{}zxy~zw{szsz|nyzy}zx~~|y~{{ywvyx|{}{z}}{|yz}~y~{tq|v}w{}vx|zt{~}y|~{~y}~{s|}{z}|~|q{sz}}|{y{|~t{|}}~}{||y}n~x|x}zv~}~w{r|vw{w||t}|}}x~z||~uz}vzvt~~u|p{~ywu{qx}zz|x}}y}s|vu}w~s}{o}|x{{w}s{}{ttzy||}~x|z~ywr~}x}||~{}x{~x}y~}x~~{yzv|}~}uxw~z{|pp~{y{}zy||~yr|u~|w}}e}yupnqz{}vy}r}sx~ykyy}~|{y_yyz}tmzzz~y|zr~y{z|~}}|}s{~~w||}~{{zyxyz~xz}yyyy|t}|~z{||~}ty~{~~v|{|x~wy{|n~~z{w|x}vy{xtpw|xxz~yx~}{vw{~|~zsxx{}~~{~}y{~qq|}|z|i~}x{}}}}{zxzxzzw}z}|s|{px{{}}|~~su}sus~tz~zy|{u~~|~ww|y~vxz{}|}}sy~}|x{|yzzz}}~zwtxy|zy|~|{z|~w~t}z||w|}}~uw|{yzzv|}}~w}|}szvz~|}|vx|{x|uzx{vz~|~zxy{|x|xyzr}{~~|}xw{w}xy|}{~{v~w{~w{}|xvmzyw}}|~}|{}||}}~{~~x~~~{~~yyx~{}{ypw~w{x~zx~}}|ynr{~tv~qxy~}~yy{vww}|~|vp|p{~tpzyzz|xs{x~uwt}~}{zx{~gxvzrm|wxn{rz|w|||t|y~vtx{zx|x~~y|yz}zytw}uv~|v{|y}nz||{vz}{|{{|~}|w{{z}y||w{mxwyl{q|l}}|z|zz~z|vy}vz}z}z~||{{|xx|zw{y{}uy}}{~{huy}wwxa{{xi~|||xqtz|{sw~w~sysy{~xw}o~y}y}~|t||{u|y~x}}}{vz|~}z}{~}vwot^vwx}~v~xy~zx|~y~{j|~~~|x}j}tz|~|x}sx|up{}~tvzywyx}{{{}z}}yyruw}~z}e|q|t}sx}}qqt~}|}y|z}zx}zy{x~~u|}||zzwxwx~~{tzwy{}}|xsq}|qzw}zwu||w~{z}{~t{{zx{yw}|||~~~|}yzw|y{t|}x~y~|{n}x{s~w}}yv}|~z~v|xz}}}wzxy~}mu|z~{~~|}~xyyy|z|~{w~{u|z|yzpv}|zw|z}}tr~}zx|}}{wn~}~}|||~}}}}}}|wz}||}vv~}~|~|{f~}}|}z{~l~}|yy{~u}r|zyzt}x{{~||xzyxz}|o|}{v~rz|x~{xu}|~z}x{|}~v~{x}}yyyyz|||}s||wz}xz|z|y}~yywy||}~~v|zkz~|nt|wzw~{|{|}szxu~~uwx{~~}}|{~{~|}}tz|{}}x~sy~y}|ylz}{~{}ru~{}yx~qvwyyv{|ywezy~{{~rw}|ux}~xrzzu|zx}|~{vswy{|xkxv{pww|wwu~vx}y}~y|uqrt|~}rv}u}}{~~vt{|wy{z||~{~}xwvutyuzwzw~zn~}{zlzs{y|uus^z{|~{~y}~xyy|{w{{wu~zwj}}zvimu}ywyz{||{yx{{zw{}z~ry}|}|{s~xu~o}~xxzX{yzzw{ixpy{~x}}~xw|~~~{~{u}|yw{x}~u|~}x|{zx|}xpt{}vlu}y}yy||v~y{q{r|y~zut{}~}uzt~~t||wyv}~wy{}xx||yw|wxx{~ry|wxp}t||v}{{{z{y|zx~~{wyvu}zz~|~{~p{yw{|x~xzqz||yuzz~}}|vzwyw|wrz}}}|}r~}xvywzs~q}|x|~{~~s~yx|w|wzx}~w||x}r}{w|zzv~{w}x~x{|y|wyxwt}q}{xvvp|}ptq~}~{wsvyxx~x|~{wuzvwv~zuwvuz}zz~y{zyq~z{{z}szur~zyxwyx|~|qvu}w{~zz}mrvyrutt}{||y{tw~y{}y{}{{w|zy~~{|}|trz{uwt~yyw{w|~}}s~}v|z{z{|}|r~z{{~}xyy{y~}|}{qt{ww}{wuy~sswxx|ss|{zw}uv~{{{z|m{ty|xxs~~x}|uz{}}vyzvozx{|{|xxyy{}|~{{~|y}zu}z{|x|{|x~~}x~t|rzx~v{zt~uz~{s~|y|zz|{}z|{yy{yt||zvyyx~~qq~{{u}{y{{yy}vy~v{y|y}y}wn|z}}|||y}}~y|xvy}|vxwv{u{y~zq}||~~wx}yz~}r~|wu}{{~mwt|}t{{~{|v~|}|u|{yqvx|{}~}yz~}wzx}}r{u}tx}y}|~}~zxu||||y|zxtxur|{zy~y{y|~t||{}x}~y{xu|{wp||}{{}|z|nmu}zxw}xs{|~zuv|~~vs}~~|{yyv||}}~}yy}}|yz}yt}zz|y|uxx{|vyw}yu|}}|~~||{x}~||||}||}~z~}{x~~|zv{|~s|w|}~~}~}~r}w~|p~|rx~}||~w~~w|v|{x|~}}{zxx|iy||{yu|~zxy~z{z~u|z|}gw~{}~~|uv}{ry{yy{yps|{~}mzx{t~}|z{}~xyz}~}{|}{~zqy||~~}~z}z|z}||v~{w}vs{|}vz~y~zzn{~z~yt|zy~~||v|~qzvmz}{}{~|{|{}yxx{x}~q~}u}y|w{|{~yy}|qw}|tqw||}~y}zx}}q}x{v~|vx}}{xzy~zxyz}{{y~|}}~|}|v|vr~zy}v~xv}yzz}}z|{|z~wx`~zyzz|s|z|y}|z}{}y}y||qzy~}w}|{}}vy}|~z}}wzx~~z}z|z{{|w}wkvuz~{t~}ux}|y|w|~uswz|i{|}|}xtwz~{}}z|{zz|x~{||yp{~}~{tvevxrz~}~~|yk~{{~ttu~{{|~~w{}{}{}}ztc{}o}yy{yzz~|h{zy~{z{xz~{~z|{z~yxw|}~zyw}mo{vzvzwq|~z}~}{{vr}}{}vzyv|w{uxtv~}b~zuwxwuo|z~vzz||ix~yx|tzy||wopy{~zl}xz}|z{n~sr}rvyyx}~}zqq~uwwzw~z~u{y|z~~zrw{z}yuqx}{vm{vxo|nv~t{w~{x{}~px|y}~vx|sm~|}yx{}{z~y~sx}y~my}}|~v~}jkxxm{z{s~tp{w|xvy}yn}szzwz~|~yw~zywtyzzvy{}{}|nzv|xy{{zy{{~kx}xqvyv|~|u~{z}qq{||xw{~~zz|ry{z~zkt{z~|tx{t|ysyz{yzz{y|xy|v{~~|tt|}~rz{zrvyu{}}{q}~}nzusy~}{~}~ywv~|zuy{vq|zvw|{|{~}p~t|~~xzx{|sy{{s~s}w}|w}tz|{x~|~|wyvzz{{|~y|~}yx|t|}xw{z}ztzwy}rz}xu}}{z{ntz}p{vy~{{wu}}z~~~z~|xsy}~~w~|~zg}yz~hx~mz~v}~tsz||}sw~{y|~||zzn}{~yyx~{u}~o~|{{w~}z|uyyu}{wny~~u}|}}e|}xwqvyszoxx}z||y{xyy}{}~}z~|r~~~{{r|yy}tw|w}yw}s~z~~}|tt}zt|~}}zxy~|qzxw}|v}{{}zqy~s{}{y}v}|}}|}~qu}~yz{u|~v{t|ovwzlx~p~u{y~y|{u~w}{z{}|u}{x~}}}{{y}~{zz{y~}au~uzzvy~|}y~|{~v{||j|}}{}vvzq}y}~pxx}~ru}y|~x}}|o}~~{~yuy{h|}p{uy}}q}~uzuzy|~z~wz{y}|}z}t}~y|q}}}}z~w|ww{zq}{zvz}z~y}wynz|xx~}}zyv|z}}xm|}xwyw|v~~pz}zzsyyxp|wyn|y|zy|}yz|{|{t}wxw|v}ww~~~xw{z~{~ywq}z{}|y}s|}}sr|y{u~~x|yzqv~wwzy}~}~~u|||{wzw}y}wxqzsty}stx{s~{~{{}q}zs{{{~|wyxvndi~|}~z|v}~s}~r{{zux}n{~~~}yyxfw}s||r{~wz{~~|w||gyx~w{x}~z}~zw{}|ww|yuz||}{z||yp}u}w}|w}}tw{{i~|z}|w|{}zyxwmq{|nx|}z}u{wuzz{u}~x|xz|y}fhy}}~z}{{}xwx~s{}wxz~~kz|{w{vs}}||xx{{}|~y{{{{w~|}|}pnuz}xwu|z~z~xrzlyxs~xztnxqttx|v|}vy}w~rxy}tyys|{z{~{{nw}{h~uyzz|~~y}{xszxrw||zxq{tty~~zw|u~~xy{p|{|||{z{|yx}yr|u~u{yixxy{vupxw{~}wyuj~xt~|zszw{i}y}|Nx~}{~|wxu~{z~y}wnxxw|w}pz}|uz}x}{vzwzu}ust}}zzv{}{{|y{~~n|vs~{~yt}{wz{v~p{yv}|x{vz{}x[yww}wvy||yz{xz|yz}~{z{e{}}{zz|zpyrn|w}z{}w{~}ryo}~tw}x{vz|t{~x~q|vs{}|zs}{Vv{}zz}~~{o{}{j}|{wz||}w~z~|~xy}}~ywuy{}y{{xs~szxwu|x~vxy}q{}}}|{}|x~iwx|~zs{{uxur|||~xyv}yz~{{z|v|u~~|y{vw}z|~p{zy{~{|z}yyz}w{z~~|{xw{zr}}w|zy|y{|x|xx|y~{|~zz{{r~|}|~}z{~~~z||~w{~yp}z}~{}||}vz{}y~~z{{xywz|y~~}s}z~|{w{~~}{r{y}uy|v|}|v}{ywy{zzz}w~y{zvw}{vtxt}u}w}{~u~y}}~ztrz{|}xw{~}zwv}uw{w~u}x{|{x~xzz}yuy{}}~{}wp{~zv||~~q~yxzzzzz}r|~{}|~}wszwz|{z~y}xyy|w~{}zsuwx}{~z~y}{w~}~vx~z|}~x~{x{x~}}zv~~z|{x{{x}wxve~}}ws~y~{yz{o}}{~~{{{}op~zux~{{~{{xyzzyzy}w}y}~xw~z{y}zw|zns|zyw~z|jy~|~{}||lz~}{vs}{yv~rww{|qvz~~~{yy~~x|~yw|x{s~~y~}y{y}{|}~}y~~~|{~|~||~|||~|vt{{~~~||}{~wyp}~xt}}yo~t||xkhv}~x{~|{|~yz}|}{s}|zu{v|r|vzw{~{z|~}x~zx}|p|z}w{z~{{xxo{sysw}y}~}t}~|xw{~{v|}x||~xx~wrr|{~t{|{yz}vz|~}xyx}yzty{{yz}{wx|}~}|{}|yoxsztxyyz{}{{|y~w{zw}x~~xvxyqy~{}~}{|~xv~{{|twy{pwz~~~x|z{|~wv{tzxy{x}u~}owx|}yux{{~|zpyy{|uy|y~t|zy~qxl|{{rxxz{||{~|{r|to~|{x{}w|wz}}yv{zuzzzv|pu|t|z|zzw}{zu|~z~x|z~x}x|twy}}~nzxvx{|~|{|z}{zy{z{|y}}z{}v||}ey~{w{}y~m|y{xt~y~}}}z|~y~~~}~uw}|s}{w~vvuw|{v{{|~r}v}v}z}xz}uz~x{~|w~{yw}}ww{yv|z|}y|}~{|~yx{}yy{ypz~}y~}}{yrny{{x{~}v~|xsxwz|w~|}|zzs{zy{{vx|~|||~w{v}y~}{|}u~x~zywz}}t{q{s}wzz~zx|~yw}ywwvx}{t{x~}~|y~~{{}|wyzyxxq}ynxvu}y~{xzzyz}|xys{~s}~}wyw~|z}}z}w}{{|}z|{nzy{z}||{x|w~xo~~{|s}yzwvxy}}{~|}}~vt~zy~zv|xx}}||}iz|||y{|s{}zry{~~z|y}~z}{}|xy{~x}{u{{}ugw~{}x~|u}vxz~{}}}~{~|v~}yz}~wz{~v~}~qw|}vz|~{~~{~}}wyz|ytu|}||w~~yx|yywxz~{xwy}}xx}x|{tz{q~~||}}|xz|z~yw|~}{~{~|}lztz}~xzzw{{yz|{{z~u}y~}{u}}|}w{|}wzz{|vvy}y}x}{rz|{v||}w~y{ezn{}y{}}}uvs|~~z~y|~os||}x|}|yq|zs|uy{py}z}}wy}{|~|yu|{~}w|wn}~~}}q|~w}{s}wq~vx~ytzy~|z}ow|z{}||x~}x{{yv~w}}~~{uxz{z~vx~|z{s{{}|~{zuywsxzzz~y{zxy~u{|syz{~}}{|}}{|{|o{w|}tx}z|z|y{{}uru~z{}{~~}|}z{~|y}}x~zvx{|}|q~}~{i}}m|}yx}~~q~}~x{w~y{nv}|z|xxz{wyu}}|{}{~|xw{~}}~}}zux{xu~|~y}v~x~~y{|}|}zst|xy|}~~vx~}w~~xzxxyz|w~yz||w|~xt~zzu{|}~uu{w|y|x}~u}zz{yzx~}x}|z{wvq~{{|xzz~{~~~}|{}w|}r}||~zz|z{}yy}~zw~{|{}{wu~z~s}ozvzz~}|~~u}z}}y~z~z|~rtzswzx}zxy|}|x}}{{~|{|z|{utuw~zz|xz{~u~}~{to}y|{y~y|zz|~~x{}~}|{{}~ty~yzx|{k}{yu|q{qyxq~{zz|~v|{{wzr|v{p{~|}}xz{}z~x{|zw{yu|{z}|y}y~z{w|x}g~~x}|~}}u~y}yz{}}|y}z||~}{v~|{||~w}x}w}yx|{~~m}~o|w{~}|x~}|}y|z~x|}}v}wxw|{~|y~z||{|sw}|~y{|ws}|xk|z|~z~~}yxyx~~yz~a|u}|z{x{y|}vs{{|~{{xyv{||xzz}zv|||~{x{~~}~vy~z|~{t}sw~~}oxm{~x{}wy|zw{x}}t{~{}|~|ynv}~{y~~zy|{zw}vz|}|{zt}~y{{{w{}~{wz|||wywrxw~x~zx{}|~z~z{~|z~yt|||z|{q|{n||z~qu|z~y{}{{xw|}{t{{x~px|v}}|wz|{{z}{}xw|w}vvz{ay}|s~~v{}}{{{y}qz|~~}|~}{|}yw|m{~x}|}~}{{||w}y|z}}z}{~}vo{s{yz|v|||qxus{z~}z~{x{~xv~yy{|||}|xvvwux|x}|{vz|~|x~zxu{~}s{{~xt|z~{v{|vtvzwQ}~zy{~v{z{ryxzzx|}{u{u}~||wzzz}}}w}y{{{z|w~}~{zz~~u|u{y{|}|zqv}o}yvs{|{|z{}}}~~|zy}}w|v~zzy~|vx~~{zr~}{v~v~|u~}zr~}|}~rr|vy}t}}|{w|v|x{y|y~vysu|{~z~}|~xu{~|sy~~u{w{w}vzx{w}y|z~vxz|}wu|{xz}usy{xy|z}wyuw~}{~zv{wy}~st}}y|z||u{nz~|~}|~|z}{|{}{~~}{y}|~wx|}x}|~~zxw~v~}~xvywwv}{y{}xs|||yz{z~yy{~y{z}{{tx}|}~~zz}gr|u|py}}x{|y|wwq|z|~vx{~~zw}||~{~~}z~wztxu{wh~z}jsszzzztzq~yx|{q}x{~{|s|ntzw{l|y|}ym|zv|txv{vmr}ym{{}~z{x{~zy}s|z}w{}{zt~l|tYyrs^xut|~w~|}wt}}~{szy~{~x~y{t|~y}wwy{x~|vz}ww}z{{|y~v{~|ruqw|{tz|wqv{uz|V{}i{wtywrzycp}{xx{o{kx|}rvyw{}zoy{qr{zuvy}xxy}|||w}qyyr|zv~p|zu~~x~{}{x}~y~~y{yw~}{}|v|q{zc}{zt{~in~{ux}y{j||zxv~zv}}}z|y{zqz}{xqz|{}ttqy{|{zx}yyz`v}yzqyuuxy{yw|}y}{~|z}tv}u|qzv{iy}}{~{jz|y|v|z{w}x}uu~|o}xzz{{|v~{yzy{zry~|{wwwzz|yx{z|gzz}t{{|w}sxzu{|qpvt{}}zt|}~yz}x}yzzy|~sz}x{|l{}t{}}z}z~{wzzt}|yxo}{|}~|||~|i|{zsv~qw}{|{zk{|~zz~~w}tuz~{|||{xpyut}}s{t}~u{{{y~}vtw~ho}xr|}z|v~|tuzr}w{xzy|~wu|q|}wp~vw{r}y{}~~z}z{{i~y~ty}q|vyy}{~sy~m}}}~u}yu~zxytq|~zur}sx~u|||v~~z}gq{}||~y~}zyz{tu~y~uzlztpqv{~}yqx~w~n{~yyz~u}~z}}zz{y~u~~~mz{~u|}{x{}{y~k|yvz|~~~}Zvs}xt}}yzv{{~|yq~~wyzwmy|}p}yz~~|vyt}}zv}|~~~t{uyz~w~|{~}xuxyvyv}tx}tt}yww}{yyyyxttxq}z{tv{x{{z}y|u~v|zsu{}~yx~{z~tx{z|{||zt{|~~||}x{zyxzy{|z{y}wyyy{izv~y}z}{{}~j~vwu{{y{~xy{xy|u{~z~~y~~}{{w|}u{~~}{}yz||~~sz~sww}zs{y{{{yiz{z}{~|tyzx~yp}}z|szt{~yw`|y|w}xy~xz{|yv|y}z{{z~{u|{~yzyuxx|}{}}vv~ykwz{xvxzrtzy~vzo}~mxgz}Yt{~}|w{r{uyzzxx}w~|}w}n~tz~vz{i}iqz]phz~xvs~zywp{{y~urzyzyt{y|syyuKw_y|ozprww|~hu}|{u|~{l{}{~{yy{}{rs|yvtzax{|Jvzxw|y~|}~r~yw~~vwp}suypx~kzzqr}z|xtymtxmr~xrywvvzs~tz{zn{wx{}m{zzz~{u~}{z|wzzz{|vx{n|ux}t|~{}xzs}v}w~~wxux|}}z~~~tm||ztotxuy{zd|y~wxurxrskr{}|~ywywxy|{vx_tx{}zzq~{~u{qmw|z|sexy|{}sptt~s{xpy||yx~~yz{y{}t{xt}uwx~x}t}{x}{~~~r{z~~v}~t}|x{{~~{~}ty{}|}{~|v||m~~~}|y}|~}p{~z}}~{zy{}|||}{wz~|~yzz{|z|{|wz{ztw}zv|zv~|ym~x}qnw|q~}z|}z|{~~}~~x~y{|~z{y||zvsxypz{~|{~}tz{th||}}~~||}|{|yzx{w{|vz}~~yz{x|x}{}}e}~w{|{}|z|zvo~}u|~~zv{||}|~{x|v~~xpy}x|~w|{zu|ywyyyzy~{yz|zyy}z~|~zy|{}t}~h|{|xtw|{u~~~}}x}y{~s|x{|{z~zsz}~}z}}~|wunu}t|yy~qwx~y~|}yy{}x~}z}|xy}zxv~}z}wz}}}}~}yv|w}y~{|~w}}r|v~z|nuvy{}xut|u|yl~}fz~|p|{~s{}{{{~yz}y|n{vx|t}y}n~{jp{{ryy}~~nwv}|z~|zzs{jwxs}|}w~{yt{|~xt~w~~wvo}{wwy|vzzzy{mww~~nx}{y~ktyvky}}n}{ov|i|wy{}{z{}v~yy~~wkz{y|yysr~yvrfwovx{nvzvy~w{{zxy}yy{|xzz|u|x{z|zz{yz{vyz{wfo{}o}yu|s|n}z||~rxzezx{~|q{z}||{yn}~~vxxvw}wy{~w}uy|xxwpv~y}w}{}{u{}}{~}j{yr{{xkr{zx{~stw~sz~vyp|rr~sx{{~z~r|r||wwvy|u}qtvst}}~x{|v{rx{x}{{~l}{}|xxz}t{{y|{}~||z}{v~||oz~|s}y|~z|u||uvz~{{y|{~}v~ku~}{||}~xz|y|{z~~vq}y{}w~{||xu~yv{~wxzx}|vz{|{~|yzzpzz}u}zx~z}}|{|wy|{y~}}}y}}|xz{vq~zw}{{{nkz|~|y{|xyztzs}w}k}}w~~~z{|y{u}~{z||wyv}yxxy}xr||z}}yyuwz}z{w~{|{z|wpzz}x{|~zxy~y|y~y}wy~}}q}}~w~|zz}zm~wu{}{y{z|rzyzy~t~uzyy}wx|s~||r~wut}vqxt~~ty~r|}~~|vtt|wi~z{}~||z~x}~xsw~~x}x||x|||ww~y~|{}~zcyyop{}{}}}{ryywy|~|zz|}{~}w{z{e}}wu|r{{}zywz|yz~}~}}x}}~~~j~||v{yz|}{gw}zx|z}u|~}xu}{nw}y|~t~~|~}nu}}xl}{wzo||z}zz|ye|v|zw}|{v~z|~|}{{xy~xzy|}w~}~{}{tw~z}{vu}{u}}w{szzx~wy{}~~|}{o|~x||{|x~||tc|z{{vx}z}~}zy}w}{{{|~zyx}tv{{}xxyvp{}~}}}~y{zuy|}{v|~~|w|ow~|}~|y{{v|y~}x~~}q~xxx~~pv~}q|}zzu~}~z|~t}s{s|{z~t~{y}}y}{x~~lzxwy{}~q}y}nzz}rnr~|oz}|ny{{||~|zzvr~x{w{}z}y|||qssw~w|~s~wv}~z|yypwxyyy}zy}{tzvxo~|~yvqx}|yqvz~t|y|{wxtzr|w}|z}zxk{w~zy}yz~{o{u~zz~|}~|yzv}|w|}{~{u{{u|s~|~~u~sq}z~}yz{vtw}~z~{v}{|ewvv~`z|yw}q}}z{xdyu}|y}~}w}}|u}w}}~yo|{z}~tv|}{szz|}z|v}`z~}~|{}zyy{s}z{p{z}{y|~h}z~~x}zy{wwyuxpzwt}~}t|~x{vy|}}y~xp}}{|g{{~zyvqywyx|{~ypl~t~q~{}|~|u~}}v}|||z|{{}ry{|uzzzxy}~~y|tqzx{x||w{xo{|w}}uw}zz{{}}xzx}~rt~tyn||{wzxp{|yx~||r{}z{{~xzwzz}rpyy{w~yt~s~w{yx}v~x|v}}yyru{zr}{rvw|v|{|u}|z}~zy~yuwyczqqtxy~}|{z||ru~py{{rzv~uu{u|{u~}ypy{lz}uyy}z}xxy~~zox|u{}s~}ww|}v~qy{||v~~xjwv|rvvy~z|{}xx{}~yrrtt}qty|uzuyz|}z}}wuzub}{rxz|uxysxze}|rrx}{{x|tp|~rt~zzy~s|zx{{|mwfy|z}}~xy{jysyx|~{wzv|y{{}szuy{|zu~zy~z|u~}{zy}{||n}}{|}~}}}|wxxx||m~{t~|}{}u}yq|{z~~}}h|wz|{uz|t}{|z}x|sz|}usy~|~t~|zvw||x}yv~||u|~{}}x|{qz{|{|~}zuw|~|{yzz{||{~|}~}{st{}}}~{}}}{}x{{~wzy}xsx}z|x{wvzw|x~|p~|xy}}z|}t~p~~wtk{z{||{|z|}{xzy{z~w|}}y~x|{{ux~}l{y||~y|{z}|~}}}xywz|zzx~}t}{yz}xxqz}y}||q~su~}y|~~}y~}}~rtv{{y{~yywz~u}{{vtyo~{z}qu~y~}z{||||vx}w}q~}utz~t}s}~}x|~z~xz|v|~u}q}tszx~}p{{~w{}z~}z~|~gv}y{z~}yxs}x}y|}v}~{|~}}zvxw|u~~}y~}~~{t}v{uwvzzwz|{zwy|xuq~vy{xz|}z{w~yp|}}wr{{y{y|~}y{wx~y|}{rtut}z|u|{|}yy}urzt|{~|}|~~}|}~~q~{}}{zy}{ty{o|}pw{y}}}oz~{{w~{~w|vz~t|v{z~{{}~}Zx{{{{{zvzy}p{|x{xxusz||}s|~{~xwy~|||}ry||~}}v~x~z{{|r|~x{}{u|zo{s~yvy~{}{u}v~~~~xzw|yx|pssx|z}s~xw}~|y~y}yr{}}x|z~{~uy}v~}~s}x|{wxv|uzz~{~{|~}u~xzz|x}{r|zx|xyv}{~vz}|tq|~~||vt|shzuvv_~}{y~}|}~{izt|txv~zs|}|}{pyy}ub|~|}{}zzz|ww{|wp|z{sx{xr{|{w}zxv{v|{jr|z|}~||zctt|N|x|zkp~wzu{vm~sa{~|}}}}{x|ts}{w{s|s~}x{zy|{w{{|r}~v~wzvuxmLyc}~rv~z|uvy{xv{b{zf{yw{|~w~~xz~z}zw~xtvx{|p}vztzn{}~|xz}yzw~l|zu|v~y|}}}pz|xW|zv~vx}~|zyxz~~uzt|sn~oztx{~uzz~{mzmuz|w{}{|ny}w~i~{}s}j}wvyb~|zz}z{|u}~y}|zuv~yqyz}|~z}{z~yrt~t}}xb{}{}x}v}vz|xz~|w{|}y~}{u||wy}u}p}zw}yby|}ku}y~}|{y~}|{{}s}v~zu|}~|w|wz|}~}}x}}~`~}z}|{xsy{|z}}}~u}~|}|rsz||}~{s|||zi{|u~|y||y|}{x~}||~{|v|r~}~x~}~u~~z|x{v~jm~qsz|q~x|||w}uyyw~v|u~z~xzw|xf}~v|}~|s{~}|y~|~|{|||y||{{|}}ezvvz|||ux{}{|y{q~u~wwws}|z|y~}y{{x{~z|}|zq|x{}y~|{|{|z~~v|{wuwv}}y}|t|w~_}x{~}{y~vy~zw}{xp|{z}|w||zv|x}}xvyxo{~tvw|Gu{w{}vzxy}xz{|xww|x}rvtizx|u~tkt|~w}y{|{vh~xxvwyy~rY}ywvy{ys}l||z}wy~yw|w}z~}~z|xtw}yzv~~s{zy}|f~q_wv~{{~o}l||}}||~yxy~yzzx}~x|z}w{|zv~}oz|~~zfyx{tz|xxwyxxxsqz{yy_}u|zzyz}vz{{}rzoz~~z}p{~f}w~{uxu~w}|{~x}xy~xwxw{~z~zr~}}|~y|y{r|wx}{|~o}z}wtz{x{xv}||Xxy{|y}xyu}y}w}~|xq|~{yv~mx}|zt~ukyxz}w}}ry~|||{w{}zu~uvjz|yxw{|~x|}|yu|w~y}}}|}~}}|y||~z|}x{~}}~ux|}wy}|~|{{{u|{w|~~y~~{}|zzy}x~~~}~z|}{zyw|z|{}wy~|~{~{zy~v~{x}~y~{{{~z}z{tt~}q||zz~}~x|~~~~w|~uu}}zzw{e}}s}w}|uu|uu~xxvv||v{{|y|y{{}~zw{w{|y}~~yzy}}wp{~}||}}v|zv}{vz~{~z|~}wuyy}u|{z}z|}x~{yy}w{t{w||z~z||}{||zw{w~v{}x{x{wy|~|~|u}|z~}}~}|~zzw|~}{{v}{yz~zw|u}}zww|{}~x{vxz~|w|wx}}y}|{n}}yx{}|qv}wy~~|~{u|yy~y}~}}u~v}z{|}~{~{y{zzt~l||v}oww}{}~|z}x|{}tx~}x}}}v|~wz|}~zvyuzw}zyzxx|sy|s}y}}||~w}{{x}|~~wx~ttwx~xz}}}|}y|{z}}tz{x}|~mwz|{}|}zr|yx~|~|yu|w|~}yv~s~z}y~}~r}u{{x}w|zz|~yv|}tx||uu|x{}}uo~~{yyyu~~}{{{zwwp|~|~|~W}|~qw|u~zu|xy|xy}z~}|w}~~y{z{}z|z|{zx~x}v{szxk{|w}zwxyx~}~zxu}}ou~z}|z{~}|z~|xx}{{|w}wrxrz|}t|x~{~z}w~r}xrz}vuzzsq|{h~|ozo|||~~}y|r}xyv{xw{{|p|n{ytvx~h|{zsylzv~wzz{yy|m|}|wxu~cs~{{w}yr~{~x}xwxwvq{~{x|u}y|yz}|||z||vyzu|ut|y|sx~~tz}y~zus{qz~ys~u}vwv}xyt{~xy|}xtytqm|xz}w{v{ep~y{~~z|{{rp~vvr~}vtw~z|}|v{{y{|y~|~xtqvpx~{uryu{yx~uxyy|lzy~x}wz|z~yy||oty|z~t}xzz|u}a}}ww~{}{|u}|~{}zz|{nzxxujpx{~w}}y{vz{zy|v{yv}}|{~|}{~|{||||}|w~z{~~~s~y}|~xxu~sy~|~zzqz{}}zzyy}}v}zy~wxxy|v~~|~i}~yzxyy}p}}|x}~w}rz~z}|~|}wz}{trzw|y|}uwz}~{~rws}{zyyz}|tzz{~||y}z}xr}}~{y}z}{v{{z{z}{vz}~w}~|}q}wy~xrxwxs{}wz{~v||~|z|xpy|}z{|nz{~t~xwwx~v{o||zwyzvsyvvr}}|zt|z~{yxq|{qi{w{~s}{{v~~|yy{wwxr|||a~}|{{}~|~x|}zzwq{~||y|tzyxxu~nzzv~xsw|x}{}~zy{yu~xpv{xx|zxz|uzs|}yxyz{}z~w|}|x{}~}{wxr~~u}w|w|w{{{}vrz||zk}x|}|cx}ym}{x|~}}}|~s}pwvysz}xw||}||y|y}xxx}~|~{w|~vyxztuxy{~t{||{z}q~ruxx|}xv~~xy{}{sxf{}}y|w|}}w~wz|}w~rx{}~}}{~xzy}}xz|uuzz~}||z|u}z|zs~z{}|~u{~{~|~nv|xywYv~~~{}c~y}v}x{~{|x}}z~xfy~}~|xztyj|{xv||q{zy~|m~v|}|t{z}w{~}n}yz~z}}xutxlx~qy}{~|{|t}xx~v|z|}}z}|{~~vzyb}~g{|v}ty{|rvu}|}{}vvu{|z}|rr}w|zzzzwzw{|wwx~zrytyns~{vr}}{rx~s|y}xyu{|~t{u||v~{}v^{z{tzyyrwoyy|v}q|~zzyy}vvx|~~zps{~zqt|{}yzzu}}xx~|~o{{v}vw|}u|tw|z}zu{y{u}zy}~|s~|{{yw~~{z~m{x~{~v|}|w{x~zx~~~us}}xu||x}~u|}~w~z{zw{p{}{uvx~}}}|~}~|sv|zy}wzvywxv~|xy{zyx}{~{s||u}{{}zzvyy}~zmw|x{~|urqv}}s~}~{~~}y}{p|~u|xzz|~||t}~w}x}|{|{~~{{|zwz}{|tx~|{v~v~|{{uyo}wx~s{{v}|ytz~~x{|{}~z}zx|s}zo~uz}uxw{y}x}u}~~z|~}sy{x~y}zzz~|}}w~}}zw^}z{l}u~|m}z|z|u{y{z~z|z|v}||}{u{z|ww||{|~{{}~}zyy|x}vx{fw~x~~|||tuy|~f~~~z}z|x}s^yx~z}~{zyt~q}~y|{~{~|yqt~{p~xt|}~s~|~uz{|}|y}~|t{|{~x}}{}~}z~yw{}zz~}~~y}yy}~|vz~r|~{z~z~ykiwzs||}|zn|x{}xzzr~z}qzk}u|z{ywwz~z~~}z~|s~{{z}xzd|x{y~x~||sxz~mz{z~}{z{{xysxr~}xww{x}z~of|u{||{|{|x~{x||yqxz|tv}{v|}|{}}{rzy|~}|}~zzuy~}}zztzy|{|}v}xpx|iy}tx~zxyu|w|xyw~|uz||{w|}y{||t|~}}~wyzr~y|z{m}ysr}|~{y{}|}~xvzyz}y}}t}|{~|}}y~}uy}{yz~y~{stk}py}v|z|{y}|z}{xuzxuzyyw~{|}~~y|z}~}{v{~t~yvuwv~|yn}~|}z||}xw~{wy|~~~~zw|z{{||z{|}~|||{}{xzwzo~~~{xv{s~yuq|u~yzy}~y}|x|{~x}yzwuz{y}~}|u~xzyz}~~}~txxz}}}xu~||}yxu|ut}ys~tw{z~y}}||{~|~x~{{xu}~}~|~tuyyxv|zv}~}rx{{}zq}y}}{~}y||}~{~y}xz}xs|}}}w|{v|r|~vw|~}yzxwrs|}}{y}|}yt~{~y}||xyx|}}{|}~zt}}~|z{}w{x|}~||w{}}{~~}|z}{zy~yw{}~z|w{~}|{j{|y~}~x}}{~v|~|}z}|}~{~}x|~{x~|w}|y|w~}}z{z|{{w{|}y}}x|~}vyy||x~x~y{wz~~{}{{y}|v}w}z{{|{}{~ytyu}|u|{yx~y}}}|zw|z~}|}v|xnw}zy~zyw}xxuvzu{|}|}vu~{v|~t|y}~|~v~{u~w~~vzw~~|}zxyy}}wty~~~z~}zy||}{}|~~{|y~qq||}~}z}|~|}{wx|wyzz~x~zzz}xz{~~ux|xv}u~|||}|~~s~~yy||q~~~zs}{xx||}}{uzxt{{vx{y}xv~{yw~{}}r~{}~yvzz|zu}|ww~}{|||vr}}zo}xvyzsv{|x||}yx|}|}w}{wv||x}{m~|o~z{|}}}{{}tuqwv|}{{}|t}zz}x{}yu~xtw}{~~~t|xsz}{|{wy{x{twz}xv{{|vz~|sxw|qxu~yq{}|y|u~x~|z~|}y~uz{yxxux~wxx|{tv}vswwq{~xr}x}|y~u|w{t{~yzx|u}zz{z|z|zy{}|x|xx||w|t{~~w|o~|}}}vw}z}{|yz|z||z}u}}wqtxy|}zz}~|v}~w}kvw|{~}{{~||zxzuz|{|y~|~u~tsw|~wtuw|{|z~zv|}{xv~|{}w{|y}|}}jzv{{{}|x|u}xvv|w|~yy{{~xzy||}zv~|t~zR{}wy`xzz|{{u~y{|sw{}v~vy|{|x}yus|~uz}ux~{wy{~z}t|}}w~~z~v{~|z~|wv}rz~xr}||{|utryyszy~sz{}}{{|yur{pvzy}vyv{}|~n~}}ytz||t~z}z}~}}|~szzur||{le~vyz}zz|Rz~yzv~nrkp|xm{zv|s{{||~a{|~|~wx]vyorx{}n~t|{vtz|rw~}}||~{{~y{qu}{~{{}}j~|}{uu~}xq]|{r|{~x~~n|{~xzo||s||}~}w|~uvy}x~wz~zqyy||~xyx}z|{vy}}zyx~wsww}ny}}~rz}{xyz|y{||xyuz|s{~w{||||yd}|z|xqw}x{yxzqyru{z}qxm{}}yx~uztz|}}xy|yyo}muo|xr~p}tvrzvthx|swto~r}wx|v}~{v~}~~u}~yzu}}~plc|u{q}w{{}{v|f~}z~wvz{~y}~|r|{y}szk|vyws|z}y{u|ziv}gjt~rrv~yw|}xl}|wjwwpzy~~pz~yu{ruxx|~}~y]}uw~}|z}zu{|||wlv~}~~zv~}|zuzs~~m{z|xzr}|z{|{qst}{z~tz~uz{~r{~yzx~x~zu{zUru^|o}{q}m|{}xyyuyt}v{yq{yy{dy~~{{q}{h{{w~}}}qrgtx}~n{}~p{y~tq|uxwqwwt|x|}x~~|x~}w{{}{y~xyw{}yy}v|{||x|s}t{~t|{xuxwvu{z{ww}~y{|}}x~|{}~}~ivm|w|{w}{|~xyw}|~yxt|xxkwz{xz|~~wy~t{}{x{~~{|z~{||}yv|x|us{{}r{~{|{~|}z{xw{v|ztwzzt}|u{yyv}w{~y~v{v|}zy~{y{p}sz{ytz{|}{{}{qzz|t{}yzz|s}~zvw}x~r}x}zvwztwyyrz{yxoxwx~wyzwau}{{sy{y~yuuw~~~wz}xo~w{yzwv~|zuwyzvxyz}wzz|}}tuw~v{~z{|xx~yxkivzxv}{}u~|yxu{r{yvyq~}z}{ty{~~|{x{|y~{{}|zr|yzt}vyxuv~zz}}~o{zrytrx|{{}~u|}h}zoy||zzw}z||{~{xxv{vxw{}xwy~w}{~~yx|xxz~v{|}~|{|~~sx{|yv}|s|}|xty}z{xwtx}xywzz|~v~x~xxyy~}}yy}xv{z{|w}wu}}||i|~u|x}}z{zz{ot|w{z}~x}}{z{t}u{r~|{vz}yxz||||y~}trr{v|zqx||~z~vv|x|y~}u}z{wxq}yz}~w~~zzr|ux}wyw{}z{|}{|y{{|}xy}{zyv||uy{}zu}vy|z{xvww~{}|wzzp||x}|xt}_z}{}x~zyx|y{}p}n{}|vv~|tzvz{yy}{{~|z|~w|~{zytmy~{~|x|~~y~z~x}x~}wy{}||}z~~w~~|x}{~u~{||}~|}{x~|xw}{~v|{~{s|s{}yu~|}}v~|z~tyv}w}||w~~z}}}~y{}{zzxx{oz{z|~|}~z}~yvu}nv~}}|vv}uyx}{~~y||}y{y|{}zr}zy}x}x{xw~~sz|y{p~}|z~bz{{}zuxz}}}}o}z~z|uyy}yx~|{s|~x~yww||{}rw{|yy{}|~sx}{y~z||mz}zys}u|{t{~}u||z{u|}zv{v}{|}}{w~}yx|z|}}r|}|zx|~yz}xyx{t~zx{tu|zszz|zz|{}}|s|szuzw|{|}{q{|{w|{z|yvwz|vz|y}z}}yq}v{~n{wx~y{sy|x{}xyg{zwz~{}wuz~}{y~y~|qv|z}y~{wxz|zt}}|r{|x~{u{zwot}~~ytw~}~|y}sww}xzz|x{s|~zxt~m~}y|tz|}|{zzt~}z}~|~u}xym}{}z}yx}{t{x~~wux~~rl~}|{w|x|r{{}wlu{}z{}y{yy{tptw|pzyzz|xwv|y|v~xyzxnt~}x~~{zt{yzwuz}~{{uxv|{zw{}ytz{{vr~{wvz}{zs~tz}{zx~~}xtvzywwxysx{{{v~{}{pwzoxyw|y~~~w~x}|w}zz|}~zx|zz~q{ou{Ur}|x}~}s}s~y{y{{{vz~yt|z~tzx|{~y|w{}{t|xw~}~{|{y|~y~{|}z}{t}~{|pyvz~{|v{}~~{}||x|~w{yx|{|xz|||{~}|~|u{zxz|}~~}zzw}wx~|}y}xx|}|x}|}}}kw|}~kx~}~wy|}xx{{z{z{|sx|z|}|xwxx~x}v|p}{yox~v||y}}x}}}~yl~zsqz}{|{}}~~}z{}|bx}|~}|u~uz}wx~||k{ut~~r}}wvyy~xzu{w|q~z}z}wy|{~zz{~v~us{~}|zv~x|||w|{zhv}~y}vuxw}|zwyzx~}|wy~vv||}{~x|s||{}yy~mvy{{w|{y}wmzps{t|}t|~~y|z~x}z}~~}sx~{{|zuv|s~~tx|}||{oos{wu~||tt~tz~qyp|}hyw|{vu}~~s}jm}|z}yz|s|}}}q}|}~~x}|pwv{y~ltvz|p~rtrw}~}xvz~uzz}~qx{|zv|zxro|xz}sxu~{}v{xrt}tzy||~}xz~|~}v~x|}s~yzzttuzpo~zuosym|~~q~}y{xz}z}n~wuv}y{{{~nv~|~x{}xf}~}{x|~~zw{~wx{v|~~|um{|xtuy}wx}w{vy{|}{~u{{u|{~xy}s{x}yy{q|tvvky|wwzy{x|{{y}w}ww{s||z{}~~~|tx||x~}i{{}~zust{z{v|xh{}xy}y~}|{~y{z~~~}{}||x~~zr{yvxl|yt~~{w}}o}}~|xz{x|{z|jz{z}y}{}}{yzw}|y}}x{{ywz{|y|w{|tq}zvxw~~zv~xxv~}}~z|z}z}|x~{}}}|t{}z}vwwzv||}wwu||zz||y{{q{{{szy{~zu{x}zy}u}|}~|ox}{qy~y~zw{~v}|}}y~}~{}yz{~zyxwu|p}|}z{~{||ry|}yz~x}{}||r}{}~~w}~yy{y|m}xw|x}~s{~z|t~s~rx{|w|}|}~||x|vt|z~u|}x~v|w~{y{{{}||{{y{yuuz}{}}y{s|~|}zszz||zo|{~|{yx}y{z{zs}|l~t}xt~hz{|z{{|~~v~wyxvt}y}p|{{|~~q}wy}}y{f}}}~x}xl~~v}~wv|{|x}x{z~~|{|vz|v{wyu}|{{||~yk}ty~}}z~v~~q~z~|x~y|ywzuz}{~ym}y}{xyzt|~~y|vx~yr|}~}}{~|{zzvzt}}|{}iz|~{{}~~w|}~}c|{z}{x{}}vxt|~tv|t}~z}}q}y~}xy{}{{v}q|}|x}~}{ytoxwxxs|z~~|}y|~zv}}vz}{|tzw|~{}{x|~}}}yt|wyv{yxv{}rzl{w~|z~|~||{}}vs}m{|}}zx|{~z|}{{|w~~y}~|{{y{t}{}xxv{{|{zwyo|}v|}y{{z}||{wvrp~}}v~txlt{~}}{xsz~|z|yy}|rt}w}}z|}|vxz}|~uzy}xw}u|yy}}zm|~|v}}|u}}~{yy{~{|}yy~uy|~~~~z{~~}~|}{qy|ysn|}{z~~}}|~zv~|w{||}~x}}~s|w{y{x|{z|}{z~zx{p||~{}~~y}~zt{utz~|z}w~|yx~vyw{x}}u~{yz{t~{y|o|~}~xyx~{z}u{|}}r{}{u}u~}xy|{x|{|y||yyy}zw{z~}}~xy}r{}|||}z{u|{ry~xw}|yi}v}~}w|uuz}~x{tr~y~~sw~|{}u~vwyu~x~v}z~~|y}|~s{}|tv~~~zuv~v~|~z~~{vw}{}hzy}~}|v~}{}{~zs~oy~zxp|uwz{w~s|}|~{~}z}v~v{yv~y}|~xzx|y~{{z|}r~|}}{z{xzx}}{{|~j{yx}iypt~wz~{sz}qtwxz}{|}~sn~zp}}w}yxuty|y}yz{{u~u~~{{}{|rzx{|t}}}~ky|y~|z}~}y||}z|q~}~v|}}hqy}}vi}|~{{~l||{zzwy|v}w~xzyu~y{{~r|zzx{s|~|yy~w{y}zjw{y{{{{|}{{zqk{zl}z|{z}|z{{{uyr{|{{~yx|vpyz|vzr}~ou{|x{ta~xryu~w{~~y|tzvt~z{|~z||{uzqx{yzpp{zyx}|u||zx|vz~t}u|}pw~{|{||z~yk}yzwxgvxn|jyv|~v|~~}~|w~|}~yvx}o}mh~}~~~~{{~xz|{x}}|h{p{}||yt}~z~yvz|x|~wz|u~{q{q|{x~x~|{}}|{{}~r}{||z|}w|}x~py|x}wx~w|~|t~{vwz~l{|ypv{y{~x{|{u|}|}yt}{}|{r|}y|}~{}y|qwq~}~|~{s}}||{z~z}~|iz}|}z{~v{q{}x{zz}~l|}{}w|xx~}|yo|{vs~w~}xuy}|z||y}yy~n~~|t}{~s{o}sz~{qn}|}}rzv{~{y|v}~}|s{z~{~zo{{|}~~|z}}zxw{ay}zv}~|{}yz~~{~y~~z}~}uz|}}{wssx{~}{zz||~t~~}umyyy}}~|z}{zh~w{t~n}{x~y~~u~|z||{ys}vv~O~}vy~~|yx{y}wy~||~z}y|{{sz|}~~z~t~~~|wyym}|wyw}|w{z{x~|w~zvw}}w|{|yy||u~}zy{z}~xx|~x}{zv~}{}z|yx|yzq~~yu~|xvt{x~{wy|~~{y{u|{{xyw}~}p{w{yxz{}q{}~{l}qu|x}|{xz~|~ul~vwzxPx{v{qtw|}z}~}~}wv}yzwu{p|}zz{v~~yz|y{}w~{}{~|{g_~zwzr~t~z{yx~y{~}}yv{}yv{~ly}ss}xs|{}~|x~}{q~y}~|~rv}zx}{{{w~{~~}~~}uyyz}zt}{uvx{{|B|xn}~}p~t}ssvwq}uy~v~}|y|~{yx~t}{|toys}ovsvo}zprs~vz~p}ysz|y|||~z~nl~wu|{n~zmj{hvwxxy~u|q}{xpe}u{pworx{}zxumv~yzxz|v~wuugzyu{nso~{vz|}{~}urz{wxwr~m{Nbw||wxn~yyx|x|zxwZmx~~wp~o}~}r|vzou|xysyyzyp{uwz|ps{woxztxuzwv}zxyuzoUywwx}{fx|o}zz~ztu}uOx|{{gmsw{|~d~xpz|uyy~uy|x}}}aoSmv{|yzzsU~x{wxu|xvv~zyxyl{uvw|spez{z~wmyxhzv}}v{uy|zu{uv{|{{y}|{|y}|zx|}z~wzxx}v{rm}|xz{~{z~{|{~x~{{|xx|~||y{vw|vs}{z~y{{v~}x}{~z||~}~v{}s{xs}}~w|~z|z|~y}~~}ut}{y|{~}s{{~y{v{}u~|x}zywwx~zuzz{xvxuyy||~z}z{~u{}z{z}x~~{uvv|~z~v{|}pw{v}yytt}}y{y}w}y~{|}zyzw{~}zy}y}pz~wyy~y|{{{~}xmy}x~{~|wzzy|{yy~t{x}|t~}~{yzzm{~tz{~|tu}y{zz~tnwxx~wu~y|~ts|||~|z|{{}}~ux{y{y}~y|{v}{~~~zu{{vt}}y||yx|w|x}~}~}{~|xwpz~x{x}{w|{z~y|z|{pzv}~{~{}xy|vy{|n}{z~{tvz~}q}}}{~v}xru}w{{~|}x}xwy{|zv}wwv~y}xy{s{zx~||z|uv}|{{{w{x~wv~|}|la}~yx|w{y}z~{}}ytyuy|~zss~}y~xu~x{x{xz{p|wyz~y|q{~}}|zs{{zpz{wzfxv|v~~||~}u||~}ww~~~xx{|x}tw|}xzz{zroo}~zy{zy|uewxz~{yywyxvv{~{}{yzy}y~x|}w|}}{}zz}y~}~qv{{v|{}w|{}~yvwtz}}w\~}}{z{wz}t|{{~|~|xw~vpv~}yy{|~x}|z{}~vywyrt{x|{z|zy|tyh{u|zxrx~}~y{tm~yy~}~z{||wzl~}xznp}~vzt~yzp||qzyz|~{ys~]|vxw}sn{wxzu|{u}z|u~~s|zv{|s|{xzuyx|xzz{{~us{vxy}}}v|}}{|w~zu}|u}~u{w}}x~w{tyxuvuzy|~wy~o|zu|}yt}{wz{|~yx|{z{x|x|xku~{||z~zz|wyz}y~u}w}}{{r}}zy~}zvvxuq~}~{{zxxv}|}wztsu~{{~vs}~}}{|}\ywzp~{zw~o~zoxy|k{xzz|||~z|zzv}|zv{{w|wtr}yvit}z{rrtxrz~zx~}vy|v`{{|}x{zwwty||z{y~~~{vkz|pz}}x|~~{w{z|{~~zr{xzx|zz}}u|{{z}r||m|{k|ww|~}}|zp|qqyzyz|x{|x|f}zv{ywm~u{{y}t|}{|x|}uy|yy{~xyyv~~{}|~|yyxw|~~||~}{|~~|}|u{u~v|x}yxze}q{|tyr}}vyu|y|{x|{z}v{{pywy}{{}|vx{s}}yz{~}x|}~x||xvqw}x{}z~y~}vyzzy|u|zuuyyvy{{}~|}}w|}x|}sv}ywv}zt{{{zz}uy}y~zy~x{y}~~v~~uxuy|vz|v{|y~t{}~~vyw}zy{~}mp~z||yydwwy~w~zzy~~zxv~}z}|}y{wup{{}}~}}{u~~xys||{ww{}zz}x~y}}}}z{uv~y}~z~}~x{x~z~y{|}~xt}~|t}z}{}u}u{v}}~{z~{~y~u{yut|yxzy}wz|{~yrw~~~w{|{{xv}wy|}~z{zz}z|{|~y~z{}zz~u~}~~|s}|w}|u}y}t}{~z{|u~~wz{v|||~~|vvv~}|~{xz~y{}z|y~}||y~}x{{vp{z~{}~{}uvz~zyzws}s}~i}ywx}w|}|{}zv~qvy~w|wqw}{{v|{|{wz{|y~}{y{|}xxwu{{|y{yv}|zw|x|~||zy~y{}yy|~|{|zu|{v{}||}y{pw{rwu{w{g{~qt~}~|~}y|}ww{}|{}y~~}zvy~y|{u|us}v}||x|}{uw|s}|{|}z}yyz{r||z~||tw|~}j|q{y}{w}o~{l{wxt~~vzv{~y|u|u|dxz|x|~{y{yp{~zz|~t|qsx|{{ry}{{wxz~}rx~{w}}|q~|yy{|yytyr}}y}}~uzz~~yyvzz}{xz}{qwy|w|w||}w}yq|}}x{~~x|}}|v}{}{v|z~s~y|~wz|}~vuxuz{}}zs}}z}~{yy}zyxvtz}y}}|xx~wluxy}}|~yyy}}{xw|~xyr|~~{yxt{z{z~{|zyx}||}vv|ox{~s|z~}|}}zx|}ovyy~{}}zxz{~|rux{y}y}pyx}||yz|zz{y}~zxx~yy}}}mz~}|~|}~|}{{q{v~{vy|z{zx~~{}uy|q|}~{|}xy|}y~~|~~~yrx}{x|}{||yw|{v|z~{}s{vq{x~}{|w~}y{}u}}vkz|r~xzwyw|}|yy|x}~v~|}{{|vyy|ry{z|}y|x{}}{|~vv~~{z{~~{z}||zwwz{}{~w|}~z{}}zzz~}ztx~}{}y}wy}~{|~z}y||}w}w}{ys~~zz}z~|z}z~x|{|{|x~xtw|~}{~}j~q||x}v}xw|v}||}y}w{~z|yyrvzw}x}yz|v}~}}v{|}y}u{yxwy~z~yz{~vzytuz||x|~|z{||~y~~}wz|{{v}y{x~yz|v~{u{{z~uz}n|z|x|{~~|jvtz~y~u~u~y|}{}}|pz{|y}u}|urz{vwyvw{w~~}zxy}{|}~{z}~{y}{{}{{v{v~z~ty~wyy~~}tv|~{|~~tzzyyu{w}{wu~|y{zu~~w{}||||~twrzw}yzyz|z}qy}}}{yx|wy~|x{uv{{}~}}}o}|~xtt{{z}|}{{|~~|s|}sr~}}syyx{|x||}~|zryx|~x|yzzxry}xly{{zwy{qy}}{|yqx|wuzz|y{{y|v|uy}|x|z{~}t~{}}t{{v}||~|wx}{{~|wy{wy}{w{{y}zz|v}xr|}}vr}uwv|~y|zn|wx}{}|}w{{~y~x|z}uzxz~}yw~~z{{zt~}y}z{}kvy{xv{y}v}{pw{~sws}yyy}yvy|yw}oz}uwu{|}}|w~x{|nx}yt~|y|}y{uytt~y{w}}zw~{|yywxx~}{w|u~}|sya|ox~z}sy{|{x~yzz{y}xv{}l~vqt}xxvz~}|{~vu}w}|z~z~vur}yw}|}{yxy{xvzzz|y}yw{n|~u{}{xyz||{zyzz~|yyv{}{{xz~|x~x~x{zo{w}{zx~ty|||}xy}|s~~u|~u~zrnwxy{|zxnq}rt~}uv|t|xzx}x}~{y{|{}t||s{y~g}~z}~{zo|t~u}x|}|{|z}m}u~}|}ys~w}yw~yyz{||n}vwz|tzw}zz}|y|w~yy}}vox|}y{qyww|~}u{|s}~}|pz{~~}}{}{{y~{~~uxy{~~}y}~v{zznyu|{vrnz|z|yzx{}}}y}{o~}}}~|{~~vvxzyzz}zxzwyu{zyz~}{{zq}|wvx~}|}~y||{zy{{}{}|z{v{|{x|t}}z}y~}vzpwyx|x|x{{|wy~p~zv||{{|{{}z~zxxt~}ywr~zz}|~rz{}xzy}~~{|}wvxx}~}y~x||{}{zxwz~||x}{~yw~r~z|z|~|{~{~}yv~uyq|wuw|}vx|{n~xwuw~~xw|uvz~~}zxo~yuyx~{wzm{{}~sz}t}wxv{x{x}z{|}v}v|~wz|~y|r|}v|xxt~q|~z{y|}x~~~v|||z~|w}~||{yxw~}~||xs|}}|{{{{|~~{qzx}xz}|rt{}||y}{|v~~t|{vwu|}xzszy{|~xww|~{u}s}u~~~yx|}{||}{|yhry}|y{mz~}yqtw|{y~|y||zwx}~|~|ut}|q{|s{r}yu~xyuz~}|uwuw~o~y~ypt{||{|yx~z{y~y{{z}w~|}yy}y|}vy}w{}ryv~}}}zw}zxzu{o~zyz{yry}z|zks~|xz|yom{|~|y{}zuz}z{x}xw}x~u|{z{k}z~{|~yv|y|u~yz~qq}z}o}wy|z~v~~|xw|zx{~~y|~|~z{xs|}s}z~}u|w}u}{zxzx|u~}|~|ytx~w}zv|}{|}u~x~y{zzuvkuz{}~qyvv||z}wxtxh~x{zz}v|u{w{zy}sy}y}}~|w{}{|}{{|xtn{rn|~vz|{w{{}~{}|v||x~yy}}~u}~~}v~||y}|v{{wxxp~wyz}x|}zyymyv|o~|~o{}zzzt|r~}}yyzyyp{}wz|x}{|xz~{{{yy{|y|yy|yw}vwto{o}uyv~z|y~~vq{|zy{vw}yty}z~~xzv|{x{zs}}|zux|x|r|~s|{xz~{{xy}|zx~r{|}}v}{t~x}|z|{||~{~~}z{s{}z{x~}{zz|yy{ztyxzw~y|}~~x|z|{}z~|~wz~yy}}w~{~w~}v|}}yzyzw}~{~{}~|~u|w{|x|z{{{~w{ot~{|t}{z~}{~x{su}vw~~|}z}|rw{~szw}y|v}qz{v}xu{yq}~{}wz{zq}{xz}yz~y~vz}|x}x|w{zy}y}|mxxv}{x{vy{z~xwys|w|{~~yu|x}u}|z}|w}}}zyzw~}t~~{|zxy}~v|yzzyv~y|}z{xyzzz||y~{z~}wxn}~}||tuyw~}}~um}|x{v{~xv}v}}|vs}|{yuptxzwv||~|y~}x|zu~}wy}|z}~}|~wz|~zyfwzxzyxtv|z|ypyu~}s}x|xvx~{wl{|}}~z{|{||y}x|kywwz|}zy}|z|t|{x}{~wx}|z~}~}}|rww|y|~v}}{xr||}|wurww|w|sy}~|y}{y{s{}t}z}w{}qxtkzv~{z||}y~}x{}}x{||}t~w~p~~{z~ujwx}|w~yxy}|z~{st{|}}}|yzz~|x||v}z~~z}{{x~yvz|slzu{y}{ykz{s}}yv{~|}tvxqywwwys}}z|q}w{}}{~~x}qz{~|y}uz{|}{yju~w{~{z}~e|ry|xz|}ypv{}{qw|tzx|~~n}|{wzy|z{{v{u}{~rxzvx|wzyywmzyuu~{}tx|}|{l}z{y{y{yyyXy~xxtr}xs}uv}u^x~|y~sw|}w|y~|s{su}{~~s{}{vs~y|{}tzrsy}j~w{x~|u}x|xxzy{wuv~q~i|{~|vmy}xsx||yvo|{p|q~x|}}}zsxp{~~{wr||x~{z~w}|zwxu}{{}u~vx~~}|o|~y|}uz{r|t|}y||t|{~{wx~z{zum{}}v||r{~w{w|hx|yz~|ttqv~w{syquyv~}vyr~{yp}|}yz}~t{sx~xqy{y}||mz}{dzq}}y}cy}|}z{zz}|t||w|}{lx{zzx~~}}w{||~xz{{}}zz~ws{{{{~x}|w~~v~}}~zuh}{{y{~~{y~zyzqxz|{z|xz}w~}~zx~z{}{{||y~vnz{{}}|x~|uuy{v}{z}}x|v{~~z~}ov|uz}x~{|}|yxx|y{{~|~yy{{}zyzwzyx|yw~y}|xxw|ku}~y{vz{{{z}w}zyz}{wy}zjpy~z~{xsw{{}~~~w}w{v~|vx}v{~~wu{zw~~|}~|zx~}{yx{t~|{||sx|~w~zy}|tn{|we|{zw}~z~~~~wx|z}vx~yx}{v{z}{|~wz{x|y}|}|}q}}yvux}|~~|~zv|~zyy}|xtz~v|r~wz}|y~}yzl|{r}q}zt|vs~|z{xz}}q}xz}||{z{zv{}|~w|w|r}z}{zzu|}{{~typu|~xzxmrvwy|wx||{}vx||zxyblz|vzv{y{}vv|~sq{}{||wsyywz|x~z~}~}~|}}n}tvv~v}~}}{~ty}}x|{yr{twms{yy{}~^wv|{rl~{~x}}xwyp}~f|{x~r~y|}zxmr~|x}w}{z|syzr|yzz}~|xz|k~~|ujzyzzz}{~}w|z|~u~yrz~{xy|zwwx~w{w{}{|s||kwzbsxww|q~|z||wxw{y~zy~|~~z~z|rny|u{|~{}wur}||s~~tuy|uz~}u~yw{|xxy}||xy}xzy{wy|{z}{utxz|zz}y{}~xyx|{}zv~}}l|yw{z|z~}}zr}p|}y{~~~xy~|}~wztq{|wy}z~}|z~}~y{y{x}{|}p}y}|{}vw{~{|~~xq{}x}qy~w{q~y|}ty~y{wxxz}x}}{{||vw|}}t}s||x{y~}w|~qw|zwp{nxzvzerh||u~z}z}|ss}vs}~f~x{|x~vy~z{}~}~{{xxxvvvpvzxwv|zqz{}{syy{xuy~t~~}y}yo|w|}{{zztgyw}xuuzz}v{zvy}w|wwl~}{{m}}mz}ztyyx{|sx~y}w~r||s~}{w~y|}}ty~|~}~~}}}s}r}}w}|}}~}xzze}}t|||}xwy{z~~~|~}y}svw~||~s|zzv~~~|x~x~}~|}{~m~ty~|{}{y}}x~wzt}r{}{y}~y{z|mu{y{}z~}y~svyy~~~x|x~{|nxz~|}v|~w}|yy|~yz~}w}z~~wg||z}}{z}{~xz~x||w~qtt}y|{{~t~}|{w|v|{}Xzw|~~~{~}~zyr|}~}x~rv|y~|}|v~v{~|uu~z}}xq~xoszu||{|u|}t~{|yk|v|~}|}}|z~c{{~zz{y|xvuyyy~}V}~~~{|}m}~~ywwwy~yv||w}{}{yy{z~v~}r|~~{~~}{}z{yx{sz}}}~zuw{~~zk{y}}z|{~}|u}t|}t|z|{vzzw}{|tx|}y|o{~v||t{|s{zz|{}zz~sw}|{~|~tsxy{y~|vy~}~{}z~|ux}{~xtt|{usy~|p~ys|}{ny{|~v~~zo|{|rpy{{z~sy{~y}zv||z~v{t{}}nx{t|ywz||v}{y|w}u~svwyw|{rryw|{xp~|ww|ptlz~vv{|}zpv|~w}z}xy|u{|{{~z|}}}ox~}y}y|}r}|rxy~vx|||xwztws{xz|z}}y~ymz{pz~y|x}y}~r{{}vu~z~uy|}}|}xw|q}{~zr|xxq{}x{zwu{}{{}|}t{}~st}|}qp{{~{xvr~z|v{ruw}}{|z~~}z{|v|}~ts~z|nuyw}~~~}|wxy}x||~s{{xz-vz~z}zy|{t|~qt}wz}utz{}|wxxty~zzo~~x}~wwsz~}{~myz{|{}ty|zx{|||{|v{w||zzzvxn|sz}~vxmu||zvuzqz}x}tz|yrzzwz}wns~ww||}gz~z{xt{~y|{}x}~v}v{|~o<{yun~v|~zzzryz|~}wyy|yx|x"~}y}zx|w~xysp}t~v~}y{|}|xox}xrv}v|~v}|{~|~}s~{~}|wvp}t~}{zv~}xs}}v{zys~x}w|w}wy~cp|wz{{}|r}yo{zzzzv{zt|{x}|pz`{xkr}|wyxt|x}zw~}wx{|vsyzz}t~x|q||y~z}y|}~yv~yvr~{|yz~zzyxw|r{x|{qxz{lw~j~|x{}{x~y|yz|{uyyov{qu{}}}xz{x|rzxuy}vzsy}~|f|{zzx|ty|||z{z~|z~|z~|~}|zuyu}~}y}wvsxw}x}}~}xv{x{|y}vx{}{~{y||x|t}wy{ys}}~{uzv|z{|}~|{pxz}t{{~~v~{xz~vz~}x}y~utyz||~~weo~}|{y~~|qy}z}wxx}z~|~|vyhwusu}p{xyz|}rz~}z|x}{xuw||{tl~{|}}y{{{x|uyw|~}~|~~~{yw}pxyu~~~x}y~}wz}zm~yu|u}z}ru}|t|}s{}{xwlx}}y}z}yz~}z}wtut]qwwuwxw}xy}zq||{z}~vry~}~}x~yv|uxyr}wn~r|~u{z}xnz|xz{|z}zvvzs{z{m|xzzn}||{}|~{x}ywyszz|{r}fyv{~tu{~uu}yxwiuz}}~tjfkw|tyzou|u{}{wyuvxzryz|y~z~vspvwzzuxuyj~n}|r}y{}t}jwzuzuypqqx}|}zswz~v|vy|zz{y{}q{~s{zyv}wvmw|zqn}}{y}|cwxmtu~t}y|yz|~|x{yzynz~o{}z~z{h{}qz|{{wtv|}~~}qi|}|xrztiw||}yoWuyzjwtwm}}y~zzu|{zqvzzzvw~x{}}{m~sy|~y}x}p{|g~z~}yy~z{t}|x}y~~z|}yz|p|{~y||{{wx}||~v{{|}~}{}{w~}|~~|~}~{x{|~{~uxtx}~}|~s~}y{~}}w}xy}xz~x|}{vzxx}wwtx}~}v}|z|zzy|w~~y{}yz~|z{}{~|z}w{|zw}{~}z|z}~|z~ywv~~~xz}|yy|u|vx}|}x|{~}}||{z{}}{wz|}yzwv{}x}{t|xz~z}~zzu}w|}|}z}x~u|}|{}zy|~}}}y{}~|~~z|}||v}}|x}w~~~q~zyzxq}|vxt~v~~}~|z{}~wx}u|}{zy}wzvzx}{~t|~}x|s~~~{~|~}w}x}{}x}|~{|~z}|}~{tzzy}|xzt}z}~}|{~~{z{x}{~{|xt}{yz{wxnty~~~xwrqvqx{w~||v~z}~x|yr{}r}y|y|}w}}uwwwys|}y{x~~wvzy~{y|{mzxx}}x}y|s|x~z~zy|}}{|ux~qz{{v}zz~z|}wu|z}~w~|{~x~uz{|x|zxxw}{zz}{|~z~~vvu|}~wy~|zwx{q{~v}x~wu{m}|wz{{x{yzw~w|ww}{|vw}}y{zz}su}vz||{y~|~r}~}{w}z|{x}z~}~w|x{~|{{~qy|}{xz|}z~}z~z{}~|x{|||v{|~zv~wxy{v~wz~xrtx~~jz{z~~vy|uzu{zz~ww~{xzyu{~y|~{xzy~~x{w{u~u|x~yzy~}|}||xw{u{|Z}|r|uw~u~{q|}{zqt{||sz}u{{zy{p}w~|y|{}|}||}vzo~wx}{yx~}ls{p|x}~|x}z|s|wkz}|su{~xu|z~x~~{l{xyu{s{yyw}k~w||zy|~vwxoz{v~}zzzz{yzq{zr~|~}~x}}|v~s}{}cl|z|wsxw|~{{}|~|_}s{}vxy}}~{t~||zx|tx~~|}~v}~~{{~r{}~|z{xs~yp|u|w|{{ww|{xx{uw~|{{|{yx|y|~u}~o}{wv~{~s|zz}y~xwxzxvhk}txzzw|}|||y|nu|~|vk}zy|r|uw|~wx}xvzz~~}{y}x{|s|~uzrx}{z}yu{xv{u|}s}}|}v{{zuy~zxzt{z|xu~zs~s~z{{}|}~sz~{~~y}u~v~y}xmrv{ro~vy}~|}~z|~|y}~w}}wx{z}y{z}q|qz~ry{}s}}x{|{zxv|vzvwow~}|ww}wuuzz{wx|r{|}|{~~{yo~{{y||v}x}~q|x{~x}xzu}~zzzrs}myyr~ww~v}||x}xu}~u}xszzuty|y}|~{z{~}x~|wz~|s{|r}|~|{wym~z{}xz~|y|z~{~|{|{}w~xzq~xx}ou~tz}}yvw}zx}~tv}u{|syy|yx}}xw{}{}w~}}xqyy{~xx{u|{spsz|{}vs{v}}}u}|zy{y|{zy||s}xz}~}~}y{~|}~lqwzu}}u~~}yszv~||wwyyvzt|}}~{~}z|~l}~~u}|q~}z{}}w|r|}~}|}v|y}~zz}wvy}~}{{s}|wzxw|~{~zz}{}}tis~|~}u{py~zuv|~y}y~|~{sz}{yzy|}nw~~zzqy|{tm|}~~}}~~{z|x{{}ny}~~~x{q}}|~w}~|~w}{{{p{z~wy{}y}}yu|yp{v~xz{w|}~{~xz{|m~ytx|u~q||xx~s~}~x~uk~}}~{|}~}zy}vx}{~o~|~x}~qd~ul}|z~{~qeu}w~~|~|t|wwq}ai~|yyytz}~}{}{vv}|zz{{vz}{xwx|~z|zzw|~y}zz}p|y}q|}}|z|y}wzo~|x~|}|puuw{yxzzzy{|jz|vzb|{}z~s}}w}}|t~~~z|~|yunsyz||fuz{{|pye~{uz~}z~t~{{{}zysy~wt~~|u}y{vs}}xxz}y|x}u}|xx|{wxz|}~zz~|{w{yd{xyyu|{yva|}~~||}|zyx}zunw|}yt|wzz}|~wyn~wr~{xx~pkisv}~mz|x|tyx}z}uxz|{{|wxwzs|xn|y}|yt~~}ywqtoz{}w~|zst~ztv}~px}}}y|pq~{xr{}vyx~~o}xSmv|}~kz|sxpy~}|z}}~tz|ur[w{}vx}}kxzms~~zu{v~{~jwyz||||zz}w~ixzzq|k{yzz|y|}|zxv|v|}}{z~~{w{|y~~}zy~~||~z||}{wyw{{y|}|~|~}{}z~t||uz|}}|}|v{}~}|{||y}xz|{z{{|z{xv|vt}~{y~}tzuy~{{|~~|zy{|z|~z|~~|{|||y}uzs|}z|}p}}}|}||uzyz|y~|t{}wt~v}{r|}}{xw}yw|~|~ry{tz}|xzwq~{|y|}}uz}}y}y{{v|~{|~~~{|{}{w~~vz~|~zu|s|{ywx}}sz~w}}}}~|z{~y}}{v}t}~~{|{}vwy}}|{zz}xt{z{yzztpvx}z{zx}||{|zw{{|x||~{v~|~s}wwt~|z|}xv|}|}}|z||q||{y|w~xzv}}|v|~x|~~{yuyzw{|{{}~y}~vzx{}}y{||z{}|rz~s~jy}xm{}y{wv~}w}z}{}}t|y{{|u}xtsyx~~}u~z|zo{|z}~|}wq~t{{tz|uo{~}{|yyz}x}ryz}x}z}x|t{y|y~y{~}}|wxcz}z{~z}{~lz{s~w|wuy}y|z|t}tz{j{|wu|~o{{yys}x{y~t}{r|ytsv{~~v{{~xz|}}z~}{~w~y|t{~}{|zyw}}zw}{}}{z{~{y}}||p~~}j|zsx}{v}i~q~}~xhwzv{pw|zu~zz{z|}}{tzw{~vyvx}{ys~|}}|t}s}{|}z|w~l|yv^{yz|~z|}wqxn}~{}zyztx~utq}|yy}yzzz}|y|v~}{yiyzv}z{{q|~~|~}}{|{z||~vx~~z|xzu|}|~yyy~~{{yx~}v{{|zzzz|{{z||z~x~u~~rz{{yvuzyx~s|w|}{zu{}{{~txw|{zy{y~~|qztuxxwv||}}}}wzzzx~w~~}uxv|p|t{}~}{z}yqx~zr{{w}z||xzv}ts~v}}z~~}vw}}|ztu{qzz|{~}{zyz~y~|~z|}{}rtwv}z{~}}yz~z|v||}t}w~x{|~~}zpuxw~y}zt~{xwww~z~|{ysk||{wxzy{}}}}{z|zzzw~w}|~tyy}~}|{xuytyy{~{}z}v|~|{y]~u{}z}}wzy{}rx|x}y|zzx{|u|~o}|z~v{|wu~oxx}t{wy|vuyy|~}||xxxxu}{~}pw~||~{x|xyrxu{|~vxy{yz|~z}}}}y{|oz{||~{x~|}zvyz~~|}z}yq~}yi}}}xz{{yyu}}z~wwtw~u}~~}w|pzzzv}}ztww||z}~}~~uusyy{zz||}s~~~{~|u}|tp{}z~zvv~~q|~~{rx{|~zwpw{}p||tv|zw~|zxuw|{{y}}w~}|{~~wyzyvzk~~~z|y}~zww~v{z|}zt~{y{zzyzyo~z~{zzux{zw|z}}nxt||~|{zvxz{yuy~xzu}}|z}~urwz~|{}t|no|qwv}|zq|zt}wp}w~wxxzv|zv~x~}xy{uv{}z{q||u{}x}zy|xv}vyq|u{vv||~w{{{}~Z}s|zu}x~xv{~zzz{zvr~{|pr{x~t|x{w{yy|||ziyw~xtvzzvz{l~}zv|}sxi}|~gv{~|{~~|xtzx||w}s}xtx||~ot|ry}}}zx{}}vw|}|x~tyy~r~gtxzyqu{u~||zxzf{z}x}xwy}}moy}}{|y~v}~zwyh~}{wzxu~t{~{{z{zuxx}{y~rlz~}y}yj}my}xus|~}|zz|w}tszyzt|wzxqtt~{w{w|t~}}|vmqudw{yv}rzw}y~{}~xu~~{ysz{w~s}v]rz|{}|{{{z|wy{~yu}kz|}pr}rwr~ozsryv~yyz|q}~|q}|}t{|}zz~|~yxou{{{~{{{}~|{~{wz~ysq}~{~|ny|yu|q{~|}x}s|p|qus}z}{}}xt{|m|wp{x{~xty}~}}}~}{~x|}r{yzy||y{{i~|{yy{}}{ww|y{~w{y~w~|v~}w{}x|~||}|~rt}yu}}|{~{|}~{|v|}}}z~x{w~|{~~~y{~{zzyt~z}~||x~}~~z}}|~|v}z}}x{|}~|u~~xc~|}y||z|z}}~wqwzw~}}}zw}~}x{g}|~}zr|y|m|szvty}}v||s}u{yt}y~v~{t~xxz}v}xz|tv|x|z|}{|~}~}ww~||ms}~~|}s||}~uwo}}}~zuyt}w}jy~szy~~z}|yz}t|~l}}{|w~y{||yyy~yuzy}zrwz|wx{zws|}}v|w{z~}yi~z}y~yt|}{{rx{|j~{yz~rux~yv|~{~w~|z}~{vz~{{|u}v~~xtqxrx}{j~~{z|w}x}~|rtyx|~|}~pwv{|w{~|ru~z|uqxv~wnn|}||y|}~tvv|qyuvz~z~y{~}wxy}|{~y|yzy|{ty{yw~yx{z{{{w{z|}xvzt{p||{o{{||zyzz}~zw~}mtw|x{~z|~|x}zsxzu}x~wry{px~}y~|z||}||x{uq~}y{kw{{}sx}y|{|{}mz}z}u{~~{z~uyx~u{u|{wyy{{qru~syyyz~xyw{zz|w}}zzq}wv~|usxmzwy|yt{xriv{|uv}y|xrw}wr|mrsnzsk{||z|vix}uwuuv}}~wf~yyvqyjzyxv{}wwz}|zlyvx|u{xzuul}lvtys}s|}zvzt~||zs|szxxv{v}sqqrzyvz}qo|puuvxqz~}~}t~xytr`rwx~vt{yq|z~zusy{~znvyps|qtws|{^r|vz}v~tyur~wyryqqwxu|{{{xwvw~zgy~|{|y}|~zy~t}xtytz}n~[||spwbxt~o|tuyxuyzs|kzyp~tv{zUyzxpv}my~oyxxy|}xwwz{~uyzxyy||wtz}t~}{ty|~|z{zwz}x~v}~w|us~z|z~u}wrz~|zzxu~vv|~|xw}||}t~}zxy}w{}z}wv{}uw|~uy|xy~y}t~zy{yy|}}zt{y~z}yy}wzxx|y|~|~|yqyy}~u{~}|{v}z|z}}z{v{y}u~yxzxzzt}{{w}vw|z~}}||zxzx{wswz|}v~}wyqu{|||{}}yz{xyw~zswryv}n~|}~vuz|s~~}}yzr|~z~}{}wu}|~~u~u{xx|}zy|ytxy{}}y{{ww|z{zyy}~}~w|{xzs{||xzu{~z|{|q{x}vvx{~~y{}zxn{xu{wz~x}}{}|lx{z|w|{ut~~w|qwyzzz}zzyrszy}~}}~~|{}~z~g}}~vxw~yrx|zx{}uyt|zt}y|z~~~yy{u{~u}{}}}|xz|{}~|~u{}~{u{}|z}}}{|{}|}|uxnww{{z}}|~~z|}x{}x|~zx||vw}}x~v~z~xuuzw}z}zz}{s{}|x|}x{xnyzzz|~~x{|y}{z|x|z{|y~||~}|{zv|yz}w}|x{k}z}x{xtzw~y{|||~z~|~|zx{~~~|}{{zsz{z}~yyxz{yyz}}~~v~}y}}~~{zz|}ywzzz{|x{{}y|zxw}~~{}x{~}{{|}qrv}qzy~}x}}xvws{z{~~v|}|y}x{yw~{v~wwq}{r}}~{yr|}pu~xz}}z~n{}yuyzxrxmz~vx}wu}yqynvs|x}{xu{s{|{wysu~{~xz}ut}{zxx~vz}xx|w{y{zv||v|{v~y|}z~up~pwz~yy}q{t~y|~|}z{|x{zr{|uu~xsyty|wx|syyy~{}pzx|{y{}q||xxx||{|{~~rtz{}y~zuyv}xtz~z~}m}~|yvsz~y}txu|}}t~zu}}qzmw~p{|q}y~ww}z||{vs~}vxqww~~|}}z~}{x}|}z}|||||xv|||~|{}~y{}zjs~}|}|x{zxu|u~~tx{y~zvbv]vyw|zn{{v|~pq~|yy|}}wrz|}zu}~x}~o}}{xus{npx~uyxt}y|{}sxzzvzwz~z}yryy~x}rzx}y{uxwz|zwv{x~~{m{{yyxsy~zu}|xwvt~}~|{yx{yv}|vyx~~u{|wwxy~zx{~~t|~y{z}|~rqt{{z}|{}~{}}vz{{zx}|~w}zy{x~{s~xzy||utz~xuz{zqqx}~vy|}zw|z{x}z{vzs|yu{z||}|z}x~v}tp~~|~~y~}z||~v}~~w|zhou|upx|ry~z}y}~y~~~xtz~|x|}y|zw{|~m|{}{~~zr}~zx|rx{{~~{syz}xnq~}|}|~|s{}{x{|{wx{~z~}y|w~~y|w}}{}zt~{y}u|qzw}{yt{|x{~zz{}x|z~y}{xxyzx{{ww~y|}w~}{|}|zxp~x|n|}~x|yz{|zv}~{~yzzs}w}xsy~~|sww|~}~{|~}wx}|{zyz|y}~}|rw}sx{{{|u{z~w~~{~yti|~{yz{{|}oz|w{{~|{{y~z|v|yx~z{t{~~~u~~p|}z{{|xw}~p|{x~~~h~yyy}z~{wzzsxy}tvv}||x}y~y}}v~yuw{z|tyr|}|tzr||uxtx|w}y~{v{t{~t~}mwvyw|yxy~y{yvw}w}~|{z{}zzrzuzv|x|}~~vvv}zt}|{xt{s|||~||~v}z}z||rzu{{xw}z|z{v}{ttyvw{~|~o|x|w|}yw|}wvy~yy}xv~w||}|xzzx{{v~|~}}x}yxtx{xyz|y}~|xu}{z~y~zxt~{{vxw~~|xj~z|{~s}wxy|~}~yu}~yxz~~~{yhy{y{~zzz{}||{}{v}m~yvs~y~yrzy~z|}{xx}y{}z{~s~x|szy~}rzz~z|~}xx||wzz|{{mx{z|szv~x~r|~y|~|sy|}~zy~{x}{}fy~{{||zz{}{z~y}|wr~~uzw{tz~y}vu}v}r}zl}~|xz}z{}z~z~q{yrt{{~|wl}~zv|{}{x}{s}xzwzquy|q|{v{}s|fut|{zzx~t|w|{{|~~}}oa~x~}vs~}|u|{}s~s}{}||sz~}zwvyzxuz{||z}|~|ww~z|}uz~{{zxl}}~~}}}n}uz~y|z}{n}|~{w|z|tw~|wy~}u{{phzzx}t{|z|v{y}y~zr|s}n|}yxt}zx|ytwt~{{tzy{zu}kty|~}}}n}e}~zzy{|l~~xvwup||~~{~zi|~|u|}~|xzwxvo{v~}wu~z}xy~{zy}{z{x|yzuuxf}u{~|p}r}r}||y|g|zy|yzvxr~w}z~z}|{~yxz~f}{wv~{|z|{~|z~xyyjzwy}qw~{~~|~z}|sjyvq}xur~|~x}o{}zyuvq}pt~t|zy}qzy}|x}xx}y{|zuo||xywz~~u|~xo~t|z}|}{~a|ywp~~~|zyq~||y{|v~x~vu}|uz}zyz|{v{~{yx~~{r~{n|zx|r|~ny{{w||{wyu{|w}}|v}xz{{q~swyz||z{|{{xx~~|~tpvx{zv~|q{{x}}}~}lxz{t}u{|xuwt|}y{rz|~z|v|{}{zwwrrxywp{}{kz|}u{vr|x|{||xv{~rq|{}v}~~xsy~~yzxr~{wryz|}zv}|u}~xq}yx~~|}}yx{wwuf}x}sm|{v|~|q}zu}|z|xx~zz}||~~tnx{~{|{x{s~|~xxxzwxvw||l{{|{z~yxx{r{s~}xvz|~x|uvzj~pyr}cwoxwr|~ztxz}wq{}w}u~y~~|yfn{uqx{{x|{xw|yw|w{st{zx{ryzvx}||zuuoytze{uy{|{yv|{|wz|}{||sz~z{~y{|{wz}}y~{r}}r}~zz}{~r~{yz|yx~tz{}~{}}|z}{{y~|o{{{{}yz||~~ztuxw{~w}{wyt{x}}}~x{zvyxtx{y|v{}rz|}z{|xy|~z{spw~x}||~z~~zs{|~xsx~zz}~|||~zwzy|vzz|}xwyy}v{}}yw}xw}~~r|x||}{yz~y||~u|{zw|y~z}{|}vtv~}t~zrw|l|zw}|w~zy~x~uyu{xt|||zzw~||yzr~x||x}}z}{~}{o~{~{xwv|{p|}z{~u}zs}{}yxy{~y{xzyv|}y~tz~}y~}y|z~~}~}{rqw~t{{{~~|y~}w|x||u}~~{w{zz|~u~{zyxe}wyv}z}|}|{{|yy}||z}xyzfx{l}}z}w~ybw}vz|x}}|~}|w}yw~x~~|}vz||{yx{{{{~~py~~l~~|z~|y|}~h}y}yzwq~|y~~{v{u}|{|||}~z}|xw}vx|{}|v}zxsy~xwxj||}}z{}z{~|{w~zuwy~}}{|vsy~}zwz||Z}z}|{v}}o{|w}|{~~|||}~}||}w{|~zw}}z~}|wwy}wwr}xz}{{~~}y}~|{{z}{s||y}}|x~zz}}}zz|x}x}z}z~zz}}~|~}}}rw{~{|w~w{~~|~ywvvyv}y}}}~{|x}~}}|wy}wv{~{z~s~xwwz{|{z{z|zv|{{|z}}y|t}rv|t~{wvqzx~}~z~u~}wpx{zr~xr~~wur}ys~w{{}s|v|wx}~|q~}|qs{}||wxz}v||w||zx|~zws{oxtvyhx|{}t}z}to~x|{{p|~wzow}wx{~yu|}~~||}}vuy{y|s}|wt{|}ozw~x{|}w|w~s|y{zz}}szy~}}}yuyv{y}x~xq|vx}zt{y||~oxz~y|tw{}z}|u}}}{|y~v~|{zyz}x{s~z}z|ut}zzv~|{}stuz{~x}}r}u~}yy||xu{rvyy{t~~zzx~r~vyw{|rs~vz~{}~{zusy~zw}y|~zwv|srrtyzzwy~swuqxxty{x{y|yzr|~}|~y|ko}zq}z~|~vy}ywzu~~y|{uu}~x~sy}{_z{~||xv}yn{{~w|{wzv~}}yv|{t{w~z~|r{~g|lnry}xv}yq}{w}ztv|y}xyz|{vyz~{|}zvs{r{gw|x{yt|xw|zy{{w~{{~p~{uztv||z~~zvw|~~xuyuuxy~z|y~}~~upxxzvyzt|}|jv}~|}|rvvzt}rvoxvj|}{}||~xvz}wy|xp~zy|oxwq}}}v}y}v}tp||l~surs|w~~w}xy{yx|wypwqvcuvv|~x}uu}{z}||ls|||t~}ywsz}wt}t}}{xzn}ktvyuy~|y|z}{z~ztjyz~utyy|p|z|k{z|ww}{s{x{kxz}ys}}{|vvxyvwz}yzlxos|zw~uy}~xzz|v}qyyit}yzuy{}}xzy|~xxyu}y{zut~{zzz}~}up~z~y|rjg}}op{vvz}|~}~xrvw{{yx{wr~~~z|z||~s~txz{{wy||w{x{|}ru||}v~r|z~w|l{{||xz}{~tz~n|w~y{x~u||}y|w|r}{xx|tyy}xy|{xyyyx|x}pr{uxx||o~k}xyt||~w|tuy}xmz}zzx|pyyz{|{yy|zrz~ryvpv{tvw|z|{}yy}ztwg||]o|x{~v{t|||z|x|}mvwu}x{~|wv~vmwrrnubyx|s}}zw}x}}x|uxw}|zv{tw{wy|{}}nv|~r~q{~~yyzu~txwu}yts}yxvxv~bzw~wo}|~~|zyx~x||yt{xzb||s~z|uovu}|xxw|uww~t|z}|z|{v}yxhs~u}hmys|qyt{x~z}p|{{~}w}z~r~}~v|t{p~~}}{t~~z|z|x~z}|zzv~uwx|vwxkl{|~xzx|w{tw{t}wz{{tzvvwzxltq|}yx}u{r|ytzr}xwvw|s{|q||q{r{}|ux}p~vv}|~~s{~xl}u|y|||xx~yw|s|u}v}|y~wyvo~z}~{tz{q{xy||w}x|o|}uy}zzt}t|}ut}{yt~~yyuq~qpwzgz{}k{}y|~_}s}~su|zz`w}~n{yzu~~~{w{|||{{uzy|p}uwk}u~yxwuywzu~pzzywvxxyvz}z~|v|z{~~z}y||~srw}xsgsw~{sxvu{n}yzg~sw{}|}t}|y~zo}z~x~y}vuyx~p~y}tv}srxz}pqzsx}||vqz~z|rx}{}{l}{ww{wwzp}|nr{z|yyrs{|x|u|}{vy~y|n}}n|}|yvty~|y{ry}~xu{y{v|muxyy}tzxuurxrw~xu|yp|tzxt|gt}z}{~zy|uzzs~xz{ry}~pr}u~wsz{{}}{~xyoh||x|y}|z|{{xx|}w~~vu{}x~xu|y}}y|{u|zxy||{{vw}}~~twrcy`{~y~pmoy}x|vw|{{~{jywrrz||uopz{~wxlsbns~y~u~|wuyyo{{{|z{|{|xzvxl|x~pyqus}z}vxv~qyuzx~}z}w}y}}v{kx~~xw~s~s|q||yv{~{x}~{{xt~}~}~|z}ium}~tt{x|{v|x{w{{u|wxy~{{xz|y|zvv}{ux||y|y{|}~~|vw~{~zwrxyv{kw|yz}}|tx}{|s|zyxx}{yx~|}{}ww}|~j}zux~{~|ty~w|}~~y|x}www|w~y||{v}}z~~~xou~y}zy}uuzvx|t}z|u~}s}yz~z{{z{~w{{{|uwwryywzt~y||u~|z{}wyvw}yjz}ylwv~{yz{wy~{s|wzxrxw}|||y{}|}y}{}w~xx{xR{{}t}wy~uzxv~pry}uyzy|{x{wz~zx|{x~|}zyxxxp{|nxu}x{}qv~~c}~w|s{}lx}|rxw}|z~qy}r~vzx|~{||}~t~|yzl}}xz~v}vx{{||{}|su}pz{{{y|{}y||w|}vy~vz~y|z}x~|zv~|{|vww|zzu{yz{{v|~yxy}||yvt{~|||}u|~zw~{{{~|xx{|wvq~~|w~y|{|}yx{w~wx}{~|k|x||||t}{}u{}r~{}y}wvszy~}|owzu||yxy~|yxx}}}|w}z||w|{|}}|wv|u|}~vz}zy}|}}}xxrs}||vy|sw||{{yw~tyxzup}||w|~xu~}}y}ux}}{oz{zwy|}|wty~~}z{yz|{xryry}}x|q|z{zy}}~v{|rq|x{{z|}{wt{{|}x|w~|yj|x|uwo~pr~~}xzy|r{x{x~}|{x}z~}y|{w}w}w|yhx{}v}}qx||yw~xu|u}|q|~{zf}yy}u}|}rv~yz|xjpysyzu}{~q}~wxr~~}~zt}r|~y|tk}zv}|~|wd{{|z}xy{zyutmwy}zx~|zry{}z{wxxs{~iswtny{t||v{|`}azx}at|xzxu~v{zxz}vgrz~{p}pz~k}z|xu^r}yxro|}yz{y}y~~~o|z}xxy{}v~xttr}w{y~zt~r}wzx}}}wwz|vwsxzt||xs{zz{wfz}vvyzzuv|yux|~xuw}{q~}xh}mt}|u}xw{m||t|||}}x}yv~zs~}}}}{z}~vzp|}zvw~|q}|z||{y}}vo{~xt|w{~~|{pvwnyd~{}}}z}rx|{~vj{~{{yz}zw{|a}y}y{w|z~yww~}}zoqyn{y}z|xz~~t|}y|}x{|~|}~~}xzynz||~}~}~ywx~zs{~~}}}{y}~z~qyx|~|{z}xzy|p{tn}|{~}|xyxuw{~||{|r~}~~}x|}y~zw}t~xvzy||{r}|{y|{~z}u|||~|}|{}~|{x}u}|os|z}|yv}}gg}~or~|z}}k|}xx{}||zpt}t{zu}}wy||~|~{p}uz}u~}}}}}yyi~z~z}i}{{|}~z~t{~}uxvw~us|}yx}l~|{~{~{~y~yw|z~wyww|~|wty}~}t~q}{z|~|zw|~|v~wy|~~zz{~nvq~~yzz}|}||}rz}t}}~~}|x|zv|z{~|x{vzt{~z{w~ztxoy}|xxz{z}|t}y}u|}vz|}xz|v|x|vw}wx|~}}}u||uy}{|{{z~v{~{|{~|z{~vw~{|~~{}{}}|y{|{zs{|z~x{|z~~z{xvv~v|z|}||}{v~~s~}z{xyw{vuz}|}z{|}vz|~~}znsu}z}yvuwx|~~z}~}|wz}}{~||~}y{~|}vx}}~|~}z{ry~~zz}||{s}~~~~{~yy~zzx{}zx~zy}v|~||x{{|v~|y~{t}n}|w~wyp}||~y|{|}xqq|t~|~{}y~~~{z~yyr}qvznz~{|~yz~zy|ry|}|x{y~~}txy{|z~}s~y{~}qz{{{~y~xr}yyyz}y|~~}~}wx||{|}ys}|p|}~wy|{zwztuv}|w}|wy|~yq}|xw|zs}}{~}y{{~~~{z|z}ws|}~}}ss{~z|~~z{}{y}}|}~}y|~|z|}}z~t}|y~xwyxs}y~}wz|xtzlru~~s|lv{z{}{}{|}{{x~~x||z||yz|w~zyqyy|w|~w}|v|}x{t{}|{~}x~w}}zpw}~ju|y~}|yty}t}wvwz}yz||~xt}mssy|~w}}|o{{z~vux|}y{tvzjwy}}{{y~zy}}vny|}lzzz~~{~|x~yvyz~|{ly{bzzx{x~bs~x|~yzyvpy|{zu~~zz|~yyx||yvpq~~~yvyxz}}{|xz}{~}{syxxwyxyzzu}|}}~xzxyz}{f|s{{}s{y{owt|y~zvtzy||}k|ymz~}x}}vz~}{ut~}{wz}uzvw~}x~s{|{v}wtvx|~k}wxz}{~}}k|y{~}}pyz~||{x}x}w~|~y|u|y{zx~|}uw}|pgzvy|vdv~{zstt|g}z}uyw}ouy{~}{xx~tvz|zy~vs}{uzzx{}{~y}vw}{w~q{{~z~t{xzzvuz~u}xeus|}|y||}wqt|}pt|{uns~~yy|xuwtz}wrk{|yl~r|{zz|lzz}z~~~gz}}|}}~~z|~vu{q~{v{{{|x|~{tz}zv}}u{|swt{y{t{~~|uwv}w}y}}}~~wu~~{u~~{}{{|ww~w~{}zz~}n}|{{}xw|}y}~|zzw~{|}}}{||{z|~z}~x}~xwzxtz}~|~}}{z{~zyw~x{x{uztt}z}|~z~|xzxx}~z|m~{uq~{}{{v{~ux}uzom{y}|~t}yz}szyx}}{yy~~y~|}u}z|u{{wyq|~{yzxz|~zxp}{twt|{sroxwtz|u~{{|z}|sv}sv||ux|zqw}zy|}|~xr}wsyx|{~{~x~yy~z|xz~p}ya{{~x|~~{}}}|zz{}v}zys|}~}y}z~|v{~~zzxzyx}|z{z~~z~zwwz~}}y{yxys~|vvx~}}}zxy{w|{zyz{u}{|}qzx~u||~|}|~}|y~||x{|zw{u}~|uy}z|{zv|~vx~~}z}}~{~}~~}{xw~}{y}y|s}yv}~y|{z}u{{w}x~xrz|}z}y{v{}xt|y{|{{z}u}}}y}|y}gy|{z}|~{}ow~w~~}|{yx}}{}~~{~|~~x~z}|y|zr{|z|~}~}~v|ryu}|ut{|~{}vzy{w{xyzyxvzwwy~}~~z|}|||||}}w|~z{}{xw}~|}|x~z{}~{~wy|y{xw}zvcr~u|{}x|{wy{~{}|pq{|xuw|zyzy|x||{vzu}y{{{{yvyzu}z}uz~}{~}zs{xv|}u{}~~~z|~wwyruv{|}st{v~v~}|z~~yyx{yr}}yn|{}|~|zvqt~u}{~y{y|~~vu}}{z}pv{z}vwz{|zx}{v||xz~ux~zyy|s{{zvz~~}uxk}~zz~uyx{{gu{}}{}~w{s{~u~|x|}ywz{{~w{}}~}z~y~y{x}}|}w{zssyxx}~}~u~q|t|}~|~vrzx~z}u{zv{uxv}zy|}}~xzzm{rzw{tzzup~xzz~wz~~y|~}w{wxy~|}|}|y{z}x{o~}u{|~x{y|zyyty|y{{wzrty~{|{y{x{t}}zwm{{vhvz}s~{r|l||zu|{{}~}z}{|~zvu}}wz{|}zyvyz{qwzy}w}u}~~|}|xzvq{{v|~yz}w}ox{ey}tws|~|{ux||xxwzy{~|w}~{||{z|y|}~zxtv~}|}{|t{|u|zy}|~x||{|}zz~yxq}}||||}|~r~{{}|x~wtt~|{zxx~}~~{}y{}}uyvxy{}{}x~zyz{zu|~qzs}k~q{l|{z~~pzupj}w}|~xvzz{~{xuv}{|}{p}|szwt||~|xwy}zp}~y}k{x{x}{~}z}v||~r{~{v{zw{|}~w~z||vt~uxz|tyv~y~|}|y}x~yz{|}tzkmxyy}~s{y~}|uw|kwm|{~yv}}z~{|fvz~zzy}~~|s|}n}~~}|~||~s~v}zu}|r{z~}{txs|}}yywzrq|{}|{|y}xsxx{|{}uvx}{|j|}}~|t~~~u{{y|~m}y}{y}{}sxx|{|~|}|y|~{{~}x~zx}t}|}|z~|i}~{{{x|~||y|y~}}}~||v~~{s|z{}~}{}{~z~zv{~~i~k}{{uz~|qy~}||z|{{y{x~~t}s}z~|x~|w}{{v{u|y~~yxy~|w~|v|yz|{uw|y~{~x{{~|zy{{y~}vyyy~~||{zwyn{w}}~u~{v|y}wtn|~{s~}|||l~||~}y~{u|{}ze~zz~{w}lr{xzx}vz||||||{~mwtu{u}z{wzt{~~xz}xkzzi}y|~xz}}br}x}|y}~~|z~~|{~~z~r{|v}u}s{||x|sw|z|{utwu}~y|x}n~}|x~}|{|{w~g}}}}~{tzuvzw{{{s}~z|tx|v~~}{}~qnrv|~xwnr}~v}yo~zx{y|w|wouz~y}z}~u{zx|~z}y~|}~~|}|uyzy}~~}}~|}~w~l}~z~xxyk~{mvt}|eo}y}~~}|}m|z~|z}s|wxrsx}x}|z{t~~~~|~{y{tw}{}xy||y{~}vv|~x||{x|}~~xzx||~}y}}}{{}tz~{{s~z~w|{uw}w~vyyyz{l|}|o~||yy|yv~~|}~o~{zsp{}}|z~z~|||zzz|z{x|zy{wzr||~}v{|x{wz{u{xx|z|~~|w|~xyx}{{{zzxrxz}y}z{xz~uz~u~|ux}~z{t{zxy~{~~~||zy}}~~~z|m}~wvzz}z}{~zwy{}{w|y}||zzx||~w~}y|{||}zz}~wyy}~|z{x}u~}{~|w{z|~zx|}}uyzx}{~{w|||zy|z~zy{uy|y|~}~my|}~w}|zx{}syw|{~~y~|u}|xz~x~xz{|~yxs}{vt}}~~o|x|yv}z~{|||}x}{z|{xz}{z~{|~m~{~~}~y{vxp{~~zrx|uq~}z}}y~||wy~|{x}~~y{v~~wu}~w|y|{}y}z~~}{yy}~~~z}||}~}~~z||{mz{~}{x{~|{~z~z~x|}v|~}{{zz|~{v{{y{|py|{{~x~~|}{}~zy}|}p{|}zytz}ww|zw{{xxysz~wz||x~|{w~{||wz}y}w}~s~xu{|~|tz|{syuq}z|y}|}}}~}}z~y}xw~zy{~u|z~py|}|{zx}zw|z~~~v~|~yxz}~{{z~~x}xy{{k~~zx}|{|~x}wv|~u~{t|{~zv~|vxw||zvw|~z|y}~z||{}|t{~~}}{y{t}|v~sx{z~~y||~}~{{{|v}zu}|{|{u|{y{x|~xz~|~z}z|{||yyk|zvwzt{xy||~~}|w}z|}w}|tywyyx|~{uzz{}yz|{t|ttwy{x}~|yztpx{}}|~~~{zyzzz{z}z|x~z|w}s~}n|yv|zw{p}|yw|z~wwu|~y~|{yysu~w|zo|xx}}tny{z~~xvy}z}qx}|}vts||~xu|r~}|~|{v{}|y{|~y}wx~zspzvw{~{~x~{}~~}x{m}sxttv~z|}{w}|{szzxu~{uwz}|}|xx{t{zsy|lyx{z{{}v}|tzy{tz{w}z}{{x{x~{y~{x~{yy~x}aux|{uzs~~{}}x}{~{~{svxt{|~||v{~~xzsx}}vz}x|n{{wu~yxzz{}v|wxz~{{t}}sy~}}{x~|iw~q~}wsypy}o~ww~xzw{y{x|jvz|}{yzxzxwn~v{{~zxzu|{|~rw|zz{~{|~{~p}y}{|~|}}z}z|{||x~~w}zx|vyu}|{w}}|v}z|vyz{vz}|}{v}|wy}}vs~{}{z~wyy|s~vs}~z|~}}y~}z}{u{}v}|}{{{yz}|vzxxz~{x|x}p~~||x{w|x|zu}~wy}{|~xytu~||}}|~x|n|rny|x~p{u{|zz}}xwyuzx~tv~~r{wxx}y{||~u}|uy~nw{~|y{}~vy~~znyq|v|{|q}w{wyzu{tzx}w{v|x~~u|}{}}v~|v|}v{}l~yx}{{}v~|y}~}~~y|s}}w{|~|y~{tz{xzyx|}w}~|{|{~~{z{nxy~}r{uy{~y||q~}t~y~}zx~x{{{{y~yy{}wu~}|x}}r}zu|yyzv~|{|v{}zz~y{{{v|yzz|y}}y~}zz~{uxy~y}x{xwy{y|yw{{zrqzyy~|wr{|}z{{yxz{~|uz~z{zz}|}uz}||||y}|}{|sxw{~y||{~}}||{z~u}{~vn{z|}{{~{psu||{y}z{zwzx|xyv|{z|{~|w~|ywwz|}xyy|z}w~xw{|~~z{z||~xz||y||{y{{~|~{~wyz{~|xsz|vtywyyz{s~~xz|}}}z}zx{z{z~w{~|z}~~{|zy{vu{{|{~{~t|~y|yz}z||v}q}z|||x}xz{~zzxyx{~xqwxuypmzypyxyuqnoypwmtrtuvq{zmzxtuwo|usjxz|urrysutvtvnqw{yvxrzm}kruvlgqWvw~yxuvyxusurpy{muyu{pvyw~suqr{}uvujxvvlvozoywpyyvxsyxx}xww{ysso|vizrw|plts{oy|kyrzzvwv}qzxxwqzv|orx}zwox|swxomht{yxrrvrwlvtr~xyuxwxnxwluzlt|zzqpq}sxvuzwtkuqpmsvytwvyxr~yu{q|rvyvuvwttwwtrx|uwvpwkrxxtmsvyuypy{vustsrursnpnxxx{x{vpuw{itt{ltwktyyrtyyrttnvvtjtvtryrzxyvwvuo~}tz{wprow{z}zwuwxyy{zns}~u}z|x~u|}ry{wx}z{~uszu~|}yw{~yy}zq~zvxzy}}}{}~{{wtkyyx|~z~x{wl}xy|wxzz~xr{{mu{}zt{}wz|x}vy~z}{z|x|~|w}vtvu}qpy|z}x{{t{uqvxz~~zxw}vzq{sx{~yw{}xoxsy{|x~w||y{~{s}{{~~~vymwvz{}{x|zz~|vsw{u|z{z{tyv||z{w}xr|w~zyxn|{|~xy}yy~|xx|y}ywv}|y{{{||{}{{mrxy{|{|sbv||{zywnt~{l{t|z|}uxlwrry~y}ry{vyzz|yz~zzu{tv}{{~y~t}}}v~|wr{~w|wq||rqy|vz}{|y}|yx}{x~y~~|}~x}}|vupr{}zzb{z{}fv|||zy}z}y{~y}xtyw{x~ty}j{v|{t{~uy|yzz~lyz{~}}ry}}y}zw{{unu||zz{~}wywxy~{}v|~{w{~z~~||{ty|pz}{~{~z{zt{||}{|x}{zx}{z}~{v}v{|u~pz~yz||y}~~~|tz~yy}rr~}xn|}yq}{}uw}|{t|}y{{|~y~~yx|||{wm|}|{|e}yy}y~w~|}y|z}uy|xt{|z|~t~|yt~~|~~~}ztvtxyxu{~|~|vpmut~|~zus{~}{y{}y}~zx||yy~{}|}|}}{~zvqxr}y}{z}u~{vwr~{z|}||~u{}|~|}{~z|n~~}||~~wzy|}vy{~}y}~}}u}|}z}yx}}sx}tw{z|{{z~}zw{||}{y}|}y~|}yv{xzm||zs||~~}|y}{sy}zwuw{{y}~}o||uzwv||z~x{~ux|w|}y{|vxvzvw~{z|}|yxzy|qyy~qxj{z{|r{|vxp{}z|}zvwzxv~}y~{yy{~{|{z{~ztx|~vv|wmozq{~x~xxz{sz}|zx|}rvz~{zywzuxwx{w{{~u|z}wqu~sw|{|}vw{|}{yu|yz{y}~wy|z}lz{{~|p|zx|~}}ouyxz{zy~}pv{r}s}xzw}~z|z{|z{~{{}tt~{~|zpx~s}oyxwr|zz|v}zs~|yvq~wy~y}~|||y}zz{zyx{|~}|||||xw{y~{z~yzz|}~w}}{y}w}~w{|~|{|{{vsvy~|~t|xy}s~zz|~|t}{uxvttq}z|wt~|uyy~|z||~}}~~|}r}~{~}||~v~x}}wv~xz|v{ytv{~|{}}~{wxyz{uzwy}|vvy}~|~{m|vzyrwz{wy~}}z|v|~wgo~yy|~}wvno|}yk{{y|wy{uu|x~~p~w|w|}{{z{}zx~|v~y~y|yw}x{}|~~~u{}wdr~~y~}zp}}rxuz~}}w|xyr|vr~z~|z}{~{z}|u|w~|yuzz{{|{yn|}zwwtz~}}uy{{yy}}z~}v~~tz|z{~~}{zzw}wx}u~x|y|}xr{nz{}}~w~uz}qy|l{v{{}z{y|xx~ztzz{~wz|~{z{v~v|{y~x{{wvy~|{{vzsytv}zzy|xz}z~y~}{z|ux{psuv~|{{{|w{w{}}x~}}v~{||~}z}{~~jwyzzwwx{|xxv~w}}v{{zv{v{ysrvo|}w}zzsZ{{mz~|gwz|yut~{~}~}~y}~y{e}|{{w~uze}y{v{|un|~zxz~w}wz~t~tvzy|{}|}~~xk}{}|z~w~z~t|}}y~u~hqzs|t{rpzy}z~z{|w|}zvq~}{}|{x{u}yyy~{y|z~m|{y}s}{yt{~|y~z~{x}z}ytyy~|{~}}{~{{~|zr~{}~~yw}}w}|xt~y{{~xy}y}{z{}|||z|}{~uz}~||wwx{ouzw||{|y~}~z~{{~}}~zy~v}y|y~~|||}yzw{w|~wuvwzz{}|~{|~~|~{~{}uy{|}z{{yj~uy}z~w~}{}zyv}ywzz~}pr{wzrv}{{}|z|vxx{}w}~}y{}}|wz|z|||{|z~yzzxz|yyu|v||~z|~w}v|~uzu{zw{~}|~{|x|}||}}|}y}t|zsx||~x}~{|~{ry|{yr}uu|wv|z|{{x}xu~y|w|||z~zv|ry{wy~{zxz~sv}|{}}}{z{y}vz{zwx}x~v~u|z{|~{}|n~vy|~wy~~~z|}}y}}{~{|}zp~{}zytx}{zvz{|}~{qyxx}{x|yz||}xw||ztwzv|}wzuz{}|{~~~xyy{~|zy|~|{~{u|}~v~}{{{{}{}wzu{x}s}}zzx~v{{}z|u{|~|r{}p}|dzp|}v~vwr}{}}}~{zw{|}|z~{xy~vx{~{|~s}z}|y{{|y~|}}v~}z{wxu|zz|}~}y{y{v~}{|w}zy}or{v{~|{v~}~z}w|{~zxuv|y{r|~wzx}y~zxzqw|~}x~{{x~uyx|~t|wz~z}}x{}ovrty{x{xz}~{}sxzu{|rv|x|z{~}x|}q|zy|uq|w}vwvz|}wv}}{zw{oxs||~{wy}~zz|{~{j|t~o{}y{~~{{vzzz|y|y{x|~zzx||x~z|~y|z}{}w}~}z|wty|uw{~{}y}{|~}~u|zz}{{u{xwvz}z}{|}w{{}z}{yyzz|}{zz~~xx{}w{|~y{~w|}}{}xz}{zw{z|xzy~{}zzy{||z~}~}|x|y~}~z{|x}x{y{|||~w~|~}|y~~|w{~~|z~}y|y~yy~x||yw~~z{rwv~y|y{yrz}zz}{z~{{~zv~z~|~y|{z}|x}}z~wn}xyw|yvv|{w}|~zu|{y~{~z|}z|}}|}|zz|}}wyx}|{y}y{||}|zxsu}|w{~~~zyyz}{}{v~x|z}z~}}xl~|{z}{w}}{{~w{{uyy}}x|}}w|{}~~~|uuv||xz~{~xh||Yzum||}|vvv~}}x|~~vz~wu~|wunv{~|yzw}x|xzzz{~|~~~xuwdzy|}r{|{||z{{w}|}}jk{zy}rxn{~p|szu{w{{}{y}{yvwp~~|z~{~nz{|}y|y~mu}{|~}y}}z_|ur~y~|}z}|~x~zz{{~|~||}}|{|k{zz{uz{pv}r}zztvv||z~}}}}w\{}{~}|zxz~y|{yyuz|vvdyy~~|~uz}}~x{{yv|}y|z~|m~w~}s|v~~rw}}~{~|z{|~|p~~w{z}{v|{}|sw}zyvyyw}z{}w{}y~wzz{rv}yzyzzz{{|z}|owhyvyw|||w}{m~zz|ys~}{}z|m}{{~wvuz|uht_|xxwz~|x|~||~{yz{t}}{|mxx||y~z~|z}|v{}y}z{x~r{y~xzys}}|x~x{u}|z~~|{z{y~~|~}~}y{y~vpzwr{{~|u||w{ywu{~~{w{zu}|zu|}u}{~{}vu}z|z~x{ytt}}y|~x~z|~}}~spu}}}~~~|zz~xx{ws}|u|}i}~v||~}{|y{xv}|{~~{|x{~w}~~y~yp~st|}|r|{{|wz|~|x}~}|yz~{t}s|yyv~zw~zxv|i}y|z|}}~}|yzy~{|xw}{yxu~z|t|lzt}}uz{y}y~t~z~v|~x|ty~y|{xp~r}}xqzv|z{|ys~z|{{{{yp{zyzyxs~zz|{z{~zyuyzuy~~~yx|}w{|}yy{|yz{}{{|x}z~}zy{{{y{|}y}u}n~|{{|{}|||y}~xz~}z}{}|}}z|~~~{}}|wr~jvwz~}{z}|~~}~xyzt~~{~w|y}zz~zy~y~}{z{~|}p~~}}w~zz|{{{{|~|}y||t~~|s|z{{{~|~x~y{{||||}~y~~~||{~zuvwz|_zu}}z}z|tux}~~|~~{}|~{v}z}g{n}xy||~yyz~}{}~s{{~|}{}{w|tw}zkz~}{~~z}~x}}|}|}~{}y~~}{|sz{}~y}z~p|~|}~}~|uyc||~wxy|zy}~{~zwr{vzzvzz}|}~~|}{yt~z|~|p|}}}{twmy}z|y}z}p|y~sz{p~{{z{}y~{{h~{z}|tzpzturwrz}}|zy{|}qv{z}w|z{yu{~|vy~unyyty~y~ttz||z|xyyz||{w|wwx|w~|z}x}xzvxy~~zt}{v}~|y|y~}~tw|zz|yr~|{z~y}{usyxnz|yuwuzsuw~y{y}xz||~ozy||~t{||}zpyz~v|yx|{v{z~~|ww|{}y{xxzxzzzx{{|~n}~zwuy{|{u|zvzy{{|}zs}wvr{~}u{vwu~|}zrw}|y|u~y~}|u{yu~{~~|}|xj|{v}z{xxz{~|qzrx|~uwxw|zy|s}xyzyyqmyy{~z}yww~xw{u}~}|{{xx{wwv~zw{~q~~yxyztz}}yxvzy}z}s{}~y}qvyx{}~|z{}}m~}zs}}}|z~zvv~wx|~}~{y~~z{}}}{zt|z{~~yq}}ry|y||y~uwz{}|x}x{}{wy|z|zx{}x{yum{t|z{{|||}vz}u{y}z}{qzx~~}ozv|z~~}t~{{zrx|{y~yy}}~y}zy}zt|z{zxyzwn~~zyxlzwz}r~u}~{nvzs|{yvkz|vv{{|}}o{~yxyxx|~{}|~usvy}{}xx~{s}~|}{zv~|~y~ry~{{yz{|}~{|z~}v~yu}z|{z~}~ws|zuyy{uw|}{wy~~~|z~|x{{||}b~~~z~}tysupvy|uz~ky|y~vyy}}}uw~qt||~{y}~{{x}{|iy~w{}v|w}p~tx|qx{p|}{~zq||uzmzz~y~}v|r}x|wz~}yzwzz~v{{v~r~vy~zxPswyur{v{mulxzz~y}~zzyzyw~spoz|w|{zwu~|}}}txymxz|x~}~x}z}}z}x|lx{z{~~wt|~v{xt~zz{}xs~x~up~}xyv|}}mw}}|}y~}lqtx|{r}}v|zz}yyy}}t|u{}z{|u}{vxxyuxz}z~}y}}~~{}yuvw}{yy|}w}{{qu}yp~}||w~|ix~wxzi~}|jwYjx~z|tyqzywr{u{~xvy}y|{}g~znu}~}~jx|{{~y|}|z~}k~wy~z{}|{u~|w|qx{~}}x||{~zszt}w}}y}~z~~|}w|{}vxy}zzp~{vuycx{yt~syu{ws|}}{}zy{ft}wtuyyv|otrz]p~{{w~~zp}wx|w{u~}v|{||R|{w|{}z}}q}}~|~x~{y}{v}z{w|}k{vy~h|v{~qbz~e}uuyxw~||}{wu{}zy}z}q|x}x}~j}|ttxs|{{|uz~zwuwv}{~~|yzzwv{z~{~ywx}{}z{}{yv~~~x}}s~{yzryx~s|z~s{|wwwv|yn~||{|r|z~v|~{~}}~wxx~}|tsu|yywzy|zyr|}|zxzx{}{|xz}||yz~{~{swzx{}v{|}u{u|tz{z|v~|{ovyxwxx}~}{{|xyz}{}w}v{}x~xz{z}yz~yyxx}y~|~|w}~}{izv{}s{||{zxi}{v{|}{}|t{}wzq{}{wy||wwyy|{|~rz|}x}||~y|}{|~ux~x~z|}|w|~ozyv{~~upz{{uuy|twx{}yzwxx|z{yxz{~zzzx{~y~}{}|}|xx}{w{}uu|us}}{y|v}}vr{~~x{{}y|r{}|}zyw}xrrwww{yu~zx{y~y{~~{x{yt~{~}{z}pz|{~~xyvwl|~vzyttz}z{p|~v}~{l|xx|x~|{vuwywzz~{}zxryvvv}~z}|y}t|~tt}}yyw|xxqwy|y{pyu|v{|uy|~|z|{x~|yx{z~~{~z{w}xzzw~{|y||{w{}r|{~}y}}t~}{zyxw{{zys~|wz~s~}{{~yxv}~wp}z{y~||vxyozx{~|s~z|~x{{z}}rwx||qsxxw}{|y{xyzt}|}{|}~}u}|w{{y||x~wyxw~~}u}{|wu||~~}z}y~t{{z|x}|~~|~~yw~}z}rwxv~~s}{swx~|yx||rz}}tmzxy{nznu{t}}zxy}~~s||{xwy{{q{~vvy|{sxut|v|~ty}}~yzzz}x{||~|{v{w|}~zx}~szuyzxz|trt{w~t}y{}~|w}r{yw}w~zy~wxw{{}}~{wxzw}{t{xwo{r{|pyyzsk||tww}~|y}y|yxs~t~|x{szx{~|zqw||t|ww}y{~w}~}{~yx{|~{wx|y{~yz~|v~|z|v|xw}|~z{y|~wrz}|ut}{||~}}{|{}u~|}}y}}~w{w~{{|}zu~w}|zx{}xzr|}y}|vxr~}{|{|xx|}~z||}yv|w~v{zv~}~zy~xs}{|}z{|}zzy}q||~}x|z}y~~x{wzzz{w~|}|~{z|}vyyx~{}{{~q|z~zzyz{{{|s|}yw|{u}r~y|z}sxwy~q~{}zvouw}uzs{{}||{{|~{}y|~x{~w{ywvpzxu{{}~v}xzz}{||pz}~|{zot~||yy~{u}wry{w||}}~{xz~}xzwv{y|{}ww|~y~v~~~zx|}}}{w}r|~|{qwty|~v{~{yx}}~n|u{qx{}}{}|{v~v{|~}~{}}|zx~ymz|~y~vyy|~z{~{~w}xz|w|}xwy{~||||~||zz{}v}}yz|}{w|z{~y~{x{}|wyx}~}~t|{~voy~z|y||z|{{z~wyyw~}}}y}yzy~y}yz~|ww{rx~|xp}|sy}~~}}~}|u||w{w|{}~}}|z|y~|~y}y{}p{v~y}~}z~t~{u}s||}y~~|}~zxz}|{}{|z~}}{{yvyv}~z}{wzt|~}}~y|{{~||{|~{z}~{}w}}w{}}{}|~yzy~ywwxx~z|w~~zg}}z|ux{}p|{}{}~|z}}x||}ty|}{~~{}zxu}y|t~y}}~{~}}|vxwvru{|~~}yy|{y~q~{|~rz}{{}u}{p{}{r}y|}|{uy}xwy~x}vw}}{~r|{{y}~}}y{}v{qwx}{{}}{|}~|~}}}z|~~}|{}w}}~y~}w|x{z~}~x}|zz||~~v{|~~}r~z|}rq~b~|~u~~}zz~|zzzz|~|v}}u|{z{}r|y|{~yv}~{hn}z}{z}{|z{|xywty{||~uqxqyuz~y{y~}~~zyz~||vtn{|~vzz{y|}yz{zz~{|v|my|z~vw{xy~|{x{{{y|{yv}r}v|wz|{|}qr~i{|}}|us~uyy~~|ywyv{~~v}etzxu|wsx|x~{~swz~yw}zv|{zs}v~{x{sxx{|r~t~u{y~~|~x~~tys~{{~|rvozx|uy~~wz}x}{~fu~~{|x}{~~|yz}lxw}z}{l}t||w{y|zu~x|}~w{s~twmz{~|{yy|zwx}|zsv|y}v{|yy`w}|x~~|z~{uwtvxxnxm~}mxv{}xz~ykv~wr~xt}}yzzp}|~t|y{}v{v~zxf|x}x|sw|{{{}{py~|yzy|qxv{vy}|~gy~{t|ux~rytq{}~|xyu{}~qux~{vzzy~|{w}{||}{z}zr~x~{k|~~{{wvx|vsi|{w}w|}|xz{|z{|{{vjy{{}p{mwt{ozw{}|~}|e~}jyzxwx}y||||zy|w{uu}~v{}j}v~y~yxt}{z|w{}{n{|~|zvx||z{}}y|~~s~y~yzzb~||~vzn}xq}}xz~~}{}y}e}yrvpy|u{yo}}~uuz}r}}}oxr|~}}~z{}u}z{{s{z||||{rz}~}|}zwx|}z}|~{qr}u|~{|z{{}}us{{||y|vz{vyw{|{{}u}y|zw}}}}{}{x~|}{|z{xy}u{oyzx~w}x~{w|{|v}q}z~x~txy|vu|~|{|xs~s}x}z~y}}y~w{y}|zzy{~z||{|w~}yy{x~s|}v{~~}|{}|u{qw}n|z}}vz|{{~|{s~xy\}}|w}w|}yy|w{z}|{z|}w~o}z|}}|vywz{{|zky}t|x{~|}v|yu{~|n~~}w}zsjv{~z{~{{~}gxw~{ttz}z|}z~y|zn|~z{{|z}{y|u~wy|u{}}}v~~{v~{~cuy|z~}}z{}~~wyz}zw|yxsty{~}y{{z{|{hu~uzytym|z{yzjv|}vowtx{~~|}}x}m}{t}}|{ow~|w}}{z~z{szz|zzzwy|{x~~~~}yz}~}~~z~{yswg|z|}|{|z{}}~zv|~{~}~y~{~u}wyy}|x~{x{~~}{yt}}x~{~~z|u~wy||}h~~|}|zx{z}z{z~s{yz{}~u}sr}yz|z}{}|yzs{w{}v}{{~~~}r{q~~{}x|zu}tvq}{{|{yqiz|~wxw|x}wyq|x}v}{w{x|zw{{vz|{zs}}vyxwzywy|~~}|u|}}}}h{y|{}m|z|zw}{y~{~{|x~{{zv~}|z}{zur{~|z}}}}zv{}}~z~~z}vt|}|r}}ey{{uzt]zx}|{yzwvq~~|v}yzwrtgz|||||{}xxy~Yz{~z}|w~}{{|v|xw}w~vxa~~~{sy}zy~u}}~~}z~z~r~~~|~}{|~v~|p}}xzwxw{{||v~{}{}mx||zt~xp{}zw{{i}rv{|xu{zyvz~s~~{tx~vy|}s~z~x~yz}}r|~y|zz|ugt|}xz~{}o~}~i{zzwu~y{||xys|yo{z~||yzo~u|~|wvu|}wyy|~w~x~}|~}v}~w~{{}{|zwnd~}uwx|}~t|}|~~zo}~oy|}ysp|{{w{|~{y|~ou|}u}zxwz{vy{x}~{z{~}{v{}{{{z|~}~}~|yz|}zyz{u|~{{~wx|~z{}rz{}y~}{}}kzy}~|ut|sz{tx|zvw}xz|}y}wzy}~x}|~}~tz}x{vu|~yxyrxzx~{x}}~{||~z~zyvtx}zy{~yr}~|{x{|yyr|~~~xu~}{~~~{{{z}{|~x~w~|~z{||}~zv}{z}zz}yx}p|}~~Wk{{z|s{{pz{}~w|z|~|~||yyywzny|~~~}y}xowr~|v~z}ywzx{}{xv}w~pw|~z}tyz~|O~}|yryrmx}xw}{w||{~|}w{{~zt}ycu~w|t|{w}uy~zw{{z|z{||~v|zyywxyqvpvmswsu}u~rw|z||x}|x|}y}v~~u~w|v~s||{~toz}uzz{|x}y|}{x|u}yzv}|uxz{r~zuy{xy|vzt~{x~}{~y|urzwyzyr~|y{sxs{wytsyy~vw}~|z~{{~v||{~|unp}wvywozw{yx}rz|~|}xqx{~}}{s|x|}}}zzuuzuz{u|zqoz{|xxpx||uv{mz}xrx{|t{s}uzzwv~|}~s{oyxq~sv|mxz{uoyx~v|}z}x|kt~{wx}unwz~yl|xr|j~z|{{w}}}|tt|t{}z~~{g{t}|~rzuwy{{zy~~~}{tu|~sx|zv}zhyz}||yyz}s}rzy~{wwsz|y{vz}}~z|{wz|w|{|rt}zx~z|}u~u{|{{xz{zz~m|~{~w~|zu}~yzuxz{{uzy~x~|}xy~y{p~}~v{x|}zyz{}z}t}~}|yvjvyvxy~{o{z{tx}|{||}~v~t}~y{{}s|wv~x{~{uz~zxrw{{{{{tn||~{zzxv}|{}|}}{wwy{zyt~x{}}y~z~y|{p~{|qyv}yr|{}uxt}x|}u}}uyzzs~y|vv}zp}y}~sz{quw}{|~w}v{{u~{vwt}}v||~zzz{~zz~z|w~ryu~}y}~{xwyyxt~~yv~~z{}svzzxuus~}~|q~yzz||}x~w~z|zvyywx}}|~{}~}w||}t~~wyyw||x~}}zz{}}t~y{{||~|}u~y{|{~zwnv~|{|p{u}{~{x{|{y{~|}z{}y~}yx}~}vsy|{px}~|~y{~y|zyzr}|t}y~wmz}{|w}z}vyz}z~zyvxzzy|~v~}}uz}yzz}w~}}}}}z~|~zux}z~w|wwz~~zts|q~yz~tt}}zz|y|~{xyxr~|xzxsy~}{~{z}~~~~|}w~y}rsx|{~r{|zw}|{vx~ks~zw||~{~vyzrxz~}~w||wxqy}}~}}~q~|ry~}z|p|zy|~zu|yz~zz|zz|~{}z|ztr|yvquww~y}~z}qz|{{xw{pt}ui{w}|}}||sy|z{w}|}{tyxz|nuy{y{q}|z^{x}u}}~u{y}{r}~|z~}{zw}yy~t~}ow}}~{z|~}{z}xs~}y{mzyws~ziv}y}|z}|mu}yu|z~{|{~{{}|x~~yu{~}x}|~}v}{x{{~z{}|x~|t~|}~ss{y}n|}}}x||{{u|}}}}}y{~}}w{|w|xt~{ox}v{z{{~tv~}~|{|xx}xy~}t{u{qk}~z~s{{{||z|}xs~x|yn}m~{|y||{|}xq{z}}|o}vv}~~{||zrp~|w}|wv|xyz{}n~}~|{}x|uz{}|sz~vzt|r|w}ew|p|~{}z~y~~t{q~ysx~z{ps|{}~~xv{}~zx~}z}wr{uwz~~t{{o|||}|l|~|xwy{|x{wwuyx||xyvu{}yyvy{zz{{p}{{zvx}vp}~s||{}g}o}|~xzq}yx|}u}z{y|y}}z~{{yx~q|}w}}z}|u|iusz|zzw~wruv|pwyw~r}{x|wrrz~}zxz|{yu|{}|{ywp|z|~uy||}l}uz|z}}}zx|z|~zxuvvql}x|}l{zy{|s|x|x}~~s{~z~|{zy{~qz{pm{}sxy|}~~yy|}zyx{zyt~j|uy}}~xxy~{{lqu}v{|z|y{}rxw~{~|y~~}|ux{iyss~}~{|xvuuxzxzxwz~}w|x|x|}{}xywxs~|{uuy~~zr|~{v}~{zt}x~{y~{w}|z{|zo}w}|}~|q|{v~u~~~~q}u{~{|pu~~}{os}v|||yz}v~~|}tzr||~pz~||w{}y~zvx~}ui~|{}||u|zm~g~{|i}x{}~`|}nz{zv{{~wy{~~}z|}qw{~z{~|zt{|}|nvs}wz~~}v{kw{|{~z|z{~v|{q}|{}|{|t~|||u~yyzz}|}||xy~||zxvzyt{nx~|{y}xsx|x{~~}~}yzh|}~y|{}r~lyr|{{~rww~x}ziy{{~yyo}}z}xy~v}xw~{}w{yy{z}}}{}~u~tyx||s~w~ur~xr~{||z~}~{~{|~~x|u~|{xuwy{|w~y{y{sy~z{}{zmvy||w~y}~z|~}zzyt{vw}~}pyyx{vxn||x|y~|xnz}vzy~|~y|}}u|~}zwy~w}y}~~{wzzo}{t{zyj{~|x{{yqz{z}~r||}v}z}~|tj|~v||~{{|z{z~}}s|x}~|~u{|}~t|a~u{~|v||wt}}|w}x~z||{yz~q~}|yr|zym}|yz~}}~~z|zz{|{|uyv|zx}vz}yy|}{||y~uxuz{|~}w~{{{{tw~z|yz|{y~z}j|}vx}|yv~uy{ztvyt|}~x}{w}{|}}|}}~z}|y~|~v~u~~}{|rwz~|sw}|z{}||||w}ozyx|~}{|k{|wy~|zxxzwwt|y{|~|xzy~~s{{~}y}s||u|{}s~p{~~zxx|u{v~uvy{xw|}~{}zzqy{}zy~z~x|v~zx}q{u}~{i}|wj}}zyv}}g}~}~{z}|~|t{v{||rwxt{~m~|{~{v}ywwnx~vn~u~~y~xoy}zw~{x}v}|}y{uw}|z{v{{vhz|~}sz|xxy}q|{pzv~~}~w~d~tx}|}}}|~{~}xzy~{xys{tx|zz|||y~wm~w}lyx}~x||~a||}jz|{v}}{zs~|}{{{{}~}}|ykzzy||i{}yv|~xxy~}z{xr~{{|tnzw||~|}u~tz}~{||{mzxoz~o{|{x}~|wmr{{w|xw~zz}~zuw^}w{{wvytr|~}}|z~voz{zsyz}mv~zu{~~~~q~~~|qvx}tu~}}~~~{jwy}zr~z}s||zy}{~~~s|wu}|{|xxt~{}~|{us~|{v~|uu{x~uw{w~}~{|{u~w~}w~zww|{{~x{vvz~~sw~y}y}|u{}|z{{syu|}yuwvvv}y|~{}{~}yz{yyx{}}}|{}yzy|y|ys~|sv~{}}op|}}z|{||zn{u{}uy~zz~~~{}}r}|~|{s~{xwtp}v{}}|xzv~vz}{}|ywq{~{{yw{|vz{y||||}z{~|}||ut}y{vz{|y~|wy{qwzw~y||tws}wi~vxzvx|uj{zz~wyry|}r~u}x}~w~u|}{t~v{s~{v|p{}zr~|yvxz{~{~xv~||}z{|{|xz~}{~}v}~{x~v{puvs~{zyuxzvzzg~y}{rz|tds|~|{{}~y{}}{~zvuyynw~u|y{||syyxcy~i{xsv}|wuy|{t}vv~z~t{|{v|}my|}vvwz|}|z}wtzzzuvs~z}}zx}x}|yy~o}~z}qr||{|{o~}}|}syt||nssn}wyrzzqxz{|}vxttcx}l}xviy~}s~ww{nzqy}|yzynix|{su}pw|o~wqu{{z}}zpxyvy{qxzSz||{zzy}}qr}yX~r|}~}v~xK||vx}s[|zY}y}u|}on~t}{vyuz{yzv~z{~{yy}v~{}nxo~z|wmz~n||{s|~v}~vy}{x{}~p{}xzx{sy|yzxqrz{}y~w{yxw{}~~u}{|~~v|}y|zzw{}{z|}z~}}x{wy~~}~}|||x}x}z}tzzm~ywz{v~}zn|{v~zzx{}y{~}z{|}yz}x~yw~{xvx|z}z|z~q~uyz}~{||y|z{u}vy}y}~o~v{z~}}{x{t}|~yy}|zz|x{}~zyz}z}tz~{zx|{u}|t}{}{rzyxv||z~~v~|}||y}yzy}|wz~}~|s~w|xy~zvt}}~vz{~{|tpzwzy{{{|v}|~z}q{|}x|x}{n|{y~r}vzy{}~z{{zv{}~{~x}v{~~|wsq~~|v}|z~|{y{|~w|{|||~zr|~{pu}{yy~~ix|}p||uzr|}~p~||}z{|{r~p}|yw}n|zzzu|}n|~~~|~sz||s|x|}w}x}|t~{}vy{{~u|~zv|ywx~{{{}z||w|{|z~~u~vw|{}|}~{~xv{v}}u{~yw{vw{~~z{{z|{t}}uzw|~{{~y}~}}|{~}x~wxy}{}z{z}vwsvy~uryx~|~{vx~z}|x{vu{v}i|u|~y{uwp{zyy}ztqw}{|~~~v~zkuzvvt~~|}}~exz|m}~|}|}~z|vr~r|yw{xz}zvrzwzz~|z~}yvyz~zyw|z|uyr}yz|z{z{x{r{z{z|y~|{|ys}{tu{||y~v|}uw|||zww|nx~~p}}|u{}s|{w~~}}tlr|usyvzx{}syx{~w}wq}z}{}z{urz|p~zt|{z~v{uz{wz~~w~z}zyzz{{sqt{{||~zpxu{~{v}}{u{{z~v[s{vzys|w}ty~{x|{y~wxxz}|}{|}|ux~}ttsz|y~|wz}z~r}|m}v}y~}}}xyx}~ozszz||tux}}|vos~{}v{yzpxvyvy}k~}tz|yz{s~z}{y{z{{~v}u|uz~yzy|z|}y|~}xrznys~vxxx}|yxyu|y}}z|q|{{||x~w|}|zyxxz~qz}yzhnyp~zyl~w}zwe}vy|{z|w{{~yw~xu{t}yr}rxz{ioyy~~xkv|yyzxxlm}}x}}|}}y}kq{{{|}{xw}yz|}}}}{~}{tz}}x{w~}{w|t~z|}~wz}x~s{vzqy|yw{yv~}tv{xvx{}z|}z|y{|}~vww~yvzv~v}{}yywu~}{{x~{zv{t|}~{~}wzt|z{y{o~wu~|}~yy~x~yy}~xn}y}wt{z}wz}z||vy{r~{v|||w~}~xt|~|}|||~xxz~{wvz}||~}{{}{zw~~y||}zw}z|z{ywys~ry}}}|t}|~{xx{x|w|m{{y}~zy|}z{|x}|u|u}|}zzzz~}u|~}zu{w||m|z}~{wt|~yw~vy|w|xz|~y~{}~~xy{~}}}y}ywv|}{v|yy}||yr~z}{{~x{{yxv~w}{}}|}s}}r||s{{}z}zus~sz~~xz|~{z}w{szfmyx{tyy{}u{|~{|wxz}{}|tyys~~z~r{vtv~zru~wxs{xtvzyxz}szuz{x{y|{uw}qy{~{||y|sxws|}~w|}yvz~}wz{wz{~}t~r~s|~zjuxyyv{}|s~w|{|{{y~zv}u|sw|{rz|zv~w{|z{{y{~{|xnn{qk~~|}|xzz|}u}{{wumzn~vv~|p|ws{xz{z}|{}t|ywtu|m}}zx}zx}{z}{|t{|z{z{{{~w{{y{~}rwx{y~mzyx|y}ts{}vw}|w|xzz~|||u~w~vx~s{~qupm~}sz~~rvy|}zz{|ywq}ztuuzzx}|w{}xs|yo{t|{y||xw}y{{~m}w|w}t|z~v}w{}|yv}wxn|s~z}|gzszx{q{{j}}}uwt{y|}pu~m}qz|}z}|}}xy}|uqxyys{}szqyrzzw~}~|~|u{~|vw~zqm|~{xs|~|yzzz~}|~uz|wz|zsxypzwxz{x}{z}u{|h{~|~~|~~~{}z}o~||y}}}nry|n|v~{_s}ynzt|z}z{cy|y|tq}~syuxz{z{uu}xz{pxy}utz}xtwjyvkx~yzt{xks}y}|m|z{}||z{||vu|}yyy|x}z~x{w|}~s|s{ywy~y|~}|z|z~qs~yr~yz{ww}~x|uz~uv~{~}}yy{ym|v}~v{y~wuyy{|{}{i~votz{xx~u}}wyy{}tsxw{|w{xrh~{~z~{~}}y}~|uuzy{x}q}z{~}|}{|}ry}|wwwy|~|}z{|~w}}}u}~{{|x}z{}{w}|x}w~}|{|~}xw}{~|w|w|{o~u|{{x{y~{xv~|x~v{x}z~{}~x{y{|~z~z~~~w~zz~vw{~{{{~}w}wx{}xx}}{~|{|{~|{ty|}{|}~v~}n~v|z{~}{w~~|v~v||~yy{}z{z~{~v}uw|v~}|}|{{~yz}|~~~~~}}q~{{y~{v}x~}||~|~||z|x|{x|w|||}|z~x}|}~xn~x~||}yt}vx}v~~yw~}}tux|yx|s|z}}{|xy{~}z|{yzxxz{|wv}}~t{wyuyw|}}z{}w}||y|wryt~|w}~{qx|~{{}|ryz~}w}z}{~{{yx}~|myr~|}zq}{~}txo~|xuzx}|~}}|zy|}~}~{~yv}~r}{}z|z|{z{ru~}}}zzx}{}~~|{y{r|}|z~y}s~|{}|w{}}j~}~~vz||{|ywy|t~~~{}|~|tyzxxxs{zm}x}w{zw~x|~~wz}}~zws{}u~}}x{yy{|}~swn|z||}nrt~y}{yzvyu~yzv}|}~yz~z{ry{y~|y{z|}~p{yy}~y{yz~|zyxzs{zy}{yw}~yz{{}~}||z}|{z}}|{}v{{}~}~|}{|v{{xxy{|v{y}x{~g}}|}zyxv}|~~{zp|wx|~|~t~}}rz~w|yv}~y}zv{yy~{zvzy|}wz|xx||~|ozwyr{{|zv~~z~vz}py{~|{{{~}dz}~y~y}}{x|~gyuxzz{yuzy{~{w~hwyuz|y|w}}{x|{xwu{vzy~|~{{|z}}||{~z~v{|ry~kw{~zsp}{~u|}q~~}|xxw{}}sw}w|{{~y|}wx}x|zyx|tz{|~||}|{|{zy~uz}y|r|~y||~|~}~~}~|s}r}x{z}{~|x|}~|{tzr{r~zxww|vf~|yzv{|{y|v}l}|y||r~{{|x~xx~{wvzx}{u{|szx{yqvouw|~x{|~yy}qzr~z}{yz}o}y|uy}}{|{{}m|}{}~|t{}y}{|}{yysoz|z|}~|{wmzyy}w}{zy}~x}|zsz{qw~s~zw~{|}uyzv|}`|zw~}x}zzt~{xw|~s|w~~||{y}~{zzus|zr}iwy~~||~y~n}j{}|}|{zxr~~|x{|y}v}u}~|}~}t|y{|}|~oy||xz}}}~}}~|~v~{v}||}zuy|~zp~z|w~{{u~~~zqz|}{}zwwtx}}w~|{tuzz{k}x~|}}}zwl|{z||}||}h{}}}z{y|t}x{{ju|y}uv}ud}p|xt~|{}z{|{xzr|~zzt}|z}}}{~n}u~zyzzx|}|}~oz||yzrm{{y{ux}j|uw{|x|{|w}sz}k{|x}{y{|z}yvt~~sxzvx~}~~}r~~}|}~r~x~uy{||t{{~|{zzyy~}z}y|v}v}}{~|{||w|u~yv{w~s~z}}{y~|~~y}|z{}z|}|v}}xu~~||ttzu|}{{~pw|{~z|~{x{y~~zz}y{j|}{~}|{~|}zq|{{~y}|{}{un}}zzv{v||}}}|w}iy{~z|{}}~u}s~~ty|{|vpu{y~}~{~|}{{|szt||}z|yzhwo~}z}~{|o{}vy|}|uw|{q}}vxu|xx}y}x~~|su}y~{{wy|~}~}{zvzt~utwz~|s|~yt|}yvy|||~}|{~wszz|z|{}{~~}w}v}~n||wz}~~{y}}z~x|zz{u}zw}|swv{}|~}{~y{}|}z~|t}{x~}z~~u|z}}}}}u|y~vz}}{}~|yz}{|}|x}|~~i}vd~}~|{xy|}zu{zq}}||y~~yw{}}~xq~wju{os|uz}x~z~t~{x}~y|}}zzn|}}~y|~~~z|s{z{zs}~~~~}{z}|z}}jut||vy}{nwpp|y~}r{xwyy~vz{rywxo~z{~{}pv~~x{g}z|x{y~zyzzy|~zx{|x~v{uy}|v~}}y|}{w}}~wy~|~||wxy~|ryn|}}|}y~cz{}rx[}~}sv~|~zzuz}yz{y}yy{z~~}uyzz{xx~zovzw|wz|}zz}vyq~wx||{~y|u~rz}|z}{k{z}~wxrus{y~ytxz}|{}||x||||}{~rxx|~~~|~~|w}|zvs|yxm|zvoy}}y}x~}zz~wvz}~}|t~{~t{{ytzywx}{xy{yy}}uxyxyy|zx|}~z|{t{ywsx}|}yu{zyuv}t}}|v}z}z}~~xz{||zz}||wx~z~xy|~x~v}v~{|y{xu}}z}|xxsy{C~||}}|yy}z~p{~l~yr|~z{~z{xy{zz{{}v~y{{v}yxvzx|z{|~}~}zz~z}w~~{{s}{}~{~z|z~|yy~{{~}{{w|y|~|zvw~}}|x}xw~v}~}zxz|~n{{wx}|vz{|u~}{n}zyw|}|u{~{{zy|ztw}xy~{{w}|{||wxw|}{}x~~~~q{vzys|x{~zv~~wyw|{y|~o}{x{|zy|}{||{z|{yvw{y{~uws}}wy~|~zxxu{{t~zx|wxtzw{|yw|x~}uz|zww|z}|xq}z}|sxx{}}~o~}x~y~|{{||oz}~sz}~yxx~v}xx}zz}{yzyp{}}ts}x~}|z~|u~{{~yrvzyvx~{v|r~}{zvuy|{{v~~|z~~z{{vz}|{y~w~ytu|}}|||xe}z}|y|}v{z{v{xsz~v~}y~v{}s~v}z}vvx~z~{yyy~|xz~{q~u{t|}~xtr~z}{|zxy|zs{~yxx~{yunu|u}v~qvy}~{|~z}}zs|}y{~}px|xuttxx}y}wy}|s}|{wuvwstzwxyv{~{~|~x{q}{|{pozt}~z~wyxz|{|x}}|x{y}kp}xxy~{u~v~w}{yy~vww|x~~g|vxx{w}tz{|r{wz}qx|y|pvwyzyz{~x{~yy|x}uy{zxw|~p|z{~}||}zr}t~pu}||sq~~~xwy}}{|mvz|t}x~w|{x}~|yr|~zqz|uvtvzwvk|wz{t{x{}~|{~~~ttq}|z}|sxyu{yx|{|w~|h{w{x|yr~}|yyv|~}}z[|x}|x|zu|{{~vvvxwu~x}yxyy~vzp{}}xyy|uvuyyz}}|ww|wwyz{r~sx~zz~xmz}yw~z}p}{uxz}~}z}y|}tzysq|~}ryvtriwv{un{zxt}s~tr{xytwo|{ygf}|m{s|{yyx~v~zwvpw{zytu|x~|}t}}s|rzu|yn{zgzyw~~xr}yw|w|xswv~{{~xyys~}~|||uyvuu}|{x{}}|y{|yt|||rv{yn{}~tyc}l{vt}uzwztvzy|y|qs.{{wz||x|x|}}qyzv|w~~oy|w{~u}~zz|}zy{|z}}}w|yzy||}{yy|z}tx~z||nw{ttxty}{{zxyw}x|~p}{}zszwy~q~xztyxyy|ptw}yG|w~|v}wky|v|yz}|}xv~|mvun}y~~S{}~~xy}}}~|x||xvw~yy}}x{vzy{ve}}|~{z}z{|}}y{wzz~z}~|w{}|w~w}}wu{~~vp|{}{|zy}~m||m|xywz}t~|u}xz}v|}~{wy|~~y{yw}~y}}~~}~vyzzu}w~{}y||y}|~zxw}~~|xxp{}~|n}yz|zxyt{x{|z|z{~||y||s}v~x{w}{{wv~~|}yy}yxy}z{~|wq|w{x||t}||~u~zxj~{s~}{}wy{z}|}yq|xzzu|y|q}yxysz{{{|~}q{y{s{v|}}~{{mztp|~q}~vv}{w||zzvsovv~}{wz}}xv}sxsx{}~}~wyz|~w~~|w~y|t{zzs|z~r{z}|z}||{{yuz{u|w~~muyu{xzs|vvux}z|v_}|{s}{s{wu|k~w||vwsxzu|x{o|vvtp|h}qtyyzqqv{xrsyey{wxzxu|s}~~{szvsxt{xxxfyf{vzzw|~t{s|z~|y|zp}p|r}yzomdv|}|qxt{|uj}zryrtqy}uy|tms{|{zr{{e|szuusxs{|{~x}|zp|xxv|quwjq}e|wxy}p}x~z||vulu}{oxkzywxwu{}qn|voxzod{}xt~xzvyszyy}w~wbw{w~w}zzr{|yz{e{yvy{}lsmzf|xe|ztuy|cutj|{~w}y|whqzv{yuYrxs}~}znuivq{uv~~f}y|s}s{{||||~~|v{~q}vygxvy~yxl}x|w{{{w~uu~}~}|~~wzut|}w|~w}r{p|w|zry|{oru}xv~{|{yyz}z|y||{z~}r}wrtzxyy||z}xyz~w{x~x}}{xytjxt|pv}yqw{}{t{~uw{}{zv{~n{y~z~}fyvzyzryz}o}|z}xz~{wv||uv}xr|}xw~~{~{u||y|z~x|mxx}s~yuyu|vu}xz|~{k|{}z|s|u~wus{{~y{zt|xp}~{s{~~v{xtn~zw}{rw}|vw{vz|yz|oz{~rxy~~uxya~qyw_zxv}|tzzuv}yygu{}ys|r}styxvx}~~xv|z|{~}zxy}v||{t}zpzz|}t|{|}}}}s}{}v~w~~{vz{~x~|}~|ylyyuwo}||~vz{~}|~v}yzkvyw|y{zzuntzu}|~~z~x}|}{}zr~}y}x}zyx}x~~uzz~xyr}{~xy{}||{}{||v}y{}uyv~{y}{tyxv{{~{m~}}y{|{~|}~zn~}|{~|~usq|x~}{~zz||~~{vz|}yzu}}zw{vw{x|~{|z{|y}w}{}~t}zyz{y{~||}y}q~{|~vs|y|w}~}{{v{wy~||}}zv~}|{~|{sz{e{p~y||vuzyrxy{yo|vv}z}{z~v||x{y~}}||ywy|}|xyzp~t|~{|~v~{}z}~z{~|{zz~~}{{{y{{n{{|{~n~|}}~|}x}xt{~{~y}yx}~qx{{xz{{|uz~p{ou|rz|{}{z}~vz~}u~{zy{||}|~|u~ssl|}z~}~}z~kytv{~~xzz|x~x}rz}l|||}w~{yx}v{{wt{}{z{{yuunw{|||}z~{~ww}x~u{|zxy{|||{|x{}w}{v}}|~{~z{}{||uxx|t}{xup~~|wr}z}~}xw{z}w~{|sx{t~}{r{xy{u~{|vyn~|}x{|~puyys|p|}xyzwzr~~{yt|}}z|~ytw{z~{{~|owwr{us}yx{z{x|xpu|x|r~{r{{z{vy}{~y~xzq||{w~zu{vyv~|~{vzz~|~{zxtw{{y~|}|}wz}xwtz{}{|{~riwuz~|{~m}|{zwyt|{~}Ryyzs~~u}zu~x{zzt~~~xw~~w~~z~{}x}wvx}v|}|~~|z|}r~}}{z|}{}ntxyw}||||z}||{z~|}{}|{xy{{y|zmmfxx|kytx|}s}o}szzxtz{wy}z|~vy{~{z~y|zqyjpyw|~dxw|zxw|||y}}z{uv}y{~{ywujz{}k|zy{|}xvy}|ux{x{u{zq}{|}|y||}q~~|zz|~ny~{}z{x}y}z|zt~{K~z}zwy~x{z|xz~}}ty{|}}|z}{y}pw~y~~||uiyz|}t|x}~|||s|~u}zvvw{}y~~}~zrxp~|{yy{zw||w{}xrtqt|}}yu|u|ytz~~zx{wzyxyv{yz{|wz{{ow|w}}~xww}~}}}q~|w|~~rxxzu~uw}x|}}v||uz{y~~~w|p|{}|}mzw}}xr}}|y~x{vv|zyp{u}z~z{w{p|u}z}o{z}qtzu{w~irw|}ys{z{{|p}t{|xnzw~~~xvwu|}{}{vq~w~}{{y}wy~|z~wy{y~~u}yoy|p|q~{zzw|tvn{w}}y{||qz{~gz|{~zxx|s~}tns|y}y|w{fus~~vxvx{zx}|}xxw|zwt|wzxtup||uzsx~}|u}x}xtp{wr|~{yz~wvw{~x~t|y~~w}z~kxyyyw{}u{q}y|}}~xyz}}x{xy~}yw|elj{t{}}zuzy~v{vx}zu{}wn{uzzy|zt}}xzxw~z}xv|~p|p}z~z}xzsr}xv}{x{y{{lz}z}}~s}|z}|~v~qw~zyzs}y~jtt|yz}w{||xxvxu{}|r}t{xx~{oz|}uz}}}uy|q~zrywxyw}uzvZ}{|{zzx|z~yztz{{{}y{~}w}|zyt|v{}vZ|{y|~}{ysuwywyz{z|}k|plyvw|yx}zy|}}zs|yyw{z|zx}y|}wu|x|{yg|~z|}z|{u{sszzwttvyy}ty~tux{uu~w|{vm}kwy}|}xvw|x{}~{|x}}czo{y~|||~~wv|yt{zxyw{|{~yrsqyv~|{ssvt~{{tn}x}xy{yz}}yut~wts}}}|yp~~x|}}|}vy~uiv|vut~|y~zlo{r||xsx{vw{tsz|x|zr}~||vxz|}w~{~|wxw|~yvr}z~~~y}x|t}|yyxy~w}|z|z~|xy}t~x~szr~vz~|}nyz|yy{~~|~|zw}{tv}{z~}|z{{~s||ny~t|{}s|p}z{{o}tx{~|wux~zztg}y|qzv}}t}w|{rzyu|{~wzww~yu|}}y~~wr}~yh{~|}y}{{w{yz~s{{w{}s{{twz{yl}{{w~|xwvz{xpz|x~}yp{y|}y{z{uw|}~~}~{y}wsyuxv}}~~z{y~~s{|y{zt|z{t|~zy|z{}uyl~~~w}{z~~|}|{|y~z~z}vx{xnyyp|}z{}vt{}{wy~}z~{{j|~}u|~||~zs{|v}{f}}y}~z|z}mvzzsw{o{v}vs|x{|{u}~vs{|tzv|{|}z{}zy{}|{z{zt~}{{}~w~~v}x}}t~}}{x~~{|u~lq~}|{|v{|yz{{|z|w{||xyz}{}~xlu|}{~u}~{f}|~{}uwy|}qux}{}x~uwvrz~{uvz{}}z}}}~y{yz{}{wy}}}s{wx{}q|y{r{}}~|zz|s}w}q|zz|{}}z{sv~~y}y~ywzz{yx~wz}v~rxy}|n||{}v|xz|{}xzs{{{||}t}{v{xno~l~~~z{{}~|zz~x|~~v|ux|{{||u}}wj|sz~u~v|v|{}~yy~~xy}w~yyz}~|gw|wlx~}{}xt}{~zqy~}~~zz}}yy{}y|k}y}|}xzv{|~xsszwzyni{vw}vyrw}x{~}|~zs|uvxyyt~uxqy}z~~{}}wkt|~zw~|wu{}vzxw{{~|x{zzyrsp{x}{xzrxy}x}xyzy~rzvu{t|xuutz|ut|r{v|}us~x}wlyy|x|{q|z{x{|~zx~}x|z{ryr|tzj}|}wv}{~~wxw|}uz}|~zy{~tyxwzzz~~yzw}~}jz{xx{yv|~zw~|uqwq~{|{xzw}{{z|~~vz~}v{}|}zvyv~u~u}oul|y|wyrv~t{}yx}tz{x{j}vz~||zczzy|z}vz|r{x|~|{}{|xz}{x|x|}|~xwxv^wyzt}y~|{sz}v|z}}wx|~|~uxy{w{~pw}{{~xs{~|{uu{zxrz||t~w|}~||~|x~xz}xz}ux}|}vw|zz}y|~q~~ywzw}|z{w{|}{{zsz~y}}xv~j~z~~wqyzz}~{|vwx~y|v|}~rx~}~q|z}}{r}u|vr|~z|}zzu~t{u~viq~zy|{~|x|z||}~}zx}}|~qx|}|q{}}rn||~z~}ysw}{{vv|{zzyy}xx}|}{w~||u|~|yv|{|{}y|zxx}}|||v~xt~{zqq}~y~}~{|fy~x}t}ymw~}z|}}{{~x|xxv~yy{~{|~~{|{z{zz}}{|}z~zhsy}z~}{y|v{}{mu}nvzy~y{tyxwy{~}r|{}~~z}~y}wvw{y}x~}{v}||w}z~{~{}~n}~v~s}|w~z~z{{}zy}zz}w}}||zz{{{z}{u|}|i}~z{q|y|z{z}~yy}}x}y|t|{~|~z}}~lyu||||}z~~}y{{sxzs{z~{~}}|zw~}{q}w|~y{}{{~r~~}~|~x|}|~mvv}|ww||{|t{}zv||~{~zyzu~{vv||~~x{|||nh~}~}z|xw{|xx}t|t{{zy|{|s}~{{ztz{~v}}||z~zz{u~}zyy~}w|{w||~z|}v|}svw|~t|}y{s}~yzyxzk}wt}x}xxkqyz|~{}{xz}w{|z~{x}~vz~~q{}un~}y|~x{l~x}yyu~}|}~|y{x||tzv|sy{y||y|zz|sst{}vy|~y}~|{}}xu|z|{sy{}~zzxvzuz}|{u}y||{|z||v~o~~{~w{wv~|~zt}|v||zz{q}~xzyyvxp~||}{}xy||z{~yw|vzyx}{~{u{u{x}qww|}~xzyv{bv{{yx}|{|y~~g}~tz|~n~{r~~w~w{}|z~z}{|ws}x}v~}w~|{|{||z{z|z~u}qx~gzwvynzwmzyqxz{~v{|~|u}v}nwv|y{}~|}zzy{vzz{rzzz~x}x{u||x{yy}zv~~}zsowzzvzvwr}{{}yz}zy|r{~x}vtxzux~}|uzy{xt~{z}w}c{yw}z}zpu||{ys|xyxu~|||x~~z~}{lzvzz}{wxqt}wv{zxop}~vzy~w~|~z}{orwq}~|yvy{~~|ux~vz}z}~~|~x{|o~v|{w{ntw{~~{~{wvh~wvzxqy~zzzpx~}u}z}zz~y}}x{z|{x{zw}|}z~yt|vvu}}rp~uyu}yyztxtx}}q|zwx}z{}|z~{v{x{zq}y~||{q|~{z~|syvs|yv{{|wv|yx{w|w|}{}x~z|yxvy~zwwxs~lxyzywy{}z{|~{o~sr{vxyu{z{yu~||zrtttz{}x{u{xxx}~{{~s~~w{mw~{~x~~u~v~t{w~||x~~xz~}|}szz~||v}{{|xx}v|y~}}~~|w~}|xy|}}p||~yztz~|nx|zwt|vz~}||y}}tv{y}y|xzx~z|rw|~y{{z}{y~vpy}~vwp~~|}y{}w}zxx{|w{}z{}~~|y}~zzxyx|{q~}~|}v|{|y{{~}v~}}r{}y{|zu~z{x}z~|{p{p{~z||~}|u{|~xvzwvx}{w{|{{x|}tt~~s}lkz}y||}{~tw{}{~ywz|||{z|}wnwulv}~}}|zz||y|xtt}~r~yxv}y~|h|}{}}|r||}~w|~}uty}u~{|{zz{}~uymxxxy{x||vw~|y{|y}z{~x|n||o}~y}o~|z{x|tz~~~{~y}~z|z}{ttx~|t|zqv~wx|{|w{}~~y~}x{|{}y{y{wv}z|x|}p}}z||xz~s~~v~v}zu}ww|y|vy|p|}s{||vu|{{{~v~}~x{wlw~~|zz}}z~z~}}{x|{xy}ym|~}{}qz}|xvv~zxx~qxuz}~|}oz~|{{yy|yrv}z}{{{xwnwxtv}s}}z~~~{~zvyr~~z{}vr}vux}z{{x|w|zyryy{rzy~{}z}s~|}qy~~z|{{w{|pp{|~w~|xx{d~x~s~|syy~||yyyxy~{~n~}z{y|zxy}yx|{z}vx}yx{{}|y{}xr~x}z|||~wmyvyzx}t|}}r|z}|x|zo~|x|~]}krz}{}}wv|y{xx|x{t{{u{{y}yxy{z}uo{l}y{|u}}|wxtr|}uu}{u~{tx|}{xyvy{}~x|y}z{p|w{x}yyz|vy|{|z|zzzi|{vysu}sw|{w~yy}|}y~uxzvzr{~x~z~|}wy{zz}}}|zu}|j~z{nx|yu}zv|}}u||}|{}|x}mz}}z~zz|sz|hx|||y|}ty~~{t|w}xw{z{{x~z}xt}|d}x||zw|{uzu{|w|z|zn~r~vu{}zyj}{{~pju}y|z}{}yq{|t~~o|~|zz~y~y{|{~v~t{y}~{~|y~~{q}{owz}~wyqew}vqzx{~{qms{tvy|~uv{{}~{{vzzyy}|r}|zw~|{}~}|xu}~}s~}z{}~}y|v~ywvq{~~zx|zxw|~}~}{~||{u{hvsy{xx{}|{zmx{~|}xz{|z||{~y~s}|{m|~z|vz}v|tv{}z||}sy}~}v~yw}|{||~y|{~z}~yp}~y}}}{}~}s~{|x{}~{~}z}|u|oezy}}{yz}l}vc|}{|x}~yk}zym}yyz{}v|~|{x{~u~}}zx{~|~y{zx}wxw}w|w{y}}vyuy{~zy}|zx{{x}y|{y|~~x}q}~vsy}w}}zyyzn{|zvzp~{}{|}y|s~}}xzx~~y~|{{z{}zvw}u~s}{v~vzy|~wxzzo}qyyyr~|}}z~z||~wx|{|y|{|}~y}~z{xz~lx}|}}pzz|h{~|{~w~~twy}~z~~y~yy||||~z}xz{y{{y{|{|z|z}v~}}zq~~{|~}{}z}j~zu{|}su}~z|t~xz}{}|xyq|}~z{}{~yv|w}v}z|y||{~zz~}{|zw}~z{x~zw{z{}sx||ywwx}~zsz{||||~|~}}|z|}{}{}t}{}wx{r}|~x|{z|z~~xz|wz}}p~{zzx}{wx|}z|w}}zu}vyvxs|{~yv{}|~v}|z|wux}qy|}v{}z~z}~~~}}|u{zz~{|~r{ww|n}~~k{u~|}~yy|{|z{}}{}{}vi}y}{|||~}yzzz~tyu}v~v{w}}{{||px|yqz{{w|x{}||y~}}}}z}wz{|~}{}z{v~j{}}{|}|~|l~{}zzy}~~{~xrxz||v{{z~{~}|wzx}~}zy{}p}{~~z|{t{|nyqz~}|}~}x}z{~zzn}|{}z{yzt{|wz}|~}y~vy~~|}xw~w|jz{q|v|}}||{|qxv{x}|yz~y~}yuzzu{}}z|z}r~{w}}|}{u{~}yzt}zzwz}wt}jz~|s{u{|y}{x|~|{}~~ww~w{~}|o|v}vrv{}|{}|||}|}i|{{{ywzzw{{}zywqzuz{w}}x|~w}quz}zy~|{|}|}{}~i~y}y{{{qz}}~w|zug~zy}{v|y~xxw}{|y{zv{~|~ywwy||y{y|{|v|{z|}|~}~}}x}q{zxxwz}|xw||}~}v{d~u}|||xy|p~zwyx}|~~r~}xzv|{~x|zz|yv{t{~~|{sy|}}z|~z{~~}zpz|}}|~|~~yx}wx{}~}z{~}|||t|~wzy|fz~y~||{x}xx}}q{z}|x~|~xy{~}{}y}zp{s~|~}}uv}}|zsx}w}{|h{}~xzz|k||u}|~xpt|~}}xu~zy~}uq{y~{vz{zy}z{||{}w|}{{{}t|tz{zu|z}}uzxztvwu{xyz{o~}z{}}{|x{}z~ssz|{wzuzxy{z{x~r~{vzuxzx~}|zvvs}}|qy|u}}y{{}pzx|v{{~|~}}}}uzz|n}~wz{}yz{x{y|}r{zu~x{}y{|q}{yy}o}~}s{{twx}z{}y}xs{zz|}{}||{}rz{{vz|}w|wz{|~~u{~y}}{|z|y}q}~~x~x|dz{}xw}}z}~|~zzx{{}|~z~y|wv{~{l~r|{{v}y}z|yy}x}~~}|vzk~~}{{~u{|}{{|z~v|y{v}}vw|~zvts~x~zy~~~{{~}u~~}{|}{szz|{|~~xyz~}}y|}}x{myvy||{}z}}x|uu{{z{yt}zuwy~}~|zu}~z|k}|y|||v}s~{{|{}y|z{xx{w|~wxz{y}~|z~s}{w|wwyz~}x~z~z}}{{|zy~x{y~|{y{|}~zzxzuu|||z||~t{~{}y}z{~z{ywv|wv|}~}~}}xxwz}u|~vuzxrw~z}}{~y}zw{~|x{y~}zyzywt~ys~|zuz{}{q{|~~~{}yz~{{}|}xy}~{o~}{~~|zwxw{y~v}~rzkyw}{}zv}yt|zvyzsx{||x}~|w{~}{r{}x}}x~}xy{rzs|z}~|xpm~}~{z~yw|wt|||gy}zu{~~v}~vu{vxyyz{yszzz~vyxy|m{mtrt{|}n|{p}w||{{{yukz|{~x|y{m~wy~z{~v|x|z~z~zvz|z||xt|v}z~}t}dzvz|p{si~}qs{}yy|vyu~zssz{{yy|zxz{xrn{~|xy{{v~~|}}z}}~}}|yw{y{w}||w}|{y|ty{z{}{z~p}}|zz}{x~{|~z~z~}v}~}xx}wy{}y|{r{{z|{~}~t{{~{{x|}{{{z~yu}|}y~}y}{z}{t|x~|{|zxx}z~|w~}t|tyzyz~~y~{px}|yzyzx||w{w}|zwu~|vz{{{sz{{|~|{|~y~|~~t}wzv}t|}~|}r~v~}~{vry|s|qw}~s}}{x~xyz|{|{{u~}|}w|}rxz~w~x}~z|~{z||z~xzyz{}~y|xtz~{{|z~}y}y~zz}wu}}~{|{~y}{u{x}~}}u|z}z{}}{|w~~v}||x~x~~~vxq|y{{wx{s{}~y}}u~o~}tvx}{|y~o~}~|~|x~u|}{z}||yuywz|s{zywyzsstz~y{}w~tx}{v{}{z{xx{~z}}z}}yxmxuz}}}z|z}xy{zszu~y|~~yz{z}~}s}z|yx{~uv{x|uxv|w~{y|w||~|}~{s}{upv}||w`{|~v{s{w{xzyzt{sw|x~|}ztu}x||ytzxx}z|zz}~|~{z|}}z{}|x{v}zms{yvzy||~v{y{xzwmw~z}~xpmpxwx{{v~z}t~sqxx~|t~}szw~vs}zyxz~}}}s{|y}}v|w~{~}|zl~|~s~}n{|yyw~~zvn}|{|{{}z}}xxdwwyw|~x~yj{|~|~}~}rz||x}~~}zv~z}kr}~}}ww}z|~o}z|yp~||wy}w|pw|u}{|z}w~xuu|z}q{}xu~vv}{{zt{|p~y~{}p{|}}wy{yx||xt}|{y}z~w|}y|}~{|y|~{}}~yu~}y~}~}~x~~z||uzi||y}r{z|}}wo{|}wv~}}w}z{{}u{~z}xxzwzz}{x{|~xs}z~{s|{x}~||zz~x~||}}wyz~|t~{t}}|}~}y{{ryv}|xz}|}||{y~vwq~{x~{{~y|y|v~z||wpy}||w{wsw{}}z{yv~m}y}{{y~xxz~~}{~yssxu~z{~~rf}tzv~~z}|j~p~tzyyxyx~u~zT{r{vy}o}{uzzz~wxxv{}zxszv|b||t~}~|xwx~xsw}i}sw{~~}~}}tw{wuuz~{}||t~wysy{wlxvuvyt|~zs{~zy~t|wu|{}{y|zpz|s}{~}v{}{}c{~~utjxyz|vztl{}y|u}}z|}z|}|zz|s}{txxov~~y{z~o}{|}zzwli}p}wt}|l|zs{wkpx}|x~yu|v~{|}{qxzxy}|}l}y}{kw{yzv{z|||xt{{v{{xzq~z|{z|}{}lz|z|~~y{pwyxzuq|{}vzqwu}vzlxxx}}uy|ny~}|z~z~t|{{~sbv|{wz~y|qtzrvo}uxvosy{y{i}|{tqy||u|yx|~ty~|pn|v{z}nt~w~{{{o}~zv||xw~yyxxsyy{|ywy~|p{y}{x{z{~rw|~||tyunq}|l}mzr{y}|xz|zz}wvy|}qzst~{{pz}u}{z}|yzr|wtyqw{{|{y}{t~rx~}~{fx~y|zz|xv{s|w}sx~}x|{zxyv|{v}z~~zzww|~~t|q|v||~~{}}u{~qx{vxvvu|zrz|w{u~||{|wzpy}q{}}~k~}}w}h{||{{p~{q|~wezv}syo~v~r{}qw{z~zyxzuuv||{{|zs~|wziu~zvz|y|~zyw~ut~|zx|}zwzk{v|~~y}yzw|{{zw}|ry{pzz}r~~wzzmw|}p~{q}~}v|y{z|}u{xyqz|wv~w{rzz}}zy{~p{}~n|~~}z{|}k~{z}z||{w||}{vz~u~~w|{s|}||~w|vy|}{}zw}|}ww{xs|}y}}w~|zzzv|{z}{xxz|{{y}~~|x||}||}z~{z~{z}~}}xzx|{ki~~}||w|nqtxz|{~{pz}{{rx||w}ox~}||~|{|vr}}~|y~qz{u|{}{~}|z}v|x~w{|xv|{~~{{x|{|z}|x{vz}}~}cl||~wzywzz~w|g~w|q|w|zwyzxyn|~vyztvr~~~y}w~|vyx|y{qwtxz{xsz~}t~~~~}z}z{}zzx{i}~zu|z~z}uqw{|}q~zxoyz{~{}v{y~yzxzmw~|q}v}|yz}~|uozrx~}}~ty~s~~w~{||{t{{z}xxx||wv|x}~~zr}uv|}yuy||wxvv|{}{zywv|{}t|wxyq~qqzyyyywvz|wy}tx}oy~qzx{zwxtt~~x~~v}tt}xyw{xwpx|{|{xx}}}{}|z{x~~z~vzozn{{gwz|znwyzz|uzzv|wv}z~~w}wvyzt|xvy}}u~xyvx~wx}{p|yv~~s}~|v|~nu~|wz||tq}pu~zwrx~t~|z{yzt}|ew|~|{xw|z}t|~zw{}xtquqov}vy~u}~{~{}v{s}{w}h}r}|uw}xy~tv|||m}z|zsv|wwrpuvr|xwv|uy|||w|}|p||~{|x}y~||x{{xyx~|uqx~y~zs}~~}}||~tyx|o~}y|ur{z}}z|u~y{~}{{z|}{xzxv{v~y|yuz}zu}~w~t}x}n||yy~yyy}}~|xx}}|}{}|}vt{~vvwyy~{|{~~w|r|ww}~xz|||lywzzx{}}}vv}|zw~~{}tzvx~v}}zv}yq|~}{zs~{~yxxz}}w{u|dv~|~z}wyr~{~|}{y}s{xw~ry|wy}z}rw{|v|{~ztr|z{{}xx~{|~|{~s|{u|}rzyw{|w|}{tty{yvy|v}y{|}|xwv~yz~x}}k}{w{|{~yww|t}}|~}rv{xysvyyx|}~~|z~w}t|yvzz~zr|~rx~kz{vt{v|}w}jyp}{||{|w{zyyuzu}}z~||w|}{z|~}uusrw{yy~{{}vywt{u|~|uwzxqj~}|vx~|x}{z{z{{}}wvozyuuxuyzt{x}yzyzu|u{qx|yu|}{yyz|~{|m~|{x{z|}z|z~z~w{zy~~y|{yz{xy{|}~|w~|z{~e}w{}z}w}quux}yzis}u~~s~zz}}|zn}p|~y~xs|s}yy{{yxzsyypy~|{{sz}{w|||{~y|{|}p{}{z}|y|y~n}s{~|~}yz|xxwp|~pr|u{z|q~qv~wymuxwvy}tz~|~xx|w}~wrz~y|x}{y~x|}}qt|uwuvywy{}hr}|}|{y}w}y}{vyz{|wy{xxyw||z}q{x|~~|zz|~}}r|{~zz|r{^t}~w|wq||xxy}}z|~}}}xz|}zx|||~s}|x}y|~r}z~yxuz{zwy}~zwv{|}}y}yox{~~|}yttzz|{~{t|w|}z{y}{vuy~r|{uzzl}}}t~|~~|}yzry{xvx{~y~~|}w|}zzh{|~}p|s|wlvyy{w~x{}w|{w|z}{v~xuz}|uwsxy~{n~|}}}ywzlz~u{~|~v~|vy~x}q|}wus}x~zx|{}qu}mx|~~zvwt~}}}|za|{x~}w{yedv|}|uuy|}{yuxzzyw}}~zyzvw|}y}|uzzw|x~{}{|}{}~~yv~~}v}~~z{{~}z|xxv{yz{x{{zv~x}{yz{}}~{p{|z~}vt{{uyv~~py{~y~{y}vsx{~{zvz{uxyzt}wz}~||w~~u|z{~}{vuu~~~wwt~y~}w{|~}|}x}zzy~{y~ts~v}||~{}}~{yz|{~vtx|ip}|~wyzx[y~}xztu|~z~z~ry{}~~{{y|~sz{{wzt}p~~vt}v|}y~{zjxxy|~z|}}{z~{xtxz~{w~}uz|}yz{qf~|z{{|syvxz}r{v|{yzy~sxsxy|}zoqzxy}}{~sx|u~|}yvt~|x~~wz{{z{{yvuxyzy{{x|}zv|z|~|}}}||z{{~zzx}z~wy||||ypyw}z}s}v|zv~}|~szvx}~{|}ywy~{{}|~~~}~{xx|{{zyz|{}xx|y|{x}{un~~xz}{{w~~z}}|}yy}|||yzv{q{uzz|~ys}}}|zy~y{y|{~~{ryw|}~y|}|z{y}~xz}~y}x~~q{{~}l~ywzzxzx|~wsx|}{{~{yvvyw~~{}qx}{~x~y|w~~}y~v~t~yx~z|t|{vy|}yzz~~x~~{vv}w~}~|{|~ux{|~z}}~~zzy~~|v{}yuu|yv{}~}yz{y|xyyspp|y|{~vru}~uy|y|{xy{~{y|ytw|z|wo~xwv{~z{u|}vvvxi}~|}}n}|{tvz~z}}}}|~}~}v{}u}{|~~vz|{{|}hzq|xyz~tyz{wz{zt~yqzsz||q|}|zxv{v{x||~{~}t{}}x|v~}su~}}w|n{|s{}{w~{}zu~|{w}~||}~}z|x}p|{~x||o{z~t{q{{u~|}p{sv|yty|wy|}x~~wm|z|}|uw~yvy~|xu|u~z|tz|nw{}{|kx|ywwu~y~m{xz|}{{~|vr~~t}yxy|zx{xzt}|y}z~z|zy||~yxqw|~ltly}~|w}x~~sz|~yy|~tyzv|}zzp~y}}z}x{{{u{||y}|z}~{{~{|}{x||}yy{y|}{z{}z~xw}|ty~|yxw|xx|yvx~z{yx~{zz~t}zyypt|z~uuw~wy~}}~uysy|zy}{{}}}zn~~yzw~zxsu|yy{rsxzz~{|yzxxwz}}zz}rugzwz{~z}uy{zyoh|v}{su}~yzzx~{||z}|s}y~|u~yy{xy{}wvy|xzket}wv~z{z}}wz~{w~xo}{z~w|xzf}{v|z}}}~yi||zy}|}ts|b{|vkz|zyzv}}}{wo~{{|xwp}~~{y{~vum~y{x{g{tw{}zzx|}~|w|z{ttyzu|~u}r~|vovyvx}{xwzy|s|yyzy{}||~}zv|~w|m|{zyz}z}{z~~}|x}}zq{}{z~|zu|~}z|~{x|yy{{~|~|zu|}}~}z|y|x}{{x}{p}uwz~x}||txt|z{y}}tx}w{~~|}}xwz}w|t|}}z|rz{~}y|~{yku~t~wv|u|{y}~}zw|w{v}wwx}zpw~wxx||}|}~rw{{lzz{x}z{|y}}{z||}|z}vxx{|z~~}{kzzxy}}~y}y{||{~|w~~x{{mr~{}z|z~{xx}|{}s~z}{}|}~}z||y}qv~~{xzy|{}oqt}|}{zw}~}vzvqzxt{y}|t~|~w{|v|ywvzy{u}{{{|xv|z{t{y}uv~zxzv~z{|U}x}uyxzzx}{|xxyu|w||w~vsyqz{|uv|}{}x{{z~wwz{wsy~v|x{u{{|vtz}wx|y~}xz{}{}y~}r~u~z{|z|}wy}wx||~{w|zvwy{uy~{|~xy}zzx{}|y{}}xu|xxy|y|}u|}w~}v~yxz}|y~y{~{|z|~|zyx|o~xw~}{~|{~x|{{}p}xsyvvz|~tt|zvxzwx}{wy{xx~~uz{}~x}}~{zxs{xxqw{~}}|zwzu}~|txrxxx|~vy}}}~z}|y~x{~}wuqs}w{{~~~}}sv|u}sxxz~||y~{~zum}xwz}|sy|yrxv|}}x~|~~{||x~}\ww~}w{yg{|{y||~}w~tv{~{xy~w||{~st~zxy{z{yv}|v~{ypxu}z}||zzoy~x}~}~}p{}}y}z{|}{}{{{{~wu|y{}|~xzw}uz}v|}}}zy{}x|owvpq}{nzx}}w|~~|~xz||~}{v}lqn|qz}w}wy{~}u|v}lv|xquy|nz}{}~v}ww}}|{z|j{~t{z|{}uv{z~~q}y~}}x~}z~~xwo||xp~zy|}~{~|r}||{z{|xyt~~}zs{oyz||}h{y|{z{}z}ztp{ytx|~u~zc}~v{x~||~{syoyq|{}u{xzutuwyzy{y~{~y~~vq}}}zny~p~}wi}|z{~}rwt~}y{v}y|xt}{||}u{}ytvs~|mvx}wxxpyt~yu~~}wv|uyx{}{x{~dy~|vxp~v|xrx||uns~wvwuwvxz~s{y{}wn}w}wyu~uyptr{{~|}|q}vz}zr}xz~||ozu~suyku||x~vv{wvy|~uyoy}p{|y|x{z~~xw{~wutz~x~upumy~}~zzz|}{xzvuzyyz{wvv~w|vwryv|q{|w~{{~z}t|twxv{{{~xx}qxunw~xwvsvmwzu}{n}tx|w{yvrnyz|s{z~~w|}ysztu{{ysyxtxsv}~yz||x{{}}u{||xt{ypaz~~ywy}{t|xwto{zvy~s|zwq{}x{~|yxzb|}{~zyyu~vx|y}~xwxz}x{}ws{}sz~}~y~}}zzv~|zx{~{{|~y{z}z}v{yx{qzy}wx{sxwvrv}|{m{|vxy~t~}xq~|w~~|x{|}s|wy{{|yxs{y{~}|~uv|{}}}|z}y|}}}v{{xwr|{t}v|zr~||wyxvzv~|{v}x{r||w~wv{{t{{~vs{~z}~}yvw}{{}z}y~{vvx~~~{~|}y}|{zzw~}|~xw~{}wzr|uywx}zpv{t~}yvy}}yw|u{yw~v|p~~~z}}yszq|~}}u|zyw~uw}zzuuw|t}~vu}xzxxswy|u~}zy{xwj}gynyvpu}ty~~{v{~~zsu~jzsszwyrzuy~vnwkxuq{ozzz~s~{||v}xwtxzw|y}yoz|{ux{rxt{y|~zv~}{u||ywzx|}~{zxy{~tz~|{yx}zyuxu|}xzjzsz|m~~{~{{|jzwy|w}{lu}}z{}z|{M{ky|{u|~yz~ywu}x{w{~{xzws}x}||{~{zx{rw~|x}t~|z|uuz{sxt|kpxyyv}}p||~zu~}|}}u~pppqsgxxv}xwytw{y}|yvlx}t|px{~yzw}rz}wwzzx{|}wtx{|y}|zxxvyxyxw|sx{|zruw{~}}tuzu|u~~vxw|y|}zhuynqy~zxnq}|}z{um|t~}tt~}w~{i|{rk|~~qqyvhxwqxnw~rv|~tusyzuiw~o{toyv~|~}n}~zsy{t|{~|zy{|m{tywiy|yy{m}t}}~zw|ytqo~|xks~|}|{vq}zyt|w{wwtxzm{~|{osu{~}uwyx{xx|ywv}j||k}x}}oy~w}w|xvv}qw~tqs}y}wv|{~{yt{wv~wxxprzz}y~w{zz}wxjv{bpw{~mys||w}{w~yw|{vyw}z[s}s{w|ydrx}i}v||{}|~zv`vx{z~{z|}}}pt~~pz}z~z{zz~jxwzvx|}{xx|y|u{{r}t}|~w|yzutqzx{z|~|{|~{}vr~wyp||}{xr{utv~{~{}{~ydjwz~v}}|y~|}yzy~tu|wvz}y~|twntk}v|~w}}|}}{o{z||~~|r||}ny}~z|}z{z||}owz|z~~|zu|{{~~zuz}{t~{z}{zv|{us|y~yy}yw}ztz~||y|}{}sy~sx~utsxsk}}{{gmz|s||x{u|zzj}z}{~~w{}v}w{zx~xxx|xz{x{w}~{|x}uz{e|zx|{z{z{}}~yyww|yy}|v{~}tws}{}|z}v}|vpwv}nx{wv}|}uzi{|z|}~uy~~xz|{y~|{u|}nz~s|y|{}~~x~wz|}y{~}}|t~z|z~~u|~xu{su}~z~zw{{}~~z}zz~o|n~{{z}}~|}{{~y}w|z}y}ru{sw{}u~{uv{zt|~||zvzzy{r~x}xw|{{|~~|zuwpvtz|z{}}|}uzz|yo{tv~|}{zc~}~w|v{}}{}u~zy||zz{x}ty}iyw{}v}wy{~|xvyz}|}w}tkw}{|{{smzktz~{{}{{zjfq|}y|y|~z~zz}tl}fv}{~~{}{rztwykztj~y[}|{w{~vkrsyzxw~|m}|uypyyy{~y}{s~|{{}zm|~~~yzvzr{u}|wvz{z}{}~xyuvyxv{}~vyt|~~~xyvz{wvy}{xxzw|z{x}uz}y{pyt|~vyv|}{~tyy}}~}}t~qv{x|}}~}v{}{ot|{~}}~xwk{y}~z}x}v|~z|zz}z|~y|l~}{{}w~|w~}zzw~~~}}v}||~}yz|{~~{z{{{~{~{|{}|}{zz|ww~t}{z{{|}~|{{{z}s}x}qw}z|tz}{z{zv|}|vz}o}~}~xz~s|~r|}wy{}}}z|y}t~}w~{~u{~v}m}|{~wv}{yt~|y||x}zvwz}~|wz{w|{}}x}~}}yuxy}|xzyz}wjxq}{{~vtw|}vsp}|z{t{y~ssz}u~}~rz~~u|xz~}l~v{zy{z|}w{t|ux||~~w~{}}}}yyz}p{{~o{w~m|||~{qz}w|{~~{}|{}}v{rz}x|wx~}yw~}~~||}vwu|x{~{{|x~|{}}~{x~u~|}uz|zz|zzp|w~|}v~zz|xz|o|}zrx{~w}quxy{|xkt}yz~{uz|~uv{t|zuz|tz{|~i~}{w}|||~r~yz~}z|~k}zz||{~||}y}~~~vv~}y}h|||yt|v}}}{zzz|x}}|zzq|}yzs~~|x|{|}{x}vz|}z~~t{w|~|{z{{{y}wz~||z}|}zrx|{tu{}|}~vzu}}}vzy}z|u{xy}~}{kz~y|yxvqvxx}x}}w}x~z|uwx|z{||||u~{y~}|~y}}wzxv|xww~|yt}~yy~v}|~yz||~|vxy{}~}t|}w~y~|y{{v}{|~}z}s~zs~zzz}d|||x{t}}x}nz~}|~{z{v}{y~}{~~y|t~~z}|{||||m~k{{~{{}|}~~x~{{}}}{|~~x{y|~|xt{z~{~|~{wn~}}x{~|}zx~~}z}|~}xvs{yx|}|~~|}}x~~sz}ztt~~|~{~}{szy~}t{u}w~x|~yy{~~v}p~wuzsx~}~w}~vw~t{x~}v}z}~u~szr{|~y}}z~w}xz~{q|}{x~z~{z~~~~}yzo~}u~~||}qzvvz|z}y~|nugx|n||w}uz~}}|}wtwuzx~~vzy~x{u~~~{}y~~v{}}x{|yz~|}~s~~}xx|y|ux|{~yzyxzyyz|y~v}y~wz}{rw~~|~ttz|~xv}}y}~|~u|~q}}zt{||zz{ytvtxsr}z|}|zuz}n}~|}|ww}v~||z|s~u~wy~sx|s|}{z|~y{wx|y|z}~{zzyyx~ry{~~{{|~|{{vp{~|w{|yxzz|x|~}q{{r}~|y||{yxuyxy~zz{mu}||~~~}l}~{||z~}ruv~y}{t{yzw~{w|~j{}~{}yv}uy{x}}x|{xy|{}zw}z{}x|}||w|{zx~zzzy{{z}z{z{tu}u~u~}}|wz|v~zy~~y|vw~y}|{|{r{~ytt}wi|{z~u{~my}wy~uxq~}~}w}tv~~mty}~~zw}v|xruxzuvx||uyty}z~~{|yxzt|{|}y~~ox~|{|{sz}ysz|{z}yy{szg}w}~zwvtwsy~z}y~xsn}{~~zryp~{u}u~~t{w|x~xzz~x~w|rz~y}uu{a}p{y{v~z}{r~vwvux}{yzvv|}k{~xvr{~y{xoytx{ysy{}x|xr~~}~x{uuz}}}~{r|}|s||ss{vx|{w|v~w|{|{|z|~ytw|}yu~uon|w}wzz{zuyr}wxu~xzoyp~{y}z~v~xxu{vyzrw|{uz{~wy{|tw~vsuxxx~xx~wz~{p{q|v}{{pxztx~vt}~wx~sp|~x~u|twzv{~||tPu|}}}slovy{|zxyr{{}z}~yyx{wx~o~w~v~szwvvzu~wmxy{x|~|}y}zq|~}|yw{|~z|jz~sz{u~o}|~||uq|xx|~z{yz}y|}|y}}w|}tvx|y}yyyx|}w|~zxz~{~~|zz|xxxy~|t~x}z}rsq{{}|~uuxw|~l{zwzx~~|z~z|~}{z}|x{yw~|wyy{zzy{{w~}}}~}~|~{|z~}|~{xu|x~}|z~vz{~z}uyx|vs|{|v{}~{wwvz}yu{}|~y~w}~u}zyv~zwzo{}w~{|yo~y|}|}u}|{{||{{}~~y~}{y{y~~{~u{zy{}||r}{||x~~x}svw{}uz~~}{~{{~}}|rwyvz~|x||~yy{wz{{wz{z{}xzvw}}}{y|~}|{q}w{uyy}{}~y~wy}{{r{zz|qy}zv||~t|~|w~}~xwx|~{x}}tr}z}y}|l|z}|{}|}x}y}{{}zzw~|~xx~}v{y}u}~}zt~~~zw{~~s{s}~}z|}|v|~x||u|}|z~~}|y||t{}~|p{}y|ty|~u~{x|~{~}uy||}~y~zx{|}~m}|w}t{~tzxy|v|y~~z}}svq~~y|}||~wyy~{}}|wxzx||zv{x|uy{zs~w~|v{}v|ytuyz}x}y||wzy{}|yxx~y}y|x|}zt}}~w}|~{}t}~{yxt||zz}{}~~yty{x}z~}}w|{t~wu{~y|t~{~|wtz}yyz~w~zyvwu}txyvx{|{zu{~{{z{y}|}x|w~|z|}v|zuxvyzzzqx{qvz|y~uy{uz}|r}x~|t{~}|~}|x|yyxzuvvz}~w~~}z}~{x}~|qv{q|w~}{xtw{{z|tyx|z}zx}{ut|~}}{vuzz|u~~xt{ywy|~xqz~~r|~yxtwr|x~z~y|xz~||~xsxx{{sz}uxvuyz}z}{{yy{~tw|}mtyyx{uv}{{{|{~x~~yv}xypyyvqz{unyy{y{w|z{{~uxv{y~tzy~x{wzyyv~z{tw~}~xy~{v}}xzy}r{{xx~{zy}|w{{p{}~v|xt{xrzzss||~uz{|~xw~y|z~vuzx{w}}yzyx{wy}~t|}{{{|}qy{z|~zy}}}~~vuv}|xu{y}~ztu}|{|{||{ytxo|}ltu}|u|{{ywx{zo}{v||xy{x{z|~zxvu~x{}|v{zvrxu|x|wfz~~qrzz}}|t}~tyyvx~xwu}rwwwz}|~|{t}|xy{|}{w{v}~txt|svu|wtzqvyuz~{y|s|~z{zu{zyv|}ux{{~t|x~uv~z}{~~}|}}xxwr~|{v{~{||{ty}yzvyzyyyw~{zw|yvtz|u|zzy|{|x~}|ww{{{v~v~yx|wv}x~vy~}y~{z|zt}}zqx{t}yz~w~xxz{q~zrs|vwd~pzwx{p{~y}{zvzyrmuyas~zpo|mZ}p~v|i|zzozv||sq|zu{ysw~txvxcx~v~t|mo||u{zr~{s{t{~zw{tb~{wk{v{p{{yy|{yy}uyuz}|yPy{z{|y}|{rr{|}xs~u|{wr[yr}{}t{pux|tzxz}yyuy|uxyz~uyyv{i}ww|{t}{{zz{x}|tx~zv}|~|x{}h}ly|t{yz{{|zxw{xvpxuywzszsm}u{ww}vq|v|sT~og|{s{ix~vyr}zyx{u|vx}{ysx}h{w{}zyi{w~}}ww~~czwy{wy{lsn~}x{~}~zqwy|znqy{qyz}s}uUy|z||z~}w}uw|wrx~xz|~y}}}~}||x|yzywhu{~w~tz{~~}}y~v~~z~~~z|}{}}{v{}|vpw{{~~syzzwqz~~{xz{zxyzvzxz{zn~}}{z}{}}}w~}vzxy|rw{y}zu~y||s{{vw|~}~~}||y~{zo|wyw|xt}w~y|zz~qw{~x~}}vw}{vv|~zr~y{z|}zzz{|~~w{y{k{z}}|z{uzz}zzn{~}x~}}||~zx|uy}wy|~}|v}|~{u|uwx|~}yz{z|{}y||}zz}|v|o~{~h}zs~xzxz}}z}~{~z}y}{uw|z|xwt|xzw~}~}x|{zr~|~}{|{}x~y||{~{zx~ty{|yq{z|r|gsih{r~w|{||}x{ru{yxyz{|n{~}z|lv|}rt}xjt|~}~~zz~u{t~tw{~z}|xzsrsx~}|{{zy}j|{{||~}px|yys}wzx|~v}}z|u{yy{}}{}}y~z|{}}xx|{{t}tx|}y~{vx|~y~{ys{wy{}z|v~|}x~|}|ww|xs{{~uz{{~v~y{y}rs}vysvtsxxztvywxx{yr{mx{v{}}y~q}}z~zo~}|x~}~}yuxz|~}t~zu{}|~~p{v~y}u}vx}{z~|z{tzywvx~zy~~|}x~vu||zy}w}r|}}zyxt{xz}~{wzx}~xx~}~t}|}z~z~~z~zxz|yt{~zz}~~t|r{}}~uo}}~vw{~}y~}||ruv|w}zx}w|}{|{zzx}|~y}~zz}zy~y{s{|~v}x}}|||{y~uymz}y}zzz}|x~{{|~~|}vvz{xzxy~{qwuxx}|{{|~~~z|x|yxx~}}}zzy}~~~{z~|z~z~|{|}~y}z}|}|||vyv|x{}}|uw~}lrvx}}}~|}|h~}}y{zzyv~{|}~lxz{~}{{~zv|xz~z{xxvt|~q}z~yu}}x}}~}x|u{s||{u}{}}tn~|~~~t{x~~|}}}|ywz|w|}}|w|x}q~}zy{z~oszx{~v|pk|z{vx{{~}~z~{z~~{y~|u}~{{~}{z}wz{w}~~vx}~{}yw{~uw|}qozl}{z|zz~}|{y}x}x}{~x{|zx||w}t|z|zy}zy~~|wtwz}t}p~}|uy|{~}x~yvrvwwz~{z{{|{}z}~~z~x{|z|zxvys~{y}{|~xy|szzz}yyv~|x~||ywy~zyt{y}}wxt{~|w}y{w|~{}|}zx{{~|yyyt{ro{t}}{ypxzz{}wzvl|z}uyyww|x~}}|x}t|~qo}}w~~rx|~v{{}}|~u~~}ruw}|zl}|{}{~}yyuy{w}}~|xyzl|}y~x}|}w`}~~z~~s{xy~zv}zx{{}zw{t{v{z|{x|~|yo~~|wz{vytzxxxq{}vz||z{|z||y}~o{|~}zuxzz}}}~|~~k|z|uxyvxqpw}z~}z~xv{|}~~|u|xzu}{||v|{yz~{}{}}~{}|iu|t{}r}|zm{~z|~wy|{~y|y{}~zz~|s|q}vsyxxvyn|r||w|}~|}wz||y~zyyx{zu|}ty~{zzxvx|~v}}~|z{}|}~}iw~ws}t}{mxxt{{~~s|~uw}~}wxu{{}|}z}pz|}q~z{||z|xyw}mxwt|}}zzz~ww{uzlgu{~}|{{~ztzz{}x}y{z|~|s}~~}|mx}~zl}}uzvj~x|yy~y|x}}vuxv~y~||zy{~~}|~}x|wwpu{|z~t}}u{}y}~||sx{}{|{zyvw||v}{~~}wys{~{uz{yzyx}~z~~|~}{}wzy}xw}~~|~tz}r~u}||zv|}z}zw}~y~{{y~~}z{wx|wy}|~}yyx}|}}|}|y|y~yw~{w}~~~|x||vx{u}~x}||{u{zyz|vz|qu{{qzv{{~||r{|{~ytzvzw~|~|~|zn{|x~}xyux|}|wy~~x~|xx}yya|i}ys}|t}s{|yrxxr{}~~}xy~w{y}{xz{v~{~|~y|x|v|z~vv{{|{||z}}zuiw~z~~y~~~{x|{|w|pu}z|}z|{r~}y~u~z}zy|w|xzu}}|ux}w{{k}x~yu}yx~zzs|zs{}|~}z~s}u|yv~xw~|z}{z}{||w|zuxvu{}yz}wzvy{{xq}}~{rx}~{|~~s|}|~|{yu|x{}t~{||{rwop|y~tzsv}}ywxn}}v}twm{qy~|zoyt~|~|~}us{rqt||ytz|zt}}}|}t~x~zoyyvzxqy~{~~dvxz}|z|zzvvt{|nlzz~rz~z{|xmyu}|s|py{t|}|swt}}{~|{x|t`pyxw{y}zx~~}yoy{~~~zv|p~p}v}}|t{~y|rw~sw{|{{x{{yt}Wy{r~}zx{qzy|~}|r_{}stzxss~yzzy}}s||xtwu}~|~|wxz}y}}{zw|nwz{{wz}y~~||xz}y|z{v|}iwszy|~|}j~z|uqu}}}|{ntw}tzuj}r|{~x~}~}zz{}zvl|}z{{||wt|||t{wo}t}z{}|z}~}}}z~z|v~{}}~{{|~~|~tzz{xz{{yv{~}~~yyy|w|~}}}~vw|tz||{~~zyp}y{v|}wtx}}}x{~wx|x|w}~|}}}z{s~}}y|zyp}~}}u~~z{}}{w~{{}U~~~{z||u~|q|wwt}}zr|}}z|lv}~yuuy}~{v{|zuyv{|pqwy}|~}}|t}|~}qt{~}|}~ytzhyz}~}z}w|xzy|{}~~}~{w}~}x|y{rz~~}n~~|z|}y~x{|}{y{~y~}uy}}{}{|vyu|~o~x{|}uz}{rx|}{y~|vx|}yi~{}}w|{uzw|t~x}{yutz}vz~v}vw}}z~z~z{}~~||u{w{yy~|~~{{p{~~vz{|yɈ}w{|z}}|{|xy~~{}{|x}sz}~v|w~~wuyv{~z}{}|{yzzzpwy}x{}||{{{~}vx~yxzy{ux|}zt|wwxux||}}z~r~x}zz}{|zw{s}zz|x~tz|~{t~zyzz{z}z{|~:}~|{~}{y{yw}}~~{z{}zxy~s}vzp{{{yxz~}~|x|yyz}zx}}z|}}}{}}uyx{xzy}~{|q}{{yr|t|yywz{~uuuyy~z||{xyxw{}|~wt{vtt}y~}r~|}zzu}~{|z{t{{}|||{z{}}uy~{x~{|yxw}~uwz~}xz~y|}|pw|yx{~s}~|yx{kzyr|vz~}~|xzzv|~zw}w|~{}|yz|zz~{}y}zyu~wswxwsv}y|~zy{~~~}||~xoxt{w{z|~}{uk~u~zz}|tq}~{}{{z~~}yly|{}zyx}|wv}}xz|z|w}}vpx}{~{~{|{}|}}s}v~~~zyux{z{u|{~~}s}xdz{~xm|w}ry{|x{}x{}u}|~}|t|z|~x~txvzz~{}{yx}y|||x~}x}~}||zzz~spp{}{~twy|{}{}~p~xxyz}r|x{|p~{}z{uztw}y|wt|~z|yyvuyvrz|v|z|z}wipt{}z{|~x~|~~{uyo|qmt~{vx}~~x{|~xz|~x{}zz|y|}}{|~|vu{vy{|y~y{uu|ryv{||q{t{v|uwy~v{wwz{x|}uy}z{}w}xy}x{{wzyw{u{txkxyx~|fyz}|{{uyszwuq~tz~}k~wx~wqzy}{}{}z{s{zqypz{w{{mp|n}{yxtx~y{zvu{{r}u}zyz{~|zqzu}zvw|t}{xo~~xuv{}z}{z|vot}|wv}{~v}p~oxzzx|~~yytxquz~y|urz{{||{{z}~|yu}~z|~azzxu{wvkzplu~y|zzt|{y}zp|z{wuwt|~~~ypytz|sryoq|yvwrr}u|xoxyz{so{v}zsv{sw}{xvp}w~vtx|rsyy~|z}{|v}vxz|ryw|{xyszyu}xr~wtuz|y~}vobsu~}}u}w{|s~\x~yxzvzx~ww~x~uq|vvdz{x|~t|{~U~{~~zxy~{}}{}y}}}}~}~mntO~hzwr~w~|w|}{}}}{|h}~]x}z{|m|{z~~xz{~wwv}ytu|x~zusq{~~~~}|{xz~~z}srtxvwx|}u{|zvnrxz~xyyr~v|}yzr{\rys{ivvyz}{~v{}xu|~wy~sewyxuyxzy~{ivwlk|}{wr|}w}||{msxxvq{z}~v}|~x{{zyldv{|y~}xxwyvzzss{_x|{}y|lvxx~}~{o}w}|{~z}}}j{w||y~}z{wzyz}yzyq~u}xx~|tx{s{uuvtuw}x~~|a|s|}~y}|ozv{|~|}|w~}}|~|}pz}}xzzq{|||w}z~t~w|z}}|yynwysk~}z|z}|{rz{{|iyw|}}~z|~vxmj}zz|~yu|~z}z|woz~zoyyu{||{y{~~}~}}z}y~~}}zyy||w{~{yzz{z~}}}|~{}|qww|}~yz~{ym|~~xq|{|~|z~}xx~xvy}{~}o{|yyzyz{}~vwy}}|t}|x}|zz}tyyx~s{~~{z||w|py~orvt}{s||t|v|{x}mzyzsx||y}}w|ys~~z~u~{~zqzv}x|yty{v~|xy{xx}~xx~zv}|x}xxt}~zzvyrz{~pxz{{{xz|w{{v|{y~zv{qz}v}yyz~~~yy~~{m}}x|s}|}}y}}~}}{~yx~~{{||~|}{~w|tw|~~rt~}{|||r{v||tv~|}pz{}tt|{{zn{}y||z~}}~~xx|}w~|r}{tj~|{y{lx{}}}}nx~zy{}ut|~~~pw~z|yy{~{|yy}~}yvu}}w~}}x~z}z}y}}}y~|mx~sz}|yt||{~x{m~yyzz|}owvwtz||t|}|~tzx}|u{~|y|}y|{}~|v~u{zrzzz|zz~}}y{wz{vw~x|}xz|zry~~||{s~w|~xn}z}{}|{}y}{|{}yuz|~|u{w~z}|x|{~~qj|py|uvx{f{{xs}|zq{w|{{~|z~pm|~|v~|{~~ovm|rv|w{{~w~}s{{zg}~y}zu~sy|}}yy}|~{vy~|v}z}|{z~|}~~~tv~|yx|~|}x~uw|zv}~{|~}}{}xp|or|~}{}{zt~y{|}zyyx|~z}|x}}}iz}y~z}v~{|||zwz|~y}}~{ww}}ov{z|~vzzz~{{{~~}~~{~{~y~y{s~|zw~}}~p}|uvu~y{z~|u~}iv{yy~v|xwyvzx{}|y~~~}|~x|~~|x{{|~t~y{}~rynxzm~y{|t{|}~{|t{{u~{|xyvu~}~y~}}yu~w~vw|}~{||}}x|~z{}y{|zt{x|yum|~{xy|z{~{}~{|msrxz}r}||wxx~|~~~zuqw}|~{||}wxg~}{r~u|zuw}v~yz}|ys~vnuvw}|jsu{nl{|xz|z{{sz{n|w}~}x|v|zw~zx~yyx}ztr~|wzz}sy{}}e~t|w|wvv{pxrx~t}{u{yvzy}ry{||myyyzxn|zyz~uzziu}}|~r~pr~vyz}|~s|}zrzx~x~~x|~||yrz|{~y|}}{|p|z~rx}}utwy}|{|}{{}~{qxusw}u~}|~rz{~u}wx||z}|xr|q~|yxuv|}~uyrxt}z}{s{|x}|zzx|~s}zwu|~zs|}}{y~|}{y|x{wtx~tx{y}~t}~}x~wzy|tty~~{ze~y{zt}e}swyzx~~x~~v~syz|z}{|rwr}{zwu}vo|~|~{~~~v~{o~{wr~uvwz|zvy|}~|{|{|x~y}kwzvzw|{~}sx|}z~}~t{s|p~y{}{y}}|{}zzyy}vys}x}{}}~{zx{x~xzmx~}}{~{x}}r}}||}x~~}}}~wwz}}{}{|}yxy}{~zuoz~{|||z~}}}{~}~zr{mw~x|t~{znzv}~w|zt}|zz~yuy}{}~{|}vr~}r|}zx{~y~~{}i~|{xr{}{p|p~}x}w|vu~{~wj~lxq{|v|z}q|~{yy}{y}w}z|~{~~|s|xm}qz|wn}syxzz|}}~~|~z~wzv|~{~}yy}~}|yruyytu{yyv|}t{wv||v{~qxs|t}~~xzz|}xjuz|yiu}y|tzq|~w~z{p|y~v~y}|u~~{}y{||}||~{{|}yzwryx~gxyzu}sz|}}}~}||{{||~l}{}}zw|}u{|~{}uw|z|u{zu{syyy}{}z}z|to~yv{~~~my}}z||~zs|v}~~x{{|y~z}~|z{|}||v{r~~x|~{~|t}zuv||}}|v{|z|s~ox~|s}~pw~}yx}|~z{s|x|{}}xx~}~lx||~}w|z{zouw}}y~}ux{zx~z}}~~zm|v}|~|{z{}{u~}}{}p||w}|}rx~z}~|}x{~x~{z}lz{zz{|y}z|~{}{|vu{{}v|w{||~w|~}yxv|{{xx{zupyl~|~yy~}|z|{}z~}}~zy~~|{yz{|u}~||zk~}xzq}{pv}y~vytzz}x~sxs{zry}{p{wzyzqxqr}y~xlxty||xp{wmxt}xv~|yp}t{~uyu~xxwyzqvuu|tz}zx}wz~v{u|~}t~~}wvz{zq{w||}vtxv|{{}{s{~}}|zyfyut|y}vwv|{xzw~xuo}ttvzui}}{~qys|{yv{vzz~{~{{vxss}{zyp}x{eqo{~yy}x|dxzxwmvh|{sy{||}suz|ym~zy}wn~zwwz}yzq{wu|q|}~wyz~}~zx}{wjyzx|yynr|}}|v}|~|{tzbyu|}s~|}v}yy}|zzxy{~~u||xwt}z|ztt}zuwrqvzxp{w|{ilmz|{w|}dn|zy|vz~wrzzy|t|sx~|}}}}zvywwyv}svwxs|tvy}{l|{~wwtz}yz|ys{|zp|~}vw|~symy}|u~wn{{}w~|x|yu~}yxxxvt|w|~}y}{~wtt|y|y}~zz{}x}cx}}w}x{x|{|x}yy{~|~nzzz}|{{}|r~~h|t}u~~}~}}{|wu|}~}z{v}~w}x~||sz}~||~v}u}z}~yz}~z{z{}z}}}ya}|}}|}}z~~~~{|wzz}zk}v~yzdy}|||x|r|}~`{}u|z~v~|xyt~q}p}{|~{y{~}|yk{~}w}~j}zx~|y}}{yzq|{~u~}||{||x~~}x~}|{zx|~r}v{yw~zvy{|~||}yzzx~wzxx~c{hiz{z}ezz}|~|zr{wv|}xr{~~|y}}~x|rx|y{~||{~xa{|u}{~w|w||yu~yv}|zt{}v~{~z~vys}~s}w{{~zrxuw{zz}wrs|xz~s||}z~xx}}u~ywt}wuykr{u~|xux~}{x{||~yyvz|w{~|{}}zz~}}y~oq}{}ysuywz{zzxruuvx{x||x{zxvpzv|}xst~{iy|z|zyzxt|w~~{|yzxxtz|o{pst||x~t|v{~|xxs}{tt||}qyt~yxyy}|rxsxwwzs}z}|n|v}x~}y~z{zw|~}yu~}~u|}}y{|||u~yvz}{ux~z}pus|{~yw~{ty~|yy{|yw~vwytr||~|vv{xiuxr{t{~{y~{zxuuwu{zvtt{~~uuu~{{xv~}|}}{~{ly~u|zw~s{y~}t~x|{}w|z~rx{z}zv}|{x|zvw~w}|v~tzuxr~zyz{yxxy~w~}uyxv~}x}{xpz~~zszrtx{|xu~}|v{}~xvyvw}}X|v{w~{xu{rv}{z{y}}}ux~}hz}}s}ynv}x~}~yyrx{zy{y~~z{u}s`u~{~}wyxxycwwz|{x~vsx~|uz{xwv}swyy}u}xy|zuy{n|~}x}~zo|}{}{{tz{|}w{uy|s|yo~tx~~|~{}~x~}y~}yy}zw}{~|y}|}vw}||~w}yv~{wqyxy}vyx~}z{u|}}z~qs}}wrw{|z|~|}|{z}i{|z|mvq}~|vsz|z{ystw~|}}z}{uu~vy|u~~|}{}v|}z{p}|xyyw}up~w}u}t~~yz{{yxk{zt|y|}vy{t}z{~|{pp{xytw~s|}yyxlwvz{yz}|yxyy|{|}u|uy|}~yzz|wj{x|}}|y~}wtzmsi~~|t}|}}n|}{|vw||yzp{}}y{p~{ylnq}|y|~~zvzz~xzzzyy{x~wxy~{yq~xyu}{|{~~}s{{y}}xz~|uu~y~w~{zwxt{~~~{~x}{|tyt|z}w~qv||~{t|{|}yxzu}z~|vzit||~vx{}rywzpyy{t{w|~{|tvz|yxxwxx{z{{{}p}xy}t}s|xk~{v}wwx|~}myruz}o|}w|}sy{z}v||z}}~kx{zp~}~}z~{~wz{v|}kq|zz}~wxxyqz|}|}||~{wn[zzzzxx{|z|{{|{~|uyy}{|{}}xm}}s~l~{{{|}v|{}~vy|{~vx|{~|}|}{y~zx}p~}||}~~|~~|z~q|~~}~ru}yu{||s{p|xx~|~y}xsz|}w}m{|wumrx~y~}|}{}}|}}|v}yva|v}~y|~wyzxz{{|p`|wz}}{}~{~{~}}n~}}y}}|y|ux~{}{y|||{~}w~}k}{p~~xy~y{~|{||}z{u{{}yk}y|~wwv~}|{|x|||}~}{w{~w}z{~}{~wvz~z~}||xyw~}~v|ztvzt}{yuw{|{sx|{v{z|q}z}bwyg|~|yzwuyx}x~~}}{}uxw}zw{~|tvu||yy}~xsp}wz{}zz{qu~~wt|}}~~z}y~}zz_}l~zuw~tu{||}f|yypv|~s~|s~|~{~n|}|rxxrwx}snw~}{}~vp}u}}{~zyzwyxy|t|wy|}vwxx{qsq~s{vvyz|w~y{|{{{|{}~}{~qsz~{{}}t{tuv}x{|sz}w}ly|y{w{~|{|~}tzu}{{~{uz~u~{tzw||~ww{{sv{{~zp}q{|wwtw~{rw}~trq}xs|z~vwz}{q{x|zg}z|~w|gv~k}~|}}|yr~y|tnqznzw~{~w|vxy{z{}{z}{|ss{s|{u{{u~}~y}uvt||xy~l~t}y|||v~snx~o{|yr{qz{zq}y{uz~~~~yur{{o}st|ysyt{wy}|wk}y}{{q|{uqvx|xszu~ww}vp}tu}zyz}|||}|zrz{}qr{|{v|}{zulxovpzqzfw}{{{wxzzw{xz{~|{{zsj|szz}}luvezvuxqx|qvyu{z~u|px~tw~xy{zvzu|qv~wj~~xyuw~|{vlnvywwwuz||zoy{pw}|~}yo}}{z}nqy}~uxqx}ryx{|{z}{~|w}zz|zzw{zwz{uzx{m}xuux{}yz{|t|yapu{{}~vr|l||zorkqwt}wq}~{y~~{}{{vx~t||Ztzy~s~}x{{s}~}~y|~|{~n{|}~~{{zw{qx}zx||}{yzy~}~|xuz|}}~{q}wyww}wv}w~|~su{{z{z}w~w}~}t|~g~yk~}|{~y}}{~~c{z~s{~ov}y|x}~}{}}r}{~z~z}|wups}{t~u{~xy|wyx}~m~}z|{rw~~|~zw}}wv{}w}{|zwx~x{yz}n|~h~}w{v}|{jyx~~|z~}z~zy|}~{}l~}zx||~u{u}zqpzw}|}z|{}{}m}||o}}{rx}x~|}t~s}y|y|ot~||y}|~}~~}|~nv}{z}u~{l|}|r{p~}v}|{n|}y|}{z{vs|v~{}~}}v|}yx{sy~|~}{q}ymv}~}}x}}v||y~}zwzs|x{|yyztx~}|z|y|{ulz}w|j~vxz}}z{zsywyy|~z~zw{}us~wr}~q|xz}px||r}u}vw|wwuwx{}y~w|}yszz{||z~~w{q{|}~u{x~~|~|}zx|w~~|zy{zsu|}{|qv{zz{||l|w{pp~x|}{tqpuvv}}}{~{ypv{~y|q~}zrzztr{{~{|voww~~{{yzpuuuy}|}}ww|zvz|{xzy{w{y~}{xv|v{~|}}~}w|yt|{{{{}|r~{~ttp}y~y|{x|u}|y~~~~~{j|~{}y}zy|{w~v||o|{{rvwv~|yuxs|x}{{~}zz~|ur~v|}szxzn}{|y|zx}{s|}qz~~|x}x|zy~srvt~|{uxy}y{utzxz~vxt|jx|szwsu|{|~y{|~yvvzsx{|kv~twXxyxy}}}{xzwsy}~}xvz{r|r~t|z|y|}}_y~}z}{~z{{{wszt}{}~~yxw~|tz~{}~}z|yy{}}x~||zyu~}}{}y{zpx|{s}}~yv{p~}wy|y}~|vxyu|{~~|{wt{|{{w|{zz|omxx|~}}~kwx~|~yp{ww{}~~]my}|r|{|{y|x|z||~~s~}v{w|Ryv{}p}}wyv}|{~|{z~vx{yy{~{vs|}}z}vxx~y||{}x{o}ym~}unzsozv}vtxz~x{yyt~z~yzsz}z~z~~~y}x||zz}}z|~yx~}w|u|}r{y}y~{{{|~|u{yww}x}~s|rz~|{uzuy~o{.xq|~{||z}n|q~x}{s~|}v}{|v~}~}{z~|z~r||{v{~|z}v~vvr{zp{||y{~w~wyu~y|}~w|~~|{ut{uyz~zz{}|}z~}~~~z}yxz|}xu{{~{||{||{z|{|u}}{}|~}~}z|}p|~x}~s||}~r}~||~}~|}|}y}}v|}~}}~x|pt~}~x|}~x~|x|}}}~~xy~xxyy|u}{txsx}yu~x}|v||{z|}w}~{zzyzz|{vvw}~{sz}~{~~{}{|x{y}}{{uy}~}~}~~qu~{{xw~y{utw~{{uzz|||v}~zwr|xn|{|y~~}}|}t~|{zvx{zz|~zy~{y}zy}~u}{~{}|zsyy|u}~{}zx|}{}o{q}x~{z|zvzxzy||p~|{~z|{y{r}zww|{|s{~y|y{~~~{}}}y}~{}}zzyx|{kt~~~}}z}v}ymy}yx|}z}h}~v}ev{x}|~uzzzzy||z{n}~}|}}{u~~x{}}|~yu||zxjx}v}y{w{||||y~}{z{{}}y~{zyz{|s|{}~}}yz~r{y}|q|xtut~~}h}{||}z|~~zx|||}x}{tt|v~ovzv|{yxz|}{{~zxy{|{~{||zzz~s~urxy~{z||}}~|y~|zwxz||x|{{{ytxzp~~tq~|zx}}~}zprv|{}z}ryyx|{z|}x}s{|}zw~~}y}ywx{ylzwy|{wz|~{{v}}z}{{zzz}t{v~|sz~oy}}tu{|zyu}yy~}}~~|xx}~v{znv|{z||}v|~zzvwws||yw{oz|w{zuw{{}v{t~y}ywz|{y{y|utm}no}nnnz}~{{vpwzyy{z~}yw~}wrx{zwpy~}{}xr}t|~vq}{}}|||u{n}~z|v|{}u}ty{{s{lz}vymzu~|u|}yr~v{}t|}y{w{v|zzyrz~x|v~~to{t|{xyzvpp~|}y{|{|{u|||wy~yz{{wv{z{yq}}vzts|qx{}zvtx~}xu}}t}|y{v}~}uz}z~}}{~~~w|yzzv|{uu}yxuzzzyxz}vyx}t}}vu|}z{uzvf|s{sp|t|}q}xm}z{|~z}||{xx}t|z~}zzuxwu}x||x~~|}vz|zs}y}np~}q}w|~xwx}w{{z{~z}}zztv}|zwwz{b|z|x|~}z{oz}vyyk{}~|btlyxuz~y~~}~{{~{}x~}svx}{||}r~|umuzyuw}onyiwwyy~rnzvuzyx~t|or|}~z}~|}z]vy}ozxz|lzoy}p|||~z{xj}sw|}tx~~sq}b~x}}xvz|v}s~wswvyzp{}w|||pww~z`zmvyx|}||y~yyous}yx{|uwxnpwnyt}vw|wux|z|~v|zy|vxxu|~{yp|w|txvx~uZ|~u}v|or~xz~~m|rw{wx~z~ne}zx|{urr~~}w~wp|q~_z{~}xr{qvxw}^{s~|}yz}x{yruzz}x{wu~~x}qy{}wz||~{{u|}g{vpw|{|yy~kpuzp~}u|r|}~~}{dyo}~y}t|}{lt~po~}o}x}o}|tx{slv}|zzyqpx|zx||vy|~m{}yy|y{zz~z}t{||~{{zw{zswz~z}~tt~|zt}||x{~~||zkvz|{s{}z|vz{}ae{v~{}}o}n|xz{~yy~z|}w|~tw{||yl~~e}osn}{z{|}tsuxpt}|p|}vyz{|yxr|{}~|~pv|z~|x|m{s||{}{u{yuws{z|z~{poypu{}y{~|txt~y{uz~~|tw|{yw~nx}{|vx{yrq}zxzs{}v~{{xtxh_vwzz|ev~z||{w~}xt~{rv}yz~yp}|}}nfz{w{z}|wxs~~|c~u|~y|y~rw}z}pw}}ywy}tr~r}~}~zy}kr|~n~sz}~{|{xnhqzw}}w~rs}`z~y}o||yzxmlqtx}y{zx~}~}}~~}~voz}s|vp}~zyxy~~}ytx||{s|z~xzxunv~r~vv|v}{pw}}|}ztz{{~xtwz|yz~z{zznysg~|nz~r{}|{~~||o}{}y|}vy~pt||rtzuz|zu|zwxu{xy{}u~z}~p~}yvu~yy~yr{|vx}zyvvs}`}y{{xtvu~}w||jwrxxu}}{}{zr~|}zt~xuZ{|rp|swu}z|yzx}turo~zu~zyywzz{|y{{x|y{}||z{~rrv}}}{to}z~v~truWyy|xz|{y}y~r}}y~xwlz|}~}x}ryv|{c~x}z{}yzrz}~|j~z{pwtty}v|}~yn~z~x~vzuhrx{yvtox}w~z||yw{~~|{fyznzspuol~yt||qyvv{~y}~n|lu~ry~~}}|t~u~~~w|zwxlsyp}x|}xzoxvnzz{x}}ty}}t_v~|s}{wx||z||xl~}{|rx|||zyzs{{yxg~x}{x~}zr|w{tqxim{xx}xs|}|qyq|z~}zrly|x{t~t}uyzyr{rou{}{zz{|j|}w{{y~|zyvgh~|w|yyysvwyys~wxuz|{~}}{~}|zxv{z~}kuyvxwzwwtu~vz|z~yx{vrvmwsxzh~~zn||zw|y|xw{}m~wz}~|z}zy~~{||z|oyy}v~}}sxx{u{||}}y{xvvrvzzr~ys}|ix}woyp~|oys{~~}z}w~~{vq|sr`xz~~~|x|wrxzv|v{~}wzxx}zx{yyz~{xzyowxypwy{~~sntwxzulitw|wy|w~}|wqyv~xxz~|y{zvy{|svz~vx}wu|oxzzsms~~|z{yw{|oxtz}v}yx}~xyl~}zwytzwi{yzsy{}~~zuy}v}y~}so}x{~{|wwr|}s}~w{n{e|vy|rk{p~plttxuw~x|z}lzzk~wuzp{x{}}uptzc}{uz{qbwy{~z|xq|}zx~y}txy{{}{zrvuzu~}x}vvwizjqxx~zZzws{{qry{_g|wdylx{~tvyx|y{{{n}c~u|yz}{|}~|hzzq}u}rtwc|vrjyzz{{t}zp~tn|}xwwtq}qrwz|t}|tx~s}s~tuttxz|wzozfpzxz~|}|wzzxt]~~l|wsnv|~~~yq|wzps}}o}||qr}~z~{~x}}ny|x||{~uv}}qjxxlvu}r~ymvmv|xq{xyx|z}s{vw|z~tx}yyo{f{w~v}vfott~ystrset}zlo~ww~{}xwl}}yr~tubxiss}yx{~wyy}{yi~w}y|vy}zxz}|wqx~wp}|wuxxwx|y~zyrzzz|v}v|~sszp~vy||{zwuy}~u|{~yvz}xz~w||xzx|vyxzpt{{yu}~|yxyzzzz}xyxy{{xsq{~~~x{}zsws}}xu{ux{{{}n{|{~yx|{l}w|{{{so|{~||zy{z||qo{}s~}v~s{h~w~vzu~ww}xzy{zo~llz|os{~wtv{vrv~~||p}}rzzu~w~}]y~xxxrp}~z~p~xzvoznu{|toz|{}~wu}|hw}rzw}u{}ww~|x~||~|}g}zt}ruw{|xw|{xl}n|u}ynzy{hpxw}nwyzs{u~}}{~yx~n~~zzzxzx{|zxt{{tv~}{}|w|{~}ws}u}Zsy~}}|z}|y~z~|zmzysxytyx{qus{y}x~i{k{y|{~yp~}~y~owzz}xtx~}{wxx{zvpy|m|~t~zz{}{uqz~z}{}~uss|yr|wyu}ryywz{z{zszz|~jly{}y~x~v}~}{xk{z{}}x|z|~w{{{z{s{{zvx~|}}x~{|yy}y|sswyzw~}wyy{u}wzyx|q{u~tw~uuxl{}{}t|xtjs~~u|ys~{~}yzz{tqswvr}y}vv|z|wrs}z|x|uyz{y}zztwy}|{|}vryqxu|r|qzzyd|z~{{vzymw{|xxy}n{yy{}~~{w{~z|~|q}{}swwz|~y{wz||zywvt~qx{zxxosz~r|}|v{{tzw|w{~|}r|~vy|{|z{uwz|z{}m|zxo~r}yz|}~~{~~{~|y}yx~x~xx~t~}nz|~m{}yqy{vxm}pzz}}x~xpy}}}}{zsstx}y|yxwnuxuz|yxrz}{}hwv|rz~n|wz}~|t{~kpr~|x}|xwyt{z}wytw{r{}}o}jw||||uu}}zyv~~{y~yxzy}}{y||t}qzy|}}zxkvwn~{~vysusu~sz{t|}}~fq~xxq{~fyy|~vys~}~}{ymr|}r{{k|rww{}~}w|{k{{}xow{}{yl|nmy|}}k}~z}{y}ytu~uz~~~v||tzu{{}~|z~{x{vk|}ul}wvy|v{~oms~~}lzuvywpzy~{w}{}wx|zx}l|~snxaz{{{|{z|nzyvpW|}}{}|}vzwzq{|s|wwxv}}|{}{x~~|v|}}iz}qw~szww}{{tgxz}|u~||{~y}z~yt|xqx~zx{~}}sw}lwz}v~~tzy{y{}{}~~||{e}{~yuv~zxq}|ytx|pmxxzt}~yxs|l}|z~wzz{sz|ropyu{{l{~|}t{|w~}p}{}z|ry}o{|rmzzpy~w}xj~|wzu|e}wszuw|}z~y}{~{z}{x{}{}}tzx{vr~ozqyyj~uz|y|~x}wv}~wvzir}h{{{w}{~z}~z|{|xz{u~z|yxt{rx|{{}w{mzwyz{}v{x~vn{|wxss}|w}yx{|zyw}z{~|yv{{}qqo|yv~tv{~ev}xy}rxywvzz~|xnzvr{z{zqt^~xh{}t~{~ww~}ygq{xw|uyyr}vx~|x~zyyzwr}wvwpu{wylk|uzzxt~axs{g~z}|txu|{|w}yxz|tyv{rwv{|f~yruzsquy{z~wz}x~ez{jyv}~wwz}yuy}w~~w|zz|~xx~wgzxxywRx~{{yqz}R~}}zy|{{yqvz|||ty}yzz~z}~qk}w~s{xwqxv{}u|q~{y{z|y{zupw}lx|{|}~yyyyyvq{||||y{xryuzy}~}o~|xtlzyqirx{}s{o~|{tyo|yvm|v||o~x{}x}{r}z}}|}}rxt}yxu}}wp~|}wsxj}{xytwrw{}q|~vy}{|{~|{v|qz~v{w|y|~{o{z|t|v}~n}yvlxo{}tys~||um~{wx{y|w~w|~qr{}xw~|we}qx{z~~uwb|xzwk}|}}wm~{z~f||wvzxzu{wy~{~qy{{|o{{{{y}u}|}d{}vqsuz{|yq|uwv}{{ct{kn}~}|z}j}um}{|}}~z~zqk~x{k}y\w~}l~|xgy~{ult||xy}zq~u|^||z{{{yz{m{{t|yxxx|ohzwzztyutv~}|~{p}{ns}~mi|wz{||u|}~~|j}tu|{zwwu~}}o|{x||up~~{m}u|{v|u}w~{zqnu|{x}~wnxw~}ny~vz|{|~||~z{|~~}q]y~w~{s|~y{wtz|xy~yzuzzhq}|vzx}w|zt{hqyyv|}v~ys~z~|x{]v{~{|~vw|^yy~~|~ol}|wj~|}}~{xp}v|{~zg|h||zs}~~~~x}u}q{u`{{}|o}|{~z||yzv~zyn{w~~n~{t}v}|u_hhyvf|y~rx{{zxyu|{}}xwww{ww}y}~ynq}~|xuvz}nk|~thqyxuvztty|{v~|rzrmo|y~s}pxyz{}{wu}zpz~yy{}y{s{}}x{lpu|}q{pj|v{}wyv{xvz|~{y|{vqzx|{m~xw}xz|{oqtzx~|ouxtt}{y{wyzp~y|qyz}j|{viqoz`|zyywuxy{{{v|}zvn{mwzt|zoy|wsst{yy}{r|{o~|tt{psyvS{|uvw|}x{|y}|zwxqsy~xcxysw~uoyz}jw{w|zksy~|{tazws~x|xznq|ut{~}s|xoss}~~~|xq{v}pzw}~rhzj~}uzvzx}tx}s~{tw|~wx}x~z||yx||w|o~~q~x}{tz}z|z~~s{}z|yoy|}yw|ttwyyvzygvy|s||~zxy}~z}x{s}u}~~|y~{wzu~zwx{}}~x{r{yx{|~vz{}~w|wtyq~yxw|x~|{{{{{{~t{ss{{}w}yvwqx{}y}z}{vzm{vyrzz}izy|~|ztz||tw}gxwxzx}~{qz}{u~wz|xu~}py~xny{zx{oz}wwzts|}r{{vuwy~w{~yrj{xhuy|~zz{~~|zyuzyw|ww}w~xvpwr~z~~yum|wv{~s~xzx{r~{xq}`xpzy}{yzxryv}~~~xomyyxxxrx~x{|w}||zyw}}lzuuzy}{uszx~~yu}~zx}|~s}}xw{~y~}psn}|zu|||}zsy~o}n~}~}|w{}yyyo{}w}~~|r|~x}zwqy|}~wxx}}{xzwx~||u|~~u{z|v}}sxzt~~||~x|v~|uzzpz{}{}k||v}y|yrw|x~y~|}z}~~z}ozmq~z|y|{x}{~wp~~vkx{x|z~yr}}zz}~y~o~~pxu{|u~|~zzyyz}s}|xv~u}w~xx}{{xu~u}qm}u~~}xs}}}}x|{zvzt||}y~nu}~to{}|}q|xz{w{zru}~}{|wy{r}wzusmq~{|w}{sw{~svsztv~u~{~}x{{{xz}}|}zy~v|t~k|z~q}}{ku|zxp{zxw|y|l|uu|~{}z|~n|{}nvt~y|~|u||vxz{bw{yw|~}|{~qzyv|~i}||{t}}ee{z}syxx}wy}|x{x||ufyz{yo{|~{~{opzv|~~n{{xwzqtj{{}pwzw|w{}}n}txz||}{|{vxwk|{wby|z{}t~oy}~|~|z|}t|u}l~}y}r}{~yuw|ykz}z{}|qx}z}xz~}yrqr{|}|}|pux~|ey|}|u~|uuxo}}}{~r~rs~jx{g|}{{qw|z}}nw|tjuw~znovkwuvs}r|wz|yvp{rtowqj{y~xqt~t{w|~~}}z~|m|{~}cq~kiy}s{zv{w{t{~{~{{w{z}qm}w}}{}}p}{x|zvyszy}u{}Ns|u}vyw}zt{xz_{~|wzeo}z}z{|{`y~}zpy~z{uyz~y{}yt}qt}v{tq{{~vz~xx~|yyu|w|o||~{w|xn}}{|y~~bxx~uzwu~qswtwwvzz{zy}u|pxuzvsx}zwrw{u|n|w}_rqvt}|}rq~v|p}}qyrqy}~wh~ujU{sxyv~uz|k}{vl}xVxu}z~Sq}mrvxzyw}|_~|yvusznwuz}{x|py^pu|u}~|{zx~`quzzq}|tjuwwsw{pxqxx{wy}gbvvuvy|~{xgszheyvzqwf{hr~|uv`i}~xgzr|ooybw{v~tzz|}mvtxp~j~x|w}||z|{|tv~w}}zf`~{{}{~~{|yrrwpuxysw}kztm~{|z}tl}|}{sY~vd{~}zyq~}t|}|og|zy|{{{|w|vz|}}}xtx}|||~wy}}`}}w{qsmz|t|vxz|}z|~xw}z|~}}~vjx}|~w~{~}{t|wuix{}w}|{{|{p|{~vu{yux}xzr~~o~uow~~g{u{z{}{|iontz{xz{pzz{y}~u|~|u~~w~s{|z~zr|~t|fr}~u{|}}yz|wz}~v}xt~zc~z|v||||u~|r}~|{y|uw{v{wy~zw{|w}{{{z|m|x}~zumz{s}wz{~y{}}z}zws|}y}u~lx}~x{~y~w[{y|~~ys}x~~sxy~w~x}vxzy}|}ywz{}|{{|q}zwwu}wyx{{|}wy}}}wzu{}~~zyvx||zw|q~}}{z{|u||y{{~{}|}}~u}|~y}}}y||y{v}}y|~yz~~{w{}~}{z|y|~ryy{z|~}o}x~z|~{||wy}|t~qyy~zw~z{xxz~y~v|r{{yyz{}y}|}{~yy~xy}|zs}|m}yry|st}y{~z{y{z{zs{{~~|v{w~q{wt{z{yzt|v{wx{x}x~{|~{{z{uz~wv}z{{szyz~}{x~x||~|z}l}{ss|y~z}||}yvpy{x}y|z{x~qwv|~yuxwxw|~u{ss|{ysj|~y~x{uy~|r{||}z|~|}~~j}|u{x~|yxwm|yz~|wmw{}~}qtwxz~tvsox|~x|~yz|qnvrt~q|}}wz}yz|{uy}{r}~r{yz}vqzxy{}}}{{~ozq~vs|iwv}rsryv~quvs~mqxqu}vxzs~}z|ep~}}{x}ywrz~|zxywq~z{z}ntqzyyqsyxzuuvu_y{wzyry{}zywgxww~yk~w|rs{zxwvv~y~}dyzq|x~wxyz~ywz|{|ux|}zzweywt~{xys{zzv~^sx{{wwzpzz|~x}vx~t{o{x{wvx{yz}pwvuzvugytsnw|~~wyztjw}q|{}q{v}ys}zu~xut|u~vuyyuzrv[y{}~~|{|y|zp|zx{}yl{~v~}|yq~w~r}{q{n~}y|~tr~z{xvv~|wzzrxuzw|z~{u}~}zv|}{xzs{yvvwxz|}|z}w}{{r}nw~|~yszw}|~y}i~y||y{y~{zxr}w|~v~y~x~z~x~|}rsh~y{~~yu~yrt}~xyx|}|y|t~uzv~zyz}{tv|zwxx{~}pvxx{{v}ytw|zywxz||t~w{~}ytsoq|{}w|pswu{x|rz{v}{xyz|z~zxw~uusz{w{ukwkxz{yx}}}lyyy{y||z~y~}}xsyw~wtz}}lx|iwxvxvv~}}~w{|x}~}zqv~y}xu}}w|nzy{hp{y{y}~atuxwmxyqtzquz|||yp}o||p{}}xtvm}yz{vuqvswyv}}{}s{i{ts|yw}x~}rnxXw~xwty}|ijv~|}zk~xw}||r{v}z|v|tzznz|{{{r{u|{y~jmyyzy}y}za|wu|}}uy|~yzulg|~||vz}|}vz}r{~~p}zsptv{~z|~fw{r~{sq}xr|w{x|~zx|ywn~qz~}}t{xx|{{j||~w||yzu}uspzkw|p~u}oyu{}y~~vu{~~}smr~vz|y|v}}syzy}|v||{r{yok|~xtzr|t~Wgsxr{}}xys|~q{wz{{y{yw||{~|z|{w}y}usyz}yv}s{z|{|wy{{{}y~}}~n{yxzx~|wxzuzyz~}}}yy|{||rywvz}wr~quzypu}}w|zy}zypqwu}{|u|{szq{yyx{wzy{vvypnsxz~|p|~x{x~|~||~{{s{x|~{|}~h|y~sx|}}zr|rvztzz{yjv}}~yv~|u}~{tsvoq~qyx}{w{y|s{p|zzxw|yr~jzx|y{}zz|wwx|}zu~}|p~uvy}{z{rx~{y|qt~uy~|}~~{y{u}rq}|}|{~uv}r|~}tzu|s~b{{z}}{}|}o|pt{uzx}u{}myxqwoxyounx{zvo~u{{~}~{w~|~bz~wy{ts{pw|zw~}{}vb}u`{|iiz~}~~u|f~lsyx{vs|{~my{sn{z|qz|~uu~u~{oqo{|u|{|y{w~uzzmz~j~y~|{qzwwyvzv{sez|y}qq{||~vuy|u~{`xqrys{z{c}z}q}}y|~y}|wz}~x~yz|n~}~ujx{}~||juzyw}zx}z{q|o~|z{q}{yJvph}zzv}}z~x[u|x~yco{wv{Ty~svq~zx~{{w|z_tz}s~w}{}~~r{reX}jzy~{zguz}yy}|{|u|||zxx|jX|V~wyzipp~yzyy~~z}~|x|wzn~~~zfo{{}vqwv{wz}|ztqouzsi}r}qvt~o}|~{uy~|}{l~m{~~vfxts~v~zH|r}]{y}|vmzax{}ymzwwZw|~ly{|{y|~j~sp{zy~~|w||tlqz|qzqv|{l~n{}}s{~}ysq}~sxzr|yyw{zsstzvszyz{{{|t|xubyvsc|~|uyy|w~|m|x}~u{uy}xpw{y}w{wj{lyzgyw||ztv{ryvzzxfw{w~~y|nw{rmszr~v?~z}~{||rzsyy|ykpxx}s~{yvw|Ht}xv}~z~u~~f~~}xtwpu}Nw}~|z|wn}{~{ywvrdz}y~ptvtp}{yzx}~}y{~|}jo{}}|m}|}qz|yzzzym|xt}v}|}~Y}uz|v{}n~v{ysvroNztvarz~|Y|~syr{z}t}~s{~{{xzyyx~|t|{utoy}x~yzy|~tszr~km}|v|c}vxwb||~x}uqqyytPsy|z||}qt~{w{~sqyx~~~{xk||y|~qszzz}zvqszz~z|x{vmxlz}zvkw{y{n~}qzx}zu|}|y|xv~{zz{||ynzu||yqzytpnqt}|{t}v~}|{{}otazn~~l|yuryyu|zz}zu{zuz}oys~zx~y{{rry{]vwwy~y{{oz}s{{|xowx~z|S{~l}|~kwq|z{yxkyy}}vr~ts}||y}~{zjsuu~y}x|x|~u||u|z}wzw}{}vlz~u|t~z{~~ytjw~u{y}{z|~|b{}t}d~z{~{v|y~~uq`~|~s|Nws}p^z{|{r~zwl~zo||r~~|j{}n{}}z}|yznk^d|{k|{yz|r|zj}|vwtwos}q|~}~}brtzrywzztlzm~mm{{mvz{xr~z}|vo~z}x}||l~v~|wvs}}}|}x}||zxl~|utx}{tms}qn}ov|}knzyy|y}zt}}u~u|m~o}roq{wn}zuyy{v|{}whyysa|{}zzjw~k}y~|}z~my|||z}}v{wjku{y|z~ax{zwj~|n~~x}lp}{w{vc{t{zqy|zqo|}uvowk}qhy}vz|~|{w{zeq{fv|kzpi~|{v~~q}{}o||ur|y}|{e~o~~{trr|}z||{r}v{z}yyzp}pz}y}~{{zz{z|{tw}zr{czp}wz{z||v{x||||zxxx{}|xtv~|kxzjx{~|h}zsyxw}wv{tz|m~m~x}|xzzy|p}|ot~w~uzxyw~}}{~{||}~~}zywz}}yp~ttz~~z|xtz~~}{x|y|{~ww}z{v{{}{|{~||x~vzwp{~|y|}{w}}}yzx~}y}s|vz}yzu||{vr{|}{vu|s}z}q~{vxt{}~t}tzzst|p~{y{y}|~w{}vat~zv}uvx|{}ty}s~txryxyt{yy}r}u}yx}txv~}|t}~}~rx}sv|xw}~|yw}~zvyj~}|}{w~||}w~z|u{u~}~x|}{uz|v|}~~|zxtyn~~|vt|vf}|~{}qz|u~{syw~wtvzzv|z}~{|{~}tyrw{vqpu{zs}}yvv}y~yuv~|tx~~~xt}tu|{{|uuxt~ww|v{{}vv|rzzwzvu||yizn~vw~}v{|n~}s~}}}{{x|qq}|y}|{xvwwr}w~sm{~~}||wqw~zhr~tz{q{{w|yzwrym~zw|ty}{wyzvw{zt|r|{|p~lz{s{|{uqyuxmz|}~yx}}v|wys{x~~xx|y}uy`|s{z||~x~p|~}tq{|rwvtxrw{u|{w{vv~~w|wvyz|zwstzus}{~{tz{zv|wvyxyt|u}~zu}y~lttzkpy}xwuq~|{yx{vw{~{w|x{y}~z||zvwty||ut~|~}s||z}z~wy{||~}~xzzwywvwsy|xy}~|}|}}~r{|x}zwy~{~~}|{z}}}}}oyz}{uyw|w|{xvzw|rz|~t}w{}w{x|{sy{{}zt{~q}w~x{w}|}q|t{w~zuzx{||vvyx}~{n}z~x|yuztqz~v}uz}{}yxjy{z~}y|w`|o|z{~}{w}~{|n|{}z}~zz~yttyw}wwyxzxz}z{{{~y|~yws{}y{}{ulv|dzvo|{xx~y}~x~zz}vz|}tz}uv~z|w|r}x}trqx{|x{{y}v~}}zz}k}~k~~qnzz|||~{uy]wx{{~}z~yv|xvxyw}{x}w|z{x}vv}zg}x{{w}||s|zyu}|uypxx~u~{{ysun|yspz||{|vz}{z|u|ul{}{~xww|j|{l|{w{wzws}p{|sxu|}~x~xwv~}~xtvhx~tr~{|zrqluvzn~rk|vykv|~o}yv~ypm}}n~oxpyvu~~|y{tx|xttr|w}|yysztst{}xy{~~eiy{{z||x|xztw{uuz~|o|{|{|v|~z}u{ysztz{yzy}s}q}}~yuxvxsykz}wy|xwz}hkso~yrz~{}uxslzw|sz~}~~uo~s~lwxw~y||u}}z{vswz{sqv{yymz}}xzus{q~x}{zxswq{`xwq|xvm|q{xvs~tzwu}|||vpzurit}{mzy|{y{tuxt{xy|~p}~s{}xvosx|rkyxxz}usy~s}|}{~~xxw|}u{|uqy~y{twz}|~pvru|}vz|v~{|y{|lxyu~osnvywww}^wvvzz}z}u}{W}}wy|zq|}tts||}zx{i~wynx}fy~fxtt~z{hv~}{put~sy|x}mwssvv~ztszxxoxoxwxy{wqu{yn|ww}xozj{}y}{~w{qvwzw~{tzy}loz}z}{undz|wywp~rhwy||z~zx~p{~vwp}|xppx~~p}y|l|yq{~w~r{z}|}zm{qw|z|xuwuyw{}n}y}btvyy}w{|~x|iy}|z{}vu{}w~}~m}px|xz~t{y}{rz}zyv|~~|yt}{}{p|xz~}{n}|zkxw{|~{{}{{o|yluz}t}{u|z{~T}|qv|x|~v}uxuw|xxw~x||y|{|rr{r{x}zvu{z||~}p|{sx~vvz~xxwo~}zzyu~t{}qxxyx~w}}zyu}}~`}uy}}z{zp~x|yz}~xmx}|{|~z~y}}{v{yy{y|~w}zu|}~{xq~w}yy}||~m~z|t}w||z{}~~xzyysw}~}omx~sz}|y}{q}{~{yxxuw}tw~{|xtszvzy}xry{yv|}~}z}yzv{xu}~}sfl{my|uqv}}yx{rqj~ugeix~}j|~z}||zxwlzs}}bw~~|~|~usnzzs{~}|}k}}u{wxetzuyu~w~{~|{v}v|}}z}iz~zzy{~{l|~|nu}z{mwiy}|ynzw||ixx|z}xx}wwzx|x}qz}|~~u@}|w}|}yzs}cxzw}||z|~l|ox}~xt~|z|z|~wcvwz|{}w{{uuk|j{|zuzyy||{h}v|{|zzv|wyo{~|~{|ywtjhx{jw~~_}~z{xyzx}vb{v}uz~~rV~yy~~fzy|~pa}u|x{h|z{~{nwyg~t{{|x||k{u{{hmix{lo|b|}ypv~~~~~py~ou{~|}wvz}|r{s}zts{~y|}||~xpwyy`{u|w{u}s}t|pz{}yvozy{wty|su{|m|fss~}b}~y{}}}|~z}}zy|xo{x{s}s|}zoztz}zx~sxzz}|vyu{{z|{x|~|s|}{sz}}~zn{yxxv~yuwx}yyuu|xvvwz|}~vzwwqly{zvbry}{|~qzrqsyjwxxu}x|z}z}xux}}tpv|z|zvqi~}w}u{Bpz{tzx~|qywtyzxw||~{orr{xtyt{~r~}{|~~w{y|p{vx}|yyzi|{y}qj{yxv}}{xt~vnt}v~sw|yjv{}w~w|w{{{y{zx}vy{{ruxdwuvz~~zix{}y}sv{uzz|ty~|p|{ryyo}{uzo||xvyz{ww}v}pzq|~{zz{qyu}sx{xzmth~yvsxy~vryzyx}|~uz~z|zy|q|{tz{v|vpxowy}{wx}{z{tz}x}|v||p}}}uw{yxwer~|}yo|wvurx|}}suucwt{z{rwumz{v|z{~w}~}zz|{yztyv~z~{{xi}|w~{~uxvsuuy|w{wwyzwwv~~vv}}~x~}}~{e|{zvx}lzux|~z~}{}y{u|}t||~yHt~pt}~wvu}~}ty||~{wy~v~}lz~y{xmywi}zwzwz|~~|av|y~jzv|tw|v~x|y~}pz}~~~|vwwwy{~z}~{{t}ywv}}~~z~~{}zy{ywzjt{x{p}v{|~}{~px{zx||{|zxuy{~}|uusvtu|y~qy{}{xq|y|w{}{xwvs}}vx}ztz}|ru|v~yxvnwxwzxzyj{q}nsxsuy|{r~z|uxxu}vr}yzmwux~xuzu}qzu{}~zt}|mz~vx~y}}r{}nxyyy|x}}vvw}w{zxwzz~~|ztwo~y|v}q|y}{tz}gxxue{z~}{|||sqmn|{{}v}tp|yrztzx~zw~yjfz|{xrvwtxvoxzr}u||{w}{{p}y~zzzuy~Mwvu~sp~vt{{~vusuw{vwn|}w{{[{sp{|~nxowcx}{v}||{}s}~~yvz}|~|h{}}}{q}|}}{|dmozvzrxvp~}~~{y{~zyzy{p|t~{trt}nx~b~u~|}o}yyzi}t|sr||rzq}~{p{zy|r|yx|zqyolwx~t}lx{|y~kk~zyu}x}zxp{z||~|{zzz~x}{|}}}zxx~qrzy|yzr}}u|{|}yy~}x{vny}jz}}y{q|up|yzzg||u|||x~}y{y}x~|ux~k}~}|}|~ruy}zz|vt{z}q~{vgy~}xpxz|z}ht|x}{x}}|~zznvc{y{{zw~wy|z||xzvwi~o|zwp~z~j{zuw~{||yml}yqxwn|~pv}z{{np|nr{y}xv}j~~zzzo{ow~~ypz{}x{tv|||wyv}qy~p~l~j|az{z{}x|wiz{wqonrx|}vl||xyv|m~}||zsykeyw~|{wt}w~}vt~}wzt|lw|{zny}|z}~}}|}}z}~y~{||xxy~w~~{}ys{|{zxtx}||ynz~t|}~}tyskv|z}}{~|v|~xq}rzw~zx|smtsx~p||~~~t~k~z}~vyzj{o~{rr~}~i||~~x||vyx{{~ywpzxo|{ur|vy|}~zqybwtpwzgy|}{x{|{yw||{wv{|lz̀~~zv|~~x{|{}}}v{zzw{ut|}jt{}zu~j~}{t|xy}yzzwn|w|p|s|w~~|~}xxozr|z}zp{|xzpuztwz~|{rzx}x{}ssvwh~~z}lsu{m|yyt~}xoz~wx~z~zyzxy{}yvuy}}zzmx{u|zu|z{}|o{x}}sxsuys|~|zs~~x|u||~~}uxyy}xiymrtx||s}}}z~jzvzwsz{|w{x{~xvow{x{{uzwd{u}}~{}{t{}{~|vi{~}wpsx|~}~tz~yy|sy~s}~u~ww}r{t|{{~zysz}{v|~q}}}{nuxv~|wk}|}{x~~}|{{}x}ywy~t}|y|n~x||yxll}zzv}~w~szv~~}yv{|~l{{w~xxsvs}y{u|lnp|sszwzzyyutzyzrluzy}r~u}v|zx~w|us~{wps}gyvs~xlf~xryx{utvy}`uwqv}xoby|vs}n~i}|y~|uzz}dwxsy|}~x}{~{zu{~y}y~|q~{~}x|z}w~z{{grq}{y~{{vy}ttt{zuzx|v~uq~yn~y{iq~|zrv|}jqzzwt}~}zgvozY~wk|}~y~}}}}v~xvxrz|j~w|~\uy{uuf~~}}q|y{{~~z|yyq{{~xsv{~|wxuz~^rw}y|xz}z~zvpo_mr|zz}xv|{ytz{q}}{y{}xxghz~{vx{{z}jxxqz~wsy}vwltr{n|~lxul{z}wtx}{|~}xr|nq~omx}x}{~}}|z~qzw}xozxwn{{}}~w|ure~{{|w^rt{o|f~~y~{~yy}|w}~ng}kysf{~|}{suyx~|g~j{|z|rq}plxv|j{w|{x~}k|q|xzp~|||}~|v}}zo|`|i}yy~puw}vwxp|zz{|twy~{mx{{nkly}|~x}}y}cxw|y}ms}||st}kz}yzdz}{yw}|d}~{}~~v|~y}x~spzk|~~~|~|}}{lvh{}wq~~~|y{qtzz}|dqrwvyzx{|y}zz}y~{}txnuxg}i{~v~x~tstxhn}~|xr~~}yv{{|~vm}~}|~bq{{z|r}{}w{_uQyuy~wz}r|~w|wwn{ww}~yn|~yz{|~uyz|x}p~zw~|~vzfr|{z}|f}lq}~r~}}}~z|}v{q~~x{xq~uq|yywyrrs}|~~zy}~y{~|z|{w~{|yz~y{y~y}ztypvtwnx|pzsx|}rxvw~{|vpzwxwzx~ex~w{~qt{y{wsux{o{tvz}zyx{xy~oxtxv~~}y}vw}y}y|~vv}{v|zvn||{|xo~z{{xx{{oyxqyspv{}tr|^y~{~vqytvk{w}|yxy{|}}|u}}|}{|y[~x~w{}}~|}{|rwxu}|zww~~}z~{~}r{yn|uw|}zw{}}y{||uy{{zz|}x{zsxvwz|mqrev~t~txo}{vw{z}ystxs~qw{~urzvq|_x|kuyt{zovso|r{|t}}zw{|}xmslw}|{vz|}~zv}{x{~xzzwxz{xtuj}yt|}~~|{~{}xzw{{~{z}rzxwyy}~zy}s{zy|xxyx{szzj{}tvqruj{y}ur}{zyr}{{||l~prxs~txv|y{o{|v|ww|p|rwt|}v|xnon}yzxv{my}|~Zlsnwzz`ttv|v{wpuy{||ywz{z~syz}z`uj{ytouszx{p{z~|}~}uovr|{yoyz{umv~taw~tv|~zs~}~zxz~~n~{}|yv`|u|n}ys}}yl{wuu|}xvt}{y}zwgns~w}xl{|quz~uwz{}~wp}r}wy~vv}y{wxy}w~{{zxn{xxzt}{~w}yw}z}xy|tzz~}w}}w~~z}~p}||}{~~xr{y~uxzx}}|{|}}ru~w||yv{zwy}}zx|~}}s|v{rvy}ywy{|y|zyo}w{ym}{y|{vw~{|uyw}yz|{|towy|rz}~}xx|{zvyzwz|~z|}{{~}v}}}w|||w~~x|wxwzzx~mx||~u}ez~xwx~qtyzu}z{|}{y{}ywzv~zyz{tu~z|w{x~vsr}}~|z}s}p}~v~xzx~}{{{||||}~~x}}z|y~{u|wz{t{x}t|~uwy~~t|}||}z}x|t~~{|~z{yvx}z{v}{uv}xu}}}{zzx}yu~~w}yz{w~|x~|}e~wuz|{xfz|zvvvyz||zyxy|}xtx|w|ssusvvq~ztw|w|~yn~y|xxvu}{{ykz{{[zmzu}vz|}~u~svwu|tyvzzo{yy{|{|{{ly|}~szw}t}w|zyuu~~|y|zovyx|x~zrypy{ztv~n}x}t{s|}~~{o}r|w}uu|vpztt|}}v{vltsy~wy|yxv|v{~x}~x}}z~ezqyq~z||vxw~{}xxw{~zzvprysp~y}~r~|yrtv}|zyj|th~~x~su{y~r{v~rx~suwnxl}s~vm~yzwxuxy~o}{{|yv}vtyk~vtotvp~w~~y~x{|rtq|yvx~|{z}y{~vywv|w}yx||vxyxwxzrxxxzy}u~|yv|yv{}~|~{~y|w}{zsu{w|wx{~}s|{ury~xsy}~n|a{z}tpy|~w}o}||}yuyz{}zxyyw~}||}tz{~{w~wy}}t{||nuzxz{z{s|~|~|ywz|~z{xz|{uh{{z}|x|~z|xv{t|zx}y|}xwyxr{|~zu~}}|vwx{{m~v}~~wvsx|zz|~~z~{|wl|{~jy{zz~|z|~|x~~y}jyv{~~{zzwul~~||{zvz}}vy|ywto}{tzvzyzg}~mxu~|uw}{z||~z~tvr}mwzx}}}w|}xpy{tu~v~}w}|{}o{{w{x{w{{{qx|}sxst~ye|x}||zuvzpq~rr|}}y|||{}~t||yny|~}}us}}vxxv}x|}xzz{zx]w|q{{{||{z}~wzsup~|}wz{y{v~~ry}|wxwq~x}|{yz|~x~kv||{|y~xv~|~w{|~||s{z}}y~t{zu{}}}}z}xywu{k}u{z}~{{rzru~rz}{x}}w~w~~wv~r~{sq|||s}}|x}}{{vnv{u|||v~rsvu|oqz|}yzz{yyx~s{y}|z}l}zz{}o~~yw}~{v|~~{~zw}~|y~jx~z}{tzq|zuz{w{yy}{z}{~pyyyx~{xztj}}yp}{uv}c|~{~~}vzqz~~}}~zw~{{|tt}{o~|txo|}r~~w_vwv||p}~wywxr}}z|zxx{~xvwv}yytxzzz}{}zvw}|vzywuf}w~uz~~}m}xq~uy|}v}iym}mw~{zv|{~tx|x|xts|vyss}twy}xz~x{yxws}|e}\z|xu{u{x|o}{m}q{|u{zv}{{rvz}}~vwron~}wzzy{pzuxxy~~m~y}u~~}~hzqrwz|gzys}{zlvyyw~zzxe{v{x}|mvq|vwct~zx~~|v|{~zwur||v{n}zwz}ywe{uSyzr{gzt}zt~~rz~}{yzx{zVwwz~z}|{s}x}|}tnZyzyt}q}njq{~}t|y~{}p{|{zw~{vqxqyy~{tz}u}{|y~rsv~ir|}}zvoiv~|z|zo|o}}n}fhq~{~yqy|qu{|||o}wr|sxru}_|{y{iwy}|z}l|~zp{xz}mztu}zzyz{yqw~rp|s}~}|mz~{yu~u~{wsy|yzqp}ukiy|{~t~~||}myz|z|~}tyk{w|v}{sw~try~vzw~~~~ovh}u}z}|sz{ylwvx}|ovz{|qyz{y|wuorpzy~}||w{|S~t~z}~~}ou|xuxz|xz|zznyuz}tq}~}r|yy{zvs~~yxzrx~wz}e~oyyk~}{|xo|{}{wz~|pxx}{q~~|wzs^{svw}q|}~y~s~|s}{~vwvsz{}|zw||w|uk~~zu{|z{y~|~~z~sq}m|~xzu}|{|rvznp~z~zwp|}~~wlu{m~z|{~ry{s~}zvtwyz}uwu}q~y|x`}|~u}pqyry{{{xwzxr{z}zwup{vz}c}yx{vzyyzx}|}{|d|y|xqw{~{xv{}y{}qx{|}zz~|p|zoz{p}|nyz{t|zqtyyx}|{qzz~wv{}}u~zxww~x{}x~|y{|py{|o||}{tyx}|z~w~vz}~~n}ny}~|}yvw|xxxx|yxxv||}onwvx}wp|{x|y}ywz~~|{yxvuxuxw|{{}z~}ti~~{pxv{~~zzt}w}}w}}|t{{~z~}yzoxly|qy~oqwx}{n||exp~x|}xo|{fwwxwxbyxx}txvkuzyw|||yxo||x}w}~v~w|}|z~~{{w|so{w}|~tDsz\z}{g~|u}uyvzygs|}xz{|}}{}l|y{rvy|z|z|z|{~~m}mx|qqu|h~y|xzyxz}}||r}|~}s|u{zy{}qy{q{|{~|u{y|{y~f|xyzx|bx{~}y||z}|c~{}~}x|ve|zs}z~|s|w~zx{|tuytzwzx{{v{{yyt|~w|~~|umtnyyy}}~u}vw}{v}~|z~q{{vuvxuwx{}uqws~twx}y{ou|xw}rzwouwy~v{xt}vxy{v{zjzuy|~u~zwywtz}~mrqrzysftvv}sos}}x~yut{p~~tq}q}{|j{nzux~q}zqxwn|vx}}~z|}x}||vwz{zv{}~|{}~~}}z|rtyy{v~zv}~x~wl|w|x~vqwv~u|xy~xwzmk}}{unyv}}fqtmz|||xwtytv{|v|}{{|}v~~ux|}rj|z~|zvmyv|p||sw{~~lo~~uxsyv~zvz}||w{v~n}|zu~z|zyyysyrnis{zzrp}{y{y|{tywzrypp|}|ztzr~|w|zo~{|ys}py|{}qzy}|{rzox}u~y~u{txxt~y~f}{st~}}zs}w{x}dxv|}u}x|~zsyz{zzuyky{}~~~}wknnym|{{{z{zv~zz|{zz|v~}m}tp{|wx|uyz{wylx{iyvx|}{t~wz~x}}~wuxzu}{{ty}{~{{y{o}{}zz}~rwyzrx}v~{z{w~tv{u{m~yxk{yy~~}}z~{~ks}otp{{xvszzx~z}~~|rx|xyx|pz~utxxwrzy{s{y|wxyvr|o~w~}}~tp~y}s|{{|{s{wqu}|x{r}~~uuttq}yy~}}vzus{~}r{xy~wx|x{lx~l|}sz~}kv~x~}u}wm|zvx{vs~~|z~z|z~x}wv{~rz|zoz}~txm|~{zpx~xzzfyw~zw{r|{|z~p~~{||y|}svu~szssv~y}{ux{|{}z~u~|}zuzwt~y}vtv{~{}v~z{usxuyw{vy{||~}|~}wv~~{w{vr}t}v}zyty}w~wu~yry|~|u{~}zy}~s}wvxyx{}y|jxpwy|~wz~}vowxx~r}u~~|}{pxtwxw~vvt}}{bx}}}}lzyyssrz~|wwyrztr}zsz|~ukvwux~{~uymtxwz||}ry~pj~xtwzj|wz{{q|huwuyq{uyztywzp{y}}uk~oux}yr~}|{}vtu|||{|wp|vw{u}wrx||||zyx}~y}}}xzs~u~tsym{}qwuzsy}{vx}}|~}z~zzzo~zyv|~{sx|u{x|~wu||x|~{}|z|~}tzz{||yxv{{|vt~~}s}z{w~wy}x|y}yxwx~wk||w}snp}}ywz~|s}~~w|z}qyv~}t|z}zzw|v}ytz}xy||ts{xx~l}|t{svu}pw|oz}zt~{y|uwwtx}vx}xtr~wyw{n}{}v{}g~yypyz~zyz~|}}my}{}u{txxx{{uw|||~y|~fzwxn{}|{p|z}p}y|}xyz~~z}y|}fy|~w|~{ys~~uzt|}xw|{uossv~xtu}}zrw{x}q~uzyzz{w|{|wouy~}}zxw}|z}|~|tw{vsvzzxy}tr|k~~}suw~zuz{|tz~u|}xxx}m|ywx||}wxruv~w|w~x}uw|{}l}}wvz{}vp||n|x{~rswr{|{|{z{xy|}{~yx}z|v~v|vz{zxzy{|uyy{z}x|x|s|y|~wyt|qk|{zx~{s~}|mny|z{m~z{|~zv}~}vvz~w{wysztzw}ztt|wz}{}v|{y}xsus~y|y|~|typ|z{xtwv}{}{{uzwr{~vz}{~yi}y|{z{j|}x~~vwqvxtxxy~{|}|}ysm|xjsv~{}}y}vl}}q|w|z||vx}k|wns||zzs|n~uxuxyz}yo{mx{v{z|w~uzzuxy}{}k}}yy}|~v~}wurt{}ux}|~xzywnn|v}{txst|}w{x}}|uny}yv{xno~xzt}|vnc|zzvzz|j~|uz~zpsu~vtzuz~y}t|ws{uw}{~~~n}g|w~o|v~~~|}y~zm|u{gl~z}suzxpn|~|j|ty{p}vym}v{tt{w{znv|r~}`w`}yzzz{vmz~tzsxt~|vyxv}}~}~{~{}yywy}ynpwaz{}~utaw}zeor{x|x{|{s{}p}v{vootsayt{nzy|t|{wy{~|ttw|xvom~}}yz}y~~~tkspxmn{~}z|l~{z{y~~vxzqvrqxvn}|v}yxpxn{yxustw|uvx~{z{~vd}r{|{vrvx}pnu}jrrzu{xyyry{yvlxtx}ov}{~{{mo}}~~}x}|`zqv|y{{}{yz}zsy{t|y{~|}z~~qtq}vxxw}uyy{zk}vz|wz}|~|e~{yxwz{|z~y|z|d~y~{utx||x|~||{~~y~|y{yt~zz~u~}y{|s~{{wxy|}ys|s{}x~zx|r}x}}|}w{y|wyx{~}~vpx~w~}z|}zq{xxo{~x~x|{|x{}p|}{|vw}zw}yz}{|hzx|y{|v}owr~{u|~y|x~zz~ur{{{~||xwzv|{||v}{{yzyuy}}|{||}w|zz{}|}yzs{t|r{umst|yrr~{w~|{zyz|y{zz~||rttxyxy{~vvvzz|szz}v}sqz|v~zqx~|{~|z{~}xv~y~q~xy}ryy}s~w{mz}}|~}rv~{wv~~f}x|{nzu~~x}wvz{}~y}z|}tu~v|s|~v{tsy}{|{xv}}{|~y|~dz~|y}xz{~{z{~xxx~y|{z}w}|s}vx~}rx{s}q{|uxz~x|{mvxz}~{{z}}}{}ykz|xpu}~z{zz|vy~|{~~}~t||~t|uwy|g~|~zx}yq{|z|{zy{yz{|}|~qz|w{zz~{y}tkywz{ynu{q{{|}y|}t|xyy`|z~x{{uzvv}~}tyr~x{s{~uu}{|~vz{z|}x{z~tzu{{x|z~zruz{vxvz~q|ydztry}swvyz{{|{}z|ov~|yo|{vz|~sZ|{|w{{{zxx|}~wxxyqv~~~y|}~{zQp|}}zxvwv~yyj{{~}v|q|}{me~lyo|w|t~}}~sw{}y|vt}y{yqzwqx|s~zy{z~i}}z~|t||ty}|{q{vm|zz}~qywzx}vx{|wvzz|{x~}|~{zxyy~{}}|r}z|p~z|}qnvtx|x{gv{~|~~v{}r|y|u|rzyzz}tyxy}z||vxry~oztzzqu}|rztz{yu}zhw}{zx}rx{|zq}~z~z{k}ws}xpw~{vx~w~ynz}vyy~}z}~y{}zz}xz}}yx~y~{upvsz~}uuyz}x}~}zvw}~|wz|zutwy{s~{v{i~{|u{{zp|yyy}}{t~}ytwx~v~y|~}~r~|wx||{z||z{vxx|xx|~wwx|vzryvo}}yv~sx~xz~|wznyx}|xq|u~p|yr|zy}}zypv{x|u}}}~~t{vw{yyw}~w~ttxt{yww}|m{}~x~zx|~}}yt|xz}~y|w{|}xzzxu~y}~~~~|mw~vwzay|{}~w}{{x~k~u{~|z~~w}us|~ryvy~u}zw|qu||~z{vu{ys{~tzy|z~zwu}{r{muzx{z|t|}~iyt}~v}uvvyz{}v|pu|zt}ynu{y}{uzz}g~|ux|n~|{x}wtx|}{{y~xz}zux}wt}u}{rz~}z}d{{~sz}zn|xz}x~|{q{zzyx}{xtj`nw{{~qzzxaz{|~qv{zq|~y{z}{zxzv{x|uqv~z{{~}w|~svz{s~~vy|z{}~{{muw~{{{w{qzz|}x~wu{oywvvzz{~}|jlvy{szxo||~zt}ywwjm{vrn|z|{~yxyzt~|z~w}x{w|um~{~y{~y}yh{z~~zyw}tu}xtrzy{vsu}t{{|nwv~v|lxz||qu|m~}~z}x~zvo{yzux~{x|zw{yx~vx|wzxjyzrwo|~}xkzxoyk~|}~}y}~rv~u}^srwy~z|szway~y~}|{z{zywzi|~{xznups{~{w|tzv~zx|{}|{vvzy|}trvx|x|{uwwuyzz|~}|{z~{pp{z|gv~~z||yxsx|{hy}}|{z~~n||p{zn}x|q}r|}ytw~~}}~||~yq}~v}{xvztrv{y{}r|zxux|y}~~w|~zsx~|z}n|xwvy{|}yp}{zyt{w{y}ww{~y|}xtx}zx~{~|v}y{|}|tox{x||w~uw}}~~}x{{}zxy{vyx|xws}w|z|{{~~q{yvw|}|{}typ{|v}~}~wn}z{}{~xzzx~|vr|z}xz~|vuvzsxf~}xyn}uuw||~yy~zq~|~}{vysxy~}}~}~y}wtz{r~}ry|z~zy{~}~ttqw}zzz||z|~}h~|}xyo~uhu{w}vt|{|}}wuvxzs|qyz|xv}yywwexw|yv~}}x}~tw|z{zxzxy}yv|~}{pu{}y{}zwtw}~}xy~wwx~x}zu|x|w}z|r{~|oy}|z|w|u~zxvzu||}v}zv~{}jyvvm{|n{z~{|r|~}{t||wu_zz~xz|~vuxr~y{~}zwywx{x~iwwzzx|ys~u{~z|hv}t~zy}}{zxktf|w|r{u{x}|}}o{ysuuux{}r}yz|~yy}}www}{~gxx{kwwq|znsxzywzuuw~{{tq~yvy}z~{u{x[~szv~|rsx}{oy~oz}yu|ziy~ym|tqrx}yyzow`ul{{vsy||ww~|wxys{o}zvv}zoy|o{}tyxo{z|}wu}w~|wwuv{s~{}||yzyz{slyp~pusz{z~~yzu|}y{y~~t{~y|wn~x}q||}wz||w~w~vz|x||yy}v}z}xzsyw{{pyaxz~ox~vvuy|uxv||zwuzzzx{zyq~ylu{kw{zvq}}z}}y}{nwy{}w{vy~v}tzxzotzv{v|kxw]uywuu|~fyypw}|s|u|u~|ly|vzyyyz~r}w~cvvx|~xx~|l{n|{u{{ouzw}t}uyx}~{|}v}|uvwx{|zvyx|uzu~}zy|{}~w}ztuq|zwu|~{xx|{|{x~{y||{}~ynu}fw|}|zoy~w}~zwzk}~m{}y{}wuu|nvvnvs|~wm~y{ru~{}tp|{{|pq~}z}ysza|qw}vw}{tylnz||vyu{x}zu|uxo{ov}~zp{ony{dyy{|w~y~o~|tym~quqvxuylvyg}azo~xz{twu}|u{yyv{~zuwyxzp|x~|qzv{|y~xn~|||w{}fmvvqw~wn}a~wxhyvtr{|zothww{{}suyr~|zoslu}v}|xwwkvvu{Cux|}~}yw}st{~w}nxzgz}ey}ntzvps|p|ovr|inzlwlR|~~ut|{~zx~yr}zu}m|m{}|v|vqrqzs}}{y{vr~X|xxL~|~vz|kuswyu~r~z~|y~j~xz}ts|qv{^sngqxx}zv~}{xuswhwv{\|zoqzzi[vu}imz{zi{{vrj|v~~{xszjvq{smunvuo~}}hzx~|}yz~{}{y}u~w~tzxtzxyx}~cowxww{{zy}~oxzp}zv{cvzvvxw{wxmjpxzwuu}r{uz|~~|~~y}xzz{vy~t|~z}~{z|ttwu~~zzyz{~r}|z~u}y||x}{~x~p~w|sz}zoy|z}tzuus|~tv}`yx{qx|y~{rz}qs~vzz~}{w{~{~ww|{wvz{z}x}y~u|~}mro{}y{~vxytztw}wt|u~}z|x|{|s{s{z{}{b}}xo|yx|}{ywzv~z}}q}t~}zzvzz{qzty|~}u{ux~}~qp||~uv~{}z{{u|{yw{us~{{qxzut|vowzt|tzl}p}xvvu|ws|{||rs~{|}lszv~|||p|}vzu~r}y}ruy~~nzv|z}u{y~ry~~w|{tzyr|x~z{z|z{~y{||}y|{k~~}nvs|{}|}y}}xy||y~w~~|xxy{z^~{j}}v{~v{uu~~{uqy}lyy~v|{xn|sz}{x{sz~~~uzyxvsz|zzu||~q{q{z||~|~vzv}y}yx|zr~~{|wzwywxpzt~}{|~mwyh~y~v|z{zx{x}~|xx}zy|wvw|{{~}vwv}|{uu~}|zyyxp~yxq}}~~~usxv{sit}~|zzz~w~{y|}{~o||{~kv{y}q|x{}|zy{ux}y|y~{|v|}|}y}v~}n~xxwyyyvuo{bt}~uq{{}q}y{~{}twzyt~{|}|~rwz~~~~|}}}{w{}{y~}wzxv{~{o}wtey\pyw}xsz~y}{}zwssw{~rzym}x~z|||~slxuy~u~x|{yx~~qwz{r|~zy~{{}~s}mzcrzzwkyyzxl}{z~~xum}x{zstz{zg~{ntswt|oyw}u}cy~xszs}|~xxs{iz}~z~y{xu|wrtxy{g}}s~uxwx~|fv}v~yxqr{}{dy{zk}~}|z}rz}nizw{nq~lz{r~zxuux~~zyxy{q|~|}~|x}||i~qs|y}_z~|~w}|jry{}vviy|~u{g{~}yyp~xwpxz}zz~zz|ypzsea{ow~wwp}}v{~{~jwuuy}vztg|yz{|}ev|u}vpyulu~{}{z{}yz|nvzz}k{y~||z|yxxw}~~v{~{x}y~pg_j~~vyrzyxnvtsyx{~~tow{y~{~~yyw}}tror{s}~zt~y{x~~~x|x~|~}twvzvvw{k~}}uytw{}}|u~zxz|z|v}|zzy{umvx{{p}|xy|}{}yh}xy{|xuv}x|s~|zzsv{{s||}yu{w~~xyu}}{y{l|r{yysv{uzwzwv|i~{{ruy{u{z{z|sw}}}z}lq{{{t}z|~y}~~}~|}|}{y}z~|}|}wuz|~|u}xyyz}ursy|~~vv}~|z{{w|~o~wux~uxy}yzw|{}ynz\~y|y{z}{{~}|sy}~osz}||~z{rxyzjrx}r}tx~~~y~yuq|wxxg{z}{~~rz{{tc~~ls|}~}~}so}~yq|~|}xl}rx||u|v~~~|{~zs{x|}u|v|z{|ztqw}z~m~||t|{|y|}z}y{~p|{}~vwzzwdt|{yr}m{}l{z}}~zy{{}~{x|whyw}umz~~yxw{|~|{i}y}zu}{~}ssh}{q|}{x~|z}zv~}{kyssz|}|o{~{|{~o}tzl|}|~z|{}y~wx{}{f}}xxrzuZz}|zz}}fbwzh{s}zyzwz{uh]z~v||zw}sx}xztyx}ytqi~~~x|}|{~~q}}my~{||z|}~}~two{|utz{z{~}zwqx{sth{t{vzw|zyyx{~y|twpwswsuyzx~|{}|{uyyqx{wy~z|}zxz|xyq|wvuwz}sy~zt~z|z~m{z}}}}xi{}pzzvyz}z|}~{[zz~u}z}}{|{z}|oww|{wy{sz|v{y~{~wy|~|}tw{s{{}{|}vyt~}~v{{~zx|zt~q}ss~|~y}{~z{yv}zvu~z|isv~}{v{{}vz~w}|v|ryy|zu{|~z}kwu{vys{zzqsuz|qo|zxx~rlyzvzzzyw}~zr~xqyszzy{ls{|y~}{yz}mxyxtxv{xx}~|wz}xzy|s|qy{twv{|}x{k}uyq|m~{~rzz|t~zrnwt{x~zw{nzrt~z~}y~k{o~y~yvzv|}{~zxn{|wxyw}wyx}zr{~yxvy~z{~z}|}|}}x}zyv|z|y|w{~~{yyzz||y|x}so|}xz~s}}~|wz~zoy{t{zuzy}z|}s{}yp}}x|v|s~||z}u~|yz|~t}~}{vz|z{|yzu|qx{{xu{}}x~w{wy{yv{zw}un}~uyv{w}zw~}zw|zzs~|}~k{x|{wwn|}}sztx{{zx||y~szs{}}o}xv~zxw}ry}rz{{{{|zzyry{r~zqs~~yty{{vy{t|rx{zux}w{z}zuitmy{}}x|{z{|ztwyxzwwsq|yy~y~rwy||xzx~}uqvxu}{||~~p|}~pw{z~yw}v~}||xqwzh{t}r{vti|}wzmqy~{{|rxs|q|p}tzzz||s~zz~txzyy~~uo{sx~vv|{~vt{|q~}~ly}|q{xyz}|yz|}tq|yy~ysw|lytxz~y~my~}~qxzzz}yv|eqz|z~ryw}rw}{w|z~~}yw{y|}}a{xzwxp~r|{~|xv~vyru||v|xdz}yy}q|yr~{u{yry{xt}ey}i|xy{yywzwxw~{w~ykrt|{u|oxwyt|sz~yyp}swyu{{|w|k{|uwxp~|w|x|w|zx}z|t}|m{y~{~xzxv}w|sz|{nw|rq}w{}{x}|{}x{yufww{rgv{|wq~o{z|x~n~}}{~vi~xupxy||pn{wwyrw}|uyz|{{uywgy~u{va~wvu{~{y||vw~}}l{{|p}|x|uztv|u{sv}~vugmtz~~lz|xw~~{|~|yyiv~~uu|u||}Vzsjvyy{mpwwyto}nx}|ky|{{{znz}}vh{tw~xrtzz{xyzb{{xawqzxqttu}|x~{{~}{qvrrvw|x{x~^wxt||~}z^bwn|pulmxkx{{xv~{ztylotzxrzzyzyj~zyv{vo^{v|kw{|w~x~{|{y{|yhu|~zp{}i|{s|}wu{t~}|r{|ov}|zozqwp^`zy|y}yz~zvurp_~|~y~zv{ewuvh{u~}~rk}Ulu}rxhoswx{}y|mw{|o{||myuyz|{vx~w|qzyzzy|}|zztu}yv{htzyw{wo}y}{x~y|xw|wtzwy|{~{}|wvt{r||{s_w}ryw|z{w{|{z{zyyrt~{tqmyvfsyzv|vh~zxwym|}tquxzvm~{u~z|{zy~p~{v{uwzyyx}yfirzyzr~uU|u}}x{wyz}~nz~~y}sv}{zss|{n|wezy{k~t~wu}y}rg{zjsm~yzz|~mz|~zgs|u{{l}~osv~vtx{u}}{ys|yy{|}{vwx{~z}t|~}~qy|}~~uxyyq}~wxb~|}}dzz{{||{yx|o{{|}m|v}|pr|xqu}{pwv~|ugmx}p|up}{|ry}~{uw~zpsE{}|nz}|ynww{t~xv|{~|~lu~n~{wyv|tvv}s{y}zfzuzv}nxrv{y~u|}q|}s~|ymuzz{{~yz||zw{w|pu~{}||{mu}|p|qg}|syz{}~k{ufyv}zz{ltz~zw|}tuzlyxmm|qv}x}y|vxkv|nxyxzywyx~{oqVxutxy}pu}|u|{{xxzvyyo}z~sp{zuw|x~kqpy{hw}x~sxry}^|~~|}zwnsmz|{{xpvny}}~d~|}plvy{ywr}}|vyw}uszzzyzz{~y~vw{x{tw~rkpwւ|wxy~w~|kvikxzpsxt{|yys~yz{uzylvsw~~qk{xwx~~y{~{m|}wj~z~}|ovzw|{vy~zwkr}}ztxy~}{~yu{~yr|{{yn}yithgy}qz{~z}}lxyi{r{}{txuzzumzt}m{~x|xvwz{|t~}t}ux~{{}~~ny|x{w~{y|i]}}~{||yzzz{{}}z{{}yychs}xt}}}~}p~|y|{xvz|uxx}~}ysz}uytx~w|z}z{|xy{sx|}kztw{zyztz}bw||yuzv~zx{v{_k{s|y|zz|~r`{z||zv{z}zmdt~|~|vyqzue}uy~t}x|n[|{szxn~zp}v{z}}wy~t{yzrun}w}|wzo}s~x|}~ts~y{~{|p~}^qz~r}qu~wvnyy~}vwuy{dud{vvl}yt~z}om|{se|}{wrf}}wz~i}~n{k||zywp|xvYlu}}}x{j|wxkh~x}x|q}t{{|Yu}{vxwr{~wwu|~qz{v\{}woz~{vzvruofvs}us{z{suvhy~ozxriys~n}}p}|xk^x~u|~}~|{nv}kthu~kaw{vuz}fypxjlltdsq~xp{opzz~yy~oY{to}un|qyo{zzq~xxz{xy|_s|~x}e}|\xybxw~|tbzv{yyy\qzzxv{}zry}y{|xyx{r}yysslzWrsnp{tszr}{prw{x~ny{{~YshQ}z{{~yusy~|wY\qgvy|p|wzszzs}}ydPn}~uzzsvw}r}wxw~wzt{~bxn}}~w~n}wz~{r~}g}{yt{vqyy{|{|q}uzzy~wptt~yz~s|vt{tuwi|}zy{y{xp~v|xw{x~}mk{t}s}}{}swz~upru~jxnux}ynw{}x}~zoy}vvzvuzmzyu}u~||ogq|~nu}~}x~usnzs}|wrzgy~mz{{z|fnzy|vv|}h~{{|iy|xo|}|z{zc}rwz|{o{{yz~{{w}w|~t}{z|v~u~{zxlwx{}lz~qr{}{xx}w~{~{wmi{}vxty{{pw~qt}}wpt|z{{v~y}{zzy~~m~|vs~xupx}ivtwmzvz~q{yu{y|pwy{~{|x~xsu|t~~o}fyBzxxxlxxk~vj|xylwqu~r}o}}bz|gzxot{ysm|~s~plxwjktxn{|zr}q~xox~~n|wy{~kq}v|syz~s}_myh|}u{ywsw~ry|hvrezv~rn~mkvxuymv|{i}vu|aoqz}r~tmw}u~w}zx{rzzy|qq{_|y}ntyt~szv{}ew{w|yu|xN}{xyzxs~lvxdsmo~ny}}z|sxx}}|exwwq]zf}rwx~ww{yzrw|z~v{~{}u}}lzz{z{}awqovtwwqz}m~qyuztzvx~y~Jvzpg}rw~m}|~uyv{xu{t|urow}|~sm~{~iy|hxxbz~{zzszq~z}yu|znw~{rwyxzze]~{z{c{|x{nywu~~ts}~||xt|~}{y}|wh}{}xx~su}yv}qy{{o|z~}x|zwv~p{{ty|v||y}{}~y}tzyxxzyw{x{q}u|zyzzy|}~yuk{|{xq{{{|{zk{|z{}nqni{y{uzsxwr}zwzkzzx|um|z}t|y~||wx{{zz|{~|y|~~w~|z|{t{~|v{sz|~{}zyzx|ot}wv|xv}x|{x~{u}r}wv{z|~}syyxz|~~x|}}{xr|x}}vz}}tw~}|~xzy||zxzzz~wyzvts|{wpr|}qchzy{{{x}sdxp}~|xysuuxvz{|tx~z}x}}zwwv{}veyyy|||xz~}u{~{hzr~pr|{~{|z}}xx}}j||w{qsh~~yxoz{~{vxw~{q~x`s}l|s|ym{|wv}u|~z}vxy}t{}z|wx}{yy{{r}wvxpz~yy|yw{~|yryys{x|mu}swd}s~{np}qzyk~~vy|owqwu|}lv~qoxpyx}yuz}~rs|svq{zs~}q}~h~kdz}|xzux{~ewvq}{x}rr~zwyy~}t|t~x|sqro{xmsbx~vzy|vzz~u{|szyn}yz|{w}xzw~tyx|cxryz{ssqy~w{}~y}u{qn~yzqzuv}{xxupsqyr{~|r|ps|npkq|}w|{uwvrv{|{x{|}vz}rvxl~|ywlyyxu}yty}mwzqs{owr{zy|o{sxwtz~sjqx~w~tvytx~xy}}z{f}um{u{ux}j~x|z|}ol|ry~w}|z{}so|zx{xtuy~~~|y{|j|zy|tzsvzj}y}}|~|}q|n~{u}y|zt{~twyw}}}wyyx~y|suyyv}y|mz~muzu}|vwz~yp{{zzxxvyuyv}{}|ytz~~{|oyp~y~xyw}p{~t|wxrjru{z||gxt~yosq|w~~|w|v}x}~|{{xz|yuw~|{xw}x~~uy}t~{}w{ot|}|y|}v~k~{rruzyy{}}}yxsuzv|h~{tw{~q{xw~w{}xs}z{{txtw~ztt|{}y~~yyr}xxtw~ww~ky}j{~{~}{y|wz|y~|k~w~}||qykyqj|}|j~u}y|ixtq|wx|}wy{|vr~t~sy}~}xtwzvyx~tx~~orz}}{wy}wz~ht_{}~{}px|~~oysp|z~~xvu}{oxyyx}{xv}zmxtvz~|tzzv}~xzqz}ztq|r~xez}|{~z|vmw}n~or||}tk~wy}{}}w{wwrt~|}u{xxsa~p{~|z}}rsprc{zlwpyyy{zuuo{}}v~z~wzd{|yyyyuy{x{{{r}|}mzw{r}}{o}x~y{|x~{w|}y{yvyl{~|v~vztpxv|uv}~tq}~w|zux}vwt|s}}|Zzt}y|vwx~|}~}sxqyzxzwq{}w}}yzt~ssy{zz}ty}x_u|u{~iqxu}vxyM{suzexy{}sw{}mp|yy|wz{}xy{ys}~~|}|}y}~z]xz|wyvsS~qo~uvz|}uluzux|wzbo}xtxus{z~{}l}xyvzm{x{{zzyyvKkn~z~~vvgr|vruxntwy}s|w}zysq|qs}t{{{w||utwy|j~~|o~~}vz|v~uzvmv|~t}zEv|}}txrtjtx~tw|}yyr{|zz|suw|i{y}vz}xuv|tnn~~}}{x|~lnizpm~zgm{{zu||s~~vfky|@z~mnx}q{kvy~}y}w{|~zyt{}wx~}ph|}|tyo~w}~~zy{t|w~y~|~{~z{}vw}vypz{~z}xw}{m|yv{rwzgx|~u~z|pns|tx|qq~yr`{{x|w|u{zzzozy|~o|rzw~q~rru|yw~zyxpzzlt{yst}~yu}|}d~ywutx|q|xzzjvvw|~yukywssxzxy~x}j{zsy~n|s||yvw~w}xHvyv|{|wu}tto|ww}q~{w{uz{zwpx|yw|yxyzuy~}yz|vyoz}}x}v|x}s}|w}Upzvzwx{~x}~xtyo|z{u{i~z}q}zzzx|~yw}x{{|u}}~vn}v|h{p~s{zwyvzzrzsvussv{woykx{x~}}qyzymx|}}u}r}jp~rzv|{svz}q}vwwuv{vwzjv~}tsl}yxxw{wszvt~vz~|xlot}nqxp{|rw}oovz{|}wq|y{y|}z{vrw|~~~{|}qq{xxlvmzzqv}}~w|~u}rz}yyzd|{wcxt{fyzv{ww}|y}myvwwz|{ysw}hkz}|x~{~zyv~vx|vuvzovv}{}vazt~{~wu{~~o{^xuster~xwszi~}wpwxz{ypyxs|{q}}uqs}u|uys~mp|~|ku|{qyqun~|qp|tzz{~xkzw{xrtuxwz}}~t|{tq|x}hyr}yt|xx~~r{xvmwzr{||wltx{|vx{}w~ovr|qu{t}zw|}w~p{swymg{yrwl{qtttvvsqzxoy}s~yy{xlxvirxs~~{|n|||m{u|~{q}vz~~vw|{yx}|yyyytvyzvttvu}q{~z{g{||{u~|ytqt}z}x}y}v|yv{xy{zz~zvo{{x{u}|lw{{yv~}{rw~|uxx{xp{~z~q|rztz{wvosyswvj~~}zu|ty~rqwzt|z|ts~}wyzxs}~|x|z{~xtzszypqvty||wxt{wyq|m~u|ty~zsq{}}~~yuxwxy}vwy{{s|zyu~~y{j{yyxqx{xj{{z~uxvuwz~xyx}y}~vy~w{||zyxvx}uu~z~vyxy}qwwqtjzz}~r|ws~yq{wy}~z}xgqvuly|wo{x|~z|w{xws{{x|utu}~}|~wq{{|vb{plpzo}~}]zzzzo~|Y}xy~}my{yq~}|~~{n|Tqzx~w}s}p]}uy}|vu~wv}sx~h||}z|r}v}}{}uvyryv{i{}o}ye~{}|~xju}zq}zoq{hn}~tzl}}|~{~vvwno{x}|zxi}{numy{|}~}|vxy{{xr~{x|}b{qt~{}{}ht|z~{|y{w|n~}wow}f{vw~w{||{~|}{z~y{}l~z{{{}ywd~uu~t~u|v}|xw~|}}sl~w}yxzsw|~zz}{qwzxz~z}xp}~{{{yitz}}xw{~x|xxwxs||}k}}x~y~}py||yt{z{|r}{i}zuxoz|zvzv~y~{~|v{vz}{zzxqxx}yqxz{zw}~vxuun{xy|}e}x|y}xr|}y|s}{xi{}|i|~x~lw~~{z~}{zuyxw|{zswzwwz|w~qs~{z{mwvwx{ppvv~zuky~|z}s{v{~w|u}yq~|wwst{ut{{{vwk}}w{~~~}qx|tp||w}z~y}}ju}yxs}u|r~zy}{z|op}|w|s|||u||y{t{}zs}{owx|{y{ry}u~wy}yvzx~zy~{y~{ucz|}z|wzy|wuiwy|{xy{t~~}wy{zwtt|~}wszxzzv}qwx{wft}|ywvy~ryo|v~||p~mwzvy~|twy}xy~{wuxw{qp~{}|xw}~{yyyu|vyr}yptxyuz~x{ttow~uwzwsz~v~}}m{xit{z}}z|zc~vvw}{pvu}r}~ysz{}zwzy|sqy{ud}zwrw~ox{zuqx{ezt{uw}|rXy}l|zqr~pro}|sv~wx|p~~}~hxw~pzwrwzbr{}|~{tnvxz|r|{|q|n~u}|`{}ty~n~x{w}tyv~nsxw}}smvvvyxmzzk}z}~z|s~exqqz~s|s~qz|t{mnytp|z|qupyrmwu}t|mz~tr|~w}x[x}z}v|q~||x~~uuvnrxz}r|y}|vw{vyjwn}zz~wot}|y~~vvivvqx~rps{~w~zzmj}}vkxtu{lyu}q|{z{|~}}wrm~qkznv}wz}zxw}v~}l|}odz|rzssxx}xnvurqr|~ztruut{stw|tw~|zq~~lpx{pvzvsbt{y{wt}zzzy|itomux|v~x}t~yokrt{twzz~twsyezuyx{}|ir~zpuw}}|~{wmgs~txtz|~zwwp~{~wlu|srr{~v}{zrn~jvz||uxxz|x|vo}oywu~~xzqvwos}nx}{xzy|vmvwyz}vy~yy}syxyx{}uy}jzrzxbyry}yo|}yw~y}{x{|z|}u~xuvuxwvws{|zm|{y|}uv|t}xt~{mg~yz{{x|yuqzur\||o{}zvq|y{q|xpxvzzv|q]yzzx|sxq}u|{fwzt{xq{ouyyy~k~rp|{xq{tq~r{muq{xwxw|~~|jmvzyl|qk{z~zuw~x|vyzvz}puwwwtxvvuz~tz}{}yx{zx||zzxvbv~~{z|~z{gywynfyv{{v~z~zws}}py~lp~|yzn{yt{~{|}}}|wvy~xy~~a{~||rzsp{{qkrxv}z|{~x|~{y|{zrzyv~u|}zz|||yw}|y}}ytr}{~r}{w|wzt}r~||x|||i~|}rzzw{w~~|}}~xsu{tymuzz|v}wu{y||uszx|rs{|zxpz~jvx}ux|{x~wbv~w{wuitRzs{sw||{}~{}^}y}sw}~|ww~z{~~|twq{|zjqvsyx}ar{kz}z}sz}|u|ww~w{}wzr~x{szrup~zw{|u{xy{rzw|y|c|gt~z{|r~wt{}yvw{~zxw|}txp}z}||}z~x~xx{y{m~{|yz{}~vszp{ozyu{wtv}~y{wu|y~uzv||~tsxuxkvzu|{y~{t}{w|{xx}|}qx|{tx|uuz|nwy|uw{|{~||wxxxzy|zs{z{~}~}wz{zww{yxzuynxzz|wy~u}a~wx{~v}yyr|p|{v}}yy|{q~t~{wu|w||~w~~n~{~ty{{}~z|}}~n~z~~}{y{~y|~|{vzv~x|xj~zvy~{~gz~z~|vu|qv}~}rxwyyz|~wyvz}|~~v}|s}||~{rw~{xzzu}x|qt}z}||w||ztju{znzjwtzwmmx{{}p|~xyw~|yz|yz{|ks|~~{y{Sw}x}}z{||xym{||}~sw}tv}r|yx~~|z|o{|ol~enw{{qyzyytoyv|~wq|yyx~t~ztwq}~mzv||sw|}{ssh~zz{z~}x}{xutuzp{~w|yy~|~{uz~w|vutx|ry~owz}p}dq~i~{{~}wx|yru~~hlrww|xxvlsy~|{}|}{~z\{}}|ou{z~}yo||}~|z}~trsnvt\zzxvwq}y}rsvxy~~y}k{m|z{yyzrquy~v|{vspzuqxym|{xj}xz{x{|zzwk`rzv~zw|{~vvz|t|ws|_zq|zyw~uzvy{|pntxtmwlvrz~yp~yfts{v}zdy~~toqxq}x}}u|yz~x{xxy}jt}ur{~~vu|v}szqyq~||n~}~my~~vytzu}k}{ys~Rz}~{xvozv}~}tz~t{us~zt~u|x|}r|~~z~|~zj}~~s~x~~~{{m{~lyuxyvzttxu}|s|~{}|}q{|q~~|r|}|}}vzur{ow~yxy~||z}u}n~xs|w{z|||}r}nw~x|z{|y{{w{~|sz{z|v~u~~{y|xp~~}|y{u}~|u|{n}}}|~v}xuw|}}||plw{u}x~|x~|zx{~~{zyw~|}{y|{x}x}rxv|zq~}}|}}~~w~{||z|rw}uu}|z~u~||w{s~uzz||v|{|sxn{w|wvv|{lq~~zvt~}zywzy{~|rx{z{{~~szwvtwu|}o}{z}x}}s~yq}}~y~tcyt|}|~e{||qxy|z}{sxsxty{~~jzsq{ztsyx}~}|xw}y~z~~uz{uys|Zz{|rw}yx~{wvww~|xz~r|~ywy}xz~y|y~|z|x~o}{~{|~z{}}|~wxy|||y~{vy{zzxrxzz|w~z}|}|x{w|kszxz~}v~rwz}wzuxsq~|x~^|rry}d{|w}xi~{v}~rtk{zx}|w}{syo|u~wtkz~hrzx~|zyk|jUv{vxz{|t|yx|wfm~x}{~k~}|~xt{bwtx}xx}wz~ztvpyu}}r}w~izyqx~r}zZp}ztz~~~xmrz{{sx}txwo}yxdwu{oz~k{{|}|xyvoz{{{q|{{ys~uo}~}|}uo|xy~xswyzvwl|t~}x~~}tuz}{}~_~u{u~~|x}}|zkt||{{~}v}t}yf||yx{si~}zz}swp~v{vz}mtovv|}|}~t~|||wzp~|z~~~~~}|_v}{{~~}z|zzyp}}}{xnn}z|~r|vky}}{{z~z}~~zxt{qrw{zi~~x{yt|zz{{~yswnzz}z|{yjwo~xk}w}v|}mxt~y|{|r~}xz~}|v~qqyevyzsnzr}}h|q}yywxpyb|mq|z{}m}rxv~ozos}{u~x{}~}{||w}}z}{{|zn}z}}|~|ywvvl{}wxsvzs|~{yu}{`w|qxwz}{}n{}|y}~}yx{}~uwmzz{tsw}zw}o}ow|{yt~~ywwr~l{pwtxy~}|wx}{vyywu{~x~||}v}rz{xwww}}z~uulyxqyu|xy}z{rz{zxz{xyt}svyuzy||}r}w{}yy|}x|p{|~~}}ys}n|x{rszzo}xy}uwml{v}mx~wwx{~oz}~y{|}rzz~|}yy}|tywv|}{v{|~~q{~|z~so~zz|z{{wyzyqzt~~xnwyu~yzy|z{x~Txtt|}|}k~|y}{}}qrw{m{zpu|wy{zu}w~z~zwr{zw|wyv{yyww}{u~wwwvz}{yyq~~{z~~}{|y|{}t}|uyq|}y}juxwr}|ly{~owvwwy~v~l{ws{v~~wy~|w~wmte|yd{|zv~r|~{o~y}~yw~v}u{|}yt~u{|srtv||{z~x~uww{|t}wvsm{{|zqwzw~||yt~w|Xt}x|pxvxwnyzdp|}{x|}y{u~vw}~~nw~tuzvl{w}uqr~kp~e{{z{~xz|}zz|{s|}~xqq|}z}}yzzy{q{r}n||exm~q|hzkwz~vyp{ty~wp|zu}^~x|~||vy}zl~}xxyxt{ww}xtxp}sw}{}}o}wlyyzt|{ogh|xv}|v|}tzmtz}~}pvzy{~yj{r{~h|xx~uyptx|z}ur}}zr|t}~~|u~xzwfzxrznrvxw}}|}uzvzxuuyywn|{|t}w}{hnx}yyy}y~w~}pvu~~|mgy|x~x{t~g~|{zivo|}jxywr||{twtzz}{{}}uv|~}ozqxf~zyywoxv}iu}{|yz}vufzyx~~z~rsst~q{~}pz}n}qwyu~qqw|{vsyyzu|wivw|}z}v}z}wri{|o~wt{xs{tv||||{w{w{vxtv~{~{wl~syzzyx{y~~|px|}~m}wm}w~~}|z}|{unesu{{~{~w|y{yv{oxyvttuo{sz}}wsttn{|wxpyke~}xx}z|mt~}i`|~t{z~||cz{vhxz~q}}s}~rz{{zulzw}~|}{}zys~s~|xstyv{y}y~~{xmrs{~|{tps~}mx~}yyxx|{w~{{{}~~{}tym~uy|~{zyun~y}}|znz{}|y}}u}w{}uz}{|v{y|px}~yr~~t{rysx~x|z}y{xt||z}|y{p~zyzm}{zz|tv~{{kt~su||p}qsy}qzy|x{u~{{~z}{v}~y|yt|~wz{aw}~{|uyvy|whzot{{|{rix~w}|{|{}}|yrv{{sxxq~~ww~w}i~~}zv~}|yq|tvwozx~~z|{~xp}{|jwpsx`zzxx|h~xw|}t||zzozyq|r{}yw~uz}{~~{{}~w~|z{zrzmywy|~ypuvx~rxq~xyxyzfy~txu}}znwq~zy|{~}u|ov}zy}yo~yq{{}z{}xzt{{x~{w{r|t}{tvvzs~l~~}o~o{~k~qwvxystvwyv~{{{~x~w|z|]|}}}}z|oxwrs{|v{||xqx{r}u}~|z}rpwx|rxv|||qz}|u~~|~~r~yp{~~}|~{}y}x{y|z~~~lx{~|zv}op|~u}}|t~pzuy|{{|zstm|l{y{mutz{wtxs{}zzq{}}r~}}u{xzru}vyt}{wys~vyyyq|yty{r~|}{yxiwkw{ry~sy|uwyvzs{uz}|{}|t~sx}w|}uwyqxx|x}uomzz}|xu}ux|}{yvy|v}~~y|~vxyz~|z~{u{~{|{~v}}v|t~~{}w~}v{w~{{}{vty{yjj}zyz|wxzv~vy|}}{vx{xy}z~xwwzy~x~}}tw{zyz{{x~|}z}szy~|wxu||j~~}{nwo}zx|u~t}~p|w{uzy}|uk~}}yzx}~j~{z|zo}txsu||yzx{~z~xxn}p{{~y|zxzlu}y{|}xy{v}{yy|ttu}zzlv}~}w~||yqrp}}vw{x}{wn{tu|z}mvwyry~}y|ysw~|v|xx{~y~w~zvx|t}o~}w|y}xx}}{~~yt~xuwxy~}|{z}xsoy}}s{w{{zpyl{{{jZwy|jy|~|zza~|y{tv}z{r|xxpyw~{zxxywmzo{{o~|~}xurk{ytwp~yz}uv}i{}a{|qst|z{{}||gy~s|s{~}ynxwpv{yf|ww}y}wqz|{k{~|~|vz{p}}y{z}}w}}xstv}zogm~}|}}xu}xv|yorwy{y~~xmzn}zrvv_{}y~~zx}xj}~{wyyx}{}}w}~trx{yk~y~}v`zbohX{{|y}~{x~vh}g{u}|m}{nzm}{~yts~qz{ty{~rn}z}Wyum|xu~s}|~{}|my}{~`uvyzz|z|uzwu{|}{av}m{|zr|}zo~|sl|mwX|xi~xn|{wzw}y|vky~}wswv~u}WWv}{}rz|w}}|fGvryx~~cz{|ym|}y|{n{~~s~{}z~|}yv{yxx~}y}}{r~j|~tx~ztv}{|w{dxuyz}{|{|vv}f|~~yg|zqzx}m}a|}~|ll|x}u{z|vxz|h|p~}|zsj||~xz}||}m{|t}v|{}kxp{}}}}y{vmwxX{|yd{~~q~}|~r{}w~~~{{vx~yvq}ww}y~m~o~{{v~{{}}uw~ov{oyy{}|vo|{}||x}o~sw|}y|x~uwy~|zw^}poftxd}}~~vX|||~}w{u}z~xwtp|x{zi|~{pZw{|z{}|y|^r|x{}y~|{{~{o|}zjk~}{nw~{||e{y~y|s}z|jzgqt{u{~~|~tqw|x}}z|y~|y{w~~xqjxw}gyt}|yv}~}smk|{yyqr~}zz|}o{zx~Y}xzuyqr}ui|v}{}r|{~}v{{ffkxzzrrlv{~rx~s~yuyyq{}}z~lv|z~}{}ryws{y}|~{}}y~uus|||}}~~tz~yptws{wzl}{v{|zhwzloz}~~z}j~|}tvy~{tptzu{}|{s}|}rz~z{x}|xt|~w{{~x|{~w{}}t{x|zsttu|xn}~t|{tyrvzssu|}~rs{w{r|{v{wxu|vpwt{yz{vyqxuwqz{zlw|hly~{~x}}vxhy{yo{zp|y}|y|xws|~|z}}q{{|{yz}~}o}|}{xsw~z|s|z|||{ye|{u{~}|}yy{|yk{y}||{x}}}uxy{w~|}{~hu|{yx}wxz}|rs|zxr}zn|x~z{|xyz}}}v}tzl|wyxzz~~x}xzz~~o}v}}|u{xz~v~x{{x}qfz{}xy}v{w|i{yg~xos|~xvy~xy}|ywuz|yy{{|m}|{{}wnz|zwsxuuxzzy{yz{u|xzvy}wzsywryx~}h{x}gx{}uww~w}}{|v~}}~~rwu{{u{yy~uw{|}{yl|}|{}~~vznsw{|uu~`||z|s~|p}w~n{~{xvlx||ux~|||s{sw{}yq||~}v|xwu~yhs~w~~}qz~y|w~}s|s}}y|v~~y}}~pzx}i{xwp}u}{no~q|e{yss|~z~|umu~|z}zqxxxv{x{~}{xtyw~yuy{}~z~z|v~q{}tw~{wu}yxyozsn|a|}x{z~z|xy~znyz}o{|{~xr~wqyy|zu|}~~}w~|u{}uxz}t|}~zxonxz|w{ry|x|zuys~{}~szwv|pzu|s{|z|{zz{}wy~~}}w}wwvwx|xz~{k}|lwuw}|}|ypqtzz{zzsyht|wxzr}~{w{~zzz|{jyzp|v}zuzyn{vr{uysyvzzyv{}~{t{vuvyoplyrxy{yw}xyu~}ux}{nwyq}y|w||~zpx~x~}}|~~q}izy|t{}qmp}|{zvrT{q~~{~wxfz|x~u|}|}~mw{~tzzx|y{u|~zk}xvxru{mwwu{u{w|ywz}v|zyx||rksx|x~{}zzw~zz{xusz}wzuxvtyxy}|}}vw{}wvt|owzws~z}z~~zywwy~{|x~vzv{r{x}qzyyp~vz{wt~yvvy}}{u~uzlvr{yuzyk|w|vu{z{y|{}{znr|y~~|{yv{y}~~uq{wvu|{yp}~}~}l{yz}|fmzk|v~ixv~v~yv}wyv~n{}wyz|x}u~z{|d~x{|z}ozx{zx|~v{p}vu|{y}xv~z}u|q|vwwlXq||{~~~zyx~}}~}zyl{}w{x|zo~uwn|}p}uwz|sz{~|xw~|y|xz~q}ayx{|x}~z{}{rry|~wzxy|{zox`|||~w|{~p{zu{xo|}}zv}wu|{z}y~v~z~{}xq}vx|yxr{{{|y{dvy{|||ryy|vuz~~|szsuzw|zwxzy|uw|~z~}}{}}~xzv}{z~j{}tq{}{z|y}{t{|w|~|wq~}f~||z|r{w~w~yxwo|}{|u|v|y{}x}yx}}{{zil{zz|z|{}xz|zy~wwtqytyt{|~vr}{zun{xu|||s~{~l|xy}|yk~vywv{ovzx~n~w|zszw{wvkv|t~wy}}qyt|~z~o~~|}}}xyxwxx}u|tzm|tzvxwytnvzz}w|~~x~q{xuy~z~z{x{wzxzt|{t|xuy|xx|zj{u~tyxr}txx|wyyrzx{zyuzwxwxpur|zr{y}zy{~zy~uy{~}o}|{|yvqw{y}v|xux{~v|x|w}{z{~|ztw|ss{yu{}z{~}~y}y|v}x}uyz~y|zz~zvyz|n}twww}zo|w}zuv}x~zz~z{~pn{y~~}zul~zpv|wtvy~x}}|vzzmzws~t}y{{n{ssmzxz|vv~x}ri|qt}w|u{x~sl~w~{}zz~|{{qqlzu~r|}t|{tu~xvv}yu~}|y{~~vp}z}vy}}}yz{}zw}zwxwywxz{|z|}}uzy}~{qy|}}xy{xv{y}{~z{|zyw~|zuss|{{}yz~|zzyr|~wy{~~qzy~z~{{wsw}i}{{wzm}{{~~}~vz{w~{zygw|}z{~{|zx|}~zx}~yz|~|~~~zw~xz|{sw}u|s|xvz|{~|zvwzqyx{zw~}yxq{|rx{}w}z}~|q}y~yxy~~wz|z}u{wq{{ywn||z~w~xu~u~v}~~x{~t||}y|tmyy~zw|~{xq{x|yxyy|{yvy{~~{hzwvw|uyj{zvx}mjn|y{xvRps}esyw~dhrx}yxuxqv|nvxwXz~wu{q|o|}nzqux{|g}r}qstqmcraulzzxxqyyxxzsytx~yxvh{}w}^}T|{v{{q}syr}|sw||vvhr{ryozxvr{x{zq}vvq{k`dot{wj}y|R~xvvhoyj}e}|vmwtvr~}~v|uxw{uwj{bnrvs}y}}zy}rv{rmkpovqxf|pqr}}}z}z|}mtr{`mby{yxy||vyy|vxm{zwx|uvy[|siq}ohrvqxy}kq|pwvmw||~z~f~wtywvfy^~prnxvTxprvt{u\{wxyen^s~|rm}rxzxw{x|uva}xou}mp{s|v|uX9{y}w~}{y}v~neoy{}~fw}{vxar||~}z|}{zy{zz{o|nw|||tvg~r|qx{w~|w~|w}{~~z|~|{yzhoh~t}|vyx}wo~|t}q~twxsm{||x{{t~p{|iswwxw~}wpz~y{}{|xqqwx|}u{|nvu|vyz|~x}~{}r{}goku}s||h{zv|ne{|s|u{u{w||dz|{~o|vz}z~z~w~z}z~x}z{f}~{y{y}z{wxzlx~}}x{p}}ty{~sy~}wn}v}jyru{~y|{~{}|wyw{p~z{|usxw{uz|}|x|{kzt{v~~|{urxz~r}~uzww|w}v|vyzyzur}~uy~vasxsk~wvrqy|k}r|zi|zo|y}zjxzr|}|zkz~|t}zkqw}yy~txr}{gz~^{xqq~yu{yrtr{~nvvxoyv}yytistxwwpvx{}~{~^|vzo}qku}qzp|z~{~v}ywn{wvz]s~u{p}|xpz|r|wna}}}~st{~{zv{qp|{}ktLxsww|j~{yq|ywy|r~m~y|ytrvwyziurzwu|z}vxuxwzuxt~ts|~}syud{oypzqx{|pt~bw|jvqz~k~}~xcmyywtz{yzwywz|i||z~~t~rz}{}}ibx{{|xy{ss{w~wmx}}{yz|{wr{sbg|~~ssZ|||{yt~x~{xgzyh}ys{vrjx|~xyzw}zqww||mwzyx}xzz|t|vqt}yww}tw}{z~}|xr}{}xrv|{|yw{w|x|w~y{~|z||~|wz}v|y}{z|}v|v~{~|v|v~{y~~y{y}t|ywzxp|x}|y}yyrzty{~{{iv|yrx|vyuwt{}~m~}n~tu|zzv~xs}|||{}|}zxrs~~|us}gyx~tyw}}z}|y|~oyx}{z}y{r|z}s{s|~vx}kx{x~zzw|x~v~}||z~}}{y{~vm~}}s{y~|zy{}}{uyo}x{w||yzuxvhy{|}mtxz~|zz~z{z||xvyzk~yvy{l}xwxxz{}~zv}uy{}{~ytu~umz}zi}xv{sv}awxty~w{{zz}~|[dty|{xr}{zx{xyvnxv}||zup}t|zwwn}vzqw{eyqxuywtm~}xs~ywwyzwxv{yv{{y~yov|}}~t~zu{xu~zyy~}t}vsrv|x}|xzv~|~{lsyzzvpxx}x{xz}z|yx}~v}|~xr}yyyt{~yvzuv}{jvvuxkz}zyi~zkyv|}v{vw~y}ymxx|zzpNy|r{}|}xxzv{}v~~r|v~xzz|~wj|~{t|w|~t{{yxwux|jww}wq|s}xzw}vx~zt{{z`w|zz{}|z{{}uy~zqv|svx{{{t}{}zq~s|g|qzsww|{x~x}~mx~xv~~}xrumwo{yy~z~~}qt{~qv|}|~}~}zv}~z}}zx|r~w|x|{x~xvyx|wu{}|xt|ju}qz{|ux}}|~uuy~v{syoy|ry|||wzzv{x~sros||{xx|~{{{sur|z{}{vw|~{}xs{|x}t~qwyvw|{|~|{|tu{yz~szu|yu|v|{}~w|u|}sz|xy||~|y}xz}{~{}s~xu~~~|{~}su|yp|~z}|x~owxx{zzvxv|{xv|yqxy}{yu|}ux|{}zzt|{x~z|{~w}{{wyx|m|zx{~j~~w}{{zy{wwx{zs{v||}}x{vt~z}{~~~~~w{u~ztsxz{zvqzz|z~yxqq{{sx{x~}|z}z~~tz}zs}{}xyyxy}t}~y|{z~{~~|~}zq|{|}xy}tuz|}ty}zztwzy{x}bz{wn}u}z|~}v~svvzt}zzy|zy}qw|{}}}|}v{z|wk~t||rzvxuwu{yr~u{swv||~wz}{{{}xhw~t}|{zw}tvuwp}s|{}|~z}y{}uz|wmx|]n~{~}|}yzvyx~u~}}||yz}xu}x|zuv~}~is{u}yz|zz{hf|kwo{l{zrx~}||{v{tvzzy||r{{{p}w}{~~{y{}||~}o}yv|zykwnwux}s}~y~}xsfzwu{}v}}lv|zo|{p{qr|~uz|y}toxs{xq{|xh{~}ooz~}s{~zyyoy{w|~yz{||c{yb{dy~zzy|yztyt{}}}s{zvz|~wsyywx~o~yy{zt{xt{}xvwlw{w~{j|{{{pwx}wxy}qy}z~{u~{{u|qvzz}pwqvy|{zxutsyy{r}yv}t{{|t|zyz|}}z}~zi~vtwuwv|||yxqt~wyx||{y~{{hzpv|y{ylz}zz~vu{zu||{}y{{|qt}x{wwz}uttt{xyywx{xvwy~vzx{ju}{~|}|z}wzq|~t~s{}zzrw}y}m|}wv|u~}{{}{|h}{z~iqu~~~}o~wy~~yq{{y|~ozt}vz{u}||wz~z~~ys}~}w|~y~{zw~|yw{thzv||zu}{{|xdm}~s{}|yxw~}|{~}y}kus|{wwpz|vz~v~un|~}quv|y~|z|~w}{krx|{s~zryy{pty~xpX}xlyrms|t}}t~zuz~wqz~t|wylg}}y|zt|nz}{zs~wx[vvr{y~~w|{}~yyyss~{|~|p}||wyf{xuqxzy`z}wxxv~yuox}}~y|ny|pZ~}y~tnz~}}z|to|{{|}~pz~{}yzuz{~sm|~}|~z{xw~lnv|wyz~wyw|o~y|wu~z}}u~vvkxlv}|x{t~xwwn||x{utxyx}wuv{wvxz~z|z~y}|s|mwz|{{p}k|yy~fzx{xr}~j}z}l{}y}{|~t~u}xwt|{}xixuN|~rk|xty|~}}}|v{x}lwy{}znzx|{yw~{}{y~}wyxm|tyw|xp~zyyqzxv~w}}usvzm~|yz||zxv~n~uqzvjy}x}w}{}}zyz|wzw{~~xxrxzu}~rw~|{yz|{y|{~|}{vzuyv~z||u}vumr}y|{yz{vwwu~{st~r|z|k|~wwws}t~z}~yv~}q}t{sv}ovz{uyy|u~{uzz|xq|~w~wz~tr}y}~~s|~{wyw~iut{}~r{xorz{rqyzv{|xxs{yb}nz~~}~w~wx}umr~|yzv|v||wzx|~tw~wrxur{zyx}}tzzztxzkzxuwv~r|{qv~}}|qwytx||v{j~w~x}sz~yxty{t~n{k{|}y}|{xxyy}ru~o}y~}}}~y~yz}v}n|}}w}x}|syw}jt~{{{dS{x{}~x}~o}z||x|rx~sus|lv{}|}gwt|~|t{ot~yzryz{}~}wwwy~t}xfzuozy{w||}vw||zv~}~{}|zzwwtozqwv|Z{s}{}~}u}wtyz~|~}y|y{zv|q|~fvoo|u~|xvyz}}}m|nx}}y}}zw}i}zx`}z}z|}|}|{|}xzz~yv}}~pxpny|{zw{t|{uv~{wlvt{}|wz\p|y{zrv|{s~}|zxzgy{}{|~|}}y~xsuyd~~j}|}{t{dz{}{|x|{}xz~~usjow~t}vtw~w|~xztas}stu}vvmx~y{}zuwy}w}{x}vs{}|}wv}pz}u}xxz{{u{txu{xv]{|}umsw~wsr~~{{zw}~xzpzxcuy~x}wtt{v}wy~}~~|{x{y~owtu~bwwxzr{z{|}{{w~}}t{zw}yq~pwz}w}xit|jxw~uy}}y|w}|rz|zz|z|x}{ytxy}|vwzvzuzyv}iwxk~{|o}~xvwqtr}q~|zztzyiw|}tv}wrvv}tw}{~u|{tzxyz}voq}{z|yyu}x|j{w~sztsv{xwmx}wsvvs~}{|~|yu~|r~xvw{wr|{~uyw~x}x}q~~zcvvw|r|x|yyus~{~xt}~lkuoyx}}vx{y~~z|{~|~wv}uuw{x{xr}|}{|uz|xu{u~vwulxwt{{|{y|qyz}|w{zzwypto{}t~y{{{zz~wzuht{{ru}~yyv}~}{y|t{w}w{t{r{xqyz|}rvsp}}~puz|zsywr|~s||xz|ws|}zuzlsxw{w}|}ww~{p}uwf~yvso}}xuzw{||w|vx|qvyo|}x~}|}yz}}{|~~u~~{uuz~{|e~{~z}spz|~r{y|{{}ry|{{|w|xrx{||~zntt}}{|xq|xzt~||{x~~~zt||}rn~s||~yr~y|{vw|zq{xzsxv~~|}~}}z}^~~|z|z}q~}w|~qx|s{~z{|z|{zyw{~zu~zwx{}rvz}}w~{{p{xzz{w~}v|{}|sxwz~o~z{wy{}v}{w~{|}}w~{wry~l{ly~x{rz{~|\y|x|{zy{{yutxz~y}l{}~|p~s|kw}wxzznuw}{{{~}w}{M~yzs{uzzqzv~}}~~z|}uqzuy~~wzvx{wzts~x}{yy|{|z~{p{~{~xzp}}~ozzwzq|t|z|z~x}}|~s~j|~zr{st}z}i{|z|rs}|x~xw}~v|x}xyx}tq{}uy~~|s{wv||{vu~zx{xux{{~}pe|t{r|{~yz{}~~ys{}{xyw~|{s~x}|uyw{w{y}|t{t{o~{x~{~vz}{zp{{sy~|y|zy{{|ytwf|syms}wx|yywq~{txos~zrzyzyx~yypuzy{~}{{y~svs}|x~{tzv~u~sv|y}w}}rqjl{lsxyz|}zy|yzx|npzvy{{{twy{uv{x}{}o}v~w|v}xm{|{~|v{z}{z|{zvyw|wy|zz}{~mq~|z{v}qq}a~y{{}}{|zx~u}suwsv|~z|}szyyr~wvxpsx~{||}b{}~p|g}~yr|z{y{|zy}zy~{~}~|rpxwnyxcm{vz~zoss|wwzz}xvwn~~yzyuy}|qwy}ty~}x|}kyyv|uzzy}|~{}}z}|xn|wyvpzy~~|v|}|tz}{p~z{gt}{v{|{vuzzx}}x|l{}z}yy~}{uq|}zy}w|rw|z~~|y||yywx}w~u}yxy~}w}~{vy|yxu{r~xy~yzr~||uz{}|~sylv{w|}{v{||}|}xrxw}s{s}~zpypz~{~zl{z}xv{}ol{|}p{~~x~iyyu|}r{z|xuu~wz|cyy{{txz|xyws{xw{x{~vsy~vpz{~}rxzzsw}zwvwwzwxtwsuw~~xgrulyyyvtzz~x{{y|{}syx~}{|{{x}s{zjv|x}v}{~w}xy}~xo~y}{xzx}yzwy|ry{y}vz~}p}xxu{yw~t||t~zw~t{t}zq~|q~u}t}npz|{|xy{z~w{swy||zzwr{|z~zz{{}~wo{{wzwy}{x||z}yvwy~|}yv{vxzz~tyysu~||}|mty{yy~x|y~|~q{|uyyuq{{~zt{{|w|uuys~frmuz}|}}vivwwz{z~wz}~zy|yj~}z}}zy}~|y{~{w||}zrs}v}}vxw{yuu|{z}yww|xq{sw{tn{}v~ryy|xwpzyvr}}{yz}v}wy}{r{vuw|zvwzu~~~}st|qxt{xs~~sux{w{zx|z}}qjwvu~x|s|~x||z~y|}}w~xuy}|{r}y{{}x~wnxzyq~zru|z}zj{r{zt{nzz}zw}{|wnzz~z{z}|c}x~{l}|cmzw~wq}}{qzp}wz{uyy~yxz|y}qxoqx|~}|yzxznyzwv~~~|xz}wwwu{xz}|{xsowz~x{~z|r~{}|x|}}|w|~w}|q||wu{~~y~~|{xuywx}x|ty{z}yy~zwwzyzyq}sz}}wu|uzz|fon~z{vty}wt]txq~wyj}r|s~}wzqq~{x{ryzor~rtxwyq|yuv}|vnn}~t|uyx}~}|mzy~|v{}|ux~||zvpxwrvzh}|y~q|zu}{}}yxz}}lxxi}|~~x{x{}{sxx}{ndzjyy{|z~c|z|z~{my~x~z}|vut{{zi}|{y~z}}v{{v}|~yl~wqx}|u{wv{woy{}tws{~xszl|fvvy{zz~{wo}x~|~po}}~}y||yzwyz~|}}~luz{mx~zwz||n}yzvyxr|~yxx}}}}p|~w~b~yzyvuv~||{|}vx~s~{{xnz}y}t}~}zv|}vzz{wzzswpvw~uy}v|y|~x}tz~xvzx|||}u|y~tv{wvtz{}vuyy~u}}s|y~zzxtqy{o~y}}y~yfyu}y}~|v{|z|x{nv{rfw~yz~yx~~}wy|{wzzt}|}zxoxxs|zw|zu~xuzq|y}wy{~{}zhu}|wxz||d|}~|x~}z|u{yz~|~zy{}}s|x}|~||||{n~t|f~|||s}~tz||{zu~}}{w~trw~v{||~|qfx|mx{w~}~{y}ryyy}{|v{{y|y}|~xtwozyzo~~~}v~z}~||}}|{u{yr~y{{~x~z}~zxy~||{z|~|{v||y}tq}q~qzbys|{xvvx{~q}o|}{}yszz|~yvvt}tywm{wz{|~}rx|y~lo~y~}}xt{}zmzuw{z}x{}|~w|}}}~|{}yyx}wzywz}}}|qz|uwx{|qewuu|z{}}}{}~|zv|~ryyz~}w~zvn|xw{}|vr{yzzuouy}ztxy|~t~{~wtv}o[=}|vyxko}n^un{|vz~r}}qnzxvwv|w|u~}lzx}utm}~}~`zz~|vzvnpbz{r}y{zyrx|W~}zt~||}|tu{~ztl|p~zzt}xzo{zy~mxjw~xw{snxtx}ky}t{ovuzvvkR{yvxy{z{rz]edyq}}nn|uxr|~v|wq|{p{[p}|{}}}}E}vu}y~yzx2uq|yyw{pwxtw|qr|syr|{}{s|lw}z~t}wex}zu`dtroswvjzuzit{|Xtw||z}ys~yz|{yur|yuq|w}x{vmur`y{ttp{{yukuerwr}fzxw~zYpyyxmyxwvgsqq}p~x|hz|{y|{tq{||qx~~vu}ku{}zxz}{y~l{|}|yx~u}|y~t}{}r{{~q}~wyz|vyzv{w~z}|s~yzr}~{Lz~|n|~|e~~{o{v|szt~w}oo~}nwr~|ewu{vru|vyy|~cwsyr~s}s~}~k~}z|}|q|wu|||}}|ywt|wxs|wz}{puyvz{w}{ku~iy|y}k|vy}uxx|z}}pp|zl|{v{ntx{w~u{|yx|px|{vyxzx{ozrzzyrx}tw~xyz~x{}v{sy}q|zr}w{yo~uxyu{{}yu~{xxtzx|~wq~yql~zw{{x{vh{qy~}yyzy~}|}w{Z~]|r}y|~|yx{~tv~|zkx~}y|}~vuxzv~wxw{u|~z~nxw~x{|u}|v~||yzya}cw{~p~}v|{}]x~|~tp}}r|}pz|}su}}}}u}i~|{~~jwsyiozzvz|u}{zsv}u}{xk|~{x~}z{p~p}o{|}~}~{z~cywvy||xsvn}}}~{T~yrx~pwuw}zw}zq}|iw{y|}|lvv{}wy|tz{~{}|}uvv{j||zy~squ}~|ww{}~rw|ywyx}}v~{{z~z||{~quz~}wzxy{l}}yo~sm{vywuzn}qz_{{y}x}}v||rp|l{|xsjrxz}~z~ppoox}xt{y{y}~nhx{}~wy_~oW~xvwvn|~s~ir~uyw[uf}z{wu|zu}yxsr}swu{wu\x|}|}skjb~szy{nrrn|~z|z{s{t|vg|qu~vyW|{ywvzzy{xurk|v{vy|qǁfv{rko~|px}{vt~s^~{|mpwmx|wxKuh}xsovlxjt{|jtuslj{b{|s|wzznvwggx}k{z~x_uyxytw~zmyv}vl|r}utyu|zryu}ȃ~wzvvwz}d{ws}oz{ymwy{zt|zj~w|utc|}uztl||X{qu|ltsm{y}|w~~vxU}wzy}j~y|peryc|{tmxdhxvnt|g{}vx{nzWu[pvver|vlytyu~{~towx{{|}|rvxs|z}y~||pww}u|~|}||xw{t|{k~zxy}{xyuz|y{{~t{ziu|~|yu|z}~~vz{y{}}}{{z~~~tyxx|sxy{~{zw{y~yq~y|y{swy||~|~~~~y~qyxzvtvy{~|~{l}{u{p{|~~n{ynzz{v}{~~ytv|wys|mwus{z{vv~wzzzw{uvzs~zz}~vr|{|wtww{mz~zx~yx{}}sxz|myusy~{||xx{}}vu|z~~x|zv~}~{}{}~{}{|~g||w~~vy{~|sxv~|~ryu|~rry|yxxz||m~~ay|~zw|s||}}vw|l}}wq{|y}uxu|T~y|fyxt~~yy}|svy|q|y}yo|yx{x|wysy~sxu~}x}zw|sz||xuzy|vzs||v]u~{ov{wr}vzzzx{|h{vqzw}q|x}wxxpv~l|rv}Tk}yzyoqusoa}{~mx~~}zy{||juwtz~k{s{t{~z~_zuw~ywx~h|n|{q||{|z}szvvjjzv~{{|wvyq||x~k|{|}sw|~qvp~u}sy~}}y}tvlvxtwu}y||vzq~zu~_yZ{zxzktv~}o{yx|y}pxux~}xyzk{x{vz{uxwztyr~px{jls{v{o{pyz}wiu{{v~txwn~v{rvzsz|{{vvz\wkp~xw}szt|no{zqynmy}yxz|}y~{{{qwvpx~sw}|ty{~yxzqtwvzvy|l~|z~ldl|{ovy|ztyj~ezzh~{vztm{s|{opt~z~y}}sq{zyt|ez~vzyxytmz}vowzysvyw~wzymo}u{{~|~ysvxxwp}~~ttzuyyipxufrw|v~|z{{w|Tvz}~y{qxq||r}|kt}|{u}vvxxw|x|yw|~{vnrzZyw|}y}yu~~liy~q|{|~~jr|ym}xz~x||zr~x{}z~wuzxzxy||x~}xtwypyvz]lz}rswzzb|o|zxz{n}|~{mstyzvwu~zxx_~{Ryukpx|~|~yjqz~ozp|yz]ryvvx}ydx|{~{]v{prx}z|~xwvrs~n}o|nz|{z{{~}v|{x||~u}{x|w~zuxxzg{yqy}lyxsl{~{s{y~|}|}{}zw}~nww~}{z}y|v}{wzu~x~m~zy|z|wy}s~x}s|sun}wwxz{uyqzxzzw|w{zz{vor}}{x|vys~~rt|y{{c|}tx}~uwx}}xyyuh{}wo}}~w}|{kox{x}~|yxy{p{~uy~pqyw}x}vz{wyt~yw|k~qy~y|}zw|u}ytwoxxty}suzyz~y~}||uy~xu}zx}}y~r~ya|s|zp~{w{{o~s}~w}~s{wyswpvz}tys}surpux{~x~y}{yzhvmnup}|{x}yx~{{}wy}{s~m{owzz_uzuwx~s}ry|q}yx}{{y{{}s~pt~vo}}zxy~zzz|xz~zu}~wncwj}~|x}z{~}z{hf||l~u~}z~w~~y}xyyyr}u~uuytu{|{rz}{|uz|yl}}xw|c{~sq|}wx{{}~~|}vy~yyv|vswux~{u~{yzsvf{~wy~}y{z~v{y}|{dwppk|}y{}znr}~}|{}~~}vjf~v{~{|w|zllz{}g}z{~x{y}zy{|wdhy{~z~xn~zxd}{t~{vzyti|{||yt}~jw{xozfv}zZma|}wx~x{lq~u{kh}y`}~|}www}}yyyvl{ynw|}|nx~|ux|o}x|{to{u_|r{x||v~zozxwvrztz}}qy~||}|yau}~~o~xsjtw~~pp|}{w|px{w|}{~|y~}}|~hqn~y{~wyzyrvnq~wy}gvz|spxy~{ow|v{{{~~ox{~~wzhqey{wuz}k{gwx}{{|}~z~ys{{}|ztz|~{ja~|~}yetyhvuw{~z{vl}|s|}f{zhs~yx||k||q{z{y{x~twk}{q|s|}y~}xzNxxxt}}q}}t|r~{z}y||y{m~{vp}s}{yy}ysvskq}x|yz}{~}zyls|{x|~|vtjx{vx~t}}}{|y}u~r~wsx|o|vz}|}s{{|xwxs}p}yq{yn~|}w~xw|}lyzlt}~|}}xzpj|y{z|h{~}smsvxoy^}~|}~z~}[wea}|}|x}R|}ju}vvuu{xp|}|pyl|}z}}|nr}|}~qp~uyx{~qypz|{}}|zzw~wx}|zav}~~~}{|{}x}tyuy}}}}xp}~ktxzr~sv|{~||uy~v}|x}}iy~yq~wc}|~t{z{yyzt}|}yu~}zy}{{x~~~|~pwz~~x~{oyyv}~r}~om|xy}xsiqz{{|y|}zpi|w}uy|y{yx~tz|z|ys{{|~|yw|}u||yzjxzy}~{}se}un|~z}}vzzzryxzz|c}{{rsh}{s~|t{|{jz~|y}{~|s{}~mx|}zzxx|vt}{}||nyxqw~}zpy~{}~}~wumw|wmsf~|zsdsuxyyqkWf}}zr}nzywwt{vz}sxu{w|~pv|yygpyxxxz|}{|v}ck{uzza~vu}qvn{{}{xs||or}}pnt}xz~yv}xzuzz|xryzr}oy{yz~|w|u|y~xyrs|z~}x}v}n~lyw{|{|c~|uzoy|xxwjujwquvttzxy||{y|y~rzwtnw|p}j}|{}wi}tzy{v~vm|{njhxxywtvxxp~{zx{}s~hp~vt{svwqx}}qpcxwx{p{xyctyxzz~vsz|q~}vzzkqzvgz}ip~qzzrkn|rt}p{zt|xxj~|xx|q}|x{vxkbvy`xm}{z|{xr~sd{{|m~|{}zxywzy}zzyi|k~w~~}o~|x}vgy}pe~}u|}ya~i{zzn|}ty|}}||ysz~qrv}z|}|y}yl}~}zv}{qp|{hyu}{}v{~}~}a~|vw}zwzty}x~xx~{{x}|ozx~|{y{w|xlh~q~t{|l{|}tgu}u|{y~w~}|vz~z}~}}~{~}~y{x|{}|||uzxqymrr~ty|}|{v{j~zm{rm{}}pzd~zv{}}~r{y|x~h~~qsuwb}~}uyq}dj{}w}sxry~o}x~}nuk|ywxwz}yrk}w{yiz~}{x~|~n|||muyrz{w}{~w{y~{|xj}~wnqz{sj}~zt~r{zt}xjyz|~z{q}rb}{zs}xu~}sxzxvwy}n|zxyz}syuzy~~o||x~vz|w|}tx}z~s{{}yyz~~|{rz~}u}|z}wzy~z|ws}wu}zs}s~lzx{uy|wzn~vtyrvw|t{o}|{|wz~vxyux~{rx|to}}{yxz}y}{u~xp|wwt~y~tst}yw{z|u}x}z~y}}|ws|w{u{wwnu|~{z|{q}~ww|}{uy~wyy|xzy}}zz}||z~|y~yqrux{y{}}}vzzy~}myw}~sx~|zy~o{wzpy}~t~|~|x|quxnv{nzt}yx~yt~xwy{}xZq}z}wr}{vy{}rr~|szwzwxx|gkwu|tqpw}}qszwy|~vzw|}}~}vx|~}}t{{zx|yywm~nw}{z|x|z{}}x}zyy|z~}zvxz{rx|yyyt{l||yzs||{|zx|zz|{x{{t}t~|p~{|z|y~~~h~zy}vwrp}xx}z}vty}}~x~xr{~{yz|xyzry}z}|wwhwryr}ux}}zxynw}{{wvyx{zzx}zrxy|yqv|xw}|y{{z|p~|z~~~vs}y|~~y}}jx{~~}zxzxz|{}o{}j{zx}yvv~~}wzrzy|xxmw}xt|{~zyzz~r{zpy~xy~w~zzy{|{zvuwlruwtwy|t|y~yz}m{t|{{v~oz}quzwvuwzfyuzu|z{wunw|w~vlz{|x~s~|x{||xwvz{}t~}r|x~wx~y{|P{}vyk}}{{{y{yn}z~|x~{}js{|{s|{f}}z~}xpw{wgyxj~~{}z|gi{}~}x~n|z~zyzT|yq{~~xz}}rl|~z{z~w}z~ws}}|j{v~{z~~q{twrmty|o|w}zx~uz}zyxzyxw}|~~z~zo~~xo|x|{||t~}w|yhh{{s~P{|~|xs~z~~~i~{y|}uzvw}y}yp~|zx~}nYy|xwz~y}z|~uavw{xztyxxyulp{qzls}y|~zyy~~rqww}|hzu|~~y~z^~{j}ww~vv|~w|ttbx|yrzx|vy|~y|z~x|dwyuxwq~|u{zxjux|y}{{~{~{~yw{r{x|wy~z}uwv|~|yvx|k|w~y~~r|}vr{u~yq{vyr~~y~l{wv}r~y|~x}}z|~~|w~}~|p~|{zy|}w|s}{xgot}yx~u~ztx~w~{jx}svw|vyt~}v}|u{s~z||w~}}v~wpxtt~}wy|ldn{rizvx{wyyws}}xt~~vz}zzz|zhw{oz~xwnuy|{vx}}|}wzw}xz~~|nv}|x~{v~xwu~}wuzyyvugzv{{yw}t~w{xzt|}}ytj~x~lp{Pww}zvj}xt|{yrpp~~vnfhxosv{x{nzy|tjvkzlt{hr~fr}~ywhxz{|}vxt{~yuzmzvzyzay~ut{zpn{~sey~xzw|}slybp~xpmi{skycwu{n|{ujyi{x~yz~x{~zuq}g}uo~qmv{tvr}{z|tfm~~zzxszy{|zywu{|xzxn{juzxwv~zy|~y~rwp{xvw}wz|}x{{||sm|~zt~t{wu||m}kyv~{m{pperzyv~}ruvzxj}rzwqtzynQqiyJ|}}tz|{rx|rzy|m}~|us|~nndr|~mezvgwp|~x{}uyy}~x|oqt~vo}vxwruwywnmx^{v{|yw}z|py}~|k{~{ty~||zs{z|t{v}zt{}|wxsz}~z{{{~u|r|~|}{~~{p}x~y{n{}y~{~~xw~|vv}x~sy{{{|xwz~rz~}wdv|ux}|y~~x{|s{~~}y}~|ypy|~~{xx}}}{}~}w~~{~y}w|tx{{|~z|ytvx|~~{r|{{}|||q|}v~{{y{|{|{w{x|y~{uy}{zvs}v{r~z~wu~|w}xvpzytvm{|v{}~v|||~|}~{x~wz{{t~t~}}~{z}x{x||~~z||}s{z~}x~{zstyq{~xvx~|rtzwvfs||~z{~z{|}z|vz|yz~}}o{{w|~~z{yy~||z|rwz|{y|w{y}o~dzur|uxx{szv}ytsx|v|uv{q}oxumxp}wy~z{w{vru}|rz{{zvx}zYz~|yv{gx{tts{vyovyyw|~xvzp|}u|~u}~l}|xuu}sv~}yz~Swzoyw~}m|z~ryuv}w}d{~}p^|z}txyowmyzxnjvvs|y|r~xvRotxrk~zh|{x{{|{n||z{~z~{}tmtzrs{tvx}|~s~uy{yzx}z}l{|yy{|~~vww{{r}xm}vi|~}~pooz}zz|o}z|snxsmyszvs}w}vsv|yyl|{~zuzzzgm~r~~|j~zh}wz~vs~wyzyjwzq||~}yq|~z{~||tquy~qz{p}q|}{f}ez{z}{|ww}{}|t|x}~_}rxr|t~~~zkj|wzwq|hxn|izpz}wsr{}}}z{|}vroyzz|~}q{|z}t~~}{}~zzvxzy~}yzyzmzwr{nmS{z{|{~|r}vsx{q{hy}lx}wmxifzxwqwvz{d~l~o}yzz}y~z{yp||{wxw}zztws{srhx{c~y}~x~}m}~w{xstyz{z}|ws}~}h~u{xwwoxrzuzv~syyqnx{xx{mx}zw|tuvx|{{uz|~}twz}uo}x{pwuypvigxyuuvx}r{}}~vx}~yt~zlsx{}y}z}zt|r|wl|xyU|zx{yzx||}yw}xz}u}uxr}j}~t||x}}ovc~ttwk{}|zo~zx{}o{}z|xolymzr|sm~t{z~uy|qz{x}}luxxruq~}}oxx}}ysqcy}~t~k{}ro||x~yvux|u|~x|p|w~wzzyx}{}zz}pwyp{{vyz|yts}~}~~|x{|z}|z{q{yq|wstv}}o~ty~zyzqz~~{x|xzs|tuuw{~p{~y~sy{}{~||~wqy~}z}u~|}}yntylz}}|~~|yvwynzx|o}zoxyrv}zxxwmrz{}syvzxpts{yyorz}zuz}r|zxs~}rzp~~zx~z}wupt}uv|uswx{u|}}{gsi}{m|{|wq}}u}|{~zu{x}|y{gxr|||t{gz}~xzwzsvw|zw|zwjntp~u|yyr|}zynryr~u|ytv{|{u|{yy{|vy{s|w~wx}{}{r{wvz{zx{zyp~|{pu~{|xps}}oww~yw}}~yzhy}{h|z}}x~{|zzv}xv}z}|}p~swyv{w{{~vvwzsv}{|td~|w{vxxy~yx~zh|~m~wq{y}zz{s{~t}{tsty}|yxkxv}u}}{x}wv~qp}wwx|zqyzm|zy~|w}{|zuywtxwza{|w|uyj~yvq{y}|z{x|u}xzrxozvny|z{vzty~~ntyzn{lsfy}}~}|y~|r}rt~}{wiyz~{}~u|~{n}|~vy~~{~}y||}}quvx|wi|tx}|xuyqs~v{qyx|zy||{{zz|zuwwr~l|sy~m}zz~|u}}oxqx}w|~zynq{|{st{zv}t}rjv{|v|vv|qw|yy}{zntov{t{zz~w{yww~szxr}z~vzx|x~{v}~}xynx~px|k}zx|~||pz~twuxmt|u~ywu~w}xt~~~v}~{ywu|{wy~k{xy{{|}w{v~|}}zw~z|t{uyju~t~w}q{}y{|}~sv|}yyy{{}}}yux}v{tuzx~{pu~ws~yz|zs~pxs}vwpz~|~z|v~v{vwv{w{~zzqt}wm}}z|z}}s{ym{tvwvxx}v}rql{x{}yizw~{~}zi}}||xw}zwyz}~w{u}{ztr}y|wzy~t}}z||zvxgn{luzz}~}~xnx|u|_vlxwz|{~x}l~~vwtyy}m|u{{|s{|{w{~z~avzu~t{s}nun~{~|~y||}yv||ww}zz}lu}~|~}~y|vzz{~}tqwg{~rxw|}n~z|y|z{z~x~}||}|vz~{py~{|y{{vqz{ptytn|~|y{|{{oxxlz}|}||uh}}sxzyyz{uyz~|}tz~m{uqt|zy{m|z|uy}lX}xryrr}{}uxs}{s{xm~z{}m~t}~q~|v{zzx~y}yx~|h}|p{}}yvzqlyzywn~jusn~|xi~r~y\z}uzx{wzlzs}{r~|zxss}~~yyz|o}vyvwup|}ozu||osznt|{z{v~}{uyx~j~}x}~}|zy{{~qxyx~|~t{~~{{qzsp{ww}~~~v{ux}ou~|os|}}z|vu~~sy~xx{|szWywwx}~||{{~qyuzytyzw{}}y~vxy~}ptwu{vry{~}}}ps{yxqyt{}|yxv~~}xx~xy}{vz}x{w}pxm|}}y|z|o]in~iy|{~r{|xsvy}}{o|~}on}{~{y~~{p|msyv{}{~u{z|svdwoyyq}tf|zs}{tw~~t}t|x~trpz}}tlw~~szms|v~tz~~hy}w|t||xw|}|~|uvqg~zwzr~sn{}w|vz~z|}|y}y|rz|gxlz{n{x~qo|sz|q}~|}~|r~||q|b}s}t{~{u~g}~v{`s~q~|uls}orz{z~~~}wp|||~|}w|pn~~l{gytvx}s|{y~rx|x{zv}{}~}~e{|}{|||z}zul||l}~|{~|}y~zx}|f~z~j|}}tovtethnv}{v|{~q{m{|}}{`tm~|}{j{|z|zk|}y~{u~|vj}o{{|~ztz|{t}q~~y~j~~{}{wwvx~xfzy}~rz}e}~t{~}~{{{nav~py~}syl}|o}ysp{u|zz{s{}{n|vy|x{}zy{pu~k{~typ{wuk|~~t{wz}|v~uozz}omyxx}{c|||u|kq}swmyykyzs~v~~r|z~}vn{{{~~|zvw~zv~yu}zy}x~~{ov|zwy{}s|v{nzum~{u{ww~{t{~~{~s}yn{y~{{}z{}zyls|sy{{{}zzz}x~vz~|y|sv|q|~~{|{y{{{~|}xvzp}|~m{t}z|~w|w{|~|{~}|l~y}}~zmwwzu}}zy~|z~yk|~yw||~z|}|~z}|q|{q}wt}yx~z|}~zy|}||xz}szwx}sslwjt~u|y{ux|}ssz}{xv{{~~}xpy~~}{w~wysvzw|xwny{|wzy}|w|{|yys|zz~vwzw}zw}z{x|{{wzx|yzzlx{||~ws||y~|t~}s{u|~|w~ztwtxxoyz~y~|}puz~}{zn{towcq}yuv~}z~ox~tt}ro|z~y{}z}u~xw|w~{}uz~{x{|w~{z~xqsymyn}}{}}r|v{{~vy{s~}|rv{|{uz|v{yqy~ywlzj~v}y{|~zuzm|~{zz~~}}~w}{xxy{z~syy|so{}~~u}~}{}`zyxy~z{}{~p||ry~|~}x~wm{wy}uq}}|w{~nyn|rx}~uy~q}op~}o~{q}z|o~{zyv}~x{xx{~}}w}y{uy{v{x|~}}s~{y{l~{w{xv~v{~x{|~yzvvx~{wx~z{sx{yyy~q{r}}oq}{xy~|vw~z}~|oxrq|gvzzs|u{xev~wmhs~wrxrjryvoyz|vs}}lryxszz|w|uwv{ivwszypywy}yytu~~vnv~{zz}zyuz}jz}xw{}o}xzip}}rrwz{n~w}x~y|}rrzzxvk|pv|zt{z{|yk}wyv||tztrq~zvz|r{c}zuc~ay}~uz~|m}{~rmsz|pz~v{tk~vw|q~u~vwovvs|x~|~{ocwzho~gxww{~}{xzGwzv~wwtot}zy}|jrvzzt|wrcy|x{}xyz}noqzy~xgw}{t}xt}|||v~u_~y{pznryu{~qzwx|z}}}}{hmq~|q}u~wi{wbzrs|x{}wyrqx|zo}ixyzqr|xvxzx|xv~s}~||wzq{~v|w~|u}|xy~zzx{f|rzx}{}y|x}{}}|{yzw|t{q~ur~yqp|ty~|}}yzw{{}{z{hx}mr~sty{t~}wzwy}xqy{~}~x|ypzvz|uzwz~xx{wv{~z}~utx}wy{{y}~{vq~|q~{vyp}vx{}x~wz~~v~w|x|_z~xhs}y|}|y~{v~||~~}w~o|{{suzy~x{}x|zyt{{yzy~}rwq}txv}||e|zky{r}ut}~}}}wxxwz~xzw{tyxo{u{|ryvr~ww|ov}|q~~wz|{xs{~~ywzrqz|~z~|sqtux~vyvu~p{||vw}}}rv~z~|zu{}y}xu|ur}muyqy]zsvsv~|}w}~y{vt~{qvq{xqw~{rzy~vtz}{uyxlw{{}e}t~~|nm~rtzt{~zy~y|xt|~z|yw}yv{~v{pl{vx|yzyx{x~}xzl{yu}tsx{v{zdwx|utu|~o~r{~w}~||~y|p~xz|~z{qvv~}xviyxx}l}x~|u}}st}~ky|vxnlzzy~xq|tvwr|~}w}zzz~}r~~~yh~z~zyq~z`zv~~zxx||~|xouy|w}r{~}|wojt}v||z}twrvzzt{xyzyyx}rvyvz}}qyrw}wsz|z}zxt~{yyxzzw{wq|o~zuw{x|}|py{t|||~yw}|~ri}n|o{|yw}|yqr{{~vtry}~~yz~|~}z~~{yyzszs}{tu}z|xu||z{xy~{xz~|yzgvkzrwwxxw}z}~rtzys|ry}{x{|yy}xvtvxmvx|{{`wzz{vr{}yuxi~wv|~|zl~uz~uzuwwz{|x}v|swyxzn{~qm{u|xz{~vx~vtrzysu\ytz|{lp~wwv{iy~z}lsz|yz{}{xywtr{nw}w{qlx~tusv~{y}t{{wo{z{{{wxy{yz|ri~|uT}s}t|}ryx{{upwzr{{zsnzwyvxw|~rxrxyr|vyuw|{wz|xwnylu}y}wXtw{y}z{cr}}{~zt}{|uuuu~vw|{t~xyvu|luww{|v{p|w[y|~x|uuqz|~|zsuzz{~|}{z}x}x||}~z|v|z{yyx}}x~|zv{z|zyyr}||yyswtx|}wz~|~z}|{z~qzzy~|~{|w}~{|{{|{z~z}}|u|~rwr~w}{~y{qwu}|wsr~svy}}}|w|~||{}w}|nx{~y|~~x|z{{w|~zz~{}w~}ozxxy|{~wu}{xzztwz~w|}}|vw}u||y{|uwy~xlw{xz}x{~~~w{~||~||||z}~x~|uy~w~yz{~{{|~~|y}||{}~z{{~t|}u{z|{q{z}{w||vw~~yzt~sy~n~}~{~~{~|y}}x~p|rz}zyz~}wy}{x~y|{|}|~x}|{xw}~vzvz~yt|yoxw{xyzr|||~bv{qt}|}|~~ywty~x~n|z~}~qw}~rq|}x}xL_uxxzxylo~xszpz|~w{~u{{wy{|xrw}r}{{~zuor{vyx~{x}y~yz{}u|}~|zqw{{|rnyy}yy|{us|~{tsyyoly||}zozx}}s~|y{xy{xxqyy|vv}}~z}wxzzr~~yz}}~zy{{w{zs~|{~yy}sjoxy{wi}s~|u{}r}z{z~}x~v}}tw{~{{q~wzq||{z|{|z|}~zyux{{}~x||{zwt}{vty{{q~~~{{{vud{xz|sqr~||}vyyznz}{yt|}~zwhxx}vs~|zvz~~||zyqmvwzn|s{|}~~~~{~n{uuuow{~pur|}yvkxuox~u}zr~wxryqd|~{|~r{~xt{jk|vvv}~{~zori}jnn}xw{m||~{yuux{vz{niqz~s{tz~y~|yyr{}zz}~q|r~z~~y|nlx~}h}}|~~y|n|~z{y~zx}|~vt~{t|yzxz}}{|wm~vx|xzi}ys~}uzw}|}wtvr}}y{yrhutoz{q|u}v|}xxs{{yx}}{y}l{~fyy{z~jrym}}~ytzwzu^~y|rw}|y}w~p{yzzz}kx~m|z||ssx{wyuqw{{r}{r|mxu|y}z}s~~|}{{{x~~v~u}v}{z}x|vo|z}y{}t}yzv|y|~v|~|vtx{z{v{x~uvt}|x|yx~tv~zi}||]}rrxwe|yt~||yvvzxkx}|~{yxrz|x~r|s~yyz}~|ywzyzz}utpxvh{uy~}uy|w}nr|{~v~uwrl{vz|}~xx{}xy~{}}~}zz}~q~yrxu~~qy}{z|xsyw|n}~|{|{|~s}wy|v{y~x~~wqrys}~}}}~z~yy}ww~z|u~wyuxvf}|n{iz{~{s|v}xz{}{uz~w~{y~~}|~{yuw}|}|vwl|v~zyz~}vx~}|z||{{xlzu}xxz{{zy}u|}|z{xz~uyyyyxfw~{}z}|~|~}|~{u~ty}vrzty{xtvnMn~sxzziry|t~zvzvc|ypuxmwv}qt{wwvo{z}wzz{xvosw}~xt~t|wnwx|z~lus{v{x|jztov{z{~u~~{zi}oz~u{jvh~|||~ozy}|uyzzwqw}y~u{y}{urq|qszx|rwy}~}tzu~~rqz|v~w~;~yyu|zqyxwp}sv~yu|u}w{t|uw{kzzzuw~t|sxuz{rx{|yzPwvo~~wy}txx~{xr}ty|~|yzvzs~}}`yxxyu}wxu|_aw~{pZxpyro|g~z|~{{vuuyu}ju}mwyhxrp|zyv|rm|xvhsw{}qxQxtyqzx~xo_qy{q|~xms}ywyxokux|v|~{o|w}s|xxg|{s~}zx{|yz{z~z~yxvn~~u|r}xz~|wr}||xv|vrux{{{{zy||{w|z{|v{{|{vypvyzy{{s}{{u|yx~{v~~{xw|z~~|~~~|wzx}}{~}qstu{|fpr}xy}~yqvwwvz~y{wy~x||w{}x{vv{~{oz|zz~zzv|vz}w~upuzyy~~wx~v}vx|~uyt{xzw{zju{r~q}n{z|}|}vvzs~t{v}v~vz{|ey{|}z}uv|}rs~yuuzryzs}|rtyyv|yvx~tyz||}~|{yttz|yo|wo}h}~y}~~~|xqrx}|zv}{ywxxzxxzy|t|tw{vq|~x~y|||{q~yu|z{~r|rxql}s|nxw{q|x}v}zbhzv}o|pv|{tjzi}{x|}}zr}u{zu{zstx|||wsv|{~r~z|ysus}ywwl|xyu{uyn|w}}|}t~xzzoxt}xsz}tvxtx{zww}|}~yvwzyxzv}xt}y|yxvxn{yzm~h~`u{{t~y}x~uv}t{}{ypj~xt~{y{}{{yx}w}{{w|y{tns{~vvshyz{w{Mx{x}}t{x{~~yuvzpx}vv~zzzsw{nrr|{|zv{zp}}}p{z}|{g}y|jsx}Psuv~t}z{~szsxt|gp|}p}s{{~ul~v|xnp~wlu{v|z{{tpx{{z|~{yh{rz~}~{{{o|tx~qu}|w|}~}uzq~|z|v}}u}}}~}vywdr}}~k}}}rzl}tp{|{iszu~vywxk|wuxxpyx{xuv{|thy{os|{mutqxx|y}{|{xu{}vzzz}}zx}w}}x~zt`l|{x}}~|~u}w|w~u~wcu|u}}gj~lxx}}tx}ux|~pz~z~wyoxyz~w{z~~p{}|q{|xylt}tz~~|~{{~sy}u~rux}xz|vq{q}y|rxo}s}}tpwo}{hs~y~|}o{{~lzyu~}yzyy~{yxvoqkx~~||zxw}p}w}s}u|yuwv}yxtzyquk~zyyy|t|}x|}{h~~y{zp|urn~t{w{|o{sv{ztl~}xt~iy{yu|}jywrp|xvuzw}{nzvy~~||r|v}|s}mw{wyyuoy}w}|y|yzx{swy|}wy|u{v|~|yw{xw~|zz}}wz~{n}~zw{syvzyuv}|v{w{x~tc{{~xj}w}}xyn|y}xs}w||uzwf}}{t}{{~ys~|yyk|r}}wzzywvy~syoyrvwvyyypux|utu~}zv}~|yvr|wxpzvz|t{v~{u{~fqwz}{~~pv~xwtu}fxtw}ut{vvw~|~~~lywowyqwx~}yltyz~~z|z}{t|vwwqs{o{xzu|sztz|vz~u}||ww|ju}zu{sz~~y|u||}z}s{{{yux{vuv{~uz|~nt{{tzrz{|}y{}rwx{tw{yqxrm|}~y~|||{wqq~{{z{rx|}}w}}}zv^w~zvw~x~}h|{~z}\~zyz~y~~{~}xzz~p|{{suxy~~syyx|wx}}}zzv||zyz~}u|~|}w{uvx}v}vq}zz|z~}wx~|{s{zux}u}|}wt~zw{y~{|~z~~u|~x~z~{{}|~vt{xwy|x}{x~v~xkvzx~}~zxsw{y{vo}|s|fwu{~v}|yx|}x~{x|{~z||~~mtv{~|}~|wsvpu|}z}i~|n{y|{x||w|qr|~||~qy{~|hp{}|zynY}}}|rzq}\}}w{x}}~|{}r~k{yz|syz~p}{yzzm~}|mz|n~~x}_wzyo}{}y}~m~z}tlrzs~|y|xwz|y~yz{|t|s|}x~u|kqz|{rg}s}{}~~{~~}m}z~|z~~z{{}n~}|z~~}r}}}}tzqq}|wy}q}|~e}}{p}p~|{wx{|w~}{|nzxz|sxrhy}~}|v~xz~|}}ikzb~w}~}{{||}zm}v}u~xz}qzq}|~|u{~~~]p}n~tk~n}w{}}~}{{wy|~yvzyv{tz~x|||qky}z{~~t|ryu||l{w}z{y{w~|}{~~k~z}i|~{~z}o|z~}yzo}|yryuxuv||zv|y{|w|z||zv{{st}s}}{|w}{x~}}x~yr}|}|~{z}x{y{~w~{wzxcucm}{{{y}|{o{~u~~y~~oyxs~uu~|]~{rr{yyzu|z~o~xyt~|zw|w~|r{z{z|z}~|~u}uw{{unqtz|x~xy~w~~tvzzz~zuy~}w|yxv~uys~u}~|zt{{~yvx|j{}~x|{|st}}}}{uxvxuuvwzy{u}{{{xl{~|{o}z}vlx|}yv}w}{pwyuq~{y{{~t}y~z{{ytw{{}ss{r}udzpzx|u}s|xzs}{utzz~}}xvpy}~~qys]ytz{qry|}}spl}yw~{}}vs{zyt~}y}wv{zzzv|~w}}}uz~tw{su~}yyrpuozt~|y|~zywuz}xv{|~uqzx~y{vqmyy~yp~}xfv{w{~zp{ni|}|vw~}xlyn|xjz}~|x{sy}{p~}opxo{x|ys{yx{z}uw{|}uq}r||z{nlvi^pxxt_z{|{wto~zkk{lszs|sxsx~rX{qyuqy}Wnztfdqo{wl{{xuw{ql|mjw{}tuzxzt[yy}wx|r{{nvvr~y}}}}mwz}xv~zysxx~zsr~|w|v|hp|sx|qjpwo}|g~xx~upz~szpry}zs{xjz||v}zqv||xx{~lp{}|{vwoz}~yspun{{urkv{Owsht{w}j~s~}wrvqz~qtzw~Zo{|xt|yzywgv|}p|wzw{|~x|}m}}~uj~y|xy|zt}x{{}zx~xnxt|nuz}{|~s{~{xy~{xr~}zx~~~~v|yx|{sx}kv}}~owtv~jx~}u}~~ryzywxywy|~zvx|{uxz|gov}vz}w{uwytvx|xuowwzwzxu}}{lyyo|}|}~u}{x}oywx}{sur|}f{xu}{v|x{uzw{zli~{}}{~}ooq{}~~v}ztx}|sw~xxuszurz|{u}{z{z}ssk~nnz{}{x{~~||szzt{z~xp|~}}ncvtrs|n||~|w}xzu}z{yxxttu}{vy|r}mxwzzzvw~oz{z~z}|w{q|x|x||{t~z}}{}y}~}rt~xo~}}{~~|}v}||~{~z|}a}fvn~}}y||xxzw{v|tw~z~~}|y{vkzhz~}|z}y}}v~swz{z}yyw~~vzx~vwzw|wyzw}t{}ywwxy}{~u}x{zy|trw{~ukur||m~~|ut~}zywy{q|~~~}~yx~w{|{zt~}x|{v~|u|u}m}x}hz~~yzz~ytz{fx}ux{}wyvyw}s~{~kx~yzxrq|}~t{n|u{~~}{p{{|~w~w~x{tryz}xzx~|xyyzv}q~zy}sv{||~{{w}~qzz~wvrx}yz~{|zswzx~z~xzyywzupty~~wvnjoxsx}v}x~}ywxywrxru{w}zw}}w}zv}xwwqzt{|}w{~~zy}zu}~}{~y~u}rq}|zss}}xf~y}|zu}yww~`y}ljy|{zy~w|}zyxtrvr|~o{}]{yxklr\a{V}v}qz|}|{j|eszt~}yg~ps{xn~vu{p{iqu|tszu~~x|{z|}}}zt{}y|~p{vzXh}trnXmqyo|~}~`|qz}wo{vnxx{ru}xz|}}~v|~mp~}}}}luuzzy}[wv~wvr{}qv~lq}p~{ux~~vt~}{yo{eyzwz|yix|yyy{vxz~u|wtysu|t|}z~{{yhtly^}xz}}}x}pzx~t{z}zurzztsyy}yyl}|r|l{xs]]~}zptvv}||{sv}t{vt~yzvj|}~ztzqx}}}}xhxe}wyp|sxu{|zx}}~y{x[u|mwx~}|j{b{k~~t|j|}{|}oy}t{|yn}vzyp~s|sz~{wx}~yo|~{|~y{}zy{|vc|s{y}}q}m|~{~}}{v}yy}{{}}|{|~nq}q}r{v|}{v{ypzu}y{oxy{}s{}v}a|wztz}r~vw{}|v{nw}}|y|u}yzn~||{}}k}q{}}w~m}z}{z}x}}y|~~s}~r]vus}s{h|o`u~{x~|z~|j}oso}z|lv|~xx~~{t|}w~}x~ztz{~plyjs}~i~nzt{s~{{}z~xwx|~x|v}wwo}wz~wwvvv}{v}{t|}txus}}y|ut{wk~}t}~w{|x}m~n~~|zqy~|~u{|r~~y}w}{|~|mvvr~yyyny{~v{t|r~}{k}|}{h|~|{l\z}zww|vq||Zy}|~}z{nvwx}|u}vwv}z}}{|}}|~y}|zywy~k~s}|uzx|gs}}{}{b{}}wx}mum|{x{xsrxy~x~}v~z|v}~wswzq~v||{|}}|}{~|{}~x~}|z{~{}{i~}uv{{|{x~~{~~}~y~s}{x|~~|zx}tm~x|u{i{x}~|y}|x{{n{zmz|~~|l{qz|}|||}{y}y{trxs{i}v|uwtzwwtvvj|tx}roz~}vx}|muw~}{u}}ge~mc~y}|~ux|{~n{yo~{~xx}xz~xu~{s`zww{}sz}w|~~}r~k{w{zx~z|}~~|}{x~x|yz}yzsvtv~y}z}~}zx~}~}}{v}x|~}\{~u~}|{rh{|{z}}z~}x{ts|t}svu}y}zzmv~w~z|||{vxszvVyn~{{}~}|z~}zzz{vy^k{w|po}vs|pv}|{}}|tyty|~v{r~}zZ~w~ci{j}~x~}~go~}~|qyzszy}{vz|vvy|{o}|{}jyx|}ol|yj|h}}~s~v`}zwhxvqz~w|||v}~{e|o`w|zyzj|}zqz|yvm{{x}ywpvu|v~|y{z||}}l|qt|~{{szmq~}z|vzvzv{y}|zg|}}ww{vz}t{x{|sx}zw{~vx{z{s~{u~}qj|uyrwmw|{y{|jpyxtqw}~z~{~y{}swky|}m}rzz~}~{m}h{zo|{ry~z{xy~~y|x~{vxx~zp~rsqy|m{|~zu}}u~y}z}p~}||z{{x{~~{z~ot}y~~}z}{|}{y}p}}xX~}q||juz~ws|t{}}vxuy||{{wy{o{qjr|r|~z{{y{zx|{|zp}ti{}z}vrr|r~rzxv}rh|y|z~w{}~nx|vy}|ysxyq|w~wuv|{wx|vqxykyxt|z{yxz}{xy|v~s}zr}}w~|zyzqtpyyx|}{|xs~{zyyyx}y~wz|vy{v{r~|x|vm{xp~tvz{{}w|~|{zwzy~u~zu}t~~{yx~x~~{x{~k|zzxv|~yz}}r{|y}z|}ygxv||wxw{w~q|||w}~|u|u|{|zwsy}z~y}|t~sv{zw|}~zso}z|v|xxz~}yz~ww~wyu|w|q~zyzy}{}|}y}x}}tv|{y{{zv}u~|x|~zwy}}~y~zzu~z}bzz{{~w{}{|eyx}y{s}~zunx~~}u|{zqvx|j|y~z}x|{ux|}{v}|z~w{|~}u{|}kz{s{y{v}x~zxw}y}}qzxv}uz}}ys{yz~zwp~~w{y~v{~}{}s~ux}|wv{}{d}v{{}w}~w}zurw~v~{~uz|vvyao|~y|tzyzw|zvv{}zy~q~n{vowuh~wuy|gsT|Ws}tur|}}w{~vxpm{v|xwyvrq~~a~rvwt|zzw~r}}y}us~|fs{}wzylsz~y}tt~}l|l{~zt~s~Ur{w|z{~}mv}{|g{qyvpm|wx|}}yzqy^xz|~~qvwz||{hwtn~v|t~{{{_sy|zss~sz|}v|ys|}~~zrq{z]~xzx~|uyqm|l`z~t{{~|xx~r|vyy~~xl|||xy}}yx}~zwu}{~z{tx~v~|h}|}gvov{u~wyt|t}}y~}|~n~{{uz{yxqf~s|}}n|}dn{{||~wq~xtv|yyw}}f{uwux}v{w{yy{u|x|l{|zxwwsw|xvy||yucws}yx{wz~u}ntyruz~{ws|~q~y|zpvzo~utwwzwzo~x{w|{}xz~y{~x~vxzx~vqstxqz{~{wozyp|t}x|{jywtxst}}iyxs~trqm|qz~}~u~m~z}{su~}~pw~}uhwq}vrvyxvz}|}y|xt{n}vxz|wprxz}y{|ysw|wziyux|yx{~zumz{{|uosq|wq}wv}uzyzr{z||vz{v}{xx}o|vxo}|z{{vthwxvuwut||v}vypw~}~t~lwuN~z{w{{}y{n{r|zz}tqz|mn~~yzOr}zws}sr{tzw~gzv}t|wvu|vl}{[s{uxur~{|v|~nz{q|~{w~{{{|v|~W{xzu~s~{||~ru~y|xnnc||toy~{{pzrol{t{x|z{r|||}|v|zut}|zwzpwx||~csm{g}|{{{w}y~x|x}qn{~vr`wuY|t{}{v~~u}xyrv{jk|zZwo~v~}zqryt|yty{z|{z|x|{zzry|v{z~yx{u~p{}n{rZ{xg}vwp{y|}vuyy|ut~>uzzzrwy|~y|tv~zn|~wn{{~|pjnxpyp|hwr|}{\{}nnv}yz{|{|uuzx}}}yi~{v|}r{u|yy|dS}vx{}z}f|{v}yt}uslzz|`tz}s|pz|{}~}lzlw}{~}x{{n}~|txn{wx}~}|}xvz}}xz|zk{ugyu|}x|yn|z|w~y~f{~~{v~nxsx{}z|nz~{{z|y~xt}{vvt|}~~z{u{~v~z~}y|yv|jzvq~uuwysW}}~~}yztzvxz}|z~x}vw}|cxy~}qx~wy}wqs~szr{|{y}~zz}o|v{}}{~~{ypz|y~}|z}|z|xy{yz}j{y}||fzy_{yz}zq~|yw}|x{vru~}~{uqt}wx|urr}vx|vw~}iz|xz}u}\rzwzyxzwmtn{z|y~urvzwrk|{}l{|}z{q{}r|rd~fswt~xw{zyxtu|wy|x|zqfl~||n~~~xwu|w}|{zyutvp}x}yri}yqrvdpe}{}my~}x}vyqyyst~|{sv}{v~}}v||tzrtu{z~xu}a}vrxu{~~~|z}}~~}~~nzyu}iywv~wH\z|u}vv~rzn}t|tsoyzzw~n~|~zx~xi~|s||vwwpxot|mz~lj||~t|{~{surzwzw~q|m||}tyz{zv}|znqwyr{rw|{x||zwyuy|fdh}{{~x~yyymxuw}rutjyy_ymtuu{z|x}|{{{~Y{}xz~}z{Ywt}bwvxsxwyn|uWz|~{i}uux~up|tkuw~w~_{xkyqtpv|zz}|z}xyyx||lyw~q{|x~x{t~}oy|~y}|{|x~~|q~lzw{tiy}~~w{{}z~{v{zj|xi~wui~}{~~zyxu{~|zz}zx}yn|~}|}sux|hx{}}tju|uw{{wzyv~uw~u}qy|y{~}ysxi|v}~{|~}}vt{z}xxvt}zwby~wy{owv|}zzumrx|p~~}~zz}{z{{uy{kz}}syxsvzuy}{~zzv{xyxwtz~~~zw~{vx}vvytzy}v|{twzv{txzzx|y{wvsz|~{w~xr|{xry}{uy{tty~|}zx~zsoy}v}|t|xx}|{zxi}}zk{~py~zwuz~s{~U{zg{p}w}jwr{|y|zukmpu}~ux~y~qx{{x|cx^~vy}}wvqtk|~{{~}{v{ro~t}u}~tz~zmzrlklyy}jsm{{}|{pzzq|}yugv|z|~w|||{ym}x~uyvu~v{}{~|xz}~{x}x~~}wuos~u}{wxuj}xhrpw~yw|~}~x}}yy}~fws{|~n~|rj}y~z{z|znvxtszmu|u}~}{~{{rzxvzrx~~~}{}vzz{tu}yl{s{}vz{}}|[x~q~|{juxywyx\{{|{lzjzxv|{tyj~sryl{|vyspw}~z}p{}}ls}zxxv}z{z~~}|vv}}}x{~h~z}{y|ov~zg_n~~{~zrsmzt{|x|zz}}y}z}|z}t{rx}||}s{m|~{}~{z}|y}p{}|v}zz}}wt}v{zz~vvvq|vukm}}vw|{v{||yxz}wzyy}~lz}}w}yzrw{s|zyn}~xwy~t~k||w{}tyvx}yx}uu}wwwqvt}i~~~~tx}|zzyvw~zx|{ppxyz|zx{w~o{zzun{xy}v|x~zw{rwz~sw}{{rxy{ouv~~}zt~}zxvu|tzyzo}{m|q~vx~~}~xh~~n~tw{x}}~xz{}wvzu}oz~vuu{~o~yqr{u|~xxyz~r}zx~yy~}uy~~zxu|uu{|r}|~}z|~~xuxyv{|xwvs}v{{z~{i~|osyi|wqzuz|tu}}}yy|qz~uv}qyq}~y{s~ywyx}ln|rw{w}zu~||~}|yg{|w}|wov{{l{|zxr~qt}}x}{}txz{{z~}x~qy{w|x~~w|vwyt}kh{uw~sw|w~y|~x{|y{zu|~~}{w{}}ysx{|~~{p{{zi|j}x}qwp|y}ls~xyz}yzo|s{xspvx~}|yvtv|~||rn|oy~}v}|v}s|z{}w}y{xvrvw~|p|yx}}u~jwy}yz{|q}vx{w|~~ywz{ylt|z~yr{{o|xwy~~zr|q~tyzz~~z~xz{wyqj}~k~~}~zww~x~tw|}x{{{mpuuvxy}~ny~ty|ivyx~|}}wyy|v}~}|zws~~s{vk}xuxz||wyvMv|iyyjxn{zwz}mupy}vO~g}|yz{i{z`z}|l{}x}}{n}o}{ww{|swrs}r}h{zzu~w|{{vw}}}vy~}uy|{zwyxxtkyxsytoctwx|z{w}y}~|}|~x~vwvw{x}xqw~z|z~zzYzy{wz}{}|~l}tx~vv}{C|r}wzztonkx}{{vs|y}w~yr~~k|xy|}}yy{zuy~~yuz~}{y~ytrzo~}zws~zkxwx{~vwy|wv{v~{{w|sqz|{uwrx~{}uzy~zyuqv|}el}p~zw{}wy{{wr}}|~x{}y}nuyrtr{l|{zy~zwM~~}v}xzwtqrw~~sx}~i|ovovmufwxv}l~uw{~{yryty|tw|rp}jxj}nr|}}r~||wy~q~suuzyxw}tx|~|{}yo~q|v{qw}{nu|lzxxz}za{q|p{y{vlzww}skr|}z|mql~~{vvx{zrx~z}uz|xu{ezz|w{w|}|kg{{zztyrk~zwy{ky|{vvu{zvyf|}v\|n}}t|w|zu|z{w{wvy{y}|t{zxpx|qm|z}||{y}yu{xvlkez|}zyzyzw||w}|yp|}|ux}P~py\qyjz{vu{{wzzur{y~xcq{rzwv{xY|xusryn|swUwftx`xw|}{}ntztx{u|}ly|ynq{yeyw~zuvy{ylz`|xxxu{zt|w~~yxx~|zz{tzq||{u~vuwsypm~{yxwwwut}~{}zmwq~}ztr~y{}x~x}qyun~wm}uz|vy~y~r~~yxztvs{tpzwqyrv{~sxxz{h}wy~w|tv{r|k|x}z{x|u~qvy~|vy{tygy}{~{~ru}ux|sywoox|y|}{|{uz|Xyzyyxb}z}yzyvxy~w~~vz~zu}ywsxx{uszw~{ry}}rs~r{~||{~||~|~~vyv}zyzv{mq||l|ixwvtyzzt}{~m{u|w~z}{zyr|||{yvyn{y|wn{stsm~w{xyzz}}v~pzzw~wpt||}|}uw|zxw||~x|xu^ywt||z}yxuotjp|ups}{q~~l~s|n}|~}lvdv~~}~z}wk}v}}yx~r~}{zvtrv~z}~usxsy{zr~zm|~{vgty~}r|wy|i~o~}}s|wnvx|{~~}ykz|xxuztpzor|w{}yt{s~u|umy~}xzzz}~wyxsp}|z{u~~~{qv}urvu{nxt|{sr{{{~j~zw}wzxsv{{m}uoyzv|zwozl}zms~}|sw{|{yoxxswx}z{y}|qj~|v~zr}wx|xyt|~{{}{rf||~}rnus|uss|{~}|}z}v|lwputr|tytr|zxzy{wk~zrj{z|k~v~wvsqm~~vz|uy}zx|}|yxlw|~w|}~t|x{z|hszv\zzireyvq}wwz~xk~~~tz~w|yjt|rtwz|w}xnz}{y~voxrzuyz~pyg|yxrjx~z~~{lq{|{y~|tzyz|xopx{~nu{|{vuzv~m~|oz|}|zt~vy~ny}|z~~x{yyw}|gwvy~v}||x}ui~~vxr{~||sm}~uv}|{y{s|ix|~{yw}{}r{~{v|~|wz{{{}ux}}uqxxzqyq|z|{pxp}wxkq~mzr|xw|}}wy|ysz{xc{x{v~z~y|it~~{yxzy|u{wqw~~xz}{zwzmxz{}wk}zxx}~}{yvw}{~yz~y}v||x|{~q||}~t~||y{{pww{{~umx~txy{y|s|v~y}~\xrw{x}h}xt|x}|~uqz{|}y{~yqktw}u{x{{|nwrwy}xyty|||z}lzy{nu~xw{tuyzvsn|upz{}w{z\~|msy~zUyyx}ysy}y~{zm}~tuyuy|youyv|v~w{t|]~rr{r{o{ru}xqy{yqsvyuv{}{zzz|xo}~z~ztqyz}y\}me|~vizyv}l|sv|y}rw~}iz}z}zw{}|otx~{qx{swx}uy~}~z{|~}}|kysory~w{|}{{|ux{t|xt|{g}}}~x~|}z~}w~vty}~zvy}yyzx|~{nz|yuy}qmx~r|}xszz}{|u{}}~z{xp{xz}t|}~|{}t}|vu|~}{t~~~|jy|yyz|~}y|xx||~r|y|}v~yzj}wuw~y}y|y~~txtbv|vt~y}xgp~|~|{wy||}}|}ytxyyv|}|wy|~~w|~}~}|}}rrzysu~xuw|on{i{tq}{{|zo~~tz}{}sw}zyv{uzx}|}~{v}{}|v}spy}u}~s}pmsiu|{nvzwzyty{z|rh|~v|}~~~sn|urznyhrvvpzzx}wyxwz}vtxz{wx|{zyxvvxwmps~|vywwjzwxszu{xxy{wxqf}|st||z{x||wqw{n|tly|y}~{zw}}u}vg~z}{s~|nzxy}z~xx{tx|w|qs}{~1q}yq|u|}xr{~|ksf~yy~}o{{w{sqny}x~rvtz~|{wx~qmssvuy{xz}qv~~~}zyy}vtp~xzywx}a{u|tx~~t{uy}~s|wr~zvpzz|w|{xw{~v}wh|r~}y~|y~v~o|wvnrzp|{u{~qxz}l|tjv{}v}z}{fywzx}{~~us|w|o}w{qs{}{|zv}x~w{xfrww~w{~vlo}t}~~yxyt{z|zt}}Upyh~a}{|}{~wz{l{v{d{~|utnx~}|y{{z}v|}xo|~y}iwryz}}{~wyyuy~~v|izz|~zyzz{}zz}m{zy}|~}i|{w|{{ppaxxt{{u}}qzsyUt~vvq{wux{z~~{yzo~wmoz~x{~o||}sy~r}lztspyzs||t}tx}y}}z|||xz|hx|zy}u|y||~x|wn|p~~}yy{|z~}}}rr~}zy|u|}nz|yt~}xzw}w{yvz~{~e}~t|vxxax~|{{y}}{{~uvj{~{|l|z}{~S}y~}}|{~{}u|ysqwz}yv|rzf|{{~r{yw|{o|ssuqyqx|cuou|x~q{zuyz|zyt^u|~s}oxyr}{m{xz~s{pvvzv|xyu~eyxyjx~||svmxtv{s|}Y~|}{x{xmr|yt~jx|{}q~ef~X{v|x~wo}y}}~jrxyz{kx|wg|x~{||sx}{s~o}}z[t|uup{sq|g~}o}xz~izvxsxwtuwzzz|ssqxw~z{w_puy~}}u|c|v{tuzwy~yt{py{~yfizhxs{ov{{{xs|sptmu~{twyxx|z|zwy{}tozxbvyu{nthuy{Umlyzeuqe}srvy{~y|||xy|xz{|~|sy|u}uwlqtu~|uzz}uevw}{||~vyrw}rxowz}s|i{u|xzp}tbzy}uu~qwju|}{z}~{~mx}thn|{ynytp~~ot|ns{z}yvwzrx|stz}x|wnw|tw|vz}yg{~y~wn~~pmv||fkz}x}~yzrvk~~~vq}m{uu~t~uiuynyzq}{i~ut{z{{v~v}|}susx}{ttqx{~x|||oytss}{z|{hvy}wyx}{lxy~r{||qs{u~y~wu}~_}|vz|ouywsv{{~{}zzwyymjzvy~}qvxw}|w~jzxvtyzvx}wt}vxsyu~q|q}v|x}ruzxqvs~m{}wxtvwyq~}nvm|vyw||v{}yzhsz~xr~vy|~z{}~{yv}}wxtxq|xypz{{v~yvws~ytv}|uy{}xz{zwbw}}t~}||~~moyz{{s|xvyjzvq|q}wy|w{s}z~zztqx~z~wpzxuzyhqxy{{w}vxxw|qxzx}uxg|~|{z{|{t|u}tzp~w{zzx}xvpxuxpvwn{~}h{tx}z{z}}}wr|qxwyxz|u~wvw~mzxk|{wwyy~|wwnov}y~~|~zh~qxp}w|mwzks{p||~{mz{~s|uzm~|yx{{xr|||y~wwt~|iz|{|rv|y~{~y||g{vy}}{q}{y}|wz{~yrm{p{{{|zy{tw{{~ty|zvpiu~fv}tfiy}zu~zt{tov||xxwy}||~p~rvs}}{qzt{v~x|~y}pv{vvyzww{{wxr}|kz|yrzxu|lz|}}}mm{||}xqyyszxwwnn~u~|pzv~{nze~~vxxvxoz|zi~bu~~|zw}~xwt}zyzvxys~u|ifyzttv{}{z}r~yt}uz}t~~nyvnmwoo}x{w~|~ys~t~{qvyy~xvzz|wz}~xm{yawzxt{{|uzqr{|xv||yzyznzs|ozyyw~y~z}x}zwv{zzyp{xxgvstpyu~yx{{~rwy|x{tatpyy{v{s~tyyrYz}xyx~q~xsx|r{}}v{ry`t}azhzw{upkq~yuq{~t|wlx~~}k{zolux|y{}|s~p{w{{~~lzks~x|~|}}|}z|||}{su~wszqr}z~}wvuty}|}wyivt~~}|}{|zyptmxp{t}||qy}{w~|s}{|hl}uz{uzu~|z|s~s}wy}yv|t{w|}}~~j|w~~sxr|{yr~{xw~w{z~{~~wv|zx{}{p{y}}{{|st~w}a~n{{x}{tr~zj}{yz|u}~v|syrzwzyr}x{IU{~zz{{~y|}|zxqtysg}|}vu~~{z|tszs|syzw~~n|t~~p~tz~s~{r}tgyo~|~u~|~mr}yws|~~u|{up{oi}~}y|ny}q}}}xrz{~~~v~~|nuVu~{|z{r{tu|z{zwrx~ev|wx{~rz}y~~~{y~ywvn{x~|rz~w{xt~{}q|z}||zryzzz~}}|z}{zuuz{z}{zv~zsn}pyyly~|~|~}z~}}}|~{sw|r}~||x~~wo{~rhyrt~~~{{x}xwxzw}x}yx}rzw~o{|{x{w|}xzwzw|y}~z}|vz}w|}}zv~~utv~}|{}yx{~y~{{w{zvzr~{wyx~t}}||zy|u}y~~w{{}op}v~}z{yw|v}~||~zyw}z{yv|}}}tx~{yyt{tzw~py~y}~|zs}}yvu{{|y}}xv~z~|~|h}zy{~{s{x|w|}}zv~p{vzx~}{~}uwz{~xyy}u}||s~z~xv|x}xvxu|kjvp}~r|}wz}yx}{~u{|v}y}||r|~xzr||{{tq{{|zuyysx|vr|}}}y|}r}ztx|y}}{v~k~}ch~}~xvyzrt~v{z|}{~x}|t}vvvxxxw||~r{{{z}z~z||}y|~~~y}{q||z|uyxt{|zx|}|s}w||w{~yv}mtr{v~||~f{{xr}uxo{z}z{xpu~hv|}y|x{x}}x|qx}zzy}}uyn}~qx~yk|yzzw|p~}{{u{|zlz}~yyxxz|wy~~|tz}{~yxv}z{vp|wy{pzlytgzn}z}}k{z|zq{vutzyw~zwyyh{zy~s{g}}vxox{||xzhzx}qvwzx~}{x|zo}wox{c~||}}r~{x~~z{}{|u}u~txd|{s}y|}|zm{_{{qy|~~yul~{~~}v~y}rs|vl}v|wtry|j}~|}sy|{x~}j|j|etx}v}}v~u~n|~hq{}{y{xxv|zw}m|rwu{~{}hz{myp}wn~s||vyotxzw{v}zxx{t{}z}||r}c}}|~||qwy}{{wrs|{||b~|}y{~xx}~r{n{z|l{wr~}zx}t~ydtwp}{pp~}{}~zyxy~q}|u|~}yrzytk}~~}{x{ozu}|qk}~xy}{|z}vw|tss~{|zoz~}xy|}}gx~|m{}|wpyoqoywy}zx~u~sxt~gu{vyrqzxw}u}~{vx|hn|syt}}{w~~~{{{}|y{y~|}wy~xk~xxx}n}|{}z~~|~z}x{wvv}{~||wy|R~y~~~wz|nw{v||s}q|~~s~xsz~sz~}y}~y|}{|nzznv|dq~}|{{r{|qxx~{y{}w|r}wzu}vps}|{xpe|~~}uym|{u{~y|{vj~w{~}~z~}my{n}~{j{{zwn~~ysxz|{|gt~z}q||zn}x|m|qjuxm|{e~bv||}t|{y|z~~wwcwi~x|{{{}}|x|ajjx}v|}{}w}|o~|z||}p{x|x|}~{~{|||yirx|z{{~uv{yy~osgp|hwuz~l}{|z}|s~~z{uz~uzvxwy}|~{xu{yz{{}szy}m|{ysxx|~ryp|y~}xqwyx~w{}u{pvwv}lzxsooqzu{}~{~x}{uz{pw|~wuvzyr}rzzzv~~n}xe~wv||pwtv{t{k{xuqkxxpxzv~~x~|ultovuwpx}|zzuv|zwvxr~vo|ywt|[zmx|o{zy|||}|x}hyy}}y|zu|v{yx}fpjhqv~~{w{nk{tg}|nvu}xzi~}~zlzy}ryum}||vu}~o}{wvstq}w}ld}z|q{u{zsswt~tzxrvyfyv{zzud{{|}z|v}y|v{piwzztx~wzz}}p}|h{rky|x{u{~duj~tx{{||{{}x}tz|w}Qzs~r}|v}~}u{{~zmy}txzysqxwysvqt{yz}~vzw}q{}}tq}wxvpn|}|szyw~zrzy{nzzwwp||vvxxy|wn{z{x|xz}z|}}|~wptquums}ztm|ww|zqyt}xyu{}qw{|}w{rpzquu{zyz{}~yu}yhx{y}}y~z~z~}{{vtwwzzw}|}}u}|{zwz{zz{}yvsuuwx}}{czy~{|yztyxu}r{||wuxy|q|}vvqwt~l{syvwxtwrxzy|t{}|wunyuw{u{y{{zx{q~zvw~|~sstz~xzvj}pzvzr}w|u{w|~w{m|nprytzyi{z~}x}zi~vv|{~|}y~wx}x{so{y~|{uyut{|z~y|tzs{|q{|v~y~~uuys~}so{|xozwu}xpvs|{qyy}uz}{{{{~v|r||u|zfwyyxtwsxn~wxr{yp|zv~tum||{~||z}rx}wpz{}v|~|{{xuwoz{~uV{~}|ty{||l|jyy~|x|t~~s{|~|z~}~v|z{t~m{xw]}|{zvyey~j}}zvqpxmzs{ysrw{}~xw}}vus}u~gsox|m{}~{uz|{st||ys}}xsivvu~zt~wztwvvvuyn|{yzzt{}pw|}~wmu~~t|{~|pxvsp||zv}wy~vuz}swsqjyw}r}}{ur~vu~}mwwqy}d{rzv|zrzy|x~ylsz{{z~vr{|xwz|vv{r{t}n|kv{{y|~~yr}|{u{~i}{sqxy|z{t{v~||w}|os{~{|wyx}yz~|}{t}|{{|v{}}zywsqx~{x~|zv~tt|v~s{zqnuy|vx{yy|y}wtuw~{xzy~}z||xw}~~{w~lvx~w}~{~|y|~z{|}zxzrz~utz|y|{~||~}~wy~u}v~y}|z{iq{x|t{~sm}~v{~||}u|yzw}ox}{yxzn{zw|zy{r~|tjugvw{zx{zwwv|xr~y{}wy~{mwvrt~s~z}z|{w}xy}||}zy{u~qxx|yv|yr}t{vy}xw~x}w~q||~{wv{stxv~}}{}v|~z~{x~|~|xy}rwx}o}{u{yvz|{z|w~}zv~yw}wy}{yyy|z}vxs}~{y~y||sy{v|{w|{zz~~wvu~{vyyky~|q|~}wx|tywyw}zw}|t{}|xz|pzx|w{{xz~}ux~zzyytzxxxxzt{yvx}svyz}o||y|}|wyypvx}z~rvz{x{w{w}x||}|~~{y{yw|zy}||{}}|{zyy~ut|t{zv{u~tyyxx{zxw|nv|uwnu|zwt{wz{}}}wyyzwx{lu|v}|{vy}v}~z~v~v~zz{y|wy|rz|s{r~yxrxx}r~{qwtuvzr}z|~t{b|upzz}qxsi~s|xuizv||mt{{|ru~wq{{~zt|rm{v}|tr~}x~}}}qz~~}d}gpv|q}cz{ixvs~yuxymyvsw}y}r|pqyxz}{zxy}|uzu}v{~~}zzy}y}`z}vuyu|}uzo{{zr|{r_~Lt{{xlx~|tu{yg~{y}zxsot{}}vwyvtwyx|vwou||y|xy}}{|~ms|{wusy}yvtx}}uonyd~~~~y}{{lw|yz~~su~w|}{}osgrgzu[ms}urox]oqt}wx{sqwx~yywrwu~s~yyyzzzt}j}}Gx|~|wrz{p{u|{|wz~~~|yz~vx~xzm}{|z{yvyuw{qyw|}|x~z||nxyw~us{zun|umwxvx|w|rtwzz|wu|zqwu~zdmrwvtv{|y|}}wxuw}n{~}zr{tuovrxz}ziy|}~}xv|yw{yw{{|yv{}ysz{zwzzww{t|zsw{{{}t}qV||zz{zr{xutuh}~yzw}v~|yz~zw|nuz{q|||w~x{pootz|{t~u~vn{xvzytpy}yx|wx{|w}}}~||~{~wqzw{rxiw~rlvzyq|zpxvy|s~|my|}oyxzyw~}o}{|wy|lx~v~uyr}||z|r~g{w~|z~vr|zvz~|v~}vy^~{{rwxsxzw~~{~ww}|~~pw~ovwxp}|znv}~}~}|}|lv{|qy{z~}rkuo~r~||}}zw}ttx{z~}~||}|zzy~kv{{}xl|~uwuyzwzv|tt}|nyxe~tsny{}}~ltw}z}z|s}|z{~vkym~}zzwtx|s|p{}b|}{|}y|}|fsz|}}e}y~zc|x{}ywz|y}w}{{zryz~zxwuswu}w}qi}wt}pu{|{x|s}w{s|kx{{|{|v||zz|{|x|z~v|tzv|~zu}~~m}txx~{vz~yezkvsybzv~y~x|}}|xzzylzy}wp}}z}ys|}z}}|{|~}p}z}z|zy{vt~|||~{}x|}zx|wvs|x{vrmknzyzzx~|y~or}}mwv|}wwzyzzx|vug||wx}|~wx||~~xxs}rq~yp{w}~t|~{~s}{~}x{x~z~z~}}t~y|}uyx|{x~{|sz}uvq|~yz|u{s~}px|{x}|~{s||~qmt|xw|vy~zyzss}kssz|w~iz{|u{|xq~y|wrt}{v~~}j}{xzp{wh~otdxtq~ozkwxz}y{whm~d}y{}z{utn{u{vutuuwxw~{x{~v|}~r}|{~}m|}{}sz|vxvxyvzyzzwvuv{}}~y|sp~w~|u{tvj|v~{}wwyw}~xmt{~z}}}~ys{s{|yxy}rvs~}{mw~w~f~uty}{x}zz}`|~zxwtizzr}~||y}{pyv}qvx|m{~}{zu|y{}z|vo{}k~}q~{~o}{}}v~{w}s}{Zzo{~xyt}z~zz}y|zryz|{uz}k}|x{tfr}z}||a}~~z|uy|~{}|h{|yzux{s{xw~}}|~}~|wz|}w}|{w|}zsv}|o|}{{opvw}y~z||~y|k}uy||{~~yyox{wx~~u~wzsozv{|n~vx{}v|x{tbw}q~}|{n}{v{h}x}{{}~|u}|~z|kut}v|}|}{}|{|o{tyzf|xvh|tx{yqc^}~y~xx|r}||}~wz{z{|zn}}}~~y{{{wzx{w~|}~m|~qq~{r{^}~{~q}s{zx{zyq}zvw{yzyr~x}y}x|usxsyywtlx}}|zw|{ysw}|{{{r{s{r~tuq|~}{{|xzx{~t}p{y~|z|}|~p~zyyy{z~t{wwrx}z}{yj~y}y|{{}|{wz|}h}}yw{||yyozs{x|{r}~x|s|}~~|}}}vw}~xzslrwryv~z~{}ug{yvx~z}}xj~yrxt~xytx}wu`{y{yx|}yyv{tyv{y~v}~x{xwsut~{|qss}w}{zj}wxs|~xwy|z}z|psxz}|||vyy{xyw{}}~}~}x}nz{|w|pyz|ny~y{{zvv~v}nu|t~}~y}{{z}yzzzawy{ty~y|szx~zu}~{zuw|x~vzpxet~|zy|}zxzq{v~zy~}~ywswu}|v|~wx|pt~rzw}{v}u~{~v|zvtzzx||q}~{{|{rzqum~|xo~yuo}xz}~|ww|}xop{vvu|{v|j|w~}vou~zr~}s~m~pt|xuwwy}r`t~{s~|~turv~t}w}~s}qr|zyvx}|up|wgx}{~ztzyx~o|o}e{}{{|z{|ru~z\yr|p{s}y{{x~t~z}xipx|~zoyun|`s}}zq}x{qzqfywu|}~|~q~uw{zx|{}|yv|xy|y~u|nse~y|tuvy~}}~}}|qw}|yr~~xzz~v||xyzvy}zt}}||wWx}w{zt~sxw~~{tx|x{|my|{pouz|yy~t}t}v}yszu{{~yx}x~yx}}~xtw|}kr{{{t~yyx}ypyz||xxvy~uyzy}y{y{yuzy~z}xr|||z{v}~|}xvv~zt}|~y~~}||}~ym{usxxwyy|y|m|~vx~~}zswy~|{y}wrz~|z~}}t|~vw|y}|~v{}zxzv{~xuwuqz~ww{|wv{z~x|{~z{{yvx}x||sy|zvz{y|rxp{}|x}us}{z}~|}~|{|~p}}}x~z~|{xy|owzuux{{}u{wuzuu}zyyzz{~y}w|z}~tzzr||x|wth|s~}{zkvyxs}}zzp~xy~yzu{}{{{z}q}|}~{xzy{qwz}~yyv}ywrwy}rx|{}w{tov~|zw|zvyu{pn{z}|xxz}ywz}yyusw~||tv}z{}ruuyvv}~{z{z}v~|tu}}yw|{zzzt}~}v{|t||x||{s{|x|}vyzx|y~vn{z~|~o~|r~wyx}w~zs}~{n}}}}|a|}z{y{|yu~}wuqz~gx|~~z{|{wyzs}|z}t}v}vwzw{y~|znp|xzuxyk|{{zy|z{z}vw}w~w{{|z}w~{|zxw}zw|}|wz|}k}z||{yt{{}z}y~yw~w}qxx}~zswt}}}~~y{yy~x{x~vyzts~tz}}|kw|z~rwz~z{|gy}}}{x{~{yzyzuwvo{u}~}r~v|oy|xv{x|vwqvptw{~}}zuli}msn|b~zzs{~|{we^yxx~|{}}g~xmv~uz}y}|z||r{yx~z~}}z~ht|}sszvwt}iz{qzxxx||wvuu~}~wywvv{rj~yzu}zv~yv}ny|v{vj|{~{z~~wt}}ty{|u}zz|v}ll|vy{xwwr|{|~~wyyf}hy}{~t}gw}zzt|}}}tvyh{}{yj~~wwzwv~l~{|x|r}z~r~wvy{s||||V{k}|}{zjzx~}rf{}{v}~xr^xw|{xtwv~~}{wxo{w}x~y~yu~|tz}zt|{psx}z{p|zv{~kzy~{w~~uxt|||u{t~y}t{uz}trzzv{|zy|z~z}}xzz~|u]{sy~s}u||xvzy~}|y~s|zyyyzh{|f~yzzu~}}xz~}wyv}y{yy{~~zu~tzmxu{yvy}x|}z~}~zyx~}xx||xnz~rr~z}|v~~y}|{zyy{x{ww{o}w{w|}u{{ww~}u|p|||x{v~z|~}}}~|}||}x{z}~~|zyx}~wr}}yqs~y|~yzywrz~w{x}}|}}}z}|{u|{~}yuz{{{}wx~~qwszqxyp~u{xx}w}~~z|y}xq||y{u|w{~y|v|z|s{}x{||xsyws{|zu|y{wsboyw}yvzzy{}~}ypu||~r{r{pr|xoyz{y{{vx{{}y}qx|s~}||~yovvr{uvxzzvvxwo|~w}uz~uz}~~ltyzwz|ryyyyx`tz|{yuy~x{{y|}tw|{v~w{|yy}u}y~n~eyzs{Utzy~w|pz|s~w{o|zyw{suqh}}yzxytvyn}x|s~~yywzx|z}t|z{{z{z~vym}~}voyyvz}y~z~poz~~{x|~}x{rz~urz}{uo}y~s{{|~}{~r~|y}y~st}|sywwz{}vww~xyw|u}{{ze~{~~}|ux}{rl{}{uw~zwp{~~|s~|z|m|}hwwz}vvrqu}z~y|y|yzoyxy|~y|yzxw{z]}xt}{v{|{q{sz}yvt{~{wzqys{z}{~uv}z|t}{vu}|~zqduu|uszqqxzyuq}nxzyzszq|~r{|pr{u{yyur{qruzz|x{z}|fw|}y}w{xzrs{tz{tx~~s~}x|wrsw{x{xxtgyxyty~~kpw~z{}s~x{w~zuuzyuzyo|yyuvhyq|ly~{~|ykxy~}|j|oo~{wtsvvv|n~rrY{x}|zrvuxn|yq{xp{~hzu|~}ywz}vk}v|}uww{vy~x}vq|p~yp}Ytv|}{}~pjxp~syt{}wytsw|xz{kono~}n~y}|}}u~{tzxxvxux}qtxw}yrxy~yxp~wtuqtyz|u{z{t{yvx|tmuzx||vx{}ov{v}||{jv{}v}x|y}}yzxmp{vuu|zm~nnx{zx|}~wy~~r~~r~q{x{r{lvy|u}z{yv}vq~|}w}{|}wv||q}~snur{znn|snq{{~y}uw~}|t~~lx{{pqxy[zp~|tv}x~}v_v~}yow~t{y||xyzw~zwz|vvYl|vr~{_|sz{{zz{qz~|}}zz|z{w|||u{v}wvz|zw||t{t~{{~}qz}|~ytyoww~{v{}uv[~mz~{||tx}~~r|zj}xw|oxuww|{wtUwzvz~~pzx~g{x{]lx~zyl|x~|xolyq|gy~z|}{~y|{~}}sx~qw~in|x{~qv|w~{xw}~|wzkwxvzy{x}~z{z~}zyp|wtv}vsrxxq{~lo}}wu|j{ntz|~|vx|xyx||uxsu{{~|}||z}nxx~cu|y|u~~x~q{vzc~vxs}zw}woy|v}Ywy}}}r}jwpr{s}|}~q}xx~r~l{|}hyi}yy~ot{y~}zv}xx}~||}wzywr}}~uz}}}}}e}{zmu{t}j~|}xv~}is||zvmxwv~r|}w|x|~~gz}xuzxzz|qwy|}z|y{~|y{xy~py|{|ry}{{|}t}fyues|{|y}t{tvlz}z}wvvvzvzn~z~}|~}yzi}z{p~~zx|yv|}{}wwz{s}|}wnzwuyux}}z}j~hx}|jt~}}{xx~}w}{swxr|}ndz|~|~v||{}{u{~x}y}|z|v^~|x}{q||~|~z|s~|t{k}~x|z|zw{}{}}|s}y}wqu{qwvv{zzv}|{j|}~yx|yv}v{}n{~tz~rz~}y{lz~u}|z{zz{zy|{}~|}{}|ty{oue}xt|lzmr{~~}~hn~|y~wg~~~{s~{pwu|y|}zz||uunt||}}~z|az|z|uzr{|{{}{~}}yx~yzx{|l}lyv{||ps}ru~}y}r~{nyy}vv}{||u}xvy{xoz|x~|l~o}{}}|{m~|}{w{t}{}|v~w}{}|x|yxvd~~wx~{}wtw|~}ra{utulo|{zxx~y{~{{{}~i}}vz{x}n}x}{~x~jk{bn|}t~c|z}|~~{uut}j|~~~~x}fk~~|q~|xtc}h}}|}y}}nvjX{u{tu|pu{{ry~y}~~qwx~}~u}}yzrp{|w{t|~ux~~v}pwz~}|f}}}{z}|s}l|soiv}vvyvxv}v~u}|v{~y|n|{piuyt{}wgxx{z|}wn|}yz{}qxv`}w|}}}~pr}y|||y|r}v~ntvxx|k}x}}vr|uwxz{{~{z}}hz{}{|r}{q|st~y~}|vszvwvp}||{wsxsz~u}z}{b{x]szzn}}~lz~|nx~ojh{~sy|}f{tozx||zv|{v}z{{}|{xq~t|wowzsrwtv{v_~y}woy}~}{v}kwZmu{m|kx{|zv|~zkuwt{v{{ot~n}x||ymwz|yw~r{kvt|v~{{{vyv~~yxzxm|zf|{ww~}~z~y|tiq|q|x{|vwxyu}jwu~|u}~}xsyr~tl{s}yyzzqxwvy~|}y}}v|kw|r}qt|uto{{urrx~z}yz|yXv|wkx}|yvy}}|}~xzzzs}~xuuytysxz{xymhv{v|rzxz|wjzzz~vpxrzxuxz|m}xtxwsns|~}|vx{~|~x|zu{~sp{lz~}}xzwyutu|wr{|uu}rycwlrzxnsxv|t|v|tvp~~}xwsw}w}`~twq|z{}tx|~zzx~uxvu{{~pwpvzzo~~~y~{}yw|{o~}p~~{|~x}~~z}~}~wyytytyoz~|o}z|j{{{|xu~~{z|tu~}z}{}~qy|||x{xz|qvzwxwtxr||x~|}x|{}|~z~vu~}}i{|tt}}|{~|q~||~}w~zvw~x{~~tqq|sz~xz|~~~{~}~xzqh}t}|u|}yv|j~}yvw}rxzz}x}~~zu{~z~|rz{u|wwz|x~sitvz{{vqy{|}ud~||~}yxjvq}{rf}}s~|~jy|ov|zsyp{~~|~zx|pyytw}x|vyzme{|~oww}s{s}~v}uqyzytyz~}~z~np~xu~|{|{{zy}}~}t}x|}x|{zx~~}~~~fp}{yd|u{zo{v|x~}}lz~}www~q|}x}~z~~|w{|}s|x|zzo||bvvyzw}|sz{yyr{vz{y~}z~tsjz~|~~yx|ww}ov|{p}qzyytx{u}}pyw|~|znk{zx}z~py{}}n~||{{|{zpy}{~|w}|zl~w{v|~{{vszzvts|zx}}}zv|vx}yoryxos}Xv}|}xp|y|xww}xwy{{}z}y|y|r}p~~{w|~t}z~yvyzy|}xiyzsr{~||{}xy{||{{l{z~|||zw|x|}{}u{{yzur|t~~~zq~q|{~||vvtvxxx{x||zwi{{||{yw~|mx|}sv}d{z{zs|~vw}|{{z{yz}p|~{t||~yvf{~{zv{yrzf{~z~y||wzprhv|xp|t|zot|nr|uqrr}z{z{em~o|zyuzxtuyjh|x~gpnr{rv|l}yqtkw{nz~zn~hv}xn||znZ}vlv~|svf]|d{z}vvxm~z}zz}|buvw~uv|}p||}{}oxx}{|x{k|zwwmm~uv}vzloevs|~|z{|y}ptwypn}{y|oy~|w{zwwux|xyp{wyv{zuzgyx}}{r}yu{s}unuu|s~ssuzzznzx~}ru||}n}}rzznsz{{us{~~|p~oxs~wt|zrsly{zw}vW{q}}wq}|~dyxvxxxzpq~vo|r}xjt~||~{wxv{zsy~|~x|{~w~mf|rwwvn{}yx|~z{yx}w{{|ut{x~{r|o~|ut|{i{}|xw{s~~pru~tt}kxh}~|yx~|y~vszx}|~zvy~{x~zrrr{{|}v}}|nzx}z{~|}y~z|||{|{ss}~un|{tw}qq}vz}wt{}|~}}zvz{|{w}v~uz{x{}}~e}}~tv}}tz}zy~yxz|`|}~|~{}w}|xxy{t|}xz~{{|czx~x~w|t|}}||yyqyo~}}uv{{wt}}y~}~lv|vx~}{ky|{|yx|~{||~v~x{pwv|z~z||zyz{qyp~ytp}zv||}|yzytx~~rqz{v}r}yok{y~ztj~yy|~vsw~zz|wzz{~}{|{~z{so~{t}~m}tyzwf}~zx{ntsp}z{tuqy|z{|p}v{}z{x~yw{sutyp}puuqvxq}wnnrp|zxy~|oyu{}~yyw{sz~y{{yz|x{z~o~k{|~v{d|y~~~wx|vlvy}}jyu|yzzs||}xyzt~|qu|rvpz~yw{y{xvxxzwxvtrzdxtfx|tv|zz}|~zvxo{k~w{|u}nzvsz}s}h~ql{onx|twtwj\}w}zxy}su}|yt{n~{y~p}pwzzry~xu~}|n{vxvs~|z~zvzpn|~y}wv|~yx{uzzpxw}ztyzu}|~pr{}rw}k}|kz}typxovq~}}zwqr|s~u|v}yyuz{vrtrlzl~h|}xlwry|vwn~}xfy|~zw{ry{z}ppq|~~uyvo}~|y|~{xkyzvy}~u{uzvvy{~vzds~}y}s~tw~{txt~~|{o|~rzsyj~{}yp|}~}ytoxtzm}k}s}t}s}}yyqxp~w{t~}|}lxww{rb{}z{znq~{xwt{zty~w}~}{f~}yxtxy~|u~qs{}}}~}vt|qu}|v}zzx|~zvUt~t~xsz{{|~x}zz~vkx}|vv{xjo~}v{wzywysy|xvw]v|{zzumz|~gq|}||}~{|uyy{|{wsu~rxyywts~{|y||~}yu~w}yyz~q}~z{xr}}xzt{vysyzx~}zs{}zxk~wxuvsy\~y{wwvxz|u{~uuv[ysl|~|y}}|z}w|~f}}}dj}y~}~c~tsys~s}|wvtiryo{u|~~}}wyw{y~xv{xp~t|uv~w~zvw~x|zzss{^zr{y~|wwh{~z~udie~}{suq|~zxu}x{yzq{{v}|r}yz}{uo}}yjv|}nuk||p|~}zi~r|owu|yxp|~wy}|tt}l}tz|zv|my|r{~wjhl~qv|xx|yx~~~~|yr~ow~{{}|xu|{uxq}rxr|xv}}zjx}vw|~}}~ugt{xx~||v{v{p{xuxvytxx}vzouxsrvyv{z|uhm~|i}dywq~|zry}vz~yyyjz}~kux~rz}|s}|zy|}hz{{~gypuJvwnz~{s|{h{o}~|zz}tz|}}~{~~wtxxxw}uw~t{}}rm}hf~~}}}~y~|}nr_t~{}yy}|wz|hzTpqw}|yz{~yw~zOsv~~x}}ooz{iyxcx|~~xzmy~xt}~wm~zv|yy}~z|q{v^x~|}~|}}}~~tz}mywxpv{{x}xu||zuzuju~zx|~}ul}~~x|~d|{osqf~}{{z}|}~zys|{qzuybxmz{|~~{ux{yk]{rw|~o}n|}fsryuy||y|xwpy~{w~y{~vqy~{|sz~qo}xvz}ys~{z~}yl~|~zu}mkz~~}}y{|x}}s~}k~~k|zcz{zyx{}xu{uy}{}}x{qx~rwxz}yyczyz}D}s|}}}yxz{ug|vyv|n|m~}vswz{rs}|}p~~wg|rFcwvstt}{|z~x}izxzttz|xw||ww}ywstsvs|zyxuzx}zs}}t|mwwwu~vyxszuwy|x|}xwwvz]rnxz|u|x`zvz|~uytq{wz}vw|vq|rtqn~~|p|~zq|y{{z}p}{z}w{dx~z}wzxyys~z~Svzxss~wdzw||bvz}}b{u|ywq||y}xz}}~}{xhn~{|{}`kvo{t|yy{wl[sv~|y~y{}~zs~g|ox~{fv}}tsutx{{t}|}wfz|}~}Ezvyyu|}~|~~}~sz~zykszx}||{~i~~|vyfwh}om}|`ws~yvo{pynpra~{ul}jzgw|n}{||zuuvrxmswvvrx|higpxspv||z}y|}{z|twtsnsuyz|~~Mu|~u{wonvxrt}yr}s]wyip~j^xu~~equzwz}_xqxCywzq||]~}zdxz~ex}\vn|toyoyxy\wo}`tqom|ntk{xx|}py{}t|w~lz{m~ozt|my}rzw{{|}{u~Tt}~ytwzt`{ut}n~z|{uvqvjzsfru{ztpmvx{qvh}yqjxts}}n~uaryzstdrywywwqp_v|y}wruv|~jnkxwf|ra|diZpu{x}owulr|}`{j|u}\p||y}~}Ssz^~yzjlh~|e{z||n|lv}~xu|~z}f~z}z~}}y}e{ov}~y~wv}t||t{g{|z{~}{~}yxx{tyt|x|yp{~~km|vq|{d~}rve{{vpk}x|v~u~}{}jn~{t~~s}~k~u~xzxsq{|w}wq~qh|qyvx{t~twx|h~}z{|yv|}zzp{~hz~|}v{w}ryq~v|{}yZ~|ls~v}`y}}~~x}yj||wy~{xz}wx}bm||}}{w}t{e|h{o{{|}{~^}zev{zvjxs}l{}|s{~~\n~|yyq|}~z~z}Z~zu|g~{krxv||||uivyzu~zo~|~{s|}|p{}{|yz{||~|w}|~}hqz|yvu~~vzpytz{yx{pzzyuwvt~}wv|z|tzw}vmwpu~vxyuvo|}{|w|x~y|y{vx|x|{yz{wr|wzxrzv|||zxxtx|thyzutzzzl~|yzwyuwyz|ypv{ywy}zqx|}{qx{}}uw~|}|{q|juji~}p|wurps~ywwvnu{xuuz}t|}{zg|yxzxg}}wws|{yvuxq}{nt_~~huytmiwyyu|{v{}t}zx~~~{|lkxlvs{xzyy{psztt|xzwov{|~|wyoqrt{txy}xx{|w}yz~{quy||z|w~~zz}n}{rxwyyn|z{l}||xwvryp~tvvuv}{nuzyy{zxqsvtzyz{u~~wf~uwqzqks}yttqu||zww}|wput~{pyyuv`uz~ywu|q}dvx|J}r{}~s|z|z~vt|k{|vx{{p}t{wqwr~x~znx}yrxrjzy|}~ytz~q|roxz{q|}~ut}~vzo{}||}}~~y{yq}}~|wx}krw|wt{}wy~z{}w{y{zn~wxyyxy~|ez{o|{{~~|yw~|vwj}~vpx|xqvxz~{{w~|w|}~x~}up~{y~}||xs}~|qxzlsxwxzyzz|pz}xz}x|}ry{xzzj|y~{vs~|x{|yw|mx|y|zxyy}y{yv{{w|zyt}o~t~u~{{szyxx}~ywws||zzw}szwxw|yqy{|}|~{wz}}v|w}~qz~z~}uz|b~y~hr{y{xw|z}|rv}{zlu||yx}xQ}y||wt{reyzvy|xzyxwr{|{~||h{l~|yzzzw|}pz~wy{}Oy|ys~{|~z|wsyr{~vw}~}u}~womy~}xv{{{~~or~muw|yu~yz|wz{y}~tu}}~w{ow}nx{}y~skt~{}wrsz|zv~||{|b{|}yv{fs~{nxuet|}}}{~x~ru~~y~wr{}iww}~r}|v|~|v}{{v}}}|v~{kq}}|qz|z~vzi~s~z~}w|~}}{xv{|{||~}}{|tyxl}}~xz}x~z~{{t~~z}~|{{}x}}z}|||x}sqb~t{twx}|yw~xuv~vyj|s|~}}y|ul|vvxrvzs|y~{}~{~}lw~xvxzjkv|}h{y}|rxz{f}f{n~x}}zwq}|{~yz~e{uw{utt{{i}|}t~x{|x||}s~zyx|x|z~vvyywnzr~x~{}}twx`y}}}~|}~|~]t~x}n{~|yy{~|v{u{}{xpt}x{{}{}j}|yuem{qw~~}}vy~{||}|v~xsyxz~}~tz}~wvio}x|~{}o}}}v}~}gvyh|uvwtuzsaq~zw~z{{{t}x}zwx{~si~tyxp{{|y}{}{z~~{{}ymwztz}}|{ztyp}ht|}}~}o|y}zy}xsu{{vzurzrz|vng|{}t~xo`iy|{~z|yx}u{}twv}z{sux~xxwy}cxsl~y|{w~|}~|rxwz~w|n|a|x}s|yzyvs{z|xv{qx}z~xmtu|vvwssy~yr||zyz|z|~xurvu}x}ziv}wvzrszry~||{|{|vk}~{u}~st}}{~|{w~~n|}}|~p||~|~}uzwxt~w|up|uyv}|tmmtuy}{ywz}|rzyuwwy|m~zz|x{|{s{|}x~y~p||cxstw||yqu|x{xiz}yur}zyr}uw|zs|{}x||wywwyt}~ytz}w}sx~{~qxr}z||{mvxw|{w~|s{{~x}y~zu}xyrwr|voyxuvywqz~~{ttr~|~y|vwx~|||www~|r|z}sz}}zwsn}~s}yphx{{xyqv}|}s{x|zxzww}|s|vsz~tz{|m~}y~y}vvu}~~vzy|xx|wz}~~}q|yv{}yymy~zzo~}z}r{x~xwt{w{}~rqt{t}x~}|~wuy~|{~|}suyt|~vuzy{xqwz{z{te{{qzyw}}un}~w|w|vswxhyw~zty|{hx|l~u||t~~t||s~}z}|ktu}xyyyv}o|}|s}{y~uyz{zz}~|||x}xy}~|~|~iz{~{~xvy}{|~}{~}q~}yp{xxzwt{y{w~}zzwz}xyz}|z{}{~}y~vv|}q{}|}z{~}z{zz}y}x~~c|xx~x}vzxvw}{~q}|z{zvwr{z|{zu}z{~|z{|yqvtx{{~yw}uw|uy{hzvr~~|y||}}{}{xz{xryw~zx|~w~wx}|}}}{y}~yo~{|}z|y}ysv}w}{r{{u}w}z~}zzr|~{|yv|z~tzpw~{r}~{}o{~x~|~tu~}}}~t{zz{xzxy}|}}~wzzz}{z}|}x|{y}{|vwtz~w{~~zzuz}}|x|z}~y|v|||~uz}~z|~~}zzyoz}{fqvzw~v}}|xr{v{~}~}{z{{}}z~~zyz|z|t{xiz~msztz||y|yy~uw{|wx}{|n}~x|~z}y~~v}~}}z}|~vy{{z{xy~qzs{{}~|~{xx}xz|~y~x{y{wtx{||||}~|}x}zz{{}}}~||ww}}u|{zwy~z}yuv}|zz}||t}||wkmq~zz|||kyz||}v}|zy|~t|wu{|{~{o|z{|}szq~{ty{}}}t}}{z{vpx~z{wzy}ry|~|w{|vww~||~|mx{w~p|w|}|~x|}usrww}~yz{ul~{{vs}|zytqysy||}~~|y~~y}~|{}tty|yzy|xyz~}w|yzvu}v~vvyyx{{|}{}s{zv{~z~u}|z}sxz}|{t|{vx{|y{zu{w|z|{z}||wu}ny{no|y{{}}|t|{~||}}{|z~v{~}pvqy|}~{{}{}y~~{}|vrsxy~}o~z{zsy|~|znz{y|zzs|nzyz}t~vq}}{|yzhw}mzymu}x{z{~z{}|x}~~|~h|v{y|wx}uw|y|y}y{zs~vz}{w|~{~}{y||~{}z~zwy~}~||sttzz|w{yu}zm{wx~^~s{{|}~}||{ps|jsz~|y{zxv}{q|xyz|ppzz|}svyz}w}~tvy}|}}zwi{{z{{}x}unxxxxwuyvx~u{y|z}{{xkx{z||xnwu|}~~z~yw}}xzz{{}~z}txw|~z~}z~~~y}{~{{{u~o}y|}}y{s|zwm|}|v|uvjy}yq|}{{~~~}vn|{{{{r~{x~{}x~xxnzz|z~|zz{{{}wvop||xy}~yu~x{ztw{{{|zvr~upwrw{}{{suy~{~~|~}}woz}y|uzz}}y}qs~}n}|z}y{yzv{|tt~~y}yx~{~~v}|x~yzu}|ux~{v}|zyx}t|z~{y{xv}s|punt|zo~z~~y{r~|y{{}txvn~}~~|z}~|}}{}~n{~}|yz{{jwzupy{}~~v}~|pw{{}t~zw~r{{}vv~}yrvvx{}z|{~z{iy}uuysuyqu{|}{|x|~}u}{{}w|~tz}||{|yx{v||zv~{yy~wzvt{t|z|y~j~w{sw~u|ux~|{}s{y~{z{sw~}x~{wyu~w{w~~{z{tx|y}~{~zx|t~zurxmq{{qv~{~~{w}x{x||xv{w|v|}q~}z|w{}||{zxw|dxyv~x}~{z|t{{~uwu}t|zfpzwz{}{~{z}wr}rx}s{~x~{yy{}v}v{q~tyr|}s{|z~{}~|yysp}}zz}}w{n|}y~~lw|}yt_}~v{tv{vv{x~q{vy}x|zqywvvqv||srwr{~{x_xtxe~||y]t~{qy{}zwy}sus~xz{y~zx{zy|v{{|}ly}~}z|vv|wq{ou~}|v||q{y{tw|w~z|z{|~~vu{}{y~v|rz||syzyypyj}wxy{s||~wy{~}t{fx|qrp}x|d}xxz~~pwxz|}yunz}pr~~}{wzxn}qq~|xr~lvwzqtwry}wrtwwv|r}{y}~zt}~y|{|{e{u~||tv{~zw~utnylzvsvmvw{tp}|r|z|xuxzm~~rkz{xz~{mzy{{pwzxyzz~yxx~v|~utovzyl|v}|z~zuzul}{~}}{~x{y}{}yr}xqy}yu{xn{}t~p{|t{{t}y{v|}y~z{|{u{~Xy~ty~y|rrzv{}tzr~|}nxi~~x}|{wxn{~p~u|~{v|}|}~]~{}}ju~y|||}|w{_~yyqy||~wqyv}}|{zwx{x|mx|~u~{xymrw}yw|{xx}|zw}q|v{r{y~|{~~|xzy|~y{z{vzus|ttx|~}o|}}|r{{|~umsy}mzwx~ry{{nyws|v~|z~wu~y~~zxy{{rxo|{t}}y|}~z|t{{u~}{ytoyvy~|~r~uyvztz{y|zx}{m|wyx{{yxvv|~~}rxwz|x}swzwl|kt}|~{u{}~i}~}yy{~}u}wv|y|w}}}}|~iywxzstzv|}x}x~zxqt}||~zw|x|{z}tyz{zy~m|yxvz}{}z~vxxz{z}wtv||zx}z~y||u|xx~}v~~q~}vy}zqwuz}{t}t{~|t{~zy{r{x~x{r|~yz~}}u}ts}|~~yt~|~wz}w}}vywy~}}y}|s|t|s}y}~{}{}|t~x}ppyx}}{~~{|rzv|{tw|ut~u}u~|s~}~z}qzktxyz~xu{xx~}~{zvwt|uyq}~xy~w~{|wzuy}y{z{{z~{~||w|vvy||zm~~~qtxmy{|tptx}}}xvyx{m}{w~x||{~|{ysyyz|}x}uzs~z|{uzt|}ht}F^|yz~}|xz}|js}vm}}y~}vu~x|{sbymu}ww~xxsu~z{vy~{|~~||o~vvyy}|{~s}zr{}x~|rrz{{~}z{ryx{|}zx|}~~t|l~~y}{wvo~s~}~m{v}zq}wx~wy|}qw||~~v~zz~x}x~}{x{x{}~}q|z|{zvy{}{{uzy|}}|~tw~s}|i~~wx|yyyy{x{}{~yq|^u}z|~{td{{}{s}|}{}{|vz||z{yzz}lv{zvy~s{^|~x~yzlv{|}xxz{wz~~vzzx{v|op}|tvy{zx}rx|}x~y~x|s}{|{zty|x|py{~~}~zvz|}{~|zzn|rzzs{}||{z|yz}zzzu}}{}{y||x~yx|}w}|}|}xy}w~~}xy|{}|}~vzsswyu{yww~xn|~tvz|{{{w}{z}}zo~xr{}n~|}{}~y|}}xwh}{}||}~}z|{ywwxzzz}t}x~~}ytz~|~{|z{q~{t{x{||ywz|}w{y{}w{|}|}~{~x}vv}zz{w|y}st|y}vx{~u~~{yw}~||~{v~~}{v~}kz}||{x}}s|sy{wyy~wu{|uz|}w||zw}r}w{~{|~yy}w|zy}~oruu||wsx|zwz}x|}}}vzwxxywsky|{|sw~{g{|wxzwwx}~}y{~wzzxww~s}~|||}{zy{}u|yzxyt~{ytz|}iy|nx}cy}}|v}~zyp}xnrz{mw~~|mfkw^|{tj{t}}es{{y|{p}{xw}pwzw{yv[{wywwm~{tx}{~syxx~vu~|z~}ljxzx{}ru{|~sn|xruxxs|~z{ss{yry|{}{sypyzy{{|z{}xy{zlw}oz{suuvzzax~~|w~uw}zmpuz}|pzrz|~w~w}v{|x}u~{z|yy}|t~yuyw~lx~n{|~[tx|bvys|nz}~|s||tw|vw~xw~~kzsx{{u{y}zw~}|qrxqot{}|z~tupu|{u}n{x}~wvn~{du||zw}vxuz~vpspmtyozttz|~uwzs}{~{mq{wxqe}z~~zxucy{{|{{{ttt{u{||v}w|~z}}{mxy}~zsyt}v}z|vz~~y|}~}~zyrm|~~~{|{{~}|yzv~y~x||tr{|zwz}wz{{q{|w{yxtiu~oqy{t~xxs{~x}s||tyw{~z|v{{yzy}zu|z}yzy}}u}wwy~||vuzv~z}}~z}|z{}|{z~py|{}y{}w{|yz{zz~{zv~|y~|zo~wuuyv~|~z~{o|z{~}w|t|wvz}ys|z||u|}ru|{~}}}{{wk{}v|{x|{{kz}{~z||rzy|v~ww}{kz}u}{}x|xszx}~}~{|v}~}p~yv}}|y}}yr}|z}uw}|xz~xzw|y{t~{mvzss~}t|}}k~zzr}{y{}y|sx{pxmw~}l||}ysp}||pr~~~|~}{ys~y~fxw|~{x~x}z~t|{~wv}zzxukwv}xy|wxu}~~}s{}wx}w{u~zr}yw||{~}~tz{p|w}{||~zzyy}x~~yv}~|u}}}}xys}zt{}zw{{y{}|}y}t}x~}~x}z|wy~xy{v~}|{z|~pk{~{}xuw~}ztw}|~~x{xw~z}xszu{}}zxvvxvxg{y{w{|wz||z{~lzzz|{~~|i}}|~x~}||}~su||{}r~{wn{zx}|{{p|mx|{y|~|}|{~}{{~p~}l|}}zt{wz}{{{pyzsxu}}|w{~|{}}thm|m~z|v~z}xx~vv{v}sy{vo~{{s|r{xwy{}n}pl~{yywyu}u|xuzz~wq}{wxvzzyyx|vw}l{~wv~y|x}vwz{|x~{w}qyzwyyvy~d|}|u~op}vu}}~ysjux~}}yxh}zyy~w{z|}u~|}z}|oyy}}s}y|uuuzr}{m|yqr}}{{tx~s|q~{~{g|xzvkxu{i|}uyy|x}z}{{}|vv~z||gzovw}~}{w|wwt||{vxx{u|~r{}zw|lr}z]|}z~}~svstz||y}uryx|l}w}|w|y[}w{lz|xywlvy~z{~~wg{|n|vl|v~u{wz~xx|wp|w}w}z|{r~yoy||}|~yur|n{yu}~fzozuv{|yswx~}wxzl~ywt{v|yuty}mu{u~}xxzx}~{z}zz}}||yyw{qy|}z}|z{xzvxZxy{n>t^u|x|x}{y~{r{z|~|x}~v~|y}v{}w||~wpx~zxn{truy[zv}|w}~{xx|z{~|xy~}~{xy}r|h{zwz}~t|zu}r~{{wz}}z{|~wxz}|yyy{{}x}}puy}{v|t~zxr}}{I~|ww{~|{|}yn}x~{}qyv{owywt~zt~}~p|t~vu{Zxs{}iq~x~v}qzxeyqo|s{}|uu{v{z{yv|uvt~qm}]siuYxqxw|zwor}}}s}sywu}}yzxzyawz|}|z~~t~wyycsny{rgwz~r}{{rw|zvs|l|zuwcstx|~y{{v}||||yy~}zwz~~~|y~x}~y}}}}yvwu~[||w}|yzs}y~wpnxl~~~~xx{uxzh~z|~}}|~~~}p}sy{||~usw{}zx{}zx}zr}{w~z{zv}yx~z{kus}v}z~z}~~y}uw}z|u{||{{v|y|~}~}x|}qynt~zy~w}zzoy~~z}{~{yztzx}|yry}~{}}z}}~z|u}y{{{}{|}}x{y}||y~~|zy{~twwz}x}}{k}{}zv~|}y~|x||}}xsv{quz{}t~wy{yt|{}{yz}wzv~~utw|}{yz|ux|}wy}z~{z}~}vw|zv}}yw~}{}|v{t|yy{s{|~x~}zw|rotyyuwxw~ytt|}x{zy~{~zx|~}u}xx{yz}~~~~~|v{xc{{tw{}~{}}~pz{xxxo|~}|~|{pq}{u{w|~y}{w~{|z|{phv|}zws||{~xpuuzzs||{{xyu~z|{n{z~~x{}zz{|rvy}~~{{~|yyvwwr|~{yj||{yw}vx|~|{z{{~wz~s{|v{}tyuz{w{{{xvz|j{x|~x~~yuuxy{|t~xozz}}y~uz|v|q{{|y|xv}r|q{|}ym~zz{kwwj}{~tyyzxyr|~u~ky~x~qvswmx}}|nx{zruv~{mztk}xy~zsrv~|w}}y~{}t~s}{}~lrvn||y|xzy~z|}~}zx||u}zz~z|xsyx~{yu|}v|z{}}{y|||~|tds|y}{zw}v|zz}myvxuzrx}utdy{q~ppt{~_w}q}my~~o~vx}O~~~|sr|ry|}v{zz~y}p~}|~~ky~|vzz}xw{y~{yxo{yt{wsv}w|~xzy_{ux}{y}{wh~||}p|}|qt|yyr~|}zx{\|dv~yn~|uo~}~Z}v~~i~|rd~}y|s}|pz}~y~sy{`yz|w|z|o|s{~xwz|uyyr}{y|s|w{{wzwyz}vyi|{ss|~W}}fzy}u}wzwy|s|{}vzsx|Rrrxw}~|}~z_tzp~{r}xw|uxv}z}l{yv{q}ix|{iho~wywuo{{~v~~xzyzz}~x|x{xy~yx{{|}|zy|~swr{z{jl{wy}}||}~~}s{uw}{t{zwrp}}}|wk}|{ut}}|~|gwvsx|}z{x~xw{{~~tq}}{~}}y{~|~}{w~{~|x}}}o}j~z~ttow~sz}xy|}z|tu}~}}uxn}tx{}}}~yw~{voy||}~~~|{zz|vw}{}xyxw}}s{{rxyy~xzzz~}o{y}}{}~qz|os{~{y|zr~{{x|v{{|~}zyvsz}yx~{zx~}z{rzyx{~y|~}~yy|u|z~~|}z||v{xf{stzys}~z}y|w}|}}~|~{z{zt|rx|z|v||ov}||zwi|w|wy}}v}}r}}|v{uq{~~wx}v}}{{}xzz||||evy~|o|y}ox~{z|ys~w~~{wtnvmx|z{}~}}}z{{|~wzz|xzsu{{~wy|~~x{x|w|{z|}sy~yu|h}}wxt{xzyy|vs{}{{zz|~ys|}~{}{{v{w}|{}y{zyu{|w|~~{z|}}|z|rtvv~~{||~xz}~{{zzwviwuz|u~vx~ty~{~~|~qu{y|}ovz~vwyy|x}~y|xz{}zvv}|{v{y~}t{zsxy}~|}y~j||{t~u}yz{{{y{y|zz|yyz}}}~z~zsz}}}~~zy}wy|v}{z{~}xyvzr|~~z{u}}}tz~zw|}s{{xwx~szxy}|y|}}~}~{}ztv{}y~y~|{vxpw}~zz~zz}t~zq{~t|u{|}y{}|z|}zy|}k|xtwvzs}sw~v~{ft{}u|t|vuzox~w}tt~{ktvzzzy|qyttlpun|tz}{z~y{~}sustr~}yt~y{~|}nyxx{lsx}~~{s}w|utyvx~{y~xytm~kux}r{z|}{uzz{uryq~z~uwo~~p|{t||~{yxz{t{yuzw|ohx|v}u}tfw~vlost|z}y}uczx}ywt}}qvzxsw}zw|zwwxs{}w|{~p{|~xfz|}|}{x{s~{v|zvw}wx{w{z{xrxy~~uzm~z~x~|~}qvvwzyv||muvz}nw|zzzv~u~ut~~j}{uyozy|xy~xt{m|yz~swvuv{~|wz{}tt||xrz{wqvwyt|\w}x~w{{u|~}yx{|z{~||{}}w~|||yz~{s|qy{{}tuxxtx}q}~v{x~}~y~||{|s}z}{|w}tzw~x{wtzz}}||i||{|zwy|zv~xz~~x{u|{wxz}|n||}z|~{x||r|~~~{~x{{}x}ypm{~}{}}}wpw|v{{}}pz|~~~|wy~|~zy~xz{z}|yz~}}sv|xyt~wrs{}~{pu|}zrt|~{mm|w}rz{vi|ux~zzx{|zxx{~zx~o|{{~yz|yzszxx{u~vwx{~{zy|}{ywy{{|{wzz{{x~{~w}~~y{xsyyyzzx}z|{t{vo}}|srw|vt{s}~{z~{}y|z|i|}x||rwx}yq~v~{wrv{y}myn~t}gtu~q{{w~zu~uz|u}{~x|x|wywz}|~{r~nyswy}{q}}{wzzzzxyw{qt{}}|zt~[xstzu}~z~{|zjw||}yyzyy}zt{tzywy~x|~}u~}yy{z|vv|xyzy~i|w{|~}~u~zu}{}~}um|{|yq}w}{z{yxyes}y~~zwe{~|}{|~{{~u|p}x~}}g|y~|s|p~|wz~yz~{}s{z|}qt~ystzy}v|v|||}|{~~|r}{v}}l|x||~w~~ys~y~yw~rtyyz{t{zzzyz|}|x|~`zzwuuxzzs~{y}v}~x~vz|}|xyw}{}w{|}y~s{~}{}{zwx{~o~w}{yp~{xv~w|{y{ts}u~|tv||{~~|x||}yx~zxzzy}yx}~zszzyu~|wzp|}z|{vx|u|~|}|t{x|ymy}|xv{yy|zv~yx||}xzsv}}}}zz|oyz|yxv~||{z{}{}zz~|z{zm}{x}y|w|x{jwzurv|zx|w~{|t{q{zx~yzt{}|k~n|w{{||{xtz~|}{{pt~zp{z~s{}~z|x~~mx}s}v{pu~yyz}}zqo}|v{|z}~yyy~{zy|zvr|h~}wxs~ys{x}|vm{{~v~}z~}vyy~}|mxyyu~||~}~|vy{}z{|{qz{ru~zx{~~~zz{|{oy~s}wx{v|x}x|zyyxk~yg{km{{{~~{ul}t}vrxr|~z{xz}zxzsx~|u||}|}}}y||suyz|{rwy|zw|}{}{~~r{wk~}{~q}}}y}y~wp}{~vxo}y}xz}|tyzt~dy{ru{xt}w{h}{{{u}}z~|u}~y|||z}}{{{}{|xtzz~|{|tw}|w||ut|wyq||}zJw~us}uz}~}zs|ygzuw|}y|hy{zzvg~~vwv}u}|y}t{bpzwt|{}xq|wwp}d~k}~{yn}z}~|~v{x{|z}zzyko}d|w}znuv}vx|x|~}y~~{zwu~yx|y|ury{{x|z|tvxy~z|~w}x{v|rz{r~x~}yt~t}{|{|vywx~~t~uz{||}m}xwv~z|{|e{|wzi~}txnUum~vs}{]z|~o~{yx~sx~{w|z|yv{n~~yv|ux{trzwyr}zt{~}u|x|~v||{x|xw~vuv{{n}{w~yiyyzp}~||x{{tv}fx~~~_}zz|~qw|~|zu~w}{xx|ut}t{|w~nvv~x~q|qx{ztzs|}x}}yqz~~z}z~x{xx~}|}|wt|v}y}w}||Hy}x~~x~y|vng|{jyspwv|~rx|~UxZu~}~s|{ynztt}wvi}|z||~{~zvu~x~|zr{zuwdzw{ujuzyzywv{suy{xwxzvxzu~{|y|vzz}s{vo|ttb~|{y~doy}~xt|zwx{|xz~w^{xla{n|z{qu}s[y{|s~|}sr{~}~oy}t}yt{{|zwz~}v~uz{vg}w}}}~}x~|suzqsm}~|~k{|vd|||}}x~qy|yY}z}|~}}x{mr}zw{y~uo|y}{zn{zlu|}|zsvwzz{{~oonxwz|sw~yynt|x|{}z}~}~r{}{y|}{|}~s||||}xzw{~zyn|ouu{}|~z|y}}|}~~zunx|yr||wsx}{ux|~{}{{{|yyy}m{v{}z{tz{tuz|bxzt}||z}o}}z|{{wtz~yzzx~rwwxl|u{~|y}}uunyy|xy}{vv~}|zz{zpsvv~~|~wy~v~}x~}|vxz}yrw}~{|w|orwtywwxw}{~|yyp|y}y~u|z~|}}j|yy}jw|~y}xw~ztt`}}}x~c}y}uk~|y}u{}~zw}xykzy|}xz~|~~xntx~}~}~ztssmdt{o||}~}}u}{oy}~wwu{z|q|p|}awx}{w}{}xv}s}n~}s{x||~~zz}}}~xryx}y~{r~zz}ywz||~|}{}{~~zzvp}tx|{hzx}}q|pyo|~sry|y~{zz|}~}{m}}oyu|wmw{z{t|}{y{{}ty~|x}n}{lwyz|}xy~zrj{u{y~}xn~{~{zw}~z}rppz}zi~}zwrk}}ztv~z{~|xg{}|z~~vy{tq{xtz{rk}|}xyy{ryzz|iw|sy|worry|}v{}}r|pzw~z}z{lv}~x}~pw}~~~||syux~zzxz}w}~|mwv{~v~|{{y~zzz~{w~uq}~uxo~t{~wyzu~z~z~}zyv}{x~xw}srytz|y~||zjz{vs~|{~||w{}|stv~yrx}zz}u{}sr~zs{psvxry}{|x|z~~}~uy~yr{svz~|}|{y{yu~~}zws|~~z~|{}|xx{|y|yuv{~}}xy|uu|vz}~q||xx}{}{~wxwz{{}~u}w}zq~yzw~x}~{x~s{z||}uty}}z}{|yuzyr}yyw{y|sv{x}ut}~y|w|}vwxvoxwyz}{{yzx|z{~xszuy~z||wz|x{tw}|z}}{z|z||zyu{m{~}|zz~}y~||y{~|wwt}}x~~}|r}~{{{~|}~}r}~{yx}|y~~~{xry|wlzyy}}zz|ywzrt{}}tw~xu{s{x|y|x~x{}~~s|y{rs|wxyt|z{~ys~u}z{{}{wy~}~xs~sz}v}vwyuzzuxuu{x}{u|wxvxx~zxw{~oxozrz{z}r~}vz~~~xo}}~x{{yz~xx{|z||u||u~|{{w{||szzy~|u}w|u|{|yu{u{oxuxw}|}}{{|~zyy}z|t~|}y}l||v|}|uzx|xo|~}|zx{z}~|uy~vvwz~|{u{||sy~rxwx~}y~|}|ryzzyz{{{w{wy|{}wwx{|yuxz~z{~wywzvt~qyv|z}vsx~wyxx~tuyz~z{w}{w}~xzzzrw|}ww|vtw|{uv{xl~z~}zzt{{uz{ysy}~xs}nzz}xz~uy||}zst|{|~~z~{ykzut}||u|{yw}x||||z~|s}su{|z|zvz{vyrs}~s{f}w~}}~xw|v}w~~{{|{z|x||{}|f{w~yw|y~z|z}|y|z~z~{y}xzw{}|}l{y}{z~v|jv|y|}{vnu}u~{{{v~z|}z{u}s|xyz{zvjx~~v{|{xz{s{y}wvrtvx|z{~{|~|pi}~{}}|z}||~{y|}~}|vwX~y{z|ztx~~v~|qay~y{|qyr}|}}yx{~}{p}}y}z|{yzyxxs|}}|t|xwwtu}|}|}}y}z}||~z}wq}~wsvz{uu|}~x}v~yxcst~q|{}}{}{~zq{z|u{vy{~|~|w|{wz~|pyr|}~~~t~x}y|}w}{|sw~}k}{yytu{rv}{szyz{|~v{|yvwpu}{||~{qyy||tx}pyy}u~{|}{y}y}}y}yxg|zx{~wy|~~uwvx|uyxpz~~ohv||vz~~|mz|oyws~~~p~~wp|}t{{z|uwu}u}xy|}v|w{{~wx|{|ww}y||weuw{{~vz}ux|~xyozzyy{~}zv|~xr}~wx}}{z~~y~s{u~|zwzvq~w~{zr~yqqyg}q|z~uz~oyvvzxy~wyt}t}uyqsv|}z}{|||yzyt|xz|xw~tzry~}vy}yz}yyz~r}|qy{w{t}~{uvp}xzxwuyu~zt||zu{z{owxzqyxwwy{ww|yw}tx|t}}zzzqw~vyzxtryv|xz|wy{{x{}|v{}~{u~tt~z{}x{z{~vyzur|t|tvt|{qv|o~~~|zy~{jxz|oolw|vyzw~~v|ry~~x{}zt{a}uzywr{wxs|~~{{{p}xy}yy}s{uyr~}r~vzwx{y}oyvr~q|{zu~{|xyn}vy}yw|p||xtsq{xz~}ryu}wn~z|vxyxylz|xzz{uz}~yvuz}xzzvyxx}z}zwvf~zrs||u~z|}{~x~uw}z{{{~}}~~}z{z{o{wz}zyw|m|{u|ptwxu~w{}u|z}|ww~syrzuwuz{s~v{yzr~u}x{x~~y{xvzp|~y~|x}r|}y|{u{~{{wz~~z{~|x||{{zzzqkz~~|~{||yrz{{}~yy|}x||xz}}lxu}x}{~~zyw{zw}|Wz|~~~~}}}xzy}|wr{|}~z}}vzz}v~{k~|~||wx~}~|~~~}}xowzzz|zyw||~}}~~~}zyzyt{y{}{xz||s~w|u{{}zuv|{{wve~|{x~}swv|s~yzz|v{{}u||s}}~~}~~w~xy{|}~o|zz}|g{~|v{rvhzyw|z||y|{rs||w{w~u|xxvro{~{~|~vv|z{~}sv{}{||~~v~~v}|w~i{|{~{xzx~yzzz{zq~~||n|hk{zq|{zyw}}}||yq}|t~mxu}|}{r|w|qyuyx~{w}}|}im{x{y{{}x|y~||}||}~{fw{z}xzz~~j|{~{}tz{|n}v~j~}y{tx}}pyu}}~||v|wu~}~v|~{{{vR|~y}~{}}}|q}~iwx{}}}o}{yx{~n}|||~y}m}xz~y~s}{~~|{x{zn~|}zx}{yx~{vv~z{}|xw|z||v|t|}|x~{~xst{px||{f}}|w~}zug~zx||yxd{|zx}~tz||{qs~y}wy~p~yvxv}zx}y}|x{|z}|qz|{|kvwvypuym}qx~~v|~qz{vyyyywz}}t}{{zw~{}{xs~~~{{z}~y|{w{w}{}~{|vu|yzyzu{y~xy||}zz~|yqx}uzd|z}~{}{}z|{z}v}||w{z{y}xy|z|{su~zv||zsv~z{sz}zc}}xxuy{tr}z|xuv}{}}ww~|}zyt|||}|{{}zytty{}z~z||w|}ozsw{}x~{~vt{}s~||ztz{~y~y}}v~y~~xy~t}y~yx||}yvq}xvtzZ~ourxy~w|w~~{rvy|qx~|w|{ym}}z~zywyy|x|}vwv}~|zz|z}|xzxl}z}{u{ps}y~}vxh}|yv|y~|zy{{~~yu||{~z{|o|}v~{yctvx}pyzv}ypq}{}~y||}szv|r{~qzo{~y}||~~}}x~vsz}ryy{{u{{{|s~s|}u|~zi}~|~~lsx}tx~}{y}~t|{y{}ux}uvyytb|u|{{}}z~|zvs}{|}z~z|||~qv~~{{}mz~|~{~~t~tovxt{z{o|k{|wx|~|zz}y|v~wvx~~ww}yo~y~i{ovt{ys~quy|xy~}z}v{}yz~{jtx~~}~~wou~|x}}{{w{zz|lvtyy|{z|zx~}yv{p|yurw{~}pr}y}wly||~x}{wwrwv{Sy{vz~u}ysxy|{uy}|}}yw{vsvz}xyy~s{~{{~{Ry~{{x|{|y~yz}{z}pxtvm|t~zxww{yzv{xz{}zxkyszx}yp~}}xun~|}zjx{M{z~||{}w~su~z~u}|}z{vyz|xyprsy{xw}xk{zsx}y{{xzx}~}ztvu|~yxyv|uyxt~w|yvz}{|{|yzon~{|w~~}s|{y|zxyysnwtxzyzury}p~||zrz|zwy|u|{ww~~x|nzzwowz}|u}z}}wwxs~zxuwzgv}vr}xvw}}{~~xx}~x|}nxxw}}~yyuy}{n|tuy~u}}zz|v~wp|v{~jr}|w}s{~{~|{z~txsi}tx|{zxt{~w~~|{||w|{mv|xz}xu~u{m}v~wzz~x~{{z{}zpt}}}y~w|uuy}L|su~~~~wv~yxpq|n}ryxr}{}xxszxby}yxpwzm}||uu{zw{~{|||zx~|{|{}}{v}~i{{}y}||wlpoyxyyw~wz}{|{uyx||wxy}~}|p}~~yutu}m}}~m~ztzw~}{}~}to|{}~rxx~||{zt}{w{uy|}w{}ztt{wx{uv|}w|mq{yoz|x}~x~xy}yz}~}x~}}}|z}}|}{|{yzz}sxxu}{{|~||~xrw~r~w|{z}~|r{~mw|{~y|w~xv~}|o|~ox|{}}|~xy|}}~z|v{zyr|{}|{uxv{vzyux{}{|uvo|~{|}{}||nwvw}|~}}zzx||vzi~|x{yw|}||~u{|m|s|yzw~x|o|{}w~~|~{r|zt{{sy{~t}x{ux~}}z{}}nuw}~{az||vx}r|~y~~~tvs|}}}uv||zwo~}~v|{}}x}~}z|t}}}t{n}n}qzz~yz|~yw~vxosr|y}~zzs|}{ztxz~~vvzztbzu}|z}}|y|}~iy}}trt}{y~|x|wy}{}{y||{~~u{zyy{~}{|ty~~uxy|{wu}|z~sx{xwt}~~|y}}wvx{{|}z~w{yz{~vr}w{||zuxrx~~t|~v{~{pzx{}uz{j|s~xuz{}q|}~~xx}~{~~z}}}}{w|~ty}}zu|{z}}|~s~sz{i|ryy|h{}}zq{|}|}~~yq{{ux}||||{xz}|}}~|~y}z}z|xx~uvpw~~x}r~z~y|xw{z~zyo{xw~w{v|xz{~}|{|xqvw|yy{vty{{|}rv}|vx}|wy~~x|}vzur~x}qp{}|tyv{g}~x}}v|}}~}xr}u|wu~yyzxvzx}~qvy~{|uxz}z{y~y}x|~~t|}|~uxmr{yvyszw{y~}zxxvz~~l|syw}{vzy|n~wz}|~u}|s}}}rvr}zyzyyun{y~}~}}|xxxvx~||qxw{uo}w|x{}ww|xxv}x|ytz{w|tvy{|y~w|xuyz{}wz||zrx}~{}~y|p}~~y}}~|~|yy}{{}q~~{~|pxz{{}xrp{~~|w{w}w|{{}x}~xx~}px~{ywszy~qsnts~}y|x}y}yys{}wyxwsytzz|s|z}xz~|y}zvqtpvwtyj{y{|uk~}}qzz~wszwzZzywzzyw}jz~|x|szvy|{}~{~~~{~xbzyz{yy~~|v||{{|}z~~|~yy|{z}zz}{t{xz|z{}y{~x|~xzz}|}{~z|~wtz|zvy{~~k{~|}~~}|vuyyxxz~z}rlyr}xyf~t{~{}~|~{|xz}}xz}|z{~{p}}isyz|s{~|v||uz}s}}~|~|{}q|sz}{xvw}{xx|yw{zyhx{~~y}z}}}y~vnrjuv{|w{~z|w}{}~y}}zz{zw|mys~yz|z}|||ux~l~{~t~{z|}smx}yv|}x~zozz|||vywr}{{x}wywtw}y}{~{z~yx{|w~}k}~z~{}{~qysn{~{g~v}|pyjy}zz}}|z~|{}}wzv|oz}{t}|{}~uxx}{x~||r{}yzxv~~ww{|}q||y|||svs~y|{~~zzzph|o}}y~|y~||}{ww|v|{~{zzuux|ty{twt}wy|}{~_{z}|lv~|pzs|}|s~xxt~~}n}{}~~q~t}}|z}sv{vw}|~}}y}{{nzt|||}s~~|}z}nv~~}v|rqryx~yz||v{}~{{~y}z{}qwyrzq|~}~|{x||}|z~zsozy|xv{|}z|~~xz~|}}}pzqx~z~~s}}}|}inf~yzx|~}y~}x}~{|~zw}~wy}~v|}~y{wy{ywvy|||{v~|{{y|kuy{y}yy}|we~q~zw}v~~|~~}q||~yz~~~~qp{{t|}}w~wu{wty}vvvyz{qvz{|{{|y|}~z~}wvyzw{||r~tbmv}z{|{{{~{{~wz{w||x}x}}su|xzvxy|o}}|mt~|y}{|y|~w}|{y~}s}~z}|}zm{|}y|xstxyyz{w|xx|}}{~}vwy{y{|}~z~svx{w|v|zvo{~vx|{zqzxxz}~s~v~|z}}ysx}|}~uz{{}{}}w}{wxv|}vz~~}{{}{}fwr|~}v{ttuy|~u{}~}{|yzyy~x~~~}vukw~{}yx}|mwzqz}{zy{x}~}zwzu~|~~w|v}{z|zrwjxx~xy{vfx}wz|zx}zz}vq}z~v|v|z}n|yx}zz|qz|~~|z|u~x}sx|}}{}tv|t|}zwu{x~t|zs}z||}vvk{~y|{t}~s{{txgyhy}xu~|zlvw~~~q}zzx|~pyy{w{ly}s|rpvy{|o{|vwy}vv}{r}{~xr|zm|pyx{w~x}s|{ywwoywt|~z{||yx~|y{|vt~x~{|{v||y{~{uussy~rzr{os{{j}|v~z||zz{w~u|y}|u}yzv|~x}wz{|w|~vs}}tzyu~x|rw}yw~vv}ut|x||ysvx|os{{x|~{{~~xr{x}|evp{vt}zt|u}tnstw}w|}}||tz|r~~u|zpxupy|~|vz}{|~~tut}{x~~|t|}}zxws~twv}q|{{|~{t~t~yz~v}sy~x{z}yu~yw{{ty}ptz}y}~~}~~w}||}z~v~|}~s}|{ux|z|y|}wu~x{px{{yx~y~w~~p|{}n~v||u~||y{{~}|}vym|~|~~~|rv{z{~s{{{}~xw~}~{{|y}{y~s}y|~t{{x}|yy{t||uxv{~}{wwty}{wx{}zuyzvvu|yzx|x{}zx{||yzu|y~~wuy}rwyz~zvyvyw{{|z|u{w{}~|xy~z}{|x|y}}|~{|{wrywx{{z{rx~~|v{yvzx|vu~w||{{x|z~||vy}sxy~w~~{|zzx{y}z{xx}|w{}~o}uyu~|{yo||w~{yz~~z~yw~y}ytzv{xwu|qw~{uzyzz}}~z{{}{{xu|}|}||{xx|asby|~~v~}p{}{z{uxzvoz|}y}r{k~s}||y|z}z~wy{xxvw}r~swx{{l~~z~z{xut~}}yuyyv}z}r~{|z}zty~~|{~u}rv}uwsynywrx{}uv}ys~t~|}t|pu{||w|}vv}vr{zzxoxw{}~y|uy}z{|ty}x}u~|{{kwzw|y|~w{~tz||~xv}zq}vty|z~u}w}{}{yxv}zt{|||wnww{t~{xy~{w}zx}|}xw|~vxryvu~s{{zrzi~yz}{is}|z}y}}{wz}z}~|{yg|}{ys~vtz~{ty~yv|}}xzx|y~{}v}{~xzzzz~w|v}}~{{{w~z}~|swxzsy~xlj^~x}s{v{yuz}z~}tz|zy{|y}y~xrzux}q~xr~st~}}{ovz~{z~}yup~|~~~~y}~}~p|ztwz}}yly{~w~wz|{y}vyz||wz{~uxxwy}xzz~z{tuz~mywuy}~{uw{}~|z~||l}u}~|qz~y~~}zzz~}~w|y~}}lu}z|~yty{v|g{~z}~t{{~~wz}~~vv}tp~~|wu||~x}t{f|t|owv|~}qr|uv~|{~ww~qrp{|xu}~}y{}sz{yxlwt|~}w{w}x|~}x{zvt~y|zyyu}}y~t|m~|nz{|||z|ur~us{}z}|{|z}yvi|||}{~~y{x{x~v}~x}v}~~vwq{}s||m}{{z~|zwz}|txuy~zyzz{~s}}uxu|zx{y}ww{{y~wiu}yw}~}~|{x~{zzy|~yy}w}z{~||y~~~|wu~z~xzy|~|{{||||vw{|w|xqu}{r||zz~~{yyxt}q~||{yv}~}{yoq{v{~}~||}~~ztxtu}z{}y}~|}}z|zx~wzux|zq||w~}|zz|zwxn|~|~w~v{~z||r|zz{n~}uyzztv}vyy~}|z~w}~|{xw~rt|wu|~~{wt~h{{|u}xp}~}yw}xs~~|z}v|tvz{x{|uz}suq~yv}yzywxyw~~vzzs~~z|zwu{vz{zsytyy~}|vy{zzzz{zzy}yv|x}x}{}~xz~vy{}wz{~|nz}uqvxnlx{}}~}~~l|~yxtst|wvz~y~wz|{|{z}~|xy}oxt{r|xryxyc~}{zxujxyx|}u|tyyyt|~}t~{pu{{x}nxw~|v~ozs}~}zxrv}~t}zxqzw}v~x~~xyx}s{owz{y}yp~|~r~zx{xnw|r~~}}zr}y|{zywp~wzqm|}}wz|{xw|u|{w|{p|}{u{txpr{xcz|y{h{~|x}s{}vzx~}wyyfzvy~t~|y{r~}w}uzz|v~q~}q|~tl~~zyx|v}|||{}{}~x{q|{||}|{v{ww}{~|z|t~xq}}us}}|zztzpz|z~|z}}z~zu}t~|n~urvz|}{xxo}zyxx{~l}}}|{u|wyx|g~~zzr}kxz~}zn|}~}yr~~v~w|nyp~{v|}xz}~xx}qzxrx}|w}}|v|q}|{xyzw}{x|z}p~|}xzuvqri~{{{|y~w}{|zp}}v{{}zuuu{}~wvu{z}||z|~|}~o~xyq|y|~~}{s}zqv{z||{ryu}o}v~|xuq{s}~|}}~w~x~|hzy|z~~|{wz{xt{vzz||z|{oy{{{u{vx~|xyy~|v}}vwuzvx}zuynx|ty}}|}}|~{wo~vz{x}}}y|twz}zrxztzk~|x}qw|{~|~zy}{|}zy}ztr}z|~|vzx|u{{s|v}|~v~y~~~{x|t|m~}x|||~}z~{w~pzxzz~}y}wv}tw~|t}{{rzv}{||zz{y{|||x{x{zlzzun{}x{z}y~{wy|{w~}}}zyvwo{{}hw{uyzy~{~||}z|i}{y|{|rw~zx~sy~x~~ztx|{v{{x~xwz{z{yxoyxv|}wx|}||}}t|~~tzv|{}~wy}zw|z|{~}~z~}|}uz}x}|yzy|z{w|w}~z~|w{w}{}|}{z}|z}yv{~}rz~|}}}~{t|~y}xwz}xtx~||{z}z~~yx{}w|z{}v||{|qq}w}wr|}z|s}{}v}}yzwz}|y~z|xvu}ywvuz|zr}z|yyzrtspfs}~y|m}}y~{wlwwx}{vr{~{||qu}~}}}}xz}}ys|y~xv|~xy{}~|w{}|z~|z~|wzuFz|xz~}txwvy|yxrtyz~yz|}z{tzztzw|~}{~z~zt|xy}ym|~z{uu~~w}{{}zy||txy~{z{y~}ztv{~yw~w}xrx|u~x}}}h|~|~|}ezxuwzwwl}|z|{zr}||}|}j~}tvuyk|{wxw{|q}}y|}q~x|xv}}~~u{v|}{t|xwyv|y}{{qr|~~v|{wz|y}y}tx}{t}|x|{zy}~{z~~}{{w|pq}x{v{{l}uzu|}}l~{ts~wzw|~{}{r{~u~|{r{||}{~mv~}vnx~}z~}ww~rx{~}}}s{{mx}}x|uxzvzz{|x|}||uz~||}x{z||~z~~}{wuy{k}zywzz|}}y~zzx~|p~w~~yw}{z{o|zs{yzxzm{l{~v{drw}w}s{s}uuvvuqyy}syz|yy~~yuw|ou~x}|x|zyyt|x~yz{xyxr~w{|wtqww}}}{z{|suzq~s|~xzyy|zwz}pw{lxsr}||pyw{z~~zq{y~yoy|{r{vs|z}uv|s}w||z|xx{vt{x}y~~s~}vu|{y|tt{{~qxxyt|wyd|vmwwzuxq|~vypx{t}}~p{{~z{~p~|uy{s}{~|wtvw~t|y~u{vz~}}}}u|qw|z~uxtuztvz{|yq~~{rvt}|{~||{~}vzv{yyy~uupv{}y{z~{~y}|y|}}~m}zyz{|u}v{|}xyy|~~w~wq|vy|u|xnxzxzx|v{t~y~puoz{{~|{xq}{x}}|}}|m}~wzx~t|}xz}u}}{xz~~zyu{xv{}ux||}~{|w~vzyz}yyt~w|z~p{z{~|zzxxsuz~x}}}zzumy|q|{|~}xzzsxwy|uz|z~{~vx|w|{|~v~}~r}{|~z}qvvqxz}}||}~z~}~~x~v{t}xwy{qvy{z}~{}m}z}y{|jx~}z}}zs}}{}}z~~zz{{twk{{~{{}qyz}zruy}w{{{x}w{|z|v{{vz|z~vw~}y~~}}vz{xvtwr|~zt~~~x|z~svwzxz}|y}yyt~~y{||xyu|wwx~zu~}{s~}y|}|~{{ztv|v}||}u~w}|wxy|{r}{{|z~~~}{zy~|p|wxz~xz~yxx{z~z|{{wywz{~~xu~z|ww}v|~|{|~{j}~~}|}zz|zxu{xur{~ztzz|~xx~y}~~yw~{|nh|v|z{v{wtv}{wq}}z|~~{{mxtr}}xwx}t{x|zy||txvzzotwztutxww{{~zp}xv|z}~ytt{~zy}yvz~}}rzu~y~{tzvzxy{t~y~}w}zv|{uxz{zxs||z}v}{{}x{z~yut{yx~uw|z|zuz}~}wxy~ox~|y~wv{p~v|z|hzry|}}wr}|z|u~yxs|wzzy~wt~q}syw|ww}|{i|y|yxpu}x~qtu|tz}}{}|t~y}xx}}yx|}|}z~{vyrzu|}wp{u|zu~u~z}rw~m{xq}y~yyw}xswntvvvvp~v}|rynyyk|}}~~~v|xt~z~s~z~xu|{}yu|yw{zxyzw~~{kzxy}|zm~~ysv{xzwz~tx||}y~~~yyyy|{z|}|{{{~~|z~d{{|~x{zpswt}zsyy{{qt~{~||x|w}{{vlwu}~|uvwzxtxttqtw~|}{vx}z{}vz|svv|zu{qywy}~ru|w|~s}vuvvlw~wt|ww}uwtyx}u{|v|y|vwyr~jvz}|ty}uw{|v}vzyywpsx}{z{}}u||x||}{r}|ypxu{w|xzyr|~vpzzs||wx~||z|v{}{v{{x}om~rz~{{}m}y}uwvx~{}y}|km}{}|uxy{~s{v~}||xwz{zzx~}wq|x|}wy{|uyyx|~pvw~{t|u~}z|w~}yw~r{ts}y{u}s|u~}m||~{wqgyzwzznyw~}wzqw{xt|zq{{yyso}svw}}xx~p~k~}u}w~zx}wxu||jzxrutzuzwsyx|tw{zwyr|x|ywx}{w}~}v{vrw{o|}xs}|zt}{to||~vzvwy{|{pw~uoswx~utvnzw|y}yv{|zqxyzsn}}}yz|{tbs{w{~wx}vziy}|uw|}~|zuvv}wuw}ws~~~}|yt|}|ty~x}}t~~xvuyuz}}lv|mtzy{zt|yszzxuz}{i~w}|p{ztw}yn{yz}yqx|zXycy}~t~{zltr}~uwv|}|rtw{z{}~{{~y|v|{~}~ysxzyj|v~qatshvuxw{||}v|qx|ztpszvc|yz}qz{zv|~zzy|{vwx{{stl}z}uw|{m}~z~lqxrqoy}{|s~{n~~xv{}}vywv|rwjy}t}wx~sxrj|x}~~vyzz}{w{{|yrwk}o}uyxzzx}~n~|nyzm~zwryx{}wu|~y}yrjwtytvmxy~x}~}|qn~yz}w}n|rqz}w{w||vw}}r|{{p|z{}ww}y{~q}sv}}~||jt~xyxvw|{}yy{zxz{}||x|{u}x}}uyxz|u|u{{y|{z{osy}vyz~ot|u{|f}}u|z}rzrw{}wz{yz}~qt}uyz}~z{~mx|w{|v{v|~~x|z|~yz|ztz{{}ss~wy|txv~~zyr}x~x|qj}zk|yvsv||~yy}y|~x}}s|}~~}uy{|x~x{|}|w}~{ywb~}x~uq{}x}{}}{z{yz{}xnwz{~txu~{v}{}}||}|n{zu~tyy}yyy{~v~lx|v||~|z~r{x|syzz}}{}nzzv{y{zyzak{z}~~yv~x}|wxvx~}wz}y~|xsou~tsy|tw{tsh}w~xz{z|ynxye|wtzr{{|~wu{yzz{x}z}~{{}w~yzv~}|||z|yyu}||z}wxfzuy|zxt}~z{{}|xz|z|y~}}}yyxw~}}kvzv{~~z~tyzw}z{dz{w|~~~y|||xu|v~vz~s{w}z||{{~r~~||{s|zyy}u{~yxv}~}x}yo|~}y}yv~w|}}}j{}~z|vz{{}xsz~{~~|}y{qww~|}t{}}{xv{Uwyz}}zruz{yy}{}xpvx}wx}}z{~}x}|yyr}~wt~}{~v{zxwtzz~ux{qdy|tz|x{{y}~|s~zrwy}x}}wy|[||tzx}u{p|mx}yzvo{}{v{y~~{|x{\~|~{}vxvtv}~yxyrz{~}}zzpwqjze|xzv}~|up}o}w{}|x~{u|wqx{wm~q~w~|{zpwx}w{{xu}srn}|{~}yz~}rxoxzz|{|uv|~xz}~xxs|}{z{p{{}mty~t~o{vz~{ct~o{zyy|y|}uv{izxt|rry|{x}z}{~|ly|qyuykwz{szx{~}~}}zWqz~zxl{~y|w|z~]o~zpztR{|rz~mxssxx|~{{u{}|y~~xyy|~~s~x}|rz}~w}qw|xy||~~zvx{z|{xy~qy~~srv}vw}|yvvz~z|~}wk~}yy|{y}r{|zsv}~|}ow}z{{~uzv~{rzyu|qz}~r{}xz~sx~t|yxz}rzw|{}|}z{z~|yy~whzzuuzx~}w~xw|}}}wu~y}xxt|t~wyv}wvz~w}|wnsxz|pxz}{}z|}||u}z~{tx|}{~yvo}u|yyxt~{u~}xx{}~{{s{z~zjt|{t}~zw~zwy|my|yu~{xwzy~uv~|wxpy}yot}|u}x}u~}{~|yu}{}}z{}x~zt~{~|txqzvx~{}tztwzu}y|v{yvqo~z|y~|w~x{w}~zz|{w||}~t~|y}}|~zzb~}~wrx|y{yyy~~rz{uu|~xzzw}{yt{{z{{q{wsrv}|{}}}~zyv|{}}xzxw~|{}~z{}|r~y{xw{uq|o}zxyzw{{qx||mqy{|x{|}|x~}~~}{}y|zy~xy{|wr~~vw}{zysp|mz}~z{|}ywrvsw~y|yu{x{}{|tq{w}y|y}|~v~{r|t}z~|~xx~|~{}y{z~w|m|x{zso|}v{{}}}{}vzzvz{|vwq}{~|}|~zo~|x|}{{x~zyurtwuy~|z~z}{x|ivx{{x{}v{q}~||}z~xv}xtp}}{{x|{{{{wwyz{znx|}p~|~}|z{yzwwsyx~}~}||zz|s|z{v|}m~vp|}|~|v}~yitzv~|~{~}||t~zv~z|wwzrz~~}~{z|vuzwxz{{t}xuz}{zzzsw|}y~}~xzyu~ts||qs~}{}w}ys{wwz|zw{x}}x{||t|x{zs~uy}|||svs}x{~||{vt~v}~u{{vwy~{|~yxtyz||y~|wz|~t~xz|{{}~szxs|~~vq~y|xrzxw|~z~~~}y|~|~tz}{x|z~z||z{{}~ux{x{zou}{v}w~|{~|w|xz}ww}z}}}w~uyz}|~|otzzv}|z|zvto||~r}x|s~z{yvw~sus{xwzy}yvyv{z}v}~uk{}y}umwzx}~~q{|}zv}w{|wyyq|w}~w}|||~}~{xvv~r~~|z}wx~yxs}~vzut~ax|~{x{x{w|x|sxx}rvwa~{wv{n{~y{x{t}y~{v|x~|}}wy~|}uyz~{yttzxuw|zw}xuvyuu}ruzy{~xu{yx{}|zzw}|{|z{}}zzwz~vz|{zxw{x~o~~zxm}|w~t|}|}{zy}z|{~x~}~ve{|woyv~tz}~~~u~y~}wx{w||tvo}{}yytx|}wx{|x}~|zxvur~}sw~wr|t|rx~{zx{|}uyv|zzyxyy||~|puwyty}vvy{~{wx{~|}{}xypv~y~r~osttv}~r{p{}ynvz~wz|{z}gzzyw}{}vzxts~xvx{}{v{{y|yz{_x|vru~x~z||z|vz{~|~~}~}|prpww{y|wu|{{{|z}~xwuy}{s|yzqyz{txuw|r}w|yx~p{y{q{p}{v}|{tw|xwyquyvy~v{xwzntzw{q~~y|{~wywz}}}vx|}vy~l~vuqv{{xw{{zwt~rz}}~zxzx|zy|wyu|wx{pvnvttrp}yop~}zyzzx{}w~~~~w|}{u}{joyvy{|}wunyzxxz|zwnzry~~}~zz~}}z}}y}yw{y|vuy~~}nu{_xxu}yv|~rfz{uxsr}zz~~zu~t}y|~r|d~q~kz~wv}o|y||zxyo|v{ww}}~w|z~}x{~|}w{x~yxv|up|~vz~w}vxwrv|vvov~|{x~zyw|syu}v}swxisz}it||\y|yz|}}y}i~yz{lvz~}v}xrxrtor~~z}{vzz{ywz~vzqy|}}t|xwZ{{xu}x{{xvtz~}}|ous}s{}}}zztwyutxt||z|gx{zuwzztw}x|t|~||yvyqssro}v{ortavf|z|z|}y}y||zy|x~wwyyvrw{{l{{z}{my{zu}vls{|s~}xx{~{m}z}}v{|{r}xy~mzrvy}|vus|s}~|qw|yum~szux|zox}{xvtz||}||s}xssyxu{xkyj~uy|yu|vzpx}gjuyx|izvxn\}}~r{zzuw~yr{{x}uu|s{xruwzsoty|{zzybz}e~{~w|q~ruv{l}v|~zr|xzruzh{~omquerz}{|z{w}~{|ms~{xy]}z}wpruqmm}vvo}{x~yizizruy}|y~{xmst~}vz{wyyuuy{r|}o|}~x~{wv|z{p~zox{v~z}u|zwvlsuuzy|{}}~x|}}y~yywp~xzupx{{zv~yhvu{||x~zzu~~|~|~~}s}y}{vwwz~i|zzt}x|yvz{z{|vzqjysx}|}yx}|}oyv}~t~y~s~xxv|}}r~~}s{u}nxy{un~{|ztju}{ws|p}{||{zzyv{{ry}y{r{{}zpxw|~{}~wy|rsxtxrt{zx|r|~|{rzwyu{|g~}zszu|z~vzww|{{~}o~x|}vwzys|||}r~qww~}{z~oq}|wz~zxyy|rx{|r~}~{yu~}~{|ttss}~zzhx}w|~|~ssqxztsyswvyyz}{|xy~~|{y}xqr{~}}n~p|~z}j~x}r~z~}z||yyx|~y{~}z|~~y}|}|~|v|j{~}zur}z{|x|y|}zx}x~{{zvx|{xe~}{|xz~{~~txu{yx}yyx|u{{vu{yt}vxyy|v{~z~y~wzk|||zw{wz~}s}x}{|}~~{{u|}x}~w}z{q~y||v~yz{xwu|}xiz{v{y}}y{~|{||wv|uy|vxzw~w{|{~}vtv|}~w}{|q{~wvso|t|}|u}|y|wzzgx|}||y}~~wr~w}y{{y}yo}oxy}nzvyw}zzxs}}~zwz{}~{xz}z~~pw~}}y~~p}~t|zus~xwzxv~gutz||w~}|vuuxy{y}x~z{v{~}||}{xxo|zy|yz}tw~}zy}|~oxey}v}y{|}zw}wyx}{~|}vrzxzxv~|u~t{tvu~y|~~x{{{}y{s}{v{{}|vy{|~n~w|prx{|}q}{yy|w|vy||}|yx{}{uuz~xq{~tyw|szr{~r~ezz{v{s|}~}vwpzyz|{~z~|{u{{vv{{z{n~}}xxz{xvx{}ow{~xxzs|wnx{{sz|}v}ts~z{|}z{yv~|~zrzzzz}~{w~y}s|{zr~xyw~w~{z~zzzz~~trrx|}~f~}~}{{}~{|o}uy|{z~fx||}{p|{yw{z{s{~z|zuxtm}t{~wut}}z{}}qux{txy}uw{{}}ptx{|xxzvw{ykx{~zy~{y|z}w{tzzwp|}yt~~x}zxw|{~|}|vw|yv|yzuv~}~~x{{|x|{yyzz{|~yu~~pr|uzz|yuzo|u{{|~}|~y||~~x~}}}~~{|~xy{{vxyvytyyrvmt~{ww}{v{}{|v~~~v~wwswx}w~q{~}|~|y{vw}~x|w}w~yzxz~|~zw}vx~xv}y|{k|v}~}zwi~x}~}wxx{{}{yz|}u|{}s~~~wz|{}}~z|vy|}|yzzz|z}~|~}wszz~py{y~y}~rrz|{zj}|yz{{z~}{w}}py~v||~|~}xs~{mz{~~|~vu|~qy|p~q|xy~~u||r}t|sz{u{~~|~}|z~tz~{|s|||s~x{{z}~}~~~zuzy{xxmy~y|{|{p~~wv\z}tu~w}|~~{qs}~t|x|~qvz~}|{vu|{|}|v{y}t~~|vw~||~yvu}x}}yzlxtr}{}z|{y{q|}zz||{}ctwz~t~zr}z{~~~}z{z}x{~}}}ryz}~||}j|~}|wxw{{~~~n{|r~y|}|}}s~o}}u{{|x}~~~{{}{{zmsvt{yzv|v{~}|x|c~u|n}{|}~~x~t{{}}j}x|}{{z{sfu~z{}~{}snve|x|z~z{vw}p~ll}|y|y{u{v{~u|y}y}zzuv|}~}{}x~zty~zv}|{|{|zyw}|s}wy~~~y|x{~yw~~|{~ty{xv}~yv~}~|~xz~~~wv}pj}w{xwysuv{vzvy||{~{zz||x{w}~|v{}}nz}s}us|y~{wy~zzvpwz}{~x~{~yx|~t||}jv}zu}}~|sz{}zy~qxnw}{v{swuwzy}my~swyx}vw{x}~{~yvw{|{~}~||~|w~qs}|}ywu}}y|~zs{s|{{}}||~{zs}gzzwt|z{{ko{y|sw~w{}{v{o}|{~x~v~y~|{~}y}{~|zzuo{mry~|{|zyt{ywj}}{}}~|~u}~ovzu{quv~xx{~u|l{gyzy{~}~sz}~~sy}xu}l|tu}{yx|q~}|}x}vzzq|{{u~vz|x~xx|ot}xyw}u|xyytyvh||{{y}{{{zv{{|~zu}tz}xz}{|v|z~v|u}}x{~}{{zyywzyv}}z}{{{z~}|t}}~~{zz|}yqy|{v~|zzzz~z~pv~z{|~w}|wx~}w|x}txy{v|s|zx~~z~u~{~}|~}|{z|{x~~{|}}|{~rztv}{s}}|||{xu{wz}}|zzq|~{{vyzw}{{{|x}}{vn}{~|wzz~nw~|q{zw}|yw{}~z|~s{zx{}r}|~}{xz}w~z{xwz|~{~yx~vyv}u|x~ow{z}sz{{~{xw{yxyzy~ywtz{}|t|wz~sx}vx{xw|z{}xwtyuu{{}{w{}{z{xt~zu|sx~u}~z~}svxn{x~yw{|}|}|~}z|q}}q|o||ut~x|v|}{|zu~qu}zy{o{{zu{v~}txvy{}}u|{{yqw|{~x}~yst|}z{z}z{~|s~|{xrx{~|v}zw}xw}x{}uy~~t{{v~~t~vyy}zuy}t|yy|}xus{yw|}|z~~stx|}{vw}zuz}}}yy~w~{qz~u~tw~}{~}w~t|~x}rwy{u~|}xl~|}{w||~{yzuv}{vz{|ztxyqw~zvx}}{wv~}xw~|x~}wqoy~}}}}}y|xxt|||{~|}u{|zu{{yyj{zt}xxx~zzx{{~w}}uu|~rt}zym~|z{~{w}z{u~~iovw|w}}yyw|~|{{nyz|wrp{||zzx{~svrt~}t|||{s|i{w||{syyz{zzux{}y}|~w{~wszy|yr}|~nxy~}{s}p^zyvwfz~|s{u{zx~|z{zvv{w|z}yr}wm~~svyxtl}~~wzwzky}xy{v}szy~fuq~{fy}|qzr}~{}yy|tq~|upzvwqm~u}}}yz{~|}go{y}s{~{}f|}sz|y}w}|bvwugpuqy}{l~f}}{xzrmm~xwovaMw~rzzpxz|p~x}vtr~{}|r}|x}w|}sx{z}q|ry[g|vz{x{r}~q~u{xo{{yw|}h~}~nv~}zxuy{y{|t|y}u|{xz{~lvzxz}y{~zuwqu}qw|t~zfsqz}xrv{pyN~uk|yvunslkuwwx{wy{{{~w{|w|k|{~hs{wty|zw~qzv}vy~~}{yz}zy|~~tzyuy}wzz|y{|t~x~t~{z|r{s}}z{u{{~x|y|}}rpprx|zy~~zqyw{v||zz||~r~z~{|us|zzzsvwy~|ou~~vywx||v|}}}zizvzxyxy}zvursvx~|}wm}zz|~mrxx~~v{uzxk~tz{}t}}rw~vzl}zzxr{ys|~}{z{z}zzx~{{x{~~}}~z}xyxv|t{r{xyx~z{yz}sixxttU|p{vt~vsezz}zzu}{xl{~~~tzgzz~}}|jzxzzx{|x|~|z}~~~yy}xxvrvo{vr}zuz|~|}zxy}zzu~tnyz}yy}ywyxzzv}zvpz|y~~uxt}y~zx~{~{otp{y|~|syvx|tzs|~n{{|t{vxu}ny}zxxyv|~}~}qzw~~|yz~ytt{z}x{}|{Nkx}sx~xzp}w~}uyx}}f~x~nz{|t{u~|u{iq~p}st}qs}n}w|s{|zzy|ys}}yq{v|}qwtw{zz}xrzq{xhwzxusxy|{xve{z~wv|y{}|wy{k|uy}||p{n}bq~yvw}yyqszc~|||wutvn|{y}~wt||ln~~~vvvypr}|v}~t~|z||xyy{|}{}y|rzx~|}ws|zi{z|{{|zxk{}yw~jwy~wt~z~}{z{{y{}t~xoyj|w~tex{x|}u}}}r|}k|uzx~vo|xz~y{{~~|rx|{xyw}}{yzuy{s|{}s{|{~quqpz~s{}}|||uy}h~}yzt~uy{w{yv|}w}}qw{tz}~|}~y|zzwxw}}su~uzw}}zv~zg{zt{}z|{m|z|}{|~{zkfy~{y}~~~w}|s{~z}{}{w{ynx}~w}t~|{r{x{yy}}}|zw}|~tv|n{{~}zw||jw~|xw~~{{{xxz[q||yt}|w}z}~}}wpmz|{}zzu|||zptv|~|}||z{szi}z{{}xz~}ti||ty~}{s|y}pw}||{{{yy}y}ztwpz|yxz|tzn}||t}v~|w{||~{xxsz}w~oqxyws}qy|zs}yz~{|{x{ov~j}y}~rh}z|}y}zx}mx~kyn|y~wyq~}s{|wtvt|ws|{}uw{~suw~}x}jqy{|z|~rwqy}wzx{~|qtt}{|~xtv}xr|xvmw|x{{r~ux{{wvtx{hw|t{{vn}j|{{}n~tn|w{zvw~~x~qouw{wn}~r}~q^z||wy}|~}uykrig}yqizxvs|xxrxuzoqmyzrmy|q~yz{|lo|tzvx{wwuzxjzutvx~r{|vyz{}xvy|zx|y}oyy{hs|wq{yhu{m{tvvqx~{~kwe~y~uztzk}||ttytnt}xvis}}dz}s~x|~|{|}t}yw|}xwxr{\zycryx}z|tyyx{}|}_v}uqy{tt~||~{{y~xcnuyyuyy~}zyws||{z~~}}}}ixuuwztzv|}{y~|u|{}rwz|v|vyyz{{~t}}l}~||x~wupsvw|}{|v}}{z|{}z{}z~r~xuxyy}}y|wrzwzwvy~~}xw|ytyvsz|jr~|~{{tx{}}{v|t}{}}u}|a|yyw{u}~|qr{t|}r~u~z|w~z|b|{~z{y{{rvv|xzr|n{i||wqvz{wyys}|t~z{t~~~]~t~{z~~w|{{~y}~y{x}y}w|zzp~}v{z{l~|tl|{~}yy~z|z~}qu}vx~}uy~w}{{uu{zvs{zw~u{ww}}}|k~n{}||{zzsu|~z{yrr~xyxuyynuwyytwrzwYvz}y}zltbzxy}v|~wz||ylyt}vs}t||}rk}x|vsvx~pr~t{x}n{}{kp|j~xz}ywxwwjwt|~ym}pw{iqzu}~x|vyyox|wxxfzyz|yupw{}v{v|tyr|t~}o}}}tqr{z{}|~s}}pzyvu|o{k{izu|}m|zsz~p|x{|tu~zyq~}}kyxwy|tusy}}zs{wpuwuzz|ys|||z~zosx}r}u{|{wjvyr~rfv}ys{|~z}|yulzvy|{|~{p~}qxf}}{xpzyw|{sy|vt~ou|{|o{|~~xw|{}xT{u~b|zu{t|u}p~{x{}yvwxoy~~|zn{s}|}uys|t|{s~zyyxu~|w~x||zuyQud|{zzk~|z{zX{{}p}r{r~}z}wz}y|wv|}z~pzw~yyty|}vx~vuxywyxz{xr}{~x|~}~}z}zzv~}zt||~}{s|w~|z~}y|y}|xutzw{u~~}|}ey}~uy~r}sqy}}|zs|p~|y|{}|xz~a|yy{~rw{}}y|~w{y}{{{z|~|yt}~x~{tuy{z{}vy~z}y}y}}w|w~|t{u|}zx~}z{r}}z~z|~u}v|z}vyy||yv~|x~{v{xwwz}zz{z||}{}v~w{{~{{u}~z~xuvzxu|yu{u~{|wlryy~ty}{oyp}{~}uz{v|}zszyy}|zx|v|x{k{vyyzwx}~}w}l|y}v}zy|z{{{x{}s}|v|{yi}|{|}o{~xr||wz{}~u~xr}u|z}ypsux}y}~{x{qyyy|yxr{~z{|{yw}}}{{vtwq~usvxzuu|yss~|l|{{tyw}{z}~yv}sz|s}zvx|txs|l~x{zqzz}~u{zorlym{~{~|yszr|uzyyvjrvwvysw}zq||s|z[}ryxwu{}b}{~ozy{|z}{t{x~z|~yz~{|zz{{{oz{u{m~wuyuu|{~~v}|ww{ow~~w{zzw|}yz}{}}yszzp}{yyymtw|vuy}yuyxzx|usv~wtt}y}wy{{mv~ywuztqu}tvvv}~stso}hw[rv~zw|Znvtxv|o|y}uf|x~vsv}f~vq}pywz|{zx|~{xypxzx~}yzy~z}|uz{|~}}stwr~zuzqwvyvu}}zumx{}|}{y}~mvx}w{}{ur~zuyxx}}zx{}xzt|}}z|~zxuvxy}}yzn~|}}~vx}p~~{s|zu}~ym}}|}zt{{zv|{yu}z{z~{~}sz}|yts|~}}~k~ppvx~zw}||t}yw~~||z|zqt|}y}vqww~uy{z~yys}qx{xuxmnywxsuxzxxwzur{zyvq|y|}zz{uz{~|{}w}yyz||t}x}{}z~vzxzy{{x|yzwnzxywsv}}{|}|x|tx|stzt|xz~|}z{~{~wzx~|y~|uzs|x}||y~|{u}yzx|zwvl~l}y}r|}uu~|w}w}~vqy|{{xzm|}nzvxn~w~z{{yx~|}t{yz~|sx|}pwxz{{|w}|yq|x|x}y{|~u{~|tz{t|zm}jw~~~p{~uyrs|to}|~z{{y|vz|y~{~}y}~~s|wt}{{wwzyzv~~~y{pw|x~s|~yyyi{}y}x~v|yqxzmryv}{|}~}zxo~z~~~y|uvywyv~}z~~wz}yynxxy~~w}||x~xw{~}s~|yo}vzw}u|wy~z~~~q~|}v~zy{w{z{y{|m||v|zz|~xxy~x{|u~}w|x{x|vwz~}}l|~w~xw|{{rz~xw{py}vv~}}v}tx|{qz{j|ozptuw{|}w}|ruyzty|zxt~~w}~}t|{y~{xwwx|rx{|ym}|{{~spu{w}z~[{v~~uwvy}vqxxw}{r~z{{u}~{|{uy|yz|ls~{x|i{~~tJ|~z{~{|w\zxq~{}{\xux~{yzots~zy||{{txz}}ynvkwu{}~~{~y{~}{og~q~~uzyh~w{w{ysx~{{tyy~vrzov|two}}{xtzum|||~x}q~}w{}y|{||y}}yzn}{sw{u?~x}yxw|{rw[pvwrvy|w}z{w~u}}w|zb~z}yx~|}}{w||gvzvx|wwsug}|w|wl}|yr}x{z~|~wx}w|xjww|yD||zzty{w{{{|zzq{n}t~z|z~v~|yu~|yxr~|~u~wuz|xyu}{{r|~xv|x{z{|{yz|~}vvt{rux{{vw{}v}}}v|}wtz{sx~y|kt}~uz}|w{|qyvz|xzx}u}z||~{}}v~zz}|{yuqz{~wxmwuxwv{vxx~}uwvz|v|y~{{v|y|~l}~}~{xuty{~qu{xr}yrop~}pyz}{v|q{|x{zt}u|{~t~zv~||sv~}}y|{{x|u~}vvz{}|~t}y|}x~zv}o{{y|vyyy~|~y|zxz{}y~|twu}zu~r~|z|tv|tyyy|}{}w|{rzrzyx}{p}}}}}oi~~|o{||wwzv}s}}r{}u|x}{w}o}o{{s~xz}ox{|{{xz|z~z}{g|{wo~n|w~wy}tw}r~xnww~z{yt|rx}|yy}{|wm|opn}}zrys}ysuzqzn{}`|~zuv|swnnoy~syry||}x{y{{lx{v|zq|v}{su|uq}w~u~|t}}|~y||||}u||t~{}on}~pw{xgyy~wxv|ozu~wv{{}yty~h~~~{y}|}|v{z{|yytx~ox~wy|y}z{~vvy}}wo~w`{{y|y~xxz}x|{z{|}pyzz{~{t|~{~yuu~xzi{rzzyw}quz{uvsy|xt~uxvr~}}yz|t~zvyz}u}y{xyzz}{zwuwzsus|yb~w|{{zzy~{jj||z|wt|z|~}t~ktyzrv}luzzyq||~tr}}|~w~r|{|m|to|twqqT}sru{u{zszvtzxvnvsw|y{||ry||uxq~{|{wuzv{zyw{ysy}}v~yvy{z{~~|}tw{uy{vs|vx{|~w~{r|y}|q||{o||xqvz|{}{{{wywzzx~{{}}}z|r}}y~{vz|rypxt~v}{yy}yy|}}zss|yt~z|uv}~vtzwxxl~z|{|~}y}upy~ywty}~x}wzr{xyvz{|x~{~z{}|zuwv|w|{uvstuz|~z}x|z{z{plu}yvwx{p|}~}|{}~{wu{{}q~y|w~k{vzyy~zz~nxxzop{zw|rw|}x}wx{}{w|{|~y~y|x{}}zz~z||oy~wv|}~~{~zz}y~p|}{{}~sy{{|yx}}u|~~zu}y|}~}||w}{y{vqz|x{tsszw|{~|w~f|vwz|~yz|{w|w|y{w|xxttypeyy}{|x|y}ix{|||y{yf{{|xy{|xt~|z}}u|~|}_w|{|z}~vrl~}~zv}yx~}}v}y|}m~w||{||z|}}|v}u{y|yzyty|l~{k}~~~||yr}x|ywz~qw{fszz~~wy{f|x}y~~zwz{uv|{xz}}~yn}rszo{|}z|}z|x|{}w~{~{|~}l}{yz|~}~tu|}|x{z~{qy~wxzj|{vx}{y}{||~}{{ut|}z{{}}}}|~zy~zquwy~~{|t}|}}p~~{ywq~z~|z{wx{}{~|yz}uw~x}}w{y~syz}{~|~oz~xyx||v}~{wvu}{zyn{zy|y~yt}||~vw~}~{|z{}{{}{vs~{~usz||w}y|z||}{x|uw~w~u}|vrr{{xyyvy{xxzzyzry}|ys}~y}v~}{|xy}yxqz|q~}|w}}x{}xwy|zu}pu|{vx{||ztru{}yvu~zko{v~yt{~wvs||ryqy}yl~|{y~w|y{y|}w|}z~}}yuxt}~~v{y}yn|yzz|~yxwr~}|tvu|z~}u{}w|vqz~z}wzurw}w}~|~z|zyrx~zxy{qs~w{|y}{vzz}q|xzzv|zz|zsx~~h}y}}|}~uv|xzttx|}}|yz|z~x|x{wx~zrs{wwxxx{uw}|{r}wyou{zw~|w{}~vsw|}xzt~|z}}}tyzw}yvywvzz{zm{s~umz}{xu|z{rty}x}|vy}}xz{{{|y}z}zy{w||z~|y}z}{~}k{x{gzxy~w|r|l|{u}ty~|x}vy~||vzxxtz{xrvwyrzvswyr~~|yo|tx|p~q|}i~xsuyvv{z{z{{x{|}|yu{}ywzk}t|}~u{{wuu~|j{~yw~y}tt{tk|qrw|{{zzxnrnvr{}lux{~{}|p{otw{|{zx~vxtu{{}w}zls|wow}}{wu{|p~w{~||uyuyu{~{tzx||}x}{ws~|||u|xx~{|w}n~yw}~qx~|xvut~|r~zyw|~{ut}rysr~|}|x~}yu|{tz|tztkoy}}y{~xzz|zyy|ts~}}y{|w~}vsz|{~uyq}{t}y~vozw|~|x{z~rzy}zypzz|wx}i`{~~|{x~vtrx~|zu}}uz|zz{u|}}oz}~|}wr{}|}}wtqwroxynuyutmzv{v~{~xz|nr||uy{xowzzymztz}~z{~~y~||w~|~{~}wyy}vuyy~~~z}u}u~~r~tzuxyvw{}~yn{yv~ywy|xoy}}ns{sw~o}z~yz||xo}v}||{~yzx~~rtwn}yy{{z~wr{x}~}x}}}otyy{|vwv{zy{~ypywwy}mw}~z{|vm}h|y{||tv|yx}vzxyzs~}zy}vz}xuvz~ozzxm|zwy}xrtw~z|m}|vxx}{|yy|y{yyx{|zyvryxv{t~qt~xrspn|zyxwyytqz{t|}x~znzso}yzwu~z{|v{zzy{~{z{}zw~z{z|~x~w||{s{stsu~~tz~{}vz{~v~{~||}xzv}|z{uy}{q~wzux|yy~p~|xyy}p{~xw~wwzu~~zp~xwxy}tx~uvz|~}yzt{xy{~{~y|y||~}xy{w~{xy{y}uysx|ru|}u|~v|wup~}~|}zxy}{vx|}xzzy}{poz|}{x}xvnz||u~{}xtz|yst}v~tx{w}zwt{{zz|wj{u~~z}zz}x}w|bu~yv|wyvb|sxyywyxyuv|et{||z{}yx}|||yz{~z{wwk~}to~yvuuyzy|~x{znyzyz|zxu|~z~r{u~|{}zwxz{~~vy{{tz|nzn}x}pyzyv}w{w~}~w|z~ygz~y}pzyw|{{q{yvv~~zx~y|ex|v|~nyw`Zqwr~||ut~wy|}~ppxf~s{tk{|y{q~uu~n|vy{kzt|uo{vtyw{}}}ywvv{lyszzum{||y}}{x|zp~||||b|{|ovvxit|z|ui||pev|{}ky~}w|l}vwk{|v|u{{jtx~~wuzv}|wyz}z{z~}|vw{ir||jzuy|qtmkvxzu{szt|hznr}~|yrezxxzwv||~~}wyyv}}ow~q|szty{|a~p}pvzy|}yuyxx~uxzzrq{qv|~|{ty~~}w}wz~~qy{}[ls}|x~~xkw~rzxtmyt|h}}}vi}x||}{~}y}}y{{w~}~~~v}xz~z~yz}}xwwt{qzwws}rxx}~}r{{|w}q{t{u{pyw~x~x~||{||}x~y~~{||v|w}ww}~ztx{}yx~wz|tuy}|{{~y}wu~zz}{zzz{p}|w}~y~zzw|~{|o}}{{z}x~~zwz}}{|ytvs|q{~z~{v~s}{|y~u{wzh{|}yv|y~|~}yu}xyyzvx|zztxxy}|~}y|z|zzp~zs|}s~{pu~u}|zx}wj~|}xwz{nyx~}|{y}{{xypu~~yx|l}qs{z~u{~|v{y~}ww}zzs|ytqty}{vz|}t|y|z{wwx}~x~|yw}yq}}q{~{{vwzyy{|}|{|x{wy|~o|~|{t~zt|p~}xtye}z{{|}|{|p|rk~{u|y}y||xw{|y~{yy{}xz|u|}t}{wz}z~{}{yu~yzz~~wy{zy{ys|zv~|xw}{|t|xv{t}}{l~{{|wwzzsznzw{|~yru}zy|{}xy{v~vw{}|~}|}~zyt~wzzz{|||x~~ssz{|}|{zx{qz}w|}r|z||~||{{|tvw}y|z{vi{}}}~v{x{zwuu{w|{~}}z}{z{{}wv}xzyw~v}{}}~~}xw{}q|uzzz}{|}}w}vu{v}{s~wyyxr~{yjxx~x}}zt}u~~|ws}yxw~z|{~}}zq}}~syyy{{}vy~zux~x}yw}{|}xf~u}|}sxxWpj{s~xx|qzyr|uquo{Yq}w~v|wvy~nyqx|ykyx~s{}{sp~zl~z\}wyt}r~zyz|wr}|v|sP}}{zknv{Qyx{wyr~nx~{|z}iz~ht{ywuv~{}~r}zzyyyzxsoxz{{}o{z{|w|}xu~mzzm}zxq}{b|v|xvzwpx|~~zux}{bw}`ww~vWw|~r}{yp|xw~}wq{ztvv}}zysCrxe~~}_|yyzfzv{||zl}w|q}yrtfu~z~}z}sx{xwz{uZr|}un~qzvly}|we|y~mpq}}yrv|ywnhyors{Yy~t~yjnwwuv{y}~}r}rz{wvyf|fgqyqpuwgyszo}}w|{zy~~ywqy~~{sx}}|}z~~vz~y|}}wx||}{qy~{xp~{}m~}~{~{~{~zy|yf{}y~}y}~z~rw{|~}}t{}o{|}|tp}v{yyu{{~}w}pyl{u~}yzy}u}}w}wr|w|}|~||bu{{|~{~y{{~|zu~{z~|}|or~|t{yt{|x~w|~}~~y{~z{y{||s}uq{~m}}yy|{x{}x||zuxw~xzu{z}{wn}swk}z{{|pxvww}{}||~t{~|{~~|zxtw}z}xzx|p~u~x}kv|}{}rv{t{}twy|t}y~u}|szov}tz{xzx|}|{|~z~u}y{y{~vy~||{}{w|{ur}zwx|xxz~|}}{||t~n{yvzx{{|yy{|syx}}zx}}wzu|w}v}|s|yu}vwxy|wuvr|~vx{y}ryxutuwr|~{~{x~xy|}sxz}{zx}~u}}}|{yw{s~{zyzxw|s~y~j{v~}|~{||z}|y}z}xzxyx{~{}q||zw{~}}x~xy}~}~|}~z|{r}t}t~yx|~yu}{y}}z{yrn}z{|~~y}lx{~~|||zzs|x{~}}{|{{{x|z{|z~{n{{}z{{yx~ss}x||zu|}y|szy~}~wuyy{zwz~yxWvyq{~{~w{{}xtxz~|wrzy{zr}y{uw{|y~wy|{|yzu}}}}wz{vt|{x{||w~y||wx|}|s|}}x~w|{|~|xu|}zy|s~{}s~~u|}oyzw}xz~uz~||v~~l{y~}~p}zz}zy}||y~~{}u}~v|rk{~~~|}{|w~{lzz~zzw}~w~|}y{}xz}}|wy|x~|{~~oyq|~v|}zutq~}|||s}zu|u}}}zu{{j{}ruz{~w|r~~|z}|mw{~}z}~vvpx~||{qzzw}yv}v}|sy{r}pqh|x}|}||w|{~|txy|o~zu}{}{|}~u~wvz{|}owf~|}|wv~povyt}zqw{uz~}|xj||}t~}~w~|u~r|~u|}xwwy~r}z~x~~xv{|{}x~syus}}xzuxpk}u|~~wyysw~sqyy~w||{w~xv}xxkvx||}v}yw~}}|{~~|y}u}uw|yxu{{x~ixywpvyw|~|rywxvzxzzzkv}|v}y|mht~y~wu{ot}qo|~~wx|zmu{uzzoytvw|{z}s{~y||~z~w}z|yp|~~ys~wv{w{wxyz{p~x}{wsux{~|z|otz{y|kvvr|u~}}{s|~{yv{t|x~}||{yv{hwx~}|~{}yyyv{{}n}p{zvo}xw||x~~~rzxu~xzw~z}}{z~s{}vvx{{~|z~z}|}yriq}|ort}z{v~z}z}zuzn}vrx{~~|~|{zyy{lw~wxou~qu||yznvx}|yyy~v{uk|~{wyt~{|zkv}vurpy{y{}z}yezt~zg{}}o~}~x~||~}wxz|x|~}}ux}xvwo{s}~~~|||||uxqr~y|{xwpz|x}qvu}{|~u}y|~}}~{~nx~|~z|z~{v{vl~{}|z}o}wy{z|~~x{||~z{yuzyx~~|v|~{s|{{xw~u|w}~}|x}x~{{~z}sy}y}p}{x}z~|wyx|s{wwz}w{s}{uz~yyzyzzy{~{vz|~|vw{|~iz}~z~z{||wszx{~|}xn~|{}}yxz|wzx{zt}yx|~|}xl~{mt}}|y|qzy}|xwzr{v{w}xy|{~q~|~p~swwi|ys|y}}k{}x~w}~|z~{~}oj}|x}{v}{{~v|}|~}zv~~y|{zu}x~{vwuzv{zsuwsutxun{{{|b{~swyw~{}{x|w~{x~w~pz{w||n}zr}{{{}}|}}}{}s|p}}yzyzrtzz{|v~wzm}{nu|}l~|v|~|~}yy{yu{{u|~}zxxwx{~}v{{x}wt|{yq~{~{{|y|z{tyzvy~z|~~x|p}}}uuz{}x}}}}~||z}t~w}|||~}yyy{{v}zy{}|n~z{vumyx~yq}t~z~v{yxlryu|yxuv|}vwx{p~zyws~|{vv|zx~q|zq}wzx{zp|w}{txx{nu}~|yw}s|}~zzvxqrxwx}}vqz~nt}}xyw|zxy|}uz~u}sx{{{zzy~|wyysp}{x~z|nuyuwz{|y|z|}{~~{}z}zwy}{|~vyrp~{y}|{p}|}z{zzyw~|~}y{~|zo|y|xypyvy}}wwzw{~{~~vz{yv~{~|z{{{x~x|ytxw~v~~x{y|z}xyw}}}|}}gs{w{zusu~}~{{~{v{}x|u~s{z{|}y{~y{xyyx~{y{}{|vl{z|x}y|ps~xpz{xz{zz{{wr{x{}}v}{yztq|}||v{xyz{vy~|z{y{sz{|{yy~{{vw}vzt}x}u~|wx|sz{~~wzp~y}{}||z|x{~}~yxw|{p{}~{|kx|}t}|~x}|z}w|{y{v{|z~z}~ytxw|xu{ws}}o|rvyzii{z~o~{~{i~|}x~zrw{{{|}~}u|yw|{zz}y|yy~x|~|v~|~uz~{{{}xri|uzty~}~z||v}o|rx{xwvw}~}~|{m~}u|y{~m||rzz{t|zw|~zxz{||}zy}w|{|zw}}|y{}w|}}}wx{}}}}~uoq|}x~}~w~}uwyturzww|zz}xu~zrzfz{zuwz|y}||}s~||~x{|u~~|~z{zx~u~{|{{~hzbya}h{uy{}znvwqp}}x}~t}sxw}~twvs{v~uux{dvw}{z|w|z~tr~ymvs{}ytyyy{v|yex{wz~}ywi~}yzu~t{b{|m|tx~|v|y|z{wto~||w|}wy{||`ex{||w{~y~|{qvyP}ys||}||}ozzxrs|}yx}y|~s~xwwx}w|v~k}{~}|yv}m~~}wx|{uz~|~~~~zj~xxs}|{w~~|y~l|~zz}|n~{u~cz}}z}rvu||}}||t}u~yy~k}y}vsz~}|y|}yxx~~z{~|}|vtv|~}}}}}yyzq|sk{{}k}}uw}q}t|{~wx}{zy|s}{vxsvv|~o}r|}|zyw{{y|~~sy|lxvxz~{zyzz|z|~}|w~}}q~~|w{}~v|{xw}}|z}j~o}u~r~zyo}zz|j}v}~{xx|yuxxy}~~}p{{zkvzvz|xkq|~}}{}~|z}}}~vy~~uqwju{|n}~}q~~|~vx}||~s|t}{|x|y|}~~{|{tz{}{}|wryw}xowvz~~wyz|~qq~k|y|t{sy~|}{{zzg}~{z~~zq~|s~~~~w~x||xz{{|{|}jknu||}tyl~||xo~vtzzu~y{||muzz~|}{~v~~~tz}{|~z}|ur|z|||{}t|p}qsrt~w|~y~u|z}zsxgztyr}zx~~~{m~v{|~w}{wuy}}y}{|vy~y{y}y~|{x|z}}|~}xz}wx~~~z~x~z~y~}x~s}{~~|qw||sz|suxvww}y|mu|{|s~w{y{y~v|zyvv~y|v|yxuyzv{pzw||oo|{ps|}~zx}z}|}ux|~x}x{{vyz~z~|{}u|}}~|||}{y}{t{~y|||qz~}y|{|~y~u}ovvt{}w~r{}yo~|y|~}y~z|~{|~u~~~wyw{|yz\ezyx{~y{y|}~rw||~{v}|y}vtut}|{|mt|}{|z}vw~}xw~{~{{}{z~zzv}|xvz}x|w~u||mo|~z|}}zt|{wxxxylu|y}|mwyww~y~~s{ux~}ozxuyyzyow}|yywzzvsyztw{}{~{{yq}~tzwwsr|vz{z}xs|zv||\}}|zxxvwvz||{|~||s~~zr}tq}t{~|t}~x}{}yy}w~}v}{{}{xtnvuxpz}}ozz}|w~t}xr|wqy~{~|w~x~~ty||{}t~~}|~y{~|yur}~ku|ty}xyst{yywwx}}r~s}{v{zv{~~xw}~t}}vzx{{ux}wq{~}p~}{{oyzp|{x}|}~{}q~u~{{|tyqvuxv|~sxv}rz}|v|}~z|}|~zy|{y|zy|yw{|suyx~{xzx{}}~|z{u{v~~zzvt||sz|y}z}{~zvt}zyqy}xz|}s{vw~zryvzvy|{w{~yu}w{w}z||mx}v{|y{}}~{w}z|vy}zz}u}tv~}j}t~{tz{u}{}}yr{x|~z{~w~xqv{z{z~{t~|~~u~zsx{x|z~{zu~vu~{x}zz|}z{{|w{~yum|h~pv}wyz{x|uzx{|yuwz|zzvou{wyz~t}}}z|{|y}x{{vy~p}}vy~~}y|y}||w~wzpo}~z{|zq}wux|~u{v}~izw}zyxw~z~|zylqz|xsvvz{{|z|uzt~wm}~}~vqm~~~x}~v~}}~iz}||}u|o}]t|{w|{z}{}x||~yzo{z|}z~ww}zxz}yz{{{yyyxv{|r{swsx|vz|vt}~wuwvtu|~{ro|x}v|r~x{z~}wuu|~{xyt{{{|~{}{u|||}zu}~vex~q{||||r||tz~xvpzxr}}r}s|z}x}y{{~}~|~s{nxzpxvysu}u{z|~v~yzvt}|uzu||w~~tt}y~x|ww~{vs}zrzyzkz~x~m|{|xwy{wx{z{xzlx||tyq{{z|}z~}}z~uwxzwyt|yr}qz}xzywmyuyyy}}{x}}{x}}{~}x}|}yr{z{~y}x{{zx{ttx~|x|w|}{|zo}mg~|~z|vxn{~{|t}xy{y}v{{xxxz~||}yyzsvs{~xz}y~|}z}f|~v{t|z|}|~}ty{}t{}{x}z{wu~{txzz~~y~y}~~ywk{yzw}}z~}|z~~|zzruz|pux}xt~}zz||r~x|vuyx{x|||}~~xzt}~q|wz}|~y}bxt}zy~|{~zzy|yvyr|}}|z~z}~v}s{~yzyt}~yoy{}y~~sxmyz{zzi|{y|w{unx{{p}{}zryy|{urzxyuszsut|{zyvzy|s}~~|t}|yzw|yxuyz}zzs~z~|}w||sp}zy}{}}}|}|{pzz||}x}y}gs}}uyt~o|~{yw~ysz|t{uuws~}xy{pytj~tz|y}zwz}w|{x~tw}|r|{zxw||zyv|w}zzx|ws|t~w}vx~z}w~xy{}{wvw|t}wy|j|zvzzsv{|y}}}txzrxy|trx~z}y~s{{{|{~px{w|z~pl~|tzysyyu|}{sw{~{z~~~z|}x|w}r{u~wz~y}wyszuyyywyuyz}x~znzur|qp}w|vz~|z|s}uqv{yu~txy~twvpuyv|}~su}{|~~zyyzy}{yyxv|zw}||u~}{y|{~}{~||{}{}z~w|v}~~zz}z~|~yxy~}|}|}y|~~~{y}~{zz}|}x}}{|wuz~|z{z}w~|~{~z~x|}{z~}}}~}u}{|~|~|zxzo||z{w~~}{}x}|{y|{z|}|z}|~{~zy||}z}}r{~{w}t~|}}~{~x{|yz~}|wz|~{zz~}}w}}{z|wz|y~|v|~}}|||wz|}{zvv}}w||{z|v}{||}|{z{~}}}}}}}}|s|y{{|||~}~~y{{}tx{~}zx}~w{~|~{}{}~}||}wzw|{~{yy|z{}}|wx}~yx|z}{z~u~joo|t}x}qy||z}yms|v~r}ly~~}}rr{z~{wupzwwoqw}zvuvqjv}kzj~ot|vv|x|gs|uw~~gzwwx~pqsgvy{zw{vv{y{yk|yuwrw~x~b{i~wxz|ob~}vyvvwmtvx{v}wzozxww~uypzynqz{p}quwt}~s}shupu|yyxK~x|wu~nrdt|xv{y}puzux}w{q}hy{xunttwwz~{zzztzhy{|~|xnsyizpn}}|v~v}{{|qve|kidy|zy{o|q]z||nxzjzy~xvwz`rkrv{dlzo}uvw}Qxztzu{y~f{z}}o~}z]z|iqrsxzhuyrsnlwxwzqvkw~px{|}{~u~}wot~]}{|rt|zhwjzttM}z}}{}y|{|z~skvy{}wwvz{ms}}x{{z~}|{z~oz}}|{u~uym}vyw~y}t}~yy~|{x|}x}zz}y}{}{w}q|{~xwz~zxqz||p~~}~vyv}}w|{|szy|{|xlxy}t{w~vx}z}~{|x{wwy||z~zz~||uwz}~v~||~{|{|{~t}vms{y~~x}yx{}izz~z}pm}{ztw|yw~~zyym~z}~qz{z~|}u||{}qwyw}{~v{}|~}|y{~~uuz|}y}uy|}wvwxwr}zxxy{y|~~|~}w|zyuyx~~||}yv{}}{y|x~}}}|{q~zyy}|{z~xyu{{~}t}|y{}|}~xx~}yz|{ww}|{~|}zq}~y|x~{uh~xtjy~~{|}~Ko}wmmxucltt}|jzq|}l}{{z~m{rz{{vuszyyu{zzxsvqvwo|||ow{nwvyp}iz}nuzT^ukyfy|~W}vzmyor~qy|}uuzo~w}yi}~~|uqtwcvyv}ttqml{qx}|_wynukx}xyws}||z|x{xtur{z}t}Wruz~wxsusy{uux}}z~}|t||vuqkqsyzvpius{w|yk~rqz|{twudkl}syq}z`{j{r~uh}}tu~zzvvzzzmz|~|{|sus{y~~xx{vwp~or}tu|{s|xz~{ziz~|{t{sy}w|ntw~vf|s{z}{^z|zsxxuxvpxu|}|wmx{~}h}{p|l{lnUw~}|y}{s{ywzzs~v{|zz}}s|rq}sxq~}z|z}z{{vwzw~vy}{|wfw~}v{{}uxq|uxyy}z{{ttzz}t~y|{~vw|{v~~~wxtzt~zz}}|u}r}xw|{|{y|uzztwy|}~~~|}x{{r|v{symr{|qs{s{~vw||q}h{{j|uww}z}{z|r}}}r}{m}}y|{`~~|}zy~xz}y{u{uqz|~}xvzzyzp}|x~vrz~uu}{}z{|or{{}zytzuy}u}vv~|szu|u~||s}p{|~xyxwzw|z{{|trsyozwx~}z~z|~|{zoxwu}z~|z{s{|yvvy|srz}u|s{x}t~{um}y}{}~yzn}m~{yu~z~x~~y{|n~{y|z|x|{{vx||w{{q{|zuz}|x}zz{tl}}}|yvtrz~szy~}z~}|zxr||wxw{}~}~oy~zzr~k}|xrdwqz~xz}wxz{uwz{w}|s}|yx~o~{x}wtyw{o~z~}{|{{y~zmzxxs{w|qh~}||~xox~q|}|wjy{~}|{suvr~yvv|~{}x~{sft~}|y|p~x}p|{zz~ztv|p|}z|~||~x|rs}z|}yyz||z|xz{yz~|zy|}W~vy|z||ryyz{wzrw}z|`wrx}|{{x{y{~u|u{yozu}yuw}{zs|{zt|}~zvvy~zx~}zzz}|sx|xy{{|zz|~x~{xz}|zwx~|u~~}{}vz~}}{||xx|xt|ryyz}~~{z{~{}m{{x}~zuz~|m}~wn}w{u~yy}z}}{w|~y|p~|pz}}|w|z{w}xtm~v~~{}vy{zx|w}yzz|z}z{z|}xr~yxry|~y~}tup|}|~{{}vz}xu{{{z|~}~}w~|z~{|{}{~}x}z}|z~}x}}{z|z{vs~}}{~{~ox~yy~|vz||}~zxxrzyz|}|z|q~|~{|yxy}t~z{~w{~~xvzzsy~v{|kv~{t{{z~vy~}}ysv~{|x{}|~}{{y{x|~w~~||sz}~~|{nxwtx|~sx~~}r}|wx{~{yw|{y}zk|r~w|~zw~z~|u}~|}z|~x|~}{v{z{|~{|vv}z|{y|~{{x}{y}|wh|~zuv|~{x{}zz}vvxyrz~yz}||{x|{|}}y~z~}zr|ww~zo{ruz}w}}x|t{v|~vy|~|yw{w|}}k}y~~|~z}zwxuq~yuy~~|}|xz{~z~zuz|{iv}|z}}x|}|x|q}}{s~}}z~{{ywy~v|w{wx}{zvt{}~v~~~{{yqqu~wqv}}u|{}|~}wywzwx|{y|}{z~q|~}|}|{}|~y|}}u}z|}}yu}}uyw~|~}|}|~y~zo|wz{{}{o{w{}y~}vw|vy{|uy|{~yrzuy~yy~z}o||~s{s|x~wyz{r}}}{y~{v}{~~~qy{v|ryyq|~~pzwz~t|wxss{yl~x}xz{{sm|}{~}y}}p|z~zx}zu{tnu~|k{{xu{w}q|z{{w}}y||yuzxx}}r~qwtqr|{n}v~{{{yys{|{v|v|}z~{s|xx~wzy}z{}~y}~}|}vw{y}yoy{|}y}uxwu|u|yyzzv{my~|{|w|~xz}vz|tyk~kwv|w~}uy~yvwtvz{s|}~|x~x}xt}xuxz|r~z}zy|vtw}|ww|qx{}}h~xx~|}xz|z}|~}w~}{~wpywyj{w|vrzouy~}ys|rxyz}z{{tpvu|{z}~~z~y{}~zzzpw}||{zw~}ruyt{trwuwrx~yzzws~z}|z|z{uym}|wwzv~}|wi}qs~{}yxy}{z|w}}{|tswtqtxu||y~wsn{{|srz~}|||}zx}m~vx|~}|}z|}}vy}y}|zv\~xk}|wq}~uzw}y~zuyvs{pyvx~us}~{{z~ew}z{}u~ydy|sux|~~z|{}}}yvuz~{}~{}~~{vw{|mwp{qv|}b|z|~|vy~zxvqxyyx~}o{}tb~|}{ywuu~}z{yz{p}~|z~{y{|}u}w~zrr}|~~}}|~~~}y~{wyowz{x|{|y~zyw|}}{{~v~}~}y{wq}p|zz|ws}y~~xvv|xzpy|t|sz|~{z|~~}|{u{qv|||xwjxufs||vyv~yv~~}pyzzxyqv~|}|}~|zyw{yu{z}nwwc{s{~q}{|{v}~x}{{wy{~~}p}~|}}xz|{}~u|y}}}xvrz}u|{v~~z~t}}xxst}}v~~s}}xvzszz|z{~s|t{yn}~~w|x{}z{vzy|{w~|xwzy~x~{z~}~vz}}{yzz~~zy~y}y~v~~yx{}}uy}wuov{z}{w}u~wszxx}{yu{zvk}{|}{}}tw|vv}}~{||ur~~u{wx~szvwy~|zyy}x}}xwx|}xx{{uzr~y~w}{zy}|~z~usu~x|~{ox}v}p{{}xp{xtzzv{z|cv}q{~|{|yuztw|}|zv}y~xx~u{}xz|}v{wyy{v|{yz|z{~}y{l}vtyyy{xwwvyz||{|u|vz}v~{z}{o~~v}{zrx|y{tuy|syyn~o}zwz~{~}||v{{mw}s}{y{~~}}y}~wwzq~~|y~}|w{zxz}uvx}y}|}|ngyz~|}~}{}y{~vx}{|{||{|}uyy~{|{~|kzyy{ww~z}v{~x}ty{z}y{|y~{{}~vn~x|w}{{w}}twty{{}~}|}|{}xx{rqyw}z|e}x~w}}zz}~|~|zx~|}|q{txltyx{y|}yv~~s}y|z}{z|{{kxzqw~|}{{}~~zyzyz{y|}z{u{|xz~~{}zy}w{y|q}~}~~zuzzju{{{}ztwz|{{}}}}zxyj~|~{|~|}z{|{t|yoz~}~t}{st|m{z|z}zy|{z|uz{tuw|~{w{{x{zrx~vwwrtxyo~||{z~~}zyx{~v}x~~}ywuyxx~z}y}m~t}usZ~}q{~}zdv}t{y}}uyzv\~ys}z|}uuw}~~py{~{{z}y}wx{|~{}v~{zyw~~xvn{ww}}v}z}}z~{~rx~xxt|w}yzy~|x~wxz~}}}u||yp}y~zu}~zwt|w~y{ww}f{}x|y|zu|xz}zp|yx|z{ix{wwvu~{s{~ut}|u|}~y|y|{{u|}v}}}zk}~z~xw|{put{|{~|}~w~x{y}|z}~y||}{||~}y~~u}~rw}}usx~p|v{v{}|{}zw|}sz{uyw|v|{ww}x|z}{ww}{v}{y{{~zx}|}~zz}}mxz|v{z|~z~v||wxv}x~koxt}||ywu{uv}x|py{z~t}yy}z{{z}{{zy{zr~y~z~~y||w|}y}}~p~zs~vr}~xtv|w~xxo{tz{|}x|wz{o|gu|uy}y~zx}}}}{y|x|wz}xy{zw}}|{x~~uy{z}}x}ut|~y~w}|{z{|z}~yy~}xnu|r~|z~||x{|~{xw}p}~{tuz~~}{y~~umt{{}||{xx{zp}|~|y|{{ys{z}}xxx{q{xx{~wv~ysx{x~t}{uwu}~|t}}zxv~}w}{}|yrmpx|yzy}zv~szz}}zv}w~~}s^t|j{q~}p{~}z~ww~|yyz|w|gwwm~uyzvos}yvzyr{|ryx~wutwy{}zpzrvzvxu|~~ww{xy|~sszy{yzc||ztx}xylf{yx}xx{~|}yG|x|}w}i|zmu{wy}{o}{|~~}fzf}o~|ny}y|ewrxm}wytz}wKyzzw}v}xu~~~u|w~~{}|zoy}t{z|~{{u}uv|}x~|{|}{{}z|x}y~y{}ywr|m}z{`uny{}wxtu~xtt{{x}s|{~{z|v{ry{~}}~wx~{u|}y~~|y|v}yyx|uqs}zwzg|}g~y{~|xy{z}~wvz~|y~}|wx|v||}vsqyrt|~~t}|~~|yvw{{|{{x}w|~vtut~x|zrxp|z|~{}xy{w}z}yzry~x}trr|~zv~m{|xwu|~y}u|y|x|}{}y{zpy|yyv~s}q|u}}uyz|z{t|y~zwrzyv}~vy}vx}u|{vz{{|~||}qusf}qm~y~|w}|s|}{xx|hzztzw{u~xy}z||}~~l~u|z~t|wwk{yx~~zz{~u}vy}zw|xux|~y~zq|vx{~|ypwu{u}||{~wucqyv|z}wzz{y}~w~~txvqo|}x{|~w~|z}~}zyt~x~z}~~w|~{vws}|y}ygzqyyq|}jt~z{z}{wzu~||z{}z~~}~w||{|su~tuv~{{||||z~|~v|~w}w{vyy|z~}||y~}{|~{t{wk{~}}wzxy~}v~}ws}|}ytw||z{zz}~}}}x{{}~zz{u|w{vy{{~wz}z~~~qv}vstxy|z~|zz|~|v|x{u|vywrzz}|{zxx{~v}}z}x}uo{{}}|z}~pu{z|zzzpwy}~v~{w~~{z|w~m{~|zzxw~|zzzzz}~~{}upx||{yywr}}v|~}w}~x{{ysuvzvz{}}~tt~u}u|}x|~vuw~{y|z~z}t}|vz{ztxwyzvyx|wz|{|||}}xxyznx}~}{~yzyxpt{|xyu~w}{v|uy~s{zzy}yv}}{xt}zy~{w~yvz~s|t|ys|wr~wz~{wzw|~}{wyvvyzu{|ye|||}|}}{|}p{{{x~yzv{z{|{s||}|}}zxy~zvzx{}x{}fvqu}}|vyz|{{~y~uzl{{yyy{{xy|xw~~|svx|{qy~y|wv{syq{hqsy}w}}|}y}|}r~y}{|x{||uzz{w|qps{{~y{||}}yy}vyzyz{{u~|}x}t}}zz|y{|qxw~}}xyouz{~ty{~ty}zz}vy|vzx{{{}z|yt||}u|v{vv}}xysv~}y}y{xt|y}{uy|x~u|~|~vy}yr~vpu~x{u}~yz}}v~}y|}zyt{{||u}|{x~}~{yxt|yw~|w~z}v|}~z~{p~tk{|q}}{{{w{}|xus||{n|||m|y|wv~tq|}uyzt|st~{|~{vm{}x}zzts{y|}||txxzu~x|y{tu}{{w|s||{|}}||~~s~|~}}zx|{wu}xz{{y}|tx|~}{p}v~|z~xz~~u{yzxw}y~u{{jwpy~p~y|xz}~~~nsu{y{}y|}|w^s{n}||yyv}{}{~{vzu}y}z{|~~|wt|x~sut|}w|v}z}{{y}nyxwz~w|zxw|szuy~|}{y|z|~zryyrtvn~z|uzvz{yx{}~{}~z{{}{j|z|~}y~|{zv{uyosy{q~}{{~wwzy}}zzx|w|xv|vzt{}~~~ptwz|}~w|xoyzms~~x}z||yv}z}yp|}~x{}~}vx{u|u{y~{u|z}yx|pxyz}{|}r{~t~x{{}yzvwwx~|{ww~}{}z}{|z||vvz}||xs|}|vz{t~~~{}trpxtyy}{vy|xrx|{|w}{z}v}|wwu|xyzx|wxts~~}|v}x}~n}zyu}xv~yrzxy~xzx~|{un||wuyx}yw{yvzz}}zzn{{zs|~yxzw||w|zxx|xvyyyyy{zu{~|w~zzy}l||vu|}}xt}yxb|~xw~}||h~{yx{}~y~}w~}|ty{wtxxrwvu|tx}~||vv|{p}~~|{}z|xz{}{xy||~}zzypy~xuxv}~vw|x}z{~zjv{}~vmy~}y}}x~{||z~x|~xz}|~~{y|{s|~}}w~~~||}xqtp}|x||~r~|w~|~{q~w{|w}{ww}zs{{{}{~{rg}}~}}{qw{~u}|x|~vyz|uzxxzv|}|ytz|~w{py~|z|uzx}}}}z}~zyy{}||u{{~}{}|~z}~|xz~z~y~{~z}y{~wzw~u|}zp~u}t~yu}xtvw|y~v{u}|z~yw|{{{{{pyyuz|~w{z||{{}~}w~z||~}vty{~~{puy}wzp|~z~}}{{~s}{}}vz}z~x{}~v{{~}|r~|x~yvxzezy{{~}zy}}~w|}~xx{w{{v{}{{}w}{ywzxz}}{{p}|wxsyquz~~ry||{{w}wyw}xyzxy}z|~vzszr|~~wy{zzz|ztx{wy{}xyz{}y{r~zw~x|zpt{x}{~uvwy~yug|ox}tz{tww~za~}{|}~}{~ww|wuzhv{||s}{zyyp|~ps{wiq~|~}}{x{uxs~~~~}|{z|xuw{kw|xy{w{W~v}t{xz}{~uw}}v~svr~|r|}q}s}}~}zu|xx~x}vrq}{~~}z|yw{}zvzu}~tw{z}x|{~|y~y~y~}zw{yt{v}xr|}|~zy{~t~z}}r{yy{yhq{rt{mwwnz|x}{h{{xx~v{|zvys}|~}wx}{{tuuszyjwhzz|}{nxqxr~|yz{~{wks{}||zu{y|~q}tw|p|u{r}wu{yz}}zzx~v}z|xv}yzzy{{w}}y{~{||}|z}z{}~{w~}um~||~s~zx~x{x|}sz~}Yz}{sz{ox}x{{tx~yyy|{n{ty|w~~|ymq|y~px||{yy}|~|}}g~yyz{{vzv}y}|{~~vz}xu~~{r}{xw}~|}xyzy|~s{v{~~~|xzy}z{|{|}o}|{u{~}|z{}z}~v{~sz~y|qwz{z|~}~}|xy}|t{xz|qwsyx{yzzw~x{{zyxwzw|~~y{~{~{zz}|zxz{~z|}wu{~w{z|y{{{nq~|u~~zxwu{nw|pu{zvx}|}}||}{y~~w}~|_}~rz}~z}t~v}z|~r}|}~uv~~}z}|}wxxy{|r||~}}wu~xw}zz|}{rwy}uzt~s{|o|~~z~{{k}}y|ty~{|z{|u~{yzw}{w}z}g}|xq|~y{syz}|w~{}}v|~yz~|~s}}|~~}wz}x{sv{}~~xv~{y|{{h{xvx~|rxw}w~Y}}tu|uy|u}~}}t{~w{x|}|kv|}~{||{}|{~|zy|}ywu{zs|{|{z~|{qx~|}{}uu~||u~|~~y}}}{}z{zx}zvz~}rxz||}t~zs}{y~xpw~xtuzt|s}zxw~z|~{|}y{u{nwvtn{|{}~|}qyp}|v}~{{z}|}rlw}~|wvvl|za||u{zv~}}r}{qywv~x~j}zwUv|mz}puvt~{o|~swypszz~yxv~psxey{}zlor{{Ztw|~}ws}tcztyuwu{|{uwzwvwwvunp{|z~z{}yσr|wst}{z}z~}}uz{~o_||ykngv|}]zotym~iudp~w}~xlt}sut|ktaw~wpxw`sun~znvt|xr{|yew|x{t|~~m{{~}vzw~}t|||y|gqmw~{nzys|xwr}v|}|~w}xmi}znp|xtocwytf{sm~|~Uy~}yk}wz|}}yyzX|uz~~||q}zmjxz{~{uz}tw{}y|j||uzwxo{{]xzxwbtzn{zr{v}zyxzs}~tw~~}}}n|wp{|}w}v|vh}xj}}tw~{u~yt}~t}v}{}{yzt|}y|vv}uuwvks{~}uz|zy{|}yt}zux|~~qzu}~}n{zy|}xuyu||u{{yxxx}}{yv{~yx~wx}v~u|{~~~~|{|t~}zx|~|u|{ywhx}n{|xx~t{v|t{}~x{{onx|s{tvt}zz}y{{xrmu~{y{rzy~xy{{x~r{v|{~z|tu{z{yw{~wzvyuz~~{|r|{~{wx}y|~}~{}~w|~{x}v|s~~z}~ny{}x|yywwy~uxxz{kp|xxlusyz{pt}~su{}~~{|~gw~|x~}tz{~{w}m~v~ow}ws|w{{yvopw{{]x]vxv|yyy{{zwyy|~~|z}~{|syx|~u{w~xzsx{s~xz~|}zz|t~wy|}zy|vxu|z}l{u}|y}~pyw}}{}w}|}}||ur}u{yw}x~}pz|vw|{k{|tsw}~}|{{x{x~x}}|{py{n|||zxz~yw}}|w~vmv}y~~x{xyyp|u~{v{zy{qxpx{|z|}}}wuw|}~s|||yxz|~|~`u}{}g~z~yn}tn{swqzy}{v|rx~~{p|zvzg}v|im||ua~w~vz~||{{}t}{zzys|}|}xz{{tw~zu|}vu~~}z{~sz{w{~vx|~{|u}}{}|~wz}{z|oz|}|~ytlyuwgwY{~}s}{ywx}tkyz|t||zyy~vzv{~y{vtpp{f~~~{}z||y~}zu|~ss}{~|~hxwwyn{~{}|x||v~pz}z||v~xx|}|}}w|y{q|qmq{xrt~~~wx}|r{~v|x{y|szjyy}|s~syysdvy}|n~|wx}~vzvv{wwtxz~|wy}tvx~|}j||u|t|tuzvvy|}zgv|S|vyr}yzwjt}{{n~sz~rx~{nzwtzp}{zu}r|o{z|{l~xwnpvzz{{x~yo]~ytxywxkpwr|ywqztwn|w~wz{z{z}yrwz|q~rvtq{}t~}iwr~ysw{v}w{mutw~|~{|{{xyg~t{}tzv~vwKwxyw~yz|uvq}}}tw}yzs~uzy|[ukx}pmyn}~{{z|z|}qs{s}}vzpyyz~~z|yw{~vzz|~|x}}}~zzxz|~~o|zq|~yw|{zx~z|wy~|}}x~{w{~zx~|s|y~|zx|x~|}wy}~tzk|x~xxyxxt||~urvv~xy~{wlx~y|z~}xwyxvtvy|~z|wzytx}z|z~h~}{|yyzu|}wzxx|uwpurk{|yzx~~}uzy|rr~y|z~zvz~vwxvzx~zw{vyy}y|xyyutxqzv|~{}~~~z{svq}w~xyvvw}xz~wx~x{~sw~~yz}zy{zw|{lz{wtz|q{|}vxzxy~~|zzxwvvv~ss|jsv|~ztyxwzzyz~}zyfxvysyy}|~z~x{z|}y}v{|xt|syk}sz}~|}}rq|yuy}}{vn~z|~~}x}}{~}z}|~}zy}{}y~rxxv}vy~|x|yxx|w{~yu~}w|h~mx~s~t}|}x~}{|~sd~|tz|{}~y|y|y{zzu}~|yxzz{{tv|x}zzq}||{r~{}u|yyl|}{zy}~vzsz|~|}||||y~{~{{x{{z|u|}}ywuqx}z~|{{t|}y~~||~~y|z}|p~u|qu{{|||vpx~|~~|~zwp{~w~xp}{}{~|xxz||o}txz}s~vx~x|{~{~~zpo~}zx{~{u|z{~h}|}~{}~up~~z{x{zvqu|v}k{z{fp|t|~zx{zyp~yt|p{msk}w}zz|||}|y|pw~yx|vz~}|yu|yyy}z~{|{{i~syy|zyqszv~zs|{z{{}y~|wx~~{|}}y{zbv{~wu|||uzix~wx{vpz}~|smy~xv|}~|{w}{~{ziuovz}x|}{ys{z{tov}|j{~ztlxzyy{{w|||{~rvzz}~}ssnzzyuv||k|zqyz}z~}|~y}opy|z||||r~y|j|e}~}fzsouuyx~zt|~s}zk}xpx{|z|}yj~zvsu|~~x{||yxduz~x}t}s|y{~}|y~~u}_vyz{}y}|mzw|}{u|z{~{}wxmvvxwzvv{|uqwos|~|z{y{|~|}}nuv}{~wx~r~t}{~xv~}z}xy|{zg{}w}|{|px|{zq~{}z{{vwq|swmr~zr|}|zy}r}xnv{{x}}yu}wo|yx~k{}w{q{xw{q|q~x~||~gzq}~l|z}}y|[zyruyzyt{x|yu}xt~q~~x~{{xv{|x}vx{yx~w}|yxyw}||{x{~~}}z}~}w~~}{jw~~|z|~}}}{u~z}z{}y{t{~tpzz}}}|vq|~{zx{{zyu}y~|~n~}xq~zk~v}v|~|{}zx{~u|{|~zz|x}swxw|{ty~y}|~gzzyu~}x|~uo~|}zzx}}ul|v~~~|x|}vw}~}r}yy~v{}z~{nwzyzzx{}z~{|y}xy~w||{}qzz}~|z}r~q}xxzv}|y{{|zwy}{zzkx}~zx|yn{~~x|wy}{|}~ww|u||~s}|~~l}qms~t|w{|_{~~k~|~{rjzw~|}n}~~xz{}pxw{}uyzwx|~yz{kmidu{rt{wzyuzv|wz{zwvv}}ngxyvv{}~yj|z|}xyp|}~ozozw}xnyz}~zn|qs~~~zw}r{pt~}~xutu~~u{{{}}j}w|tt|{~x}|}x|oyw{{{~}{w|}ls}{yttpux~{v}uxpxowzxy{vcvs|x}}rzrjy|{xvx}xux|ts~v{zy~r}|kwr}|~ysz{vmzy|zzpx}s}vzo|||z{xpsyxyu}|v~un{x{{uva{}u|~xq{n~{|tq}y}{^uyx{{~ws}vpr~~qstnr`{}}m|o{ux~syso|zx{ox~v|xuqyxv|zxt{yvt||cq}z{~qtl}}~|o}{|y~}vv}|xx}{|w{yqpy{w{~s||yx_~}{xf~zy}{}z|dvzn~t||xvu~tzz|~xq{{}x~~|sz~}}{||~xsw{rzz~x}ryy|~z~ym}}|vz}|z{xt~zz{{}~~}}k|x~~}}xx~{}{}npy{z~t{{xl|x|~}y}}|~{{~xr{yv{|{~x}|z{{w~{|z}vx}zxztvt|z}~~~}z{zjzm~tl}~{n}~mzx|}~s{z}|xxp}w|rp|u{}~|{rz~hq~~w|u}u{|zv}}r|v|{||v}~t{y{ym{{zf{yv~~}w}yys{qr~q~z}y~||qp{{t}pwxzp}}v{|n|~q~vv|{z{|wrsxz|ym||y~{qz{xvw|~{w{~wzwuy|z|v}xz}x~x}yyxy}z{|~~|z|yy~s|q{}|x}q|{z}}y|zyy}~ssuutzyxy{zztqy|y|u{|w}h}{{~tx|yy}{uzyr~{|}~}zr|~t{~r}vt{{~xvmz{xv}s}~}wt~nvzyy|z}zz|sw~w{yz~tw}y|wx}|w}z~xx~|xx{|~xvz|}zj{x}z{}yy||}}{xzy|u~}|ynq~{z}{~}|syww}}us~u{}}~vxw~~~~yztq|r}~|vyu|{~}~y|z}zv~x}|z|z{v|vx~z~t|~|}}|yhv}w|z|~~}yv~{zx}vyp}mms~~{p}~x{zyxw|{{xz~v{}y}yyzrqowgzyzzz|ytu}|~~yzv~{zu}ywy}kyv|j|sx}{y}y}~x}l~uu~wzyux~}s~|_u~}wz~y{}q{vyzy~u}vx|~~}~}m}{v~yz}w{|qwvzw}}}ts~~~qrz{z}xhmyuzwzw~{}{|z}p~xvmq}{~}~~}yrx|{~~t|uigx}v{y{|~rx|~ryp}~z~tn{S~{t|~|zxt|xxzp}{xwyq|}z|z}pvr}zxz{|~xz~rzzw}y}ys~}rp~wtpozp|nsvjpzuyt{z{rv{vw~{wfxoswy|zzx|x||}y}{v}|}vzu|v~~y~}h}ysr{y~zvt|z~~|{z|~v~z}zyy{u|~xx[u}{~{y}yu}x~u}{}|t{|{vzzn{}ywvyrx~~xyzx}||}~~{z~{yy|}~nxtt|~}~}}~~}}~z{uy||||{x{u|szv~}|yy~x|yx{wvn{yz~{~}y{~~~~zu~xu~u|xwye}yw{zx}~}wz{v~s~|p~~yy~xz}w}y}{sy~y|~x||y~x{}~ztysz~}xzyxwy{~z~z}|~x|{{|{}q{v~zyxv~sy~z}zvz{|~w{rp|~qtz{y|~ru|{{{zzz{~|v~wr||~||}zt{{zzx}}z{r~z{~nx{w}tx}{~z}z~{s|ty~}j|w}~y|~{|~}p}w|wz|{}{zs}~vty}vz}vxwwuz}|~|~}|u~|zyzm{z|ny}v|yypywxxy~w||~w{|~z{sx|~y}~|us~qsx~yxv{~~{|}|~}t|y}wx~{}~|{y|xwvs~t}xyuzxy|zv{}yw{y|zq~{y~{|y{etxwz~swzzww~}s}|~zx}xzwx}~|v~z{{y~lwx}{|}~ytly}u|}y~}|}|}z~{~{}~{|}pv~sw||~y{}{yy~}smx~~xvu~u~xky|xuz}r}t~zxv~xz}}my}}sxmxrxy}ty{z~zq||z|opsq}x~~x|vszzzv|tv{}x~~x{yx~zyzt{|~zxt{zzszmd|q~zspu}}{|}|{k~}~oz{vg{zs|}sn~~yzvw}{|zt{{}~{{zztzp{zxz}~|p}wnzz{r}}||{}}}}v{{xv{~}}|~}{~yy~ywax{~y{z}|{{vhb{v~}~~pz~~|}tnu}{s||v~vap|{{~mys}|{}~w{vy}x}g{}ysv~tym~j}u|~u{qrxzx{}{yyz}{w|wzz|}xtz|x~~xcy{y~|fuur}n~zyx{|{yvrz}vfyk|{vlw{|~t}vy{z{tzw||wpz{{|yuyu~zxmjzx}zx{|uzyzrx}zyyzr}v|pwv|jo}wqvzwxwzty|{}w~}zvryvyuyr}}r|t~x~x~xupUy{Hoov|~m{f|~w}vsuwt|~||z{}s}ay~x~|z|wwzyuq|fs}}~|{zzv{us~p||x{s~P~zubtw~}ut{{|yyyw]{}z||zrtvx|}xsxytvxl}v{{r{z|}z}[{u{swz ~q~t|zh|sux}{x~x~~yw{{z}~}|uzz~y~us{u"wqsyusyy~y{p}}||yv{~{ztz|wnrrx}x|q{{x{ut~xxt|~w}{s}u{ww~Pz{xvszyvtvwz~w{syzt}vus{rs{~}}}t~p}Wupsyzlzx}zmvwxtp||{{yu|~~}x~wy{s{}y~|qzosw}t}|ryjw{sx~z|uzu{|{uxt|}yvwjfVv|x{xyw~w~xwq{p{{vwv}t~x}zzrxx~|{zwvws}}|w|tvwtz{zqszx|w}sm{uy|x~~}rx~z}xs|sy{py}~z|zzx~|zulv{|y|wxupvokw}nnsut~p~zuz~sxx{sr}~|yvzswmv{}t~qztwxvytytwy{~y{zt{|z~r|w|~zy}|{myssx~yz|t~~z~u}wa}|x}yo~sv{uurxzxovy~o~~z{pwz|qq}zZvxs|z~z|wtzu}zszz~|{y\}s}uv{s}x}~||}zx||z}x|{{y{xyrz|xxy}xpz|wz}}}y|r{zyz~~wrqy~s~u~}zty{}l}fxxy}y}{~w|}z|}ysx}k~q}~o~}}}}kw}uyznk|xx~ts}vwuvux|}v||~~zvw~ms~yyz{rt|qz}v}xuy|{||z}yu{w|uzzzv}rk\|z||~|}yzt{|q|xv}m{{~v}}y}ingzv~uu~{y~~|j}bqz{{~{|{y|}yyv~yuwvzw}y}vpwtuv~n|z||}vz}piz{{utw{|xwo{tz~{~xuywrt}}}yz|svsvx|yx~|xn}{{u}sz~~|v}z|{xy}wy{|xkzwtz~syqkyxy{{sw}x}}|yx~zzw{|z{|z{}{~{|zs|{t{~m{utZ{{u~|~~z|}x{~x~|{w|j}}}~y{~~}|y~u{zqxux{qzz|~{~rtx|z~|q|}zz~{t|t~vvuzr}}t~x}}u~{|~yymx|y{wuzw|qxz}|~uuow~y~{}ut|wy~wx{|s~z|}vyt|x}}||}{y}uxl|xt{}{zzyxw|}~~~~}~|xzw|qw~~||~y{z~u|}zuzw~~||nzzu{|xv~zz{wx~u{vuzxy{{q~}|qxy~{}z|uz{~||xv{}w}v{yo|u}{|~z}zqzyqw{}wzzt{vrz~y|y~z~{yv}|w}zz||xu}w|{zxnwu}x~}|{}yzx}{ywrzzxyx{xwwy~~prw{}{v|wzvxz~~znv|q|yvn~z|y~pyxt}|vz~tzww}uusn}vvy|y{s{}~x{|{z~|yw~}||t|zzqwtt}vv~vz|{{x~ypvwry{|{|~{x}x|}{{~yzz}}|}wz|}yxtz|yw|{~zz|r{vv}~qxz|wqz~|xx}ps}pt~xz|wz|y}umtjz{{y~y|}x{yuw~||{z|y|{v}}|~x{{m~{w|{~b}yxuzy|w{|{ox}}vxx||yv{u}zz|wun}}|}}uzzrnx~|z|z}{}||z}ru}|xzz{vyxl}w}}}y{z{w~|yur}z}{|r}zwu{{zx~w}vwt}tz}xss{yyvz{y{v|xvo~kvttl{v}v||{||uwv}{|||w{{p~z{z}rz}~uwvvxx}s{|p~}vvr|vxy{x~|ryp~|oyvv}qv{~r~y|}q|{|s~|~{||}y}}sxwk}oyx|q}~~~u{}~}~s~x|~~zy}}qsv|~||uy|~zv~vq}~yzxz}|~}p~}zx{~zpzxx{y~}}|}wx|}~t~~z}|wy}}x}y{}~xx}{yyvzv{y~~xr~{|y||zx|tv}yx{}y~{s{}yzxs~v|~vy|}wy~|y{|}sz}~~}|u|q|zj{}~y|{jzxm|}tv|oyzy{{|x}}y~}wx|{}}}wt}w{~uz{xyxy|muywv|{zx~wzwzr}pzwxy{~u~~wz~zyyw{zu||uz{lv|xzur~tzzz~n{vy~}xww|x{{{zv}u~ut|}|zzsyy|~|||~r|~}{zr{{ywozuz|s|v}wzwyz}|z~v|||{qt{v|w}u~y~x}qy|z}ntrzz{~}y}r}v|~z}yt}p}}|y~y{w~n{|}t~{z~x~|uxqz}y~|}|||~{}~v|z|}|{x}r{}}{{||t|~zz{|uwyoux~}w|u{x{yt|z}~zy||}z|z}|~~v|xyu{p|x|}}y}|u~z{zxrw|wmz~|~|~~yvz{yz{kqz}}w}~}ly|}~}~zxxq|}~v|}v}~owuy}zw|u|{y}njyn|xw{w~||~|{|~x||o~~}{t|}xqw}x{t}{w{{ww}{ozv{|wwx}zys}y}}{~vvss{|r}|{f|{]|{q}{y~}z|~o|v|n}zzvr{y{{u}y|y}tvyzwuk|zw|v}~~z}zqx}|t}}u}}z||zs}v~{{s|~}{||~{y}w{w}y{{tz{}ssz}ww{||~x{|{sq|{z|}}}x~}xv}y}q||{y|quj{}z~z}{~z}~zvx~xqx|v~|~|uvw{|vuwxx}{~yzvw{~~~{w}t}yzxyywvx}}~u||{tzzz}}~x|}o|kypyzzzzn^st~}ou}z|sw~}w{r~{|x}{vzx~xpr}zvz|~ypx}ktyyw~|}w||tw~y{oysy|t||s|}u}vt|t{vxtt|y}pu|~}}z~t~vvuxy{|~q{v}zwz}y~zt~y~t|w}xr{j|~s~yyr|}~{}~~|y~}|y|zzy}y}|yy|zlz{nv~ry|vr{r}{~}~|}zz{x~~v}|{y|s~}z~hx{u|wjty~|s{|}~~|~{wv|y}z{~{~wu|~{qzlzwwv{}|}|~su|xwzw}z|y}wj~t~y{}~z~}~p{|s|||~|wz}}tz}y~|pu}x}|~vxvv~tuvrr}}z||zy}q|}vtzb}ls{~|jq~z{}{t|w{uwsv}{t||{}}}|zt~wyv|s}}z{l~}|}~}{}~}zl~~{|}xy}}lw}}x}{y{zz}~oq~zw{{u{}o}{ty{~}|z|uz{{zywx}tztv~x{~w~~n~y~p~|y{y}{~{{qzz{zt|t|}z~|s}~}vwu}}yu{~z~p~ywx}~x|~|yx}|qzu||xx{z~||x|w}{|{~}xxz{vw}|}vt}x~z}y~o}}rt{w}x~{|~}~xusw}zu}}xvzmwz~|yzzz}}y{wx|sywzr{~x{lz~|~{y~~}zt~qy{}}u}}ys}~|}|}x||oz~|}|{zuy{q{~|z|~}xm~~{|}}}x~||}{z|||}n~|x{xx~ww}wwy{|||~||{|y~~{{y~|{x~om~|t|{~y}s~~}v{y~ywvzz~|{~p}}~y|{v{{x}vxz|~rrx}w~y~||{w|x{wu|{y{}z|}xzzuyy~t{}~{~~zxyxzv{|~{y}t~}}s}}}uzpw~z}~}{t{rtxs}yz}w~~{vu~|}xx{xq}w~zvxx}uy{x}|y}|t}v{{{l~{v|{yyx}tuy|qvy|x{}{yy~~w}~wy{yw|{w}uz~u{}{x|vz|u{~~uy}~{}~~w~nyu~r~u{y{}}|y|qz|~}u}}y~}z~~{}z{y{}{zsw}}v}{xruvnxwu~z{|yvy{|}yxx}|z}v{}v{s}lv}~zzxzx}{sxkp|zx|nyzowzyyuzx}}|rxq~wy{}y~x~~tx{}z}~z|}~zt}t{y|xz~{qyy{{|x|}ty|w~urxr|txy~~{r{}wz}~us~{wqu~}t~~}t|~~|~|}}wyv}yr}wnz||rpx}}v|w{|vz}{|{ttt{{o}~z{|w~{~{{}xzztv~}|}uvv|y|~}z~|wuuuq|xzux}x{svr~}urvp|x|~|||{xuyzr|q|s~~w{yuzyxq~~w~}~}k}u||m~u{|w~ztwwsv}{x|~{||sf}|m~}{v~s{xrwzqzz{y{~||}y}nusu}{u}{~zyxxyv|p~~|z{m|h~~r}xp}z~e{sv{}z}~yz`}xy}put}x|tw~~z~x}}xxtvqwwzzuz|}|xuz}~jss|yw~~x{y{x}|x|vy|zm}wx}~ylxt{s}}}~|vu~|}twtwpuwu}yowxyt`vy}|vyzuxqvzvvy|{z}}uw~}~xw|p{xhts|uus|vr}zttry~||yz}yxz~}q}|}|yruvzwpy~zwpus~}u|qryz{~|{zwtxo~y}yvuyor{|ytyzzw}zqy|~yy|vtxnw}vxzz}q~h{zszir}~w}}{vxzxyz{w{njx{{v}k~}|u|yy|v~vrq}~~ur{tz|{{|~vw|~~pzywn~~{yz~sv{v|}uqpzs~{}vzz~qxszs|zw{}v{t|}z{v{~yx|yunz~yqv|}w|qzuy}zz}~p{|}zhww|ntzx|nq}{~|u}~tzwsx}m|ty{jwnv{w}{rn~txu{txj{~wz~ns}xr~|wxkzznzo~p{wuwx}~xqu}}ox}|z|uy{tyt|pr{~vtyrwwyoqx}}}|zy|~y}|v}yuztu~f}t}vuz~~x~{{}|~z{y{y|wvzrmtsz~{v{|}y|}yy|{l~x~~y|u}|p~{xz}yzy~xw{~|~|{zs~q~vyzo}}twxt}|x|}{z~~~ztz~z}mu{}}yx{~wxt}||v{~{}}zz}roxy~~x|~|}~{t{y}qy}}zwy}y{u{yly~}zyn|qo{{|}~|o{}{w{}{~||{}|{yu{y|yw{~vpyz}~z{~u|zzzzp~u~q~|||}~zrx~{s}xy}zs{}sytwvs~z~{t|x}~|sz~~yxuuzwz~||{v~u}}|x|zxyz|}{w|x|zw~|~{w|x}wm~y}{{zx~|t{{{x|zwvsp{|wwxzy~~{wv{{v~{{~~}zv{y}}wz~}s}w}z}z}}~s}t}}k{vuz}uv~r~}||ytxq{~}y}zwz}vz{rmzzv{wmuup}}vtp}t|y||l{q|v|{ysxvt{x}|}uvzrwyyy}jz{|m}~~|z{||y{xsxqzwx{z~wvp}u|o}px~txzsz~|u}|svw~||}|xvuytz}z{y}{}|u|x}t{|xtu|}zr{|}{~}z~lnwxa{~xv{{|~zx{~tnvtyy|tvu|vyz~|svxzntsv}xyxzz|y~v{}|}uuzgj|}uyxxos~uqqtpy|~{xsvwww~x}{wgzq{zw~zr}w~o|w|}x}x~{x{t{yryzz~~s|||y|{{xn|}~}}{~}}|}vx}y|xzy}~{{|~~~zz~yx~z{{m~j|xs}y|z|}w}|{y|}xx}{{wz~}{y~|y~|~xyzxu|z{z{zswvzx~{{zvty|}y}y~{|{vww}}}{ttw{~{z}xx{{tx}{|{|w~|u~{y}~}~qsw~{vyzzx}{~~v{~wxzy{u|}{t|~u||{}z}}}y{}}w}{y|~}z}|}|}z{~yy~}w~x~z~|}|}~xx~zz|~{||w{}vz~}}t}|v|r~z{v~ys}{~}{tyw~ww~xy{}x{||}y|}y}v}|x}{w~yz~zy~wy~zzx}x~{{~t}~p~zv{~{z~}r~~z|yspt~zqyyjpp|wxsxy~nyq~us|sq{}{~zx}rp|vzr~[w9zuw{~tsz~uz}uz|~}}}x}|~z~wt}y||~|l|}m|{||xr~z|x~|w~|~z~}{}x{}~|n~uz|v{w{}~~|tz~v|wz}x|{{|}}|ozz{}vy}y}{}{~y~}p{~yuvt{~|||{vx{~xxw}{{{x~xyo~}{yx{}x}n}}lyy|{jsz~st}}v~|mz{{{|z|~~~|||zz||~y~~}|{|}y~yzy}{tr}y~}tw|w{}}zvw~~zzyxi~x{|}{||swxy||pv~}vz}y}z}x~zwppr}zsp|}u}wsy{x{w{|~|}{ujrxr|uwq}|x|~{|y~{||uz~ysx{}vvuy|y{|uj{yj~{{u~|{}t|u|vi}{|{v|}|}dp}~zw{y}}nslsztrq~~s~z~ny}{y}z}||ztrkr|}y{}uz}}||}xz}v|~y}ot}|~~}y}pt}}~p}|}~z{uy~r~y~|y|}vvx~z|tzz|w{y||{n||n|~x~ys}yv|yz{yu~{z}yzw}yzxnuyux}ty}yw}}{~~v~yuu~xzzo~zyqz|||}sszq{~}xzyxqk~yvyv~|z{{swrqzyz|p~vwy}z~xtw~zswz||~wwx{mzzwz~|x|~|{}|w~zx{xqzzy~y}~v~{~u}}~}}}ryx~x{{{yxxy|x}}v~z}wvxx|uw}tx|}y}z~w|~~}}|}u{v{xt|}[|uvz~yq}}}||}x{|woy}|~}{}|{{v|~y|}y|~{l}vu}~}~~y~~|z~|rz~{ro~ur~|{u|{vp|ywsv~||z{z|wy|}|}{|~|tx}|p{n{puvz{u}|}uyo}|~{~}{~wz}|z~{|qz~vvztyu{z~{z{y|y|yy~~||qy}|s{l~}|q}a{z{{{|y}v~~y{||{~~}|}y}}~~|}sz|{y}x|{|}|z~n|{r~}z}y|xxz}yt~~~{|}{z|{u}|{ry{x{ct|~x||~x}}x|uj|{q~yyv~}}w~wzy||vyuv}{|}{r}{}{~vo~xvx|u{x~{{tz{y}zsxzzx|yz{~|{yvvxs}rwv~~}|t|vxy}zz{`{ogty|}||st}w^zzw}yvn{}~|v{~t~}}u{~|z|s|}w~|tzyu~||}}ph}{~z|~p}vz{rwtz|zzwuzutq{z~}|}}|x}y{~xyuso{ww~zvwp{{y}~u{z}t{||vvy~}|~}p~z|vv~{}khy{~zvzwo{m{xxxtxtym~sxvwtxwrzxuypy|wy|||syuz}wy}u}~xtnz{|m~v{w{uz|p|~x}}}y||z}q~w~~tvus}xyyx|s|~xpy{x{{x~{~xxyr~o}uzz{ywet}v{{|xz~w{gxwu}}rsy{}v{}}~{|{x||{l{}tz}{vuz~|t{yplqt}tw|y|y}|xx{}||y{pyz{|zxpzzz{sy{{}{{wz{r||zzzvx|}}}y~~j{{s{w|~~~{~}pyxw~r{vyqupxxz~xvv}q{px|}yw}xiv{{}vv~e{y{jz|wrwv}xzz~sw{yxu{{||r}x{zpzzx~zzv||xkz|xy|~w}yyxy{|xzy{~~xnow~z~}~~~zz}}zzm}r~~ryxr{~xryuysypqwn|nvxxw||utrxsy{~}yw|vn~y~vxxx~pm{ht{~qrouvyx}|{{tzu~}vsu~|||x}uy|p{xzy}w}x~x}|z}wq~~vxozz}}x|wxyw~v|x}|z~w~z|lp}|t|~x}uyxzqw{zz|w~yw}{~}yy|wz{}yqy~|{}zw|{|r~u{wwuozw{~xu{zv{{{{}ytyu}w~~~|}|}}{}x{xvw|{v|z~x{u~{xz~qywx}z~zwk|}x|{yuydv}{z~x}~|~wr{xyszzzyz{~}v}vx~x|xs{xsr~qy{~p}w{|~z}zz_|~zu}|}~~rvwww|~|{zx~~xyr{xq{{{uy}vsp{x}y|~{tzy}}u{}{ytzzVw~}}~r|~{~uxyx}||txzt}yvz|~t{xu}u~xm~}p|xu}y~}~qv~|z{xy}}usvz{z{~|rzs{yx}yv|w~w|vx~y{|v|y~t{|zteu~q}~xt{x}vq}|{~wt|t{u}z{k~|m|{uwy{wu}zy~|x~iz|pu}{pwl}y|y}x}}{||wo~}w{}z|~{~x|{uy~}sll||z}|~}|}}xzzq~|||}{j~}zx~qk}v~yxx|~x|u{vp{{{}{~r~~|yz{zzy~}~x||x~}zz~oup~{||~ywzx|x|xzz}z|z|z||{}t}~uo}~u{|s}r|n|~}rp|{}|s{|wr}u~||x|wzt{xxzutkyz}}zyy}py~}v~u~uyyw~v~}vu|}n|yszz|y{|x}yx|~p{}{|}{~~wvyxs|{}}~{syvz{vwvj{|xtv}tz}{}xv{vtyz|ww}~~{r}~x||ryy|xz~u}~}m{vzyxuv}|{{x}|uzwwxuy|zyy{x|uzu}~uqkyq~|}v|{{b}x{~}kxv}~v{}{uw}xz|o|y}~}zxhx|j||u}w{w~p{}{}xw~{~l{v{s{~||zu}x~{pm~{{qq|{y}w}}{{vvr|~js}{ut|z~yv{wy|t~|{{{||xs|y}tww|y}}kz{sr{|z{z}}{u}w|xr}uqzz|~{m~}zw{~~w~x||z~{|{~w{}gu~}{{yzt|{tj|rm|z}v|q}x~~w|yx|sv}}|{x}~{zww}}vo~}~xyyo{yusvsv|w|zx|{vyu}}}{z~rw|{}~{x|{{o{{~}{~lut~{pkpq}uz~z{wxwxq~}}rx|wx{||x{~|f}~uu|~yt}r{~|~w~|_|zu}~~yy{{~z{}~||zz|~~v{svzvt|zy}|}zuz{y~w~y~y~yvqw~}|v~}{z~{{|~w}|~m~z{v{~{~v~}|{ztvw}}~}x{}y{~{w}|z}{{ts~{|z{~|y~~v|zyx}vfxz|||z|}|xuu}|wy_zv|||}zqz||y|z{x~}~p}w}~{oz|u}y}~~}|uxq{w}|uyxwxtyr~|}vx}v}~xwz|}z|u}{x{}}~q{~}}x}~~}}}mi||xyt{r}z}gy}}z}}}|qyzrv{|y{rz}|vz|}rq~q}~r~}z}}kvx}{|}|}|zw|{|tpvy}r{yyy{}~~~}u|}zt}z}y~y}txz}}}}ww}~~~~}~~~~s{z}}}|~|y~y|{ww~}w|}|v||zw|y{r{{yvt}y~znw}}v~x}u{x}{}~{~}oz}k}}{||~rq{{}|}y~|}||{y|z~}|{pt}au|~q{|||{~~}~q~{x|u||~|wrx~~r~zoy|t}~xv~{w~|p|}yz||}x}ty}zu|}z|~w~~ut}}~~q~xtvqu~~x|zy~z}|}w|~v~~u}{~p~}}|w|x}xuu~|}xx}zyxz|t~vw|w|z{v|y}vu|{oy~{xk|}|yuxyqq}{}uwwz{r{z|~}z|~~|yjz{{z~}z}p|us{ox}z||{w|^w|yw}}|sz{znuryw}yy~k~wo}yxu|lvwj~}szt|~xvzykxw}{w||~yyyvuusxqz~{{o~q~vtwz}y{{s|vwz|uu|y{yt|~{||yww~{z~|~}q}yzz{{|~{~ww|~u`~vrz~z}w~z|yv}y|x|sutv}z{vy{~n|{y|~zxz{e}v|zqx~{t}x~|yu~v}x~}|yo}yX}s~|vxyv{u~{~slw{|z{|pruzy~phwyp{tp}uwswwx{v|z}~{}ztq|z{}|ry||ywx|px~|y||{|xvt|txwtxott}w}yxy{yvowxy{vyuxzz}jyv{y|}}o}tk}m|zqxct~ws|z~i|odt|x{}|szqyzyny~}r{\zn~z}vpszou~yttqy~wtuvwuv|x}ow{w{xpanjYzy{us~Qx{zz|ouzociozyqvvy~~szUk}m}xupz|}Rn|njv_hplqxfovv~}u|ht|fg~}{{tu~{y{kd}~{zx{tq}ovy{p}z{l~zz~x}x|stzw|u~{qw{xfu}znlgntizb|qzy~}~u{to|wx}{wm{y~|u}~tq}u{}{v~hvw}|t|}qx|x~~tvrp|zk|iuu~D|j}duy|zugy}}}vz~{zqrtvq{s|otx~zVy}uz{y{|qzfywyt}x~z~zxr}|tz~o}v}~w{}~~w|{|{}zy~|ytvw}s|z{}}{|}zzv|{|~|}xw~~}zwt}|{|yw}|||}l}~{vouyw|o}}{yz~uw{xr{w{|}|{|{xy{xt{y|ts~yy||{}zw~wqxzwwtvw{~|zw~u}{q||}z|}sz~~uxxuvx{}p}wovt|uzvy~{umwz{x|{}|vv~o|y}}z|y~|~vyw||}zt}qt|}~~xz|v}y~xsquy{}~}zxx~wxx}}~{ws{}~|skzsrr~n{}z{}|~}}}{x~zzz}v~zvzt~wy|}}u~qv{{xz~{zyz}{u}~~~}~~}{x}wxu{{pyvz~{~{}{{zyzy}m|sxvo|}yztu{|~r}tx{y|}{uz~~ts{~xt}~|{}|zxz~}|wwy~{zt}s|y~}|xnfv{~}vy~z{}yz~nl|{zlyqy{}}z|}p}x~}z|t~~~wx~~}|}yryx{x|oz||zw}ztu~w|u||u~~yz{tzrzymeo{ys}{z~yq|z~|xs~{}|}|wvx{t|tywyz~l{{||}yxw~~}sz}uz{|~yrfzw||~~{ux||{ytw}yzw}|wq}~x}vzw||yr|{u|{zs|z}~{zwyzuu{zzxvwzm~{v~ztmyxut|~w{z~r|x{~x{yom||{|}~yyx~yy{u~s|r||{}||y|}xzy{~ewr}|p|xwtzun~||zx~v{x|g}{r~{{{|{~vzvsw{}ut{{l~}iy{{}|rr|zcjz_z~zq}~}ui|}~y}r~|w~y|y}{{~vny||y{y}{zy}}suz{v{|bo}}tzzcxu|yz}~|_{s|tu}}su|vr}|z{{~|r{}sp~~}|~}l|y~xzvb~xv|yq{~s}|~~|os~s{wy~{{~z~v}|~r{ykvz}y{znw~}~|~{|{|xy{y~yx|{zwz|q}uop{o}z{z~zo{~y~|}|{y}vyzvw{ww|yr{ztck~t~v}{q~txvu}}y~u{~xz{zu{}w}~v{}l{q{ty|us~p}}{{}|yfwvy{r|||zq{i|r~|wo~~~twoz}yu|}tz{}{v{wy||}x}|tx}yvr{}|y|}yvz~|uy|g|~}{}z}x~zzorz}}}x|z{t}~|}|w||ws}y|{zzy{~{}x{|ys}z~~z~wo|}yz}t}zu|q|~yyqz{|{~{v|yvz|wzuy~|t~q}z{|px}y~yw{yt~s}}}~p{|~y|y~s|}w|z|}}}ztsfut{{y{~q||tkz}{v}~~{yn~t|{~t}}qxyx~~~~~|}}~xy~{~zxx~}~vnu~~|{~s~kz|y~|{}y{|yy|}zyx~zyr}yxz|z{~{xzz}v~r~~~wv~y{|x}}~pz||r~{}q~z{yz}ouzyyt}{}~zz|r|||~}yzyx~{puj{{y{~ms~{{ys~v}w|p|xy~{}t||t||j}}~{xvss|g}~r~{~|t~yt}x}s}|zz}x~y|z{}|||~~zx}{|}~{~{~zk}w~t}}q}{yzx}www}~|zs|v|y~qx|~|{}z}|wz}}yxy|xywz||}|z~~|z|w{~v}~~p{w~{|x}~~}~~|}~}xz}s}{z{{v|x|~tr}|xx{|pyu~}|y||r{|o}{}{}}tz~~~x||}z~x|}t~zw}zrn{u|y}}z{w~wwyz~x}sz}unz~y~}}}|}pw~|z}qrwvu}|w~{z{}y~z}~||y}}{y{}{vjv{yvww}w{yxxvyu{t{}ww|u|w|{|y|{ywz~zswz{~x~uyw|}~x~}}y}~t~|}{|z~{~|a}{|}x}|l{|z|z||{|}ts{y~{xxt}}}zlz}}t|v}xuzyjxi|}~|~{u}w~}Yg|q~rs~ws{|{w{~|zz~q}~y|vzs|{{n{|hl{l}{|v}|qp}~{x|~u{}ny|x}vxxyyxw{}q{~}}jyy{ulzr{~{rxw||t|~`|vlwy{s|z}}}|s~x~}{~ezvewyug{yxqz|y~uwyvyy}oysy|t{wz}|x{~{v{|t|~~~p{kzw}|~wxwz{xz~s{~uyzwz|p}zym}y~xr|xz}n{vw|vsyzys{xmz|w}ytkwx}v~{y{|||{w{~z||p|{~}q~z}{z}}|zz~n|rz|xqw~{|u{wz}x}}~yy}{~v}|tv|sv~vv|~|~~w~vuy}o{z}{}{z}xzv|}}|~s~zzx~wv|~q}z}|~~rv{zly|zzsx|}}wy}r}}{~s|}|}x}{}|}z}~q~vt}o~|~}uz{s|~vy~x{t{~wo}y{p||v|{vy{pw~p|}}w}w}ix}{y|x|}kx~|zve{~}{|}y}~{uuw{tvo~yx~}~ku|{qzxwu{qyvy{}}{{~|}}|ysuv~x}~z{z}vw}~}|uz{~{w|}yy~tzw{up}~{zzy|}}yz}z~~||}m|r~|}f}uz}~ywy~wy{~}~|~~y}x|wy~~}vy{{~xz|yhy{}vy{w||w~{~{~~zzxx}~uz~|ur{yu{}u}~zx{|z~|}vy}xxv}{}}~}xzzyzz}r~{{|uz{z|}}~x}|zu~uw~wyzuy|{{}x}z|}z|{wxz~}~}}y{z|y}{}{z}y{hzuz|~yyv{y~{xt{z}}~}xzwds|}{zw}y{uz|||~z|rux{|||~~{x~t|xz}~}~xz|{}{|s{~ywzs|sz|v~{}}|k}wxvws{x{s~{u|}z{j~y{|xwt~z{}~v}w|zxsy}z{zvyz|x~x|wzwx}zt{swz}m{uz~|]tx{hv}w{{{ytwr|}x{||||xw|zx}zxz~|zrv~|xv{p}w|}}x~}v~xu~{qzzvwy~z||{~{y}y}~xxu|{zw~yw~{}|}yr|xq}v~}w{s}vsyx~|}z~|}}ww}v}uyzz||}~yr}u~xzzwyxvquwzmw}zo~}|rxw~xytz{yz|wy}w~}y|~uyz{{}q{v||zz~{zz|yxy}~nx|{}y|u}zy}||xzwzj}ywrs|uzz}|{wvywyyw|~|~|xzxsy{}ex}|{vzs{w}~~~xq|r~{v|}}x|{zv{{~}}xy~x|{~y}}~~{~vuysz{u`xvyu}zxw~zz}x}{{{~|vv~yy|uyy|{~}~uzwr~ky~{r~~t|~~~|}s{~rx}zy}}~o{u~{ou{||}|tx|{|~x~vyz{}v{~{{|~~{~z|y{v{rwyut||v~w}xww~~z}rwy~~}uz}u~~tz|wzzox||n|}s|zyrt}sw~vz~nw{y~{u{s{~{z{u~x}zuy{xzy~|z|t{vsy|}}uvx{oy{x~{~{y~x{~~twyz}|}us}x~|}|xryp}~vz|zzv||xwzyvt~wz{uvx|{~q|~ux~}}y~k~|{|yzwxvy{{ww|}xpw|y|vxvs~}s|z~|~uy}xqyr}o~pt~}yx|tvysxz|sr{ov|~{x{q~q||}~tz~}oz|zy}u{pw~x|}y{|zyyy}~~|{{y~wv{vw}p||rz}r{w{w|xuzu}{y}~w}z{{|}}}{{st~~~}}z~wzrysxxs{||xytm|}}~]yyrvvo}~{v{xyyyu{x|y{tqx~|}|zwvj~w||{}|}~}|{yuwu{zxx{~|xxvy}~yv|}{|{u~l}ys~y{|~|{yy}wzyz{~}~}k{{~|vy}}z~z|{dvkz~{{{}y}{~|{~~zrvtxtsz{~~}|lyx|~uwts{yxzw}y|{qu{{u{~iqu{y}~|wfttzu|x|u}p|~{vy{|{z|{}d|xx{zu~~y}y|y~h]}lv|~|z}~oy{{u}~~|~|}ozzwez}~~pqx~}zp{|o~}z|{|{sr~zxu}{tv}x~|}v~~{{~y||rwr{v{y}yzyyzw~~uy}~syzwyy{w{~}|~{|~z|xy|~zxz|ux}v|z}|{|v~z~x~~w}kwsqvvryv}lt{~{~|y|x||{zz||zw~wk{x}|qwy~wz~yv|{~qx|~v}}}y{qxyzz{w||z|z|x~|{}|}y}zx|~u}tx}~vxymy{fwz~v{~x|u||vuku}|m}~t~~}yyr}~xx|~{v{nz{}lmy}y{vyqv~{{|vvwxyupxyz~~z|z{~||~o|~x}tzt{y~}}}vu~s~{~{xv|{tztz{{{oyyuuwwz|~w{yx{{|}}u}|yy{zst{yxyyzsyzzw~y}p~|x||vv}v|w|{y~`zsv{~vrx}~z~~wyy}|wnzzzsw|z}{xxv~uy~}}o}|s~|}u{v{~|u{~~u|x~|v{zszy}}|{z{}}|t{{z|{x|xv|tux}jzw}||~}uwxw}jz{~}~}zp{v{vw~|{ywwz|swvvx|~|z~{}}wzn{x|v}y|{tyx}}}~{{x|rs}||wz|~zyxxx}z|~}{zw{w{{w{zz|{xd}vxvxmvuu{|x~|~}o|u}y}~{}x~~x|}}}uxr}y{w~xqxuxs|{{wwwz{y}{m}x|{~zu}v{u{{xyw|yy~s|}yzyjz|yqxz}|}z|v~~|t{y~z~yqvdvv}n~qw{yw{~x}}}xtq~{~{~r{y{|z{zw}yn}|}xy{}z}|sv|}}z~|}pxx|}vy{xyusy|y|}z}xy|{~x}vz{yu}{|xx~}xw{w{rzxxoxz|y}{z{{yztzz|u|wvqozq|z}wxzyz{{x||~x{vs~zyvxuxxz~}z{x|w|vg~w{ozyy{~zy~zy~xvzx}y|~w||~~||v{~|}un}}{|xy}zy}|zzxx|uxv~{|}~yrz|zy~~zzx}x~}uy~}zzzzv|~|you~vn}}~}q~o|~|~~xzy{}}^zy}o{rz}}rvz|||w~yzosuxw}xsw}{}ov|z|w|x|z|l{|gv}|}~yzhzq{{w{~|x|z|{y~u}}{~}kzupy}nsv|y~~b~up}z~|{vy~u}y~u|{kt{{}|y{}|~p~||y~y{~vy|{}}x}|}~|{}||w|zq}xyx{|~o|y|zw|n{vv~wy{}|v~~{z|znyrz{~t~vm|{z~w}}{wxvuyl{y||}x||}so}}{}t{~{~zz|w|{y~}r|x|yz{|}}|aw}o~yrv|x~o}{oyo}~}{vtyzt}}k}~yp}}|z{xwzy~y|zv|}yiz}zsz}|~x~~~}|yv{}yv|z{|x|s|x{|kik}z}zwzo|z}zx}x|w{{y|~y|y}{~{vxtr|t~w|zt{|}zx{y|y}~yw}vx~}|wvtz~~wpzzuw}q}x|xwxxu|~zy~yx{yyx|pq|w{}xvnyuzszs}~y~w}}s{pzzu{q}z{x}s|{|}~wxyo}w~s{ku}xztty}}~~ztvy}|{~ut~p|ux|z|x~z||{~{yznzrzq{~~x|sy}xzuy}{yy|~xr}xz~|~xw}v|~r{y~}xz|v|~xwvtz|w}}z}z}kx{z{z{zwz|{{~sz}}}{|~nxx}yzws{|w|}yrwyn|~|w}}s|{z{~x|~w}|}m}~zzymzxwzyul{{}sx}|w}|jxrx~sux{|q{}tz|hvqo~{q}vq~{twy~}w|x~vx}zy{zzz|z~yxz}|yx{xx}|||{~|u{y{yu|}z}{~}zz|{mzzzx|{}u{y~z{{~y~y{zp~{xyz~~}}zuv|wyvoz~w~v~~t}{~xys|{z~}x~{|~}{}}|wz}vyn}{zzwxxuvsn~~z}vy|tzvyu}||y|uy}wx~|tz{xv|wyqxv~}uw{~{u{qw|wju{q||yzfryryzy}w{v~|~|z||ruyw|q}|z~{q}xty|t~tz}}y|x|}~~}~}st{y~}}{v{x{uzwy{y}|y|my|zzrrm~xxz||t~yjl||~{~}}pstx{wuwwzzs}w}yh{uvz{u{|pwz}y{z}zw~z{y{y|mfm~tqzt}yzzx}}}yw|}{w{{|{yy|zz|~xuv}uy}|~{{~|}v{||xy}~}zyu{~x}v}|||iyj}v~}uqz~zzwt}~wxzz{|zuyz}}}yxkx{wz{wx{~w|}y{}}zw|o~vy||~j}~z|zzv{}}}}x{~u{n~z{xs|xu{p{z{z}{x|}~z}|}|txcvs{}x|~x}~x}}}x~yu}n}v}{~tywy{s|}zxw||y~||}y~|x}{v|wxzt{xztx{wut{~zw~|tr|y~{{}v|g{yz|y}vy}wvy{v~}~{ru~r}s{vxxu~xyo~}|zrytuy}~y~~}|vmxzvvt~xwr|vvsvyq{xusw|{zq|r~{}a~z{|ys|sy|{vt|zvzurz}{|}yxtxz}rq}w}swq~}p{s||r}~ryvww}lx{}}zyyx{{zvqxz~{qu~{|xy{s|v}x~zw`vn||uvyzx{xgxw~wpqw~z||v|xxrp}~}q{{{y|vq~zyw{~}}{w{||o}yv|qyz{{~|~vzz~wy~r{z~xy~|mqow}x}bo{}trv~vt}u~zvw~}txyxw|{}xaz}l~|}}}w}{{z|{xzm|v}s|{{v{vzy~y}{zkl~~`q]yu{x}vuu~v~q{}}xkyx}}}uaxsrwzzo}zgtw{~zsttww|{ywwz|nyW{|wu~{}{wzu}z}}vy}~}{~~{w~x|y}uz~xyr|~trsows||~s~{wx~ztxy||y~z~rtyz}w}y||}yyp~{wsvx{}z{}uqz{~}wt|}yw}v~sw}{yq}zv{xyqu}{~mx|vr~y}u~xv|uw{}|v}wszi~{{||}s~o{|}q{{tzxzqwtsy{t~|l~yzpyywxqmpxw{}u{yy|vw~v{|zv{wz{z}z{xwux{z{~n}|~{yw|{{}u}y{xv|z}w~~~p{|z|~{y{ysvzsztiyz|~|yx}x}|mw|x{|y}{ywuxvwz{y~rx}zxywv}}rvw|{u}y~{tzzv||k~ttomxy}~rz{zz|{{urx|z}z{tv|y|xyu{x|szwy}}v}{~kzyzyztm|yi~z~{}~xv}{}~y}y~~zyzy}r{w|v|~p}tw~~{v{vtxyzz{z{{wow}~xju{{|ztrmvzp}}z~z|}{~vtxx|~z}}n}{zu|~~u{{q~zzkz{}{xux|krvz}|}{~w~}v~~w~~yw|x|~||~xy|xv{{wzjxs{~zt{{~{~~k}}}|tyzwxs|yz~yzrtx||yysu~z~vyty|yvruww~zzx}|}z{yo|z{zxxv}tz~nt}||~}}|wv||}{w~|vo{~xutj||||tx}}x|vy~}x~y|}}|w{z~p~yvz{wtx~~v{tvx~yx}g|}~q~}}y~}pu}x~{}vx~~|{|~}zwx{|~ts}ry}vjzt{wu}o||~p}br|ps{yz{u{y~{v|u~pw}{z|wy{up{~~{|y~|x}w{~|~x|tu|zu{}y~uvzzz}zy}~~}{yxxy{pw~vzz}t}|z~w|v|z}|{z~r|{x}~w~wqpxy|zzy{~tx}~xwz~~z|tmq{w}|}~x~~y}u{~w}~~}{||xy{}~||u~x||w|wy}||}{zixt~}xzz~xww~}{{vuyxvsy}{v~vqxv{yy~~|tw{~xz||}~n||xxw|t~~x}wy{}z|xytr{}~two{qt}|xtu{yu{|~|w|~zv|t|z~yy}zn{|s}}uu|pxvwz{}xl|~xy}uvu~wx{zy}my{|zwyxvw}{z{|yx}{}z|v}vwxxh}rw|zy~}}uxwx~|{z}}{~vfwypt{{qxzv~ry~zq||y~yuy}w}}}z~|tl|}z}z|{xt{y|}zy{z}|qq~~}uzo~{ik}yq|{z|t}x|~~z~{mm|rvp~zyww~y|w{}{v~wvto}~su|{uyozx|uyy|~o}{wz|{v~{o|yy}|wz}y}xxx}~s|tz|{|uuyuyxy}v}|~yx~uv]~e||y}r~xyw}uvuw{x{{~w|~|y~x|zt||z}zxyvzrvv{|yz~||zuw}qqxvx|z}nzx}x~}~zz|~|yxvy{y{yzzyz|}~|}ov~wyv~xt}~mzv}xvu{}~~||xyyt}|w~~ty|~z|{|}~{}{~}{vysz|~|yoz{{}zz}}yy}~z{p~vz|x||yl}{sy}~ww}~~~n|yzkvtu|}{u|nt{zz{z}||t}xv~t~w|y{|t{y|{v{{~|y~|{|y~~}{t}|vtwzy{t{pyvv}~x|t}|y~z|~vzx|zzr{xy~~~w|{~z}s~p}ww}|up~v}|v|{~{{zy}r|zzju~wvv{wx|~n{{y}{y|z~sy{|trus~{vuws{vW|{|y{|}~~yvyz{xwzy|z}yl|o|pu|}|zs|zt~}xzy}y}vyw{t{yh}qv|xyzx{wruvw}~v{}{x}~y||}|{u~x{uu~vy|}wv~|{y{uzy~zyvvz{w}suw|xv{zyuy}{z~x}rzo}}x}}|~z{{|x}y|xyo~zz~{}suytv~|{}t}|z}{pirzs|vx{x{z}|xwz~~w}{ts}x|}||}xy}{|{yssv|w|}}|{}|r}vvrtm}{y}~x|z{zrz|ww~{w}|zrl{v}|y~xoz~u||q{w|quxzzzw}y{x}zzlt}z~{|o{unn}|w}{}w~}x|}vz{{}~Ysx}k|e}}x~}~v~~qx{~j}|~owt}y~|yxz|y{||}{}~qw~}zy~{{}vzyu~x|}}{p}x|}yz}y||p{}x~}}~p}}l~yl}`~}|z{|q~}}q~n~Ux{nxq{zz}x{z||y~{~{ty}tzym{ty{y{|}s|~}t~{x{|~xzqvsrvs}u}~w~}{pz~yx{{}|}~y}|zky}~|tv}}~ox|t{u|}{}{z}|x|uyz~z}~w{v{}y|t}u|~yy|uz|{ze~y{{h~|}{~z}|mm|x}{l}x|z[~}||}~|wt~u~x{}wu{|}vzxvpz{ty|}~~zy{}wxown|{yrosxzwyz}{z~ul{wy}vyvz{|{ywz}|}~uyr}svu{zzzu~yyz~|}~}ywzvwvwvrv}{ux~zzuy{mnz|{}~}wv`v}xq~iz}tx}~ty~zowt~w~z~ytwu}|}|{u~yy{}}{zxozm|{w~{zwx}~zzywy{}xowxyyrxvvvq{ywmr||t|s|uzz}uvyv|{m{}xzn}vru{{tzx|u}|ny~jouzt}vo~yw}zzypz}h{|}zqv}{vrn}~uxvxuz{}z~yptw}z~v~xs}t~frsz~}o}i|tsqxzvvvx~z|}zww{zm{zwz{{oyy|~pt~zuw}{yy|xy}vi|yy{jwzz|~ztyst~l}}ownt|tz~wy|t~wvswlpr|xwxpvqyjmss}r|~~z~u~|wtzucs{u||lsu{q}tuz|}t}pt|x{}yytr~{}w}{|vo{y{zxrty~z~ujxq{}|}oyrwyu~|zo}w{t|zqszww}||ux}~y}}t|ws{sr{yrz`s}~t{vy~_y|v~zxu{x|}q}Zvupm|qsux~~r{x~|{~yyul}u{|ytxu|squvwxrwxwpyz}u}wmy~sv~pl{u}r}yp~s~xzxjy}wnq|}x|q~sy~vvsw}~~wnx}xy}uz}vz}u{~w|}}~~zw|wx~{|y|zxyv}xu{~zy|v|w~z||{{xx~|{txi~~}}yz~|t{~~ru{~z}z~tx}y~||uzv}~vc|wyzdy{~y}fvkz}}zz}x|x}z~}ux~}}z}y|z~~xyy{~w|{||}wwdtxwz}|~wwvv|xr}qszuzz~~sqy~}v~~yk{~~~~lpnu{v}~xys|zzs~t|tvtxt}{|||yyt~|~rxwypq{~w|tgy}{y~}{}{r{s~xzww|xw|}|}q|}zu}{nt~x}}~~|y~wq~~xwjyx{yz~rvuz|}}|uv}~}vu|{qyp|~}w~u{|w|{{~}wvw{}vsu{zx{~zt~}yuzpzhvxx{z|~z{v{u{x}~}|~x||{~}{y|y|sw{~xwuuyw{~so{{xy~}q}|~u}}x~~u{yx}x{}siv{{|}z~||{z|}w{}}{yw|z~}zv|u~x~y|}nz{ww{~z}z}svxuv{{tyurzr|vx}}}~|y~x|zw{x||~|{|zx|yw}|x~yy{y{|v}|||xzzz~|yz|u}xy|x~u~y}r|}q|}x{|ut|yv~x|}~p{}y}w}nzxt~|uvxyw}~y}}}~{yw}{ozxwzy~ry{{|w}|}tx}z{wzzys}ty|v{|quov{x~}}z|~wz|yq}rzu|uz}xwvqxsy|{v}trw{lgywtxu|~|yx}|~y|tw|{v{}x{ysp{}|y}zz||zwr|~}v{v{xvw}}w}}yu|wyjwo~yy|xw{iy~z{}}}}~r~z{}wo~k|}~yu{xzzt}}i{||~}zxzz{~|rxxzxxyy{t}uz{~~}x~{}|w{{s~|}}z{|{x|{xz~wx~{}yfz{z}z{yvx~zy}s~||{{~{v}zzz{tzu|t~~~~y|Y]z}s|zx}|x~qx}tx~z}|zz||~xwyuxq|}{xt}|~q|u~w||s|w|s}}|}zz|x}}~w~x~v~~wq{pn{|uv~}w|yy~{z{|~y}~r~}xxh|{x}vwuxs}{tsvwz|u|}zuy|}}z~}~xsyz}w{z{}zw~{vx|ww{}~}y~|oqvx}}~xuy{rz{y}x|wz}u{vp|{q}{y||s{x|~|~yzv{z|xy}}~zulxuswwz}x~}xz~y}w||}xyjpy~bw}v|{qz}|z{w|~}{t|~|{{zu~|}{|z||y}{qxxzpy{t}zy|}~|x}wp~o{x|||y|zx{}}c{p|~~wx{}}uy||zy~}zp}yx}w{xsw}~}y|~|}{{}[~i|{q|~yx|~{{}|~z~s~y|v{d}w{{}}|zsxxy|vzz}|{~}z}yqu}u|r{zxzw|wxu~yw|v{z|{~y{m~~y~~~}{yzwpus{{x{}z}yywv{{x^zrv~{yy}u{{ytt~tu}|yr~|zvw{y}}|{y}|{z|u~x|~{}z}zwzp~{}ko~{|{|~|{v}|{z|~|w}|x~v|}zx{{u||y~x}zw|}}|~{~{y}wy~}s|z}x||x~z|y~|}}zx|{|}}z|~~sv|r}u~}{s~m{~wr|yxt}}~}zzy|y}u{~]v~}x|vz|v~}{y{}~v|zxyz{w~~|s|xs|}y}~{||}{tu{x||{}x{sz~w{v~}}|}{|}|{tvz{{|uzk}{ubxv|yq{z{qyx{z}zy{|ywzwu|{~xz|vz~||zx~x}~}{z|}y}|yw~{xxx~}|zv~}x~{pxzg~}{||y}}y~z}||yy}wy|ww{l{}w}{~{u~~qz}{y~{vr~}{||y}wpyqty~|y{~~||q~z|{v|}}{x}wuz}}~xt{s|qwz}y}|{~n|~{sp~~vzzww|zt}y|~zsx}~~yvs{}u|x|}o}|~}~|~vv{y{xx~zz|w~|y|{|~~~~m{|||q{~y}xytttz~xm{}{|y{|}w|rv}{s|~y~s}}|~|ixz{zzxs}{z|z|zz}u~xosz||zrx|}vpx{|~}~{|zwz{}{sqwz}|z{~r{ryyp~{{~s{~{|}|{sx|r~{~xzw}yurz~{}y|zx|xzu}uy~zyz|}xxz~{~}{zv|krz{z|{}z|}|z}w~}y{{y~{t~|t~zy|r{z~q~}||yz}z{u~v|z~z~~zyv~{|dx}z}zy~r~yvzzzt}zsw}}{~z}|}qu|{}s~tt~j{t}|yt~wp{yz|z}xw|{~~ryw|}|tytuus~}}}zol}{|}}{yyv|}|~x{|}~{vo{~wv|}}~~~|~p{{oy|x~sw||usn|}}vw}}~{kx}yqy}w}{~y{}|~~y|stut~o}}{m|qqy}}s{|~}}}~zwntpz~yx}}{{xpy~nv}~}}~|t|}v|{~z~~}|v|~{t~}~||~{rt{zuzs}~|}|~vxuwzr|u}lxx}x}t|v|xv|r|~}z}yxwwv~z{{}~z{u~z~~su}xsw{}w|}wuvr~wyy{txiunys~~{q}vpyykt~t{}x|{zz}yr~z}wt|v~qx|{q{}x~|u}w}s~s|}y|upwlq|z~~wul|qzzvi}zz~}x{r~yxotjxxyy}q||swvwy}qdqppr||{{}[}p{}uszyy|x~sxw}{zr{xoorwrp~~~w}xqjwwj}}ystj{ow}m{xww|t}m{|}sp}z|zsryvy}xuo~}uwir~y|~gr~}tww~z{m~q~~tz|g}wxzu}{|km}}}wv~yyzy{z~y|~{|yo|w}v{sw~|cw~u}wxr~uo{y}sips}nzw|yv`yxn~z}~y~~x8trw|tuzuuvt|rur|vw{|}rwryvu]|zp}}zywzyuvsqy{|unt{vz||~xyux}tz{|yzz~s~|{rvwy{}s}xoz{|yx~}wwyx|~~rsvz}~}~}|s|vw~~zx}w~}|ywvz}i}}tts~svx~zyt|ty~}|{{~}oy~}mw}|~{uw}y~}|zy~xruz{u~w}|zw~v{~|~zuxyz~{s~}xuu|zz{xxzz|}}z~{|pv}{syvi}{{uvyry|yo}|yu}xzw|y}uyvxz|x~y}yr}|||{x|z|}v~x}|{}{sy~z|}{v}~{yzn}~}~}|zq{Q|wz{}ry}ovx|}u~~|{}~jww~wbzy|zztx~vvzx}y~{}xurzyzy{wm|{{z~ywuv{}zxz{z|vvxz~|}y~|~{k{sz{}uy~z|qyvxv~wwys~uowzw}x|{vvy}y~p}smze||~yrr~{yz}vx~{z{rv{ztv~s{z|ty~w~zx}}s|z|rzwyy|~}z}w~x}~s{~wzvx}~{y{vwymwy{|r|xv}}|}zs{{{sy~|yr|}v}}wvpyuvnu}|wyx}}zuu~w|styz|t{}v{vy|z{y|vty||}v}t}t{zwxrvy}zzpy}spyyyvvu}o|~uv||~t~uyzy}|w{t{w}|zy|xl|zwuy|{z}}p}}~vz|y}vw|zwyz}v|yr}u~y||qtxxrz|~vysw{s|r}}|vultvzlw|yv}~{s|||z~zy}~rvvzxw}|}~zv|xx~w~|{~wyx|}u|u}z{~z}{{wu}syxs}z}~x}vwy~}t|xsw~}~{~{}zzz~z}}yvzzp}|}y|~uz{~|{~w|uyw~vr}|xryuzxp||w{|v}~|r|u{{wu||t}y~x|zv}y|xwzzzxz~~|z|y{}|}}|w|||}trz|||~~v{|{|{v{|}{}r||zz~}~}{||zt~~|~|zuwz|tt~|{qvqxyv{qxz}~vyxu~~w}uz}r~unuz|u}|yt||ys~~}v|swyzyv}xz}{|ys|~{w}{}yu|}x}yzgwz~||yz{}z|tz{s}zttx}zszvtzx|~z}y|zz}|x{vy~l{{z}~t|qv||~|}|{pw}|||x}x{x{u}x|zzzzmu{u~}~~~vv~yr~~zx~zzz~}|}|z}{~u{|oz~}z|}}{}t~u{x}~x{{wzxwzwz{~~xzzu|}~y{{w{{x{vv{|uy|vy}}wzz|yw~oyz|}w}{y~|v{y~~|{vvv{zw}x}s|vz}z}xxzvoy}z~~s}|~zzx~xv~yz}u~xu|ztv}jvryy}|xz|~{}y|}}{uv|{v~z}y{}}|}xxw~xx{{{ss{|r|~yy}wx{x}{vzty{{z~zvt{}||}wyyy|zw{|m||xroxyyty~q}yz}{xew|~~}yzyu|yyyv~yr}w~~wz{|~xx{t|y{~~w}u|z~}u~q}zy}x|}|~yxru}ytxzy}pxx}}{~||z|t{}}~}{zy{{~nz|t}w~~z{~v}{~}|t}wyvsyz||jv|||sxywrw~{n}~vy~}|z{uwwst{|{oy}ywrz~}{}x}{sn~uzz|{u|xlz{z}zy|hy{||||{{tn}vwp}x|r}|{}ws~yi}|txzyzyzuxuw~lx~}x|~}xyzssuz}~}|z~tos|rx{y|qvzt{|wyzu}{~}zyyxxy{n{nw~u{{}}x~z||yuyys}{tyvyv{zy|{v|y~zo|wst~}~ywxw}zzxzn|~{szyxxwx~x|usu}t{|zvhp|y}wtym~|yqt}w}ww{x}y|wxp}~yx}zzz~t|z}tzx{z{r~{z{v|~ww{~vz~}tr}|{||zz~zu}{y~{}|~kwts~tz}m{~}wzz|zu}xq|z}{wx}}osxvyy{xyyr}~{xy~yxyw{z|yzxryv}~h{r|y{{szy}y~|~ytyzvotz|}xlzzrzw}wy}m|s}p{z}w~{}v}}xyzqxz~q{|}{v|w{}~{}x{y}xvt~t}v~}{z|u~zy|x~{}}w|{w{z}w~|v{~}v{zxz~{~t~~us~y}}}~}}~{}fz|~wu}|v{~v~rtn|x~{}~{|z||x~y|||z{~||qz{|{}zxx{z}}w|}zts{~zzs{|~|{hwypx}t}~ve|~z}{yww|}xvx~~~||zz}zvw|~s}}}}u{xyy~|jrwy|||r}|~}|fz~{z}|yx|{|u|{|ztz|x|zvszx|zxizw}~wz~}zz|w}y~~{|}kx}{~~|q{|~z|yz|}}z{x|~yxx}x}wz~|w}{y}}v{w|yjv|v}x{j}y|yw|s{z|{vzx{o||zu|zywyv~~|y~|z|zt~~u||{~}vw}{}z}~x~vty|sxuwz}{v{~rsly}||{v|x~zxwz|{z{y}{}|t{vywlw}||~xy~{}{|~}rt{|tz|}z||x{y}||zz~qxktt}v~||}~xuwz}s||w|v{x~x}{vz|xz}~z{}wwyv|}xz}z{y}}|r|pystq{w|w{s~uyx}|||{u}}y}tuz|~{}{z|}~|rvv~}r||wqzzp|y|pt~n|{{{ywk|z{}|xywpru|ywvxzw~}{vy~~}z~{{}rzr~~{zy|yy{wqy~~xyz}|zy~u|~y~||}u}uu}{vzxv{{ytxsq{x}}}z{{wzwzz{zu~{y|{z}{~zv{z}xqtw}}}z~y}x}dzz}}u|n{}yt}}}}||t~uzszov|{}mw{}{}~y}y{~}v||{y}}|xztu|v|{wy|{|}|zx~uztqzu~}~}x}{|{|}z|z}|}y~~~t~zpr{x|}ix|}~azxu|u}}|~}v~}|}xyz}|~v{~vw~{}}~{w}yy{wx}~}}}v{||~~~}}v{~m}~y{~|}}~|~{~zyy||}o}{|w|x}|z}xw~}}~}}~|zzzxsv{}t}~|w{~y|}|z|tws||}{n}x|u~m~}}yz{}|w~}~yzrx{|}~||}{x}r}p}~xoxz}vvi}x}}|{tz|v~~|||xz|z{~u~|z{~z}uy~}ywvzzr~y}y}~h|z}}u{}~~u}d~x}oy{}|z~y{~y{~sqy~v{}{sx{~zzxy~y|~zzxrx}ws{v~|}yr~q|z~~t{}{}xwwq~~ytos}trv}~|{~{v~|{xvxy|qyw||}t}vz~~z}v~{x{v|{z|}}}vu}v~~zp}}|}~z{~}yvy{v|z~}|ztw}zvxu~z~{}t{r|{{y|{|{|q~yy~||wvwryy{zz}y{x~xx|{{k|z}}~}z}}{ri}||{vt{ryyu{uuzw{{}vy|yq}uwz|zvq~v|}|zwx{o}{~wxz|~ywz{}r{}zzvoE{y~u{v}vs}z{yz}~}}|}x|u{w||~{{{wzz{{z|yxy~{}|zyzmv~}z}y{oivw~x}wt~{}xrq~v||yy{|swvv|}~|}}}z}usy~|y|~w||s}ns~{y{}~}v}~~wv}z}}zx~z{u|xy}yx|~u}}u}~rvywz}t|{w|u|y}x{zx{u}~z|yx{x~{z{yz~}yu{x~~|o|uz~vy||}~x{~z|}v~|tt{|vwxzm{|z}nzz{t}~w}hznz{yvttzvoo~v~y{y~uxv~~}|}}{|x~s~uv}}}{{{v}|x{zlz|s~yx}z{wv|s~`{|~|z|zywl~}}~lo{w~|xz}~}y}~}}zer~~}|{q}otjn|zy~|{ykn}}xw|~y}~w}zxx{|}|~}y{}||v{|zx|x}sw|u{x}|{ut}w}~txuv{zs~y|yyz}x||~y|z~|v|o|{}Y~y}{}v|y{x|}z|~~{{~z}{x~x|yy|s~wx~m|t|}{}ztu{y}wy}|~}~~{{x{~zlmw|wxu~||u|~|m|}yzw~~|{x}|z||yw~tu{tzu{~}v{}{||z~z~~y|xw{x~}{{|~z|}y~||lzw~u|z{yy{{|xx|z~}~|{uw}y}||}{}{~}~t~vxx~zw}r~w{}}}}{|q}vww}~v{}y~|x|{|z||zw}s}zt|}yy~zz{}y}{|}kys~w~|y|}|vzyyupozww{x|}z~~~{zz|l{y}}qy{yxruz{uw~z}y~}~{{zrvs|{z}{|~|{}t|z||u}~~}vx~n~o{||twyx|~zu}}x|{tyv~v|w~y~|}|ux}t{~|}}v|ytw{{wq{~wvto{~|{sxzy{y|wy}}t}yk{tz}zujg}z}u~su~}{~wq|p|}{~}wvyr~swsxlx{xxxw|}z{wq|{|v|q|}yz~un{t}yvnz|zyzyzx{z~~~|{~x{t~y~}q~|~xqw||yr~zw|z{q||~||V}yzv|svzxtr|z}}sz{~~{}q{uvjyy}~w|ywzxx|xry{{ytvxuvy}{}~{w}uzt|zxy|y~p}{zuv||y}~ywys|~~xorz}{zux{x~}}vtxu|x{wzt}{w{|~wu|||~zqs}vu{}ud|}~z}{wvz~zsx{zz}~}snzxur{zwypus~{{~on|pzpvv~vwysr}ryw{sxsp{yvwvs}~}uz|{v}}y~}sk}v~{y}}|ooyu{}}|~~y}|{~~|u|}yq{z|~px}~z{|w}}vy|t}v|yz{|}{|{y}{{{}}}~xyw~v{qyw|zy~}s}}wyu}~x~zw}|}}z|}}wyyw}wv|}z}|yy|{z}}}~uk}|{~z}~y|y~}|uz}}xz~||~r}|w|y~r~xwu~{y}{yw~w|v}n~u|y{y|o{~}wzpqp}zz}|xy||zf}r}z|{z{}p}}w|}qn{}y~~yxrf~|~|~v~{z}~z~x~z{~tw~|wu{zzn|}|t}t}y}}~|}}w|yz{}}y{}~vs{|||tz}~z~|zuzwy{wwu{}{w}}}xx{}||~|{z}xyvwfxw{|n|y|wvv~}|}wv~|zx~}xt~~{k{yyw||{}z~y{yx{y}~v}|sx}t}~w}}v|ֆ|}zzt|z|yty~yyx~}}v{}~~{t|t~yzz{z~{~xz~zo{z}vvr{~v{~~|{{{zvx~u{{}~|~}z}wx|}z}~z|uz8}{zut~yvzzx~||yzwuwz{~z||w|q}}|~xt{}~|z}}}~{wx{~~wxyzzzz~w}z~zv{}xw|vsvwyvzw|~~~u~~}u||zxzyvy}~}~|xv|vr~z{~z~yz{{}mx{y~zxz}~sqpzs{qyz~~z{|xw}{~uv|}v|}tw}t{x~xz}vw}yxxuyyw{~}~}y{zz}wtq|vz~~||z}~wy|}y|{}{w|s|pxtz}zs{ts}{{{{yw|{zy}uvw~zx|xz~}z~w}~s|suk~yn|suYh~ww~}z~q~gwy|vvt{yrtbo~yvwmv}|w}yr|~x|xv~{}zt~rt}|ww}rz{w|~{|{}||~}}}~y{pxy~zp~|{ww{~o}wyx|zp{}z{u~o~{~yyvx~{vx{{x}}tszyys~{xy|ty}zuv~j|z~}y}r{u~{~{r}z}s{}t|a|z~xpz{}||u}{u||}zy|vzynwx~v}yp~zx}|o~xqxz{{|z||y~zuzzrt}{vxx}|~}um}zuxw}yzs|}suxxy{zvsd{toywynxywuqyv{~nx|w}t~{wtyzz}zuvwy~~}wu~|||yi~uoz}}{wy|}uu~x}t~~|w{|ts}}~w~z{z{~pu|yxvzyxzZ{|zyzt}{xx~s~|ts{{xq~uxw{{~r|~wxvxv}zxn~{x~uvv|v|qpt{}o{~y}qyw~zyys{rz}vtozuzywzss{{x}{s{}|z|{xvop|z|{zrz~w|xz}~|oux}wjxowszq}}~xtnyy|s~}rxx{r~w{uuwu|vw}|vtzqz|zy|uzzx{{~}v}x}yy{l}xxvuzo{{xx{z|~u~yiutyxrqvu||zw{{xxz|xz|yzm{~pzy~wxzqxwv}~}|mux}z~wy}}{|xs}z}~x{}~fkw~zzwt}vso{}||ow}x|sz{mqytw~tyy}~}y~|vyz}|}wQ||}~sq~y{~}~{x}{tz|}j|x|r~}u}zyyrr}v{w~{ww}{z|y~wxvu}y~|ou}x}vzzyut}|~yvwyz|wuy}~~zzzyrw}zy}Ss~|~f{u{v~zt|~my}ut}u{uzt{u|}{Yy~}{x~~{{hnn~ytt}}xyvs}hyx}~zxm{uz|{x~z|t{iw|ypv}zz||yy}zpzq~|v~|w}|~y|yyy||t~yy}}z~xttttzur~{|z}xzhxyqv}{|v{~|y}|~x{vyus~{}~yzz}z}l~y}zeu}}~}u{~zz~vz}|i~wz~{{}xw~o{~v`x{~|zx}v{n}rxy{~~~nw|y~wx|m~z}nzi}~uw}{q}y{y}|w}y}z~~x~~~|v}y}{{~}|~}i}~q|zvywy{lw}~|w|{|h~|{pum{y{z|~|}}~~{|}{}}{{~k{|z~|y{z}uz|{~~}zw|x~}wwy{uu|zz{ts}|v{}y}_xd}xx}}{q}mzw}w||wzyyq|}{y~{v{~p|||~yr|z~uxxu~{{}~z|xxy~|{p~tq~xq~w}zq|kuynvy~z{||}x}~uzq{}uu~yqpuy|v}~z{xtw}|~xxww{sx}f~~|{|r{}|z~}~~{w||}u|m||}}z|{xy}|~z~s|x}|utywxrwv|{{z}|||~nv{yw}zx|v}}|p|zvy|zu}}yz~o~|www||{|y||{y|}w|wwtn~|to~swy}}y}`r}y}v{i~{~m{s~|~w}|~~}~|yux}{{|}||}`}vx|t{s|}z}{}{w{x}{s|{z|}{x}}t}w{|y{uzz{x~z}z~w~zrzy}zy}}t{vwxx~w|k~~}zvrjvzjs{}|rxy{vwy~~y|w}}}x{|vxq|zx~xzt}}wqj~uptpz{z|pz}z{{}~i|||}}s}|ytx|om{qww{p{}j{|}~|u}wut|m}~~~y~yjo|~|ww}~y|w{m}mu|~~z~|yvyr\t~|x|{xyy|uzz|~~}wz{y}zv|u~{~|~y~}}|~}|vwsww}y||z~{z{v~~w{yr|}}z||}~v~vwjz|{x{~vywz|}{{w|u~n}~~y~qx{{tpv{{t{py|~||~{|r}zx}}u}xay|}|~{|z{}y~y||~~~v~~}w|mzxp|{z}}{}}{wzz|tysz{yu|w}r~{~~z}qxu|xt|q~||s|||{w|~}|z}}wyyu||}{z|w}o}}n}r~}xr}yt{zt}z~srqz}}zv{q~vu{}|}~zxwzxy~~}}s|~zyp~wp}w|{~yk{xt{x{{|y|x}v{tzisxu{{vz||}x}}{n{~ux~{}{{wz{xxxv}x|uw||}x|xyt{zr}wyvz}yu{zy~}rzyzt{t}~xz{}yux]wt~w{}zw}w{|}}u{~w{}}w}oqx{z{xy|tzywt~~||{{w~ty|z{s~ytwr~rzuv~}}|~|sp}{ytxuy{u||zc~v||vtxzs~{}~~y|x~ws}|yxx{|usz{}|yyy~wxwz{~{zpx|yv~{}{n{x}||wwuux||tv}~}~lyr|t}z{{nru}|}~s{wz|~y~{r}w|w{w|zyyns|{p}zzx|stzox}w{{{}}~ytyz~{x{ry}||jyx|qvu|x~tu{|y||}{zx}|xw{qyyzxwxt{y}~|{xy~{{uzo~{{t}u~}~z}~|~|zzvvxv}y{~u{|u~{r{|}vzs{s{}~z{|wx}}z{x||wvuzwzzz}t}y~v||}}z{}xz|~}}{q{v~~g~{ysy~}vz{}wz{}~|z~{tyztz}|xyxsr}y}~}~|~}}{ro{x}}zy|}zx|~xmx{{uswz{q||y~}|}y}|z|{{|}yy|}vxtz{wwy}t{yuvt~|{~~x{zwp|q{un~|z}}w}l{n|~~usw}}~zzwzwv}x}ov}{{~zzxo~yx||yzv~|zxwz||{zyz~}~}{qt|}y{~xz}zz||~|y}}yv~~xw|x~~ny{}hw}~x~x|zzw}}}hx}|sw}n~~|}w~{~x~~~z}}y|xx~}|}}}r}{xk|uzzz~}v~zz~w{o{{~y|{~}ywt|ny}}sv|}mz|uxo{t||rw{z{y~~s{{z~|w~puzz}y~}zy{vm}q~|{z|~{ju{{~|t~~m{{|~{yvt}|zs|}z{~}}}~s|~vwwouywtzwz|d{}{~{zy~|x~ow~zz{}}t|~|z||r||tvz}}x|yyu{||}z|yz}~r~wpwty~{}}z}{x{xwyrxy~|~}{}r|||}{w}z{y{ux}z{{r{}{~}wvuu{{wzz~|}zs{{|x{|z|{rv{xqj|{|wu~zyz|}{y|}~{w~xz~w}{|}|un}{zxxx|{|{wy~{}{}xzo{[~yx{{ykyzp}~yj{~}qr{zkz~jl}~rysyvv|u|trkzzw{wrwys}w{vvz~|v{tzwtvyzp|{uj~{zoyz~u|quz}mU~~pmu~zs~{zv6]wuv}|x}lffz}txz}bq~n|lyqy|}r|xt|y}}xy}sxilt}l{yrsvt}r|x~{}{{~}{~|{yyluqz}o|}{q~|lwzyl~|}kWsysvx|}wxv|[v||x|xz|hvt}qyrtp|utx{t~~{|wzz{tzwwm~zyuyyzyqzrywz{}{z}uyuxsh}~zzo|~zvxz{zsre~wvu|yu{~b~svvlzyq~~v|syuqgv|wsz|}vmxzuxyqw|~xvg}|vu|xm|tyv|{sy}z|ktu||w}vxp}r{z}ynyz}}vw{ny||zw}nz}ozyvww|o}o||zy||y{~w}~~}~}~z|y}{{yxtz|{y}}}|~}~{{w~||zy{~|z~|x|{{|r}up~vz~|sp}}xz~~~||z~~|{}{}{v|u||z|q~~{{yw}{z~||}|}|x}}}yxyzk}~~}~}}~tz~v||v{|{{x}|yx~x|}ez}}z~}{~y~|}wy{zw~|ysy~r~{}~u|v{y|yzz~~||z}x}~r{v|}}q}|z}}nx~zz~}x||u~~}x~x}}z}|sx{|t{zv|xv{{x}~}}{~~yu}z{w}w{zu~zxqw}{|wzu}|{|yx|}~tu{yt|w}{}~rwjo||y|z~r~p|{m}}|~yuu~y}|mzyyyz{ty{z}|v{w}zxvyz}ytqy{{sw{v|wzw{zuz}}{}|}~x{vy}|y~ssr{tywozty}|~n{}}xr~{~|{p|~zz}~xwvyzzps~~~|zy|{{|w|xs{|z~uy||~p~}ys}~~|~xz}q~~{pz}x||yn}zt|ov|}y}{~w~{v{x}y~qzy}zvzrvv~y|}||wzw}~uw~{vvzmw{vw|{xp~|{wox}{}}w{w|yr{z{}}v|}xt{~w}}y|w|un|}sz}|~z}uuz|ytzr|}|~{s{|z|yx|}uw{yqxzyvw|wzyyzu~y|}{}wsxtp{~v}lzxzus~{}z~{wu|{{}t~~}}w~r}}w|}zyn}zq}~{w{}{z{q|vv~y}twxyx{}}yyy|x~{oy||~s|uxqzz{{}t{{xv~{}}}{|x}twzyxv|p|~vz}xy{}yuw}x|~}{p~v|z|v{wwxzv|~u}~~rw}nxw~xz|{t~x|v}zx|{y|z}{x{uwt|v~wq{v~vv}us|{sn}}v|wryouy{w}yup{x~|s{z{~{~|jy|||xvx{uy{|z}zsv~}y|sy~x}r~v}|{{gr|nxsw{{}s}|}w}}~ruv|z|zw|~|~xwu~s{zy{y{zowy}t}yxzy{{w{y{~wty~w~xwzzq|xz}||w|{t|~z~}ppv{tz~|wxtyx|}x~y}u|~s~yzm|n~{}}|~}~}~vy{{l{t||~~}}k|wz~}u~|}|vxyyxpw{x~~z~|~w||tw~~y~||t~u}}|~~yzwx{z|tz}zr{{{yx}~mvy~p{yri}~zvmy}y~~{lz~~z}u|~}vvy|y||yyz{uw{~xqs|||}|~j}yr|xx}|{y~zu}zux{q~zx}}yy~u|~tx~o}~s}xons{{vzzyz{}}{x|w{qyw~v{x|}~ywu|{z|y|s|zyx~~}{}vutz}}~}{{q~w}~}}~~~uut~z{x{|{~~rpqz|z|zx{znqrz~zo|uz{}zs{|su~{}~y|{tyxpxu~x|{u{xx{{qy}~t|x~o|wta~|r~~v~{yrxw}{}|zz}y|yz}}~~}}v{vwy~}{z}{xzr{}ti}vz~{ww~~h{{|}zy}vr{kts||y{w|{|~y}~Tw|x}{|}||srw~~xxvw}otyy}~x|}f~~v}}z|~|y}s~~{w{zy}~u|}xfy~{}|~}x~~vo{{}s||{|zx{~}||{vix{{z~{~||xu|~x}~myu~zry|{zw{}}~|yzt|{y||{}wlxrs}xy|{vo{|}rn{ww{~|r}~|l~{jp||v||~x~{xyz|vz~|zy{m{|}~~~}rs}{yw}x~v{v}||{}~|{{}sv}~|n}yyxy~z{yt~u|}|p{{hzr|~z||~yt}yuzvzx|xu|p~z||x|zs}~~~{}Z}zyt{|}s}|r~r}x}uzy}yu}}w}xs~}zvu~~ot||{y~w~~}rjcw|}z~vvy}vzt}{yt}xzzx|puzxvx}~}w|}zuxbwv}x~r|~||vty~{wbvysz{x}xz}}y}{|zz|{|s}u||{|{z}wzy}w~z}|uxx}{|uxy~~uu~|}z}{z}uw|zyz{s|~j{|}znz\~{|typ~x}~zo~u}bvoot~uyux[|vz}{zi|zzz}qy~}l|zxspu}x}{~|||}cs~y}{r{uk}zs{lt~}~xgevstswz|}||~y~~|~tz~o{v{u||||zy|rs}y~hjryq|{~|{|~yyypyw~t}}zz}{~~vw{xzx|{z|wz~|zxz}|xt|xzzytx|k}szxry}yuvvx~z}w~i}~{|w{{{{|xvmv{t{xqyprvxqsx}ry{r}~zw{vyz|~|s}|yvz|~|zwyz{{w|u}}}xyx{x~y{r{z{k||}ky~{zw|~wr{x{}vqa{tx~yvrz|z~~vyw}j~{~~s||qvt{~yiz~}zx|y|zo}|zx{uyyk}x{{~y}z~yy|}wpuwzowqsu|~~v~s~|y|ypz|}w|vsx}woz|xxplvoz{y{p|}t|v~wx~u}xrzv{z|jzrty}wy{o{w{~p~o{y}z}r{~t{~~xvu}y|{|xq}v|{xsk{z{~}y{rvx~|ynj~~uuwwv|py}}u}u{{ozqy}yr|}~}}ut~|y}}uv|~l|{{xx}zj~s|y~y||wwv{~~v~v{bu~}{}}{|~ty}w~s{swyq}~y~z}ow}yw}vuzl|z}pt~oz~{mwzy}yy|~{uqy{}{}yz~ut}r~{}|wv}}v|{z{pp~txz|uv||zp~~zy|}k|}}vqxuv|zy}zn~o}x}{||x}~yoz{{}|x|}fzu}r{v}r|ywy|}z{w~i}|y}y{x|{}z{olsxy|}v}{}kwn}xvy}~w|izox{|ymrvy}}wxzyt}|}eu~ywwty}p}~~{i}zz}{}x}ox}xz~zuzzt{{u}{{yvr~zv~~|{z}y|}s~}}|~{{rx{}}}}t|{t{~}}uw|y|yh~w}zxxz~~{v}y~{ww}||}zzvrrytwz|}|ynvt~zxwyr~|~t||~rsw~}}z{{vzsp|vlv|}zxy{zy~zr}{~{x}}uz|wx{st{|{z~q{~wz}w|xzzzk{zz~ux{}y}ftzkyoo|zv}{}w|~}~z|zq{r|x{w|z}xzyyy}xzuvkzv{{s~wzrw|}z||o}{~qur|v{xmz|x{|vt~|ww{r|yzmwwqwx}||s{|}sx~|r~v~{x~{oww{z{|u{y{w|~x~z}}uxyv}~{}z|zy|m{}}z{{z{vux{yvuspm}wwyutk|w|wswt~{okwy|wy{tyr{ws|xt~{z||x|ww~u{}zz|yyrltw|xxsry|zuwnypzyzxvzr|vv{y_t}vy~~tyy|swx}u{{|~vs{vxyx{wo{}ywyu}k{{|y{{x~}mzwzww}}x{}uwpty{z}~w|v~{x}}s|zzbuu{w}}~{}nx{kz|~v~u}s|s~zwr{||x|~fy||qz{}}{x|z~y}{z~uy~{}zz{||z~{~qzvu}~rp|{u{z{{uwzyy~~oyv{x{yxt}~}|wy}x}||~{y}}pl~}zzz~wuw}x|x{p~}yzvu{y{x~xy}r|y|tu{o~}y|zh|v}u|yt}||zswv|vl~wvuxyy~uzv{|{}wy|xqvy~}{u~y{y~v{}P|}~vv|r}|}z|w{|z{xv~zxx~yu{u{`{zyz|lzv{}}|~s}~t{}~xmx}n}}{x~}}xu|v|{}]zyv~{|~|x~{~}y}}~xx}~vv{px|}y~}|yz{z{v~ouqsv|}}|vx|{{xzz~{yp~|xxzu||ut~~}}}}ztvu~{{z}|~q~xvw}zs|zwqw}}}}~}z|}ov||{|v{{p}u}yo~yzzyuy||xznuz|}}vy}~u||w~m}}x|}|}z}}{u~|vt|}{zz}{|}~}~{y~sxz}}z}}|~{}|||x~~~~}~yy~vz}z|yzxul~ww||zz}qz}w|w}r|v~~z|~{|y}q}~zzwy~nu|w~z~~z|}|vw}|{{{}o}y~y~|{n{u~{~ox}|}{kv~j|q~x}{wrz~v{qv~w|s{sr|izz||w}z|}{xj~}}uyz~~zuysyzvq{q~||~yxqztx}}y|z|ev~s}r}}|wwwy}z}wyy{p{{}z}~|~}|p|zxkq}wy~{|u{{xy|x}}}|w~}~ww~}yv{|}xfr|y~|||e|zw}zl|qxu|~uzzuuzpnry~{{yz{}s|{y~vw{xspx~}zn{}~|~}}z|~{xynsyx{|~zwrq~p{iyy|||{~m}|}x|||wwt~|yyx{q}|ytl{z|~vw}yoil}w{~}}|z||}v{}uvy}x{t|~~u|iw|s|}r~}}wwy|}|}y{x{y{~o|p~{|~}{xztt~}}nyu|zuww}{w{~w|xu}|x~~u~xx}}x{}{~wswtw|w}x~{w{|{p}y{}}{}|w~ow}v}u{~|~}|u|zo{{xr|~|zwkz{ys~zsu}t}}~}uqu{z{~{xxn|v}}zv|}|y{{}yz{~|{}{t~}xyz|~xz||{}~{uyw~|sv|~vrxy~uw}x|~~vxyzqwp}yxzv|}p~|~|}{}{v{{ywyz{{}~u}~zwx{{yzwryyu{w|~|}{ux}|v}u~||rzwx{{s~r~|s~~u~{}xwyz{|~zx{w|~|}yv}y}x~}|~}~|{{~x}u|{|~}zzyw{y{w}zz{{y~wxz}~|x~{xu~y}o|xx{}vu{{zxqm~~{~s{ul|rz|y||}yz||~xxszs{y}z|{z||ww}xu|y}}|{xrz|||wwz~}v}}t~z{}xzs~}v||~~{z~wqpy|}xo|zum{~u}zx{xx}wy|{y~wxwt}|vuw{~}~|}k|}y{zxxu}rwz~|~}{{~w|y~v|}|xz{zvq}z}z{x{~}xs|xv|vy|~{}y}twy|r||w}yzs{}|u~|~}uy||~|{zuzw~}xw{~v|xy~pvq{z~w|}zzw~u~{~~{|~}w}{v{pwyx{{w~{{z}w{|~ww}wz~}zc~{||}{u}yw~x{|zyqz|t~wyuxx}~|~zuv}z}}~w{sw~p{}}{xw{}y}u~}}j|~~{y~x~}{w|zx}zx{}|xz{r{zzzy}~{{}syzu|t~tv~~|}z{~uy}z{}z}zn{w||z|{lz}~|w~zx|zpv}yt}t}|~r~}{xxz}y~~uwzzw|~{t|zqy~xyuv}{z|{z||wy~r{~}{z~||xy}us|u|{w|srv{~v}}y||}~zz}yy~xzpp}y}y~w}{ry~|vemr}{xzx}yy|r~yu|z{y~}xyy|{|z~}{}z}|x~q~ufzls|u}{z}}ux{cwz}p}{y~|~x|z|x{ry|w~{{~ryz{v}}~~v{zp~{wu{zzzx~{{ys|z|x||||~y~|yzuz||z}wz}~|yzzzzty}}||{~}~|z|yw|z~}}~w{y{z~zy|{onx~wzvwx}||~}~|z~{uz||zxzzz{~z~{~}|~~x~y{}ty~~{|z}z|}umz|zyz~y{|}ryt}~u~}y~}~~{|~s}uyry~}u{y~{|y}|}{|}vqv}w~~~|t|wq~vzzy}||tx~www}{{{|{~y}z|}}w}zxy|~vx}u~~|}v}zy{x}w}{}|}yo{}}~z~sxwxr~t{}}u~v|z}}|~y~~|||y{zs|y|}z~}uv~zs|{s~pp}zx~|}{y}|~zz~x|}}w{||u{zw{z{xzyz}|~~x}~xx}|tv{~z{rwy~||z{}ywr|y|n}yywu~{{}}}{y~nswisyz}}{z|xz}}{||{}}}^|wy|}w|y|}z~||~w~y}t|z{~x~v|xy{zyyx}|~|z}}~|tv|xqy{xzq|m{}}{yvtcw}w}s{}|{}x}w|wut~}|x}wh~zz{|}rv{vu~{wq~u~}{}~v|zy~|}~{{}{xpy}pxz{t{y{{~x{yz|{}xqx}z}v{yt{s}~tz|~v~{|~}y|y{{}t{||wy}vy~v|{}}y}x|{zz~wzw{|~y}|x}v|y}uzywy~{mw~|yy~{}~y||}z~y}~{yz}~x~zz|zx~vvt~y|qz~z~yyyxzy}}tyyx~zz|zzr{~z}{{xuoyw|~}zy|}{yy{xy}{y~q}~xx~zvxxrd~xtwzw}y~|yo}}xz~|x}w~~|{~~sy~~~q}{ry~}|u|z~~zz~}~t{zz}w~~upxo{wwj~xv}||tx}w||~|y}zwu||~y~u~{~}{~~{}~w|~x|{}{~}tv}|z{y}vtz|ywuy}w}|z{wv~zu}x~zx{}~}{}y{v|}~~y}stut|~v|{w~~zyw{{||}t|y{~s|{}~w}xv~x}yru~}x~wyz~}zm}w}zy~|wy}}||}z{zz~}~y~~z~z~~~zzx~|yt~{}|w|}z|zx}s~y}u|}yz{o{{r{|}~{~w}yw}{|p|x~~||}xwd~~u}{}ywyy|wsx{x}zxz{xwyz~~tk|}|{wyxwu{~t}}r||zk|u{{~{w|rypt}s~uy|x|~zwtwu|s~y|{wzuv}|}tyw~|ororx}wzy}xyvx}uyzn~~zz~zz}~{}wmx}x~vy~qqr{}o~|y}rzu~vuvzt~}tv~sz~~yt~uuxo~s~znux|x~}~zl~}sxwzxw|t}tx~{qx{~w|{zu}|lwys||qou~|||}n{j|zuy|zqtqzv}{q{u~qxgxuor}|zzw~x~v~jyy~w}~kx{~zy~~}yzk}yxv}~}uw}uzy}wtpv|_}}tyqxzlz{yxr{rxx}s}~z{{}yz|}{}}t|~|t~|xs~~{vzzlt~|}~xvzvl|vuwxy|}z{r~tzy||{{}i~ke{}~zuzuqv{~}{~|z{|yvz{xy~}{|~zpvx|w}zs~|xz}yw|u{zw}{}{vxz|{|z{{u{t{|y}d`x}}~t~}{x}{{t~~}z~zx}z_i|~~|}lxh~~{vq{{zh{yzv|~t}z|~~y~|}uu}~|g~||x}{o{~v}|y~xy{u~y{|~ot|v~||wr|_w{|uz~{~}~|{|}zztt{ulwl}{{}~~zvcqz}zvz~z{}}zxx{z}|{}p{ezx~y|vxz{z|~~w|v{vz|{wty{}{vywt~~|~~|upx}yx}}|q~{|}y{v}w{vz~z}~}jvuz{|xxvw|~~|}|xqzxrtz~}~|{x|{xsy}}}~zzw}uuy{uz}v{{~xx~}z{x~}u{xut~x~~wp{p|f{}yzsw{||q||~z~~~{tw{}x|y~~~xx}tqo{yt}z{}{w{~}tw||y|wzw{~|{ey{{z}}tz{}yzr}u~x{~zwy}z~z{|z{w|}}xvxzzq~~~w}|y~|}z~y~z}|yzwt|}{|~zr{x{{{{i~w}~yz|w{r|z|w|~}w{}zy}}u~zzuzyz~y~{v~w|}~r|yu|{x{|{}w~yvuz{uw~{zx}vw|~w|v{uvy~xy{v{{tw~~t||rv}}zzv}{{zz{|~z}yz|qy}~}}|w}y~m|{s}xvwmj}|}}{opq{y}yt|l||ylt~{~p{|{zoz{tx|zy}ur|y|w}~zv~xt~z|n}vk|~txvz||}v|}|uvzmzz|v}yp~~~~qr{s}||}psx}z{{|}q|}|t|}|~{p~oz}zzx}~~|~~tpz|xuy|xx~}}v|}vzqsws~~{q{{zv~wrx}xy{h|w{u~y|{{zyzjw{~fpx|w|zw|{evpoy|}}k}u|kf}|x}x}x}||x}}z~u|y}}x{|v{y{{k}r}}|zg|x}{yy|~~tykw~|~~yzyr||ox{z}m{p}|w}dwz~|||tu|~zwttvyt~~{~|yvzzly}|xxy{~p{~z}zw|ys||x||z~~x}}~h~y{xy|zq~z~||{v|t{s|~}~h~xz}~|yy}xty{~~vtz}}}|tw|}}w}x{v|q{{}v~|zy~z{}}xu~|{pyyx|}r}z}t{{{zz{z||u~~t~v|pz}}{}wz}~~wxb{|}}|~y|yx~~y{{yv~yz|{z|}yq~}|z{}x~yw~z}~{z~zw}{w}{~~~{}}|w~zo{x|{z|{}}r{w{wyzz~|xy~~z|}|~~~{}{y||v|~d{{~yq}z}{~}z~v|{{~~q|{}w{~{u}~w{x||x|ot|z}pvwzx|zv|{t~}|{}y}txxo~|w~l{|~zp{~z}zw|c}y|x~vx{|xz|yvy{z|xwt{|xwt}~vx{~{y|xn|z~}~|}}z}|z~yyx{o~w}~ku~k~|z~x~~y|~y~{|~{zx}{yz{}yz{r|x{|{v{r}y{|{yzxww{u}y|}z{yw}|}{{~|{vn~|{svzz}zw{|r}|x|zxy{xyt|wyy|{yzvyzvy{||wyzz~{vzz|~v|{g}}pz|t|~zr~x|x~~xnprzzww}}{u|~w~zy~|v{|suv{}v}xxzyr|xzz||x~x~}u}svz{zz~}}{t~{~}{x~~|xv|ntxp}{pyvywu}y{~zwu{|||w~q{}cykzq|yv}u~}{x~zy|~q|{}~{wzu{~uv~y~{}wmxw{}}y}|uvumz|z|{z{{{w{r}{~xzq{|wy~{w}wt|~u}~zz|u}||z|z|}{|z~}z}n{wz}yw|}~zv{~|}|~}xx{yzz}~wxr~{y{{|}w|x}{qy{}zymy~{sytx{{u~uz~{z}v}{u{r{~{z|{}|}x{~}zyz}~~u}zwwr}}t~|zpl|wu{}rz}{t~|z~vx~y|}}||o}|}w|uy{x|x}zz~|x~zyy||~|||y|{{}}w{ywl|y{{~y{|vv{zo~w}~~d~zv{}{{t~zyt{|}~|v~}}xyp|rv~|z~zy~t}}yy}{yuzyyqu~w}x}|{{m~|}z{uy}~wu~ww{||x~xw{yu}pw{}{}wy|ow||uw~q~{vz|}y{|x~hv}lv}}y|~ou|vw{{|z{{|}}xz}yzgzyvyg{}ywzt|z|yw}~~}|{~}xxdv|~{|zw|{~{||yvtyz}{|s}~~~y~wzv|t}yr{}~t}xz}~u~}uo{}~{z}|~}qkz|{w|{}~x|}~z|~s}}u|z}z}wzwz|v}~~~}}z{y}y|yxv|{}|xyt{|}|}q}~x|}s}v|yzv~{}|vlz{{zy|}z~}~}zy~z~}x}{|~~}uz~vzxyoz}y{|}x|~~|{{{w{~|ly~|z~}v~||}u}{|zy|wxuxz~vq}~}}v}|{|z|yr~q|~}|xz~}vzt}|p|x~v|~zyz~|{{{{t~n}v~|{}|w{}|ulo|xn{z|nvyzw{~xxwt|}|}}xvzrxsy}zz{xuzyxz|{woyt}}~|qqz{|y{xy}~{z}~}ovuz}t}w~|}{y~z|z}{}px~w{|y~o|~}w~}z{z}wv{||}mw{}zy~wvu~z}}y{~pyy}w~}{|{}~|yoys|ov|p~z{}x}vw~~yv||rvz}|txysu|tzyzzy}~t~}|xk}|~z~wrw|z~oz~}{xv|{z}{||s{|}~r~~{|y|}|uyey}}s{s}yz|s}zvx}vt|z}q{{ws~x||zq{s~{z~}z{x}wzyzl{j}}wzz{~}zr~xvq{~|{y~}v|w}}}{}}{~}|z{wy~y{}p~}|{{}twx}{xqyy~|}}|zsz~~}y{}tzywz~pr~{y~}v~~{|r{{zt}|||yz|}|~y|}~u|syy|xrz}|{zz{x||z}yu}~}{yv{zx|{~|{~u~y}}wo~|{zv|{yvx}v}yz~u{xz{|}}}~{||~v~r~y{w{}y}lz~s|~{z|{y}ywyyv~|x{z{{|pz~{}}y{v~}||~zw|yz{y|yv|}|txwywtz}{wywwyz}v||x{u~yw}~o|t}{~xz{vswwx~{{}{}zy~|~sv~y{||z|o}zz~z{~v{}|~|x~{wxx~}vyw~|txz~v||yxt{|xxy]xvw{z~~u|~{uyv|~y{~qyx|~x|u||{t~}|zz}}|w}z~yw|z{}~y}|{|yz|z|||}}}}yxu}wy|~}|y~~}{~zt~sy{n|{z{z|{|}|yx~wzs}~|}}}t|yw{u||~|}{}||x|u{y|~{zwz{~{zyy}xyx{sv~z{~zx}zw~~}z{zv{~z{}{|}~~|}}}yxwt~xz~}|}z{{sz{w|}}}~}|}z}qzwvx}z~x~}~}}{}||y}xz{yxz}||y||yw}zw~}z|q~z|}t~}~~{{{y}{~}{~x|yxy|x~}}~zxuzqzx|}x|y}yxz|}}|xytyy}~vxyt{yw{|zz{wywwyyz}|~|z|}}}ryx~yvyx}yx{vwyvz}v~z{zxz~{x}{|~z{}|zzyt|}{x~lz}}v}~o{~x}z{z}zxyx}{t|ty{y~{~yz}w{{x}~yy{y}z||y}v|~|r~|||~h|}uz{v}|{}v{yxy}u|~|}z~zyyyx||{zx|}}v}|z|}}yx{{{zuy~}|v}ty}y|~z||}~{x}|{}~t~yz}wzy{}}|wxzz|}~wx~}||{s||w}~w{|uy{xy}z|to|}}}|}y~y}y~yw{zy~{{~x|}~t~~}x~s{}}v|}{z}w{y|}|{}{{{~|}~}|{|~qz}}}y}}vs}~{tyy~|z{yvzxutqy||w|z}}x{}qz|{z{~|~|xyzm|r~x~zwzu~vvy{pzs|w|}}}~u~{}|}~}~z|yu{x~z}}ruxxqv{{}~{x{|~{z}{|}{|~t|}{{z}xt}}y}}~}yz}{|xr|{x~z~}xc}urzxxx|s~zw~s`~v{w}}yky~r|ry]~y}yxz}w}islws~~}fj||~kxzvzq~x}~{tq~|wtu{kx|uzt|}~vwxr|v}zu|xij{o}x|xwr~zx|{{~x{[zzyur{{ty{y{}wz||~^|li|v~tw{xy~vWy|umw{ts}}z{}ypy~}n}wp{xlwi~}p~vu~}}vyxx{yyyuw}rq}o{~v~z}tzvvy~w{~s|vj}}yyt{Pvt~{uyvzzzt}{pdj~xzzttur~|iy~~~|}}xrgvse~zvydkcsl|gozs|||}~ws{xz|~l{xzjxxw{y~z{pwu~xz}|so}z|}~|}zyw}|r{}{y|r}wzy}{p~|zz|z{|xq|||x|}l{y|lt~}~{~yz~}tt~|t~vu}}{v|{z{t~~zy{r~w|wo~|y{~xvv|}v||rzz|~~}}w|{|xwsx~y{yz|||ww}tk~{}x~}z~y|~}s}z}}y{~}~x{}{sxvx~}{x~o|v{{s~x|qw{us~xy{}|}{y||{}|~|}|z~{x~}{y~}||wyzlxv{~{||~~|x{{sy}}~}~|uz}|yy}oyvy}xyz{w}}~t|y{|~z{u|zqqx{yz|y|{|~~}vv}w~wwp|r|xzy{~|{z|yy~|w{zwr~~wr|~zx}||}}|}|wk{z}w}z{{pyz}|}t{twy~p~}xr{||~y}~jwq{}t{to{w}~xn|vtz|x|}~{s~{|y|{{vt~t{zx{psnk{y{zww~}x|}}~xx}yw}yz{|vw|{yz{u|yu}v|ww||{u{{{zzw|zzzwxvz}z}|y}{|~xs~y~ymvirww|z{w}d|r{|zz~}}q}x|x~}{~{uvt}~{us{z|z{~wzq}y{zh~{zs}y|t{x{yt{~xtqw{b}_t}wrz|r|}wy|}~~{zz~{u|z{zszy~~vz~~~{v}}}i}{z|y{ex|zyz|u~~|z{}p~zv|wtvo{~u{ux~}~~|}|}~|z{}yqts{|~{|cypx~wxmx||}|zz}zqvyx||{yyvy||zz~{s|x|ygs{}}uyx|xz}|{z~~~vv{|zz{ypu~{{{|y}xsx||{{zz|y~~y~z}z|}~~|~zu|}ytx~wz}u{z}wz}u~zu}~wy~~|yww{||ztx}~wxzzz|}tw|{x{pwqwzyzv~}~}|r}}{}x}~{xz~yy}v|~|~xy{wv|~y}}}}x}{}t~zw}{|ytz|}{{t|qj|zwzs~{z~|z~~{y{}{|{p}{}y~wz{~|s|x}}|z~tuvz}xw}}v|ytyvtx}~~{vzv~|x|x}x{|}z}~~u{}pzz~sy{zy~s|r}{y~nz{z{}zwq{w|}~xy~}z~yxt|zw|yxxz}}w|}~{~yx~}{z~x}z{yz{}~||w~yxzzz}xxy|~zrzlvozw~vzu}{r{zyxz|}tz|{zzx|zzy|~}}vzpyw}{yw{~|{~y{{zrzv{z|~w}vu~{zqp|z||}}~}v}{{}zvz}{v{xs~|}v||xzw}~~wvx~||~|v}|~{vrzz}zyx~wqw~z|w{wz~~y}|z{vx}xw{|z{~x}{l|w}{~~|~~x|yzx}{r{zy|}|zs|vzwy|z~zzztyw{}||x}y{|~vz|yxzvzw{|~w{||z~{xx~x}x}~xyzvy~{{~||~x}~~|}{~{x}x}|wy{}z{q~xz||}s~{z~|yz|~y{z}w|s|xq{~uxz}vzqvt}vyvz|z|~z|||w}z~|{}q|yzyvgpo~|z{}xpwso}tm}qzxt{xy{{}~~zr~uut{~{~xo~z|z~py}ysww~r}}wz|}}u}}z~krwz}wyz}|{}utx~rz}{rs|x~y~qn|p}}xzexw{{{x{zzl}yy|~wuz~x|}wrh}zw~|{}|izx}~~z~z{zzy{}y}{rl{~}uv|||v~v|}yz|x{|xvv|zr}|q|x{z}yzw{y{{z}~p{w||{~zyzx|{zxum~|wqw~z}{|~|y~ywxy{~v{uk||t||}}n|yr{~zqo{}z}z}}y~s}||wsxvtol{}}{{t|rl}x{|w|x|z{wxuzszxwzz{uz~|{}||{{ywo}|y~~yz}~~wzyvx}~}}v{zvz{}zyx~v|yrtx{zs}}uu|z|}}{{z}wz}~|{v|xt}|}v{{z{|vt{{|vy}s~|y~|}z~y~~y}|z{zxz}ymy~x~luz~~{|}xzz~}uzsx}y}t}|~}~}|}y{|y{w|~{||~q|}~t|~~|~}{}|z}{q}~yzx}~x~tyw{}y{vt}}|{{~}}y{swzuw}|~wz|x|~~y{rz~u|zxpu{}ypst}z{|{xwy}||}xvh}vym{|v|{t~{}|zysz~wz~|}}zq~}y{}y|~}ks{\t}r{{v{}z|{ruz}|w}sw}~u~u~q{||zzyz{vzvzsrz~~{~nwzwzzx{yv|uwt~{|pyzux~|{vvzy}s|{y}zz}~y{yw}jwovzqv|}zt~}~|sv{s{~w|y}zuz{z~|x~{{yv{z{~}v~~}|wtu~~z~}}tzq}v{}}yr|}}~}{sl{{}}}qy}}}}}}{x~y{~jv|vu}{x{sy|z~|{vzxxx}|x}~zy{~zy|}}}|{}~x|v|||w~s}~u{{yz~|~|~g|||gx}}}||u{yjvur|xy}l|}o~n}}}z~z|r~~|u~y|{uuuxyzw~{~|}ztv{av~|}|ys}z|||~|}y}}xy{{y~}vl~{c||}}xu{r{~w{{zw{z}yuxsszuvusx}|{wx~yz~|~vwzqtxztw~yu|v|}}xxzyz|~~zzw}nu}w}z|}|zX}uxt{~x||u}pyx{{uw}~~|t~vuzzxy~s{yzyv~}ys{~~}ysz|sz{wz|}|z|~}u}{zztpw{ruu|s}w}|oy}{~w{|wx~{~hy|v|z}}|}|{yy}f~u~~zvz{||t~y{zvy|~qzu}zsvi|}yx{~yy|{{||t|wxzx{usyzuu~|v|~vu{qv{|wxzy{zy{}t{r~}xu}qrvyzxyu|zz~}{uwvk}~z~~}u{}z{{|e|v{uzywuw~w{|{|~pw|{}~{~|}x~x}~|}sy{zv|{yi}wz|o|ny}y}|v}t~{zw{z}xz{~zvmzz||}||}yxeovxp{u{zyv{tpzu|u|~r{|~~{|y|ox|{syz|zzv||zyk|zt}ytyw{y}{|vvz|x{{~~x{{yy}{x|~}y~z||{{v{yu{lu~}}~{}}~iw{p}x~y}~x|{}ezy}{zzzzxw{~|{|}~|zsw~}~~}yw~~~||{~~{v}{z{~~~w}}x|u|uy|y~x~~|{|{w||||w|}}|}|{yyz}{}|zxuz~}|~|}u~~zz}qv~p|y}}{~{~~||}~z~o|y|v|quqy~t{}{vuz|yzw}}|{z||{{~zt|ys~wwx{~z{w|b{{}|~|v~w|z~|v|qy}~~}x}zpzt}{|}||}~~~v||{~u|yv|z~~~sy{x{v~|}|}}u{~xwxz}v{~|z{}{|x~u|t}zy|t}}zzr|s}}w{}zxg~v~}|{y~{||{{yxwwt}}z|{~~lxt~xo}~|y|~|}|}x{vxzv}{{y~{z|}}xqw|yz}}uyvt{lvx{l}~}}}xz~{w|zyy}~wzxxnw{z|{otw~||y{q|{}tly{t~||}|}t|{}~~~uw~v}z{s|}ux{x}|~y}}}}}|}{{xtswxz||xy~y{}ywv|{uyp}~y|x~v~}}~w{}yy~tzxv~{{z{xv||~vzyz}}}~s~{s~~z}y|~wxv}y{vy~~y~u{}{}|}{|st~~~}nzzwl}~}q}|~uv{}{}~yo~|t|tyx{zy{}vu|z{{{{x}w{ovx}v}xs{qx||{|~{{u|~t~{|y~}{z~x|}~zy}{v~|yz{x~|w|w}{|z||}}yxyw~{y~|~||}vz{~z{w}{py}~l{~}}}xxx~|x||{z{y~}zpy{{xs|w~||yw|~}x~}|v|{yvxzyw~||{{}w~tyiu|{|~~s}wyy|ywy{{}z}|y|{y}~|~w}{}~xx|}z|x~uw{~|}{|~zy{{z{~}syt{~|~{}}w{{{|~t{}|yvy~}{~wzt{s{|y}|||z}v{~yy~uxsyx|y|{wx|}|u}|ryx}~}}u~~z}pq{w|{z|{z{|}~y}~z|yu|x~{~|}{}}p}}zz~vzys{s|{v{{x{{{sxu{{s~}|}r~y}wyu}|{q{uywy|x{yy{yxw{~py{||}{}}x|}t~{y|{{|vzw|}yyy|x{up~v~}zxu||z~}|~|z{zyu}~{yw}|xz||~{x{}t{xs{}yrxzx~wq|z|||{}}xs{{ysvxzv{v~pv{}{~z{|~v{wy~v~{zx~}v{~~x~|uvxw}tz|{v}wotz{z|tv{|o}u{}y|y~~yx|{xy}wz|zu{tv|x|z}{vz~{z{}zxs~wyyq|zv~wvwz}nxz~xu~~||{z{u|x~|{y~s}~~wr{~z~}u}wzwvt}}w~}|x{z|tx}y|u|s~zy}z}|uryv~}{}~|~y}y{uswyzz}zy}t}~yuv{y||vzzzv~{}~wxz{tuq}v}w||{x~|w{ux}{z{~yz|suwypu}w}w}wow~z~z~}{}~xxu}hy}}yzzwsw~zwx}zyz}y|{}zx|xy|qyzyz}wy{sx~||~y~y{zz~s{z~x}}}w|}zy{xy~{}z~{wzs}n|yqs{{}zr{sqxy{vx{{my|}{{|}}yko}z}wyzuqx|z~~y|xu{}|{{x|pqwpyz|{wd|x|t~|{_{yysosrhzu}xt}q||~{zzx~vyxtn}z~wm}|V}{}qy|x{|{{|y~}ywvv{{p|~}|}~{}v}zz~|~|{{zi}v}~xvu}yw{y|yvzozz}zn}|y~{u{uuzy~xyyo~u~z~zssy}yvu|x~{}t}z~~w{{{x{y}x|y|}~{~x}vz}|fy|sx}tp~}~}}zfxzt}uyzwuw~ws~zuv~v}{}~zy~||z|~u|{oxztu|~yrz{yu|~}z|}{|~w|yzyztr{|yqz~}yzs~~}x~x~zo{yzt}}uypxm{zwy{yx|l{|x~{t~}{zyvzy}x}w{w{}z|}wv|}zv}}yv~q~vu}z{wqx|wzy}rq~|zswl|||z{uv~}~}{w{|wxxu~||xzz{z{y~{w~||}n|vu||{|}|~}y{v{}s}vuv}v|rwy|{~|~{z~xt|~|{}|xy~|x}{}sy}}sy|z{xyz|}htwiwu~|{}s|t~{~{uz{uywvzzvz}xuy}x~{{yy}~{|}w}z~y{zz~}z{zzxu|q|uv}u}x{yxuyvs|{zs|||}|s{twvsyyzuw{~{~zyssuytxxtt`w|||{szwx}{|x|rwu{~xu|}{v}z~vryszx{}{{~||u{x~{}}{x|}~zrwyt{zwtwx~{wu}~~wxw}uquw~y~zw~w|v|sv{}{{z|}fxvy|y{x}wxv}}z|{w~syyz{rq}vv{u~y~lyhyz{|zxn{wxrqot}~v~{|{q}{vz}~mtr}~~{nz{{u~yrru||~|zn{zz|{{vztq~}}}rz{{vg~~xzv{yypu{~{}zw{y}{~wsz{ulzs~wxx{|{{u~{{|xw}}v|myzx}~|~|wv}|ozx~|}po}~~vvx~yqv{yy}|~|{w~vx~zs|zy~yx{qyz~|zyw}r}~}|w|s~z~ytz|{q{{~}~{|xs{xz{e|w{|}}}u}j{xs~{~{z{rzz|ut}{{{x{}v{}yys~~|x{z~{}~w{}|}~u{~{yx~z{{|~|ztwy}|{|zq{}wz{|utzy~~~~tx{|y}~x{xw~x}xz{k~|zz{yzv~~d|{{~}y|{x~}zzuy~{z~{z}yxxzyzz~~~|ow}{~~v~y}s{w{}~~ty{qzx||yxz}q{ys}wz|}|yz|~wwzx{~z}x~yy~y{zyy~}s}x}}~zutxl{wxz{tz{}~w{}|t}}r}}v}u~wt~uu}{yzx|}z}{zxzyxzo|z~~|wyzx{z}z~|x}}}|v{ew~}|y{~||x~w~~{}}}{vr{zy{}}~yv~{u|v|{{ypzyz}kvu}t{{|x}q~}pyyz~~}}}~|tyuwzz~zy{ry|}|y}}x\}|{{}}}z}z~{rwzw}|~z~|t|w}||~z}{rv}y}~|{lzx~|vv~z||}p~|kw{|~xt|y{m~{|x~{|x~}wyu}x{{|~|v}~{zuq||tx}x{rz~y{{}|{nz{zx}|~xk{|xz~~n|z{tpy{wxyrx~~|vz|yy|xw~yz~|}zt{|~yp{z{wyzwpx{}zz}zz~{}wzvuu}y|xsy~xv|}}z|{~z|}t|~}{x|z{|{zu}z~}}y{z~qtw~{~twyz|t}{{{{}}~vuxuqzsyrvhzx}z|{ux|y~{~||{y{~t|z{|~|||z|}z~|wx~~~z{~|s|t~~l~}|uz|r}}wu}~}~w}z}{x~}y~|ywywy}}zy{u{}u{|y|~oz}{xu}wx}~y}vxw|}}sy~x}q|r}z{uw{xuz{|ryvz{{{ql~|v{|}{}|tt{fl|xz~w~{}}}|y{}k|}vxk{{x{|}~vzwx~~x}|w{x{xvw}z~|zw~~zd{{~y|uz|y~}}ty{mzxrm~~|}zt~|x~{vvz|}xznw~~||x`ux{yx~}zxy}~z~~y|~tynwxyvtw{{txs~|wxu}|vvv{yp~z~{u||s|{z{{v~{x}}o{v|{{w{{x{||{y|w{~}tz|}~}~}vwsw}yrz|{z~y}rzy}rvz|~rwtxw|y~|z{t{|}zy}}{zvz|zw|z}}zz}~{~|y|}v~xv|~{~||r~xz~~|pt{xm~{~{{p}{{}}}s}{smx|}u{~zzt~{}~}|x|ztz|z|~|t}v}}v|xy{}r}}~u~]y}yuv{{xx||}|kxzw||}w}|yz}x|~y|x{~v|r~}wmz}zz}zy~y{hkg~xtxuwv{y}uz}z~xw{tsx|v||~yx|ywx|zyz~}z}zxutx|~~y{w~uu{|y}wv~yvzv~p}~|x~vx~ky~~z}~vll}|wz}w~}}ur|{|tztl~~zw|~tt{wvx|{ux{~w}vzy|z{}xy{{~zx{zz{wyyn{{~ywo|zwzw|vwv|~||wx^{z{sx}}{{y~{||u}z}{~{{yr{~zw}~{y|~zuxvwu{v{ly|yww}t~wyw}sy}x{~|x{{svwxm|{|z{{tt|xzvyxo{r~kl|{fyz~|{z|w}s{yu|}{y~x}w{{~{z}zc~{v|zi{u}r{|~kzv|~rqyyx~qzxz}~uvvy|yzIzwxzxy|y|x~uu~x{njv||{{qz{Z|~xw{~~xt}o}~z}v~~{||~~}}~|u|{{}~f}~|}{~}~quu|~xv|~ozzx}~y}{{u}}~z|}|yyy{~}|y|z{sxxn|z|~~y~~xs}}{z|~w~|}ryt}t|y|{v~{x{{{z~y~yx{zwt~t}|zwyy|tt|}ty~xxwy}t|w}}~}t||xz{{|||}}}w||ywv~z|{|z}{~{~~w{}|yyxwz~}wzzzuz}r}{yw|~y{z}zxt}t~}rx||y|}xz{~{|yzw}y{z}||~yuzyxyy~y}zy{z}y|r~|{yyyzz~~tz~z{{|}{}~~sl|~~|yz}zx~p~xp}s}x|z}~ox~|{y{zzsvtxq~yy|t~uuyty{v}~{x}yzzsyz}tx|{|z|u}~wx}{xt{}}y}qv{zz|}w~y{~vv{u{|~s}ook}y~v}~|x{}yxnwv}~uz{||~y~t~r~~{|w~w{~}y~ypy{z~}wv{~}s~o}}zw|xu}wx|wz{vwz}|yx~~}{|}xy~}u}~{}{{wu~~zzzz|xrx~~}yu||{wx}x|~z~yx}y}{|}|y~~|zw{~}y~v}|z}|{q~sz{u~~~|y|~yr||{{{z~}{z|ow~ys{t}}|~{z{~|~~|z{vy~yw{w}ry{q|~}~v~lxwzs{|}~~}{{~z~~~|xy{}ut|{~}~y|~~{~~}~zx|ys|}}yzux|x|{rzz~}||y|}|}~|v}s||w|}{z{}~}z|||x}{z~}}y}{uyxx}{~x}zzy|y|v|}}||xyup|xm||z~xxt|q|{z|zx{~z}}}{u|~y|~zxz{}}||yz{}}}}{yxox~~~|zx~w~}|~w{w}zx~}w}~}}u}}xyyw~w{}yzy|uwx~z}{u|ysr~~z~~z}y}|~z}~zt{x~~s}z~||~{~wz{z~v{}{n}y~z}|~}~ywwyywwxq{y}{wxy}~xwzz{~z||{{z|}~u}yu~|{ys}~}yq}vtz{w{w{v||}|{{s}}~~|}|y||~|{|}ysv}}u||z{|u{{{}z~wsyx~~|zx}{{w|u{}~~utxw{yswxsuswvzx{}z{zuy}z~yz~|}w~wv~~w|o~xzw}u|}zyw|wtvywo}{vu{z}}{w~{wvvz}z~n}wtu|w|~tpy|x{y|}l{~}{{~|}ww{v{{|{{y~w|}z{|w{}z~|}z~}|}yx{}pu{{|~jwn||t~zx~z}t{zkvu{|w~wzyy|usxzt|~u|znpzyz|yz}x|{{yv}xw{rvw}~r}y~bt{}s{~z|~||{}yz|~|zy{{{pu}zujvy|}|uk}}|x}q}ryyxz~t~x~u}yy}|~yyywz~}{}~lx}xzww{|~~~{~~|uuusg~jw|}vx{{}{z{}}|yy~|xx~w}zt|up~t||z}}ozyvwyv~xzx{kpo|u~|~~rw|~s~}xwz}}||vtv}{xuy}y~y}||~{~x|xtypw~|ox{||||{xvlz}wyktxp}r}}t}y|{}~{ws}w}z~{wu~~s||}{l||}}yrzxx}~|~pk{|~xp{v|zz~yzvu|||{yvu}|xx{s~~{{~~{}}tpwt}zy|}w{|z~x~}z{{z{|{t~u~{}uowt|x{}wzn~v~~zwz}~{z{|~wzz}y{{}xyrz~k~|}~|~t||~y}~{}vy}z{n~~x~v{}|~m}vz}{}|~s~}}z|zz}|}{tr{ty}~u~{~z|{zzyy}~wp~yp}uv{zx~su{zu{zol~z}s|u{~|w~rz~}}zq~{{y{m{u~zxyv~|~v}nsbx}yx}~{~u|zw}~xx~w}{z{s{}~z{z~y~|}|u}z~}{~x{m{z|~{}~~}|z~}tm~}t{wn~}z~}{zxprztxq~ryyuU{w||wxzy{ypx{x|{{||{|sz||y{ytyxz|z}u|~z{y{sx}p}~yx|z{q{v|v{z{|w}|uxwz|~xo|wxxxyj}zy}}}}o}wx|{~znq{}}{y~w|ux~{m~sz~x~~u|qv|~z|ztty{|~~yv~w||~y|uqu~z|ryqg|zo~w{{x}tpu{|p}~x|x~~j}w|~x}wyxzLz~yyyux~wx~{~|~v{ps}|{w}k~z{{|vxtqy|z~xz~{~}|n}}xw{|m~~yo}|~|tr~{xz~y|y~yo~|}z}zw}vy~z|{~{z~ywuzwxyyxy|tu{~{y{x~~{|}zy~{mfyy}x{ry}|xy}}oy{xu~}~rttvw{zvn||z~}}~}zww~}x~}|qt}|yqywv{}y{}x{vuvwxyw|ku}vwy}{zuq}ozouxx}|}}|}o{{{~wz{i|{tr|pv}}v~q~~y~x{zxw{zsxxwzxkxo}}uzzv}suwypu}y||l}|s~zx{}}tw}x~~{y{}}{tvzq~u{yq{}_wy}}|wxwru~ty|~z}l}~zv}z}xu|{~s|~||xowx|{}tx{r~||||zz}se}}{~qz~~~rxZ~}u|uz~zw{}|x{zq}ky~uzvttnxoju|{{|w}qu{sxx{uyszxzy}}w{~}{g{y~t~{}|zzzxx}|y}}{~}{v~}~|}u}{yy}{yx}v{{zvz}}{y~{|y|yu~zu~~|{w~~z|uzv}yz|~u{|v~x}~wzu~z~v{{|x{{xsr{{o}wx{{xz||}{~|y{|xw~{}~~~|~sx}|~zxy||ytz|~v||zyz{x{zt}~}~|y~zxz|~|}z{~zzyvz}|xxt|}yu{}vx}wzy|s|~~y}w~vr}}y}u||}}s~|}z~~||x}n{{z|y{|t||zv~tzyz~{z~~{{~|z|~~x|}~v~w{}z|~{|z{zzz}z|{}x}x}|}|~r{v}}|z||z{w{{yyr|x}ywy}|z|}~~|~{xtzy~z}~z}~|yw}y~}w~}sz{zs}rxrww|{vy}y~~}~mmx|vu|xuzu}}}|vxy|tzx~|v~x}}}zx|vm{h{|~yy~~~|y|z}x~wo|vr}yyz~~r|u|yy}v}x~qrz~{ynw~{}|zzhZ|r~zt|x~{|v{|~~u}vzz|nq~{{npxw{y{{~|ny{z}hv{z~xxy}s{|xr{eny}s{qv}v{|{t{vzw|x~}}~yz{xqy}y||{}qzv|pf{{{sv|vs~Vzt{t~|zzx}|~|p{}yt}{qz}tx}w~~}~yx~~}us{{uyv}z~jwy~zy{}zwptytwa{s{oxzo}xzzu}wu}|oyvwh|~}pz{|t|zvp{wz}yx{q|wzw~~x~twx}~|v~yz}|w}y}s|ytxy}w|}|{uz}x|{|}~~zrvx||z}}z~u|z}uz|{p{~{u}w{y~y~zyxx|xy{xw{}q~}o~ot{}~s}|wzyyyu~||~wx{|~{z}z||}y{~xzx}{}x}~{yxo|}y|}}}x|z{|x}~zvy~szw|v~~|~y}~{~{syvuzq|w|xyz|yyxu~~|||x|~}~||~||z~~x|}~~~x{{yy~xwx}||w{~tw}x{|z|y~x}}}yyv~zrx}~qvxv|~u~l{z~q}|~~us}}}{~yv{|~}}y{z|}~y|wz~|}~x~{yz}y}y}}{w{zr|}|vx{|z|}xxt~~x}}y{{m}~x}|x{vru~yz||~t}}{x~}rw~vyy}{}tv~sw~v~~}yu|x|dv}r{}n{v}}}|yx|r}s~ww{~{xp~|}p{{voyu{wy|x{x~~}tw{~|}{||w~{vz|}|}}{uy~v~x|}~z}}sv~{}}v~z}u|}{{g}{}z{{zxtvyz{u|tz|~w}xz{x}w}zzxw}~{{{|r}zyy~~{~vsuz||yv|~|}~yw{vq|~zz~|x{}}{zv~~{{wu{|{s{v}|{wyx|zyu}w{}zvy}vn|{}yt}tw~s}~sx|tww|wuz{xs~s~u|yy}{{|~|~}x{zyys}}{~y{}yuy}~|vxy~qzxzzw~hzx|z~z{t{z{x}xv|ww~}|y~~{zy}p}x{||{~~~x}}~{vz}{xx~y|zy}z|sz}~||xq~~xv|~wxxyr}{}~{w|~{}~t~|tw~{yv|u|}xzzvz}|{~|~hw}u{zsu}z~|}{vzz{~z{~{{z~twx~}t~|wxvTwyz}{}uxSy~x~r{w~}|vx|{~w|}{~}s`yzv}zx|w}~~y}~syz}v|zs|}tx|f}|~}{{|zzwz||pvy{{{w|v{{rouvt~}~zy}nv{|}yq~ww~|lzv}w}{}|~}tx{us{}}{yv|~wlzxg}vyi}~|ywxr}{{|sz~|izx~s~}|wyy|vg{z~u|v}{z{orv~~y{|~u|x}{v{~}{~}~uyvw~|~vz|w{|~~~~x}wu}}y~}zz~~v{||ntt~~v}}|z}|}|x~t~|y{z{y|}}|s}|}x|~v~{~y~{z{~w}f~wy~~w}wl||{}{v}}xz|uww{x}||u}~yw|{{yuv~x}~~}~s}zy|}|{x|y~|zt~~{z{w{wyso~|~z~zvy~}~|w{}t{~}{|~}|||}y~~y}xv|~~}}||z||}qz}}o|~}}vx{wz|}wxx|}x}||vz|}|yywszvzt|{{wyzd~vt~}zxy~wy||~{k~}z{}~}wq{~wzzy}z~zyux~{|}}w~py|{q{|w{{z}}~|{|xvs{~xz|}}~}|}|v||qvo|ut{}y}~~||t{z{y}||~xxu|w|{zsz~{zxp}}}u}{|z|z|}x~}~x~vt~w{|z{x{|{}z||||pxxl|{}~xy{uu|z~zx}{|{x}y~zy{vz{{~}~y|}v||zl}zxv|r|yyuzq}}x|yu~y}~{}}|mpz~yxo{~|}x~{{~~z{}}|x{|{~|yy{x|}~~}~~~w{|}z|z}{x{{|v|xvz}su~z}|}|{~||~|{~}|{zyx}}}||xw~}~|{y||x}{~w{~||x}{z|{|z|pz}w~}}yo{w|z{}{ztv|~~xw|x{||u~y{}}w{uwz~yu{x{}{~}{~|{}~zz|t{}xz|y~|y|{{~~}zqv~z{{{{z~yx|~z|{{||zuz{|}s}}n{z{~}sp{j|}}{}{||~oy~wt}~}m}{}yv|v}zy}|z|{{|yw~z{z{w}uuy|{||yz{~xy{}y~zzw~|||~}vz~}}}zw|{|xz||~yx{}}w~}z|{y|}t|y~{|}~|{}~}{}{~~o~}z~x|{z|}y}||wxw{|~}{t|v~~~|~x~x{{sx|x~|{{u{}{uzs~zyyzw{}~w~{|}{~|{z|wz}yv{~v}~vyw{||~|}|u}~{~z}yv{}w|w{}~{||{~zyoz{zy{w~|yzw{~wz|vz|}}w|u~}~}y~yym{}wx|zyz|wwwwuxy|}{|s|}w{ozwv|wzz{yyx~s{uyx}zqu|~j}y~ztwz}z}t}~wxzy}|{{y}y{~~}{sxt~uv~k~}}wzx|}{~wvty{~wwqtr|zvyzyx||~w~{~uz{~~{z{y}wyy{y||o~|soq~wkmy{{}}z{~mtz|{|z~w|~~zyv|z{~z~z}y}vm}r{z~|{xn{~~y{~o~}}}|}sxw}}x{|uzz~w|{uzyyzx}~v}vj}wyzw{}~x|r}r~z|z{v}y{~|}{zux~n|m{{zy~xv{yp~~s|}~{|~v~{~q}~yz{vsrxxzxzxqjzx~z|vp~zvk}|w|~q~{}}xy|wx~}rvhovz|{w}xn}{tk}|s|vt~}|}}z~y{}y|x|{~zz|wx||~|~y|vyot~}~~yz|}{}{w~{wsxvy|y{}}~t}~|yp{~xz~{|tx}yxz}}~u}~|}tz}}vv~vuz{zx|}xzxz|}}y~~~t{z|z|zz{w|{~~y|}}~|s{v{w}y}ww~xv{r~~}y{|zy|vxz|{zw~~y~y~}}|{~u|zz|~{}}}||zzx}|yzzv~t{|zzxwv{z~||}y~x~~|}y{x{v~zo~~z{{w}m}{s||t|}}}{zysxyzt{~|v}zw}z|~|zw{}z|wvv~}}x{||z}~|}~{y}r~~{xvz}yzy~~{w}}}y~|zy~wz{w{vz{wszwr}oysz~w}x|{z|vz~}zy{u|s~w~y{~{zxy~}x{z~w}{|x}y}y|~{z}}wzy}}{}~w}~{nuyyxx}zxuu}~}|{szvy~~wv~w|{u{~~x|xvxxx~yw{|~xsqz{}|w~~|~yy|zz}z|}x{y}up|oz|{~{z}~~zz~t~}x{xwy~~{{w{uf|}{}z}xzsz{||z}}sw|{s}zy|u{x}~t|{v{vt~|{}}}x~{ypy{t|rwwtz~s~}}z|{x|x|w{ts~~wuqu|kp}u}z~huzzzu~|s|z|r~}uz~}{}xvwq~{|yzw{{|{v}zzy|z}hyq}xx|suyx~{mx{|xz}}xuv}yz|vywxy~xz||}zxy}x{r}rv}|~}{~x}u|ww{}|}|~z~zwzz~|zz}{yx}~w~~{~zs|v~|x~~|~z~}~x~}}zz~wx|{{}vy}~|{{yzy~}zywwwz{}}{}z}v{{}z~}}y}~{x~z}}{y|~x|y{|z|}}z}|{yyy{~}z{~{xzp}t}~zx|}|u}ztxz{~}v{w{oy}}~zws{x~s~xxz|{vq{zz~y||}yw{~}y~w~{v~~}{~x{zz|~{w|{}}zuo|zzyyz~szxv}yy|}~}}z}{{y}xz~~}{~|ww~||z|}{tz|wzzyz~syyv~|zw~ryz|v|u{x{x~|}uv~z{~{|{zxo}||yut{t}x{}{uw{|{|u|y{~}y~~{xy}|v}~yw~y{w|vzu}}xyzx|yq}stwxp}v|wy|{|z|}|w{|tzvyxqz|z|x{{~}xwwxyxz~{}v|~z|x}vsz{~r|{~{t{wvw~z}}x}|}}|z||z{zvxq~{yv}}|zy~}||zqx|}~|}zx~t{}}z}{{|{v~y||v}y|}||tz{~~x}}{v~zu}}}{ywty{~y{}z}q~|vu~zyy{}}}xyw|w{}u~y||{r|}|{xyppy{|z}w~n~|xzzs|}|s}{|t~{yt|np{yx~|y~~qt~|xy||~}zy~|y~u}nz}u~{yw|{myzt~||{zwx~yxwx}|{{zzz|p|z}yyxq|{|x~|zzxw{v}r|{~}zxzs{t{zsv}z}}sy|}~{|y{||t|}~}}yzu{y{xyzz~}}x~pj~zwx|z{w~zwyz{~{|y~wwsy}|~zxz}|~~||w||z}t~|x|~~||~u|uxy|t}y~|u{{}izuw}y~m}uw}{~ys}{~p|zt~x}|xo}}{yvv||x}~|t|vzm~wy{y|~zyu~zy{|xw}||yv}~~}}|~|~}|zuvm~~}zxwx~yv{q{}~wv|tx|uuzuz|y{{~}|~tzx|~{{}z|ywxuysyzv~xw{{x~||}~{{xzw}~u|~||z~zz||~xp}|~xzs|}zyz{|{|z~~|z|}~y|y|{||}m}|~r}~}~x|z}~{}tz~w~wy~{zvs~{s}yx|~~}yz{ys|u~r{ywt}|}|~zus}x{~|{{vxtqxxo~~z|x}|uvy|}u|wqzts|z|}}||}zyy|x~z{{sxn|wy}|w~kvwt}wz{~}z|xqy~z}~z|{|{{zy|}}x~zz}|||zv~zz{y|wwz{}v~{~}{w{z{|zv}y~}op|}}x{|{x|~}yxz~w{w|{~u~x{}y}u}yx|yxszx|uv{|{}zx|zupu}}uyw|{}|x{~{~|q}|wwsz~|j|~}}~u}zxuu}wz}|yz}~{|ux}{}zuqxz{y~|zyzs~zy}z|x}}~}{|y~{y|~v{yz{w~zvy}vy|||||~zqy|r}|zt|tzss~zxx~zqyz~w~u~u~}~{~{~z|}|oxz{~zxzvz|}urz|z}}r}{|z{zzy{}z~~|}~}||xz~{|yt}|w}zq{{{~}~{~}{vzzlyzxv{|}|zuy}|}}~yzz}s|xz{w~z|v~z{}}x}}~yxyzz}x}}}wy}~wc~w{~}xpy||z||~~y~{r~z~ys{u~z|xy{}|tv}}uz~|~zuzy{y}|y}}~|~~|zy{}ww}xxzvyvtz~~{|x{|}|}{l~x}{xz~{~zxw~{}y|twv}|v}~}~yv~}w}vyyyw~}~|}ytwxz{~vz}}|uz~{|x|y}z{}~~pxyvx~{zz~{|x~{{yuu{}}~~~x{{{zvwwzzm~}|zz~|~xssw}~w~z{uu~|~{zw|}y~{~x~y|x|~vy~|}ny|}yyy}x~xx}~zrv|z~}{{{~|}zt|y~}}~}}e{xx~ux}zw|z~y}~~sz||{v{}~zyvlyw}|zx~}~z}}w~}}~{}wy|{w{w}}z~~|{~vw}{|z{o}~}zz~y}qv~y{w|xu||yy{~qy|}~y{ttzn~vu}~q{{zzyuwr~t~~}yy}y}z|u}y~|{}}|zx|}}yz}|z}owvx~v{{~{{}{~}z{z{{v}vy}~v~}{{~v|qu{~u}}ru~y|~v}{yt{x}{v|~|}yx{x{~wsz}vux~{pt}|~{w}~{z~}wx}x|u~rm|}xzvyx{~}wxxxv|x~{}py~rs{xyyo|n}xw~r{xw|zuy{}~}v{{}u~{}|v|zz~|t~|wvu~}}{}{z{|~vz~}y~}z~~{||sz}|zvs~}v|y{{}s~||y~}{u|r{x~z}wztvtw|}}x|{{{yw}}~|}yx{z~~yyus}|}{zx~zz~}{yy|x~}|x}{xzy|j~~{z{}r{}szyx~~z}r{z}|y}zz{~w|{~~{w~}x{~o}}~|r}|z~xyxx~~~y~{{|}z|lz~zzz|z|yk~|}wzz|}kv||~tvnw|}r{{|ryzxx~wux|z~|zy|~w}|}~~v~|{m~{xv}w~u|szn}xy|{t~w~vvzz|~{~pz~ss||~ytv|r{~}zu|r{}}~~z|}wz~u}{z}~|w}s||u}}vx}uz|~z~|x}}{o{~}|yr~w|z~~}vy}{z||}t{wx{y{yxyn|y}n}yw~}{~~w~y||z{~{z~s~}y|}ty|wz{{{{w|yu}|{zw~~z}~|v}}||xpysyz}{y}}s{~|r}y|{u}x}{|~yz{|zuyzr{}vy}~~}{~zr~}~~z{qs|z}~{~}|~w~~zxv}xyx{zu|}~y~|}}zw~yxr}}z~}}}{~}s|{{z~|z|rm~v|y{wy~{~~~{z}x{pz~x|~}zv|||zt{u|{z|}w{tx~x~~wz|w}uwz||{r~x}{zy}}{~ys}ws~}|{{||x}}u|vyw||m|m|{{z{~uy~r~}{yy~xw}{s{|~r{y|qv{xt{}w{w{y|t|{|{}~|yz{}z~}zy}r|u}z}|x||w}zmw}z}uw{{}zlw|{t}|p}w~~wrvxx}xz|~}}uwytu{~{x|{~|y|~t||||~{~txu}xyy~wyv}{z|{~z|y|}~z~zz~z}x|yyx~}w|y}t}wwzy|{v~~}uyz~{sw|t{yy|{}|xxyy|{}y~x{nwt}{}~{|{x}zyt{z}}xq|x|||}tvu|}u}x}vx{x|lz~{}}x|~w}{xz~}xyw|~}}s~wt|{rzxyu}~|xnw}v}~|w}~urx~v~x{wzvv~|z{z}{}}}s|~|zz}q}}}z|~{}x}|}}|}~~t|q~}}wur}xr~~xy}~w|wx|um{x|~x}wwv{}|v{z|qw}{}|{~yuvxz}~zxz~~uz|}{}~||zo~h~zs~w|}|t{z~zr|z~}x{|~y~Sxy~{|zmy|zsq{}usw|u|vyy}}}r{xow|z}{|}tw}z}vx{uzv~{xvyxzus}yy}~|}}yxy||~~y}w}~zuuvtyz}vl|zvw~zxpzs~|~}vm{{}{}tmy~y{vy{|yx{r|w|w~zz{vywxlxz~}tw}h~wizzos}}syv~}n|>v}wzxy|m|~z|yv^uz}r~yy|y|vp|y{w{}|x}~zz|w{ttx~||uyt|}{{y}}~kx~uzxzvz}v{}}tv}{u}}w|wv}{m{sm|}~}|tx~}q|tx~}x}zxz}xty{uvzr{7v}{||y~}x{}zvwx{}|xz|~{p|{y{x~~zw~{y||{x{{}|{{~}|~~{x{}|}}|wyz~~~x|~{kxw}|~|}|{y|{z||{~utz~x{u|xx||}}|v}{zz}{yz{}ru{y{~~~}}y}y{yxt}~~||}|}{{q{x|~~~|||q~w~|ww}z~|zuu}{~|oxxxzyxty|v}ry|v~wv{|}zt}}y|y{|}~x~~ux{|}x}}{zv}syx~y~z|~z{{y{~wu~w|{yxv}x}{zt~{}z}||}y|{{~yn}sr~}ysz|z|u}w~{vz|{zw{{}y~z{|{|z||{z~t{{~}x~}}~x}}{r}zx~x{y~x~~u}yv{y{~yt}v~w|y{}~}nwuy|xp{wv|y{x{yy~|{ueko~t}yt~{t}|sszy|{z}{xxsx~}wt|}mw}zf~q~}ykkyw||}szx{{x}{vz}|{t|uwwwzv{{krzuw~{wswyvxws{m~]rzqw{q}j{|{vxzx~g}v~vnz]n}}vmupzvzy~rs{|s{pzxvoypip}y~{p{zgr{}}y}q~rvtq||w|~{||smysus{w}t~x{xvlzuw~x{~|yz}t~zv}|x{ryty~~ztu~{zru||z}}y~\nxyzy{zuy}}xyw{y|yzz}sch{}h{az|swuyYn~}z{u~wutth}y|x}||_|w|xeuy\wuwwv{u~y|sGxry|n|}x{{p}~wKx~~wzubz|pu{|}|y}zwz{~z{x}}zw{z{}|{~y|v|zz}zz|xz{t|~~~|~~zz~y}|t|||y}}zzos|}s|~{uz~~~}x}~~{y{||zzt}|}zv{yu|||{}||~y{{zw~}~}~}}z{}{||}~x~y~{xx~||{~|{|||}{}|}|{|{zxzy|}}}s~|{}}|zz|wz|~~}w}~z{{{z}{|~z~v|~~||}w~~}|{{xwywvtyy||~||x~|{{y|{|w{z{|zz||xx|~~|v|y~~~z~||xz|z~y}x{}{ywyz}{|qzw{}z}{o{{}u}w~|}~|x~}|}s{{y|~|||v|}{|zzx}v{zw~rw~~{}v~|{}z|{wzw{u{xx}xv}t}vx{~}}}yx}{yys~y}y{}uxxy}|zuyr}r~}w{|t~{}wz~u|z~z|{{}~}~}x|zxsr{{zy}|||{xz~y}y}~}wz{|q{{y|}~~|{y||~tz~yz{}y}|v|n{zy~y~~~}~|x|}z|vu~x{|}tyx}{}~{y{z}x||zz}z{~~{xzs{y|{u{|t}{{wyu}x|yz~}~|}|{ww|}u|y}}|vzt}||}~~~|~{z{uq}w~{}~~}z~x~zx{u~z{yz}||}}|~}zx~~x{~~~~txzy{{~|z|{zz|~yx|z}|}wzw{||u{uz|~}uyx}wz|{tz|z}~w}}|u~}x|~}|{t{~||{z|}~u{zz}x~||}y~yv}zupu~f~~v}rw}yy|}yt|y{~zzwr|u}y}v{~|x~w~|~zsyq~|v~x|}|}}x|}~|xx{s}z{y}v|s~ov~||yw|~{|}}t{n{||y{sz|}}zut}q{|}z}qvxu|~s}p||zy}w|z~}zy~o}z|}~y{|x~{{y}u~}yl|~|}~x{z|xy|}owt{x|vw|~zp{~x}{u}{{|~~||x}~u|~{yxw{tvsyyt|{{z}y~{|}z|~ywyw{z~z||wsuxz~p|y{~~}~k}|x|vz|v{zz|vt{z}x~zu}y|wzz~~yz{xyyxglyu|~}ws}{}}|~}m|}}{z{rx{{zvz}~r|z|xwyu~wytz}}{~~}w~}}v~z|wy~}v{q}{|z{~{~xz|~y}||||~|~}z~}}rz{|~~w}{y|sy|r|}z~sz}}q|z{wrzx|z~vy{}v||}~~}{}z{y~z{|~~t}}}|{yx}}qws}}zz~}w~z|~yz}{rx{z{}}s~rz}q}y}|u{{{~~|{ypyw}|z}x|}}}z}z}s{{ty}|{||}}w||}|~vu|z|~{wzwm}{|ux}y||t~xyv~}w}y~~xz~{}{~}}}zyy~{{u{vv{~{}}{}z{~|vx{l}w~t~}}wzzv|t|z}{zy}w~|x}x}}yz~~yz{vv}quv|~z~}s{zzt{{v}zy|y}yv|zz~z~v~tzv~xz|~y}s~~sksz{uz|zz~w}z|~~{wu}~vyoy}||y~tyts}sy|{zwuz|y}zz}}~ny||~yz{}~{vy}vw{|yyz}z~|y{v{|~y~ypyvxy}{x{~uw{|x|}|~|v{|}my|~z{s}|yzw~|~}}||~zt~||y|}s{{~{~yxo~~}yz~x||v}{ztxz}~|z~{|}z{q||z}}}}x{}~}}urw|z~zvyp|vy}wy}zxy~m}|~z}{~{wvx}~}|q~}}~{{v}ruhz}~{}z{{w~oz}u|u|~zvy~q|v{y~mk{{|}zx}~~v}y{tuyzz}x}{}|y}{{|}vuw{|wyw~w~x}~|yp}~y{|o|~tz~}ypy{}}{w~x|{zy{sx}~x~}}{{~||ykyx{}wz}zw~||zw{w|pt|u}t{pxv~p~}}zwryp|y~|xuwx{|u{{}yx~||w{~vz{|yyzgxu}u~{~~{xx}yuztzx|x~urv|m|{y|tx}x||z~{u{vww{}~tuzy~uut~uyyrzz~z~|oq~wg~{wz|~x~~~}v~xw{{yz~uj|x~wy|t|~}}{u}~x}yv}{}uy{uv|ys}ev~}||zwwz~|q~~~uxz|uy}}~~~r{~|o}pny|tx|u|~|x}}|l|xzl|{x|xw}uy~}~{zwzk~q~u|svxm~~}s}wt|}|zh|~zz~tyv|y{~xy~z|z~{w{~{|~s{|}|v{~{x|~z~|u~x|w}}{}yys~{~{w}x~zt|uv|}~|vzyvzyy|x~}xw||{|~r}zy}}w{yzztz|z}}xz{~}}q}|~}|{v}r{{z}}}y~~|x}y{y}~yy}}~{y~{}~z{z~~}yw||y~{}zyny~w|}xww|v~}}|}z~{|}{}yw}yq{w~xzy{~zy|uzv}|}|yvu{z}}~|~w|u~{{vy|t||{{~}y{}ww|uy~}z{y|{~}z~{z|t}~yty~}~xz|~www~ux||{~u{|}w|{|xwzzpxzx~}~}||{y{{{}{w|t|||}zy~~y|wy~v{~~{z|zw}~x}}|{z~~{~zk{wu|~u~y~{}xw}o|~{wr}yptx~z~~~}{xu|~~|x{zy{q}x~{xx}|x}yz}}~sz|}p|}y~x}~zu|t~{~w|z}~y{w|y|zwz||u{yut{w}yy~w{~|twzot|}}uzwz|y}yx}|}r~}{zy|zvwz~~|~~x}}|l~v{~~~t}|x|v}zwuyyzuxv{d|}y~yy~~~}y{{uwyu}u~tyxp{}s{{~r~w{}{wyjsz}{y~ux{tw|}|z{}zuu~}}|}qz{zzx~yys}vvw}|~}y~~t~|twk~{{yxmzzyz{||}u}uoww|{{|{{||}o|wwxxtu|~z|{~z~yyx~}{|}|{ruix{~w~y~w~rty|yp|}}u~wu|rvzyyxzz|}sz~sxIn~xvx{s{{x}zr||y{t|zx|{ut{rx{}qy{|z{wyxz|zvz~vq~z{xygyw||}yrw}auzs~zzn{ywy{otz}uu~zv}q{mv{~s~yov}zsz~}z{zztt||}}nyv{v~v~w|mytwezvz~}~y|x~m{ypv~o~yht~w{c|{|~|u}}uy}{yu{xt|y}}yx}lsyz}y{~s{y}~Xz~zx{wqwzx|yz}rymwqzur~~~z~n|zy~mrg||}st~uwtuzxwz~yygzz|zyzxyz~nyvt{~qrzvu~ypuzxsqsyy|}{wxw~jtwws~}{{}~{y|s~wz}wt|qxxxz{~v{}~zxxx~|z|{wxyz}}{~w|zuz{y}|~{s~|w~y|x|{{t}|y}}~|}xy~w||{~ws_w|{wwv{y{}~~|z}|z~}{zx}}}r}{r{u|ywx}|~zx~y|}~z}v}|yu}{|~~}{~x}}z~x{||v{}x|~}jt|xux{z}}~}l|zzhzx{y}|{z~z}|~{}w|}|{wu}xwz~zyy}py|~y|||~z}u|}|t{x}vz}|}{ur|u~yw}{xyzxxy||~~|zxyyz}{xxy}v|yzwyyqu|~{y~zxyz{tvxvws}|zyzv|hzx|{u|~yxz{|yy}|q~x}w}}yu{w}y}|}{~{g|}w}{vvxyzywzprr{~p}{zw~~zpwx~wv{{}}|pqxu{r||wx}vb|q|xwzzwo}}y|{}w~wxvz}ub|qwruw{p_|w~{y~vxy~z~ux{r}|m|u~vzmxv|xwv~xw}x|~uu~ls}uuu|uwt}w{|t|dvv|onxovw}|yw~xw~}xty~}t|}w}zu|wo{in|}m~kazzvr|pwwyy{zwr}y}zmwy{|q~|t~y~|s}xtxm{z}zqmw}ywuq{{ywzyx~}{u}yuzc{x{{x~xq~}w~~zs{|n~s{zx~~}|}|{~xw~~vv|xw}~{w{|yv}zwgz~xzz}t~p|u{}|y|vu{rt~{y{|~|{|j~lrw~vvy~|z{s~zx}{x}~}w}qvi}v~~w~yz}}y|}|{{r}~~u}w|x~uty}|v~|~~}zp|y}~zv|{zxzzz|~{~t|~}}pp}}~||y~vzox~{u}}z}{t}zz{u{~||zyy~z}xn~y|x~~y||z~x||x|w}|~x~~xyy|{~yz~{z}{}~j{}}~v|}}}}v}~z{}}|~{yzqqy~{z~~~{~z{y|}}y}t{y~{y{}wy|z}w{||}{||v||u{{~tw{~{zx~{zsz~{zw{}yyz|{vz}u~{x}z|~x|z|f~}||~|~~}~~{|~}||~uqt|}{~|}x}w{ytj~~{~|~u{|vlyt|vy}~~{{u|t}v~}zx{r{|z|qyw}yy|z~yz~w{~{|}vzu|}twz}}}}{~x~vzpv~~}}|~w~~twz|}y{s{}vyv{rkvxy|~}~zs~~l~~x}v~|w{t{w~~{{~y}{vs||xzq~r}zv|{~t{z}|ktw}}|zyuz{}uy|zz}j|}yy|{tt~~yxw|x}v}zqyv}y|a}ts|wxq|{ry|jt~u}~qy|vwxl~~r~vx|ur|{{xrz}|}x||||~jy~nvk{v{sltz|y~yxv~vsu}~~rypz~pr}t{}ww|~yz}u~u{j}v|{|}t|{}y}xn~x}~||xv}zzzxtv~~|z|{lz{}lvxyys|wu{zi|x||~~|l{z|uv|xxu}z{}zvw~ug{z}|v|z|w{xuy}om}yzkyZs|vxyzxvv|uz~z~yufzw}}uz}yu|||zyx~{yrk||xyt}s~}x{{uxwyyuvv~vuvjnx}}vuf}y{wzs}||zxkx}zww|yyzgg{x}wytpzs|}~y|{oqxz}y{u{~}~vvzv}{s{u~szr}|zww{z~~w{yl|z}vvtxzmwwqwzzsu~w||}y~}us|yvdo}wwy}su~~v{zuo~y~|z~|~uzk[zt|rw{zw~zpzxz~sx}u}ytyq}rrwmw{z|u{wuy~j}vsvua{szq}}x{s|z{ww~k~~}~}s{~xxzp||dqzrz|sydu{rpuswzqy{}zsyzysy|j{~wv{yvy|s{|um}xs}|n{~w{}~q}zxwzu}p}zix{tp}vxu}}}ywz}yy~{utxz~vw}uw}{{||x}~zz{{x}nu|w}w}rlx}t}v}w~u{~x{}z~~{s}~t|~vr}v|rua~|py~{yxy}z|yyz{{y|x{xwz|}z{xzz~ut{yxxtz|v}u{p~zzz~tx}~}yz{{|}yrrxs~r~o}}}}zz~tr{x{{zu~zrq{yu{wit~v|~{}tvzyyzuu|{}|}y{~u{lwxu}}{|ulpw|~u}putyyz{z}v~z|{w}{|xyy}~zwzzzyz~y}}y|w}u~{|~{wj}x}}|xvvw}{~|su{x{x}v{zusyuz{{{|z}}{~y|~rv~}~w|y~z|}rxxu{{|xyyzz{}|zty{{b||~s}wuxxzypv{zv~pxv~~~~}z{z{|~ry{}|z|{~y}yz{}yz}}|wu~z}{ywy|u~|~{}}~}y~||wz}n{|v}{{s{tyy|}{||~y}x||z}{}xtr~|vq{}z~w|w{w{|}yos||{~yyyy||uu}z{uy~x|o{|{y{|{}}|~x}{v}{z~{~|zz}~~~}~r}~{|}y}{t~{ulx~z~z~zzy}zs}x{vw}}z}vv}~}~yw}|zt{z{xvz||~}|{~}}y}|x~}~|w||||}wx}|~||z~v}}~||}y|t}}|zywy|{x}{u{z}}|zznn}}{{}z{zxxouzzz}ww|{y|yx|~|||xtzzwzt{{sy|y~z}~~y{~}lx}z~p|s||}z}w}{|zw}||~z}|vo|{szxx{~}s|nyw|z{vtw|{}~{{|wzxx}{u~~{ty|wzu~zvy~}vuyy{s||||xxy|~||s|{t]z|xztvz{{v~{t{{}}|{yt|gzw}z|p}x{uzy|}{yvzv~|~x}|v{xsy{}{|v~syxw|y}z{xu{t~zvr{~yy}ly|z{{|}~~|y}|jv{~~x|{uyzu|}{hrx}||w}}|}y|u~muz{zyv{yu}~t~}z~uu{t~y}}q{mux|s{|x~|~~ww{zoq~}|z|znvx{r~sywo|ctwwi|w|}zxp}{y{zz|zutz{q~w}ynyxoyry~r}{v{w~{p{vw}{|}oxz~w~{|~}}|vp{~~v|s{{sy~w{uu~z{}|t|}~~zx|{v~wz}yv}~}{||t{ytw{z{}{~|u~{}y|z~{}p|}{{x|pt}zy}yw|}{|t}~}{z{~~xw~xs~~zz}xz~w~x}|ys}~rwz}xvz~v}y{}}w~wws}zy}|~{|u}}v}|{v~s~|}~~|~zz{u|w~z{y~pxs}~l}vws{|zyw~}x{}|~zxz{x{}|xx}v}||x{sv~v{}|||x~zs{xq{|zw~}~vv}}p}o~y}|}|zz{|w}~{{p}uz}|||~y{w|w~}u~v{|{{{z{vsyp{z{||{{{z{zx}}|wyx{{{u~{yyz|z~{x{zz~|z}~}}t~{w{~zy|z}wwzwxsz|l~~{v{{zn{vr~~w{{yx|wzvv{v~y~ux~u~||{ox}z}|w~~~r~y||{xz{}rwky}z~~|uy|}du~z~oaw}z|w|}m~yq}x{yy~{~y{~vwuyzq{q~}||xwt|y}xyyvzzl~||{wvz{y}{x|vz|{qx~}|y~~{xyxsymyux{z|q{~wpzu{~w{{~{t}}|~t|wsvz{~|yrv|~}zz{}p{zz~u{y}|z|y~xwxo~tyu{y}zr|zvy{{}z}~{z{}~rzu~{y|yxwyvwz}zyzx}}y|vzvyz~kyvyx|otzn|w|~~{}{{z|t~{}}xx|v~yv|y}x}y~~{~~xt}{|{x}h~}}{|y~||zxp}~ry{xz{n|z{x~wy}}||z|}zzwr}{xzz~{ui]xpwx}~{~zyz}z~vz}i~~x~z~{~yokx}~zxv|r{yytwxx}p{|v~w~yw~zy||~}yw}{~}zt}{y}{ytwg~y{{{xz~z}||{~rqzlz}yw}zzyy|tuw|q}uz~~~|{{{}~|}~|tq{~|zz|~t~{z|o|}~}y~u{_~}}|izusfxxyx~v~{|~u|z|yzw}z~zkzz~{~~|{zn|x{{t~y{}tsppr~r~{zk~|~xtxy}wyo|{}|rvzz}cvq~}w|}ywz|zxz}~}y{|py~w|{~}~|rsu}z|{yz|{~{|}ypzz~xx}|xx}}mzx~v|{xu{~w{xzxy|~|vu~}|kwt{hu|zq~|ur~vy}|x|{}{{u{|sxu{xzvzy}xtyw~w}tryz{w~||yw{zxoty{{w}{|}p~}j~w|xs}v}u~zxrzvwytvr{kzu|~||}yr}x~u|m|}~u~~uyxu~~zv}{{~{u}vxt|{yy{my~qy{yvu{w~~~w~~zv{x|{uxyxxx~||{}|z||y}||~|{~qxt|wz|v{|x}r}{zmy|t}whu|y}wx|tzvz~smv~|zv}vy}~{f~{~zy{r~}|{u{}wy{z~w|t~{|wy{~}x{zqqt{y}~g}~}x|}~{u|wv|yys}~|xs|wy}on|}xxv{|}}xvwx|v{ty~|}~|jvyjrnv~}o|xy}owzzzt}uy}u{{}tr}~{{x~||xw|z|~wz~~}{t{|u|z||~y}|uw{xvxxm~xp{{sz~zyz~py}~uzzvv}~x~z|zox}x|u{}}xyxqnv{}{{z{uwvyzt}|zzzl|}x|youmwywv~v~{|xwr}~y|utx}xy~s|ycrv~yuv{yvm{x~wzyxzk~x~{ynvzxqv{{v~}{||}yrswun|w]t{zyzxmku~zu~s{|xw~u|d~xx}x}y~d|}}uvr}p}ys}r~{rvxou}}|xtu{txnmrw||~v~zw{zzssptw|{uy}~|}q~u|ysr}gm{y{x{z|vy|}|z{}xu}{yzs|~|||t}~~}w}z}|}z{zyrz~}||z}{z}~~x{}~|||{|{|{~|~{wz|zy}}z|~{}{u~{}{}wz{}x|xzy~{w{}|t|zy||yy}}{t}w{}szt|}yx~xy~{|{xu~zyu~}w{u|yy||}|}}sxx|xt|x{pr|~}{y~v{v~ws|x}xz~wv~~y~}}}wx|~u~~vsy~{|}z}}|yn~tu}~yr{x}y}{{y~}||{w~|y~}~zy~x}y}|x}|~|~{{x{~|~x~vzy{ssuw~z}m}~}x|}xz|}{y~{zyvwyz{uyvyzx|~zy|l{|}w|y~{}zx~z|wz{vz{v|y|x~~uyy|{vx~e~~|}{wy~uy}{}zzt}~~ww~fw{|~~~}y{vg{~wz{}}}}}}{zr}z~}~s}{~x}z|zxx~|xry|p}o}{z~~w~|m}~{yy~|u|yzt|swwl|~~|qszz|}|wzx{zn{|vxu|||~|y|}{}}~|}x~q~z{{}}||r}||x}~~{|ywu}v}y||~{s~tu~p{~z~~}}}}|}}|~z|z~t||}}}yu|}j~xwz~z|}|~y|wq{{w{~{~z|~xz~y}~yxz~{t|~zy{||}zy||yts|y{pzw~}~zyzx|~x{x}{}v{||z{}}zs}~r|~y{s|wow}|||{{zvzz~}{yr{~zu{xzyxw|xwvy|x|x~||zy~tyt~}{uuyu}|{xqzf{}wzzz||y{|x~~w{q{z}{}t|}zxw}~wv}|uw}l}}{y{xr~}}{|{~zx~vx~~wu{sy}uwup||uyzyw|~xn|v~zx|x~|{y}}~xy{x{yxz}yus|z~}vz|wzr}{y|{|~~|tyvurz|~}}syzts~zyz{{s|vxzxxwwzw{su|}t|x{}py|~}xz|xuy~~v{{zw|}{vwyxvzw~yzs}~tp~~u|y{yzusswz|}ztx}z~ux{}~uvx|yytp}uvyzw~~uzw|{o}}y{x~||v~tyyqy}ww~}ymxzuy|rzwz|zz|zx}tzsv~tz}|{zx}~ut{~||z~yzqxw|ox|{}wrykv~z~zyl}}wzyw~xzv~~~ryt}}xy}z{~}}}x|zz~{~}zuxzzx{~z~elyttxyzvt~c{|vvtx|~{yy|}y}ux[p`~{v~gx{}z}xl{wzgyx}{uy}||{~x}p|z|~jw{{{nu|ut|}~~gyyxr}xq|zzz|{y~|j||q|}yslwpzu{{nw|v||ry{}{||}}v~~u}|xx}|z|xz|{v~y}|zx{~zv~wsqxw|y{}z{yx{q}y|{yrk{w|xzRxfyvp|Vy}p}k}v}}y}xoxy}}pox{k||yy~}{|~}{qy}}~~zvwzyyz{rz}x||sw}|||s{xzz}u||s}m~xtt}}|~u~|yw~|u~yxl|w~z}trx~w}ywoz~}~xyy{w|~{~zzzv{usrkv||{u}r{s|w|qs~z}{zzz~v~{zr|~{qyo|{v|~|{vvxu{}|nsy{|z{{zxy{|s{u}u{uwx|{}|{y}~xt}|~{|~|{zz}r|s~z}w|}ys|yzzso|}~{{zu|w}}{{xx}}qytx|{t~~~x{{zy}|}}}yx}|su{|jwz}wv~~u~w{{|y{t}vrws|{x|u{|||}vy{|}wszxzp~}|~zvixq~zovp||zv}nsw}{zwx{x|t|zx|zzys|t}xxt~uzy{xy}x{z}zv~~xwv|yxt|~||}}xpw~|~ny|~zz|}{}x{|xw{~{yy{z{zysx}fxzuxw}~vz}{{|{r|{~wz}~x~{}uzq||vw~|rhvyu|xyz{|}wstvz~}u~zmzwxx|xw{wzo~zw}{x~n}|xvvxxy}wq~{|y}vy}{wx}zx}vvvyyyw^~~py}~{~y{y}~}}yz}x{hfy~x||xru{{jxly|||x}~{{x{~zy~t|w}~xuzyzwz}rzu~v~wu||~~}g}~{|{wzuo{{{v{x}}~}{s~xyw~xw~{vtz~~z|u}z}rnvr~{g~pp~t{~}z~lzy~x{|{z{x~ouw|t|zwywr{}z{|y|xww|xyy|s|z}zu{yv}{sv}{ys}|~y|~yr|lxwxx}txz}xzz}yzz{~{z|~}z~w|}z{{~}yx|}}|{}{|~y|x~y}{}{{w{|xzpv}m}s{~y~{}{||xv|||w{u}~|yxv|yvzz|xo|y|}n}yv}twt}szz~|~xqw||{{}u{yy|vu{v{zz}sx~z|l|yzy{w}u}{t}|z}t}}yy~x}}rxy}gz}|~{|x}{uzu~x~~xz~xys}x~~~ytz~x|yrzzw|{{{|~spw{szw}}zvxtxun~{v~~xzyzzz{|zz}xx{yx{||uzvx~y|gu{{x~|~{~tv{~}stz~usw}x|v}|xz|z}{~x~|x~qv{zzy~}~v}xuz}{{||_{w||zz~yyozt}{{}y~~~zo|xyzpeu|tztvqz|x~zrv{z||d}~~xw{~~{v}}s~ywwu}zxp||}z|y{w|yvy}|yz|}{vyvmwyxvtr~w||{nx{||v{xv{~vvi|zu}{vy~|z{z~}{l~{yx}wwsvz{|zu~v||z~w~{}w{yr}urt{{w{uxvy{srs|yt}}uw|xz|yw|~s~}}wwmy|{wvyxux}zr|~zwvzzy{oq{r}uz~orr~w|~~{zzv~~~x|~g}|u|}{m~{w~{~|}u~zs{zx~xz~{ws~zv|~||{z}{~tq~sy}|zyx|v{|~{~v}}{{{{zumww|v|v~|fsxrx}y}vyyr{s|wvx}t{~zx|{ux~v~~zzv{x|~pznzsovyu|x{o~{z{u}zz||iz{{wxz~rx}z{ut}{x}{{|qryyx|~y~}vw~{{zzy{y{}||yx{n|~x|xz~|}|{vu|mxy{yzxzx{~{|~ywzy~y{w{~xz|}|m~{}|w{x~}yx|}}}|w}p~{{u|{{||xyt~~}{}~y~|}{||}s|~zy{zvxy}}w}|tvt}}||z}zt~}y||z~x~}rt~y{~sy|xv}zvxyws~~}~wuu{~s~|||||~{~~{~zuzu~y{|}}wz{z||~w}||{~|~z{{|y|uyy~zt||r{y|}z~wwzvttv~||{xzw|pu~~xwz|{}wy{{s~x~|y{}}}ywt|{}|z}ts~x{|xx|}{~}z}~w~w{yz~~zw~{~|z}}v~gywvxwroz}|v|~nzysyx|~q|}z~nr||}}yv~zszxjq}}v{|uzsxvx|syvzx}}zw{{}~xxm|tuxk}}{z|wy|~}uyzu|twq|qyz}yyzyr|}t}xxz{}~yxvz{~{xy}w}zyw|su~_xkwsv{wx}{wm{|}z~r|ztvf|}y{}||st~alwo}k~u{}zjwuzzooxth}}yzx~{{z|lsyxvmt}z{{uw~~{zvy}uu{mq|y{~rot}~ztxz||yc}{mpy~s}}|qp|{o|||auzy||{}zzz~s{szzzlzw}|~t{vvwzyovxuxw{qxy~y|~}w}u}~|{}xw~}z{s{yv~{{mzv||~y|r||r|x}}x~}}{~m}|{~}zz~zty~|~{s~vzwwzyt}|}{{{~}|zsy{m~z{w~}x}||w~u}{}~~{|{|{zt}{t}|vz|}{|x~|~{rw~~~y~|~|{y~~{|z}{}z|}zy|}z~yxsz~}y}~u~}{|u{{yzut|}ztx~{}}xuz~}}~||}~~}~}z~w~x}q|~x~yq{y{}}||}~zyv}~y}}xx|z{yl{rv}z||r}{{~u~}}yv}{{{u~}||}w~xww|z~n~z{~}}uw|}y}}m}~u{~}~vpz{zzzzvwzq}x}{}~vuzyy}{||}}}zz}z|x||yy|z~|{||ywmx}~{z{~~~}q~|k}wq{~z|x~u}z~w}x~wv~z}~{xry~o|uxt|~~ts|yx~}t{zz|{kz~}t~{z|r|yz{~yu{}|x{x}{{{yxy|w||yy{|svut{uszuw}y}w|~y~y|yz~}t~twv}w{~{|zwzyw|}yz{~~~xx~~~}~~{{zyv}zr{rx}x~x|}zs}|~zpz~|~}}~~yxq}uz~rz~{w|xz}}v|v}z}|{}{zyv|{|~{}~~y~}sxw{{~{xz|v}yy{}~{yx{zyuy{}|~||}zru|}}y{}x}||}{znyyyr{||}|w~y}x}yz|yy}~z}|xv}t{xzu|qzy}xz{}x}{|y}xusy}}}y|xv}z|~}{~|y{{x|{zl~|yvxv{y{}|xyh~|x{{{z{w{~y|}}{su}z}}~~|~|~}yts~w{xt}~~}y|w|}{~{xw||yzz{zv}xyyq}~{s~|}||{}~}{sw|w|z{~yz}xys~w}~y{|}}|}r}}~z|zz|{{}|{}o|zsz}~{{x{qwtyyz{}v}~{X}{~~~{zy~}~zzzz|wxz~}znnvpu}|}v~}{~}z~~yz|y|~}y}|sw}y|{~z|x|z{v{usvq|l}|tvzirtz|x|vxs||}~}|zxx}xvg|zz~z|~qty|ys~z{|y~{z~}}~y}v}y}}vwy}{z~zvp{~y~zmimx|||v~r{vx|wtzzy|}|xzx|p~qyzy|||i}{~yuxyz{{}|sxz~}uyv~|{}r~xpsp}}wt|uvzs|y}|{zxxv}~xr|{yzz~z}ygmrwq||{zizwytz|sz}x{~w~w}~xi{njz{wy{{~}rvtp}||rw|tix|ysq|~~~~yw{hxvzl|zqz|zl|wu{xow~~}oyw}u{~|t|zz~}r{|{~sxzx}~{{|{mzx{ut{yxz}|z~r~ry}~~|}yv||{www|~m{x{xzz|zl}w|yy|w~|~}i|~zy}~zqxm|{zx}y~tzt{v|qz~}ow{}yz}}|~zu~~yyuwvuu||{}y{|z~|}zrzzlwy~}tw|~z}w~ptty~~s{y}on}|yx}{y}swxwepw}}}q{{}~l|{{zy}}t|}{}~|~zq{{n}~|vz~}~}}{x|xvy{{z~{|{|{~x|w~|yuz{|z~~zyr|~}~{}~||}}yyz}~}~~~~z|z|{t|~}wx}wy{{|y|y{{w|x~|~{|}~z{~{|~{z{yz}{}v}~|~y{v{yvs}{{~}v}z|}x{wzyv~}{~}}|swz|{t}wx{u~{|~u~{{~}|}ryy}}{{{}zy}y~w}}s}}zx|{|{}w|{yzz|}~|y}{}v}n|t~{v~~~ywk~z}xwz{|qv}|y|}~}u}{|tz~t}{z}~y{x||{|y||~zx{rz|vwu~{||}o~yuy|wvz{sr|g|zv}w~t}|qz||~y{{nt}yzx}}~s|z{|}{~}x{swzzo{uxyz|u{s}vr}{yx}v|zoy}~|zzu}y|tvw}{~yo|r{{xx|w{}s~z{y~~{|~w~x{uz~yx}|xs~|z~x}v}x|v}yq~v}|w{}y}tvr|~z{|~wv~|zz~w|t|}|zy|}}yv|uz~{}uy}ww~su|{ywy}~}~v|y{}xyx~}|~r~~~~}u~}p{vm}|y|{~wx{z~{}z|~|t~|{|wyvy}x}~s{x|}z{|n~|||yuzv|~uwx~|xwv||{xpx}~{|{z||{{~~|{yrxx{xw|{|z{}v|t~p{z~rxxv}~{{|i{qz~uy|oqv}zx}|vt}z~}}x~~~}o}w|yyx}xvwyy|xx~|vwt~xy}~}}z~}}}xz}|~w}{}}|||zy{{y|||~}s{y|v|~z||x{sy}x}{w|~}}~}suxwr|l}q{}xw~|}{}yq{{y{}}tvz~xzsy}y}xv{||~|||~||wy{}}w~||{y||o|{z}yyu|lv}}pi}|yy|{~z}x{}y{}|ywqzy|{~|tx}y~wpoxsw}zyyyz~{{|xxy|yz~zxmwzx}{|wryt~}t|}zt~}{{|~{|hyxqyyx|y{}r|s}zlw{wyzu{v{z~zz||}|~xw~{{y|~|~sopxuvtzst}~~{}x{y{|~}w}yxuu||}~{}{s~zwsv{|rn{}zx{~t{k~zu~}z~|z~}|xv{uxxy|z~}}v}{w{{y}~y{~~||}zy{~u|ylg{zx}yv|rx|{w~|my}x{r{|y~tz{tw{y{|~pyyr}|yv}vx~}{|~|syvyzw{t~~s{}uy~~z}~{yyzuz}~{}{~}rin}}u~~~}|zt}z}|{x|ur|~||zlzyxx}y}}s{v|z|yvzwz~~|{v~|}o|{~|wz{k~srk|zx{x}uz|p|ryz}}{}~z}{xv|~xuto{t|~us~~g{v||~u}}~z~xwzxy{orx{{~~}z{z|vvszpv~y}x}zz{{uz~q}{p~szd{|ypx{r~~y|~}}y~{u{{{|y|zxypk}x{~|}}wz|~wgkfyyv}~|x~gzz{v}}x~|tyz}y||{~y~{~|{p}v}}}ux}|}z~{zv~p}|ty{p}{{~}x~}i~yy{}}x|}|~l}r|}}zx~}zw|`}xy|qur|}y}yv~z{|vyys|~w{}us~|yz|}z~}w}w||~x}rvz{|~~z~z|{vsyqnzxe|x{}yy~~t|y~~}|uzr}u|z{~y}{{vv~}|}x~tyxz||{||~~u{}v|yy~|~{{wv}w{~{x}}y~u|y|~~uy|xy~{tz~{u|j~vn}q}zzzy}}}jqvzwx||x{}|u|y|||{~s|z~{h|y{~}{yzxrs~wx{{yy|~{y}{}}}y}on~}sfz~~|{u|xtz~v}{yyyttzw}{w}}}||n|y{~~vw{|{{}x~yzzz~}z}sxxt{xyy|zy~~uz~|{vzu{{}~xpy}{{}yw}}v`~}{|}}w{zvu}{|x~wz{~{}}{~~}{vst{|}zwyy{uxw}y|{}v}}|}vtx}}}zt{{~zy~|||~{{vzzzz}|zx}}||x}}zwwr|zyx||~}yx}y{w||qq{z|~}oz|{u~{}~{w{z|||z{|~}||~xz~~~|z}||{|xwz|yu{|x}|xy|~|{~|~{zq||}~z}zzt}~z{z|}}yxvsy}zt|}{s{v~||{w|ur}|zyw~|~{{vxz}~~|}rz||}twy}zy}~~||{z}uyxwz{y{yw}y|||y}zs~s~|~~}z||{|~}{|w|s|~{v~||}|t}z|q~|s~y}|~}|zzy|}|~v}}{~|{}|yw|s~}~x|{x~~w|}{y~~ywz{}}wy||}zq~yu}}|~zu}xwxzzz}w||{}x~|{|{}x{{|~~~uz|{v}{}}}zz{~~}wsu~{|xw|}}x}}~zzw}|}|}||~~ywzz|{z~y}}zw|~}y|{z{v|zwy{~}||}~xw}{sz|x}x~y|~}}{z{{yyyyzoxx~zxz}|}~y{~z~stwuxzx{v~yx~{}zywz}zz~}{yzw}~xx~{{{r{|{yz|x{~z}{tyy||x}}~}y{{wx}y{|uy}z~s|z~|pu}~yr~~y}y||~||y{wz|}zv{xwwuy|z|~|}v|~~{z}w|~~{v||x}{r}}{}zwt{x}|}y}|}z~wnz}{|z|w{xv~~~wu{|sv|~{z}w{~|vxz~~szxz}rs}z|}{}yt|w}{tuu|}uy|zzuuzz|~u~{|{}y}v{{xq~wzz~y|w{~x}{xzx{}~{r}|sy{y|{|xt}zw~~p|}}|{x~}|}tz{}{}~~|yy||y|}xsz|xww}{zy~{pst~}y~z||z}{{z}ur{|{}z{{n|}{{}~}xztz{}vzz~|syzs{~s}|n|{~uyyw~zzyzv|}}{z|xyvwu}u}p}z{{z}yxz|{z}v{~u}~zx{uw{{}x}|~|y~{{l||w}||yz{z}z|~w{}}{}z~|yz{x}wx|{z~~~tx}ysw{w}|z|||vywzz|}uyu}r|z~}u~rl{v|zv}~~ry~t~x|yw{~zmyx{zx~~}xzzyyv~mv}~{|~dq|}}}z~{||{xqyzuwuzz}y|uz~}wy~~urz{yw{|~{w{vuyyjxwxywy}~~{}}~x{w{}}y~}}{~~{zw~txzv~||x{v{}z{kzr}{stc~z}v|zx|{|ozw~sx}vyy|uv{~r~}~vxz{~w}yqvi|vq|w{|yr~y{yr{|z~wy}v|y}{|~qxy{x{z}}y|}wx{ym|{~{yvw{{|~}{{wz{~l|}zuw|{xs}{||nzxu{y{~}y{yr{~zvz||}y{~}}suyz~uv}}}zyw|~|}y|vz{|vz~yuz~wy}}}~|y{z}w}|q|{w|{}y}~z~xy{}zzw}}o|~x|w}z}|~yy|{z}{{y}}v|}z}~uw|~u~~|z{{|~zu{{w~}yr~yy|}}}wxu}y|{zx{u|x|{~zu{y}|yv}}z|~}o~|~x|t|}x~~}|~|}x~|v||z}{~}rut}y~wz~y}~z}}|}z~y|zw~|}{|~zz}zyy{|}y~|x|xyt{zy}yw|tyxxwxyv|x}u}z}}xwz~{y|ut{|yuzxz{~{~{|{~}wxv}~}|~{{~wywzwy}z}|ys~zuz~}{yz~{y}zw|z}w{|~xprwu}}xw|y|u~s~|zzz}{}{|~{{xvv}uuz|}}}zyt}xw~~}|z|yu~}~xv{~{yuxxy|}~z}z~{x}xw{zqx~y~{yrww}{uyq{rv}mz{{~{}|xy}yuvr~wzryx|z}}~~zy}~xwy}~~|xmwz~y|z|~x}~|q}}|zrz~|yfyx~v{|{wxzzr}v~{|{{|x|yv{{~sysuww}uyzz|}ys~|{ws~~~x~|w~}t|z}|~yzvw{~u}}}z~|~|zq{~z{~~~}{tz}~~s|}}u{w~|x}|{~}~x~{tzzvztwxzzyw{}zx~~w~~o~|uz|{y{xv{zzzv~}~~u~rx{}xxv|v~yywy~~z~txyzxzfz~|~|~}z~}|}nz~zyzwyyotz}{}x}~yk|}z}|yu~|}~~w||v}zy|z~y~xzvy{x|~|}|x}t|}}z}l{}u|}vzw|{w{zz}{zz|{vzw~{c{z|p||x{~}y}yz}z{{}~|}tx~ts{z}}|q{y}t{zr|p}||v{z|}|y{|}|{}}~{}w~utzzwz{~|v{m}~y{yt}}|{}z|wnyv~zx~xzyx{|y}}}~|v}{zxy|{w{w{yq{yzx{w|wyv}||}}~~}y~{t}zv}}}~x~{}~~|~rx{t~~~}~xyu~}vy|z~|uy||}t}{yyx}||x~}x|}}utp}|{zu}u~uuz~{|tm~|vu|x|||}|w{oyyy~{ytxuv}|ww|vwo|xw~i{ra{{wy|zn}rzzw}z~vs~yzuyqvw~|}sx|}|{wxvu}{w|w}z|}x{h{{|xx}}x||u{t{}|w|zwv{m~}~vyp|~yvkx|x||~|`n}v{u~xG|~s}x{zw~~~}x{s}ys|~}{r}Vr}z|{ywv~yz~~||}zwsu|z~{y{t~g}xz{mz}~~|~{}~ww}kv{wywyysc{{}pz|{}zr|zyso~{gmo}qtyuw{su{{zyyz~}{{q{zwx}pxm{tvyw~zt{tw{v~st~s|}vt}tpyx{{}xi~y{}y}}tr~~m~Rzxu}v}y}}r|{ulqy|py~|x||ox~}||{|tu~zy{ur|vz}~vxsvnw}x~~z{|}}~~{{|x}~}}yy~~~~x~{}~qyk{~~xx|~}vr{xz|zy}}y{t|}{~x~|}|zzow|y~z~x}|y|}}~~{|xs|wv}u|}u~zzvszv~|v}x}~|{~}s|{|}usx{{~r|wyt}~zpnx|xyz|wy{vv||}ys}~u|}zy}{|o}}{x|zv|}x~|}~y~r|y}{t}|y|y{w~|zv|{ux|s|}~yx{{yx|yxw}uyy~zyxw}}v~v|{|u{|xzu{~w|}xz||~rx|{wx}{~v|}wy|r}|~w~}xtz~v||~|~~|o|wx}xxvxy}x}{v{~~x~y{tovv~kstzwyu~|ynzzzr}~v}~~{wk~{wyvw|xk~r{u|}~}~{uv{{hwwy~yux~t~q{x~v{~x}x~|vx{zwz~}~tzu|zrrys|{uzz||wz~rvu~}tyo|v}yz||~vl}yvu}}{|t}ttzy|y{{qyvww}}{~wugr}|x~x{m}a~zay|~zxv~||ssyu|~vzs{}|wtlv~y}}|ztvw|}soms~y}~y~u~xsvtywtwxvv}~z|dz~z~~|~}~|}y{{yu||n}{{~u|uqz{u|w}~~x}yy|{zr~{xz}ujy|u{iyy|uy{vt}uymu~sy}~ur}x{yuu|z{|{{ytyyuwyWx||}yyzx|z}yzx|wy{v}|zz|xrw}qz}ys}~|vy|}z}~|~yz~~|wz~~|yx|v~xxuzr|x||{{|~{~}|||}|y}z}|}zu|zz{~{x~z{|~ywv{}zx{ovw}}x}v|}}}{{{~vx{x}}v~~xy~~}|~}}v|z|}uztyy~~yw~}zy}wzxw~v|{{y}{}{~~~y}|o{~zv|y{|~wuzo~{~~y}z~v~yxxz~z}}z~|}{z}x|y}{}{y~{y~s||}t{||~~wz{~z~pvpzw||y}y~~vzw~x~q}w}}uzw~|{|~w~~{~yx|v{|||}w}y{z||z~~y}~~}{~}zxzz{}u~xsvxty|wx~}}~}t{ywoxnx~~|{s~x}zuy{tz{}}yx|{z~|z}}{y{~x}{}}~vt}uyz|~y}zy}~v|wz|s}pv{}s|}z}~|x~}t~{~z~~x}y{{}{}vz~~tv{~y}z}{zv|}vyr{x}vyx|~}|y{o|ztw|yn{|{z{{~~x|x}}w}~wso{|y|}y}wqvsx{{{x{ur|gztyu}}m}}}~}y~y~w||~{js{~|}~}vaw}}zx||x~{}zupz}}~|t~ywx{z{|{|}|x~x}}y||}}ww}{yx}hzxxz}z|u{z~xw|y}z|km~yv|y~~w|ux|}||{y|ztyz}z}}~{||~~|x}u}v}~}tt||{wzv{rx}z~~|~wwxtz~}}y{v{{v}~}|zzr{{yz~y}y}z~~y|{}zsx{~~{z{wy}~}oy{yx~{z~o{w|}}~xwv||}~~zs}}yyssv~{wyx~{}}|z}|{t}}|zx{}~y}p}wrz{{z~wzt|}q~}{||{|vk|||xzu~z|}}||v}|y}x{w|yxz{|z|{{zt||yz{~{{}}oz}ry~u~~txwz|wz|zyt}{~yr|~~}{}z~zv|w|yv~~}x~z|{{~zs~|vy}|tx~~|~{ry}}~v}yxzt|zr|zyuw~}|xzvzz~{x{x~y|~v~xt~{}z{ys~{sz~zy|{t~~{xwu}wyv~~|~zz}t~{}zyxzxvs~{zlyzz}x|||{|vu|yyy{~y}{{z|||p~zv{u|~|~~|~y}{zyxy{u}x}~{}|y{~~}|{w||wv}qzxux~s~{z|zr|~}{u|y{}{y{~x}{{uzu}~jy~y}~|{ywqz~vy{}yyy{}~p|}}nv~}y|u~z{yxz|{}x~~zy}}~uwz{w|zsy~x}z}y{}{vz|u|{{yu}z}~tt{xp{~wt{{{q{}w}yuyww|z|zw~~}~sx|||}~xz|}~|}}}|~yqu}zm~{~zy~z{ss}}y}v~zw|v|n{}vwzv{{~x{z~}~uszxy{{|z~}rt}|t}|qyr|w{xyxyv~w|x}v{}}}jxxv|oyyxzz|tt}zvu}~}{t}|tw}{}{{zn~~x{ywtz~{}|zrxw~{{w{{z~~|z{|vzv}|z~xv}xv~wwzs|~~z{~t{vy}vy}|~}zyzvv{{}x}~}{~w{}{xt}}z{~|y~v}zt{ywzr}~{|zv}}~y~}tv{~||z}}{x}x{||{~zvyz||zz|{z}z~x}xv{}{|vtxs}~~~z{~ytzw|}zy~v|{~zzxw}v|y}}{}{~~~xxzxx}~|zxxj{|r~ywr}y|x|yzz{}{xx{x}w{zyy{{|~zzoz|u~q|~xyz~y{}}|t{{z||x~y{}~z}z|~u{x|txxtzzvx}~||||y}~{{x|tszyx~y~}y{st~{zzx}}{|}}m}txu|t~n~sy{~~{xy|}y~u|}zy}t~xz|}~{~zxv{ru|}~}}~}x}|z{{{~{y}vwz~w|}|{zvy}~~y{xk{{~}w}zr|~u|x|~z~zy|y}}|yz}z{y~{zwo|~|y|~t}p}|{y}r~{~nxx|}x}y{y||xz{{xx|}|}}|}~y~n}v~}zyju}z}|x~wzwy{{}}xw|wl}~w|x}~||x}~yy~z{}zw~sw{~||q{yyzw|~{}w|}zyx}n~}w~{|yvz|y~x~|z|z~x|r}y}~su~~||u~zy}x|~yz{x|||zzu~ytxw}~q~{{{|x{x}|z{}xrqw}wz{}{|}~}ny|~}|szz~}}||~|~||vz~x}yzv~}r{xd~x{yw~}y|}~||{wz|w~t|~}{hy{y~z{vz}x~z|zyv|zy}~zx~}||yy{~y|zyz}}t|~}}ypx}|}}z}}tyxu|~uzw{|yw|zw{wz~~{u}{w~|~{w~u{u{yzw|x~y~y}}z~~~}|xw|{|x{{~yw~ztwy~{|~||vz|xy{||wx}||w|~s}}zw~z{wzz||v|}z}{~z{wv{y}ymv|yz}}z~|yvyw}{{{uyy}}||zpx}}}xy||yxyy|rvv{~}v|{|{}s{~{v||y{xz}|uy|{mxzv~v|w{y|vz|xz|{{y~}|wyz{||}}}z}txww|{yy{{{x{|}xup{}v}{x{v}}~zyx|{~{}uwy}|||~qs{}y{v~}zv}{v~}v{|~}}{{zzxzu|vux}}ry~~y}}{~{~~~|}v}{v~~}|~{z}|{}yv~sx}|y|}lZ|kzy{~}w~z~}z{{}s~t{{vyw~{v~z~y~|}sx|}~|x~}y|l|}{zvu|{|~zz}}wwu|m|y~y|}~z~}}{tx|y|~~~~~u|xx{vwy|\v}u}x|{|xv~|w~{{{|~qyryou{}~y~yy~yyyx}{s{~z|||}{~z|s{w{i}~}z{{~|~}w|~|~}w~rwzw}y~z}u{{t{zqy{}|}|}y{hv|z~}s{z|}}|zy}~||s{|{|yz~}{~}}|~xs~{ru|}||v~{rvm~||{u|z}t|}}}{oux{zxwzv{~j{zyy|txzz}p{wz|~zxz{||w{~{}||{y|~zxx~yv~qywowwrzynz~{}|oz{xmru~v}zzp{z}{|u{}zx|}~~{vzx{}xn}~y{ur~xyx|}}~z~|~}}}|qyvw{qn}y}|{y}q}{y~~{~w|zm}v}~wzyw|}}{}wpx~tswv~{vzo{~v{v}~|x~wz}yx{}{~sxzzy|ww}{wu~}~{xz{o}}|n|~~{~~vq|~}xs|wwz{w}x~vv{|mz{{~}z|vwy}twoy}yxuz~~|~}w~vuwy~}|}uisx~yxzzy{~~y{}y~||zwy~|}u~w{|x}y{u}z|vwum~}}uyzzot|}y{x}z~}xto}}|ywy}u|{xv}~u|}y~qy~vw|{z|||w{z}}}z}w}vx{yx{}|~}|uzyx|z~zy~tqy}|~|~y|t~yvz}o{|{srx~xwz||w~|y|~~~u|{}~}~xyz~{}sz~~x}tx|zz~~|}hzuvu{y}xyyx|z|zyyo|}rwz{xyzxptsn|uwx{yz~z|{zw{t{}~{x}xw}wx}{}x}x~~w{x{}}{y~{zx~z~~z}zu|yx~{j{||vz|}{oz|zx~z|{}~~z}yt~~{{|vxx|z}}q|~}{sz|~q~wt~xzwyy}ywyyxyz~|{{y~yz{rwx|z|xxzzx}}x~{zzr}|||tyszxr~{xvy|}yz{w{~q}{|v}yxv{|{z}v~x~}}x|rl}~uzw{~xv{}sy}|~}z~s~}}{{wzv}{u{z~e~~t|z}}zzw~}v}{uxrw}~zw|}x}~~|{x~~|}z~}~}}xxt~z~|q}|w}~xzv||uwxr|~y}{u{}}zt|}s{yv|zxv}y~zzz}y~zzs|{}z}~{|y|||}|{~w|{x~uy||{~zy|z}z{{zvzx|zxy|{z~yw}zry{rxywwxwz{~~wwxxw}v|xzu~zx}{qu}{x~z~}{~{{}~wt{}{vs~{}g|{}ys{|}}|}}}}}szzv}}w}z{{~~~xv{yyw|y{{xynwy|~}}{vt~{xz|xx}}~|{x}y~y}z~}zzx}zjv~yzu}zy{wyx~}xy}{zuy}vx~|ww}~vwmyv~q}z}{{|x{w|y~wy~|x}{}|}~|yz{~zz~~xw}{v}v|}w}x~{~}z{~}~|}}m{}{r}{z~}~~~y|zzypx|z~{v{|xyur~}{}}~w|{py~xxsx~x}y{~w~~{|}s|zzxw|}{{ywzs|}s|{x{yzz|tzz}z}}wv{zm|~|z{{z|{~u}~}xw{s}~~t{}zz|{{l~ozyzzxyz{}s|z~~w{x~zy{~}}yuw{yvy~||~~zxy{{||t}|}}{|vxwu{|o|v}}~{w~z{zu{{z|~x{|~~x~z|y|}vzw}vv}w{yyz~z}~||{~{}|n~z}vu~xux|yw~z~zz||z~z|}|xvx{wz{zx{zr{}ww}|~~tyyzy{{}rzxz|~{}u}wx|}|y{}}}}w~}n{w~u}{{y|~n~~zy}{zrv|zz}qzqy}|vz|z~z|{{|s~v{y|uyvtx~~}z|w|v}~{~{|yyz{}|}yrxzy}~}sw}x|~}y{y{{|s~z|{|z{x{|}z}}tybx|t~}{~~z{xx~~{~}||}{t|{tu|vy~~}ymzzr{~{{}yusp}}}yz{~}mv{|{oj}z~zzw~~yz}~~|z~zz|~z}~uwr}~zz{y{x}|}}~|~y~z|}{y|}{|xx}|}|w}|}y|w}~x||~x|vz~}}~|}uz|}}~}{}z~yx|~|{}}{{|z~z{zy{yt~~{{s}~~v{|{{~yz~|uy~us{z{}zx{y~~|yy{z~rz~|||~xu}{xz}yz~{}|v~w}uzz|yv~wzw{v}}z}|yz}~zx~~y{||tx{v{x|yz|p{rshwyu~|z{~|y~}wy{{}|}~}z{~|wzx}vtu|{xx~}}y|yzw~~{y~~y}}z}}}~wy|pvw{|sz|}{w|{}jvu}u|xwxuz|}}x}}{vz|w}x}v}xxyv~}}}m{}{w|}{{vyzy~{u~qz{}w{~uyz}|u}{z}~{|w}wv|~u~~{~{w}||}~|~}~|||xz|}z{}{x{{{{tr}|x}}|u}|~ywq{{tq~}y|s|}~|{}{y~|~|}vu}xy}{jx}|u{w{|w~}~|w~~|y~zr}svyv||~z~u~}}|yuv}{|z{~|yz|y~z~pw}x|xwux|z{{owy~yz{{~w|~t~~z}}|w{t|~~|uz~~}w{}rv}}{}x}|~}{z||}y|}}{}xz{ux}|x{}x}qzp{q}wy~}y{{{ulqv}{{}t~txpv{uumzuu|}||uzs}u||{}|y|~}}ty|{{o~t}wtx{sv~wyzi}yy~t|{rzy~~|z}vsq{yt{w}x~~}|u~~~}|zy~nyyypyzu|~{z{z{zv~|yur{q~x|z}~~qxyyzyxxv~xz{z~y|z~~x|y~}|~sx|nx}~|w|}}w{w|~|{|yzzx|}v|{y{yw{{}~lz~|{}}v|~}x|u|v{{|zz{~w}yx}yz}{}v~pz|~xzr~}z}{{zu}ty|zv}z~y~}~x}~|~y|zy~q~uu|vx{|}xy~}z}y}z|{tx}w~~{zp~z{yssx~w}zo~|z~}{u{|yo~zxw~|}yvy~||zy|w|{{s~qyz~}}|zxy}r~}}|v~m}{|t{zzmy{x}|xy|wz{zyy|wy}{v~z~}{}{}u{}yy|vzt|zyz~~}tz}~}{}}}|~z}wy{z|uy{wuwzzz|yxsv}z{w}oy{~}z}|yyzky|y{~~~~yt~r}zy}|}}y~}}x}oyu}u{~}||~|w}{}z{vzx||~yyy}~{vozyxxz|z{{z|}{y}yr{z}~xxv}~}{yy{yt{{|wz~}|}xx|||{}}~~{|z~|wzvwx}zyz~y{|{}}yx{~v}z|w|~{~t||}~wxq{z~o|xxvs}s{yy|{|~xz|}}~}~w{}|}}zp}{w~|}}}}z}zsvt{}}}|q|x}q}~v}}}{z~{z{~}y|}||v}~~{}||w}x}|{xv|z|wz{y|{yp}~|~{}usvz|~|~zwz{{wx|x|z~zzy}|vv}|o|z~zy|zx|x~|zuepus|vs{z{x|y|q~luyc}}|os~wzr|u|vw~wvv~~psvw{xwzxx|}yzuv}}{|imz}}|}v|{q~wmsxxwyys~{|Wqz|zvuv~v|{{s|~~zvpmz}yx|}s}~p}uzp~wn}m|wss}}|~}wrzy{|m}}v~{gt~|zy{-|}yzm~x|uwxasky}s}zowwxzu{wk|wv~{y||quzxzozh~yL~}|w{m?qrztxwvtywwo~w~|w{x~}zy}xrqlv|{~~y{~sy~y}ngnpoqzx}p}ylw}~fw~~{yyw|u}y{}|sz{{vnyw~wpnz||di|low||vz~zb~|}uwq}v|~{g|y{yz~ysv}z[syzs||yvz}|z}ruw}{~z|~x~}uzy}yzyx{xs}~~~y}u||{vu}t|{yw~}{~}l|~}{}~v{z|t|wp{x}}}vzt{t}f|ty{nxu{~x|v~lv~qwwy}xyxnx}zy~|zy{|}|v|qxuszs~z~v}|{l|}}}}yu||z|{}||{w}zz~u|{z{xyzy{|~u{zvyyxyz}~zx|}~v}}|vz|vy{|{}yyy~{y{}|~wz|zr|~|xyx|wy~u{}|~w{~{|}m|s}zyt~{}~|wyz||}~xzy|}uxzyty~}~~}r}y}|wqyuzzvv}~}}yvzsxv{~~z|rf|zvq||xz}vxw~~wzu}ruh~}w}iuxx{|}{|tw}~y}|u|q{x||{{{|w|~|w~s|z~~{~x~|z|{yx}}~xx}}qz|}vpgtt|xr~}||t|dy{|{s{wzyx|v{~~~r~xz{|{}ryy|su{{|}~}z|{}sxuww}}|y}~{|x~|~z}|wq}{yxz{}}|z}zx|q}|y|}~~|zxyzu~zy|kszuruxr}{~|r~xuzw~{}oyw{}~~z{~xz|~|~|zvxt}}{{w~{yty~sy~|w}~x}yx||z}~}|}~tv~{y}}~x~w|~sv~||o}}~ztz||yyzv|xyszz{oz}x~{|z~zy|w{|x{|xwr~{{{{}|zhu}ww}z}~|}}{yxzy~~px}~}u{sv}}p|z{w~zh~|{y{~}zx~|}t}zq~}xz|~~{r}ysxw}ly|ywxu{}|x~wxtx||s~r|}pwv}_x|{}xw{z{u{~z|~xvz}vz}pqvxzsyvz{zuyz}~p||tt~v||{p~zz{~Zsu{~~~h}uq}x{{u~|~m|~{r}w||vjx~oqw}}{ux}l~z{{}{|zzw{ve|m~{{~x~x}||~q|}|~|w~{yy}~x~v~|u}}s}udxz|}~wx{{s|ynyz~uw|}rhq~uiz|yt{ymrv|w~by|~yo~zsmuww~}w|v{~vz{nw{{jx||y|vyy~{x~wxwvxz}z}r{|n~}y}e}urxz}}v{ux|zz}}zz~ztz|~vv{{y~tv{s~~|{}y~~tzx{x{~{w|r~~{z{{}yy}zy|~w~u}r|wv|~}uvzt{zxt|xux~vwzw}~~v~}~}{}z~|z~xz~w{~{~z}{tv~zu~z{}}y|y~{z}}}{lyz}zy{~wx~{t}x|v|~y~z~yz~xzx|zyz{x~{}}}}w~}}~~~zx}{|zy|~|zy|~yzx~s}z|}xs{wsy~xwv|~{~}||zs~zyv|wy}~|xu~y|x|zy}}~zw|xtzwqy}~}}}vs}yx{z~|~t}zv{ywp~x{~upi|z|z|v~{{}v{{x~zu}~{|zk~xy{|}~|~~w~}}y}lvxz}{yz}z~{sy{|}}||{{{|}~sxzzwxw{}|xzulqPtzyvzvyz}szz||{tvszz}xts{v}vxtuwy}zz|z}qzzy}|yzw|zx{}w~zw}e|zp{z{|{qy|{srx}~x{|p{wxv}{{|{tq{wux~{||t~y}tu|y~xzyyjmu}yzs|z~~r~~}yvv~y~{ujr}|w|}|zozvi}sq~{y}zxyvs~|xxyo|vxy{|~~s~{|{}{~z~zw}yltxv|vqT~xwp~~|{zu|x}vxtuu||{~q~~qx}yy~{x{z~~zzr}su|pwzsv}x{|yf{{{}~|}but{w|ymuwvqjzzzyw~ovz}u~~|}yxsyxq~{o{~|}w~m~}~wk|zvyzsz{~xlu|v|x{vxwz}z{y}{~||{vn{z}zsy~|u}|||u{}}|{~y}y{yzmyztn|{guy{}~x{y~wvyx~v|wzxxm~||ny~~}yx~{{oqsyx|r|s}~}~|z}u}}}}zu}t{~|~x}~tv}}y|wy|zwy{u}{}{y]s|{xzN|ts|r}xxur~v~w{z~{||txzzt~x~u}uo~z}~{}|~y|||z}vvu|n|w{lspr}v~~}{{}~{|v}vw}yvz}zwuy}}yw{{kyuytu|uveouzxwyws{j~wwyz~y~|~|zzy}uo|x|{yr{{{~ywtp{||]p|}|xz~}z|{tw}|}~{}q|~z|h~vxozzryerxtxw|u|x}y{|w{w{{|wv{s}~zw}~}|xx~|w}~~y|~|{|}zxzy|xq{|n|z}|zu{{y{~vtw~yz|yy{vtw}~y{}}~t{{{~|xv|wz}~z}syw}vx{s|~}zx|}w}{||~{}}w|{y|z}|x~z~}{{|v|v|}~||yz|u~|}v}xz|~w{yyz}y}wws|~}yx{~~~~||{}xp}z~wy~~xxyyx~~s|v|x|w}xyw~{w~q{{zy|}s|~x~~zwp~x~}zn{xx}|v}||~sxzxtz~|~{~}~|{}z}uq}||~x{y}|v}wvx|}}|}~x}~~y~x~}~wx}v{xr~sy{}~||w|xyt|yxtvzz~r}{{{z|yt~{zyv{|{|hsv{}u}t~xv~r|~v}}wvyy|y~yty{w}|}|{}y}}yz~~p~~}vyds{}x{vq{~w}{}~}wqm~u{|~~{~|x}}~}yw{}{~{~w|v|~u|z~www|}z}o||~xv}~~x|ltyv}s}|~y|{{zz|}~}}|u{yz~y{wxzy~}s}|||y{u~z~{uzz}}|~}}v}~txx~|tyy}|o|~xz{wz}}}yz|}}w~{{s|}~kyw|xvx|uy|rv|}v}z|{zx|}t{~|nq{~~yy|}~}n}um||~w{y|z{s{xsyy~m~r{|zs}kw}cq~|o|}yy~|}sq{~p{pzwrv{{sswv~|vszz}{}{uznyww}~~|{{~{{|}w|~vw}}tt|~|zx|x{}}}|~yxw|~~tu}vx~}zv|~zx{|}}~~{{~y{z~r||}|y~ym{wy|s~~{{}~tz}t}yz|yw}yyssrxztw|x~ztu}~v~xrv||}~sq{|r~}ytz{{|}~w{~|}|z}~yqw{t}}}zr|{~}mwuwx~|~}~~~znyxzz~{x~zspm~t~}vx~w{z|zzzx|~}yt~{zqyvq|}|w~w{uwz|v}||u{|s}zx~}}w{y{}|~~}ycu{z~~zwx{x|~~|~y}~||z|yzxwzwyxvz}{}{y}rzwyz}|ws|}~}|{syzwz|~wnu|z}z~|~~{}y~o~}yw|~}~~|{~~vy{{z|zuxy~wz|{~xz|xyz~}y{~~t}{zru{~}~}~~x|}}y~ws~zlx|yzy|~wz}ys~n~|x{}{}x{elxw~e~yrz~dq|z~zzxyywyzxuz}g{}y}yvsx|{rz|uwtyywk~w|x~z|||yrx}z~}pv~zyy{||{{u}{~}}{z}}q|~|psvy{z~~o~}t~|~x{{t}~vy~|j~}xz~w|~pr}uz~{y~y}y|{{v~||~z~y}~{}|r}}{~|{~t~ty||v{}xr}|||z}zssws{|yy}py~s}x|}}z}~vx|~~zy~z~~{u|z|x{x~|~vzvy{}{~x||~{n}z{zx~w}{yy||x}|}wryvxwyymw{~y~zw|v|z|{o{~~yws}~{|v}z~w~u~ywywzvx|~zxyx{tu{{xv{w{vuyzzyu}{||w|{{w{{~u|~tu{{~}}qrz~|uuv}~z~st~wz|||x}|{|zxsxy}zy~}x}sw}q~}{}q|xx{rx|}ss{~{|{}}znwzy~ts|}}|zz{v{yx~z{{}|}u}|{}|utxwpvq|}xy~uf}{v}{{s}q~rsz}sy{}{ry~y|{kzwzuhvz~|wvwxv}|}~~z{|~}{n{py|xxux~}ww~~vz{{{q~~t{{|}~us~{v|}syzy}~~upv}|{w~doyws~zwyxxz~|vo|tz|x{vxz~{wkz|}x{}x~z~}|~wyyz}||uuv{w||xvw}yyy~ry|zzz{o||}~~s|z|zz~{zz|{~x~~}~{|}~~zw~|~|~~~u~}|]xzwq}{}z~|o{~{r~zw}uwz}{|w{~s~}z{~{}}}}||s}~~~w~~{|t{v~yypzy}~~x|}}|yq~}~p}y|||{y}zzzy}y~{~y|z~y|y{||}}z|sy|y~t|pv~uv|}}k~yy{rww{}}{y}zz}~{}{xz}~xxz{}z}vw~}|}~}}||{|{txzyv}}~}z{zz|~{{xozxt}}}|}~q}}{y|||~t{|~}m{xvvj}|w}}{}u{nkyr{t~x|v~}|z{uyt}{}{v|{yy{{tx~zyn}~|}}}}}zt}{q~so~z~}xyx|x|{|yp}v{}u|ou|zq|{}}~}|{v}|z{n}{}}{y{}~yqzyrz|~}yv}|s{xz~}|z}}}}{xy}xz~yugw|~xu{wy{}yx~yxwxv~~zx{nzss}z{}uyvz{uyw~t|t|~{zw}xy||y}w}wqxs}ryr|xyzv|q}}}|~{|}~{|pxyx}~u|}}rsm~}{}u~vf}~~xu{xy{v{s{}}ys}w~y~xzx~qtz~z~~xzow|vy~|y}x|~{xxzxqx~}}w{~|{~|s{v}y}|{z|yv}~~|t}xr|wty~}plrtx{xz|xv~}~{pn{ws~wlz{y{{|xrwt{w|rvzpu|}vy{zu~yyz{~|z{~uvyy}srs~u|{y|t~xxyzw{l~~{pv{bv}yww|yu~s}|y|{zwo}qv||~|s||{yztyz}urwy|}}~~qyuyz}p{|yzy|{uw}}zvzuz}y}vwmyz~|x|x~|xu}w{|ovzvz|~}s~{|x}vuz~~|k|zmx~|zx{oxrs}xe{yttx{{}y~{{}|}qrLyn|mtv{u~~~|w{w{yt{{ux|z}}w|r|`t~v|yz}u}lws~v}z:yyy~~z|~xw}]xwvy{Q|}z|x}vz{zrwQ~~wz}|x}m|~quw~|z}v|}u}r|{{~w~zv~sqx}}}|}zyv}|}~{x}}zuzy{zxy|xu}n|y|z}|wd~|||{py|x{}z{zvxz{}}x{~t~x{|y~~v}v{}zy}{{{|}{|z~xpzuzwo}~|{{|{x~zs{{w}{x||x{}|zwzu}yx~y|yzm~ux~}yq|{p|~w~z|yv}xy~{~{}}zt|~{~|~zvz}~|{|z{q|z{x{|~|t|y}~{tx}~{~z~|~y|xy|zuv~|y||||}~w~~}|y|~t|vwzw}{yx}yxw|u}x}||}yq~~z{|wou{zzzw{z|w}{ys|{||w~qw~{y{z}|}|v|vo||~{|~~~v}wz{~z~|wzz{}zz{zx}y{w}vtw{y~}|~~}zz|o}xyv{}zy~yu|z{x{~{u}~}|~x|t~}zu{{vp~~ww~z{{z|~}|h~|~|u{|t}ut{{z|hx~}|~wu}~~zs|wzz|yz}zztv}}|}}~}z}|zuy}x{w{{|}w~yy}x~z|}~~}~w}{vzt|yz}{vv|yzyt}|~}~y}r{}||}~~vy~}yxr{x}vy}{z{zy{y~r~y{z{}{yst}~z}{t{}}s|~|zwzy|}}yzw}}wv}tx|vz{uyur~qy~{tr~y}||~~vzo~~z{~}o}x|}}}}uvu{r||~}vzyz|z~}~x}~~zs~}}zxxzy|z|}voxwvz|wxs~zvs{yy}{|{~wqx|}|x|~~v}}v{}{~{m}|ws{wx|}vxxy|~x|~v{{{svn|vu~t}r}}t}t}|ytw}~x~v~}||{|{ztpq{|uqt}m~z{y}wxvzx{{v~|~~~fz}xy|t|vu|w{wt~}wzxn|{~zx{{{|ry{~|~z|u~~n~~i{~zy~y|||zv~y}x~ov{|z}vlr|t~x}{w~yvwxro|xyt~~s|~vuyy~ys|z}~uq|r~~~{ys||{{{~|zz|nw~~x}~~yzywuw{wyp~{z~zw{pz{}xx~~s}~}pw{z}yy}pz}~tv{qyyzW}}y}yy|o}z~wy|y|wuu}qsz}}|r~tv{t~~tsv|z}|w}{~x~zn}y{sxvx|~m~y}u|w~u~}~}{}}}zw~uy}x~|{y{yyz|~|{y|}y|z{}}pw|zv{v}y}}|z~~|{yx~wx{v}}y|wz~xz~wt~~}~wz|}x}zy|}}zz}~~}}~|z~|}~m{|~}z~|z|zz}||m~x~x}|~}v}{|v}~}xx|~~y~z~~z~zw{yz|~wzz~z{~x}|{ys|u{{ux}}~~{~yx}zs{~w{ty{|~|zz{~~}yt}y~vwy|w{~||~y|{yl{~y{y|{u|}}v{~|v~}~}}y~z~|{|zwyy~wzy~zyrxrz|}{y}}xyv{{{}|yy~~}~rz~w~{}|ux{{w|syz{{sv~}}z{x~v~u{yz~{{|~z|{~w|{{xw~}}|yztyvxwl{vzv||rqr{y{}ys{|{w}{||{[}xnv~oxn{|yzvtyzy}}xtpz|xvvywz}|{y~~j{x}}w{xz|yZxy~u}~}q{{~|ztty~z~~wwzuy|x}qr~t~lvy~s{zw}n|v}|z}wta{{z}j{y|}{}w~|xv~s{x}w~tyz~svzu~y}{~y{~}zwy|~xyyw~~`}p}ur~|ukxxzu`~x{y|zxy|}s~|y|ztxys{q~pvw}{~}|zpzwz|}z{z}~{rz{v}zzyt}t|wu~w~z{|||q|z{~}w|vz~~|~||z}rt|}yv~zz}qyo~qwy|z~|{ux{}x~xxvm|zuz}s|}q|rs|suyznwx{x}x}x~wszt~|zy}w||~y}x~sx~xtt}}{{|||xv||y|yu}|~yvv~~vty}}yz|r~zvi~{y}{{{y}~yzxxu{{~os~}~v~}rw|kpytr{}~|szy{zjw~u|x~sz|{~|zzzv{}wx|}~{wxyxuytuxpw{yv}}p}~{z|rx|xz~{w~yz{{~{}{~w{yxx~x}~x}qyp}xw~~p|unyyx}z}zxy|y~~{z{}}w}{z{w~wwzvsoyw~w{~~vuz}ywy|{|w}{~qyy}|rx~{}|}{{~{}~x|xxuv~}l|h}|~~{yz{}~zwpwq|{zg~}{s~~|}z|}|tvou|r|{z|}~|xpz|x~{}uz|v}|}}yzx~y~z|}s|y|v}v|zuzu|v|{}~rzv}}wrv~{|v|wtt|{}t|v{{~{}q{z{{y|v{~z{z}yysy|yzz{|vv||~}y|}~{~|{||{n{|}vyw|}|q}{}w{~q|x|}ywzxv|||t|y{sww{u}|}~y~~x}~{{yz|||yx|y~~~~}u|xtyw{~{v~|xx{{{}~z|tr|{{~{{~yzxwu|}~wvx|~tz}z}z~{pz}{|~s{|zvwx~z||ywz{u~ty}{y|wy{w{}w}z|~zxq{zzl~|ymtxz~u{}v{y}y{z||puq~zv~p~|~|~z{u|{~}}z~|||~}x}|{~zzswu{}|x~w~}y|vws}~yyy}{x}{yz{y|zxuz~zy|}|zy}x}{}x}}~wx{~~z|}wt}|r||n}~{~{t}zv~~y{xuy|~{}|{z{}|p~~|wvz}~}}xxwwy}}}}}|~}{v}~|zxqu~s|w}i~~y|{{{}{}}z|}z{{w}z~r~{z~xp~~t~|}xw{zy~}qsvrvy|}ywz{{~|}yvzvy{}|}|s~}|w}~~sxv~|~{|{}y{{x~p{u{z}z}~{|y|y~{r{}w}{uz~{xzs|~{y~{wz}~vz|z}yzw~x~t|~~z||}|y}|yyx~z|~}{zyy~w}}v|j~vyq{z~~{{}~uwx|{{yl~{{{v{|}wzyz{~rx}~yxz}mzyv|q}w}z{}{y~w{{x|l}}yo~y{zv|{w~sx|~|{y}|pzzuu{~}u|l{q|xw}ypy}z}}y~}}u{zxvww}x~~~y}xxv|~y}zxz~w~{u}xzzy|z}}||{s{zy|~{v}vzs{wyu|y{|wvzw~vy~{zz{ryy|yw}{||{txw|zz{xy{{}yy|v|{y{|~}yzvmxzz||{~w|~x{}zw{vuy|z~z~uyx{zxu~u~{~vovw|xn}{z}zwmwzr{s}|{~~w}~zyxy{~xutz{}~|rytw|{yv}yz~}{}zyzz}|uw{||nyz{yu{y~wxu||}|z~~w{|t~z|~{zw|qw}}y}x~y{uy~z~~y|r|}}~{~x~uy}ytz~v}~z~vw~y{{w{g}xy{}zyvyw|sz|}|uw~m{}~}}zw}~z|yyprzw}}}u~~st~~}}}|u}tw|}{}~|x~{y}vw~~~||}}q{~{yz~~z|ys|q|w}{{zzz{xx}|}|{}uy~}{x~w}}}zw}{vz}yyz{{}u{|zzy}|}}|}zvy~{w~|{}~}{~|p{x~~w{n|{{}}w}{x}wuv|{}q}~}}|uokn}wq|xz}wvx||{~|}wx}}|~q~}y}}x~z~x|~v}z|zz}v|}}|{oy}xzu}{}xuy~}y{|xw}kz||v{{zzl~yzsk{u{||{|}xtszw~x~yu}}~{{{{~}~zxz}x{px~}{{qzx|}}x|{{v}oz~z}~z|}~}|z{v{t~x~z{{}}yt~{z|x|wzw~~v{}~}zz{zzzx~uzs}u{vzw}}z}}}||{yx}yzwv{|}w|g~~|}~~z|r|x}{~}|{~{x~zwu}}|t||}u|wx}{~yz}w|~~|{x~rt~|yuz}vx|~z}~y~x}t}|~|u}t{|~|z||krl|v~}o}}z~|wyz~|~u~|r{|{u~v{y}}sx|vzyr{xuyu}|vzr{w{yu|}tz}z{~|}wv}~|~xtsxx~zww|{}r~||uw|~ozwz|y{~~|xxz|zyyu}}{}|~~wzut||x~~~|{z|tz|{|x{~~ez}q|~o{~yx|y||~s}}}~|~vwux||v~~}|y}{~r}~u~o}|y{z}yzv|{x|{u~{~sv{}~|{vn~v{lywty~{|ww|}t{~{yz{}|}}z|~|m~|y{z{}~x}xut}zx|}}}~{|vwz}|}vz{|k}~{tu~yzsuru~z~zt{{y{{ts|z}vzm|y|y~|~}}~uq}{z}}rzu|w{xtx~zv~}~y{{ywqrxt|{}}}{z{z|z~{y}~wxz}v}tzgy||}~{y~|{{{lu}|~zm||xy~u||~|~{|zx~z}~x{}y}|wt|q}wr~x~x{sxv~~|s~{}|q}{ytv{|~}wt|zx|}}n}{|~x{p|s}{utz}||}}v~~xyz|||w}}uz}|yv|}y~|v}|z}xv|{}w|}~tzw|~z{v|z}|~xx}u}zzyq~yv~{}y~~~|}|zo{yz~s}|~||su~}x~{x}{z{{t|}{w~xtwy|wzwuu||x~|||t{~|}w}w}z|~xt}||{{z}v~|xy~|{z|vx{v~~z}||}{txywyzy~~{{}}xo~|m|wzrw|~~}{zxz~}w{z|~wy{|~|{}wumypuyz|{w{y{sy}~}}zzw~}yv|xqr{w}~}xxzzw{||zz}~|ytwz}~}{y~z}~}{v|l{|x~~w|~w}{{~~yzoz{}|~zz~}~~{q~~w||x{}wz|~xw~~~zv{|v}vyvuz{|yz||uw|x~p~}y}{}ww{~x}ww{}y|{|y|~t|}||y{xvuz|v{}z}|}v}w~ut{zyu{y}{{~}~y}ywuz||xxsy{{||zxy|vur~~{}~{s|~{~}~{r}z{~|xz~{~~}~~||}}w|rzzyv}xx|x}v{~}tyrx}yz}{~~ww}{}v~~}{}w{{|y|}|e|zx}y}zz|vt|zt|yz~v|}{}y~}z~z|y{x}sy{uyz~z~{x}{~{zy~z|yyv}zux~z{wx|zxzy~}}y~q|~{{|zw{yz}||~z}xz}|y}~|~zwr{~~|zzxw~zss|~~{x|{v|}x|z~|~{}s~zu{~|o~zv}sfq{}|tw{y{fvo}xtxx}}o~}{~{slv}{u{z~|x{}tz|~w|~~~y}|oz~v}s~{}~uso{{zyw|zyx|}nxrw~z~}}~t{|x{x{l{syyzp}\}x{jvvwv}v}yuztv~{}~t}wzqt{m}|zy~}z|zothxz~ywy{|}|y~~|txt~z{k~}}szsu}zr~yyyzsvxyvtsxpxx|~y}}qZ}}vnu{i~z{{wvwuow~~ryw|xy{}x~uz}uir}z{t~ly~ur{{{zzy~xy|y|z~xzv|x|vsvzxmbwzxz{{~|x}}}wwzz|~ysz|uwvuv}wv~vyoiz{|oyuxw}y~m}~~~{{zs|zy~{{zuvh}n|yw~t}{{|{y|{z}y|w}~{{{~xzx}x~q}x|}xs~x{x{z|{xzu{}v|yyz{{yyyuwpx|v}zv{u{}z|x|}q{y}||{{|}{s}y|u|}{~y~}~}~zyvs}}}{zx}~u}{zz{{}}r|}z~|z|{~vuy}~{~{{x}y{r|z}x}~~y{v{|v}}|v~zvyv~}z{y~~|ww{||zxk~|hxzxtsx}}~yy{~x~~|}yztww}y{}|uy|zx{~z~~zvuv}~ynzr~{xz~|xrxl~z|u}}v~|{|v{sz{qx|t}~wy}w}}{}~z~u}~{}wy{}zy{zxs|{}w}~~{~kwzsxzz|t|{}}}}|}v{r}}{}}{}|y~|~|z}|y|ysz}w{x{t|i{s}vyy|x{}szyzw}}}y}{{~|{}xtrntwxs}{}z{y}~n|~n{w{v}z|vz}w~zx{|xy{~|{y{xyz{wz|~u}vywi}{{}|}|r}}v~w|s|zv~zu||zzrut{}qzz|xtzx~uvy{}z}|~z~vxuyxz{st}{{~vzqwywvqut~yy~{{|~w~~|}{w}~~|{x|rz~|~}}~yy~~}|w~w~}|kw}y}y{|zw|vz{p}{~|{z{~}x{}zy}xtt}{~}|}}ru~px|{}{xu}}{{|{x|xu{{yy}y}||{~}~|{}v}zu}rp|}|y~{z}~|vy|~~hw|y}z|}{yr|wm~r}v}~r~zwanxnxtuz~|xuuxyv|v~zpexptsz||x~ytx|wztvu{zr~tuwuw}r|{{v~ryytuw|}tzjxz}x|xneox}}tzXmq|mwz}}[tpsx~vu~x|xi|wy}}pznytxxy{x~~fvr~}z|{c}~}{gw}tu{z}wz|inswxuDsu||rLqyh|nzu|}}zvyw|{vw}~{{bwyu~|{kvz}~~~|xw~y}couzsrb}qx}ww~wxw|o{m{{xo~trvv~{v~ysz|tvsgplsuuc{}{|aosztx~{{t{rpzt}|{~uls|wur}}zli{zv~|t|b|ryl|xyz_{t|~y}aw|pqxo}~}|x}wz}zvt|~|||~~x}zyz{ztyw{u~|~xwx~xwz}y~~|{|}{y~zry~{}~v}z|v~|~}|~|~x}{|~}{~zxwuy}}z}~{}ry{zz~~y|~}v~|{}~{x}xw{wyu}~y~~x}~y{y}uw{}||{}zz~w}yu~}|~ss{{{}||||}|~zx}~}{|}||zzy~~w~{{qy}vz~rz|y||~~vy}}~|x{~{{z{~|~t~|tyzz{}|zz|{~~}}wxzv{~yyz~xzq}}wzz|{}}{|}}|{}~~}yz}{v~}x{|y|}z}ryz|~{{}mszx|}||}}|~z{}}yz}~|zx|rzvy~z}~yvu{~{{{v|~y}y}||y~|{|~}}{{w{wz|~w}}{~zy{|}uz|}}}xy{{szzyszk}{yyz{}|ys~}}~uyx{|}}~~~zzvxx{|y~z|z~sv~|z}ym|||z~~v~yw~~||{|zz{}qzqx|}}yxvz{y|xxt||}{ywzx|~}~~yw}x{~pz}~xz|}vs~|{~}~{}~|}{zzz}~~}uz{}t~w}}|{|}zz{~|}{xy{|xw}|}vzxw}w{u|||x|ov~|~~|z|j{|}yx~~wxyyy|v||}|v|uy~~z|}v}v}u{wy|||}}z~w}xz~~}y~zz~~qz|w|~{~oz}{~tpx~}}{|}zuz}g|}|x|zz|zsx{|x~~~wxz}|xt~|y~ty}|}}~{z~}{{}xyz|z|w|}}{y|wz|zy~y}}~||{u~o|vs|x~~uz~z}~|}~}y}ymu|}un}~}{}yzqzzwo~||}n|{}}xuywfzzz~~yzy~y}mv|~yw}|~~{wu}{p|uus{||svv~{~|}~x{~wyvyxvq}s||ux}|{}zyy{v~|z{||ox}vyzz}~zyztto~~|s~}z}|~|~zrzp|~}~w{tx{}~|nu|{|x{{zzv}tz|{{}y{w{{}yy|}}{|yx{q}|~ytow{w|~zz}}{}y|{y}u}u~y|w|zr{|~kv~|u~}|x|zv{rm}tyuy~~uywu|wyz|vl|wxw~~}||{z}x{{y~}|{yy|m{}uz{}zz}x{||x}q~{|~~}|wxu}yysz~{||tz~tt~~{zv{{|}vvrxwv~~s|x~~|t{y~xtxyzvu|z~|}}{wyzf{~w~|zzvyx~qv}||~{x}}vx|}}}y{{}{~v~yyyxy}x}}y}u|}~~w|}}|}qzy~qqrszv||~{{z}sy}~{t{{zr}~~|~{xx}{{}||}{r~{~{vzzvyyv|{q}}z{|z}zvx}~xv{~yv~zy{zx}}||{|sy}x}~yx{~rxw}z{}|~yvwt{z}}o}x}|x{}||~y~~zxsyv~}~}uz}~{yvz~zyz~z}yz~}|}|y~uzz{}z{x||yyw~zxx{~x}~u|}x}{}zw}|~{w{}}w{y}u~xz}{v}}|}|~~z~v}x}|s|yy}zzy~~ry~}zzvzy{w~|pzws}y}~z}wmr{yyl|}z}uyy{}zw|p}s}y~|~wvy~~wzxp}w|yvx}w|z~}{|uy~x~}}z|}w}zuz}|{yslpxw{wsm}}n}||tzzx|{xx~uy}}~v~l{t}{zxm|{w}}|u}ypt}{}y||yw{}|qzyywz}~~~wvuuvtyvxww}|}||vz~~rxvs}~}{}{oz}w|ux~q|znz|}||y||ytxxm~~sx|}vv{yq~|{|v|s~~|yl{rxxtzw}}z|}vx~|}vx{u~zy{}xxv|wlvv~~{p|zwouz}}xuw|ur|r~|u}~{}~|qz{y~zt}y||}y{ttz|zwv~{|{||~uv~w}yxwu}r{z|}zr|}~~|vx|~y{r}~|yt}~}|~yy{sv}z|~~w|y{x{x~}v}||~z{~ry||~zy{|z{~}~|~|zq}{||zvw{r|~y}xu|uzz~y~x|x~}v|y}~{z{}~}x{}}{v{v}}xv{}{z|zzt||wy}{zusw}xx|{~~v{|s|}}{}~zt~~yty~{||v}}y}{}~y~}~vz~wyuw~~wz||{tz|s{zzt{{{}w~{|y~{|zxz~{}~x||}zzv|zyx~yzx|zwx|{|x{~~{qy~}ry{~z~x}|z|y~}y~}}xt~vyyt|s}x~yzv}~~wszwvwz|y~|y}so|ptv}wzt|yz}s}ztz|yw}z|ww}wzj{~{u~r}vu}z|v~wxw|qz}{~vz~|}}sj{}z{y~qw~tt|v~y~{yyv{||u~{~~yx{yz~u~~~y~~{y}~t~}{yp|y{r}y~{{|rwwu|}~z}z~x}{}||y{j~}}z}{ztv~|~zxw|xvzxzzzzx|y|{}}xyz|s}y|}~y{e{{{skuz|t~z{y{vs|zvxx}swy~{}{~~||{y}y{}}wz}q{~vy}r~~~~|}|wkyw}{^~}|~y|q}|||tz~~oqz}urwv|zvuyz|{v}y}q{v|yuy|u~y~~{~}uzoy{ovzzzx|s}}~a{xy{z~z|~n{z~|u~xzy~w|p{u|{zp~trj|zxv{{~w{}|u|}x~~~y}||{~~|w~~z~{|{tjz~xw{u|{z}tzx{|}|ys}~nixxt}yr|~y{{wv}}}{yy|{~z{yznv{{y}}s|{uq{~wu}}xu~qyxxz}{z|{{s~w|{v{{zz{}{~~}|wst}{y}}}}y{xz|}z|}q{~t{||}zyz{|}x~||x}v~t}{v~{z{u}zzzu}{y{y{{wzwz~|yz|}zz|x|x{}{~|~}~}w}yz~|~wz{~ux}~{}ozy~nt||yr}~|~zswzw{u|}{xyz|x{v~~y}}{{{y}s}z{{x~}t|~yww|l||~|xywx~u|{{|rw}|w~z{xz}vu}l{~z}{ywvyxz~{y|x}x}}}|{{uz~os}v}|{tu{swxqyzy}z{vy~zvn}ywr~{jyqzvyywwyyu|z{}|xyw|z~xz|~}zz~wt~w{}|y|u{u~z}r}{t{~{{{vz{|rzz{{|q{vzt~|z}}y}}}}~zxy~}|tx~x~zwzx~qx|ys}zx~pv|szk~z~~v~}|su~|s}t|zt|}z|p~{s}zvu}twyyzx~}tzw~{||}zyyqvz|xzy~{wxw~z~zfwuqz~sy}{{|{xz~~p|~}us}~|xst~}sz~zl|y{k}y}xxoyvxx{}y}{wv~}~yzz~|t~ynzi||{~w~n|xz}~r|}}t}w}|}y|~|w~syt{{~~}y~{zrz}}{~z~|}~{z}{~|}~{}{}z|w~wqyuyy||y||s~{~{{}}|{~{xzyy|y|psz}{~{{}~{u|x}}x{yy{w||~}x}~|~zz~zw~~{y|ytx~}|}||}zwy~}|u{z~|~|{zw}w~zxz{{}|wzvu}~y||z}u~{rx{vzu|tx||{~~}||{~~|}~{xy}wz{~}|yy|}~~y~~{wux}}u}||}~z}z|{}|}us}zwy}|}~y{}~|~~~z|rs{vvty{z~wx{|~~|z|~|}uy{~z|ytz~x~}y~~w{|~}{||yz{~y}}w~}}s~}|w}z~t{}}|||xuj||}xr|{{~du{|{z~x}~o~}|~q~z|x}yy{y{}xxzxwq|n{}|}~yhw||{zx}{}||}{}}tvpuvr|z~xz~z{}|{}w}z}}|~~|u}w|psz{}||rp}~wt|{zz}~yz~uyx~|}|u~|~{|~zv|t~~~|~~xx|twz}yvzyw{vt~{y{x{yqxw}}v~~}z~u{l}}}x}zytv||}{|w}w~|}|~mu|t~}x|z{~~}w|x~yxz{}z}}zz}|~}zz}~pqu|w|s|}r|~z{z{wz}z|rr~u|w|y||~|y}}zp~||xz}x|{rxw|{y|}~v}|~z|y}~vqwo~{~{{y{}xp}z{|y}|{{{z{|s}wrux{}w}{~{{xt~v{|zyv{~z|x{|zlty}xyr}x{x|{}|||wz{y}wzv}r|v{|{y|uz{x{xvxxx{}wyvtywuzxx}s}{~w{vx|z|{}|~y}xyz}z|syw|u~}wzz|z}||x}v}~~{uyzy|}u|xyyxwzv|{}yz~zv{xz|~zwzty}{zpzp}{~k}|}|u{~}yw{sw{|z}wvuw}w}z}||{s}~{xxy~yxiy{x~}y}z~{~~x{|z~~~y|z|~~}}y}}uvyn}{{s|}|te~zt{{|}|x}}{}~z~|}z}wx||{~x}zc~|y}wz}rywuwy~xx~|}{{~|zzx~}yz~u~{tow}|~~xs{|zt|yxzv|xx}{v~~}}}~}{~{{{|{v~zz}}xwtx~}z{rtq{z}x}~wu|{|w}v{||}~|y~y~{~~ru|t{~z~~tx{z~yxz{zy~y|z|~{w|{zz||||wt}yqt~x~vyxtx~~z{~xzvx|zzzx|zp}uz|~|~zzzxvwy~~|}t}zx~{||qzys~}zz}|}{~|q}|~~~{~{~~{~yzu~{|x{t}~u{|zr{~~|x|p|x~~u{z}|~||~|t~~|w~~{xv|w|}r~zy|}xyx~}|r|}|zz}}vuxz|}u}}{}~~|xx~}y}w~{txy{{z{||xsz|yz}|{{{|~ztz|zzzzj|~wyz}xyx|~y~o~}y~~r~y{{~zz~}y|~}~uv{y}ywxzy{x}~}{||w}~zyz{}{|w}y}|vw~}{|}||t}|{~}oz}~zq}|zxu{~{u}}yx}{|}yz~y|zz~}{z{v|wwzwsv}w{x{{{}z}y~yuz}}{{tt|}~|z{v}|}s{~zv|}}w~~~}vy}}}vv{wyz{{}{{yry|}{zv}yv|zzz}x~ur{yv{|w}yt}~{{{~zx{~~z|~~~y~yvy|ux~{{z~zzww|oluyzwx~}~}|w{xuv~y~|}|xz|}{~y~wt}ux}~t|~{{y~||wyzrzwz}wz}~~uvtzxzw~w|z}~~|{}t|~{xuzt~{{|}x|v|~{y{xyuy|{{|}|x|zyzz{kzo{z{|urwq}{{|{yxy}~{yz}{|v}y{u~}~wy{~}}z~x~yq|~vzwzyzz~q}}}sx~~||}~~|z|~vvrwvz~~}z}l{{y~t|rv|{}yzx{|y~n|x}|xy}z}|~{|~zyn|z{x|xwv~pz}}{~}yx~xyzvpw{|{~w|tz~~|r}}y|vwyxz~w|}{~~~zs{wqvt}qzx}~~|}v|o|su~{y~w|yn|}v}|wqrty|zy~|~y~|y}}|{{{}{y}~y{|{~||x}~y~ov~}z{ytpx}u~~w|}bo}zuz|}zy}~|~|||x}|{xx{}|zw|}{|s|~||w||uwy~{z~ty}}~ww|w|z}{}|y|zzvy||nx~|zor~~~{s{yu~~}~ur|c~}}`u{{~}zzu|||u{~~{~x{x~|zpw{iw||v}szy|w~rk|ez|zz{|}zuo}}p~i}}}w}~}{w{{ux}|wx~w{x}}y}~~y{}s~z}|ywis~z{ql{}y|~~v{}s|t{~z}z}u|~w}y{|xz~v~{~sx{~|}~zu{}z~|iz}}}y~vz}}{}{~zwzty}xxx~|~}vx~wv{xz|x}v|||z|}v~}w|z~z}y{yxzzy{t|~zxr~t{|zdw|~|z}z|{w{w|}z~t}z{y||{yv{}~yy{zp||{~zviiy~}}yw|vs|||zw{z~|}v|ztvw{xvrxovu}{{|x{{sy|~|znyyt{zxy{{|w|}nzm}|}s}}y{}zs{x|~n|u{yvxz}y}}{|}|{|z~~uz{xxzz}|xyzyznz}w}y{|{v|sz|{|~}}x{}v~uw~|}{|}~u}su}rvx}}t}y{{{z~}uxw{zz}}z~~|z{xq||{xv~~~|wv}}t}|{{y||{{yzv{}~|}{|}}z}|}}wn}y}}|r~|{{{}zy|y|v}||z}w{p}sfxzy}y{n{~xq{{v{{~~~}v{xy}}~w{y|}~}|y~|y~wzv}{{~~v~}y|{{~uzu}k}|}zy}|{x|zx~w||{}u~|w}{}}wyv~{~~~|{x~v|y~vz|yu}~z|utuxv|yvx|~szzw~||x~yw~e}x}u~|z{{|~v~}|z||s~xsr}o}|||~xt}~wu~~xzi}}w||~|}v|~~uw||g}~zw~y|wxs}h{|z||}{|y|v}tz~y~~y{x~x{y~~z|s~||zz}~}{}l{z|zl~z}}{||}q}~rv|xtx{y{~uxy}wzr}yz}{~yu}w}|v{vy~~uz{}|y~~{|x~|{{~xx|u|~|{tz|}w{zz}{~}}}}|yx|~y{}{~|wx{wv~}z}~iwxzz~x~yy~y{zoy}{{|w}}}}~|{{x}{}x{t{t{u}u}y|ry{u}~{~~xxsrk}qy|tz|~}~{{}{zw~ozz{}~|}not~q}~t~rz{}xw}~~}~y{}u~{}~vgw}y}|qzzy}y||}syvv|rw|}}s|{{{}z~|y~yp|}w~{zt}w|yty~x~{{|x{}xu~|{y~}}~{w|n~z|{~{}wq}}~z~v{}}{t|{x|}{w}y~|u}~{yw}}|~~z}}z}~}}~|z{t{{gww}|~w~||y|{y{zk|z|wyvyx}}yy~{|o~|{~|~ty}~~~h~|~|p||w|{|y{~mx{}{|~{v||~}~wvz}y~zy{|zu{yu|}}||}}}}}~y~~~tws|x|k|~x|}ew~{oyyyuy~zy||{{~~{z|t|{w~w~m}u~}}z}}{{}y|xw{}~~|||~uy}|}}||~}v{x|v{w|v{{|}}v{wwz~y|}{zy{~{|~y}qz}{v~zz|t~{|}~x|~}toyv{w{z{|{|zy~sz{v}{z|xo{|{y}|~y~{~}}~|}|~{z|}y{||~{l}x}wx{~|w}u}s||}~||q}~szsyz~y{zzv||}y|zuy|wqx|z{~xmyx{{~x~v|~}|vx|~}~syzzz~yuz|w{}w}th|}xx}n~{~~oxy{y}~vv|z{||n|z}r|u}w|~r|{~}~~}k{xv}yx~}z~x{zz~}u}~v|}r|~}wz}z||x}{xr~z~yz~zm|}z~}|~{}~}|zv{{z{{}{}}x{{~x}xwyyv~z}r}{svxzzy~zux|r}|z{ux|y{|~|~s{vy}~yy}}}xz{~{~|y{yy~}t}y{vwxx||y}~{|v}s}t}xzz{~uy}s~x|yw~y~~u{|s{{yv|x~{v|{}z}~|~x}||{wz~yz|}uxz|}m{}{}wz|y|{uxu~yzxu{|~~|q|ow}w|x{{w|}{{|{uyzwx{{}}~w{r|z{xy{|~{||}yxzx}z~z|~|z}{~~vrxz|}z}v|}{}{r}w~y~}t||q}|v}}}u||~}}x~yzz|y}z~pvw}~{|w}xynmy|y{~{s|ry~x{}~~}|{|yv~||t|{vywx}~|xz}{t}|r{tw{~w|{{|x|yrwy~~}}yv|yxm}{vz{x{xz}{|y||xqz|}y~xyzvzy}wz{y|y}xz{z{{mw|||}w}|y~{xy{~}{|w|~||vzy|~~}z|oz|{w~x}~}}}|~yt{~|y}vzxo|vq{|~{uyx~yzxvx}u}yv~{}~{zyy}{}wx|z}|uyz~}~||q{}zvxx}yzzsqy}qt}}}~}|yusz}{~|{{y{z~{|~}wx{zzzu{}yv|x}||~zwjzzq}y~|{y|~x~~}~w}q~y}|~{w}{~{{y||{}|x~zx|z|z}zw~~{|~~}zry}z~w~{|{{{}||{y{xz|~uw~~z~}|y~u~tyzq|yyy|{w~~zxxt|~k|{|}|~y{}tw|x~w{zxz{{z}z~}|~vy}tztyz~wn}{}~x{{}~z}}}wyzuv~|zz|uv}w}}wt~p~}{z{~x|{}zq{}z}y~j{|}|otyt|y|y~{|}}vu{|q}w{w{{z|~}{wyuz}uy}~zzl~|~~x}w}z~|{{~{swzosxz~}zx{{zzu{~|zyy{y{t{|{}}z}}s||qzzz|{zw|ryu~{{}u~x|v|yy|zvvvy}z}yvu|wsz}yv|u~uz~}}{wv{}s~|{}xzv{}{v{}{|vz}|}n{zv|~xy|x~t}~}~{~~vt~ww~~wyxy{f}xyzw|y{z}}~}uz~s{yyzwtzt|wy~zwvvy{z~~zu~yxq|~}}zus}p}u~vxtys|}|z|zyzz~vvs|}o~y}xzz}w~w|x{y}x{{{z|~{}z~t~{x~v}}|wtzyz~}x~}x{}zwz}~zv||zqs~||w}w}{zywphx}~wt{w}y}zu{|y}~v}}}}{u{wdxv|{|z~zvz}|zzowo~z~~|y}|z{x|}u~|zt{x}}x{v}~|{vwz}vt~z}}~s{}v}v~|x~w~o}{||}}}~|}z}wzv|h}k|z{s{||}yx}{||tm|x{z~~}}~o|{z}y~z|||~{~{}y~zrv{~qy~y{|y{{}|z}|ytzx{y}n|~y{ys}qy{}q{x~yuzzys~}zz|xo|}x|~q}xx}z{|t~|k~ywu~z}}z|~sypx{~|ux|{pyr{}|sz~|}}|ruvopxgxy}}{zy}u~r_}yy|w{w}vzi}|}}u|~w}rtvwpy{|uzozx{}~qw~~sz}~|~y}}zyt}z{tyy||t{{}~~}z|wz~xp{{yzxz}z}w{zy~x{z~nzx|~|vzq|{wx}v}}w|~y~|{szry|xu~~x{~x{~|o}}||{}z|{upqqvy}~~l{~y{vt~tvy{{~z}x|{|~q}z{~wvtu~}}}yy|{}zx}~z{{zzt{rtx|y}}|x~}{{x~~y~~~z|}|{|rzyz|p|}krz}~~|z~}}w||vyrx}y}~uyxw{~}zyyzx~}~~xp{x|z{ly}ztvzzz{{}y{~xz}vwy~lxy|}}~~~z}}yr~yu{{qt~uyxz{}zw{mv{|{}u~~w}u{}s|~|px}x{nxu{z|r}{{xy{r~zw}z~s~~{~{{|yown~z|x{|}{}gzp~xv}zpzqu}x}x{n~|n|~vw{yv}w~u|x~t|w|x||xj~wux~}{zs~{}|n|vq~~z|{}|p}{x|~v}}{}t}}v}w}}~v{y{}wy~yxm~~u|~w{rwqszzs}vgz|}q{|uyw|ums|w~~}v{{u~xtizu|ywu~{ovu}xv{~~qzq{p~|y~~szzwy}zvxsvz|||{|r}z|~|}}||rxuvzzpv~}wzd{t{txutuv{y{wy}{}rtpkxv~~~w}{}}|~y~~tz~{|yu~~tuywsy~vu|wzzr~}|z}ruwtz|r~{~~}|w~~z}|yyx|q}y~|vsy|yw{y{y}}~~|~x~~y}{w|~~z~~ssx{rzs~v{z|~zy~~xyyv~~vw~{w`w|v}zzv~z{w{{z}sz|u{u}{yz{|{wy~|~|~}}z}x{x}z}t{|}{~|z|{{st{w|{y~}}vz{p||z}u{zwyv|}|~yzz~}x|{xu{rzy|}{~}~{qx{}v~x|qz}~y~}~zy}{}ww{y{x~xuw~{~|z~y|{|~y{yw}|z~||y{|p~||{v{ruv~sx~z~tzy{}t{}zuq{y~|{|}}yy|{~xyzzz{}}w||~vps}}zyr}{~{{y}}}{wyygyz~m~r|||wzt}z{yy~||wyxzyxz}x~oz}~{}{{u}|wp~~~e}~}w}|y~}y{l|z~~y{~{{v~~}~yzws}wv{mty|s|ru~{x{~|y|s}|x}{|s~|}}wzz~|~}y}p{~}wzz~}w|~y}|{y~~~|}}}}v|~}z~wxyz{~}{t}||z}jsw{{}z{~u{~{x|zy|yz~{x{z{lz~yw|u|~us}{~w{~~|rx|zzw~t|~~{ss{zx|}u~{}|{|{{}y{z}}}pyz{|~{~{|dww~yxy|x|w}zm{wsysw}qq|{r~uzwzys|z|}~|xsy|~w~yzo~w~|ty{~z}~~||zlx}xx~t}}|}xms}y}~tyxp|d{{v{v|~}~~zvy{{xx}y|o|tyszv~zzz|}~|}{zy{w{x|qzzy~xzyw}yx{w|x}ty}z|tzys}z{z~v}~|{~|}}zx|~~|ywvzz}~rv~}}yyty~n{~|x~|x|zv}~ux}s}~||v|z|{y~z{~|}~w{wvztxz}pz}}~wx{}xt|~v||}~xw~z|}{x~|{x}vxz{y~y{zw}y||wt|y}}}xo~vsv}x|yv}y{~z|wzy{}zyz{w{}wt~x|~xrv}{}}z|}|n|{z~}rzyxv|}m}yzy{y}qyx~uyyz|tsvy~s}|}|}~}x{|zzx|z~n}}z{x~|{|uz{p|}z~{~||y|}yyt|q}~{~vztxyy{xo{xwt}wxzx|~y~{~~z}|suyuy{u||}y}}yx|}wy|}vxv}|}v|{zyx}{tx}{x}|}ul}|z|o}z~~~{w}u{}{~y}{|}yy~zvv{zztv}||x{{~x}~s~z|wx~wu~}}z}{|~}}z}||{yyyy{~~~zw}|wz{|~~{x}~|{}{qy}{x{|wxtu}yu}|v~}x|x}}~~vv{zzu}{}y{|mz}xz}{{xv}yz~|~{ut{xzys~xwyxp{||{z}x|w}x{}|v}|}{v~||}}{{{wzn|x||x}{|{ux~uv{twzx{|~v|}~z|{|~{}{~u{{xzov{}zyz|{{~}yzzy}mw{~w}z|zrx{|}{ws~}|zpw{yy{u}}r||wzv}~xy|v}|}y~~q{~x}}}zyz}w}~x|{zyzz~wx{{|zyxq{~~~vyz|y|wzk|xx}}|z{vw~|z|ykv|zyz|t}x~{y|w|zu}}|~}x}}{~~u{|r|z{x{}z{|w}~y~|{|w~q~|{yvy}{{qu{}~{~c~}|tz}}v|}y||{}y}z~yu{~|wws|b|v}v~x||xx{qwxtu}|}~|xy|}||{{y}z~{t{}{y}}zyuyzzmz}||x||{z~uy||{tx~~}{~~z}}}x||z|r|tx|{zy~~yx}|xxzz}~v~qzzx}ujz~vs|}|tv}wvz{|zyv{v}x{{xzzpv{{f}n|w{z~xyx~z|x|~vz~}~x}~{pwp~}v~{|{y}xxpuyyz}|z|{|u|q}{v}yt|yuv}|zvzy{|z}||l{xwyz|}|g|t}~~|yy|u~nu}{vy|ix{|zyvtyx~~yvzxzyxw~t{{{xy~~{hw~}w~|xp{}xp}~xy|pty}y{wqiv||yy~~r|nuz~{wkuxvwr|v|{x|y|}yv~|}nzxty{{yny{~{~||x}x{|~nyzzw}|w{}u~~wy|swx|}wybpxz~c~t|zsv~|w||{z~{v||xav}zy{|trvw|wszu}~}~}z~twru~zp{}}ytp{o}vv}z|xym~szwy~{y|zuyw{}yxszxyzyy{zv{}t||y}}}~yx{~||{~y|wx~|z|y}uyw|r~y|{|{~urzx{zw~|{yzx}~t~~y~{{~|yvv~y{~y|}w}zxxu~~rv~~|x}uw}}w{y~vy|~}|}yv|~xz|}~vwzw~}u{}~w{~s{{yz}xt~{nt|{p}[}}~|~x|~~zxr}y}rz|qzz{~|{zsyww}}{zv}yyxzuu|||u~{yz}{}~||y~|t~|}x||~t{||{{xj}~zw}y{v{tt{~}v}w|zq}sxz|}{|z|syz}z|zy{}~{{~y|xy{xz|{~{zwt~{x|z{~v~}|}|}y{wxx{{}}w{z}{~|{|yuq{|~|xw~}}~xpyywxzywx||{yy~v{}|y}z{y}~xs{}}{~~t{vzy~vxy|zvx|~r|{}z}~wy}|j|{~|{~x}}{x{zyz~|nuz}zy{|{~w{x|t}z~x}w~|xy{|ry~}~u{||~{~|~xxz|yvwz|}{vz|y}}x{z{{}|{|yx~{{zyxy{~{u~|{|~~|~}t~}sz}v}w{~vv~sw|zzxz|~yx{}|z|yo~vz}}q}}~z}{~rnv|~pxwzsq}y~}t~|{z{z}~{sz{wsuiy~~w~}}{{qu}~uxqzzt{|~{~}zlv}{}{v~x}|||}}}~x|{y|k{z}kz|s|{u~ky|gvnv~|wmy|wt~su|s~{{}suv{}|x|~{t||{}}y~pw}wwuz{u~{j}}ww|m{{x~~|q{szz~u{ywz||ztx~|~}}{vsxzs}{v|uz|||n|zl|wwv}{t}nzwy~~yz~vwyz}{|~mo}~z|zw~~}w~xyx|||yxtmy{t}yqyxx}yr{}||zyz~vuw~}wz|}|}u}wow|uq{z}z{}t~wy{uw|}syuxr|~z|ux~r{||}}~p~s~y}swy}~v{|}~{t|rx{}~n||w{y|v|{x}~x}z}z}x~~|z~x{~{xxuww~~zt|v}x|zrzxpuuz}y}yw~}svyrysyx}w{~{}sz}~v~~x~x}~{j}x{z{tzpw~v~js}|z}tv}~}^q|xxvp|rys~y}jyyv{|{{x~}~x|~w}t|x~t|un]yz~x}x}wyrzuv}k{\{pz}y|ss|uz|{x|lt|}w~~|}t{{r~w{yx|}ts}^ww{}|~~wy|zxv}wk~{r}x~{~}|h{|y}|{mzyvzr~iv~~tzb}zw}rw~|v}vy~{o|}{{~|xtx{ytz{yz{tzy}pzzy}xvz~~w|||}wnxkz[}~}y{v}gxz~py|||{}}}v|y}w|}}{{y}zzx{|wr}q}{yy~z|q}~z~z~}|xv|z}|x~z}}|}z}y{xw}{{|{|}~y~|v~wt~}}w}~wyzy}{|}~|}|{}}{x}~}|}|z~zzv|||{~||w~s|{y|ywr|z}~vzr{z~}~~u|~|z~{}x|}|w|w}~vws~}z{}y~~~x{{{|r}oytvt|~y}~y{}|y{|z{|v|||~x{|yzx}|xw}y|~vx~txw}zp{|~zrr}}zyvwu~xyw~{}w|~x}|~v|{}~u~wzz}{}q}|{}||u}{yu~rw{{~}vy~vw|gyuz|uqw|m~x{wp|tmzvywx}}qtyvz|xzy|~~~k~wv{}T}u}rzzpz{x~tzxxw|zwszxxxxzx|u~z}wzxtz}r{xwxtvw~}}tws~xr}t}zzy~pyvyz{}ows~zz}yx}}wyvmzx}~u{}{vz{zxxuyqyx{}~w~xu|{~zwyzx~~}lws~~|z{|z{xw}~uzw{prz{|~~wszz}|}|}|{rjzzxs~|v}~w}u}w}sszr|z~pv{ivww{zx}|wwwx{|n}}uss|z}~}wwutxzlz{|}mp{{m||nyvu{ry|}wx{u}|y{|~y}uzz~~}wzs}~{|{{}|}y{{ztz~q~xy~{}v~|vzyv~z}z~{{|{y{z{||gsw~~j{}|~~}z|}}m~y}}nz{}|x{u~z~}{~}~~x||}}x~|||y|u{zx|}}~z~}}z~~~~p}}y}~z|}{}{|yz~wys|||}}}~|yz}|szwx~xy}y~vu~zp{tw{v}}~~}|}s|z|{~x|{vxwz}}t~||}yy~{ysyz~~~x|{u|yu~s|~}|u}s}|{~}||z~}}{w~{~}u}}|~~}{yn~u{y|zyvx|~{yuu~}|s}r}~x|yy}z~}||qz||z{uw~}|vynyp{}|~{}}pyzu|g~~wnz||y}}y{x|q~su~v|y|yzuzxo~|~uqy|}w|vxzvzkx|mtsuqxvw}}}x}}~z~zt~}~{lpw~}wz|~zwytyyrxjvyys{v~}s~|zyzv}ysqyz{tz~}x~s{|z{u|xy~}|yz}~xr~zy}x~~uv|xw}gzuq}|x|}ky|v~w}}{{}yqy}xpwzyzv|rxsgyx{w|qw}{hyyt{}ry|{z{syws}wt|{|{r|sopv||wz|tu{x|xzy{wxzzyxzwyz{}w}wjz}r{~uxv{{y}tz|y~wrr}{}t|tuxx{pl{qt|oo}s{ny{{wjz|z~pttuoxyqwrywe|skz|{{w~}}~|zu|~x}{}|y|~{xsz}vwa~x~y{|fx|}wwvy_wx}yy}v{y|vwyuwr~xx}zry~oxxuzw{z{}y}xq{wm~nyq~~ryy~~qpyot}~~x|yvuzz{vq}zw}~vw~ywz{|wyx{||{ktvx~lgnwyzyzy{hvww}ywwru|vyzryqrtt{~y~{ty}z~~|{||yqywx~l}vyr~t}vzt}{x}wzvy}ytywZ}rw~uzw~`{z{{zxvx{{~~~w{zzxmzzx}~}wzjz{}k{d{w||m~zugs~|x|{|x{}}~}v~ujyy{yr~xzxy~ks|y|}xxz}xv{xt||v}rx~zz{{yzy{z}|b|~~|xz{qpq|{{|xuvz|~}rvvxxzp{y}{~{iuss|{tuyy|||x~u~x~}~qlw{{{|x~t|}}~{~nz{vgc}|p~~u}{zxz}|u~~xzzvp|{}r~xz|pzuy}zqvv~~yxx}|x}yzx~r|oyxy}||{}w}~jw}|{{xxy|}t{{y{}~w{z{~~{}|t{w{txx~y~w{{z}{v|uv~||u|uzu}yoyx|rxyy{{z~|}z{y~{k|v}x{wz{|yvxyq{r}w{}{r~uvzx{xz||}xuh|K~zz~m}vzX|uz}xz|~|r|rozpxwy{y}p{}xt~{|~sy}zv~}xru|||~vs~y~s~zqrw}}urx~vx|wx}~{{~ku{~zmw~s|}}{y~}{{w{r~u|{ql~{yxz|qzs?|~}|~|ruzz|x{{{rx~w{{y|~|\yx}sx||wwz|rzx~~xz~s~|uzx|sw|_n|u|e{{yn}}p{~}||q{{z~{y}{{vz{{xrn}w~z|v{yqw{x|~}{}czzxxzzv~wzz}x|~|yxw|{xx}l{~{|ge~yw{qv||zzxyq{x}{n{~~x{~}z~xy}q}w|uys}n|wz}|y|t~vyy}r|xn{wx}|z}x{s~|~|{}|~z}xz|zy}ry~kx~|x|xyw~|Zu{~t~w{~}}{~|ny|~y|{m{zr}h~{~ytyznuy{t|w|}m{|yyyW~v|i{|uy}zzvt{}|~|oz{{~vtw|{}|~tzw|n~}x{{~}s|ux}{}}vxwrz~|t}}tzv|yyx}y}umvtywytzx~m{|~||}u{{~{zqs}|x{~x{w|xr{{zv|}o{|~{y|wz|||}q~t}z}|xww}s}~{~~vx~~{}{||~zz~{xv{|~|}zz|{u~~{uqv{~~y{~{yuxz}wv|~x}|{~t{{ysy||pvxy~x}`{^~y}q|{|{|}p|y|v{xtt}~y}~~{txz|y~~xx}~}|xut|}ryx{}zx~{r{q{~u{z{~}x{}rw|y}|{xtsp~|~{x{~zw~{~}i~rz|z{q}}~wyfzwy}~y}w}z~|z}wn|vzz|{{w|}|}}rw}~x~t~|~y|vx~|{yv|~vy}xx}~{||}|y}v~|{x}j}z{}u}u{y|r~ty{x~xyzyw|v}||uyzqywyyvsyx}yw}{{|zv}~k~}}~z}us{}ywu{zw{~y|zuvw|{yzz{wz||kuy}w~x|||{}}v{y}u{}|}vz}sxuuz{y}}~{xss{}}xxzq}{||wu~tv{pzy{ux~~yxhn{z~}v~|w||}}~y}~oypw|n}~x}u~||v|{}}}u|{y~z{sy{~}z~ew}u{{{~tz}y~uz|z}}~x{xp{zy|}{n|tx{x|~}|||~{~|rq{}trtvzztqvzx{yy~t~}}~twxy|q~~~}~|wx}|nzz|z~{}|}yw~v{vz~{}}y{xyw}{}{q||}x~|~{y}wu~z~}zvz{z}}uy}|ju}}}z}}~rsx~|xz~{|}}~yy~|}xz{~y|p~~z|y}}y}zz}x~}}}{}}~~||vzwx~}}~wvz{z}xv~{}}|u|r|}|z~}z~y|{t~~v{wy~z|~~~y{|}|}x~t~}yzzr{z~{||}xy{{s}xwyz~{t}{|w|yq}yy}|~z{|zqw||}y}|~~||{w~}{{||{v||~}~}}|~}z|xw~{~}wyt~vdxv}xx}vz{}~wy}{}~}~||}v}wqxy|s|~wz}}|z~|~|{x}}{~u~{{{|{x|x}{uw|}|t|{{~qzyszz}p{~z|}~y|~|w}x{~z|w~|x~{|r{|vyxxz~|tr~|~~|w|yywr}}~~q{x~{{y}{z}t~}||}x~{}z~}qhzkxy~|}~wu|m|{}vy~~tz||x~|}y~yynt|y}z|q~|v~w|zt}}}~|}yvtwz{|x~}uwt{z~}~~}{}z}}{n||x|}~}~{}x|}|yuy|y}q{{|{|{}{zv|t}zr}}~~~{~zxxy~{}vszwu}~|}uv}~|~{}{xv{y|||v{~}}|x{z{}zu|v{x{|s~|y~~{z|uw|r~|||tn||}z~y{yvrxzvz~}}t}y|{t|}wzt{~u|{yxxztw|v{~}zz~{z|w|vz}|o{zyvz}|zwy|~|{}}uvs{w{r{v|}w}z|{}||v||u~t~|yz|}{vvy|~}p{~xz||}uzs||}{zz|yu|{w}ymz}}}|xy}}r{y|{zyzn}|ov}|~|yr|yyxy}}z~|~}y|uu}rw~~zzzw~vy{~~~|xy}yzzytz}vyu{}~y|}}p~z|||}x}v~|x}z}xwz~t}w{}~~}~}x|||s~{}s~uwnz|||swtv|yx}z|~|{{|{|}|~~nw|p|uxzvqv|s{}tx}y~uw|~{{~|}vt~xus{xz{||z{}|{~~ly|}ry|{}~{~{~{|{||}{~|z}w~}~xy{~y}z~|vuz|z|u{{|}|~}{ypv|o~u{vw|}}{yz}yv}~x{w~yz~|}}|~w|}|yw{w{~~{~u~zy|s}zz|{|qy{{y||s{wz~~{s}zpw|{}{x~yxxwz}{t|zyyy{|~{|{|}xxxxz}y|}}||~z~tv|zv|{`uw}{~~|v{vzvr|z|||}}}{t~|u{yvw~{z|uy}}vzw{y|t{zv~}~~{|xh|~xxvvz|u}{z{~|{{z|{v|q}{yz}t}{}{||z|n}v}~yrzss~}q}{~y}~s|||q|z{t|}}y~||~tu|xz|wxz~~txyyyw||zxx|t~{tyx~q{{|}}z}yz}x{|rz{z~or~|{}v~y}}vw{{y~~}zzp}|zsxp}}}pz|xw|qxk~uu|}{yz~~sz|}yzz{js~{y|z{u}vzqxxzz{v}k~zz{zz}|{{yzu}zt}z|}yy{y}v~x{zu~x|z{~z||yy~~~}|xw|x~|~y}mw~{|t~}s~zx|y{~|z{|zx}uyx~}|~ul}uy}z{yy~~y|z}|yuzz{v{su}{i{}||w}sy~zv~vxw~{y~|u~{r|}{~oty}yyw}}x{|{~}uuxxx{{zy}~}||z|z}|~}x|o~~{vtz|}rym{{z|yvutuy~yz{{{et~~o||xwrwzzp}y{yxx|~{}|}zqsyy~}xu{zqv{y~v~}}s~yv{z}t~}w}{ntv}|yy}~{yyy|}{x~y||t{{|{{{||~{qmwsr}w}z|uyt|{zy|}~}t{wx}}}z}w|vt}~w{|z}{tu|~z|vyv~|{}}|zyx}v~}{~z||w~}}vrvu|{|y~yzzz}}}}nv~|z|||x~tuu}~{{y~zvy|~~|xs{~{|}}}~uu{~}q|z~|{~}{|z~y~xv{wwzy{t~|~vy~}~{}}ywv~{~~zwx{w}rt~p~s|~t|xu~{w{~yw|y{x}}w}|~~yy{w|suuw~|{xzy}||q}|}y}}}uxxs|yvz|}ys}xxw}tszz|y}r}yxy}~|ot~wzwx}~twzy{~u~|vux~p}x|yx}t{~~|}|zzxv~w{~~||qx}t~|vyxt~w{}yw~p}xwxy~yu{zy{}xpxv~}|~q~|yz~||w}|z~x}x|y{||wuuj~zz|w}x{|yxz{yz~~}{~{xzq~{}|y|||{{ux}~}|{}t}twz{w}z{|z}~tv|~~}}y||~wuuy|}|t|y~zq{z|{{ux{}z{z|x|zzy}x{xzx|~xrrzx|wt}wt}zy||}~tu{r~v}|}}{zy{yzx}yw{yox}~{|ws|zxx}{yswu{vw||s}uvrwzzz}|zpy}z~{|zzywo~{|z|~}|{}m~|{{{z}r}}}|zqyd}u{{~zs~xy{v}~sy~z|~w{~yrxzuypyztu{}{}v}|}{z}xys~ys|zv}}|vy|zuzx}tx}y|{~}ry|}}tx}z}~{ty~y|x{}|{}~zr{v~y~z|}x~}s{z|wzx}~wx{}wx}~z|zy|{{}}xzzz{u|wx|u|z}s{z~{}|~{}|}~ux}t~z||wx{y~}z|}wzw}yvzzrt~{}y}wz~yu{wzp|{yq|w}}xyy}uxz}zwy}yzz~z|}~t|~}{{z}xyrzux~}ux}|zx}zxz~w{}}~{x}}{}y}u}}|z{|{x{w|~}~~}yz~v~z|~~w|zx{}z}{utz{{|{||{}z|~{~|~}o{|vvyz|vzywq{w~||uyuz}{v{{{zv{~|z}~}~zw{s}x|z|tx{x|z{}x}~zw~~~~ywwu}}yy||}p|~|~u{xx{ytl{|tw||}~tzozv~|yz|}tz~v}t{z|x{n~~{|v||y~x|}~z~~{|~}~yy}~vvuzz{{{zzyw{yi~z}x{yt|~}}~|~~x{}||zz|{p}w}v}xzwv||||{{s}ztx{y}vuyw~~p~uvwww||}w{xz}~|zzv}}xx}{z{sz~x|w~{{{uv}y}t}{~~~zyz}~}vzyumxx}}tytwv~{t}s~|~~~s}zwpzwz}~~~}~}u~u|~||~szzuv{vzyxx|y}{{|~|ucyxtpx||v}p{xq~{wx}{~{~z}{xvpu~v~}~}y}{uiywx|{~{o{y{}z{x}}x||u|t{{wvxz{yyo}zsyu{~xyw}~z}u}}{zy{zt|vy_rxwz{|sw|}vyyxtzy}trn{y{}zz}|sqxr~~y|v||{u~u{zjrwwt}zyz}yz{wzwwp~}z}|txw|zvz{}pzwx|x~{q~~xyxvpy}zz~ug}u|{|~zw|}r~sy~S{~tyu{zlxyv~{|{|{vzyvvy|[xwyw|xzyt}z||x}}{{}xv|xwyvysr|wz~{~v~y}uxz}u{}qtzxy}}~oy}|}xwz|z}|yy|wszz{|}}}|x|zuzwt}wx~tu~{vz~z{t~|~m}}~woztzz}vuz|}pu~xt|z{j||~{s}{yur|v}my|xpyuw~}~}|~zw~a}z|tyx{yuqqK~}|}}|zyz}tx~{yz}~xt{|~~ysy}~}~|{z~||wnw}~s}z}z|~{}z~{p}~~~~w}~|~~~v}w|nuy}zz|yv|uyzv|{yt~zsyz}zyp}w}u~o||xp}r{w~}}u|{~|wvrztv||{|{{~w|xyq||o~~~xz|~}}k{v|~ym}}}{ywz~}||~~{xw|xv|{}|}zxy|{tz|xs~o~}u~~~~yp~{|z}u~}i||t~~|}|{{}sz~|~xz{}~{}{y{|v|}}{s{zuys}}yx~|||zxz}|vv|}iyxyo||{~}xv{~v{~{zy|xxuxx~~t}|{x~}v~~w~y||~}}|z~||z}x~~zx}vl|~|x|tw|}w}xvr{ssuzyw~w}z~~}{n~~w||w}}ty|y}q{{~u|i{|~{t~}{xzz{}q{t}{z{x|~||wx}}zy|yq}||zsy~x|~yr|vyws|{ww|rty}|y}~~~|z{}~~y}{~~}~y}vz}yzq|}{{||~}~~|t||ws}r~v{t}}px|zv}~}x}{yxzwzu}zszoz|~{}utwz{jtt|yyxso~}y|t|}{y|z|y~|wwquz}y}|~|w}w|{wyutzyv|~v}}z|wu{z~~y~}|{zs{t{{{|vz{vx||vx}~~}}y|zxz|}{z|y~|z{{}z}{{{|{~xxzw|yw{uz|}{uw}~yy}s{}~|~uz|~}~vzs{y{{{{zv~~vz~~wywpzs}}|}{~}y{n~yw{u{z{|w|ruz||wz}vyz~vxxw{{}t{p|~|y}{}z{y}{w{|y|ry{~t~|}|}~{yzzv~{xx||xu~w|z}}tuywyps|||}{zt}~vzv{}{x}yuy~yz~x||{{vy{yx|{{|}{y~{||xx}z~xp|tx~~~t}}ox~w}zu}}|vz~y}|}{yzw|~~yqy|}z~|}xz}|yzz{~z~~z|szuyz~}{k~v|w~||wx|y}k}}yz|{v|wwvr}|z{|~~w}|y}{uyv{y|~|}z|}p~szzw{z~}ezx~t}~uol~{yzty}{|{xyw{vy{zx}|}tyv|~~}zz{|x|{r~|~|z{x{y}v||xul{w|{{{z}xyowx{{}{y{||w|~l~v~~{v~u{w{lyw}x}xw|x{}xu|zx{~~st}{xk~{s}ryu}xozur}v}u~}z|{v{y{}v~}xv{}z}zwzp|usy~s}{zlzvzx}wy{{}wr|||y}{}}w~|~}x~}{z|xz~~{~|}z{sw}p}{vo{yvi{~rz{|xt{}{xyz}vss}{w{zxy{}sq}v~w{|{}|vwy|z{{zc|zu{~{ytvxutz~y}v|qx~u|u|}|z{}{zryoy~zycyx}uu~~~|xs~l~~w{y|{|vuwwz~z~{sz}{v}yr{x||}zvtwkvv||w|zz{zh}zxxz|ty~zxwt{y{{~|{zyn|zry|vx}z~{y|{s}x{{y~yyhux|uxyzyz{~z{w|~}u{~}~}v~{~x}{q||~}w{mxu~}}z}~||z}}{~z{wx||x}~~tu{ut~{}}u~~~}wu{~k|v}xtz|{z||~xz}zz~|{|z{pyzy|w}{t|y}xu|||x}}~z}|y~xvy||~vmu~}yw}ryvtz}~y{|}}v}~yyztu|~|xyt|{vx|yx|z{||t~u}xy}}w~x}}xt}|wjxxvz|{}{~|zz||}}x}ezut||t~wwnu~l}}}xyvy{rtizxz~u}~z{~yvl}{z{|{}|z~{||zz}|||x|y}zz~w{~x~{x|~y~}zu||~z}{y}zx}}u}~yx|u|x}v{~xzzz||z{~v~|}{~|}~}z}~{y{z~oz|{u~|{y~zy|{{}|yzxyxrz||}x|}}|}{}{uoyz|{p|v~zy|znz{zz~yxw~||~mzv~|y{~y|}{y||}v~y}{ty~t~t}{x{z}}}}{}~qyyx|}{zz}}xovy{~}uq~{}}}|{v|xv|}}~~o}~{z~z|vx{~p{~sy~{{v}yx~zwsz{uyy|}||zz}uwy}y|x|zy}yxy|yuz{y}w}y|ww{}prw{v|v~zu|{}~{rz}~z{vq{|{}{~txy~|~|zzz|{z~u|yyx{{|y|||w{y{{|{|zp|r~xox~{|u||}|~~q|{tx|}|{}zxv|r~w~xvmw|v~|||~z{{ru}x|~tvy~z{v||}}~{|s~}yy{|~~z{}~u|}wz|sx}{|{ux{z{y~t~yu|[{||xt~}}}~}~~uy~}~|z}t{{{~~{}zu~~|zyx{{{}~}zrw|y~p|}uq|}x}~}qn{wy|zwnyxuyywnw~}~{~y}|~ryz{{yzvxyry{~}|w~yu|}|}z}|y~~z|}|{zv~z{~~}}|l}q|}{{~|z{xz{v}}z~{||{|vzwzy}wy~tzwyx}|y}{t||{}{}~vys}x{}w|{y}}vzw}o~zyzn|w||q~y}|~z{}}{|zw~z~~{~{w|v~svy{|{y|{xx~z~~tw|}}tv}~}~{~{x}w}~p||}|ns|tsx}~~|}}w}pq~~szytr|~u~~|{{~||y|~oe}v{}y|t{|zzq}{o{xz||~xz}~~w}~}wyzwy}y|y}~~}|xv|~s~w}v}uxwyy|||y}}}{}yt}~|~}xuy~y{}|z|{}{n|}|}v}qv~}ytv~zuu{~~zwy|~{y{{}|}~|s~}zw{ryzz|z~yx|z}x~r|||z|zy}l}|{y}zz|{y{ww}uy~w|q}}x{yy~ky}{wztqzw~y|wvz~htrz}~}{v}{|}smx}~{{~ve}z{}v||~v|{{|yv~{u}|{y~ux|{sz|{|~t|~}{|u~yuz|v}yv}y}z~{y}w~~{||wyyy}|t||y|sz}u}~~}zw|}uxzz|zYws|~y}~y}{wy~yvxsx}{x|yz|~i}{}u~|z~zs|z~uy|~ytz}rx~vusv|zz~rx}q{}ֆx}zw||{}|~}zs{|twv|~n}yxyz|~|wxy{}z}|}~xywz|{|v}~~}}|}}y}{svyx{w{~x{|xuz~~t||zw}|pQt{{yv~~yvvyy||zx}vy|w~{wxy}tzv~w~}txxy~~E~{~zwx{yyytuy}}{zx|yzx{|yz{}}r{xs~x~~{z}|x{|x~sz|~}x{w{{|~{x}|v}|yy|{}twxtw{|lx{w|ywtpl~v}w|vyzzzxz~~{r}s{y}x|~{qw~sw{q}{|yu}~z}~u}~~~|}zy{q~x~~y}s}yzu|x~zy~wv{wk{~uywx{ky~y}|{xy{v{zx|x|y}zz|vzv}wt}|zuz{zs||wq}zz{}}rs|v~wz{zxxxuy~{{|z}|~~t~}{~yx}x}{xzv|x}{}{yxv}z|w|{x~{~|~yy{yzww~y|}zv|w{|~z~wz}{}|z~}{xyz|{||z}m{w{~}{yztsw}~yzw|z{toxy{u}w}|~~{|v{zz{wypy~|t|kxvx|pz~{{~{}|zx|{}vmy{|ziw~zqzv~z{~{~}{}~wyv~zz~xyxy}yt~~x{yswys}z}{}~~}}yx{~ww}|x~u|}}{||{}y~t{zt}~w}y~v|}zqyn|z}gx{{yz|x||v~z|z}{y||~uvyy|vuy}s}|}woz|yu~y|k|wsfvw}y}ud~xwwywxz}wy{yzykxyr{t||zu}x~}}}xrwyz}w~||utz}xv~zq||zx|z{y|{vmru|yww~rwx}xzz||z{|yxn|{~ut~{q{mox{}|~~qi|eppu{wzzxz~zwzyqrx{|p~}~uzyz|oyu{}oryqzz{|zusrt|{uqt~}t{z}~|{|wv}~p~yvz{zo}p}ztm{z~|||wx}{xwkyv|}yw}w{yyyU~~|w||unq}q~}~vx|zqvozwx~~}sp~|ywn|{}~{}vhrxzr~~{zw{b|w|vsv|tzyy}xxtu}t{}vtutu{t||gu|||t||kzxzow{r{}|pyuvv~svt~}~w{vsuwvt|~zeyrxy~wYtuw|~{w~my~xl~}{|x{qw{{}vzy~~z}vz~z}z|v}{ty}v~|}tz|}lt{zx}v|y~~}zoxz|z}||{zz{|z|}}}zw}d|~~|u~oxvwovt~v|wyy}m~||tzy~|vv}|}ttxxr|}~z~zzz}y~||||y|{t||{~}|zs{]z}~{{twu}{u{z{or}~{z|~}}ut{lyzyt}s}}~hz|{t}x|w~x|z~xx{ty{w}tpv|}ry{y{~~{yx~p{x~zu|p||}}z}~vzjv}|}|xxs||wrtpqyy{~rzzyxzs}x{{tz~yz~}wy}z~}wwcrt|wxv}~q{|n}r|~{{}}p}~}z}}|}{z~~z}|u}v~|w{{y}}w{}z}}w|zsy|{{}~y~|ty{n{~{|{|~~|}v}|lp|z~}{||x||srq~}x{js|x{r}{~|zmu|}}}{zuxy{}{x{~}|}}~{||{{ww|y|~}}|||}||{yy|{vs}v||{|~uv}|q{xus}r{}w~~xv{zu|v{}}~i}}z}}~~zy}}}}y}||}~|}}xzvu~u}xy}}pt~~}}x{||{r||}lxw{z}}tnv~~|}xyw|~|q{zz}y{|~~r{xxs~x{xzx|w~zz{{vuz{||}syzyt|zx{}u{s~n~|x|vyxv|z}}{}||{}syv|yuqz~~wz~uz|yy|~}{~{}t|u~|y||~~~x~x|}}|{{{tw||~z|zw}|y~xwx{x{|yxsx~{sz~u~|}p|~}~{}tx}{|{{x~}{~v}zw|z~zn~}{}|yvxy{}{yy{zz~w}xzj}s{u}xy{zzyzztut}w{~zp}wx~x}}{}|z}~{z{{|~pt|zz~~}{|~z}z~wz|||~~{~~{tz|w~}}|}}w||u||oz|p|zyw}{~~zywyyzx|}t|{{w}|x~u~y~|{~y|z{{~vw{wq|y~{r{~w{~{}{|t~{|x|~}{z|~zpzz}{}{uzyz~~ny|xwyw|~{||zy{|{|}s}x~|~{~rwx|}|z{osyuw~xxxq|z|z}|~{~tzyvw||~{{vp|}~~|xxx|}||{v~r{hp~~|y||{~{|xzyg~}{x}{}mw|~ywu~}~vwz{yz~{~{~~y}|~wj~yx}{|x{|}|yty~r|}~~}{~w}z|q~ssp{~z~yx~||||w{{w~~{~}zzqw~yx|}~|r{}xy~tv}y}x}ztv|lxz{yy{|}|~~zx}tx~{w|}}y}w|~y~zvuw|}~l}z~v~y||{q{y|~||iy|||zw|}|zu~qsx}|}|yz}{}x{|~}yxw}{v{{~zj}|j~s|}y~ys{}y{|uxrz}}}xw{qtut{z|{|}|{z|~~{~z|zvz||us|~{~wzm~}{~rv|~}towjs|s|tx~yuw{}|}|yruwz{{v~}r{}swt}}ro}zt||t|p{y|{|y||zm~zwyr~{}u~|}n~{z|}~|~}xwuox|~||vz~~z{wzzz{}wwt~|sxu}}hz|u|v}u}uz}|q}}x~{zxo}{|mx~|vt|y}uyx}|wxqvw{{x~v~y~~`~}{}|w~sx{}z~~x}|{~z~{~~vy{wz}z}y~{}truvv{y~||xq~~||yy~~{s~xvvyuw~x}}~|~vvz{{~~}y~x~oxxlz|}z|}|x{}~{{|z}z~yv|pui{~}zzxm~u{xm}~w}u{|v}~x~z{xvx~k~~v{xz{v}|up}{y}~z{~v{|u~wzvwoz~}|t|~l||{|~}{||x|w|}vzz{ww}x~~}}~~||}zytz~zv{sw}~v~|s{}}~|{u}|~~}}{~vwu{|~{|zyz~}z|t~}x|x}~zy}w~}s~}{t}|~||}zw~{|{r|j{uy~~z}}~z~z{}}~|z}|{p~yr}xyxw{|~xsux|u}|}{|}z||pm{yy}ywtt}{zt{v|y{{zw}s}|{~~|v|{zr|n~{z|}xv|~vh~|~~|z|}{w|}y~zzp~w{}}uy{}o}~wyo{|vx||~~qz}|v||z}yvz{}}~yxo|yy}sz{}{~}ti}w|zwvxz~yytw}{x~xz~|}|~y{{yx}z}~~wrv|tx}|w|w}~{y|}y}||~}|}~~}z{z~s}x|{qxz{|~r~vy|zy{~vy|xyy}s|uz{~~}~vzz{}{~}||yov|l|y|zv}y}}y}zyx}xz~}|y|{|}xy~s~u}xz|~}wx~}{~{vyy}z}{~y~|w{x}{|t~uw|z}|~}vvyyx{~{~|p}{~|yyz~}s~y~xx{}}zx|}x~{zyy|z}}}|~{}|{wsu|{zxvzj{|}|}~{v~x{w{}}}zyyyx|yy~wy}|||ryt{|~yx}|{|~|{|}~{{{xm|x{~~|}}~yv}}~}{t}|~}}|||z}~|y~~||v~s~yy~}~~|z{{~y~|{{|vyv{|~||w}}}zyzwx|z|~z|x}v~{z~wzuo~y~{~z{wv}|~y|~yx}}}}zzv~z|x}uu||}xy|lxuz|xzxv~vv~}vy|y}}||~||~~ywwtx|xv|k~{wszz~x~}|{t{{}w~~~|{xwxxr~y}kw|{}{{|{y~z{zwzw||tyz|{r|~x{o~}}xux}|r|usztr|{w}}}zx||t}zz~~x}|{uv|}zwjyo}}t{{~w~}zo|x}vx|wouy}{{~v~waz|||vryfs~z{|}x}o}vuy~x}|xy}{xr|zwrt||}v~wx{{~twu`t~ztx}|~|y{}|u|x~xxz~||~y~}}z|||~|uor{q{xv}vy{zzswtnyy}yv|zry~q{u~z{z~}~{n}vr~}|w~~{~~}m|t~s|x|{~z{|fx|}~z~zuzux}|{{{u|yn}}|v}~u~}t|u{z{|kxp~{}{zy~{{~|y}}{|zzuws~}||}}{~}xwouz|z|}|{{||x|}vywx|||~||}x}uv}|zyvw|}zw}|sy}v|~x|{x~|}|~||{|xz|~y~~~|z{x}{vy{y}}{{~{v{{~}xr}{|{j|~~}x|||u}}y}}{~u|}|yy{e|xu{v{x{~z|}|x|}|~z{}|}|p|~rw}v{~zzy~zt}x}v|}~w}{x{s|}~zu}z}{|z}}}}}{z~xzxz|{zz|~|}|x|}uxw|w|xyz{~{}{yw}}|wm}s~}yyz|sw~{{~zny}|y|xxzv|{~y{|}z}|{~{}{{{zz{q}}{z}}t|wz|~yi{}zz|v|u{~|xzrv}~x~x~vu|x~~xw|}vz~~vtv{}wzo|||xy{l|twv}~}uwxv}zw~~|}}}}~uszu{wz~}vzz~qx~u|o~{||}vxt}x~zmww{vx{yxzyvyzy{y{~z{}|{~~|y|{vsvt|s{~z}}~y}~uxv|z{|{t|uyz||z~{|s~yz|z~w~zzoz|xz}y|z~{}|v{}}yp}{}zwrw|svu|}o|x{~|}}zyxw~z}yu{{s}w|z|vz{zyrzztsy}pt~||~w|vu{{}|e|w}x~{xt|zw~y|zuts||yxspx}x~|~qt}zy{w}xvwx}w|{|w{q|o|uy~v|xlj~~urv~{x{|}}zs{~twq~z}{wy|wv}y}}~wuv}|ty{}q~{}{t|ovz{zx~yvzs~wxxw{|x}xz~|~{yv{u|r}}zw}yzx{yw~t}q}~~w|qxlvzzz}||~vuy~v|~}}{{|{zsv{us}r|yg||}sysr|{}~}{}|ynw|t}|~v{a|~v{vxoxyt}||w~~q~v|z|~zxv{tup{{zmzv]zywy~z}zvuwt{{}z}}x~wu}ixvtz|{t}u{|wu}{v~{qx}~zqx{w{p~x~~|z{|sz~zzq~zy|}~u|}n|yx{{}|s~z~x|yxz~w{wrzyt~{swv~ywx{x{tyy}o|}}|y}}y}~{p~ztxww}v}{u{xxu|t~|nstx~t{|{s}v}}uy{{{_zs||{|||}g{}~y}sq{}}~{xzsn~}r|w}}{|~~~|}|t~{{xtz}||~||uzx{||zq{~p|zx|xz{wwswx~}zx~|kj{}z}|ykwv|~z}ttv}wz}uy~~w|~y|x}wry}zul}{}|}vwtuywxy~{y}}~vyzzywuyyx{wx|x|q|}w|rwysoiq|zzzz|yyxx|zz{|}yvw|r||{}zsx}v}o~xxx|}|z}vvvy}w}}~yv}{~}}|yxqx~}y~xy{||xyx{xtwzw}|{y|pr}}xs{pr~wxt~ww}{{{~v~r{s{nzuswy}}yz~|y}zlzz|}oxruyV~~~uwxzwr}|xp}s~zyuu}sz}}{~}y}~~q}z~ysv}v}~}{{|~vz{z{kn}~x}}~|}~vs{rvz}||{|x{x}|o|gtmy|~yvxt}|{x~||d|v{|||~}}qpsq|{|o~~z~|xv|utz}y~ny~}wy|z|~~~{y~|t~||}}}{}l}}}~}|~{{z~y{z{ys~~u~~zvy}xwz{z}|~o||{|wp}zt{~}~|xz|~{}{}vnz|v}|~~{w|zwz~{wnmw{|}{z}||x|{}p{z|{}|~}{}vyw{~|~y|x}zy~y|q}~|||}y|~}~|}|~oyzyx|~v}{|||syw}|tz~yuz|ky|{|{}{y{tz}}|~~z}||q}ux{~x~wv~ymtz~{}Yup|o|y~}}h{wx{|{x~}{|{{p~zwuwxz|}{x||mxpyyrw|^{w|p~wwz{yuu}wztw~}s{ywz}{xMr{~~~|qxqw}y{a{~zz{st~~t}|{yxx}sq}}o~yywywx~z~|ux~v~y{}x}{w~{~urxptz~~{~z}{{v}y{j~}{v|}w}z~rymwxw{|nq{y{}t|vwzzi~j}|||jw}{}qx~~|y|v{wx{}t~wyz~p}}|z|z|xt}|u}y{|y{zj~xxxywvxzz||wxyywzj{z{}~yu~}~~yx}}jfryulqxr}t}|{{x}s}v|{{u|r|x{~w~|}~y}{}~|lv}zl}u}~xx~|~{zzp|}}|tjy{z|yyv~|}v~uskty|m|w{~{|r~sxx~}|~zpyvx~t{wlzpzzpz}ix{zx{{|~{|x||xwvutxw{vz~rpsthyw{}xy~}zq~{zs}y}nyx~vyx}t|~{yz~ztw}ynz\wul{z~||uw}|yvxy~y||}t}}uvpvxm|vvyxqqszt|wux~f~r|{g~~zvs~x}~tup{x[}|iyt{||y|rzw{lx}z{}uwr}{|tx||yptzoxu\~xy{|g}u}~vyy~~jbxq{wx}_|x~~x~}qxvuyk~zq}{t}}zvzyxy~{vdzv~|rzqnxtpy|v{txv|~z~ozvxuzw}~u}||rw}z{|{x|{vo}|{yuoz{gl{{u}~}{v{{w~t|}u}p{{}}{|||u~mw~|z}}~}}|{}~~e{z||v~}{{z~w|}sf|x{{v}{|}}~|u{~y~}}v}u}|~zvz~k~xop}y}~}|r{zm~ux{{{~~y|t|pww~y}~}z}|u}uz~|}txxwv}{}~~zvwyyy|x~}w}{{}~u||~}z{u|r~}|}xt~|v~y|}|~}{p{|{uzv~uzpx{}~~uz~{{y{y{~}|itt}}w|u|x{p|qyvx|zy~~||}}h{vy~yt|}yu}}~r}zyz~nnw~wy}{}~zwo~}}yum|}x{}{}z}}~r}}}{|~}v}~y{~s|y~~}v||~~|z}|t|||yz{y{}pw{}v{v{zxs{sw}|z~~zys|zvztt|s~|yq|x~~ztszz}vr~hyx{{xy}u}|~|uz~~sy~{{u|}vxzwxy|m|v|zvyw}szzvtw{|{}z{|w}}||}|{yywz}}y}zw{{zz|y~}~|}wx{y{~z}{{z{{|zs|p~yw|u}||}s{u{w|wxww~~~~|y|pxz~w{z|zxxo{y{z|zx{u~~xt}rv|yx|zzzp|wwzz|}uzy}s{xx|xy|py~y}|xw}~}|}}{x}{}{|~u}}wy}{~z}}~~z}}}z|xy{}|y~y~z{|w~{x|~{~{yw}ww}xvzvtxx~w{x|}}xq}{|~z}~{{}|r~zst{sux{p~yz{{yys}{yw}y~}}|}}}x{wzv{ozsvvyuu}}yz\~y}y||v}xz}~r}|J|wzyl}}jysvytywzfz}{vquqti{{~|zpzsx}ry{~xyt~y~x{w}}zzy~x}wrzw{~{}xr~~}zy}zuszvzy}x~wyy|x~w~x|}}s~~zwy|t~gxw}zvz|y}z{{sx{y{yxrvwy~~~{q~{}|y{~Rrrx}zvz~{~v}xz}uyyy{~~vYjy~xy||~zwvzwxrx}u}x{vuy}{~|zxq}|}{q~x~}|}{}nxxxy}n}zvq{vs}zur}{~t~|}~|~{~v~}}~w{}{~~z}wx~|z~:}{w|}u}y~z}x||z{xu|}u~fyviwzuyuzq{~}~zyzy{{tz}ypw}pzy|m}{{rz|~}~\z{tr~xzz{~y|wv|~ow{|y|}|}yzr{}zy~|uz|x}~|qy}vx||z}~wz|~~}xwyx~~}{rw}w~{}|~~|r|}{{sy}yt}zyx}}}~{~~{n~z{|wy|{|}~y|u{|~y}}|~~sz~y~~z|}t{~vwx~}zzxt|u|h{|~{|{z|}w}|pyzys{ys{z{wwyu~wyyyu}~|u}||||}yx{{{rv|y}}}}y}z}v|}|}}|{{}z|}{}}ys|~}~||xtx~~~py|wyzqmyxyyv|zt|||~tl}zzzx~|{|zr{|{{ut|st{||~z~~}wyy~uy{|{|{z{}z|rx}}ww~|~zoxr|{y}|}x||y}~zq~utw~v~||yy~~|}y|}w}}t~~}~~{|x~~}{w{}~r|~{}y}zz{o|y}~{}y|lw}}z{n}||||~z~z}~w~txztx~{~~~}}{v~y|x~nz|t~v~z|x||vy|{{y}~~~z{yzz~|~|~z{yz|x{|}|}|~yzxxx}v}|~~}t|x|t|x~}}o}}zz||yy|~{|}z~{}}wx~w{t~}y}x}~yy|~z~|yszvz~t~|z}{x{}|y{l}}}{||~u}zz|wx}~|w{w~~{{~zy{{|xot}{x|~w|}snu{vy|y~y}yyx|||}yy~}|||t}z|wz}zix{~z}y}}z{||y}xr||{}{|{tw|y{}p|zz|r~|{x{{{{yvyz}{wy|{|xw{zz{yu}{|z}y~}|w{}w~yp}wuw{|}yvw}tq}|v}{z|hzz{v}|}|ww|}~zz|}}{}|~wxy}{}~y|{}z~{uoy}~u~yyz|{|q|~qwswz|}}x{z|y}}{|zxxy|sy}zw}}ryz~yywz{|y|wxv~ww|tv|w~xt|{~u|}}z~zt}xq}z~uvzu}|{}x|yw{{wxy~zw}zvx|x~t|~yyx|u~yu~|~|ywxzy~zwu|{~|{yzy{~wq|}vqw{~{|z{zzzxz}z}r}~}}v}}~}~p~y{{{wt}sz~{}ww{~{yv}}y{{zx~{zzx}yyvs}{x{{~|}vyy}y{}rruzx~~z}|ty~uzxy~y~xKd=|hpfs~o,|XiV\l|p`wfpo1o`qzD_c]meK~KxvdxwBnuÇ[vht_^vKLlOfg{gm|byZpUngzn|b~t|s~zrhkujleiIiǩV|XsUSØ^mvtsLlg~ˏ}4yqYHWES~ImdrbkvoQUmExqysy`Ca^Tcx6#]ypf=|G~Fy\^Z+%og}{bd.vffɞiu{|`lmRboU]tqkvkvu_oV!dxrk|Y[I}`:wyyg1<]1uepca~f\gKIùqtj|]Û}s}xzxz}}zs|}|{}~|y~{wsyxzx}w}{|qt{}x||zy}v}{}uv{{{|z~{{z~~}~|x|wl|yx||k~p{~hvprqktowv~}yy{u|l~xsxu~~|y{xrz~x|}w|x}|~~uy~yrvmryyw}zptw~|t~wwy{}cy{qwzr}w{szuqzikoiu~s{s|g~{΀t}~z{yvtd{jwtxHmu~|{||{||y{xtuvy|_z|{hvrx{~||z~{y~~{||~}y|~{|kmzzw{{x|ws|t{ykbz~xrzh~|ym}wyu~wc}yezo|~t|}~n||qpz||~~pwlywxpwfp{~mvw}pj|sv{~{iyzvu{~wyzzzsyu}~ky~~t}s~{~|u|vt~}xz{l~q~({u~xxyvxu~wz~~}r|zruq{~syl|{||z{~~|z|y{s~}{~~{z}||{y~{uu~d{n~iyyq|xm}y{kku{}z{vz~{}}}w~|zjvx}|{|xo~fza}}Ut}~{yNyh|}r{~}|zz~{|{r|wv{vw}FtD}}zy|w~~}y{~~ww}z|{|~y{pw~{qnuy|ry{|w~s|}~r{z}|~tx}wv{}zm~~u|}}}z}}~{w}w~uz|{|l|}z|rzs{~xy~vtvy}wt{{|z{~xxx~yqy~v~}}|~~|{~wzy~|w}r{fu|~q}~|}{~}rsy}}{~ly}]||w~vrytq~zugqz~|jv}|~V_~wt~~sx{t~{|sL}{z{}~~|zyw}~}v~n}|x}o}ro}nwz~r|{z|z}|y|~r|zw}{|}|w~z{mztyj~v~{tq{{x{{|~|~|r~~}ws~w|z{|y{|z{{~{~}|{v}{r~}}|s~~o{yvz}t}~xpzz}}y}ulv}u}z~w}z~}}u}y~yz}~z|{r}{t~}e|{}{x}y|}m~q`~}xq~yjs}~~vxq|q~{tqp}{||zxIwat|}qx|||~tTvs{}xy~q|P{}oa{}wV{x}{~zw{rfu~|||grz~~u|{p}|x}p~~zxqzr{~|x||~~or}}y{~drx}|~t}}{{x}}|~||vgqqyjbik`Za{njkc_Xc\nx^jb^hfoviunmy}i}iLjnq|bk`fbci]nnpe\elhl_cdcciala^yx]aizoppqpgqaijotq^|`_\ema{I{p]z}sn|cifg~}s~~|~}xv~sz}~|tyxr~}z|tu}~f|zqrt}}}{z{}}t}}|}uz}yx|}|}~}|~{y}z|}{r}~w~|||zx~zy|z|{}}~~|{nv|{{y{swu|~~}~w}xw|{~jo~~|}zzmx}{|v{~{~|x~ws~}z}}z||{v{|w~x~sqn~~{y}}z}u~v~{~x~ws|}nglgvy~|~}}z~n~}yxv}}nr~tq|shzx{~{vow{~y~u|^|{~z~xzyy}~~z|~w{w|z}zj~yhf}~}~ory}|xqyysz~~}}x~yo~g|t~~|~ql{}~sk{t|~ja~zzm{}]o|~u~wvwZ}~}x{}yp|ro}x~~x}~^hnzu{~y|}~~}z|z~t~xyt{~xksntmy{u}yzs}xz}z|y|uvw~q{{p{xb{{c{|h`qvt|aoktzy{~|s}zkruUmiyxwzx{shzlyio~~~ffy~y{tt}[io|z}zz~uks|~m|~nvt~~~}~~{swy||sq||opoxrx{~lulmy}|}[}u|z|{{z}{}tzqz~||~yh{u}}{y|yy{hx|lv|~xy{sre{pz|jpk{~s^~xm~}|ly}zz|~zj}r}w~~~tzpzs|pY}xf{rv|~ywzz}|{~y~vsq~~}~xqyz~~}~yxzzvx{|u|}xwzz{j}~|ux~~xz}{}oq~yu|{zvry~zzz~wr{typ{}uw}tt|s|z{~qqxxxk~uztzli~m|ukluuwx~}t~|y|zq~~v~~j}{~|z}~u|{sw{w{|s{~{t}}yqz~|tpj~qZ~}sirz~{ykuzzv~tz}tx\}~]}\ivgzq~QozsZL:gz<{{~qqxx}oezUw~||o}~}{~vvrq|wx|na~x|y}{ix|{u}z|y~{xv}~~xwxy{|ty|z}x|uzy{x}|Xsgw{ey{{}ti\|mMvor}}p~~w{}}rO|wu~}w~ysvw}|zy}{w|}v~y}{zw~y}~}|gx~py{xv~}|~w~}~}x~||st||}gu~z{ixy{qz}|zxv|q}z|}|zn~xs}p~t~y}||{q|zs{o}ss~}}}zyszzx~~zowu~~ypvlvxzkY}yvxp~}t|g}{~o|a|}|lqnotou}jmqup~|t{ypzvn|tpxvxvyswvwpm{zmu{p{|yytsyqqo~~u~|||~mvh~xs}z}|w|nw~|{|uz||xz~~~}|z}~z~}|~~|~~{}~{y|{zyz~wz{}z{}y|~~y~~{s|{~}~~ovm^|}}n~qs{}x}xy}{t~~~~}~}z{z{{~t{|x|w}~{{~}x~zw|{z|uitt~smywtx|~}j}r{un~yxn}o_Qfbolz=j}p}|t}{`~xt~|y}~xblp|{n|mc|x{zw|{k|s|y~u}{~vz~ud|~}|~}gwy|~z{|{~vk~|z}n{}~}~}u~l{y|zt{nwy{{voz{xx|{cmj|~}v~vyzsyo{~wrw{~||zs}wy~s~}yf~}vuvm{}zyvz}|w~frp||}}u|}u}t~~}||}g{}}z}yz~~|uov|{{{mqrv}gwh|~}|~x~yv|}{~~||{~x{{~zuy}yzo{|yw}~|y~~p~gyu{|w~w`p{qvfzp|xx~z|~y\|qt|~z}vvy}v}}}~x}zvyy}~}sozzy|~x}{|pz~~iwp~~}t}x~x~~j}xuzzzroz^vscpowu}}}zi~^}{~tsyvqvyv}}~s}y}nny|{{xztz{ukq|~|xu{}|}{~}~~y{u{uq|t~n}n|w{w~o~v{ry}}l~w|z}}~||py{ss{}z~ux|~k|{yy~|~}s~}rx|y|n||y|}~zqt}rd}r}hvm{]|{zx~{w{xzoyw{~w~s}tx~~~ur{zzz~~w~li}}~tt~zTs}||{[tkwx{dz}xr~p}{}s}vX~y{t|~ov~|~z}us~}~q}x}|l}}}tutv~dm|}|xq}u|}}~u}~|~}|x|w}~wyw~xoy}~yw}x{}{s~~x|yd}y{~|yu}t~|}~uv}~{}~astynsw~}aysm}}z|||~|y{~w}wq|rv}}|w{v{{~zr}|rysx|stf}n|ymk{~yovz~cz||{r|yz~}x~~u~ynu}~yx{`vq~}qz{~~~zrzzr|}|wt}u~~}w}{m~o|~v__}{|t}k}t|w}yyx|{~t{xzi|q|}|tye{xzxt|zvpyzz}z{p{ya|muO|j}{~|zn_id|k{z|zQJU|~wo}}|zx|yv}}zuz||x{nx{||zzy}|w{|{vz}yz}r}~yw|zvy{z|x|z{|x}vu~{|xyw||y{rt}z|yzotwyxyxx_w~}wu~uU}cr|}~Ur{zx{tqtFqw|xoxpk~=`}u_t{owsyzz}wwo~[w`}|}~yn{{bz{~dozx|zvf}u{~zzwxyzzx}f}~suz|zurfw}u}^anW[zsay|vrjSyNyy_kwm\p|{xqȄt{]~h|v~lz_v~ywp{ve}}|x|y|}xz|}w}}|z|z~z}|}~~~u~yzq}xz|{{]sw}l|u{}}{|x~{}ggy~|u|rprxx~ss|{r~~z{~y}uz}~u~}~gn|~~y~sx{}~}zux|p|vvz|}r|{qfw~sqfge}rqy}zyv~}|tx{nk|~}~|~|}}z}}z~zzz~}{|}x{y}|{xz~||{vvw|zyxy~}uy~s{ux}Xtz}|}}~uw{y{hxx~zz||z|y|z~x}yx~{|~vx~~}{wyvt~}xmzwxw{ysuxwu{z|u{{v}~|}|x|y|}x}v}xy|}Ww~wx~x~yvxyz~~}}{y{}~yxz}{{z{|~z{~{xY}}~yxyyyxx|y~|z{{vzz{zzw||}}}|z}u~{~zw|{yy}yz~{s{z~shc}zv|i}~~{{wyywlbx|~~sZ|~|t~y}}|~w|vm~r~`x|tzv}~r}}k|q}{g~~~~zo{~~~~yuy}wy}u5~|vzv~}zy{}{{}}{}~|{{xs~}}~~{}~x|~~|y|}{zyK~sm{xss}~k}~~|}{~yp~[x}n~w~mn}~{}s}jvz}~|^{yrowzyxns~uz}<}~gi}{|{{s|}cz}|z}w|}kx}f~x~~|ssw~q{{~w~~t~x}n|tuw~z{u|t}}|km{r|{|y~}n|}z{~wk~~|Zvz{~brxQr|~Vurjv^e}y|||xyw{~~|~z{w{}|v~n}|txuwuuy}~zk~~~}t~y|k|{xxz|~yyzzx{|u|}~~w~~|xz~mpQyz|~qL|sz~T|v~wzrp|dxoo^{z~lmb~vspv{|vfw}xw}{rz}zw~~{z}yznxzc|vsyzi~j}wku{tyz{p{rvw{{qgzjx~kq}|}|}|r}~bqv}}vyms}eixgrm`~k~~t{|{uy~}n}di}~zz{}~}z~q|{~~|{~w~~}upt}y|}|~~t~~x~x~}v~z{}{~}~{msp}~~s{}|tu~~~}yz|~rw~\y|wl{~~|xj~|x{~}{{y}|~u}}~yz|y}}s|{{s{~{w{~t}stxih}~j{}}~{w}~k}{q~y}|mtx~~}z~f~ko}}}|{|vu~}z}~~qv~~y~vxw}u|wyzr}|y}|t{~}}y}w[~r^{|t{o|r[|~stuq|u|}xzh}tx@~zxm{]t}wmv~aryz}n}x`xzwy~|ti~t~{ry|~velpw{z~~{y~y~z}z}pvz{{~z~{~|p~}}ql}x|{||~vq{|s|~tu~r{uz|tyx|q{~v}z{yy|z}yl}c}ylwu}|zvz}~w}z{yx}|rsxu}ox{~z|kru{}}{sy{v{~{w}}vzz}|g~wtz}l~xyvwxrwxvmch{v}ovbutsy}s}}ryn|rtMq{|}rln}vj}qzzsq|lq~u|qwx||~}{z|}~v|~w|~turzl|u|yv~yq]}sy|to~~yz}wysz|x{w{z~|yw}}ve~~x~xzzzz}xy||y|{}k|~~~wy|zyt}y}{|w|{|{m~}|y~}vx}~~{z}|n}|t~z{gxdr|~~uu~~}}^|oxko~|||q~s~~~n~}x|~~w~~sz|r|{|xy{|~xs}|w~uz|z}y}v}yz~hy||zr~x~e~u~~y}oxz~}r|x{yr}{x~\hs~sQf|}}{k|zzy~{xrz}o}pwly|}{{~x{}|z}{zzku||z}m|zm{zz||{ow~ud~^|{{usfXg{u5rWvu~|uymh|r{s~}}n~t}~}z{nsj{|}ry~s}u{iwzzm||~|||xw~}~f}b~{~}}}~|~y}xv~txy{}~z~v|v~qvsvj|}kz{oz}~tx~jyw~|I{~w|~ly|{yi~|~{}{zo{j~twxwj|uz|x\m[~yut~zX~~yooow}~~fx}nw}~p}vzzy}z}}~^nr{yk||{|x{{}y~xyww}v~}{txp|z}{x~{~s{z{}{zy|s}}y|qkqx|}i{wt{yv||b|nxgfy{}K|w~x{|~}vi~ji~~zk~s{}yzt~}~v}luwo}|`ux}sjopqstvqv~zyz}w~|{{yyp|~z|{cx{w||||g|~]w|v|z~xyq}}yytu|~~{y}~~sx|t{o|w}u|vy~ut{}z}~}~t{z|r~zvx}y~~}z{x}u|{~yz~|}m}~{v{~{}|y}{~y~y}zys~|~vu{w}y{|^zvpoztwoytyk{yvuz~}}}~k|~kffru~{zv{^ky|x`xs{Lyy|}ysy~ńzv}mřn{|w~rsy}[y}u~ovX~}~x{{}y~{t~|}i~t{|}gxxtz~~ol~kzz~uc{}qp|~hut~|u|~|~uy|o|~~~~s{~~}|ys~}~fr{~~w~}o~xxv}}{}m~{}vy}~~|~{wryzx}z~t{xh~~~vyxio~|omyz}~{yzy~yztgz~s|}}}~{~}{vk{zh~}}yy~x{{}~|{t{}t|rv~|z~t}u{ssnveyz}v}{y|~w|yxtz~n{xoqzs}rzqyt{|Ȉ|{nr~~}{{uv}~~~t~zylwy|~zv~v}jm{{ztw}r~zy}|v}q}s~~{~}z}ytm{t~jap`|~tzhbujR~w}otr}\\]b}-aw~y~y}w~yzx}z|lzxwtz{s}|v~{|s{~}kUy}{{y}{yk}{{{}z~{~z}|ys}oz|w|z}ox}}t~w{y{xut|r}}y|{{zvx{y|~|~{|z}|wxwzntzx~~{y{uy}xxwz{{l~~{v~||u}|^ty|u{t}w~~~|}{zsyw}}t~}}yz|w}x{vy~m}~q~y~z|vs~{mu}s|~}vv}va}v{~a}phx~}vz}h|z~zvrr{~~~vy{z}y}}vzyw}|q}{}yo~}x|}zt{~}}~{~~|v~{{z~~l~syu~x|~y}~}~y}}}}}{x|zvy~}ytyyzqvw}o|xuxos{rs}uz}v~wu|oz}|xkw}Ņwvpxpok|rw{{yqvx_`k{typzkqJ}d|~|{z}vz~}|il|}uix~x~~q}sw|mzw|}vs~~{~zwvztzzy~|u{twtx~|~y~tx}v}~z}i|z~~{wzw}jy|y~}m~t`xur|{iw|}|~|zq}~{~z}~t{|y|~zu~{z{~}}w|~}~y}w}}yutzssnyrspwvrwxq|~xzvujurx{ywso~}{{}|}~z|Umw{|z{|{~o}v}xzqrsrutgfv|nqhwywz||{{x~y~{ox}wzyyrs~r}}~~{p|{s{x~hi}~wt{}w}{zq~kuw{k}og{v}yq|yvY~z}z~z|{|~{}}xw~u}}~~~{}vhr}hrxzqx|}u~wy~|y}wz||~|{~yw~z|r|zwt||~{si|}s|}wq{{ux~s~s}~ywy}yrrvxx}zz{~vnw|~ssi|}~{{|xw{~~z|u~wy~x{||u{zuyxh}{vu{vx{{|{yy|wr~|}u}w|y|xc~vuk}{z}||{}r|}vty{y}zp~v~u~~s{~|{|tzzy}s}{x~jx~|{}zr|{|z~z{}lw|v}}}zyx}|~z}y|}}z~~}zj~Uw~||y~~tys|~s{~ndj|tyj~;}x~Y|x}mh~qt|sjz{zjz|jxwxfpsms||y{s~swvz|ls~t}sp~xvwzhytnxr|}ytltlyv}uus~o|l{|qxn|t~wtxz~|yxzvvqWwr{r{~|g|}yxyzruq|~pt|tqpnv{vqyp}~tu~{wy~{yw|wxxrjznxx}itp~{{u|}{}~{u}z~}{|l|ms}}w{{~y{|x}|~z{}~w}{pp|uq}tdt~~~z|~}|{zZi|r{~tzs{s}{an|y{u{{l~w}|~z}}|dm}}z|yzg}~{}y~og~{~`~yvi}|}x}p~zxw}zvqwy}{w}}w~~}|p{}{y~e~x{{g~}}~{|}r}}~{|}r}{z}vx|{k}u}p~|{}~~|t{}~w}|~~}|~{m|}~}{u~~ys{x~x|{~x~{}z}t}yv|uqx}w}~tul~yytw~}|z|xm|z~}u~ux{{u}z~t~}}mw|o|u|y~x|zx}xx|u|syx|z|}~}y{~|jz|{|nw{~~xwtws}wyzy}{~v}q}|~|{xx{|t}}t~y{x|oq~zcx}m~ht|sn}wywy|hy|{cl|{wuw}]t~~YX|naysxfo`qpxpfpo}~|~u}}xx}hww}~~~~}t{qq~l{u}sv}}x~~~x}ytz|zzyo~x|x}||~rz~q}~~~~ztx|xx|uy~}}~}z{|y~}|~{~}}|~~|}nv~|p~ryw}|zw{sx}zxy~yw}oux|{x}zy{p|{z{~zz~v|zssv}u|}p~ws{^zrlmoxy}|yx}sv|y}{uuwy{w}~z}n~rw}~~vi|~{b[|yz~x|}fy}x}{}}hs~kdtvJ_w[}yZey|yxsiz}{{pz~}}nx||fzlr~|ti~z{xxw}tsvzu}{{ztvo~|{y}}zt}~t|z||{wwywc}{pyWsz^vz~bbOTy~rkz|belz|ynzuvz{~|qt}{w{|{{|}|u}z~vy||tu|w~xw|zw~v}}Yn||{y|~qhz~ucuy||z~q||~~}}}}}zq}}{~uzwt|z~zq^~vr~||yy|}u~x|q}}}~}z|t~}uyv~zzpx~zw|vy}w|yy{z{|~~|uz{v|ww|}{|||xz~zux{u||~}|}|}zyv{ut}}~xzq{{{uz{}|{uttp|}wqytx}szv{}{tyuw|vs{w}pzt|||}uyto{pn}wy~sz|oy{r|z~qr}lw~|~}|yss}|w~z}}~}}z~y~w~z}yzrw~Y||{quy~m{}tz{}}}zshy|ot|z~qzxt{{}v}~v{zvt}q{|wjc}}iutm}c~{gWiMoStNunw~czv~z|p}}t|p}s|nlw~qqw}z|}~sx~~{m~X9{~}~j||rgeyxwwxzu{u{||t~{z|v|}{\q}h{ys}tx}uzytzz}Qr~xxysv{nzywzqYzyz~{|nv{~ywr~Qz}|rpa}xe~wdl}|z}r}wlzqh}Yk~y}}|p{it_}z}}mm^T~y|Os}t~ve~xn}xL~~lo~yl|t}}nw~yzyonc{O~^|usVntx|}}{z{{{}R~|v}n{yz~~~~~z|xv}uz~yy{n}c}}||~u~vy{}z~v}}~}|~{~~ho|~~}zywu|otzwqxz~}|}~~{x}w~~pra}zuuv}~|y|sa}~hvzns{{qzuxzwf{~{uuyuEpwyt{sqQupxz~\r|{}{wy|z~|xyqgxwzyH{d{{~s~^k|~_}}cv~z~y~xrpyy}j}xu{|}yzy{}}zyw{|wi|mUvqza~}}{t{}_sxmws~S}y~Jpyoqs}|sgm|~uuro`BrZmvk@fd|~q}}|{~y{|a~rx||c~x~zu}z}j}wyyv}|~xrxi{ywwzZvB~uy~}kw|zsychz}u~znrzf~{~}{nzzt}t|vq~zz}uc}{}qmt|u}~~}}u~yz~~v}lgtz{zyuz|}}~~t}jy}~|}mz{{w}k}yzqwz~}y~y~t}nwr{_|~mox{w}vs^z~u~wjp}{w|WzKxsx|~p}z{{x~tp~|~uuxv}|x\fs~uw~qZ{lz|vysv~~u~q|s~zt{u{|rwxxzzuuo|{~~v{~hxq{vt{|z~n{{{x}{~w|{s~{|{z~}{y~t~}yxv|~}yqz}u~r{y}~{uv{}}z{}s|{|}zvuz~~}}{|{v~r|~|~{f~{{w|{z|{~swz}xnw~xq|}sr|z}|{n~x|xu}x~z~zxy{~wtjux}pgzvxyys~y|y|pw|}~}}yr|~s~vzxzy}~{sy|q}|}mvxiqpwz~mrz|k~hx}}zuz}}utt~{}x~~~v~}ns}{p~yv|~o~{~~}~~|zt~{~~uzyzv}~{p~z~}w~~k~|zvp}y|yxdyt||rwqosjizv~{}}|uzs|sz{}z}|}zz{|xpz{}~~xx}||{~z|~}yxmy|z}|~}y~}}{vu|yy{u|u|p}e|{}}|ytaz}ykyU|~}x~|w}zx~~ne{q{eVvz~}}t~uzy~|~`xs}{|~}~ph~`~j{}z}hzyvwr{f{}v}nl~}}zf{yu}|a~{y~|o_p}Qk{{mtu|}~ofz}g|zyyfzwiw{yzRl}y|{~{vWv|ysq|y|{{{ys~``o}|xRertu_d|i~y]s`McR~{{}z|}~{lz}iuixxv}{{{~[{~qwwr{~xw}i}{~yqzz}}{~yz}vr|n~~x}xv}}kz}|z~}{zvy|{{y}}~W{}x~w|y|{{}pyzi|~}~nx~ts~}ssqstwy{|rzzum{k|sz}xrj~ez}p{yy~w~x}xq~s}{}fpz||}~uv}}{tq}pwo|xx~zkxw~}~q]c~|sQ{wu{~hX|~rzyzw}vt|zt}ys}}y~~e}~zvo~uxz~|}}}u{|xu}w}~s~r~gx|v}twic|w|w}|u~owj~~mx~y|k}oyz{woj}yzvy~}ys|}_|~}{zxzyf{vx~dd~w}~zy~jhl||}|}y~~|z|tyjs}~ss|u{q{~rv^^v}yrdqzv~||}~us|{xxy}{s~||p~|~zyq}y{uir~u}~zyxq|~{z}~x~~z}{s}x}w{{{yzu{tznwn}sy{~~y~rvkuu}oww~~|xrxzzsj~yk|{x~z~}~su{}v|zwzr~zxv~~zxrycxv}u}du}ywu|ux|v~l|~|ws|{lr|}yt{x}{~}}t~{{~|zyz|~}y}|s}~|~tt|vyz}}{z{yztz|v}yz|~psx||xx~v~|xzpwu|}zt~yux~xh|~~}d{{wS}w|y~u}{{|}p}||z}vz}z~z}zzyvwx|y}{}~{p|xz|}|uy}o~{}~t|xzw~v}vzw~y{|x}|{luz}~|w}y|w~~yz|qyw}|wy}vv|xzuy~xyu|}{}}~uou}{~zu~zt|{y_{~z~^xg^}|}}}~|{bzy|~{~ywz~uzuzdl~zlzeZW\x{f~t|~xttTzw}y`}tyipem~{|{}|w}t|w}~{{|p~vyut|vj~{~z|x~wwq||jvx~{t~l}~}yz}~}vzzxw{xz}r}}~r||u|~~x}}~z{{w~||{~zz~|klz{}z|wt}z|yy}|~w}{}v|w~x{ytx}|y{x{x~x|~~xy~||cx~~x{tdm|xm|P~rpv~wuu{~q{z|qgauxf{xocnxc|{rqy{{x}xh}v~{}}{~|y|s~}tw}no{|uyoz}lswwx|~z~v~~y}x}io~z~}y}{}~k||ptvq|wq|}r{j}yw{~}uo}o~z|v||vmft|ku~ny}|gx}y}{y||~}}xz}~z{~|s}vtz|uq~p~xz~}}ywfy{uy|o~w~}vv~woqz~pz}{vyy}}|~m~{e}}~}|}~s|tx~yy{}z}}v~{vuzz~}~xv~|z}|}}r~w~yyzt|~v|}zy|{}v{x|t{}}}{ywxrmp\~mk|_x[~{|ysf{k~|~}~z}|~~tmx{v~{|n|{}~y}}wu}||}||yz{}z}~}{y{|}zyxytw|zy{z|}|v}y}|vy{w{z~~yzwt~~~u~{}~}~|~}}~~z}~y~~~|~t~}}}~zw~w{}{{{}t{x||{s}t}w}wqq{~~}}}ws}}}~t{|z}z|w~w~~||}}}~~x~}{whep~m||ow~o~r{dzs|z~vx}~flzxp}yvzy~usywopyx~{||qbzw{yn~vupz}y}||~~tyl{}zv~v{~zxz|{}}~~}~t~~}yv}~uu|bow{y~rnix~|u}}ryuf}|h~o}}~xyq}k^{zxys{~vxv|ux~{xv|e{qon}~upyr~x|x~}|~ss}o||~z~ytvkzs{~rry|y|{|k|xwu{vmcxzw}~fZh|yyx~|~]uovzpq|{}m|}|d}}}}v{{t~yv\}}rp~~|uov}|{{}|v|{x~{zr}|vvuzuz~ynlxu~}|{{~~|y~xyx|~x{~{}~z|~z|}~v{~xk~w{va|||{eyyuy|t|~}h~|}~}vtq}x~jysqs}y|~~`~z|x{q}}~||y||}ox}y~rsb{|~^~nmw~ywr~}~yzyhqtxykqzru|~zwiy{||||y||x{sxzpys|w~w}y{{uJ~{~{y}tt{h~xtz{~zkw~x|mn}|wh~tb~}R~s|}hƀ~s{xx{ł~|{k~}v~|]s|wwvuizxzlga?vRz}wUh~z}w~~}xxpt~~x~w}}ux|~~z{n|~~p{zyx~z|~{~z}~~|}y~~ww}~||~~~q}pq`n}e}v{^xv~wwzwm|dxv|woxmx|fs||sZj~|~}zxzb~xcz}}rzx~}t|~vzmv~q}y|h~{oum{xy}|vx}~~wzbs|p|w|uh~zyz|{{{}u~|}{|{~wzvy|r`|vzdqlq{}||~|~w}~|yu}|~se}}{~{~h|z|s_q~~j}m}s}wy{f~zvxf{x}}lvxxxx~y|pztto{o}ct{y|tzz]uquk^{}x~bw|zpvz~zt~|}x{|~y|wzu}y|x|z~|}yn|yqwp~}}yk~v}x{tqso~wvmz||~w~{m~ztxt~}|{z}lIzzzpu{wpu~u`Qz}~~{o~~zpouw}lt~{r}xyzorlq~qtn~~|zio}u}{||xu|ud|}qyz}}q{}q}}yry~{~uzzuxwzlx}|z|sa|~xwy~v}w~}m}ۈvr|{~t|xzwy~_}}|s{z{|~u~kbx~{~g{MXyil||px|r}a~{x~t}utej~Z_p^~{~{WwG|ʇ~qyr}~y|yz{ut~{}ym{~qx{y~w}~~z{q~~xjwly}yp~|}w}x|k~q|v}{~yxur}t~}z{|~{x{{~s|z}uW~ky~i}p}y|}|tx{ygwx~}}}wy{zlx{|}~z}}|yyz}}yvu}zx}}~{vtc|}~|wmz{|zyuqy|dzyvsm{ztvw~}z}{r{{m}w{~}~|zsv~{rz~w~}y|yzw{z|{`~|}ws{~}y}{y{o}jwx~{{~|~w}}|~x~xv}tu{u|~|i~~~~~}optzy~}w|u~}n~zy|}p|wzzx~{uw|xuvrwxrv|s~~z{p|xz}ty}ziyxw{x|zvv~xvw~~}}~yws~y}wguyzmvu}vZ}{~xx|~~wjqru~}w}}{yxzit{~{xwpsz}h|t}|~{}xxjg||t||||{~{~}}x{z}ow{~~zwix~urw~r|tvq~vsw||~~ywzxz|x}|~wz}dvzs}~}|tx|}~x}|{{zz{y|y}|{xfx`~|unzl}~~wv~wz~s~uvh{w}~z~ui{{|{tyz{s}}vvoy|u{zy~}r~hjx}x|lz|~{u{~vu~yoc|zty}~w~}{q|ne~}|ye`s|yow}}zz{w|zvy~|`swx|z{~~o~xw{~|}z}|tt}z||s|vs~yw|l~z}v{~y}~{~{}|}||x}yw}wou~{|{}{qs{xl|mT}{x{Lo{m}tf|ujqu{k|xqi_}o}Mhzu}}w~~jv}xly|qtz|y}s~wxhw~quv}|~y~~~~v}x~k|xtzxwnvtqw~{xk~{{z}}xud}oz~nuwypqy{hmz|trz{y|wwept}ho{z|zxt}onqoaosedo|osv]bfXzUgkqu\oniXhj{mttmsjkSomqtnreokrnpfsqgnnwl_|Qcklcpogsujf^q}xtqfpnpwbnapeuavoufscjsav\oneenorXgqln}w~}zwu_\rwwoxo{~}q}sx|p}mug}}}yxyk}n_k~nR~^}~wqQvgszYhO}~z}yp{yzz~zu~tuz}vu|~~z}~~}z^vzxvtrz{m}x|uy}wwyvt~sxuxx{}q{txy|~}vxvszy|xzx{~wzit{y|r{}}tt~rvuzxdy|ew}{~i}{v~{f~wr|zr~x{{z~vrp|l}x~tst{wt{o~zv}{xu{u}x~u|}cvswzoYzbqr|z~jVw|wsv~|X}~g}r~}~~m|`krp}r|yd}}}gy{sjpa|ojw{|w}lr~vw|zo{pystw}v~~bvr{w~~xl{tyc}~}z{wrqy}uwwe|z~yx|sw|bo{}y~}~}oumyqy}lshvyrm|xayh|{~ui{tys|~y|t{|muxp{~v||zrk}|||y}zvy~{~v}v~z~zyw~zzoz{x}z~~}nzzN~yk|~}yvxqxtqg~umR}~h|l}|}~}~vx~}~u{}}}~zr|}|ru}l\azv|q~sy}}t]mrxxvx\|}t{wUr}wz}{}|}~}{wt|~u|qz~{zr~sl~~y}~y~~~{|z{|z~~n}y}|mz~zx|qy{}lnz~}}ln}|y~z}x|}|}r{|~w||uxyuu{nxsnwuy|{||tmrsy{}vq|~~sy{uj|~}yzttyumivs~yxsxp{~}zv}}~}~|~|wzxz{uvz}z|~}}wz|~tt{voz|yz~uz~ozruswcpz~zu|}r~{{~yy{||{{}~}q|~|w~u~~~{~~|w~~~~pz}}{o{{w}zyq}yv~~p{}}}{|zzic^}||qz}a}yz|kz|~}~s~x|jub~~~zp{{{s}ftyz|f~sx}xy~{s}s~lk|}qxe~x|}z}zs||z}zu{|zpy{xo_tzypk}~w{{}|z}{}x~v{~{}x~|~c~{}}~~{ou|{ow{zq|fty~|}n{~z|xwspzx{usb{}~jrqwwmg}vzyly^ryytr{v.~ztwt||rtupN~~}uq}\wx|{a`Uwyywu~iu}q}z~~l~zt{|~ou{{k|z}}{}zb|~}~e{w|y~X}vu{|uVhp\{n\|i`{j@]lyVf}v~y|rywzx}~~mzw}zvjxyx^nrstnuueyx}}xtun{{x}}zy|~s{}v{t~{yz}vwqr{w|z|vwz}|}z||sx~ztx{}{o|y}~rvix~yxxmqy|wUvw|xyu}~~tvy~~uyvyq{yysjv{y~{x{~~yzuy~w}}~}wx~{[}pteqq~{_s{~|~uuyc}y~}ovmz~wvqi~|z]}n}zu}ruyr{q~^zxy}y~}}syx|~~}||x|z~y||xt{{z~}{}|}y~|vuh~tx}~~xsyzz|}~{}|~~}{{~y~x~|}zz|{|wzs|yhvx}hps~||xwnmxzyq}ywu|wC{uqqkr}p||tw~z||u{~v}zx~ezxr||u{~|svx{~zrodz|ywzxwy{z|xq~{~xLxqwz}v{|}~n|nyys~~x{~~}s|vqwxOvq}y~zx{rz~zy{|go|w{vw{vt{~~|Ylzt||zt~vwx{tt}|on{xu}xsx~w~}uvx~{h~you}}|ux{~w~}z~n~~xz|~z~jum{~z~}}g|u~z{iu{m{{}{}x{vtzz{wqt|}s||x}{s}{zzxx|~y{xy}}z~}{{s{tzx{y}}tt{|{y~y~p~~|yx~rpR~z}stw~~~~~~y~w{o~}~v~~{~{~v|~{w|{{zz~~x|~~vhxy~sx{l{vvz~}|w~{yx{|||}~v}u}yz{{ts{ur{u|~{|c|}owx|yyuu~k{}j}y~vpzy|e{~z|xw~d~|yx|w{r|}txys~~z}uz}xxub{y{~vw}|y~}zl~~||||}k~x|{|t|yz}tlu~|otxz{}||~yn|r}r~|x}}{~wgt}x}}zp|{|~io~{}v{wx~w|vmo}{hs}}~utc~szsq{uzyy|e|m|qzcypz}|uwuvxk}}|{xe:xsyswyoyztx~~ps~q{n|z}u~BrzIeirhwzvǁ}~y}izxs||uzl}|}zz~~{}~~u~{~w{yz}{vz|}m~|}x}v{ys~v}wz}{y|~o|x~|}yz}t~xv{}y{x{zc~ww}|jvvvz{fzowd}hskwjmkqqnogzjWesrvnero_[mRvnpljmttaodkmlphussqlolknr}uppijud^contnowlTlZoi]kpm{ccqqopm`zVlropglqspeipk~chmpl|relouqkori}qpo{ipoammo{hninTnmmmulsoimkvoinolkwsickok`FopoUnYgz{l^jasiqtnjQklrp[Zs{uvuesirkgglWktmprv|rxkssxmkcrwiUkz{rkQjzlkqZlxonrnptZhvmbsaimp`nhtitnlfmoRZllnhojte{l|zk}mymaspnin|kxorlrfnopyifpqgj{\nmkmxpkjn_miooopoophokqwslqihlzdirqa]ndp{pqgsiiqssfvqyokXenpzxuxjiynmyle_srrc`n}qh\pnintmsvqo`r}m_ppolpnrlpql{jfqnjpmonigospGq^kppkmskwkoon`k{qgo~d|lnh_umyik\iihmqjyigRkilmjd_qmmsmq}mllmeanpnkblenmrhyh_bgrnrslqhqHvsmpththplvmsl^ihNkoj~tur`nfnsmkn`pgkqSunqntrmmq~npZersioYntpmgski\wlwimoopkvkmzygdh|rophqphnkmg\{[undtnhvhjlkYofX^noplgoi[YjqqsluhYyboijldj~_rppVppmzijnloSkinj^ng`lko[mer]sjxbxdtZumopYniQnutsh`fKjlq|elinwmholkpenio`o^hQWttmoZjersoqnjqVY`xkktcmgeosyagrvsquTlqopqkcgirdkgc^nlitidnXtQpfnigrr`coucyvlfs]hdhjuslmwkybQshef\jjip|pdxh|ojkYnginzwrlap^gifinl]p\rvddubnknrjqghjvuusjrnVxmwvpnpruqjpik\ykXogsmWlq`rnhnpog_~wfoukgqnq`llbl]lwrxdner]zmnrjTswjjbrqngpHuodkfdoogwqolkiqsntsnPt{omZ_nhvnhloqgoiijjrapji|utr_ypnUnopf|}nlirawVkvWhtipoollllRem]njenuopvpcd`oim{_mUj^ivhsblmmsozmuredfkjnnnqnntalkldmmpqq[rotnolnomqppmo|\mursqkbpsvcpnmn}l^roWrsnokpnlimxqklmrvvpJolrqqLqrmbzmoqmspjkqlsofvrrznkeom|pFaqtimzinhjoSQmnUl^npkrwlimlutklnnmrmeru]irnoswp\lo}onsoQimc5bnqrmmmqnkolhlmivpinqtjmZoaovnnmoqukmne[fqsgjppedlmc{w`obmqhfokxmpcg~tmon[oyhhkjaqeqpQkfpqh~n_yeoyznlcmasjedca{i`mfpplxoq_gl]\nntcv[vttoqlpsfqmqcegyS_aXmovp\iwszkrhrwnjmirsncjHsk|qjnw\sgthnipmngipmjmZgoq^{ppnumqlW_tmeogtdjs^qftirgpps}jlng\gljciiodnbrpgxxrlxc{alws[ik_tqbm|npqg{phektkfgjshsiosiurkno\kqTpkomiplmojriphlxmnphulmndQsenjmkmnkhnrlrmllqNKkdrVmxlnlDqnRsfqmnhrozon|kz{qnmYrgqnoon\l^mejkphfcmmeokool{ilkghqkq{jdlmmnynTmkklmq[lnxjplRlibnomj}oihnn{nmnqnl^pgnNollvqnhp|RqsP{lqlmmyenqojmbp^Onniknk\jcolnmjgoeoinYlCkvqsokxvTlimMqth|mcnnhod\oqp`orkilor\lqonupnvyi?nqmiplrsnoYn~ykwpist{l`q~qomtmnOvbluknpqrmpmp~qw[qjnokphnJf`iophlTl{poqsm|irmlokkp[j`olfjmlomrnrwgxpo~k{qnoainniurjqquNnpjnrnSe_oUqpIks\pu^popnpDkEjnpoQposmjluiUyI}tr}pjxrhlSnpqlwqkkkpoyxmoynclokfEppud_q~nlnpyxpmvqdouct^r|kWnywiiotrcmgpfnjmv{tnQos^sertfim]ajhqql{sfpvtwojnwguVyokllp}mqUlzykmainotkihwoTtaz\czptirkqoanj{pnfymjbnyokwhvouqpyvlo`s}jTwdqnh_rlgdpnZRumq_aj`shoiqtred^qksd|zjxlrddZfe{Yi^txqknZmedu^mj|uzucmpg~gj^lrj]tZ~~p~Zntqnqukitflpoixhmqlumbuh{uqxsqloknlkqoklnqjk_hjanwivjnmlfklsfllkmixllepmpg`psgkbmozro|gjvnljgao|k\slgip}mgqjnmw|cmWtwciousoeqwzrhiqzjzipkuplaxfrhfenkhqei_brt[_klxmfsmjX\vhtjlnpvqmlqppqqnoroplmgfxi{tgntthj]tIhhvrmojfhnyteg^hvhnidckndmmiojjr~syrwjmohq|nkhkvjkpiohoksomlsocmmivssivoirWdpoomonpujjqpiunlrvVzbqqwuOexjoYodhqdpZkjlejjvpipvyu9ugmqnikkpifgrkgg}bnlsfiWnj_ghnYtbvlm}pybljconiqNfls]jhmvkqopgjtlukv~zbhmjcntrlwb~o\oqgnUotlsjmmjtf_dc}XnvjilodrjkoV_ut|ikpmjplro_oqqkqelyjok}hwo\trfujlV^ogeortxdcrjeuhqdlnsuhglgowgeplkPqkVtprdlptge~pnsxchanovot`ixltkyjahjPgujlpqi~jzqvlpupdXvkitmpsqmzpzos^mxnblfx`n\CTxnT_vexffnoeosnvqbjqwqsl[hj}qxornxqv{wloV>glsogqykimovcgU`ijkznntqmtqmn`sghzxp`vpoefrxlqsaZxpn{ohlf\qbcihrpdjtmfMimzvXydmkjt~jbkf{mlkZtom`wctlgji_xletmpc}bvsmfvlrp_ht{fmvxomnipnnhitqm|upbnhjthnsk~\|lnlswlsobsqmrkqrlfflvenvocysstinig_qytpcwqj`t_thslitdpugpa}tmqkvmnerynpYif`t\hounkwlmknrkokfmo]mgsog[kgevbjibtfs]sorqcmh^inyMlfrpssqmh~~rhohlUhrvmvpfplpsjuekjsnhtsjpwoivkcoozpytwjeqkklrleqsp2lmgYlhrfXil{osjn~wuhkqrpxZprmyhlmujronuqeOsl|VhfdhmjgrvYitYppqorrn`pVszkpqmlZDxuluyzYxirmqz|vkoirqUkhytwqkjnrUe|mmqgnmjkhmnrngnnfurpluqkprbfmkiqfjniipquqrkkl||nxlkptqnrp|ehv^7jbsppenooliismfkzjwmaoukhrGsnqr`pikronqfppqnnQsvrxfopolY{npj\isnQklpvknonrckoobpilqnjmplqnnkoOpick`QnZphr~nunqnRqZmnllnnqq|nI?sndO`mjnmmprjynjmnsouhtknnpovttqmhy_mmgncenjl|llnukosvhnmrNnQpnmolonolqhtmNkpsosoZpimik\nUxbmavpnqQnqfk_ooktmlmtlkqtsim]ogplqrm\osmkmqqimnonvtjfwjRkl~qhmoowsonrIuWrgij[vqmrXmmkrovqplomkrrloxo^jmppkheonrogkoXt{:tyaoZoImlmpunsnmqlvmppmmg`i^p.hujkosop\jbhjWqpknenqikmfnuvtfkKjaksk]k[sqhqvl_njjukhBGmnjnpll}plmnenlurfPNpmnkmllgwmelxm~@qvolqotpZ]onkVorekomvjQ_Xgvpwmhilmwjlmmsnhmtlpk{Xykkdmn.Zxqky{}htmosrorqsux{v`jrmolk{hyjMcsmboifpshtpxlqpjspxnTlq{hc}wwav`dsppsnknqnsnm[Uekya|putgjanpsgn_|F{trfrcm^jCn_mpggnie^oojfysfznr}cuqt~rfxomegkocwcivh_uhpnsn||xkpjouJmk}v~toMhv|oVnyw{apfhhnglZ}stlXuXdgogk}z`bbjyhvq]|`h~rwkeZgrHnwUetmvqeblicnTOvimu[gdapqeuocrrnhnacjjmpwwj|_poocUlhoclp|sp\ettXxrtu|drtz~ypIkIshmnvYlpOsmyvkk_\qrslejg|tzqdthYsbqilvg_jnrk`oiu|oiZ_vodxYhid^evYcglD~cutresgkVtfcYzTr~Rhngmpnlodrogu^mqhumo`nVsrhjWpohgmbjtwrqkmwtosodeZm_ltfomitKTnPk`jasbaLtDjpqZqNnghZZkknJmqyThrxixq|puqxvof=}hmxhfYOqhoyoaC_ftsobpisyhmrftijb_sdr|ejn_gqsgfu\nk^fhqlrfs}hg`rju]neg|njldrtSspnvaQhYpaqinqgkprwrYnwnRhninmZnrnZhnlpqowrmpopokomPkHmrmqimnmnk;_njon|kousmmmmmonxop_gimhmjlro@qVlpcq,hjohqlkjl_nFOlrcopjmfmoqsohlrdhhlllmlkUlml}moo1zqqprozqMqqopmmqilqgmpTUporinopeul\gmlxskkntkrgnfBhllmzQmntomymho}{dPkmconvnmlamlptrnkumnp|lvmsosmmtnmektodfnkoioeuupAropX~upntnwpJipmrqqsot`sfwmliqidjujolihpkmcqlfjWokbrsjSirptwfp~jl]pmpnHnxkckakfmnvolen|usgnqfsmehaidhk`ftfqlkjpejmpqqqhlzqoohmm]rsgzmixk|kmlobzreumkdsh_qgphqdpmdogkpvttbooAkljsssv`rljukiqnkikhtsthemydjpfjlVhompm]rhh}driiznwqmoenzomkz|ichhr`hkbjlkihkzW_vjmmnpj_o}jwlsgfoei`m{kronbjhbdm`vioekeonveyqpm]hkih_kt{timr\uogvnr`krlht^}koqy[y[lgsqjjifmrmkhrhmukoll|monbok`tqxlQrmdp[lbtihk]fujhuiklmrkljofmigwjgngptjXyjkfejptunklpzxeyjehlfqkXlhcnvdovmyiu_opehqqjhvhj]nogimpkojhjp}ranpupnelhmVtq{mttZs}[pojeurzs||}jnj{urzytwez`vp{suvplmvo||yyzfqtmgotmossrpg|z~vvW{naz_kzzym{xyz{vquWj~qx}{tnrudwq}tjzxslvwYyo`wwpz|wsfjrppkv~zckt|wryiuz|tozpzvj|efqyywi^ruceolq}fomzjzgnmyi|eosWaxqkor~vwnn}eswv`hngu~rokanlqeknztprvlptonbllgrkzrbXvuweqGoqlmrvukitcqmjnen}fntisnbt[ocngynesiXljX]gmpkkTvgg[rhotvjs`rp_f^scqrwgtrAleQoqkmjotpqasl`nf`olmp{FqwpvncyppnqyzqqxelmusogBYgukolgrs_kkmhoe^w|rl|qsmxiforldwxOonjuppxqujXtuwffb~s{pjnxTqtlnjSrply~to{ptxmmutwullmpnknnkwqmpfqupofk}xlpinqmpsslokoni^EmSumqmTupDglpxqmjgcn.y[nokproToo:tkeohKkpholnm}qZ{mqkt~otonlrutvhjowvqkRlM]mherqUqmlpmsYlumkhq~rqqnnswogtll@qinloqSwKl@om~n\_nkipnuvIqcFlpvqR\nmlllqrxoci]kfsopmko^oGlorgvpmymlno^mtnosokrlpnavndjjohkqqppm\[mhpulpipwpzmmqmUno@bfbnjnjonblnvLvnpp}mgqrenjSktoziTqnn}gklopr_qmrbq@`{hoksupmnuKnqlnkTjlliibqOhtrlhjloemqSmkivljitpjrnsamoigmYjh}knp}wmtqpp7pqogmjUqnkUxsmw}]hqmnkhlr\rrf`gkqPxnph_wPtkOboHilxpkpYnnimpirSlooq|qh_nzumgrqqe~lpNoLnombhqoamrkgmolubkfmbthfjqmmRmn_hvnqngclpjvoxpqmfpqnvklhktpojfmdgkeagqptkkgnmpkflackuoikvniiYwapq^w}p[nutqtskcg~jipsqolonjwriydpirkop|niicidk{Visnszokjhs7mhmekjiiql[onmkhmhkpyiknp_gmnsngklri]opwmhhrkkbshtwth^loljkkonkvtfphdwolksvhcnzvljkihlqn|nyximfl\lw\|pqemipg}vVunmrnhqjTstk{dlohoYsnunprnqjkmofgrm_rxooqo^rainpwmmkolsesmemjrXoohbmhm{sour{l\t^XtospkkwktkgQgqiqnlevi_rLWrh|hoimysmjo~]nkufqjlommf^t{vl|Sqvp5djgoaillapbl]5niqpffs}unnjodnf{YlmswtqtqkI^geot`gs\vksm[rbTtmiry~qhositntslssoqglr|\mmpo6ovimkmnpykinjrmxootlnyo`nimrrwtnkncoXnoanmOds=i^mnxq_toqjfonnoqsnhaqskwbfTm_npilkrqmg~umokkpopokupsljkyxqlrm`nqlHn}mmbnmjKhnnpvosummndlkndpmm|ooskrmjqoXuihmG~Qmlopnjwn_oqjBmnLmnip~dngY\uroqgnnglullrimnmppolWywlYlworrn;mnnb{ejysTim`iwsmntwmfdqpp\eqkjwxn^llktlpuiqs_qbrgtloWovihetskojkgrwnihsgl|gjpfwjxniqoprkphoquxfeqngercwogrbmkooYpnvlrqpowldoqihBhsohnkxzphjdlqopRjmwkMYmng}\vq`}k9mjjq\kpukgvqsjpl_namq]mgav`rnpmzn~rcnhs7m{ztlbsrl_vfovqhj]ikrwsdglkrz^[oh}aeelnlqsrajzqpjuohhptmkiior_o~khohnqmms]nqtt|Xqqoro{grxssqkpjj[xgoumpl\nmzisqqpsisirmQtkMoqvsilbqhvkgkr{uooewpegaoqqsoowpqhhkfZnnmksvrZm\fp`\wcotlptlouro_uftjq]qmytdswleihxtppogdq_mesokqjgklwvpf{jntpbavuSdiejrqjnnqodtm]reywv`rfp~luj`i_lwlw\obrsjnjuoihpwljqoqexelclngwhofm~ovzoqWkxkjs^uoftqXfpmlevso]xjje]ngttaronth}qobpqsnfqnOh^jnkunhpnzmop]ronxcconmmdXmtpomqBplw|sYlrqxvnrpkeZmqs{bqph`s|axoqgcXvmimttjcnewsjprqinJ`qlZdfqpjlfbg{nvijqlLmkhmosjyfveoi}wstoZfjebk,qhztqowjiz}rkqbr\ljmvljaltqsQslhy^isj`lvstnkujfbm~wvmwqnwqutqrbfqwnjmwkovgXfWzgeuneuqqw`dqcsh{osgiwfolmqnokoplmmkpj|rja~opoimh`koajd_jmniXgxlpby\ljd`efdmroWgqrkommsvsuhuntpsgndlnidbmomfzduljZvaplgo|herskclltjhhpqllmvpn`llqhl{}jsptgkf`\sqgocplstjpqVlllzhmrdmpqmk^kqgqfjhrcwsbrjmsytfrsfqhshp]bbtmot^[uoW|dngoecrienVdSi}[oh]meopcztqzvxvjszomifl}sxliphksSsvSejlcprjtptyVidrmmkunbT{pi_jptj^TpfsljpdzXyxVVnfgjliopnvjcblosqfklvjmlptugldumUf^xpfMxiufmypetZbdVlinliWqc`jfppoywiukpfaZdovimhhnTydbvxrbgsohxhmYxsZehmuldgrl\q|qfwptgfc_osackhj}dpsavsvrYyfusopcdqmfgf`qsjuqshm~dlnbjmjjqolignrhjp`~i~jqkwvOnUnhl`plv^oliotmSofts|tj\~mocilmkore~fh}mrkfkn]bljrodlconOc}-mzf^jlpafmojxrmqq^{xnloookqwllzmvcpggTkhi]lhveomtduSs7]RmnqqtsiVt|YUnonspnk>koflwa[cizqjwsnhjVrphowgkwhlo@bqafqwSoo]dnn^jolnxnZjgmlopzpkq~mlrmynsjsjkrf\fljjafupk[uIm=isjn[hlbsqfknynTknn`lx^jQgejqqpfjl}ko[tmtgnph^up`pso^qzn|WHomxXi_atscYeqnkrp`nNjlbljtrmmnnoz\okkrrmqmlqpspvVyekui{mwpujjoqeklmpmn[kysolslikwojnjwofceSlnWffiQKp|qsoprlkpllDoenC`nukoznLzonrrdokvlkqqs`us|eolkmzoc}lnpb{hyivjghg{jesopopfial_o_~psmprrwquockp~|zgV{ktsvp{plksfNrkiiuoka`mmtkzNspowjpstvaon\lzwxh\nler`lylzooklljmj~ps]vrirakl\go`kygkzsqsohwpvcmtjs{ytt{mdu{kuklyngntstjicpboikkommjsjtvjHuZsehwncq~asukdxtjllbngscdgedp\mjnnvqfgcfsmi]shfcmrpaYdiqdn]uwdwaiskibSm|^heqXpqmtSKxlpdi\jfj]gf]aDvsfgqmtSgflfp~gre^dj[pbr|snozgklovg]pmilmlib\c|ngmW^gbtzrnNykpViXorbjtf^mjjUfm|`lujoegfLp\cip^k^opdmispZw^shzhWfpmfoq{lpo}gww]fgmuk^rOncqwqphvjmhqrsdhgnqeRa`vghcfl~|zLYapdrsmpkwjWrniokonlrmd\qjmxt\glgduixUqHhnqpmCpjnNkknWreo^rnjqdoonllgmrtqjnoonnxnobnmrakOqolqlyilo{s_kppipovogelinu_uakmmpoipi]j\egnpw^jlmmmun}vqorr`pnaorqqprmonkfp\ionxjrojomjiuyomllmhlrroojtl]osntxjnTHqunljmXdg|spnhlbkqurltmjiSp]\ktroijojulmnriom^pmq2}pxocklnmuNlno\Znl|itgpoeojksmlhoqftvnglqY|z'ulkpllpdygpoxblsptkr\Ypmrsooa}rmsmpspiqlqsdspelgmdbtIkorrtoqfmjpilovttfsmjwfSn>nm`vqjxsrYmm=sopkliomqinep9qpvJhlvpjhmhs_stgX`soq^nljsskRz}v\opksnrcrmoljgnqmu^iouwsjqihojbtiiRXijoqnpbq%kOiomymlirotq`mgruexmqqiintnvnwpgsmrugrkSnnphdiptpjoo_ilxxg\r]mgKrkhloqkdglmhgefjjlrr`aohotukmhp\k{nqsogpkpkqoTklqa|{Xrqk^onmnkkvjivmvdsikqvswpbsc4jpqum|tr`rohekakocppsasynlR[hiookqq$j\k_mlernoamqhwmpfiMgcoxppcm~qgmqswknkYvkmlumtebnlqqPrZulqhpkqujsrhhmafnsjk{2momktc]lpSljhpgohc\ol`slnplrqhrho_ztmql^eljoko|mgp`btzmphrkpcnbXhvxl_clorjkRljeluum\jqepmj~oimjwrec|Zuii_hndqnwlonu_lpt{n_pSv|kojjtxmg\yqfae{{gs^tlitsnpidnyqgjinoypiokklmgtovulho`Snpkgyekomhxnc|qxpmlodhmpkrbpppb[ivoYtossqlpjtpjmramnqgnqgsmhb_Xkhhfjnrqhgr^jstyqan}npqloqcrlmyowqhmhYvmnn]oinSsntVkkomsmqrbpmfixnmlkmmjono^qjVjppnaflwUk?pyopmmmo_telrmrnq\ow@pVjphetcltnlrossyqom{ksnotmt`vejLnknjrp]vkkjonflnmoqm6c{lpgnmpyhmhopregkptompmnnnsRnkKmqmeDollpqoW}dMmomo]]nnujljlakaa|0frbnhlmojmnnookqljppsn_spglol>kkw~Zn\pLeOymrkz~oiscqppisnopvouevnnVnj`jojmsnumnlW~m}btjpQpeiJjrptpkozfnkmqnoqkiagk_dt^cXproliorjqlfdZisqfscxliueo:fqmp_wdhzl{klpj}hu]klpiqafqo`tgmhktxmmo\dtfjmmhrrordimtdrojgnqprXupoumjjZN}smsygqmiipgvqpz~]v~dueyqkgkisriomjVolnmjpPikrgtgWsrxjgOmv_yidnqlmoicsgtyaUw~psV}~stumrllfe\~erehoerjXkuUkdkq[nqhtpc\rwpckntithpjmhoir:pqZojlNpyWtzgtWfo`x^jOmivNeapgysn{up|osZQfYplukmosj?urkVfwmiwfnsnlc_ycmQdalqjYqgiqdhfs|ijoqmsepl}ikcsrh3rxvko}[llfYlnfozlZgvqjjmmkmirylLjsojpekixbvilvk_hnDrqcmjpVlimlpmo@lmzlfokYlekbsoietl{ldgiilKrkp]yqgr`kxhkhijtmxn~nlpwnw\dj{ioXon}kLqPslrxhipt_rvlgBngsziphfqrk^patnnejqubgur{ryRrqqlR\tn}cripodsq}zmSsrpftmvmmlhpsralbtsormhqgtwpmsdjcZ[[lOym{nrw]ulfiszWu?lqp[vhvJrjrrjbg{|fvnokotmwbqkrkkrmalkqcekmhtqolrpgtftfo|~sujmmqiko;eswqjinjrkklzkM^np@Nl|mplmrosqmmyqgposkjkw`lm4nrmHmo{hnopkoijloawl_b|{imokkpoZpoZmlnok;nvqpqsraznn_mrapgmoxkrlknxrphpopRLpoq~nlvor}mhrikutlkquGqkppip{hpWdmwoWKmQnmllZstnkqpq|jmnurltmak=tto_pemmtlpwramnpolommolk~cypmn{jn@]Pngv{bpal\glsog\zlkpPnfpJsyqknsfoi_wn]ou`lyipxt^pprysf{wva_^Lpdk[tpsdo_kn~{rzusmi_j]fiRsii`nirpkpq}sYj`{iFqnm|Pnmfisgji}mgydzYujprtVmjqgnmemYmlpioaonfhuwmh_xfwj~hdtoZ`tjxtpj~ZfoVqnhkwqqunnhmzulXoqf|\njbru}r_dmj{nrluifpnnqjjkdqvaklrglvusfnk}wkpdogzno|ikxgdqukmlrk[kkqoqoenqumvXknVwiUokmpmjsnnl\Rmvnmsslfodnop?owpfooOnklmpnmOjrfnpegspmnmnngmypOgnrlb[kknkmpnwWpnitsmpUlpmli_oeflronjoZpenlnmq'qp~qomdrlknmpsanokmgoZ~SmcaknwblnnioktqIjkslxulm~gpknrqc|trssmpmmfm^prnqmlkzpllRVrilo]ojTWUmjebKqipAunmnjekawdrmjnklnnqi{hphhgNoekjqf]omsfvm}stRsqmqMUgkonbeonXomlpkrmoTpsopfnf^kUfgplnltsorywLvumlqvsqikqqqJ~jon?fqfminmdllogan]hujmqqikppadtrkieniqtmkavislzllohnn[TjfoEntfpqoqnrph]nadqlpmpxpnCmmtmkn~hd}kwhqtjno}qtnfongmknV\]mjcfXlstZjlrin[k_slqqnnH[lpmTknjkqhnommnlqpWsmqqonsjqqonosmduokpHevqmkml_nswobUlrlqnmQnbl~Sni[xjowlgnno}dpluZgnknvjnmlvr}nporlphmk{kVojnqpNppaqluS{nodm@oXqpxpkl|pmmjkqLwmmpmpng^mknqlSoxvXgnpvbm~eqkqnmoppkwnTkx|qodmplmqkmunlptkpnaponzuftsqmlmMVFnnpobTlumlkimqnntjdkkm`pkmblkgmg]lnT\rInspqklzsnvvlolgjvhCimQpimrnsnhjlgkqimklqRkdanOhivnnpnlhll\htjmmnxmktnroovtopoinottjgwmslumbsowppnUW:so{rtnmrdroonhnwmmnGpllipkprnXxmPlism}inpltmoqGpiowpkonlrqv3Sv}mqshmmgmmomokmlonnp_ril{mchqZCml{r_Ut_njirniostlnqQlotLmnpcokwkzqnoR~nzmnnnplppomR=khlrtFhalhqvlumcnntrlpnhijpImrPswdsXoxjgppinhGjwp]xnolrplkqmtnrfxlkWpjqpooo|pmooTnq}qor]xtplokzo{mmlpnnchmoromlnpomo^umGepwm_falUrmodjFsonmrjodMmnenkroipTM~OnVrokljxnlnlopnpm~plpBuWnmqnoj^Q|nmo{m|kfnglo`nlsgjxognia|jdpvdfjmsmmmqslmg}Z[laghjqZ]pdrnf_fqjnlqghynq\dyqjvldpWgvThjcwieepg]pp`X_o{n{vfvqdp_elvmv`mlhao^x\tqubdfjnamzxmndk_foltovo{ixpkZmvhhfhvhdjnein{ee_imljrlmuekisolZlerui{`wggik_u]qtqdqnuo{d_rXZfsZ_jwklfmdctSlpgo^nildwlglVlpgfole}jNdgpnl}ihriqojyotoknpnpjpqnbvotnkmmqqnomogOqdvktnnsqMlenEpkk`pZxWkklmpi~m(rqko]oekynkpokbohrukupsmmiorrofipXqcojlvmHxjmmVienionnplfontqotstpXojl|qoffmmylolkqpWoownTmpnlnnkkkn^nlrz~lmkmrnqRV~xnkhwliqmilqojnlnmm_qjmI}ssorpPonLorqkfVQbomou|mgtwqgiqflm_Znp|r`qit`ieuJkm~jhtywtZu`dqtltommesppvnyfgqlmQwmlQij`hnr_slxpidqiuljTc`roqpizhob|gMP\wpkojasqmlhor~kqkv}rnk?mnzrnf}vkslUng}flinyrmwjhknpfz~stnapjwgvkpm`kmbFgiqkpmu_tkhdTvx7pqpunlm[ujSumml[rCTatznjrmcnhZpolaphefljh{{hojnlhtkdigpskoehqxmelCoOtdtrrqnZpm{m`logghkkNgrXv``nbopbqjpmdippjtJpolu]mlqklpgqpntpausslqzbo|duxqmgb}OrsosY\mqwftnqYkpWdsemlaloqvrg`pY|ahlromtksqyvp`[xyhYu^qmk{pdijnrpqhq_kpzsnSopj^_spbug`\grpvqguqBalionqsqZklawX_qotUpuoip`rwYVpdot\myrfkrxocrzpidn|ruvlqqq^unvmjomrhomnckptnvTpmUdk~nknlgmoqntmhlUojep7tPunn>l}mScnpjmlpoqokomqYzihokmhmo_mhzrmonfkkipntmuXuqn]slYqopoQemtjsq]hmkhome~fndo{lupqqnlnltshorjZnmpporZmngq0n~RlZrpkjNkmDrmpq\Mllshkmo|nPF)tonounk_nklongolklnoVP\xldjpk|sttrkjtnsqpknnnvdok`rqgsrzZbnuoshlodgZvspmueyerbkrtofy_bulooswrlsbpproXopfqmowgmrt]urawnonsmkyjathm^vmuihteg{Fpvqofru^ztnjru\ptf|nthpTlonllWotfohqpgottsgs{woasv{jkm]fhqjpmcfppwpomkoqlhlkjihWpgxpoodq}nqsrvk~jjyxnrnismnYzgxpf{km|pfmntsVpjkte[ssjhvjnrlpnslvjmnmbommmzxmmrpnmlSlukmso~q}Rnlnqblnlpuosglst{njuqmtpeovjkqmorlli^qrppjnbmbnyDszw]gstptlno]tyjoalojhWqppqmopm\sonwmm~lnjmJsnookmknncqnnT_oqnnnwml}jqnpppeqql\loronm~Wm\rqonpiZmtkmroXrq\`qomolnrmnkl\n^qnyq`nmxnjllpmmqnpj~moojgllnllqOipncxg\k{t[m\nsml~dlapqoikkmjlwkypmrmmpmnokkfooq|njcqsLgrqpy\mvj^nnimtmxsjmnkvkkxnyqm`okxbnloonmovkZmpllmtuimqnprml`lqrGet[pjwnycqjqJmTgn{rqm`BkmooiwoOjmgsmktngmrjjupjnniprhXkt}opk|\oqmjnmmn_neErqonpqmmrkmtirinmSmalkiolklunhmnmpkpm{oknbptlxltmlyyPpqrdQuYn^pnfinqZtkm]rpxcpioWkhzpgynnZunamnpufnjmmpmjpqkoikFfrbqlqsmfkbiluykgmlppdqgqMvpmpYVg8mfjhvnRw{jmjktnshujprlgcokrUn{vrevrjosmldpxmsYlmiMAtkliorwntmdnwnbrmng{nsnkms_rl_ontZUsnnoks~lx}mspfykrmknlng__PzpasoijkvjxnmoiusoYplmp~Z|njidpkjV{qlhvzjwsqsohxponquvoiopemurqmuYkmogmoknptqrzqqceniqjmps]qknkfobqgslppiiSisotklr\mhmmlkqpq\}nlruptokbhrsaponklZwQhsfmiknmbmgn^ur^mopxhmsmlsxdqlrpskjpqiqYsxturyqop||mkOpievopkiqjdtlighcorkbmmgmsrspwkmllkjaSjmkunqzqpr[nFpmtnrnowgjcnlsmsmmsulqsvg\ligjnbsqkplepjqkioqwn[npo~^iziTiejp^Rqiagiuhkq{gnmlulomobiopflkonlmmroion_onjpmmokolpr-ioot|mtiqcon_nhkn_pOpolsrnzmDkZVp\ogeuNqlmqqapuj}klkpintsployXlonjqsqkqnw}pulqQrolknipkpTjhjwlprmlolnqnook}=ospoou]zm^mlqsJ~roPpmlpaseeiopqoxmoojfmphFjYoo`qmkimnbnrpnhlq~omnlbkqirkeoqfTooohioVsfkbqnmmrcptqXppkynilrifshtnotkPpoophmrplpvYrftooZxjtOpynxlvmsmwlpnmmnqwnuoPhoidjglloomsi{o[llfq{pljqlpnXTxpknmArq^lcWlfoXoPqnFhloGsodnpkoonzmjmixlmqpkpmmlqm_n}mrXldok}cm^mmlqcpoglmjWGkpvmmoo|cuUgim]mnoqn~plpkjqhmo^nmoUoLqYmgnj}gnmokw]qk`j}niunofhtcajsn{lklaZqdclxqokngt^n]ypp`e\kQhuQmn_tto^qhrsilps\m|mnppfmn^|fthmmmm\doon[vgYjhu|usmjqNxPh}Rwmaodlni[nk[olYRlupileOpjlSylbmanmgvibrbhx^yu^gtjcejeLklslo"Y]tsr\fkxmgmuncslwvmnmpnhlgneoscrwxobgekihmomeWhrvrPfk]qvlo^ncpbigtt_oSojmpqlQ{nnqspopwitvgmkwptvisjktjqplifkLenrzlygopmjfukokiZofsnvRgGYz|p{pQjm{pYVtmrmsqj{noho~_JtifgxosqlxInlkso`hmpii~jsBUk_ljTdmhar~urrgluhvgtox{t_lolbhvlsvqigpVhlpjklXp{mvyp`Jaonplyeclwrnvnria6chtltkeqUkbtrnW|uhQomtir_vqcrknnoxx|o^lsk`_ebujsjykmfR_hjuorneikproiyogyilssgoc`jlovojnptq|qpmujkqposhrniWqvls_nknpjjiupofgqatolfjmfgeplrgqnrmjsUl^pWozhqqbhqeoorjprsiutfdwqlsU{krijg{jppelpmezhnrnopngmvmhguJnoljk[yqheslwhldmtngqixnktlcelkftnitrhucnlqnfgiqmm|[tpmlkmrgvtm~eaoobkgkrmylgjjnne{ifitomskgnojfjkkemgkpomlxlkr`nph}lcnDmntngqotOonkslfqjpnqumVtqXnpf{qt\mpm{wmfsUrllhvrpcqppp_4prowlmrElB|ymnqo]konnpuqopsinma]rrli|oolpnZlk5jqk_TNmnhjo\okXopklsnsopj^Xphkqrv^qlkmZldi`rBnqpllZjnnnggysjk\rpmpqg:lq|vmsmpownlpomijofnunzjukjeknqohgto}o]UpeoYp`srlnnrjspQnmeTklozukmqonmdgmlqlilrnmmqvmjpnchtxhtlqpwqgmn_qLipllpmYk{dkgnbP]m[jrsrrfHqgQllmikqgksfoasnmKlrclnknh~kkgzmenoUnlpP_topnynsfk[opojtqsuqk6oqmnloiQFanplnm[lnknmpKaluqnq`xkqrlninonlwUtzqloonokcploopilmlmomx}cldqldoobwenku{uq{q~mk{iinyku`nqmttoalSuspiwgpqeyax{|tbjqktlblborglx_neqpqpauvkwXiwgbaqcio]vqzeiqqmoqahw\njessgifoopuowdrsqwjo^onTmlxpikdmo\neWogkt_ltinuppo|lv[ritcn]rjioisi^{WrpogomanRzongsncnpkavkkRz{qsa}jy]t`k]tlnkr]nin}dvom{rzvndpfpqTlttrimorttnpprlutsqqpnpcftti^qhxibrhtou\lwxp_kwdykligkyhzvtcsnk^kn[Xjrdv]grkjxvppqqppUrYtqrhpuufzjileovy_{raedi{u\sszqwl^lmkp_lxjm]m\sggpemcbydfZkenLnljdrjteYYmbjpxrvuk{]ynohX`upvpufyooesjmlqibgaolaolk_bnqprlpwvppnn~xo^`mlQ_otewXelkdngkj[mzyzmtbJnr|^iqxibSiehidrlrincryrthmpocljjslqmnjmumdpdo^lzkGvkltlzoilltnw]q{oq\igrmmikeoevrxn~iforhudooWklpkqmrmWsrmbksem}nostzQ7cog{ork{njmngovlrvvylivnrnxdwoqjjmkrojpkyofrpfzvpkmimnrnvpgylnliig_p]skqYogivmfmnmol6qporkkpxRtZnrokmeqv^xr\pij^~lpslmh|nn_onmoiid|{mupltqlqimvprhdooqj^gpiiPohehjcnkqgqom{phlqkul`pojolrnnppmikqkorlnipgknoqvnjZnq\jsfgjnoonjqqmeknimujoegsjpoxhkmgppmmlurilnhlrjhokcmcotlnpolqnnmmqqhlqdmjlnnmelhhkkn`khk`mpnbijlsuleojodnorpepnrokpzknlklqlmfemmpld|ocmmhrarrlhnpocpgjpumvlzjqhrrppqym^ikfpjikpgiqmpkmkpilogjtkkmnqlpioomlSmlkm`emno_vuopmosqrrnslniaqowfEtvwHkoTppm[kn`p|minsilrmnhtcn|v`lsnrihoKjnxkonlzrknqriphflmt^gwflylplnp}nmhcrrpvpcnslBmspqppigo{jxlglrrpqlwvfiWyrpodlZkginnnhgnoolnmvoomropoih`lcdlhtsmrno]nqnmspojk}pnn[sgjeo_kwfXcki_lUrodsMo=npomlppzllkiokpinnkrqlmonojoknkkvlhrmri]mtvkhnQmc}mlm_lmcqmgs~ipmkpnmtHigrsg}~arzkmkoqRokirnikqinlkmmnotpmhkpjim{gomk_lvhnMnlmknEkVoKjhjljoqsn}jpq]cngsmnkalninkjnyjnojnjlovokqmn5jniqgyl~jlvwsooGpmionpo_kmnpnmnojlnZkntmXoQpoh8npmpwj\nhlhhntlhxjnrOqqlpUmqohnooo|spjqh,kqfrkmojmnXxkwmnsmlmin\o[kYni|lqoaxnnsqo`qmokmriHhlCamlYq\mXkmmjoktkppnkhtnpllmmrmjkeffrio{rnwl}qroruioholmjrfipYpmdmozx{ykhqdrvqkskXelrmknnn`sropsljmQvpm`do`noijkoikmio_o_opel]tork`mbopmxrp}tUkolwkhmuly_nouomcnlrunzmfpyomrqiulmnwp[rqjlvmX6jlxoi`nlpq}fjnqpSzbkpgjtjPkjZrknlmxskmkbknmspmm^opkJr^oddtOwopmgbsg|clptPlnOoo{m}fxMolnYlovmnthymlksozv~nnkvkuthvgkspzdqiepdEkqlQomn[jqsljjho~qrhziiVpnstskonsoTpfhudhaixnl\k^xndlskvmhoZkSt`sefo}opvsdhiin`imauqlolnZhkkkhnhihg_t]hb|CardfshspcTokzaoNnnpbbnsh`zswkknpplkrpofsmmpdejelkn]lmnrxihVpgnokcmlknjwyl\ijqDgpijikpSnoknHk|{Mzjmigpujyw[lsnlccunqnqpnsxlsjslmnshpetlphY}qinselniglYfnmopuvqmrslOqtN~pnr_ookumntlr}opfdmojwdWeVjzdld`oxxqmxulpgowglp`tcldqujhrkpdjhpl^kTszpfbjj^~Nc}novlmknrunjvmyaZokneclpmvvrrhjnkptjjwmo]tfgahzklimXbbnpd{uefinhtgmplwtifpligSXrpqqgiknksjsirhiitknmqyxSulhYjtkqwmYqmrrjmu`coplcqp|nlmpsu_rsrposhfjmltspcehfmjinoeyfkowc\umpokjpwnusmlutkrmnkmxltiptrhipqlfnwovnxopjmrvvibepdpiofqcpjuorooyy{wrvophnfkrzujwmfo`{pmjtsyjiqiptjlmgonornsvhbyfqvrlhrrsmlqnxfyqufqtollkluvw\ktmkilntlxlnomklhmnihipve|olnsihkprgciqrentjkrouviyqjuo^okssrjmoqqmjsgrto{tbtrhlsp`jt{vqltvhiod`dZvxohq{iisaydm_uaspmkokjnlfTkpatfWkUxjnRdwrqsmc_umghmxlmzhlwj^kilovvhailkshqkxpf`]jmt_kqxqiimijkrf__s}qbitlpUjllmogmqptor]agvdoqkdollmmzrqeaxpnrmhkgeO|Xr{frkiwzciNqllwcakp|oqqrlhop~or{tpt|ldnpipoynhljnkufkicjtjnVk{mcnoeswjosovztlikcooqqjolioqbqownrZD{iovssmYeKo|dobRpkRgkslnvyoj\onpqk}lalgxmwvvml_mktSthchkuglfjzqnhijrqmVuhispck[u[jeqhq_i\fyrhyljoZuZkusrdrwspvxpupVq^ximnkxxiiwacqfakomaqoplqgqcpmdQUrq{bbglkbu]j]urmtvnjqpzctml^krqrbyy]qmilll{potuqspanjimZkmasZmbmfhTn`Jkcnplhsgbqk]plpjv[mmflfkposlsJqciutyaqZpmbqmfyshoj]WjtheQmT|iqurbtskpjhqumhm`wsllwaae[sspjuxnd%lpmo_mtoWjrQykzjjin^cnkjkmmbspposeiytlmXophj^jxl|mnlessvptktaoreRflqOmhoEqtvlktipsiWHs[WrUiwoqq{i^hopvnpWtulxmx}n\ntljkl]ylkghhoyqtcjuqwlpqSsuzhphsw`Tl|OSgkfiqeq`t@j{m]hgnmfoMomppfkiv]nunmGivmjxsmraVzlssopl=ikjnL_rqpycpthu{lnsqpvkdjrmumgdiemgnmojfFsgufmqop:i|dzIrkPd}fqs}lYr[MmwppjFpk|foenopyhrgmilhhbkiylouoysgkXpmnNglolp~hsrfijijnrildg|tRe|nzqtmijpqoyndpqgplpfpqkownrn~ebiqsfljssVfmtm\lhgpi_tuvkkrqzXxwn^qyhlrrfoix_kvyUiqhijyqtmsojjWm_moslkqhqjzu`rjZqnfkhghnhoh_llzoxqqnaqetlupuuoimZypiltoouwbqqssumsOfg_rhrrqsrfgZf~lmfvboimoojjTrsqxoPnyqrlcroieiosqfm~jnhsmkjlNlnqanoljjpo|krvllannWoTojmjloqmnqk{kbqqqKBoYnTo\oapztmw~pkisplejfqzWkULlhenplknjjmZ~rqhnonpqomr^ztmkobppkmolohj~mompoqbonuqwogkpLgnnilkmtjmwnmlksq`ylvmMnnOniqonky|q~GzmolXpoojfmlt^flap`oq\pmvpl[kdpqpwloixopmkswltpll7SenspwPnm]r[qnb`iionShlq_j{{hopukRdqtfs`kphnmg)^hwc_pyfpYcQgrkor]emdnhrnrfiqcs\{|jlogehnluusqjph]prhj`eoIupoTmh_{|iVfa~amurrgsknnopocnlghbrmqluoOwroorgmn"nkn_kjluzTlg]zrrjj/whnwipko`skontqvtqnmihomdip|j^aovhnzrlFfkgq]pjp`rrqoposn[gslisljinhrpstcnish~fMxyhdOnipelsqe^kqqo|ookpmj{nhnbillklppoQsmlqplijpooqyquojpoXildnn{oqofloBnrlmmomtkY4oN]ll=Xigkromn@oSoaWnnplmmjminkh]rpnm]qpplpdnpjounomilolGmmnocolnljpmmuoglmlos`piqlmnc{qo_oboZg|punonqgpkpejlm|qln`onhnxsv`lam`orimnongmnorlolfnlnd{kynjrYhalpwrsolWppupljwss_ieqpdpuZrhyrcmhpjohmhroxrqjcdpn]cnnxd_fpo]`eqooyllm`qorfpwnpxsn`nyldklbnhgith^{lqkgo]cdlqektjcqld\ssjmevrdplxqxqjiniwkyojprsmympelssjkbilq{jqjziqgqjhpntikneohqeflgtfetppllsiyroyihqmurkwy{znnkhsxkbrtqhjndkvnvgpcirmhk|rjmbp_nrtonnrpdhbgglofkmopxnnxwnjdhmegvmkwi_jnoiuqzokqkinpjoouNs\ttWlx.u`rtnHndivnokfimnuipVlWp~sP|>ppkpoirTrgyfhtqf:gjpqktsy]otom9jj[kupquiTmurnVpnmj7tonnGnvon\npiprsxloposnqosvom]ikRohndmror[fqmlmikkjpjopkblxzs`nulnmnnmqnopxmnllonL\jlkxmkjkmktWkqguxcnmk|pmlkmliqjcqlscxmo\nujrr{kZpsnocpnnrpksktr~iosir`qllmjmmnz_novy|njiyissmltomVqpXrpovk~wp^vVljrmonqisVkoxzrkqnoovpq`jfhfmksp^oqnessjygn|fu_uhssroitcongn~mj`uspeoosungkvvtkjnleonss^rpppjhoephqjogmpvoeqyhinxknpylzcpgplsloggamkrvqnr|rllYnunajq[qpniolegmupqqk]mo}ugm|kpikrapmofpknpj^olu_wmlTtrpcEkul]oopm[khgtdjaplSsztpfrkgpaituioVk`lqxgrfusimseg_kv^diqn`nFZvq{qzjc`cmq}Ofj{7g[|uinnn\knWnpUks_]nlutOqmpugpoptmqstnz\qleiSbYhg\gjnodkmhUjqun_t^vmpho~pgqQtnlvfdLmhpnSug_fenfigmzjig|o_jjclyxg[tryvp|mtilhqmiXnjYjokhoOnrgnrjcnkmhazdrlnntAkgpgmSnmkbkbksqm_ju]lAplTlqYnhSrmpkgrbkp}tim]rfljgrqu]hmlo]uirnomnpoiol^ikgq{npjyio~[qfwVhenhmmhsbpvopafsgnlqn{keomipnckrqhonhqksgvpiXsvyxkdrbqhfxsktvfrqojolnftslUrnhTgnqbnmefwmopajmwYvodkqstldlqi\jZkgkitzmdmhpcdsqYorkink[vxjrlnosvkanrkkk{pqiltmerj]tkrlonn{wnkooqolowjkvissp}pekojlx`lumren_bqctgl^pYlmrljnrrxgqwnmgfj[tnovcrlmwg{qmmzofjnsokmbi^^htnmmnkioosiiwmksumplpeylamtfmlsil`pqhsrqqnkhomsoqnhbsmigloijkkgphpeuulytnyhlengmrtgjoninszpmn`ktgqm^pwfftnkogcnhmrlimornglxaosljonnlxjjjrjjkmryrkibhlpjbjmqqg{h`gots\bsplpdoqppXmxoxudlkqqdtinrdoqirfcrtqlrjzlotewouyuperkjompr_tmnjfiidWr\qerom{kmjkvufqiyoexwhsewgjridiumnapmmoi\sorjaarqhnotlgozpgcuksajVboqgo{vtdVhqoqelhsrxqrvrijfmujnvoojmpkrsjvrhgqc^xquntjped\etteolbxihlnnk^lqkwmnsqpnljrs`jrvknjnwsmkljnnienqj^oljgpoaomjorxspXowpmnrooilpo~^jZkxTjlcvremxjokuVkoplknpdorkoLolrJnppoyo~mmmrrqitrjnojqjmjpkudlT_epzGmoSip]pr~orqSonjyrooNgsonOohponmzvuonne|qqnkgppQuk]ilgoGc^qomlo}wlo[yppwdJkmmlxkznpe@|tkpqxfsmloqpjtnqmlkmdbktjnwotTiqqhgdpjnoimsjgpnfalhmooimpnYiovlcolnQXmmojomilklkxxp{qonnhiorqPnommsmm|qhjeorolikeTnvkoO_qblkqnk\miiqpogmqhjkplnqqoh|nkkLm[mpm]numpmq'}opTq|penmyqhliopomlhTQnhkmqfymjjffnum{eldonprXnoxH`njgplmmnomkfrasBsh|kk{qmvlqqrgpnnlOmkprl;mlpo~fo&w|mmof!ovylqki`iwm]fju|glu_jUs_ngpwobdlmWoqUnkWeroojnk_pXhugmognptnTlfnfnwunoq^u^}poljlstsnzlqmmuqvhesptuidj~ntbirkouohtsmkcJn~lnjop_okkboovsYru|n[owrfpr~srsvwc`ozsmkwZglnj{woebhnnphr]qtjptfnlmqoojjso`^r_lmn[qgd^Vhnlpqkqggkfr[_nfnd]}srowlec_jqop_ijqmrqoftntusupntsrplyvqpUmnpjihtorxniqqqfmnr\p[enwed;Ygeojersbkjlsvqfeqlknpypkhorscjvau`kfppimripslxmosmkoqp`jSsgddroomlnuperoor|kmljnifnIkH|nooh*jjnlftonjgrm1nznkOocnokkq~hmqmjo\[ajoXlnqGko]okmlnmqpnovBmjooqtwmkknn`wuRpoj{lOqqewoqmudlnYmnxuirOWYkp_oogpnvnonsmlinlmkqm}tfcoSoLkngtnntwPlkirrhlqq4jukmtsqrZmjnxinnrkhlpUnksorqsurmlimlmsrJo}ZqWrunwsplko_qgpiqrk`{jcPs`Tjmblkjkqxvosjpnrimnpgilr|uwql}xVWphblkNpslklqjpgomi}GYmljmSsXzsxnjogil~cokUnkpupupn|znwsfnppmkgSnunsmjo`]jnroimqo~ncpPrstilujpkiomoio[llonPYmnodmkS~mlwtWgplmjhmomnmcpon}isjcjukdnnnplunnrllnnqnnnilrmjhvlirnnl`onsoo]lunorcrocn|jmpnmounanm|]jhlsznnnnpnkjmamlmnqohonpptjohusnndot`lmwkmpopmmknrnilomkyhqo]kpnontoonlonmmhqaxqmnmrmgetooes[nvy|molnom{jhmzlmpoicomfpppnql}m^kkncknkjnuncnppppkonpmpVzbjmklkolp~lpltqndnnrvlo`cnlqjirmnibmrgnehg{lmplfojmlnmmmvogyelqkmifqdprovmpaepltgqsnhomiipporgjidiljlkvpqspflilkprlnnqgprfnkmselpxovlsjlsgasmkprptqopjqdomqrlqmlmlnnlomzpwrklirlrrnqoklkrojoqagkoqjpolVrmigglknpqrnpphminklsslkqZptvnumskbmklrgiiolniksckksngkohlnkkqonllitvomopnbpsnvroqpopxtrmllgrioonsfqqkt]qonjotninkknrlnmhmjttognxopfamrtenilnookiknpuqplcojpnhbqyvoytmkmlmnir]oqmmlltpspqtpmnhmmh\jvtmq_o}{pkpbjphkmopnerisngmnoynoknjonqnnnsrhjpqlotlulrqtmqmn{kisspsoyudrnwopqmpqsrpntlg|ms~jjoqmmqkoodllpnmnooqqormsqoxolootfwmvtogkniltnji]YhupjxpqkinhplpmeP=nmkmown{ntoalwvxkokqgkmhgromtkjUmbhiqqoenkofnkmyepptollpssojxmWnqkfmg`pfq^q`itscpwHokjkmwvnulpfymlqvhohojplakhnsjnnpkjktTlt^pivlbj]jujppkeXrkodnmwmmnsopdrtuik^nmswuin]uVrkosminokhlrillqppupo|ynsapdovnqrhstsxlnlnvoqjdnkbxlgpnhqslvosjpoqmxopplbrsisenthueojllqkkfvkahbbwlvopppbhagmhmphkpqxfpgjNkhnigmnkniprel_lmlfmjncmygfixnioljifjxnjvnzwpxrlnlidmcos|okvopnlhrtqnfmowjotlnkr\kcb\bmfmomhnuupovhkjimylpjhnlit|~oflqpm]wkmkrokm{wothcfrnzjrWmhjeodqapu\nphprsjursjji_{qskhhomotj^rno_ffmmgfmnkpunqsjgyopp_qilkrm^horemwnlmiqkxmrvookamugtlqjqjkjkXm]nhoeosojpnovkgpqnkgnsosnojIn}hbjfjhjxlqihdjdlt|Uuispls|uiprikqndinfrmrnaqmwnoimqooo}nlokukhiftpekndenjmidll]impkgjbxqfdkxmksefokhnnapkdnkscmnm}dlwnmhlhjmmllvii{noxpqnjlh|mmkmnjoglnbnqoeqtltlkn{nilioknw|onprmmojnmpjjqmoocmnsolwolnnpopsmmrfmqpphlhlrvdmlpnsnionckjknlnojpnkmoslljzmpp\oltosZmqshmnnqkplklotroyjsnhpppglozl\fopnzormlwomo|`cln_mgqosnzmlmlnopjgo~plmntobgnmwntykeiqoymoll_hihYioqmo{pnropvnin|ls{otkqqomnblgohoomotspoq{jgonommnnvhrqpetlfknm}npj_r~qnqnrpwjxcatpjpeyjlmpkgkzqxcuhiokhrlhnhndpgqizpigppqkmmrnqmlbip`epgkptelgqoqmnkpplwg{ivrnaso_ojjmgknvtgqiqsmninmwlljwujklsnxoplimofjnmlnolpjpnolpmeuqqopvrsprelpljmlplojhnnnglkuop|iisknhjrffhilimnpnqnmrmyhkmrrojgmklodoqznjnkppbmmzqksrmktevmkltlimpjlnhmirlplmkkukqfRojoprmlnvqlmk^qhpomolpkinlcsnznp{ob\hyml\onommXlm]tlloomlmmpspqjxohh{gklmlmmncjnlgimnlnhoppopqnxulkhhqqvmqtocklpntm]lmmulryinotkrofnlmmqnptqihnm|{ooonnp~viofqZlqx|lponlkxcoocppooy|nqrnmslminrfbsmnmkofqhphnitjmkmml_l[thlpmmmyk_mkobywqqmxnlppomfbppndpmnflsjhjopnpnmsqpVpomlqorrnl~hoqtswmznrrlmijtpknnnm\qfpqnnonplyvnunmtlofo{qpqmmjqXpgjnlko_ostnjmlujqkqyojrp_mizmonqoolmtonrujompvlsmwnkcpmooonklosa|qoopmndkjpdplboujoneonkkqZivaoqro{colzomtmqieu]zpptomsrktmammpmponkqlptryootkfknnnUojsiluntokqgwgllkpl{fluijjvpnjwiqlsmfnlndnxilkhzskpnngqruvfkfko^cmqlgomrvlpgoqiq_lmxks}oluppoproqntkkqotnmirkrkwqgnezonfvlhsqtziysnkkqmcrikosslmtprkrognzgjqrneggjoridqnuuubimjnislnzhlujnmonpmkmqrljk_nqhponklkpmnlmpipnnm~nnlungptrlmmmuvi|rkslkrskoolrjqmkjk|rpqlfWtkjsshkfjdqlwgthjnmocmikinhkjnjuufstllmlmqqznrgjlcoqwpmslbnmnqsnnh^uhwlpqolrjpmkrj_}kgxp}hnqkpw}]nnquYrhphqjvdumnmn~sljgr^lhppkkpqpkskmnnmplnrkmpmkmilktubsnfqopoxknsnmlktlrqkeolmvpofqrhmcpdtmotiakQmhosqhotdmljwippwqpnmsoblj{qivquopukymrnslqonkfrpohxmionmilngqeholpnvpjpssnjeooqqomouqnmretlrspnbmj|pl{ogkhsqqmejqjnkrapliikprnnvmrt|Ytqjsonkmlnilhrxpjnjumpnnpubnwdknmaqphoktqqlolhnmrim`nknjjetlsjunromxprnqxsnlki|llioirojtkptindr~lkpkjolpokgizhnwopzmocrllqhfuuq~qlegtiqnokZoeplkjonmqpyrfnntkgqolpenmlojwlrhrmmlwnmekqqqhvqj|nnlx`isqdvooapwpoponqfronhtknp{wknnznishkrqohyndd}mpqsjnunukukhcoedoisfgxmnsluqoqgipprmpknrrs[_elkdgpckmnsrhtkvqijmjpoojfdirqrmqlqhjrqjnb_nspmimyrropyw^geogrypolflplnvfmkifveropumnippsss]fpqj~nnmkhhedotohknwokbsllois]wimionttypnnkxlsmngloxfsjhozpjihokokrkmb[kotnnpko|jbfjjoxpei_sqgmlv`oioslkqsmogpgprjslgvjtkqmsmpvmsm^qnqustlqhjpueiqohnepjk{`vUijmUptmjoPqv|gomvonrgoqlhgpatulvkrlnar\nkbjflnfkpoohfqkl[s``ongndpooburrigmoiqkjjsmntq^ioqminivPpqtnhmjourirutmllbi`kseqgjfqumkquoonoonhfkkskdllopxjylylcrjmswrlkthjqmqlsjwlnqckjmnjbmnhltsoqgrokcctmtkhtmq^lrnkngnfnsiorjiv{ojvhomlnvnknmxotsoogjqhvnqlvdunqfjcwjjajop]rplhiattskolqltimijfrgmrnelkpkfyhdukxigplnlrqhkijmitpfknlnylnlmusmvunupsipqhjqdmgqkpkkplinjntmgsitsusfjodifhswmjifuyrnpdhlnjtnkhouojhjinsosxiprmofrptnhkjlhponqgjjrminmmemnqtqhmktqnopxo^plgof`wvqnjl}mrkwunbmfhonnkitolon`Zhobgdkqkrkmljnmsplknjplslspmquprmqunsbnmkrihonlsnpmoqlnsvjnkl]nYjmeolnnnlotmp}`olnmpnbmlmtnpbodokonnool]ljjkiqnntnlnkppqiokwlubplonrmleqpnmmmmimsnnl{oqlokdhnzkinprsqzqop`ncpsol\ooqmdkmn{rqkoklfnpqjlyrvktqosnrijmrneomimwbrscmeh]mllwmmwkkooqrpnpzpsdjsgpMhnhqqppldnfkkdnrrqiomospploqpgnakenppimkqomnuldkltmpni^Zpmoksmrpyppnsgpmspib]qoppoltlsotkoootc{mwnnnivlhxeornexpmumnrmomghahqohnkuontpznkmrqll{omnkpfxkzlgonMbzqktpwsrnnnspmojnlsknmrlorjlltfjpmWjllkqtkzronkknrpnvoj{tenuvnfrttkmocjqymncrhmnqknpldbftnpqqorhkxpsopkgssfohepvjv{zkxndVcn_gpbgpmqitmongn~qkvrotdkkooroopmmneifpfXikkllsomoiosnnF]mRrjesttqwqpomwngq]lrroqtsgimnmhrrtnnstpqqopleilkswjo[pmgo{mcmtgqrnc}jjzXVfmhssolpyepnkorsmjpkoqejlkmlnfomhnmltosfikheoikbpnmsbisrmnhnfhqmqrrkomkk`mqgls|jqpepqmnxllnlmrdmppfkwrpngs`ojcshnhgvqmhim\kiqsdbrzthosrplpxcnrmovmhnnlmnihqjqllo^ktsjiosrihiolopjolnnwijomrxoskjiohbqsjmldrnspsmzjomnvkqynjjqfkbomnhnjmvlopkpbkhnkjmljnikhjtlmnngjmsqospprevogmvigcVthUlkmZtjvgnmndiSss|htnyikotjmeuyyrtmreodom{olmhpiintmkjpknmsdtm{nqitkkppnktmskhrpsprmlpoiqhgmrmdjqqcxygowrrnplql]fiisewqcrnlrrktmjoqnbcilhqatxoal\mgrprjXnnrkonlnmkfnlhoxkf]pnrqjplrqoopxmnraqoglrtnriojcsoenhrqoiesnfonngncntmobpfrrkoolnoolkmgntijoomfmorajlpLqqkqmolmtnmor`oYoomnnrprniXcqoqkxporqnpoqoommtvplipnmmnkopnUzpborlmQjqrnmompppiq^\mnjjxlpnnoloxvpnooknno{oqonnlhnxslzonoVwqonnoplemtqomllnkqnnj_fqkplmmqgnmblnwpql|mwlnjjsong[llnosfmqvnmolhlwsl`mjkpkusryokomormmnrnnmvupsqpoooo~txmjjiroshnnqttudzmr[xoqijnnglmj_olifojmkobkmvo{ntqcwqojajptqjoosinmjpnojkmhoohhgjZrlsnrrnppsnpmkknmlrtoukdfewpqlvylrxejunhfnlsupslmfjmzvqnj{nrm{plrhqqiljqpxkxnhqhpxlirqno~ggkonmpjksjjihkpkgphpqpvpmommujgjtihmhgwgoeapoxltmmjqkhqcwknmiollo{ljnmrnohniqnmrorsonkooolr^omkuljhepipsbmjznsrsxpvqqooglgl]rfmtkie^_mdmhzg{vnojhomnvryzrlnlhmp~oumijzitnkjggpsrphqsl\t~tvcipeukkirrriogYxontgjximnkijfpjm`rvnqntomolpcsleolhnmpjfrg{ktmnqb[totf|jki}qloqbjsgholr}qmnqikhjujlkimidmnqairncfkmfoqhtvz\jposnxmqjqijjkplhipamdmjkfhhogeholpgtnudfkrkprX^pinplu~spuyttonvksqzoeysuutonsqoouruwonkjpivpomlnrqvlm|mnuoobpgorphqjwrnqqyl|svswoooemnms|rlpnkusnorupsvenr}hknkjvkukepwlxrumqqosnvjlpmhlohvwsyonytxwjvxoqmlungkynulewrqttplmmhqiytnlvkjaqrahkknkphkqvxtilvmrojzg]pju|rrmlvijtrojgmu_nkggklfozioepqopg`dlgunpu{qndq`itnumomnjghrzenonopo\iiemsgqmgmtoulspnmkrkxfeiermtlneksznonmrndm~kkpmmmtkpkuwnq_rfoppmpms]l]nspnl]mmvkipkmfkmlizkrlr_nymmrtgpmtmdj{pu}omqusihq\rpmmlnvpmnqmolljsvlprsviosanprkkl{homwlpkyqumrjgexnpjcrrthkjnkequxnoln~punsokuaprtjomrkjykqkoroprjtnkrvorjuonuntykmvzkpqknmkqslmopdo_npnmi|rlbihnomqommmMpqnoqmpkdoqUlrhpl_t~mwunpkkslooiupmrptppourkpsrutors~llfq[ilonpoeomqnmnwpnrmwpnkxrpwomokpnlmnjZwnpqlmkepanXphvokbsiklkxq\lkVqmro`bominjmookhhfbloslkimmgrXomomnmmnmoophnpmxntnnqmlmknvflnjqjmlkmnpkipjoslrmujqmpplmlvemoahmmspoommgmlm`mnzqrskjkqjxpdmpmvn_jlsprlnonjocpznojumXdrslpnpnkqqotrWmnjqhapnpqnknbiprpmovyoqkonbmnltoklllknkqovjmvkkminl|jlnpsnrmhlTxolnnoqltklpaspoutkpwpnkwmtjt|mntllhmrjtmmrembtnegpfllkonxpdqrnmtjn_lmpvmqnmdltpmkxqojwwpr^rfpmldUmomceknjrhkxomnqu|rnphqkperkdknjtghnmqnrkfqninsfkjcqlmjllriomaqqoerkqofskqpmiooljxperlspqpnvipjw\omiq`en~iflnxojjkkqlsniiigjjqmnmmmpnhjnnotunzqhnlhgmsqjpqvsklqrhkxjiniqcoqhlhtj_nsjhpolroijkepirnbmercnmrsqnrmqrll`tnrktkzpjipkkjsorgnjpojrnlpubbmrmpofklptpgijmjjcyjrdikqlohmbaggusrkentmp|pdmaymhtknjllsikqqhqdcp_fqn[ramhmhurpfckrmmnlpplhnpu^pfcpfhmeotnrtiltrqlukxonsthrkmhosdoplrlvsonbkbhrnlmomonlerehsblsgntnjofphlhpqrhsaksnVkljvmmnolrhnhdlqlrehmsmjrrjwmqgqknnnqprwh]ficuonfoqttgmhpj_ippulkolrsikqoornpkpuls{alonpWnmookommqpnmkqmnpjomlnpeplopopoonn~hk^sojmm[oqFlgr~ouocppojjmnoqpq}nlkmqujmkdavisrpqqvomptoowmwkioonloxmnpnonirmn}mugmpl_mumljnml{\~fpoormpkvnrnlpkmonmqonpqipmmrpfoljn[vdkomjkkrnj~xponyXoldmpomxkjhd[tqtnirolplspolloomqpnocuuyngmqnmrmYnknitelvqcqkduvohpzegppikpmfboxxqpdlrncjm`tistjujlwzquwifostpthn|pgryonunfqwkwjqvlnrmnoo{voqrnquploluoterimmrnqcquvsoesrmqsaprxlm[lrlldgnrfjplpwroloijtugmzljlsj]ojmpplmmfwnUvnomognssqitnopookpsptkimxcrnttwlonwrqkqgkoo^jktdtgmulmsnojploduntwsarnmrnmhnlpeimnkaodoWj}juopnutwja`glegpjnXklrljqrpkr{citRmucjjlwgnn}qnovhnijvarpogpkoomiktrsohvhjserohlpnsZpweKj_isljrioc|jongninmpplyut_opfknormnjilcn\emle_hpofoovpdkysklSpmmdjmiqohrnoodeuqpnokqsyverivojkpmvtqm_mowtwjkqtomemgmmlsrno[jvwenoWqjomjli`lnkznoljtmokqmemnmrnfnokbqvutmjrp]rdhtrqkjjhnkkjtlolfjyns\hi`olmllqttk\qewpkzohkmpnkrhrqmmnmumg]afmseqpkovnqpogsbkpgjluiknmhilmifpbumpcjnlemalqojlvsnsynqlllgnmklpqkojonf\jirkqkpdlinmvqkn_grh{nomonplwhnljncqrnn{jnhkpsX{boosorqtlqpYhhipj]olm[rqlkkphqqmrepmulerugmmnpojtpoofjjkmpqojmvmyfpkqmpkhmlzkqhprnfliopmlsinvm^horkkunhjmyhjgpniimdlrqqlllmlqoulthruroonnnjpvqomjknwldhoquqkjrlmgpjusvvnxneopdyhygpntmljoqvgplljhoksirpljlkoqbggsmnjrqqrjipiuriijmplvmeqlnkhrkktnhnmwmnrjtgrknunnlowprhpmeqklirlo~llnnqpvneqjplpoknmmpmfrnphulmigdsswjpmjmhzqeqlxdrrsrmfepnkympwqiiwmulegllcnlnvnsznkxpulrknoowflksnrslootgqnbmnkqtnngkkpklnuakhpskxoxlhshe_dlqvjurjksfhpkhunlqqdlrrhsqqpjggnsmbnjiotqvjoqkrirplt`pkllppqfqrjerfhj`hiemmho]dqoixjprkmvpleiimnsmiooleqpmpqqgnplhsmipunskomnnitmkkonwtoononnrronmimdknmfgqpncnhtolthnojwkpqcrumnqpmoohmophm{nolpohpnkjjgq_qkxgwrpwrndqjpjrjpnzqdilonomcmljirqovjoorisloqknlupjvhkrhlpdopqoruikmikttYhlzqgplngnompivnqlrisrn{nonrnoznjnptkqiolgalhnernriqnnfo\mWfforlortlfkzfikhnsjqk`qnxrrlyhmextrovjohl`olmkmlotmko[snpjmoennflxrgfkw{sqlvnkqnYqojllkjofvlpqpktnuhqjfiojjriofldbjorlnjk}foqpb[n^qjwnkpvisyitnwl`dmjnmrqtjvmqnjd`antpmsbiis^^phova`muulpqslmooqxljkndtikzlYlkwr|mnulomjmpnpdonvnvpdib`pnnj{tfvjqpljdmjopylozqhejnoimkotqlnotrlno^tofuqlip^mlpr_mnh{\wanwolmzhurrmp|onsgpjrldqlnsmrmnq|pqxwnut]sortklkohnqlphkpmhnilhirpowijkhsnoielpou}oskqgnlklsnhjsqpieqnkitsmjjluuqi`tmjcsough[jxnmoxypkcuk_ktnsmorohuiimgeupenmwlonhzmllogonivqmlobsjromqrnfrrrkiortzpmyyqqoqhowig`mfumjqybrvnrqftyxmitnYfunrnsftqnljjpjaokcpgstosxnrptnceejiuqklmmknjokdkhkqpfqomspvmlop[entuprhrmp|{wumohjhnsfceoetqqknqiqqufjkkidplmpuzjmomrunmkqsmslhiqqhmcmk{hkkk^jUlljejxhnmrisqinnodnnlnrlnpypuhqdponkqhvkiqn]kmhephqionoqwlmjoojpfmlqqoiinhospsyuokrkonmgmqsfjomwppmhniabeonhoirtnymmklppsltloYlqompr^mmhlmqnswswpkqnnfkjhunljklqloonlwbkmoqm[ojo^lmnbnnnhqlsqcjnnnohplolpnkmomJmojjqwjjzmlfoqoimtltnoolgmookkpsoksll}snglck|oorpmog_nhjlnrpekloloimptrrlupnjknisxpnnnqlminkkiijnmnokmnlmnlmpmmropmsokmooq}qmntpltoli[npponmdmkshmmsojrnntslnnjl]ompmoumnipotnuniplonofponQuozqglflpr\mmphfmqwjnlonenldmojplsumnmjilcsoTlmmolnsknilvktikn[lnnnp`mpqwrnflmjsqntkmnqujwqogepjjirfllhvknsfoenumynhonnopkhlnbvj`pnnuks`Zk]skqskruojxynsnZoqmerhoirmkmnkryflgrlgoomsjjwkbovlognlnwoksnqlljlokrhokpnwlplnqqpjuleavqgnpomlJh`opufqllohksmmklqsnpfmuplunmqplpjliktirnbjroxgpmnlomqnabtmlmmncpfmkqnnbplolbrstdloirlnommgkqvormonqomrlolmmqpmq[vonmrvnrhkqtskwogpRjSozkyqjkmBsnki~`xioeprloqnprlkptprzifkdnwgjljnflolpm^nhnr_hppsZouoxcckljhslj|hjoqloflusnuzoonxgmqdqfwk_rkokbhiqisnglopxnvnnmqojnjkopflknqmiqtldoklonstomniqtkntlipolturpqillwntqjkpqkpXl}nmpmjbsvppvtvtzvmntnplp}vpgqnsogjreqinammqphmo|nkinpovpimYjquorlfv|gxpZiplvhnrnrkfms\ghtrueut`oqaukqssujlpjn}hn}fmisrgqrztonzpiptkdmlh{lmunuulrftqooentormpr]mgqqomnpjrfiphksrzgrhkmdprqmknqdnUqmnjztaksskpnruhqvl~jsipinqtq\{jlvnshs~gqphpl}lnnhkmsiopi~tonmninn|hlvnpmiomiroqjqnampopkmordkUopnqjolmmjllonlpqfol`lfvsjpybijqplmrmpmormntmokqnnoj~pkmaljsmrrmanllhpnkoorjoo\mqmnjonkoplkjqpkjorkmjulnmjml|emn`msvpwm_oiqooqcxh]mljupalnnlkpmlktegxQjqmlmhnqnljnqmjvknooppk~zllhk}nnuY}mmrtjro`o^g_siqioymtrfplkqrojzifqqtrin\rkcwimnpmjkncawj}rsmq^jml^klesoooplnflhroqnjcmrkszj\ldrglunjmmumlf^lihlpknmskylI|lph|ghpklrnqimpfxjomnlpom~ikendojtimixjjpfgnnsomrptuomilktfmwktqospmYspmeklsbijqqnqiqsinoujpxys}[sqmtmkoqllymjpgmmoaplge}opmiltlqk]}llsjm_sukpijqh_npmlehskrzlhu{oxiotvolppmlnmtvulkptthgqwlvejcmrgofroissooklmmjieopmiogwgrnjpvombljrbguwnikgtkcqk^qtmoy`apkrpm|jo~pnnllviopkimsmtlmshsheqpkmspxjiiltloijmjq{ioitnkivmdgpojkdnnmipqmkprcpovony\bekoililn}nlmisoin`hoqektxhzinodll[rdpln|lfpojozmdpjvgjnnqdoomjrlhqogppifmknloqxmisgulapompnspndjpkmnjjhqoupfrzookwiklom{lgtmnmXsflkoqmjzrlbqrqnXhhkuknpqplqlorgxkhlkxnlgmvptr]rkkjibkzourrmhlqrrwtl\mpiojpxmklmgwlqkkjnjnsiojgpnlirpioigem_spqo{~orhwnpmrw~joYgklhslllirsulfbvsxkkoljtiqfp`mnkko~kfqjornmwqooznmwrlvgrjjuttsmlkokonRiqom}klllmrktnppnelomY_mupmnmornlmnrylfsmlpnujramzoXmpo\mnsjssqnrnmxlwonkoqefiomqpmgooeotmkkoqnlUlqoqqqpBkrpvgkqvqpgmm|lnpgmrptiqnojgspowp{oollqnmnrnlpjmpjXppltlhvjnhgmpmc}^l_mmpnwgpsiilpnvinmsjnqtfkXpokljlsoklmqqdmpnormopqnoojzvskmtknVk_pmtsvjmlijjwsrqierpdl^fpo[omklsimpjnjoiolooqjuuktvmsrvmvsqhkicpi~rjdvsingkmsnqkrrlqmplcsrfqndfnqlqlktnhjsrqdimkan^jotlotkismknmkmijqjlcpjoolsinbrlrzknknpriirljitksqlsojqljesqnmlgxcgmarqjkr{oorjmvmrojdfqtmdxqutmscpilppor{mtrmsprknzilpmhqrcplkn|piqqhlrlktkpjnnxolwjmmkhppntvoplkoknznqnfnjsmokkmmql`punqoosrnij`nrrlurpnrfqj~m[opoymnvjblnpnnntoy`onhiuucinnqrqlpnkqnVpnpmjinpppqpqrdqjorkvpmr`pwmlkmepllpsqpnrfrlppnokQrntnplmrmqnmoyoljomimfudmfhnumxoeq{mmjnxnmrcnpnmupmpkjmpknidyq~rqjnoomomqbojmoqnksplox`_tnmohqmeheojih}^lwsxm[mplpkitflmmmhslrh~imnnxtnmnoqfmkkqmphnmphplsvw]qlqo^mkhfqnkpvemessmonnimgoqrjnkghjdgirqoqoptpmi_volvmooqprionarotu]njkqmqnkljmmil`opiknlgxgqoikll|lkmknmjklfmlonkpjnlorf{fmkj]nlkkklolptmfjinlmulwkom`ommpntpyjsqrsoksmoynrnpomwomjnpo`ealjilfkmrfsqlpknkkhp~dtpknl_fkno]mljpqllnphlksynngpppolqpnprmnirpnlqp~loVmspn{koogoqqntjgopnopl`mzfmvfjpcjmiwoknnmpkklknlmmnzoqkpqopvrrrplpjklyl_|mokqmdqndokobx|mmjoZo_qoroloporojnlYtklooimpienopm{ncnwp`loqpj}ltgrmllvwkjnnmpo^ilvwuponnmqppjnsponpnnnbpnnntonnqlxlnZdgoopne`jnprlvlipptkprljnokbsrnjnomplhlmbgq^ljqliolnnkqhkjkqrqc]rnophqqnsohknhixlknqqpbojemeltu}zkmoqplpslfprloopm}pmlpojpxtpql~krpooorpinoovocpmqjrlafZlowmpmxllkomnmkotmjp^xkmnmlpkvmjrq^nhr}pomonophlpVsomlnymksponmqoSepzrjpkklhmoumpmqqnojmopknjoplfkp{cfpnrnmcneukmqohnnonklpbjoocnukdopqnnsnnZsnunvmpnoonomcUorspwmp^keninqnnnitnnhljmoikmXpp\nvfohosqmlqmropZnqqgsmpunxmonqlnmjdskr_nmxrqoouzmhloobomsqrneqvknpmulvknqqslpljqlkn}vnlorkpfqyo`jmolmmimcmmolpbmqwmponi]nmnnnronn`_ydxn_oknmmpmklrnmpoltopo_ufnlplrmmdduqjnsiooknsrozk{ipktj{mkrfkkvmj{fhmklrmlkdvxjosl]hrkqwllkkzkrqmnkwsk]ojnglrolfkhosuuiqkplhkouwjgl`qieiekgpvkuqpfgntiteootmoxrrnodnnufkkoqlnptrhomjlmeqinlisbmsunjhkfmfp_irjlredjpfiillkkstwxjknoqn]rirmkhxnbuirobodooaogehi|stjimsmlj`lntngsolhokgoiibqmkmoignofbksmnhgskapjpml|wqnnojplnpsmjoklngpnneqnyppntmorjlljfpirmmgo|npcphp^pmjknhqelosnrmwm|Poormjdnqwnjmpmhmhpujdqmqolpsioyyfltapl|lkvl^pkqrkmjnlmlmqmxjpoppslospdpjppnmllmntunnqmmoawvn~ooxpzbkmnmnmjvphpjmrouopm|rlqniaertnn`rmylqkmqkjpokonfpjoUxommlm_nn[ohsig_`jppokrk|l~sjibooicmoeemmpyjlsnijhkpkryporhtkto|qmtqsojzosjjdpwlcu`qojfhiigmpssolhijoknoujot^molqcprvopOukq}qtpojznlodlnnjgxpqnwgyiqkk]ptolmnllqkqlpqakisymnsoo|isehsykurhlkpjmpzgrsnojoxlrslghrrgr~hjjqkrwmlqrimilekcofjmhsoponsiurljmqlmjdmmrnjmsklpeompmgppoomoi}rhkhnvvjqlnlskpor|lnmmfpmngr^mkn{qprokmpvm{nhulfdpcmjqfpznfqjdjoetgnklwnkrjkuljko}pa{XxkljomsoqSvrmexSwzqgkpojnmoktnsujoqnrmrlinimrpjnlhmhpkmps]qnhZlaokhwmopfqstgjilmooyhmipstnkshdmtknop_m^llnkpa_luikjishjjikqnhkqerzjpxojrlysmnmqnpqlqpgop{fhfljdrekwumhro_qnplopmqnhnlflntmnbnnkmpynonsqoqpnkgjp^tpcrsXreoowqZospbnnrpnlmkmokpppxjkrqushnkpkmorkqqrmlhnrvmjotspnwjqoodmofgirqdililrocjhoqmmhp{knjqyhknqqojnknnoelji~pqoqsplvopftpTm{crjnqoqeokq_lmrrhgnmmpkqoujbudPpnvprrinhomooonsklxtmncefookkppyo|ommpfbjslkoruvjqspigeprpllprqosnapopqmlm|qkfpx~nwlomkoorFckcokomlnlpnslrpfloettlqemnkpmropkrophgihormlktomloir\qitpzfnnnmptn^mjklqujhnntlmploeoqkpyjplhoo|jpoqxmorrfjzgx~lkkiomljjlonnmrnnoiknijvsltlmlpikhsnlmjtimrvmsuqorkooupatopmqqpto]mmnensgclfnnqntkpkprfoopojorpomgollnpknkopmboqinmnumlakn}mscojnqpkolmpluojuloonlllsmonkqsnrofoopproinvgprTixrfkollqqokjqsmjjooxjcpjnponmvfpgkomlznppmZqlmnrlohndqpofu_nowqnltnm|konimjmslm{_pnnnmlu`wncnolpzqenmpnoqfrkeasqomm{omzlmnpaigpumsgnlzqpvnklloorpsxlnpszk{mknpmmv]ponhsijowpclenqhmskrlpkqj}mlhsirnnvsmnntmlnmpoijqnkznoltm_llrrtakqmfopnqonulkqmopmmnmsmjf}noplaononroklnihrnmpqhknqnnsllwconkXppmnnrkugonr^mbsjrqpll[kpnmorpaorhpnn|mlmlij{pmoomqnpn`lkvnhongqjqnmrrqltgUmmpnltqqopooomlkjbndlljmkoqqponsnpgpooqlnaqqoxktnoj{_oquk]siphqnqlnoerionqqoorjmgkmmmeqmmesnrqgltnmllmmslksqnjm]ltskrlrkomohkm~ornkpiplwnxfm`omorfflZooulq|obmsookqnkqklmrlpngnrpgmrvnispomlnskqqnlfknjk[sonjovc|qosmkounljkillwnlqkrsa}tlqijrnghalxmnpmujouxpnrpiolnoonkmqsygkaltitmgmnppnmkkioomjknnmpcnoolmlokhxrmmqnwmorrmo}omknqrhkkfrifporoqoyptmfnsnvqfqppl|vslqpllsnuphmkzpodkjlpolm`lokqrqvtqgjsnmkqsuorltxnjqnropvopuojmjcpauzjvopgpjpljnkissrklkjykpvntllqhrqkmolmxrbogjnsplenjowrxnleepmmhnppmpliprlijjmslpuoqqkkiosbknoppkwhnpZwiqvr[nuqvwxovplyrlupinfvqnsokqopmvkiogfcppnpjmwkvhlmko_konoijoplitkmllkohinoYmihokmllmjmndijk~tocqevl_]pxmonqppqoilynqorkmmnitoaopcsojkjqipomoxo^cqhlihmhmoiqmeklplrqpjqmckyalmn_qmnnnqpm|vfqornmockrdmhnomkxkjquirnmpkjp|pniqqcmZneuelnnfhkl`~jhkkfbpq^jntqrw^ebexq|rlmpmpmtkrqnrlnpooofwchljmpnoytgomrrvvfdqljkwpepnmkkkmniksnstlhsrrmkhkqnypnipsnmrqnzookn\mnhnoillnopvnnioslnhomlolppimntvsoppmonnlhzrikqui|imiumjmwmzovflinnnditmnmpqhiopjqoprvooj~rnmifmsqpkkqplknloqnkruclpubnljkpjkmyktoipiifmnrfqmropukpifllopphljomotlonpin_r_ynnpflprqjolngrrnqkdqmtosokqnihnplmjj{llhimwiffzkdpljohoknrvjtioplwrorniojtlsgqbppnweqhogjfjqxounrmtj`mmmqmriylmfoltnmh~qmjminlpqrjiljpoomhtgevsijjnkipicjfkd\omniqelprssainnjlnkllslntipoqoro~nvvrueprlrqlflgnkk{uulcqrowhxnedkomlmgpjtmjnmlfmtrkjjkcpcqiqjjorjnn{qifmin|mpmljgjqksnosjhyYllqlZjjmcsuf\qlokkjfpipjfpbsminluvjimsrksRp}rm~}l_tnroowmrfnlrftpskjqmpoklvmqqjmgmnmlcupvooqk]qrmkoltbxjsihr_iot\rmjolmjk[pnnmtinnlljasorkghugz`fpkvtmoeoqori\tXlpqbojnqapgfbgonRrntmnqrqqgtlcyoe`tmkvtgjionzkm^hnhkqjrkxrZmY~mkom|gppjnp^trlsmgqeojjmqlkfntlreilf_pnumorrlnyjpk^lqjpokqovnnnk}mupmopnnnqnijemmstKm[brmlnwjhnqpelnzkimprnrlpnsom{qrYpdrhuqlvoq\l\j|qlmmnSnlsotnqletvthsrsllppsdolpqpjomronn_`anmynsodpiyonlirqqhps{^ppnmoouw{mtmlmUlqshiorwkmjsinqtnqopmgropnpmkh`Vnm\mnnmopmommmoplmcpomsoppnun~lnspjojkmqooxoapprowbqponknnrkokiollqbolnkljdqpnkknoompqm\op\nisejoqospoonlljmnmikoplvofch^cowl{omomjnnrxnhlzplrqolmnjqokpkwrmpIlrullgregmln`oznnwmpnk|qxoxnplgnphommknoljjnnxkmokmpfjwpcujsorkinmomstphlqmmnpnnonormpmgmpoohoqnpnsmllnooomlroompnny_[xnhlqonghempooTyommziqpnnk{qlrhllqxokj{pqpmyjlmmcjhsnjnpurmonh~k`msdnwyigkcqtpkn}knemymmnpmqfmlpj[gpzlviqnoomorqsVmllnosmanqomhrq^sfostlsXpmqpggmkmkpcmommpnkjiponqtjponmlnmqqlmpplYmmomgsiahmfmqhpsqdrdpmor}nrmunoom|nlmqooonrwopdfpqolilpinmomqoonpmkplk_c~mhmxkpzq{pqojromlqklitonlxqmqqbnnpzqomhskolreqnhmompmmqmqoonntrl]lodmqwrqogozmqlxumwoglqmtlidp_`lzioslaekqkmrnsdkwnZvolkttpmmqlroyjlpkmnllojrsudpookk\rononm_g|lolnnlqnjqlloolnsrmnpmlkpongq}em{lqVnofslpnlnacjbvumkp_llmQknlmgn`tsgzkxqounkkm{okoppklkmmqXtnrgnmnngbnnqotpqrjmhhnmqkotgqpnshlmxmllgklkmwjnnjnvqnlmkjmoolo}jxpnylrolrprrmjpjnuno}nulmlinljjl|knreoq[innnmmongmkn\jmjhibnlloknp`_pkofdnsjlqifnrlip_imnpnljlziofmipvop}llpqkopmlkejnqnnnolhqpZnhhoZl|pvnnmkmxqfqmpqnqmownmoktrjjkkmohpolmmgnlmkolktpfpmnoekundmllpshamnekzvouoqmuqpmmmrnnklkmkmjplomlnroknog{r~onpnqkjnkrnSkimmunn}qzooipnfnkunji`kmpqomon\ji_ohmokoamlsoronopwrjllswlnpnpnpwfqppsko|kknovunlqunanlkkqlkmo`nlnrnonomnomlnomoz_oonnqmgvmhmnqn`vno`nomjjqjgoljnoysnnrplpmooXjjonohpmrilwjfnqnrionvrlphlrqkwmfnqiu^ppmnvjmcpgolmhnookpjl_nooxmmlqkrrmvolnx{pfmqokpppjlxobpirr}ndnmlonpjxopqtpnqi~opmponopuum_moijrukilppmmjlhtdmoqpyplpnnmpqesmp{lnWoqbpd`mqq[peoo^mmm}n`onhmlhgnnxmnmfqnsjpmx}nppqqokhxpncjomkvjqjkmpovikognptmd^mmronqpwjr^hp}liolgmmynnnqmlnmoiplo`n]tsjoinnuinqmisauriqxipxYionqkldqmkpl[ssmdm\zlmtlhtfsasicffylyjhwlojprkrrfpmohiu]nhon}mupnmbhophsclngpllkjr{qdppj^pregjistlsYbcmdfioumhbqmsnltqloXslUcovjwglncokhkWhlhslqhqnhnkhZnjycmJienpiagnidsnnmojoqdlmxiupxoqklnqri`qhtrhnokiklwnlhrlzjokmfhsurpqolpkkprprmbehlsokosretlhnstomtvollioklnphapcipmripkluqijqnomrdqonlopinan^`qspkofinmkfgnlmnpolsporistje|{qnvmgymtrjpofnmdutjnrmlniom[hnkolfchlhyxzlpnnnrpiswrmunognqlhkjpmnmnmyglinmepcjhoptijjbnxndpxffkxqmfnnvrpZlhjmvqmhinoppjjrpnnpplmqlrpikklkmrrxllpnojakllxmzqkuxtlpkh{xbjmwplhuojvjmjomnjnpklmqolimmkloqjlmpqqpirjmomqoloulspkieqjonmkmpmihombqlpisqpnomtnpmnosunlpqnnqsrqnvhjmofnohsjootqkqmkqeknnnmlmpqmsmroomnjimqsmpfmqjmogknloknsksqusponqmopqnskmnirkolodrminlmnnuhlennmpqpnmmioqoplkopooorqpsoonnmnjngojlomnnmjkqmojrpnonnpnlmjptiliotlmomvqnpjdnmpxpqnZglmpgroongsmrnmnlnplqq~q_lo`jk|p~pl{ninonzwmnoellokpoxnlynptnsh\ouopolrai^qupnirngnjmplnozmojktohppwpjtmnohqklnUmomegallun{obpmgnjnsqkoknhjZnmrmnocwpnltojmiibr[kohgjjnqilpolromo`mprpqnZgwpvnpornqmntpspoljqermpzkvncfkqpojwmmnvrfcpordojsnonenkpq]nlfblqltrlinvmmmknouphnkonqlnlvmmpnsmzpuonlknwkgmodq\mokqklfmwfnlvldcxkjfpqook|m_ucenkij|lppnomm|bsokZlo`lpooisonjtlkmm`llt`hqknvmqmolmemmnjonvrnoYopqnokm[Zilnmqoaonwmmlm]inrswlqmcroprmlooqiinf~slnqkxrodpronpqjnmmnokozimntnfkodlarmsssmqtrzmlZcckrlrtfpmhjrvouowd|mongogqsnjlfeqli`i^rmlmbpthnqinhepiktkipfntkontkecmgdmmesoWhhpldmop}mclsk`ronlrWqlnc\fohsoluklonjhbsdokjginglcqrmjpnkqsnliplmowlr`rcqhnlnqbknroqplentpnlnhnqosbrnkgrnkjvgqwlwprlolhsfpporjkorwonn_gnqlrkxomgluin_nulrjkpopksmsqesnqrrhmql]nrnnhkormo{khllkchunjfnqkqksmrpoyotrlj{mt]nvfqmjioesqdntfnjookhnirkimpkontkokikfkvtotfkzfmqnbntpxiqkgnkllqwcnhlikjtlkrqjnhujuopklt_ljpihntgeglgrskqqzjqjnpmj_ggqvlqimjlcurklujiirvajoqfomkgrokslinhrutmuupdmoknqZkfwknorqwiqmoonhnppoonnaonogjzolgf`koinhsuphiilmvZirqlmpsq}lopkjmhYjlprhpmqkoWmuv]shk]torugmrelnqmhepilokfkyppoveolqbjo^lormlnvkopplVhwptqslegsm\|]ql]Wovvqk]}k{hrt_plmlorlnJpjinkjcmtrqposrfmr~okPwMnlmslllmmztlhljnloloonTuosRmjlixpnoqglzjsmvsjmp\kmsmqrstnjrkPVmpgitbsldoglkTXpemkaoiqnwunkb{rtnppnmknmjklojldppblTdoiqnkiqqmpvoonnmmoqjihjmpprplpknmyqmkjmphklniopmmnikWfrjkpnplkmmjhjmnmprhladquuhjhqosmrmnimgorlpmijmomwjnrnuosopkkhnqvkjhmkqknohmqtklhopjpmmejqqnjmniwothhpqprqpjnjnvooqenqpphyjomiihnkphmklrknjqhjpgjojlcinlmmkeolpopmjkngiiiiggpgpkhnmmpqmheypoqkjmtlqnmopnmn_kknmdmqonhllosmoonnqmkltncpppl\puvdnwplpmqarmgnmjjmnokyomklrenxsz{nnmlppojkZknmmgkoomlpliooghorggou~nlrmmxpkruqqlkdkos}wtqpionm]ikoomolopwhirwhohlolnzogm`trlmkjcsdioqolikjrhmhmkpmojrmioephu~cnqploumngnllrmplnlujnnvbooohjennkednpklcqpdq\papqnoq|pmmwjopmormfpkkmpnjllmoopmmnkmhlnpomlmll{ju^sirmmngorojqnkqvqolklj|mrcmhkqfqylqxmkroqhlsptsniml~ksqnppqpvmnksplmjhrqlnlndpmonbpknrxjnZk`maloinknruntnonokllpmnmgnqonllrowuslxmnklmopslnrni\lmrmmsoujjsuhqi`oqqnlnoepppppkmonom^qimmlo^mmgqXnllk[iolmqpmdvkspkjhqhb]vkckxn{b]rmkumnp`n|sa~pfnr{oecmkZmppsdkaqmYfhhon`lhhtbsiigimksp[nq`koqmamopqjqrojenlflkkZwdkfnpmmsjmpc\omkkkgqjrjkqof]tdpsklngn}lN}lmfgngqekxgfvadcethpmolkehkfkjwplrm_lhejp^vX~qlqkin_alijmjmgoxjf}scgqmQjkqkeqdwmlops^qYgbjqgmvlxokquk`nOks{cjklipljtgkjesqvkulqgnnokitloyzndpiqsupl`st`dqhnlhbnovmijbmkdqutelkepnvmpsmo\jkjmummnjknss_cpzpqkefrziXhkminl{fyjmssrwlfrnkqvpjfmvsofgnsokpfrmscepzixiofronqqkjowsockmsppkjemniikueojfklmtcjnlokkk^jefsphollfvjndjl}hngyymjjkyphklwognhplqilb{omnhimktppmobsovrrtivfqjqqnjwmrqpncpnlmemmhpnulengojkpxlr|mw]nfvdlfsz|lsqhnkphphdok`hqyqgptporbtprvi~iZjnaginnlppqno}lexojntbljucnmfulprgeujhpjoknlrpogqngnmimcrghpumukmpntownitqrmogjcfjjfmojrjxpniojglelnmfxqpmzsharyimrjrnmnlcbldokolinnoonnnguoi`qmcjlhrnflikqdqornmplwqjiprnlunpl^tisqqpmleqiotpnmqkomokuogprboeSla`qahpn`mfpmypwnroumocmwylvrthvq|emqmrlpLhuoxrokmrfoppsplsgocphvooqlsjruqmpmmm_roqnolsmoo[hgmfqhilooaqmonknhooqonlnhzdldnamnhmtmlnoitvduvqqumkimnplnjogom}xVjqmlomijukjmqlonikomnnjiwioykqpl^kmolslelmcpZhqdrkk{oqmfqonrglaqcrqhjqdm^rildsqgfonprtgrmh`jmsknup}kjwfimooqlqkktiihpyrtjilnnyskkn{nioenj^nifoiwrsmoe^svpuogmfjrlirtxritmkvpyidgljgjyommkojoqnoiti|gnk`ioimiiijmulwsispurdnmhqufniprqmpsmlcdfrjkjxjemrpsrhnpolyhqeeommkphlgqphoirvqmqimnrokjnpnxhlihqntinhmpietomqykglogkqolmjg[mmqiooqrrfdidjbu|jhtcrraornrzlqnk}fgpopinqy}whfqlmilovyqqr|ilmntkpal_omknegqlqmtqne_uqmdlkhqifolzyoVojqmfpvlghnsyoijlklonldqgboiplbkoxflgpkogfXlfppi^nongocpodmvkecqqjnpnavjoq{uqnaqmsmirtoWnbmllijlolzpjnmmrqgtirnkjkjmimonmifimpmlqtqnppilm{{mqjvsnnzimjZjlqouukmveoeponnnwomnrdwm`puml|roqoqpltnqobsmvomlpnpopnpvgoVtmamsmkkppplqkp{ow_nquldpmltokoltrnp}iiOmsylrimrmopalmppporlsknhlbpbpqtnmnpsjosnkisornmrpwUmmYcppfr`qblnmlqirmtmmrlmppzmkonxinjjcirvhoommuounloqqjmhlmozmxppn_pnztmlhutvorpvloolpimnjlqlmioobqpkpmmln\vnoekljknmimpruogncmfnhon{tookneropmjuonoujonpolmujotqfnnlxvhnnimnlxsomrnjjkvonrqjuoetqgnqkd[plmqinnllzmxglroloewdmnkmoramo`njosjoooimdlnnopjkfkqm\zkhmziks]snrdkppktrlonu`mqmpnrrxiqq^ulqbmoqqlnmoloopftrtpontrqrivhmkpuomsqiof[jol_pmqldoirmyglqsovhsinrmhnkoqminmpkmmjkhuvlimepjxkihkfmvhwjnmojoplqeurmpjvnkqpogogi{lkherqkoljjnhntijjsb}llikmisqbopklndmnqrmojqujknqjjapmqpwsoknoikiuovnkpqgnmnpninislmkomppgkkmbolmyjqgumqnqnngifd`mprmkovt^ooglijhoprnsxlhsonjvshdpglpstllnjqsresnnkjoqpnnnakto{hfnouhheqwktitmpssjhtynkotpqksheuonjnkyormiwbmgrmoqpjczijemmntkmilnjgcnkbrujnsvgrnhjlmlomwmngbchimkmjihjpt[aoxqonpnkxqduhltmmjuylyqp}lgkymfoolloms{nsju|h^kil_hqmmkfjyjxofjqojeoqmglyroowhmxgjkdoucijljiukqhtinnnmjiiqv}jnpovmplozslinusksdrqprjjojftlgjnjqkgshjxhllljlvlmtjmtdkpovzdullxmioilgnmjpmtorornpulkqsnelckqnjkpuslpnofrqsdmjmuhoqknyjkrfilqwmntoovzmkusausqlsqpnnlpqnorojwkyllpkpzkqstjsluiqfnnmnlknpnmjmmzngmnqrmskkrmqmrmoopjipjjonfrxjlopknpsjtkqrgklpqddorpjhmmikqpompnhlssmslqkmlqqxposlqnkqhsjnosqekpndjqhsvougonsstpoidmeseqmm~k[ovomnttctoloqkrsnsgrpczvjocifr\inkplqngcokimkppwmooknvjkmlvrqmhnuphkhrokbvekqosniqzrsoklnqt{mhroopowqboikvmijolrmilghiqdtpsmlwwhhmnssmhjkflrempfabtgnwjkjtusppbmmqokjjrnknrlphmoljoommsyjrgwqnpzvlknyopoovjmmoonomltkzlnplsmminpurvkspoenjylolotxjonlmnrqhl[tntnnjntngmwipivqetqhkpqu`qkkksaot]oontonsyjnnpkntajnsirljnmtdpgoklbhnwreknutl^hofeqckqniouhvtkjq_moznoibjmlkXcpolknnkktlhl~md\knmfjrokooopjstq^lurqrmmnohkvj\oonqtmmfnosr}qlrpu]si{dptjnorhrm__tml`ml\ep{odpougvdslfoYvhljpq`soorl|obmtmglsnfpkhnkt^fpvlpqyutdgoljln\ourtqvqaXlnphvnMnopk_ktpo}oligleirryppoimflZzmiokavpmsgvckVk[sxnrqqgqgetd{{mhjgoosudgllc~qusrnkhilo_ptkmxkqkrmdoblbplkqotsuumh\nfbpqrchitilmpstkjmnrmnknymrjjuulxxnkqqZxi^iqoptuojZnfcVv_hffgmmllpemprhn^qmupcqbqxunfpvros{rtnnpkwslqnspsjpglkpajkvhlmjssnolfknl]jtrrmgipexlphhiolntmqlooirmo^nlmslpqdldlimsgjodqqnoomlmmjmkgpkqqnjjikngkegrjkmmkfk`pixosimmkronsqjjmbjohpqwhwdqeqvgqmjpanjnZ`oqphgus`jkpnnkmmpolknrjdlismpmockkqmmqdnssQppkkjpul_qs^tkuiopkpkonoooodqrtlomo}rlpwinioqjllxsqlbncvnormpohjbnqkjin^ksrmspgo|soeYpO_o{m\rnqns^jemqoplmsbtmrpfmluwlkonqslklktunrkpouv_nkapibqfmummkgk\kkeVxkp}krheRlcnuvdjnmqmtajirjmmno\jqpobhroergnlj^vapkm{q\poxykq]eplmtqnzjqwhmmjokWnpnrpjwicnkrqqnnarkckoqgkZkthjKmp`pkrsnlnannXmfmqlpqdmqjkqlqrkkjoeqmpkooinpmj{kj^zrpinqj`psklmomtnenjmgvulmjlpomeikypovphvjsrrqzo{npxjpjvk_hlviqyjpujmqklofsoltpmhoqiroourolkYf{gqloodptjunhppnmgonqnqqohlqlnjkonmqpmnKro{k\hwpVooomoimr|qneomhozoovpmdvnlo\oqoksve}mppkoqflYnhgoklorihjq~}kjofnfijzndntyrmkpwrsrjvlhopjgliqkvrhnfilkjmu\qmofkklkloqqjmqoqepniqeqpnpmoqlnnmulfrs}oS[ny[lbofofrromkwkknmlliphwpu`nzc[onlnppnjjmNodwoiok{jstppmnhvrkpmlpplomxknkrktmpnlnnuqesmqnrmvpkalnmkmjsojrxvomqonqiuvnxrrYnpezqhpnnknwmsXunqkbimlafipkdhiltdsrcpmponcpkmonnomnqroomvvsnlmwnnWcipmorbpndp`mrngcmnmrpnnqgro|jiosploqklnnzmlkkevitld~omslbjssoulnnnuohmppmjqoosqlnwjoklolopnjnoqfnkkfkml[o}udlrfxrndoknxnprossttmpvrphjnpdflkqkmlwmsnqkjoqOjoq|jmllqjhqimymirkQvktoolkmkkolsnwmtqolbilmdnjo_pomnnqqhqvnonqnpjnjrjlioool`nqiisonioklspoljqhltnmqqml_mjnemhljdnpqnKzpumyonmpkoolojgoiponckqrormlhjmonnHrlrlnynnemptkykuopnfimbiymoookmqpg\pajtulT_kmnlsmnXhbpkdonqnnrqkfmpgdppnvndnmonoqeomk{m{oltpnnoc`lmonimhohnnmmrmkqpjnofoopppoqkpnudkpphjoosoolmltprzomoqtfopiimskokrh|iilhoqploqnkmmnqplomomoj~}vormnnbjkokrmnlzlbrivxlq~vqtmggiknc]mopdennqpncntsz~sljdihovkjdwpnbkkjeefqg_pipdqylxd}equpohdntofoq_yffias|apmgpklagilipprjsv}cj`anv|qhg~fkksnopsjoqmwfwrflhjlommimpvlpfpenz`pduisktqnqpxmjqcp}vmmndwknoooltso{sngopzqtlmzpjweprolm~ktusnilovkpcnqsiWrqhmjrlnnglakssorkolju~kjketgshnfwqootipljkkntmjuohilm{qssnkllnnonnkr^lhpq]msPpfqlroZpiosnn}ymolktnmelg{lunu`vXokolnmpcmjmtojjnnMjljoomrpveoi~oqQmnfpvkoqhbotifdpjnqyZnolp]lnmrfmnnjopnjllvolomoqxllqjkp_m{sxnykmotvhiswokrok~ln}omppgkrtrqgkkjntnpynkmompfontpmm`bmtmylqppTxphhb`mmipuu~lponZronpyhoouonpfppnocxmmunkhnpnsoqnlphnqpennurjyntnnkvmsqZlndnlmsptnoqqfonblmYk^tcponmrlgbphonmphppfmonklgwuliiqoeorekrsmkkpqolqvmooornimusgoofmrmnpoupnoowqnokmnhchqlsmpl|entxmmqmryqqrgroolvpnnmlspinlsh[htboqnmqjnhmomplknlnlpirpjdlqpnaxtmnnvhnxjgomdn_uqneojjmumsnstngukvlj{mkpdmvjnufipamllnrn]noofipluvmmljponhtkgljcedeljkqplsljmlmlfmevxmlgXpjlfnpgmkrk`gipqppplgfysozlkyphslnvsjytmkwvunhpmksnimlwijtfZqymmjshfelfjhplpmrqdpwomnfiqjnjitrgnhgrlnlhoiqppop~kkjteqpmnoqjqqmx}nnhkjogqjmnnimqrnkqrlkjjknlmmlokasevyloiplmplsokrtfngzmgnxkiptncblvvxjem`jl|j{{mkpxiqd}ovktnrvsqonoqqjddrtipriou[uoplel[lhdluqirimp\wmdqdbfprqrsv[nnqqxmsnnsrospmplmkgipgpktoohqlri|prfqhnmkiugkjqnjnhpojqjblfppojurmpiampmpltw^xnrkjeofttnZnstsqkqnhonmglqolnlmqno_epoqrlgkgsrltigtklodpsqnkeoVomkcbnmmnrnethq]kwkrrhjhoimtgmnlohplmdikphvkdkillhlneihocqinhrrdoln[gqchjjmqUfmplhqz`xqqoaggaxolhgjzpubojroeuogkkkp^pimkcinqrm`otoecjnpyrnpptnlyom^ksnhfeijngnofiplhqkpjjmsolkkfiomcvmlnidjwmljrrlriozahzlhhtitohmvqlm`nnalpopfmlelsmjliqan_piqo^lrtjuukfkeqelYqhi_\hukpntU`lpZgicjpdr_popv[juV^WWlWroishcwjswxtcooulurdvlppuxhrajhou]tkopp@unshqnkOdimyoih{fiWuio[jqYisr_oxurnt]VsgdnidsqankpqimQfstrlwgnmslrunSsuupjtjmhnolnsqmxtpdjwrjyrp`skggmomkteelcqsnqh{k`pflqmnlpcnqiMRklgjmNvgcqltfL`rpvhgpnsairqjarprtjlkqWjhlihpqu\mouilwdkmvkjolkgplrmrllmQvnxgauoppYZkkpmnuhbqznpppnptocvumsfqjrenlnrmlnrnpopljkmjr]suphkklutxfumqzlnnoopiimmgiraqjhifpglgpokmwmlnqkoElio^simojelm\pjjghRqcynmrjoemhmpqmn|olkosmfdoutbissqjtvj|gpljtdmpo]pbn[qjrmln^piknrkobjnqqnqmtosobwlwfjrnriour_pv_lmjhinqlltgudqpnmgunkmopgnnmuknyhyqbloppioutrloelqkjngrlpcqpqseleppqnhngnnlophgmepemse^lcjhsrlkmn``okjf{Xllwokp}sypljmhiqmmlhnklrilpoikkoloozkjrqushZp`odkiivnjngiphemkmnqmnpntqlroimlrrkkomjs_nlnsitjimllfqnpkttnkk_rqjhnqlplfnkmjhjlonfpqmmmjiloavomqkhowp]oojmphflnliopnznmnijinquqmnx^mvmfmmqroqllomohsnaqnhqkolsp{pmrblmpovnlnlpoon^tlmdomrj{rsonrokpsxqplnhnlnnnrmollffksn_onbpljntsnjjboqrltlmn`ixpnxmei|mqyplnurrohqkqnnlnjlp`txmhlnfobrgqxonjuplnnZokijl^omwnlrsumhm|Xslhrqppomjxnpnlrnqmlpoaaowotpyopfjjookhgpgvooovlpmonhppoymnhrplbjjrnijlmbbm~mklpmlrnlhqsqqskolfcoqwp^lypmomklqqkmlprmmnmmgnosrp{`jrkkklnoioipunpimovolkjtpotoppmznuiol^mqgnknfnzmpvnon~UurpbnqklqlpojmmokoqnkbZlkpqllrmmmhnismzupnionkkemjwUpnnmupnorkojkmlzhl\qopkotmonlnpomonoo^mkmjlYsqpnumnTpponmkMrnzpplis{pppbqjvqlnn^qwkrp]tirolcovpwpq_t~uorprihvkoyptesgtm`khoio[mrqepnedhdnrkditrfnroptlrrFfunnysxoufrqorxvkotltikmomqqnooozojmqmwmpltollmopmlwnnsreojlonljeirouktvp_mnqojjPwtnrmnphkmvnqirebnulpknqitrWqrlprqimlhrmnvmmljguulfmtrotonilxmkriueqlnovloljhppq~vgqxmtknnmqgjpohkmyk}mjpjofpdqYimetf^bhupnnrhdbknprppbpmiom|tglqluojsovgkcpjnporipntqmhkokmpl]qekpwxrfog^vro`mplilponYlmipkgklplotnoqnmkkqriqzrmn3pjplmlkhp]sfsflgse}moqlpmjlmgnnkmmmljmnpjmlm_oqsolhllpqmvtestiureoornosxkqemgmqmnpkorqgljomplfqm]sp_rpnnfp`ivkfnqjdloo~`snqjhovlvjjneldnkjmbtz|{xbowjrjwhismmmyjgnqilnmzk}nigrovizpmormqoiqloovqeopysuqlikwfommoksthisgqisostalupllnjyuhqfxqqixompnxkejonqtngns`knspdpjnmiillkfmndhomdopf|qiqjmxkmoyxmnjorkrilpjlsojnunoskroskkqsjwvrnmjljpnqllpmrrllotojgivrmphufppvpsnholeppgqmsrqpdknomohjtjmspcdoornrjlkljqqpwkkvpncqtqjmmnozukojqonjsnwgoirrpmjkmoqmwqh|uxbumjotnpmnfudgmoiqfntmpnqoetkohglnnmnxusoomosmooimjnntcqkoyojj[lhwnkpmkpjgmoosmnnqppihnnsgphlrsmkcqpmnomlltkllfgmoqrfmne{rmsjljponrmn{mfqpmpnmqmomnljromaqpng_trkqtpllqjvogxemrnoqoodjtquknnahmlqlvpornwkkplosrvlcjujfssperllsgjrxtmsfjunqlvrmrlhjqsovnqna{l|qwqreuoldjkdelrtgnmsh[_kothqdobutrdksurioosnhdnmmonysilpslwjergunkkjnsteifsnomsxokouupkighpomtxojlenlo^sq|gojtojp{qh{ii\rsnsprmhoeqsppdlepoodhslrmlwpxslorlrp~wqvqpqrnlhqpns|kphbjngovlqnjmn^jpirmtkpnmmKc|on{m_mreridkqpximftpnrfpymfonpnrrmk]mpphmnppmmpnmcnldoilrnjpppsoihvgi[m\qrlqfkMhpllznjhojqxjmlllnoig^mmsqgjzjmpvrpi]sUknoelmyirjs_hrppqpnsqpmko}ppmUprrpvslqrRmlthqho\flmoqoqmcopohwrfprrxmdonkq^nqlrrorqmmmsnlnlksnncl^laqxdvkmnepqqcnhngownonvhroflinlplmmqZtqlrdkhhhqsntljqmmljiohmmlqnrmlpoguplnxklrkmphqolqpsfblhoj{kimsccpnlptqinrnfpolpnpsipnlmrjrgsmqopblWmopflk{polnqno[m]nnhvwnrfr\omnldoolmpponomjnrmnpeoltnhdofilvqejbjssoyorngpmlhopkqqlkngomnqqmjqmoxkmnoonpqqopfmrpoplrsmplmgfojssgnpkhknqprn}npqqjlmumjrkskqouquohmnuiyopmpg`kpsqqoum\o_npbhwkpwtmllnmkrowmljmojkwidniphonkmsTsrwktg[smkkmmjnomgfjllonoltmlnsrokqsjlnhlqyoqoZnlkmqsplrqlooqnqg`qlnmorrmmmlorsnqmtlllojppcakqlnpkpbpnqmnnlrnmmmf|smqmutotnmosktmpqnmqojpnqlkplxollk\lsncvpgomezohkqnkk\nqlmomnmpqhpwnlcoqmlnllomkr|nxrohmkfo_|lnk{osn`roaiqmopqonflzXjoYnyskqrxnjpmjlj[neumnpjTootntqqooktqXnuxjmZqximnqirukorsjlkngknjipkeqiblmpppkqkkmtalqpnop~w}orimrofqxnfmngvn`iljokplsmmnmlkorjqdafqrjonofpplooqknpmpnplporhko`k^jnrjroptsgvonm~npiorp]nopmrssmilmnsklqniklos]notpplpmmonpun~momqy^mvgo`mmnmmqqo|pgnnpllnuncflgemqcotkgpmnmnriq}nnjtoeolopwoqrqpnoplefjkeqn]lpljprqjorknn^ennlpdldlnrnpnmmlrhlohlmqpnuseqsnposn{}iylonpbpopkpmolglnqqmlpooopkrjqcqrjnonjonmomqmo`nomxdaakslimnzerplrqarppkxltoloonjlipqnmpjmplmspqlfmmmumknqkpkjminojlvmpprpkgqksgnnmtnqlejnbpqkokonqomckovcrlgktjlrrkopmnmpqsqlimfposptkmgqoomerrdnprllunmkfomlicljkltqincoulnomllnwjnjqqroslnjlnnkionjlsfpojooqonspsuol|onlodnolllplklpunldnrboopmppiqonoponnjpplZmckmfljmovshmnqmuglmlklogysfxisthngtmcyohioiarutpmeopmmkikuopzgehtshnbpnrproj]snolqzsnjvspuvpgZqefgpdtlvwmplkrpenlel{njmumiqdznpsrfxhrnkkrnoslnuqjmposksgmrhofpqmooynnlpfquoqkgqZqlrlrbjkksorkaqtpoiogliltogkojd{ujdsmkbyxotstxpnkkpiqlrvlcolhiqmomkooopaipoofhkqohpjmnqohsrgjsmprtqmlnqjoopososmqokoolkntpjpmrjqnnoqxprookgmoksknnysonqrzie_nplenemvmmekqmpkoqkkospmhijnqlummtmnnrnngmonngoxslqtsquiiblnj\qrmkjhtvmnlocnkqhnprlfoipnon_jtnpjkjomgkihpk`omkkmkpefqlsqosmqrmr}qmfrrxof}ojmn|mlnfuqonngzkwjotqmtqnjmrmmmnoqn`mmnqmsnsuolpmnorlrqssjlonvmmvYmnmoz^ujo{mmgmkjevrlhnwrfnkrhuxlhenenrnhizviisnlgkwnfqoimpnegjzamkmomrlplasjqniqjo`plhbkhhfnow\pxlgdtii`mprvhskl~ulsnskmonxhpejzh{irloijtslrTRvtvl~lhoiqomgvhbihpljlfgoenlzqqonno}nrmrmdklbhjroosjkgqlgtrlmtfqxrpupznknmrgl}oxoqwphxpnkrmvhnmlemhkmompfn|}bqgiazkhhqtjrxkfm|rbolhlgmojnemhhijfpdpjjglZmtphipi{jlnmojpllhlhmpbmcngsrgqpq~kkcnjsjmjnhoknstrmlWcqkwchlpowllmqlrsnqsqpjmydkoqkwWokplkklonkolrgiuolnppkophmolktnpnlekpnlmnpojimcimrqqmmiodplRlpnosftrxpqwgnmilbplnmijghlrxihpk]nkmvnlevkmmjkqfet|gnoinrr_knjtrsrqnwltnbenrgmojlozmlmpnmoapinjbj`dbjtpjonsgfqb\jtjlbmkmamgnmpkvkrldmpiim_nitqpqrwtngcpidhdmthnibdrj_envkmjonl~jjmlslqipningkpknnntmqkslsonomvtplopeqzlfuhpnpiulpicypuoklltojujmimlofmmklslt]prkpsklgadlvqkmkmnemhbjplntujneninwblkmgblrioqqpouplnjgnjlhnmsmplmxzopmponopoplinpelmdrnzspynpoopqsmml|emlqnnpimnl^nmpvmroipn]lslrpqkpvmkyoxhrnxntr`lnoom`nkkhqmmonwqpqipnnenknpnmnlpmppVfmoo{rynlxompfcmnhnkjmmqjlmpinmknpmymoojmojqnmutruoerwlvlmjoalnnShipliylqlrnjnkq}pizsolkkkllkmqooompqokmnm{kemqgnkpokqmoqpmtlohjrwmmph~pow`rnqegfrqlq{xeqijmbjqoijvhhocnncnqkm[nfgkugljwopihphqllpaiocgk`moogoqttqsmqpxpahwquugjlmoompqnjfVtnljpptcpitulimxokkczlol^nrmmensnmpikstqiroli}mhosionguhclokrnlijmgntukejxqnjnmmprpka[ppmfnrjqnu|mokvktdpwekjnjhpnlh}jZpdgronr}ofuphiplivchkpm`okhdgonqnkppgnwkllZpimlrmpmmomoigmhqjmnnqmmnoqjmromjndkpv_nmmuokkglneofplnmmlvmgqlyrpmsiljpnlpmbrjrqonpplhonnppmokxmloorlwlklpmsolljphmnoolqvnzknrnkoYmmionmprknpqnvjoppmno{qeoyhhbpxwspronksraomXpnsjsulouiltoqgmjwmkhzopponmmjnlklmlmjnpnjjcpmpmplnjpfnkokqymlptmeumkprgmjqimonjmqomolpmnoononj`oomloomnnpjdnppl`iuioornhlqomrnmogoomolonpjrtwqyqspqpilvjmqpoipjkajpjtqgnnnlhmognkpnskl|prlmnsokmnpokorkpmuhpknqmpmlnjlnrmslqlokohvoolpor_oinaom^omjumkpnqkjcnk_vmljxplnvppooqmctcopihmmmnmtlonmolqonnpomgjppsyqjnnmoppojkfrmpqsnjrosntlvhlnqlkmpopooohqnnpkolnehgmqikmjfmhhmvkj}mrgogrnpkijmjmlphq~hujmmqmlqeknvgtpnvtgj]oispfgkrmewjlknafoqijqnlpfuolwunbvkfwqntpn\oflrlorglourcogkjpholikmqtnomkkqkcojopgkuutrjpmljqm_xlgnowko]kqlpookrhqlyoisoom{qnxsjqiorrvgmslnnsiqojiikljplrqrklkjmkodomliglokp{orkhjlekupniqsmjjkmdgirmelqoyitprvnnq|palwmisemdjplsjpjpkgnpnmlximfynnnaqnsptoujoqlkftmrpri~kpol^vmjwkpmmpqmooqktvqogiknrvdnpuontonkonlitillwrlnrmruomgrvkpqukrrqoqobkmdkq`rmjikofmjoqikoljglkkiqloooyqpl~inrgjkhgqkoif{oprhmlpsjrqoopqpwi|ibnogimppn|mfqklknprmgqqjorqmmwumr^lnnujmjloomnpmllos|rlpoirong]xompmgpovldrrnnrpklunjymptoTvphoknrlnolnsmopomk{kolrongmhjjmrkoiqrmtkukmmcplrri`nosgmhklnmpmtmqplorpopfmtmtpoppfqixoaloqnll}{nlmmmpnmjusysqmrk|oodmnpmemvijprsrwnmnlrpmmklkkrknhmqoosfnqrjrlojcqmxrynjkngjrjoqrlmodquphnueuoqwo^mcsjoqrkontnjgfmhnkkmkyjolkrsfetklqjemhekWfmohmpjiprljifji^qhwnvzjrkcqbujfupfzplngqutqmr_eponoflmkpsmmnqphvln\qplmkkh^nlnkiucroklldjjogrommpenjlqkn_kxrrxsixmnkqqdzolmnsbkdipqnhYqmtjrnkjbrgvppnrqnjfmqklnssbdjonhjublmmhmjtpuolljoplnmjeprsjmnoenhoudjhdnokmldqnmojolsnxpsc`fdqnhnfonXwnppoqduoiokpliqmlpjkkfcvzuksq{otuknfmkojnfllqjrbjiqqY]tppjmxjlsnjl{pvnoqodoltkjnqqzZjrkpglsaqlmotrmkslvm]nsn|mjmemecsictmokiqxjikrgkqlmrfphyntomLpomxnehqXnjnpsinijjlsjljokpxmnsiclhjpqrmnoksliljlkomjkqiqngovrsstpqjilmoiosojqllqtqnloklqmmnninglhlonfqmmlcqasiqxleonpnonoqjnnllqhqemllokinppttrnobqmooolnjolrmqpwotqtkjonsknmqmtrrpinktsphpkpljripinlnmmumonlsspkkkrm|mhhlnpphikkhnwpqsopnmlkjoogkqmmmkrvntnkiioflmbjpmpqqmlpqoqfoofilkjpn|lmhllpjopjlmnomopqjhilkmkpnkmormlsomlloujpnjhjlhrnmpnknipinohmpmlprolqmonqjxlblkgsajpx_nnismnnsumhljnmoqlovourlhYnnocmmzpnnmpqmrkvknnmoknjkmmpoomnnpknqkoklqmlnpqooskijnqpsvnimppakpoknommrlnkorozcqlkpljprjorolipenktfonkolaqpupnjmntnlfkotmnlpoxllsjmrqnkmpommqmljropomtxmknodmm`rmlkplwunno^nfplpmkpokoehlpomoppnmulnqjosrmiliqlpkpooj{yrhlnjpmTtpbokrdnmqmfosneqommhmsoueqtdnmr\njrpqlkjhqjopfopjopqnmlqmknxqnjZpgsnmglgqlqnlqkokvmonbilpmpqvikntmnlyqnnnopclnlimoohlrmpmkkpobwmqpnooyptkmfmimiumnwgppllk_ohsmjspnhnrpmnnpnmnjetonmorcwkzookkjlkplnqyonnkzkojntnhwqmlrltkjrvnoipnginoommiqnmmnlmutmkllppigrlnugtqnsijnsnspnujslonqjmimioqqispnwtqpnkonhkgejkpklilzpukkons~kqop{nqwmfqtlqkjsoqmoerpoowprlnrmonjrnpkhl`tkynmiifkqtooi{hrnbmioqvjq{mjnokreesrmllmymmnvhnlmplplpnfllllzhrnnlmomnjmciginlrrjroqklkphnrmkiipvqnrjootjlumwjns{dnoijijgw`foovlnnepklfkkjk`ikuikelkgrwnko]wnmidmhkskgbqjlliorcirnhmowmqwptxmeekmidzgmbobnjokhjijonelqtffghlpmhioljclpqlSrkoqppvkoolpmsfkpooojmrflmqqsu`ka`nnkpgloyxsairsonmapmkqphshRoqnrhjmq]drwniirklmmqdkqcoshngiunqopktm}orihipjjvbpsmnpnr^qjwkgiqwkn{knsmuovqolkl|oljkmmqjoj}pubtmsqkumuop{rqilrk[hokltjsn{ofojjpmkkqspkqqfmqknoqkjgtjksngiqnklkirqnqlgkmmnjqoivrmiloolnkogtkopdtroieirjqnmonjpfolsknaoqprikslrpouhxtklnfs~mmklnvqkoeXpvlnquevmonmofgqvqkchlmcoeoupbokntsnolrtolloponmknomsjqpskklnrmkmppjrpfkonojkhoknloYnpnppolmlsnneim\nsqmommlnmgkmomnpmotosltonloopjoopmlnopnqqqjtldhtip^kninnooouleqgimnoqymoolpmoejookrnlrlqsnqonmohrskltonja|pqmkmrrlppmorpvinmfnrkknmplmnmhqodkrtlsmxopmnqmphps`mlolvgmllrpolnsoojgqpfoqojnnnkmppmppoulonvpfpjdpmlpmqmmknmuuoommllndmsnmdhqmrwihorosdngqoknnmmmnnksoqklmsvqnlonkpjllvnlljpjmlogkoplkho`qnqoslluomjmlhlnqolpqtnkotymnntkillpnmnppknrhetmokmqtiomomlmmqvmsnnslpfnmkotsqejmrmwltpprqslolpmktnllpuqnomlli{llordjpmqmimjkkmphmsmypknmsjrmkllkvlpnqomjmksljmospkqkponknknoqhqtolnjmnkolnquqmlj_jkjkmnngspmipdqkmomjdolpquuprpfoionhmrpoqsknhgpkomplhs{pk|movapsnonolhptgsmmkknohkpnihmwkmrp]rrtl{kfiknmmkgpkiehlqrhnloopllhcqjmmllkqmmjltorjpfjamoluploklnoiqxpqmookrmnmgplmnnhirjirjnoqnhmkkon{kjherqkjijpZsrskmnlsomqfibomfhmqjlikonpkbllnniprrrnrvowskontscrwemmwpsttXjumrmwmronzsnilrtgdns^qZquptlwetmh~gmur{fooqlpursqlgmttrqnomrtlpiguovugptjlrjl^prnrirkqouon~rxqtl~qpomoosooryRrpvokttiphnrzqxokofpfnyjpujisqwfjkomrimpyqjhwqqqgojlnfssrjgPqkrmrm_rvlmrtintu|irotdrqnjrvpiqmewfdmuyqsggrufqlrqxepspmzp`sqol^ntjrqrlsqnhinipmeuflnlnpophqnekoonnnmhormnmrossxwppotrmkpqkknlflnlokglsmkronijglkkorholnfosooqorophlikrjnpnsronuqgmpqmnopopkrprsskjfmslkriprmmnlpqoqqmhqkpofookqisyjjgpppimrskikpjnkoszpohqurpgqnppqkrrekmnqjroplmngukkjxqntnpomrlpoqwuoyukppmquunmdmoojklqts}oqlnthmmnurlqvpnkroqknspppizlvmknmlmoomoj]qjpqelgqhr]lnotnnjrkn`memrjlloflr`kkosj`qzoumlpnmrpvnvmrmimmplqknnmjmmso~mqgno_jchmkjhoiqiipjq}aiimomqmzlmwnnoponktpiZjnrknpoct]oblnnozdglpjmmrweonnsnknggnlojoiqnsjrmjrprnopmpmoennoooqolnlojfnlo|olkmkupkjpnonkqjumtklmmickuplonovnpnlmmmk{fpm[kofpmqnoommopelpwolrmnlzlkqgnmnrjmhnuppplnomssowjonqsdgrwljmlpolplkxeqnmjnelmjndhmnppnppivuqilmlhmkplotikrmrovkrnnrljojlnkmnnpsoopolZqqirhmkbnplqcreqsxdjzqmosptit|lnpohmmoppkrmnrchkbqn`kpqppplnmpmnmnmilqoqnpnkgkxopchorkkqugsdm_mppfdjhkenorhojpjlhnrjskorhljqcutznptoigncommmrtpnnoimmiliqqoiqtmtjpjogxkpnfsjpqutmpnlmnulshkpxnfwunppjrpmvulqirnnsqoollhjrpnjmjnofkoolnlqjkplornqqkpupolmqqqmtrkogoolgmpolnohpdnkjqslnlnnmpmrpjhdm|mtoyoijemmmjptsojssltr^kttnlpqnmkonoirbmqnmiqoltnrqkmpnrilplnniidlomnmnm]kjpnnnmnllkonppeknnoqsipollknkrujhumitjxlnpkrmjh^roprmmpplqelfhfjljrgqmlqsrjmpkomalmionoptondmguvojmoooheqhpqlpqqpjikkufllmtokomjml`olmsdlimninplsloohuelirfjkmlenagoqhotsrmmmvjsnmrnjjrllmnrnjopjoirjtykgoqpjqllnhmponcsinnnpnqmmojlmimqjpsrgqso|qoomnknanpkmljnnsonljpnhppmoounmlkjppslllnymmjtnmoolhmbkoluorqnjosmloookoppnldlrtlsnggnlkojknrptkknoqolmjonnpqmlplnlikuplqylqhomraouoinnkl|nulokpolwolspknqmrninlljpnlompohnlqolnetmkwmopropkk}ppmoy`qq^jknnnnwrjyrlwqnqnqlqppmokjokolkngsslnfnomkpoepplmfglsmnhofenrmmnfnpkjhlklnqnjurunomilgjpjronsmnpofsmopstklrppoqmsmmpqmhpospqqozkolploonnrmsopqnnkqqjplnrtknovrmhknnskpqlnqsk\nghestkojliiqsnqnvlkknkemmronnqqnmnorpmrpkqnpjurkqrlqooqmkiopjkopompmmsgljmowkpplsltjwqrmrirqnmlpllqpmpikbnpqkkqrtmntpkgolnlllivljniqnknpsehutrjplnsnknmkplorqql[_mnnntmuhlnkikkjrojnnjoxfgqpookmpotvinilgmmel~lkosrrpok]pnnooppdkjpoppnmwgmhno`gjjl`djkkrmjqimhmkrrlkoliuwowksdlcdphkkslhmnpjldltqkpphimlqnumgnvhkqrmlulrmkmoqojnlqjnpoqkm_joqlolrkapi}rfjiqji`mrvqqncqintlllnrponononminmqghjhjhkxrsnnlurnbkhhosbplsnnnnoqklu^iqmlpooioltidkji`kgrnjnfYgenkpmqroofiksn~ilspknohdqiogpjkritnktpjkizjdnflavjpgffmkjgkmk^inppm}piqtnrlknnsmtkwVpiopjnnmkolnaneeiqnmmqqgjpopldinmnhljmjjsnfreutklipgosfulhh`Xkmkljoppfoprojmyqlqppwroolqlkkqemijlmngmqzphqmnnjqe\rrjjltqintnmncpfpgrqnqrsqhtnkiitnommlimmnkjoksljnnfkjoswoimlhultpqnmoooinmloksnhhlgkqpmsnlqnoomgnmopolhlmmhkkiqiuomkklukdnresikrvjgkskoioisupjjpnqntooiljkmdjknikmlqompkmjsjkmfrssnrmnkoocnikqslrqljlpgjpjjjllimomommhsilnjsfglmnqomllmnzmejmhqppnnnmjnnolppqovslkojiciomwmnynrskikkolfqqnomncpjdwmpl`gklohlljininftnimkmyimudmfymjoolcnkkrbnloiqqoklmkmnkqnowlilnkjjirrsoivlj^lxlkjolqpkvnmqojlmrklpmklgifprjYljoilmklqqokwpmpgoflkmqi^plplnulesjlkplih{jkjksdwlmponglqmlg[voppnitscnqtrqtpoxnnklnmvjpnwkmhlkkrmnmnogfmijkmlqofunsomsnjofshtoplepvorhjpjnrlkonnkrislteqynqkgjlsnnhrenelkdosfjpuio^mlkipmwohpimqikeqllkzov}j}mvjnmkniijpioloiylsmpflqmnlrlrfklxVmkvseqpommomjexlokn`onotntfrlktojpjmnqhomkimfrpipvrknlnlatWehlqnnkolemjjcmikwmmoSojfnujtsinojqmlosjphfolmjrmktkqp\mtjstm\qklk~lsoowxonmfgwlwsnlmogookzpkwkmjgrbimmlmgmhmoolnmminpgklphigqpphnslmrmkmphqrnnqnnlirqpvmriqmk{jnhplqjqqodnksjomlinpnprldsispnorlnrrfroqspnlirpmnodqkrflrnnonlmgthpmjrniqpnjhpmsmprtnmlmppkowwphqommtpfephkminokrijrlgliupleonlnphkommnkkmipmlmtl^rlqrdimjmltimlmtnxnoomjbqgptnkqqpglghhuglgkmsqwtmpplmsotkhhlwrpnnktpmnuqnopnqokimfommxmmqjonkbmnjkmmsnmmomopmcqkjtnkmxtosloqqprpzuojgnnwllprmqvlklqntnoqhlrionmelfpqmjhkdpipmtrnpjpjmgiqkxrmpqonmnnnnkppllrnm|lhoiqnoonppljlnklntmnqbmvmpngrpkr{omqljmmjnnvnkumikiomqlotimmvnknijpnilomnnll`pl{emqoldonw^jgfmoqqQhnkrodolnotrjcgknqiqlig^[aenlrplwriddgat`iliqlmdomuetderqkjmnlsgdomirldhmvineaptoj_`empgoqtmpfk_xzopfmq`keqroJsqwpreiitfgmvphbmjymlplolnmqucbktjjglkpqyhpl`mepnqkrtvqrbjfGkkmtgoprcmoxkojm}lirnnkphbsjlorm`perrknlqjtkiqjfkmdkcikopn[pudksmnqbpklionmljhqkknmjmronzjqioqpkjomomqRvjukomjnueh]rolxoqjurnuihloolmmnmhppn~jtitkjyknrjnqplomhmnnqjmjnmkroutpnotqquntqoumnlpzmsmnqqlnvhnnwmumiommoloqnmmlppkkkrlnlnppcmqqriorc_mwlnoodmnrprmeqimnmnnmnmhsgolhkrpinsqnskwomnpmrngklo`wmflkompmojlrljelmmlrqtkrkicmiopjtjkhqjmneos`goslllqspnlvjloqocrkmlgcskrogldqqafslpspkqlfjrkomroiloqoklomsopqrjsgvgxihkoklddwirsrlhmssqgjl{mhmipqkpijnsjnpiqmdlnymtoljpspxmlnjknllkindsnhtqttsstmquqolhqlnmlonlcoqwqnsgk{isonrfqlitrjooknoliipskrlrmkkmnngmpinkkmknnvtronimoimlifqnemkmewlmqoooltknjjrmqniqrpkompkqhnoonjljqmkmmiplpotmqpopjkkrmnpootppijolnkqkohlnpslnpoolrmipnovqulqstnqmmqpojnqnqpnplntmnsnomqnqmmnkhqqsnsqqqootlqoiorshilkpvmlpmqinijpqlslomsqnpvnjmlqrioktkpnmsestmqknmomiqktqqonqrmokximipmormnqpmlnqiinntnospsoppmqnoomqnmonqkrpriilhnu_spjlmrnfnokoqloqjnmqolmbqmiqghmsqpooegkionqsrplqoomnmgnpnprqmnnppnljmnsoopmpoplmmkmntllnlloomlsmignnkmtlqfl[qijtmjrknluknghlnknhurspngongrokqoknkoqlskklqksmrkurpqmrsprmnmmlnrlllklilvlnjkikokhjoomkpojnoqjhnlmoqmqomgoilmlokllllnmqlrkmlpmmspqooreologltplmpvoqmdonokkpqompmnmhlmnkomqmklgimmlislnplqienjogmblmmqjpknsljlmkrpniomWpftogirlkgoppnprdzmxhqojkpqioknnjr|ppndrpcrmfokqlkpqrsnjqmmmY_olnnmnlwnnrknmsqkponkt~oljroodqnekmoki\kojnqlntnlvmmnmgfopnopgnlvidplsmkmoimkjqmmxmninlhompcxwummowknlfsrlnpexmnkhrmjmrnjlonppkkmgnjmsvoknkqnnglsgnoolllpmnnntjwmijnklgnjnsmjmhnvqmspnojqkpnknhgpuwpkpavnknnmlopptpkpnprlsmjplppjlpnmqork|jmooupnkllsroknopnojidnmqiqnpmrpnomhgoonqvbnkokqlelfovqpzposjlcpoofkosk_elqnprommomommxyesklsoqsoqqjqlokmnlpgemnpj|qjojqxlmndonlkiedoulxqjtsgrjpsklUzhnupiljmcqmqqlilxnn\ktqnnki`sood|us~oeopdpihssqqphlenntunjnmlokOjrguniubrtqkiyowonjqli[ktfigrhphjnn~sklpjm_plenhfirmokm]hsljm{miksk~gnsphutknkgrkfopuofkokpmrtlpnjpmqukrjoqjqolsoW~nlpkfjmphquhnmtqnqriaolrkonfjn[ldqdnjkngvjmmllxftmyhrpmtfqhpkrpnqksmnmepmkkrnqnmkjhl^qonotlrnskllmorortqlfhmjlwmmcsnooskirovleumomprlprshhhlms`soooooplmlqhnjjqlkskrljkntoprdpopjlevoktnnqjoskronielllipmiojmrhunnnnrmrohmrmiumnlrjkqmchjbslimwurskpomkqlylqekmliukmljntoiknnp`onqnnnqrpjepnhkupmoqroqlrsqlmrnmormtlpoiuqopjnurlpn\jnspxnqqvqrmtmoqmahqnX]qzlmmnmpqqmonzopmnokhxntiluoYolj^mntoumjnkqk|lfrnhqfpouxpmonrnihmtmbnmkqlPommkpnobiqqqiinfllmmwvommkntsrgqnoddmjnmnunslmsollmlnpnrkqZmlpolnsrinoionnm|alaomkkxinjafommskmnpmmmolrbiqmqokpmqmlskjmmnmrpkiqknqd~lsmpilpsignqprpkinoljuskkmjupntgmgojhpjlivmolkoneqomlnlnlknlnjkqlkrmcsh_sksqgpnilojinjjrmjqnemjqkgnjqpkkhilnrlooofejmeopkwggongnnlkhvomqzotvmmrpkekjmmqnpjninnrgqdmmqmokjminpn{mkllssmknkmpjqslhnloooowmoophpjhpxqlelhjhkqmnpgqljnmyqvlplrnm|nljqtnpnpjpsinnpitohnplmkldrmjnqlrsmkfnjqllrnisolidmkmomplsmomqlimnepngolnimutpnoekjlnmnngislulymelqnznmzshrmonnmulr`pwjnozeklrkpopipkrlepnooknmmnjojoliimomntzopqq{knmkrkkpmmolnghoonqlooXpqtlnnllpoolqplppprmpgrgodijkoupkmponmpwpmieuosqqeormnkgpmootnxskulmnlminpngpmuoinmlmxehjlomfjmvfklmmix^osmolkvphoteqoopnplmnpkkmmgmrtlnlokipkkmrlmnmnronnnnnhtmoflilnookiuknqlaoilolmtonsqjtnriamtqokpounmpjvnoksmpmrlorklprnonipseskopeollulpmljplpndwnhmpkrkynilmnlumhjrnoojlkplnoejgmzlm\pqclgqnmkojimpshlojopllcimtmnmslepjmjjmnpmnphlrloppopopmlikykkjilkplwploohpornvnsojin_cloqkmknpkmnmnoqosynnctkoqnojonlonmytlnlmklrYknhkmovlkonjouifoolqllomunnsgfgbokkrnmpnssnmkljlqpjtpkmoppkksopnfpiwokokbtnnmtollqjkmocrnknjkaosonjmnloklmppnelpmmpnkwgiopnlwncotrennkmovnkosklktvoltppkqboqrptrloplpqlpmrpknqlmlfmonptnrkroujmdidoqsojjkpmqmtnjppwpmsolmpmmkoqplmondhlnhcnboqpmlpsronjgmskmlindlnfokmomqpmdojlsnmllmlmodhn_mmrrsjslltpnwjppkoopkrsnjmlvlmkrpsm}mlnmlrnnsmkllroqhmokmijVimtmmptsnnmkoshpqjkkdionrloposmjuikomt{ptmnmoqmnmmpnopq|nmzrnooorWmvzkoylpnmqjlloqkpkommjmoexphnqonjmpebomlkhckfkmqsooloqmqnpdmrqgolnimoroupnn_sppklollmmrlmibnunlplmcielllvmsnmonujrqnjsmoinkhksomckuvmilqqnn[kpfiknpumxpnomjonuhoknookntnpmtrnlpsojsirklodxjlmlmvntooopomvoinlqm{kmnnrjplhqoajnqpiokpdolmlhjrjlhlljchnmlpnominfmibtrbonkqntltnjopmqkoolo`icnopotlk`bplooqmqknoumotfoolmokooitnlqsskplqnnjlnjkrmmovpkkmuoitnqvtljuljoodkkmvqppldociskiunjmsqnglhphvsfknokztmlpniqkniwrnolruimoontqpnmeppirtmohokpkrqhiumpeqkplokjpezqolmwoglmrjokuyonlkspgqjplqthoppgsoplvsljkouqopkqlmplmglnodgqroogjtmplnlhrlsogqninosnkrhxjmllhminx}opoihlguoogmnknypkqontrippnorhqhkltqoioljpqnkljnnnhv`nekmkmmurqfqho^ljjzqnormoklpklootMmktsrengvwkkloiojjs|lnkiqqpqmlvkononoiimqhnikocrppl`mjodjnonknnqnoosnqlninlnvmnnlomsynlomrn`vvmwnumpfrolmnmmsqpjkkfnvqnkoroknuiiozljlqommlongmnnnkonnjojobqnnspkgonsuxknpr\mtmijlrdumrunkjnroskiiuqkgslirlnoeolqijnghnrsmmnhfljdpihpqpjpoknnmolpkwiionmjcoimplqnuhnphkjghouklpmrliqmisdrjrimolrsgpkworqniusomoompljpphoqnjjfimpjmlrtpnrpnleqtoomolnlslunlfnonqkojjiijilpnvkojomslkinpnmqgnmjrsnoqpkpknhngomjmkolomkmgneqnlvlhkppskksrflpitqornirjtwcuqjpfbokpyqgpsuowkljrnjmrknsmsnlmmkpnqoonj_shmpnjjx\odqpkfkkkscnmlhjgvhlmmmtmqikpimqnlpjnqtogplnnoorntixnmownepkglgmqnrqmimhqnojmprmhtnspnglqaipmmmqlnvowu`poqtooryhjrlhy~omcqpeqnnjvkmwlnlionopjrjijmiqskqqlpzmot\tnkpfjbqmmnorjqlpsmsllnnkmtsqamlukjnkqltsnnompqonknrlsiopmnonnmtiomdnlkqnqpmmqpmqknkmhmglw]f[jrykdoplctmwospmpqikkmqynfrxxhnr{oljqohlrjrlojqnznmpmtjnphoqnnlocomtpellhpoqjubqoonhwvnnontmlnmqoinnqmllpkhynnsomlnvnlqup]ps`}mfmokjctnnTqnnoj^lkmmojntlgu^Lor{kppmpkmqplnilojlnmmj]dkqkoyomzlsppqntmnxnrkn\_frpprejkqpimnipsmmkqlljnlminqiousunjjpslnokfrlslrmolnnsomooiqnstlpqhbvgklunuphlojingqnknwmxsgponscnostzqnrqlrplqoismfnrqooqoeokjhtpyqprptnpkkkohnplnkompnulkqpqqmpmshmnpmq]ornkrmgsmsqqnqmrlnoxopkrksnxjrnntjopmnkndmesiyncqlrmmpmmhomlnmjnnnnipollokqonnossxqnomsrmoltmqjbiqlkqlpprhmn}nhkmnmmlnsnoqvklevkjnovonclkoinjqmolignjnpmpip}ektemtmijlronooljkkrponnircqqnqmnmllrsoomoynmmlbjnsojnsolnpmme{ronqnjmvlnnnpnmmpmpqrvcmnkonmuqypbqmnrwhiosnnmkiwpqmlnlmmnnm|jpmmjitpuemmljolnllqkowmmppnxlpneritnmnnolphprlpohiorjljkpokovdmhoupqjtjknpjkojsqqnmnjmmnjnmkknn~imlinrqortqgolknntffjmplsknimkljlkppnxnjmrfllnjnmoomnljmlkfkinhokilkqfqmp\knfnjkmqknindomjioppqr[nnomlonbmkjmkmoolovmmxqrmiqnmkocmmooepnkshmloonndmncnmklsnomyrqpkrrislukomonqqnqnslnmmlnnlool~iumnnknmoooilnpo{jplmjoumqfmvfkropzprunhnilpjmjnpnkkqiojnopnmpnnkonkpfrndlpsfrkmmnkgjuopqxlqmjmork|om]pqpjphpXlhlopskbvxfqmfmqkormool`mtpullpnjptlpotjrpnmiakskqklqnnhnxrxmopmknklpcuotksoplmqjqsqnhfnsmo_gpoiolmiuoluxkoqjtqqwiiqlli{ijkpjthoqposmoolqmvollsnortptlhkolqzpnkqppuvnmfelpmhwliolqnjrllppsrtjrmunookrotnpkoxnzrlrooqhn{pkospisqmncqprlhirporfvlpmorsgiokpnojupqpnqjsohitplmnmnfdhrpnqtloonkimglsoqpoootpoopinlmorpqjmmqqlinqrnnokonvlnnplvsmnxrlooonmgnnnloptkpqopdsrjnusjlkpjlpyoo]kpjjoxmntgqormgnqohooopnsonnpsnqnmsruuwkjopmjqmrixkqupjeoompirmoromojprsnpromdlmooynnqqiomnlnjulngrmmlhappntnooytmkojmiomokumjloVofkqiolnomppt}oxkdhnpugjnvqqoonroojkpspimrfnsejkqhngqnonqruyhknhnltfklinsoosioominhmlpmpn||pmksnbmmqkmjoohjjjni}mqojhhoohmpqnqucqifomtpnqqnjoonmmrsmonpnlrsrpthononqthnklsltmhnmpirjhntnrirqdjlmppxrhrknjioljlrreollompmltqqjo}uojmmnlpjwrpomklnnioolphfoqlmpuonlpmjjnlnqmmgqrreolnplnopormwkmqmnhpmoqknoprjonrnmosmnmjmnfjlimormjnlrlnlmpqljkofnl{jltroskpomjljmnnmotooqqknmpxlnmnokjnijonoslppomkxnxqbrnoptmjmjjnnrhqnmtmqpnnmqnikpmknnkljqjpsilxikkkszks]qfp|mnpfpffhqpnlntqmlmllnomidpopvwvjrochhnppkhmpqpkofqopwwVnpifyrkoqspshsnhdoosqqqnpklh}rnoleleojklmrjokqoouupllokovisjXtqlfunmdlnmnfnulrkawgpmqwqdpmqu}pjgiotkqr{otgnsfjlnojgioklolfksjonnemwmonwkmtlphqdi}hjknutodmZimdppnj[tqqlmpsvprmqnuodkpskntsoonphrfrulmnnnwprumiloojolcjkvmwrnvoorlch{imlppcntolopoppt{kipomlmmsqsoktqlnqlnqlooiorpgmrjbqjnpkiflopjvipwnpkym}mtl|numnnnnposqgmlqqjnkgnploqorkrnwm`pqnulnupkquoqslokoqixiovvoilmoxlmwunmpmqunnmqoirfolnsrhmmllfqznmolum{iluljjrqpnpllptvodooppuplhkoqoYlwholpoiommntjpnamqmrsormqnpnoyjvnnoompqoonnkkomrdomcijcpqjlnnqohnttkmmmipnulqgqxktopqrk{rpnmmlnhkpnoohodmnprnlnslnup]kminnslqkmmsqpooksmmm_mimnoppnnmqpoomnrrnnno~cpkmlnqlnpoqprxrdaukrnlrrihllbrolnhuolnjlonpjejj]sk]tqlnomoroqnmmmhmoqnsrpjppnxmnkzonmqmlmqpopkbsnkprdnqpnonjfmnlllrkjfqmnbnmnlrlkmkloomdnimejqijiZrllpmonrmnfptjmqqgnjojeqbjpnfugnlnmokpsikhlpmmkjmpmlhimnwqnqmXmponpmodkkinforqgznqpn{ninspmnkqjmnnnmsnlmqldpmnommqhvncqnwqfrnlxomnjmns|imjrmrloummoklrnprujjanmvoqrknm{mqoonlnknu_emnfmlloerjimniWtpvh{jmlpomqhipjrrnqvmknupoflzjonljocomlnrksqpnmnmhplsvu|niocnomkkrkniisnomulojouorkhtssuklsnlooruo`lxsnpjjdmjomopmoompntrrapsnkfcrkinmkneuolncdpgnnmuttoqmnoojmrn{nqslmljonjkhrpbmnfnvhjk_mnmjuwoqvonjrrtoqplmjooptonnnkjkppmonkjnnnollpoonnmoiwjjnrnomt{lolnqfoonoqisnnovtnlnikjpkklmmmoqopommfkooonnqoolpnmthocqoopulngoimxnplooorqjoqlsonpmmeotgokpdjkrpmhopepokpgkobgiimsoonpiromp^knojnmmskopmnnppnpopngsypoonmninkpnmlpkorlpkxnmnnoqntqenmjqZnsnnlypmnoqfnpwnlongsol]npnlgphqslnnqopinmrpomqntjmmwqopx^qkmmnjmlollnlnmmlolkjohonpopjmpotnmkwnhmhsthljmomppunnnnlnpqnluqnwqirrptnfiptjglnqzomknxlopmkmtko~onxhmp^iuiqlhkosugi_oklhfgowmoylo`ankvzb{pqknrlmnhjoksflopqqrulmillpvoopnpphkgopordqlknkklpgpnQtlnnnx}msmmmgotpnwfmknospppmkinrqhlroknmpnronoogoonntomakkosnsnkdplloyc^kooluprsljlinknpwlqolqjnkopmmhkomjmqnmmulypqnqponjmkx^lpsmeoqiwpkk}ngksumgjiqmlmopgja{mkdrghhkogknkmjpmnlokopilvslqgproogmlmrmqymonmsrmlkvmdmdppopzuoolpekunpsqknfpomsnmmamqqnmjiomgmorof{vkepnqqgqmpepjostkpqrlkmprket^wmpfkmoqomlloollqkirqlnpminlulkolrr`nnonwnnhnplqpoqojdmrpkokqrooloqloowqnonupgoqqkjonpnoqhmkklskfokqhoplqntpyjmolmkjmpnopopzo`pplgkoflrmoohxnrrqimmmntpjkonnqjfogmvjm\mnipkilnplqhqncjnk{ucjnonqphlhqnknjqnpprp}tpmjplrcnsolkkipsjhmkpmlpxhlmutkomfdlrtimqotmsiqzhshmmjojklhnnoqnnnmmmmhr_qjhlkmmhkqloimeoqompnpxklonna{jkzspkvmsmu}^uolqmprkgmdvhl`jnqajikkmuhnoieqfzdndpiwnmompisihupmpqmolrwulqjlsilmqnosjmlnjWhleckjknginnrdommnnhlqkimimosja^pgkgghkqlrisnmnhjmlm{sgjhxmpmtmdhoilkjmojtkhflnpksoqsmquliqqSokillglvvko~kjmmpooqoioqmjmqeardkmopchoqepkhlrfjirinkspmokqkkmujnntlqpuqqiamnomexaedokounrqpqnmmilpmnnojlqaykrjqaprnmnlliknk_fmmokmkoklsnotqkiszwpsmlgojnmumosmm_g{llhpimmwcjnmhjg^oxlhkwqlpnmur_sqpoprpvnqnhstmlonllkmhssmljhonosihibnnnnjvknemklmmrnplrqVjk[rqerngpkgpmoneilldskhhlnrnnonmnnngrmhphmhorvopnndxtnqqipunpexogk{lnftosnimpqlrfjrmppptnsl`konnnurqiprmkorrqnuncsfbuiymksmlqqdljbjnsoppgnqlorllvrrvxjmksxmxulyohffmkcnfnnhjqhiolhjjon{p`jjlminootphqihtwfpmfnkroykjmhprlnvl^mvpewpikqeolkntiktk}outgnpijjwplfllqjtpsnyrmdmtstosrokivnqpu{gknohboninootophgipqnnsqbugokrsqirisnljqo|wojqnnoploklinlrlvvplubozormphpionolyknmokjxrlt|kwnimlksnnhmmlnmkmphohxnhiswjaynpmqhlpdrmmwkmokmpogonuoovnommkllgnvmmksjuntmpnl`knlhbeinfopmnookmsoomponmjmlopmpmsbnkouqqlnomgr^snnlihmmysmlomqnoaqnikor_qvios~noqnnkprnspllllnpooxlkliqnenkopsnpjlcdllngpimkmqnqqonjooickpmtonkqwokofmjznqpjkmmsokoslpnnbo|~opnrjvnqpkpmlldmkkspprnnmojwla`wdghlntorpnbpkgokpp{nqiljkmtnnnrZpoionknionnrhnlonknrleojjmtmonhkkkommqpmmppockolpopomfonvnrrotolmtknpldhrottmpmknmlrkmnlqogqhkmnnnnlmkkrtopmpmminnonpqnhplomnrrmnmqrmvhnqmomlpgljwlxjnkr|ksrkqmvparppjmqjlnhmjmwqoakgjpqrwrpioklsnjn{wcomjsnpjlsnxnetpjmslqmwmlojrrgmtq_ndohqlnpnplnipestgipkkwjnpyrslkopnsmulknjpkklolmalpqoonuevrgmnoxnozpjqpffnkntqqnnnlhjqfojprmlolmulyqngepsqtjhuiihmqlnqwnbtkqmsplnormmmrklnlpnookoqwpoilpaoknrmnptowdxrlnkjvgslwjpbgpqklrnfqnmlpqeogfljkjicnfcipfmilklkopq{mgrenongkjghiomijrluplorkymqbuhkjhmpmh]otv_rfrjnlgfghmglnnmqffpntmjjfomiomumnUnkkmsgfeljonpthllolmlojlurtsrkluisknpjvjwericugqksqkckplexhSdmgpmrlskipsmcaem~sjpurruninvlfimjtjqqhljoijniljen^rhlnatfogr^nvfhjqgepjdojlfefqshtkultkjovin}jxx|xlnpommlqcpkjlnnhcndqeniobompstpmtsoslqpfnpkkqpvgpyifkYr_uppfomtssqsxpeudqrrsrngmrkgospllxlpnnmdolhuhwqmokyqcsqlhknZklmzhflombojdgnrnkipbpqrlrbjrq_ummilkkivhklpsglgckjwskqppcoths|yjdioLptynokrjiqlpknmdolkrnm^jtpmqklwpyonomtmnnwrffYlgtkngksroqhnmkgmnjtdaildsmpkkthmkpptkqbfrjfjmirhmoZopSdjmmtvjqohlmcmpqrknooj_pfnnylqjrvloimemqnmotklvllmkjsonkkhlripimmnknkqFinnninmijqvjfkiklkxhlm\oliqooljktposvohpolpmqqmnpgpk_lqkfopjikkymisngpkvmmighpjpjjrymjrkmmrrrrrppsihbnnouilrghokjgsinonpjqksqjjjlolbosnnjnnmvijmpjoihjpjoltollnkgp]kpucpvlfmmmehokmnnnpkkmsmivnlmm|xukpgoojochj]lkionlkprrknsomwpqonkusoommtonto{mssffpmktuloloqhYprsliohjorqpr|qmnmopowsmndsrtojibmkjoqtolnnkonlnnqpokonimhuopzhmotrmblnjpmopjkmpjlklo{^vnqkojklgopmnmgngknfg^lommiympmrljnkmmnqrmfookpnmrhrlnmjkoommonjolnqmoqhqjsnnmqnuiormjpolmnopoumf^objmpwpentmqmlpikupioooepvpmmimjmiqpknwlnqqlmrnnknmpkrnalrnz|{no_leo]kmgknnqpompooldnmnlmjuhxmgmqnpy{xpwjononrqnqoolomVomtlmnjnkrfsrpo^oqmnpmkdpnknlomolopjloto`ninoxqYoporZonpmonoghmnvos}orgbqntkok{thnmnlsqnngmqhnmoporgutpdnnrrocjoqnqqqljkQopooldrrsgjpjlknkhtogmok]zkrtncdztpjrmwhjpm^trrhilpeotklvmqmmoknrgmlqzpirmiqltlrloymegqlzonn^pirzqjlloknknikqjrtvokklvphoqmpljqtopjdrimnknj_opnporhtcqpqaiiqppjiorqojkjqtlmjujtokqskiiskkgjomqmmYnz_qrohqpekr`fpmtlolkinnmommoqo|opbrnqluolnppnsgipgrscpkelocm]loruimojpmkotmjik}opltornxlkonfgnhnlqsvwnpovuioruiuurlbqrjwnpljglrklhnpssmotjqqmimjjgimqlvhgkuposlopqjsogfoklpdksenljlimoqoqumhjrmnpmsnmiulptqtkfqmqgwltmfl|ormwqklptlsnmglommnrlskkhkqrlstkjlzmpplospospptktmonlnjwnnvprnmsnjlrnlpnooliucjlqoommnexjqqnemhsyulrrgikphhoepvdkouq}cxrxmkgvqnreyrniolquyplonrsksqqnrbon`nlqqcsmhkcprn`rnsnjtnklnook|iqimkqllkkrortsmjugppitrkomrpocdmmkhohqntumujlgjotnmfjorfvnojr~ioidpllsjkiolniqlfolmplvtqoqkbklapiorqnxvjkmlppipmovpnmlklknmnl]omniutonhdkmnqnrnjqlmlpqnqljmioYveiqmnlnklclmwmnonppmorlkunsqmn{iwgsqnmlkVimmvhnmkjnplotqkmqpijsoosvophkooonlonpmiqomlt}qpnfjlmbnploknglisunoqflnkklm_tkn{moaqebkkhloponummknmjnoepmkmqlnfnolp]tomlmboonkhnsoqflhvmlmprtnmsmtmn[tjoopikoicialppnojpvpxhltlllzmoiortnpjmjmqokmipqyzqjkpmrjnvl{momlnwstpmmlpirmqrsouqqniiisorkoslpwrlopmkrqnupjjhjnmrqmqnmnppvqkfthiolnvotilllppsoqftlnkzwornnmnjrurqjiowolstklttmwvqjkihrnjloswfrrjolmjqmmnqhnsvmnp{slrzjsfqykosptkmfmqnnnmhrigmlqrnrqnpnoliclrvqlnanmsrsqpnljqphnnmluegwoiqmtop_teqeolnnposjkfkoqg\mjimnwmmhghqrpnvqerkkqmqlneriopbmskomuqkqppkkosnponiimgwhrhoinenipivjjoghivmtfjitsmsmopkilnnmaoprhmkofolllikdqonoorrqolnjminkiflwljmgiltnmfpriljpjemorkrniUomrmrpncfkkzimphlimrkqjkmmwquqkorsjmqpjskpnqqmjqeqhginlwpopjkqssopp~srupklopoptm_tksqnnkotkqeolnkmkkklliksnloomugiqjrqorokoglorijlmqkkpdsphn^qqiotnoopmrmhvk|rromnuufnvpkjonpnitfvqkUmjsqqflmpmrmlklino[mmhmfkkkkmoqmrmwpjnjpreqjlmmlrqemmdqmvoklopfqnghkmkqomplkrknvlnlmtnpoevqkkpnwqnnlmnlklommoopmyynlofpeqkfvsmnslvpokqigoqokkrqmjkqnoklojpkimqnctrnfmnjnuorknmjmohimjnkmoumjpwpimskrhmqlqnsnnoppkjlruponkqr{jmppinjptmmjunmmpitlqmnmtmiqoitrtk]rmqmsinrmvmkolpropnomlnhopqqolknmnqpqkqmsqfninopllujmbnlhoonjqfjolglhqojlkkmtiqmanpnnqmxqjqomonnjonqrqotopmqnromoqiqkkjornmmxjjsnluasqkkjnoigsoojqmillmolspiqxxnmfnmngippapgkjnurijmhoiqoknmrotknlljnkpvlkpogpotngrorptgmntlglhoopqiukimslinmrhkuubmfmqioidejnmlmhlulogpjsroieqnwcqlolojilowpoliolxmhrzjqsmonfowrommqponpmmqnomtnudqhmlsmnpjonpgprruiqhthlsrptknWjmjqslmnllqjpkolmknsiqogemqqnomqlafhpyqqrwpvprjrtlpiltmlljbxprhrnjlhnickfdfheoqqokj`hnqmopphqmpojommyqlirjjjkkkrjmmqmwtnlrmojmpplrilosnkpllrsigipgvyrnmmjlqopqmomnlilhqtuhufpomhqlkprjwtnpjlvnmufobqnpzdsppr}jmqopq|gknlkvrnnjghxlqctnhninqpiivkpuslqrmipkqhfghkrslvonhlvopkrnimtqnlllopikqflpmpvnkmppnphqntcwosdtighjomopomkrlmkmfnlgqickmgqjkimhukerpenrrtpfjnrowonofpgkomtssklgpppsolnqqsqsuqndnrmvpq}pjktnsjkntprwncnrfoshoonmlrghnrsm_inpom[mklmmpvrossqlnerlomlakhurlsfmvmtpkilnckfkpnowrslmtlqchmkmlmcispnonrntmocorlpklmmnikqlnhpiuolektotlkqmnoptrlmmlorkodwsuoqqposojglhjitmnkuhnjnlnlnivngohlgkomjkmljlliphrqslsxpfmrpnkmlijtgornpqqfzlhhkynjjmoolopomhho|pjopgrlscoqnqlqltooovnoonopkjolummpgjgrjohfjniimvrjhsmpmxnmllpkqikflkhqgqlnokllmfy`kdqnomklqhmmn^hqglk{omqmsvujkynprnmfkqiroornngpklhnpnbqxoupmkiqmkrrmmkopmiikofqymlogbekkeoskqlivngjqpvnymkmtwqocupqnjvkcllomdmpcrpqmgtpqfmrkksumudobrgopnkrmmjorootxdiqillolnmme\tqjbqsppfmolo|pamljsstgjtbkmpn\Njwmplsnwsgnohslqlmef`mvq|obpnxwkdojmvhkko`clqmndtlqktpilmuifhqlrqsljq}oijgmoosllnkwuocdn`pnxlVoapmqqslgjftlowqqfcmttwmmrmwpikvknpjSll~bpojgipzf`qlnojoeoquqmafgcoionmn[Ukdqqcgt{ohtkmblhknqrZjfnkrkoqkxnorsjqojsqmmonkmmqmfnlXertznl~nfoiknklnktymnmnphelnlvWsxtkkktojnommmqkjusrpprvwupknigelksmpmmqspnlithloqiimqprrnfZpkmowmeifhjuklqisjrmvoinflosrksn[lqjonskjnorgnmoqmkhjnmmimbhnpsovppnhhsiglpkklljnfynrqskmhotoflmsmripiplhjpgqllj]qo|nfkrooihmunnlnmtndqrmnoolhqokommopjopnslzjqejfmlwjyprgrmorjmrknfommsloommrqmylokpqmmplnqtnmlhqrpqndlkledqsjjtlYrniknmgptnqujkpmhoorntdl_kirtlqkojmbrjo\oqmrmqmmnwpkkqnisojxpgmuptqqnkerpjnmnlnsfjqmnunpkarjhyqsomaqlUjqruknpaopnnmslomljfaphpjlpfqkopihotlmlkksmriimkjlkmmiroifsnqjmiljrsmlqntoojgklocfwngpmpnmqf`kbsvrjnkaoamuwfrtmmnrcmqipjprrgksnvoojllpwpmlftckilyf[sprlmtbonpkqnqulsumppgsommoqnlnpnmjinmonlngnqjkknpjPonrWdrmdondomjm\qngoplshurkrqnnojqmnqroemsnmlxqunptryqo_qlrmsoohlymnlomqkkllkkgadn^nqsjrnvkmvsmrnhlmpnolkipnijngmkokonggoqjoguglpwojqiohkomiomoowermpprnvkknmytomigmilonovnlnqimejmsjqsnjmolthprtlkhltmmjkkqnlkji{mlionntnmnoknlmko~lphljkojnnppoohrpnovmrnjozpkmijjolqqllmqlmklijkpsnlnqlrlljpqgmpmopqgkunrhlnrbplqprjnumlmqnqnmpipneumllrlnhlqomk\uojkofne^qvhnfjkomootmnrpmknnlomjmpvdkikgtmmkpklljmTodlqllo|plnlrmk^mkiqshj~omionwmonnlmpioprnmilnhllntkofmlookmknmmymmjknoqbryl{ornntexmlpmokqlsgbononepmltmmllomkmoyoleiljplhlkntlpnoljlnohrtppmrmmmtkjnnrpblmhkmllkofpmouvlqrnmtoppkxowmnokmoqopoiiqtpqvjussvhponipsiqokontmrunwrpnmkmxcpjfnnerrrkpovqkooqhqjqgtrmpgliylpoodnlvprrsujnurkpnomsjkqnthrotpshppgmthtkq{ejommnqmhnjrnpqlqwfmpooikwpqvqlxopovikpijhnlgslmnnqqjxen`mskbniviofkgkhoiqqihlmnhqppotxeliqokqlommioipelhlhhlkonSklsopqmjpmonolojpoqpneqnwpooloilnnjQqksmloooikmkioksnnqnoocoxplnolorleaojgmwt^gmlmroplek`phponrloonknnnkgnsmqng{lpnomlonotmtrfupnmimdinlnmnkmolkolrljlqsonjmilnmnisnltkmknhgrlroolsoennxomllvjpnblnmnppxmumqllkpjmnolrnppnqnonkmmqzwnlooxopqnonnkp~wlymfnsrnnopkpifmkimkqjrc|rjl}ronmnjqllrnmjmsonkmr^fitorkounnntnptnsbksfilnpovipqomtonszkpjpnkpnoqjhglhnholnkpfmdysnusmkrmrppolkkqpkokounslrqskurmjkqlqnnjllosoxfjmlomllkmmkohiomthiijghhuvmnphnasxlillgsqos|kklljtvlnrjeojsimqqbn}npqqlzqnpttspmkllqpnpgmqnnglnmepknlmqnplonnrkgmnninoeihlnnmtnzpvmnhjqmnslajfqknotglkrrpm_mmnvnmxrpnnpkpm]nemowvqnjvXoupplokjlumkvnhwfammnkkoqoqjlvtnp^pomnnsolqgnmtagsnqizbioso]rpkljlpmpmoqmqovvokroopvmtnpprhpnfunyioorqjplopmilpvnl~jliomtsgodjrsqjinoqnkoommrrjvmllccpkk}pslnjlwopnkalkqnnnwjpqnVjmhnmmpppfqmlhqrleulnqmodoopnjrlqopklojjrknmyksrjoplqolfnnljmloppnvpnpowhosgl`mfmpvmntllunjmpsllkpkpnlqlqnooimkilllltsnokmnljoronjzmvimijsmglqjjpntnkokpotqohlurokqnmlpqqm~ilqvsnkpwrrn~oqoihuokqpmioqnkqiblmeqpqlpmlsoonnqnoslqlqftmrdojomou{mklmnhmrmdkpurnomiloskopiivkmjqltsrmnlllqonjppoqlmosontqmqrhifmsrtlpqqmukwnlnsjmpqjisnqrsmiqlnoprlftrqnqsopnlkorrjmmnkqmkumorbptonrlonrmllqqolprmmnmnrkemopokqmkonnoophnkfpjnlqtpqorkrpkljsoqvglgkkoelphmlmr{pkirrnnfqnklvhlnqkojocmkroolqmlqojnrjnrlmnlrolkqlirtompqliqwmmojvdqnkiqlurevohrmjfhZnjlinqnpuorpkgjp}mommmjqqhkpmtpjhqkqjmjjlnpaclnloijskjlgprgorpolkmmqloqvlimplu|fklmnuvkopjpiwoqoinlnlolpjjlbpdrknpimjoqnrjrpprknolk[irnnonjjnnmnpmtqrpnmqleilqmmkolunqrmmloijqipiioh\lrvmqpshnpmmpljpnnmkmttnlojlrlnlqmlopjjrmopsolfrnmlnsozulqtklqpjjtnyomnjtrcndllkhminmimjdgiomthnoploitnb[qmokikimfquomvrpjmorilnmjilosjniqeloteosjdkmpmonelgolemlsrihjimmznerknqkklnxnquhpnhsskkiomokmppqnpowlgoelnjtokqfntzigqkoclozqooutjoorxnpvmmkwvjllrpnmnlgqppimgvirkqaheqlrnroqlocgomugglkkssfnqhlryomkcqhmjlmp_dtjioiepqnmohvrlkjzoilknuklmnprrttp|opimihismdmllprxnqirlfpnmmdpnolsijspnkonoerlknnqlnfprmcnliklqhohoshfqskmjjkhmmpglmspkrjjvlumtnjljsollmolpnoqgimqoslrkrcpojkssojoekomplllmrplulnlmnnogrmhtminmkjnmklspgoqqhmslvmtxtpsgjljtumpnnqomjqjpnqohqtlssvppnimoxqonossobmmsoigriuoqrjriioonpqfkyolgkvwjormpnhqlnqrjpruoliprtjoxmxohvqqqnkxpnjjrakllmnsosqoatnsi]iuvoigeuomnipjummfllhijooucsisoqulqumkojchkprnvonornggjmtdqnqmhlxoorobpqmcfkeprjvsoyrjnptnb|ngtm_xm^rkqljpommjxjggnpnmhrfqmtmnpbmpcrpjmmohkqftlgqrujqkjrrooomjjphcxocormrypowelmnuononykplpogohvosnjnuoyptrxptwxqmtusnqlnprnmfjmojnsnmitmjrsleytqelkskmojrsltrnjznrjqvmmkgggpjqjpozimflkojnokiogwlvqlwmlpoiookkkglzrilhfrlyiin\hqmpmomllinhloilsrmnupzlgqjmspihtnropptompspcqkiojmhsgjjlrdlksrktijypnolrpnplqurivirnkxmgklompmlnbtkeprfjmml^okjsksklnrojpsqox^nlonpjnhnnoqskqiorntn^orhmojnklldpmoflmpllrpmc{mpflolppwkllpmopitqijplrvpinnmkhmvilsrallWrphnpqnolhoonhpomnYpqlmtniozjkpplnlnkpooqrunjonllbkqnpmolojgdiufnlovonmhnmllo\jkmmlmoonl|\qommnmhqpnynumnupoqmkpicomnotlnhosjlrnvpjxkvipjkmphhmmnvnnmzpqmninonnmnn[ermmonnlqnnlioljkusqnnmnndkwmloonmykkpmpnokknlemrynp}hhngpmromlmunqtlosqnkopmnonzmplunponkdqwelqkinvqovoqlVomnlqpnplqnnnlsnjorlpeXrnsjmlsmqlfiinoxomrlppjinljk`jnqk{vmmunnnklmnroYlnsomqqnsmklpopmppjmpmtqarnmlxlm^xqnnlpMnonq~noqoglqmlhnoiwqqkhlnfbpisnflqq{povopqnohkjnknpjpmkqqwow^skqqmtqmkonpomo{duihnohrpksqmllnskkkoqxnoqrjizhtrsrscpkqwnrpltprkqpjjnmnoumpnnoomlnqqumkpulnsxprgnjovlltjrllmnowhqnsptpunjehfojmphmjnprnihsmopoohpngnenpqonepjjctpomnmdtotomppkkltrjqllqnolsn[srrllooxktoqwljtojpgrnonmuqlslyhppnnmlsxsotlnlrjlntojrsvhdnkqqkonmnmpmpnbmotqriqjsmkloonkliekqripnklmxozljlqnmjrjimyocroukphkqkoqcohwnlmunmsmoemqvphpkzmjrqmsbdimoifpsjlmgmoljhnxrmpilmikmltowofmxmnplglnnpqrigmopmkqnsopolfqqntrnamrmmsnurorojrsipnrvslmnrigm]nnlno{ohjvlrwkkolkifmpslqjsneffsntmiiopsjhxosnomqqneuojsorrmmpqmspoppnujwkohqo|kqpjnueotwphevjkqlkhxuznbnpqmjcitoluunnlkpnnqzpqo|mlvjmjooqqyclrfohrqtnkppnnsrqtmqvnpgpvjgfexolmmpqhnlmfnmroylkrkgnm}sdll`zpqnoofpjtsuqtlmvsnqlnnmqrrnvqpbqmkpiqqkkqqmgijxqrpjpkqrmorhpyflrsolynfkjofmukfmummlljgpljljnntolfpjlouxmigmhdnrfiiomhklplkqjwftlmolnpqokirzpmtrv_pjnkslolhlkphnkxjlnlrnssmlvkqnhlqnpsxnqkpmmqpzq`kqlolbqlppoqobmqtpqjkmpkjpnveolnmirghlkohrsmw{qlghpjhqnonpjgdnnhpkviokmnunpntinkxpnlnvomltsqjsponjnmlompgkmpiVhoriwqqjkovrglpnpqnkoinqroqplsvjkpjelmcmqpmupprpjimkpqpplsronfnhsnruonpjhosmsrrjsrmkorllkosipqlionquiuspgqjpnpljtmuyqqsllnmnlnskljwqqqtpsokkmqsnoqrmqprnmknopsqomvnZoqqnhmiumnlkiohtqlnshtkjkqvpjmoonneifmmypotopjtncnmdomntuhqsmmgkp{mjqoqnjmmpmkvfiuippolrrpsjnorrrmsvkmqxronhpxjpnhmipfplaujelqrpmmgwoqkrktlnprmgfkudmtnpfjxgnegooqneloiifokhummkmnnpluiopttkklslnqjkrvkrlrotiillpnsxlqtiomnmp{gmtqr]uupknlontmnpfqqrntlfhnntoloekgfjmcclkefwuplkoqznqjvrpfmqbbjrolqnk^vopqnldlltnpvmq}n_ktjsoonkismmk{ohnwpkokumkmolkloupmglmqjqkhiqjtuoumo]pqqlqimnlmkbjivjnioqonpnonnjosrqrrhkuusmprjsowjmgmmnloumjhlinbqoojqpomkgmqroklmqn|pgnqhynlkkymoiompfposlnpjhnnlkclpipopxrrqpqjrjtgisamnunkmfilqomhmtptplqjkjpplyinrooihrosqnoqqmoissmojeocdnnkllpnmnlugoosjsmnmmrwlmrlorlvopolojmopsoohmmmknjmoomhmqnnrrpvvftspoqkmookokqmpjqurnkqnqqrmprpqomiooqonlrnvnpmnslikqmpnklqqnmemkksrsosqojtpmllnlnjnnmokrlmvfqnpntomkknomkqspnlqipipnnpmikpmhoomosmhoplilklojnojtriltmmlpnjnmlnnqmqqolqlqjphplsqulinoqhnoomrnorooknpgpnqlpnmmirkiskmhgijnnmomnnopoinlmmoorlrrpovqqmrsomoqoniqqmkkleojmsqhl]jnlrspojnrnmmjlmpkjnoniomkmluvpoqqllgrnjworofpmekvlnllnonkgiow^mwrvsnzpmppognhmdqonefbnkkommn_lkqrPlqtnqen|hmmosrtnmpgnogfllpioslhkpomkookmprmkzWplmokorypolhprg~sncplivj^omizmjlqcmmdgmqimm`gkqp`npjmnlnknommonnhnmnrokjldkgmnjmtlknnkummmtqijlmncqnirmnopgkpnonrimmnmothlulmmqopqmnldvmyjionqcmngqrluompmln}nknppmmq{lgrolfxlfpuljnnkmlpm|kthllmfgohmksjpiqnmp{ngrmrllqanmrlqlonhopoqbhsnrpiononlnnoholqmpi`fnppplntvrnpkhns{punnnomoorrpolojjporqkjhoqkqpurlgolqoqnlpnonkpmjkmlowlgknnrmmnmmmmlmojflmjmimrpmnnbpkninm[oso`iormismn{lhmqmmnojvpmim~plpmnqayl|hjbptono`pnimnonqonwm\um|Xqkmzzrllpqmjfrdm{gopmkgknqmorohousndnu_nnvklmkkopmjlngokpgthmnZnrolopipnilsmigkUololonkguofmk^nntsonlsruseq{jppmecnn_qjrpqniauhkgiosto{qfoslppomonsnLudmnfmhknrsoprqldvmlzpmpeimqmjmnfjgpjnor^vyiqmjlmmcnpyowvgq{nlnpmqgjhmhrrgnqirmlqkknynokqsrplnmmrspynmldtlqvntp`qusmqxgismqko{joomigifkmkqrbkopneqlsglmvrqopjjoipp~uknnlxmemsnqpwrgkiijgimllpeqhrlllmornouljlopkj]nnpotgpmjoqusuqkpuorklniphrsuhhnnmrmmghkqtiljmqnnspubnlphsmvkhrjqtqpzprownqrinrlsdnkps_nnmklvponnnowsmonjkspnrf}kveRnoo]nbmlnncpmomotmhamnjokapuruwporjmoomoant}lqpi}qolpkqnlloooalsmshdmvtlloYmqpionkseznwmfq_otoeljmrumktpj[doltppljlrovtiqnzocqnoim|yntvhppoujpmqsjnnrnyqzbojomspmhocopjoomkprmnlrtspnnloijpmovnacskrkmperylqnlfjkkfqrgnimzurnnlrkozgikmvxhvklyrp^oqfmhlogoafsndozp\mqplsqkknc{epqhqrvqmslVpdjflmqgklqrmj_egmma_tvpdzjsolx[fllitoxahYpfunmpcmppknqwo~nx{njbrnr\infteqn}fjogtpnnlknpQqnmkukrejos_sfdghconlxpwl]{nbfponkhpi^]jnxnpvtmupnut_imqrppnnpkbvmhhxmsfmjlkiqn[f|onlrcrmmuojaekpkrf_rqionndoidkpbrfljirpfjyieamlrogpqfkmsomtjn{mpqoeqclnnlmnimiqiqmlsrqkepnr{qckfnlm|g^oupojmplwoasphlmbqmst|lmfjupllklpnmkofpikuitmnnvhlrp_rokkeqyukononl`vlqnlpkrmn`pngnrlsrqolhnnoh`in\keghpbiilytppkmvplemmortofnpmlnjrkuhlnsukfnoi_rfpnrqtoiokWmjkhiprvkhiihvjmoqpm}nulhxzhzol^lsgntfrlhqmolimhmrkypdop~qgk[lsgijppgoljoprttngfzphs{lmspnd|nn_ugfvhnmkdxgqmlqgbklilktjleoYqkshpimt^onlrlmqqrfnpkpihbmpnii{llvqpmlnknvnjekjkmqkidjqfoelpwmknnwnvl[kjpnjvdoqwzk~gnknglquslmoohf`lphryktlmpyjpmopwwotkemfkjnlmyznqrxnon`lmllsqpnk`pnqotmnqolspjnrscounmtpfqnqfmko|mtmdrnbnnlokomnjomkqvino~sps\lmpnnZnrncxmpnpsmmnlolpvisqnupmfoo~p\eopt~qthnzplmbcpmcmfmrkv{mmmumplrnqxopkrop^iro|nqqlWu{kxnmnm`gnlKdponjmlgkkrkeohmwtgmmoiilalgorkpmqlqnmp}e`jpnkdppuhumojthhojmyllpmnsekli|m~r}ipkss}tpuolvpahqvmpryqyfnqnnrqlcilgpqlkjgnznmlptqrlroolijokaqfyoorndqqfpmtm`sgvglvqhjsyidpyykrqxohxtmsptokwrmuzltlqgnnkpfgon}mmljrmrolsjjmzl_wukkqmlmartpxkmkgnlyrymqkjjrl}ncitntjwomknugsasrgynjqwrzfjnkvmloreqofkpimmwynkovqjjgprnpmmljmlk_klmmpondm}mjjFlkmrjnjlsninn_thnmopnppfoklmltplxp`Zqytkcnukmn]nniuhnnoionlnmqpowokj}cqhjrspm]lZqermmmqigjsknqnunkoilnpkovlkinnqtnfmnsojmvizrnuovn^qpnlnntwqllkl{tloqsunwfmjo]mnx|jwlnkpv^muavoolzoqylnqomlmsi\pllnimeofnlmmohhfoimblV{rklollxrbklkcvjqk|pgqomme`qqpimnmbntm^kqspinmxtuPopljtlplnpcovslrpzhpu}o`lpkipvupVsjomnlnpwl~myfowpwis{lkopkhmNqilmnopaqsknuloomttqwkipmargvlrnpnjlpynmlqkonnznrkzmqdljontpmjnpXkponnlfjiommnmltlttcnmlipXl}eplpp}YnqyqhmpokfqT{pmxpmwmmtn`ojomslpknjopqykkyn^ioniXirsnizoumioqrfsmtjnwjkweqjfxghstfujjpqkq|rtuhqsygfoamjqkokjgohflnqmhqkottqnpekkmjlmigjoqomkhqnunejqlvv|lmhmpfnhsrkkmm{nlgkpmggofmftqjonmqmnlmpdflsr|nlijpixsznmxixppqkmjozplnhdlnvoghloirchkvnswinkdniksmikptsikjgjrqrqmlqlnskpmptwfmtoqynnkpejruopdjkhnphmnmmupjjnirwq|sijpqoqklrllgjhfnuiqltnnvjqiofpdunsmmhxulsfumjmmrkulfuotlslznnpjypossnknmnulupnujpqmiqpwotijxjyfpsenrnfqeknubnpkqqszknnjtpdhizmeipnummm~gpsjwojkolnfpqejfkjrpugohmjkZ_wtnjkioylrtjpumkmoljyoeqqqqipurqiioUmpugqplrxrqlimeootkytqnjpkgxnlilsdheotrolkohqpqklnpTkppjljqmzm`ommjntkpoouo\kroejuqqonrknynojyslgqprkmwt^pmwn}odnmrogilljljnkoqoin}q^~lkkinnqjqhpdqqnhkjkejhoonmolfkkhcojijnriwdmoipotrranlkjlbtooopmnhqzkjngjlfhhr}kmspnhkrhekuinpl{puinlnlmfdckqlmpnsiplpo^i~trtnpklilkqmnusknqvovlj}noklyignpvjpqmmimwvpsjngofmogml`qpvpmpnsptrmimjwumhukolupofiptoutlrjnlxlksncvtmv~lnlfrl_tysmmomjvlolhopolchxpysmmoounwop}mogszrtqpt^sbdeks[nl`xmknlhlpopnk}pljooddwtloquvtohuopqlemhhehpjpmqffmej`n~kkprqphlgnlqookisvsoorgtokartgmsncyoauhdonemifjiosinyjqkqmpuhuf{ikppqwxrlkml{slqtcnvmgigtpysmznlmeffluigsouqufmo`btlvmsmhsmrso_rgksq^lwbm}toomoghnbqunzwsnmlmtjlj_rqpnsmmenobrugusqcfwjnnl{mlilhqn_ltjpnrTlpomkzduemmpq`n]rpmsmvTnqkhing^vsejuotirrqt]wopqrmnq_uqqfkbiakjelnrur{nxnlemnmcqtqj{jksmuujd^Vrnqnginmdqisn\hqmjhoqsszfnsiljnoioloymmkvgodnkvsknqgpglShjpqrfqkipjtixsgjsoxsnpjvuqtxninr|jkvitolnsoshntumikpkgjtmtnlsjqloptqwp[qvptkxppqhesrxpoufffhmpnhijkoj{kcootpmnqmohmjksnrmkokmilr`rnhvlbobqfxxmqogiiensmkoemcilksonnmnjdqrmlhptuwntpgdup]_mbnqljmwknfi}lelinjplZnrinzelqqqmqnpwnkqsjjnmlqfoglhinooogrnsodoiqemsnuponpnjmocknmpsnnuknmoioxncqofmh^rvcmqntmpo}mn_p`oonplmslkuj_]onc]mnqkpnlqinnsmnognoqrnpqsl{qpqmpmtfoneognnmsqomkpslmyqnoko[o^joeppnhkotmllZonmonpmulpshn`k_telgompnbjnkcinmprpporpnoqppwrpgtkpnmmlhlxnonlnmqzqon|lqnuk`noomdllmojwoom_qcnpjlbusooeqskpqkmpmpjqonjm|qtkomomkmokmj~ohimfo~XpsmkcoSmkntvmymmkpplnm~ojsjjn`wCdnimprmm]ngqjhqpkqkloopkipntrspdmbppkhpconpqyndjm{snil]XpojmxqnrukklynkjimodboltplnlnrnwkqtlwW~orlmrhukjxfpjl_zprzmojosmf[^hxoopqtiqtqyolomoolzmmojydvn}rinoQhtnnvrtqkqqrtmgitoqpuwprougusitpwtwanpktmoyitlksoppomtonqqeorgiwnwogphoojpmqzpkleppifd^avjixunrwkdpmmgpk{|Znpvpnrojcl`paZXjmtph{kukolqkkqklmntr`lleognsqwksohreimlEfelqwsqpjkqf|zWet`srkfvgsnkompfsocenmngyilkknjnq{lahooulquakm]trmhlqh~mXgipsfkmmqqklMoZatSRmdu~ckovnjiqfmonkqlplnodjqmilmpkpmenboetlkffslnrojmrlrtmqmvmmnmutopngxgrwqciqpillbunkrlovnsknpitminmeuzhohtiom^yhjnqlxogbwptqqlhsjmpmujrnmlgpkohlrllkmhtjmnkqimkkrsstqmixppjdkgpnormluhp}jueqsmlfoqgqtylxhotniwrenblmnjkejhlfulmslgslhpjeqhemquqkomnrpepjusijklxs_ostntmolpgevjiooYqocmqjhqb[tmgohhusi]m\[vnhjqlvmmhaonnltoejnrslo^jknqgljpyrjmjhimktufookn_okdgsjkbpmoukqmi}co_khlkeoiqintnrwlldgoj`gisibknoikcivkmnbmspkhqlbqxfshRpompm`vnxhkpplgnxpnrlirshouxnlkqlpnmfmokjtmlqdqkmenjpjqivejgulcgotognmjqexptnkeosqqujopdcfkqq_mjmbkoplkhoumcproBrqlonprknlnnp`nXnjnommpjooWjnkoqpomopprnppnlkrunpijljomkpxoTpelnfoVijqomolmunhnVdmoklupppnioossnrorlhmn|nrhmolcm{qmtkqnMoslmvppnYlkoopllpmsvjq``lppolrqhroemmzmqlymxnmkknfnf\lomnmanmtnkpojlxvm^igikmtko~qjmknqpmlrklp}~qmntroomurmjhnnxklrphlnupmpomrqp{oolbhqjuotljljpelxxkqmjowyonqonlphgohpjtppqltomoppilnhqwvsmqnmveptsluooniRkumionjjmnnplqhqj`kqocpfmmmijp_pqnrqklrtesono]oqkuvqootqjmpokq`lnrqfjpnpyhqopvnln_hglljrxfkghmyorno~hqrnrrimahooksnwrtozojjusjqnfcuoliijknpjpmjsplqrndkqimyhoonomjnpmkopljhqstkoln{tozdroridjcVmcknmlcpmqrmnl~iuiotnogkzspkonrlsnbifozhonorwkrsnsgmqmcokmhpplqqq}e{tjjdtxrimavpopesYrlmqmyojoplsppojqipofqrirmhcqeuoknmqo^vmronnnmlsj`dslomgot^lfqklnpjpppfkwmlnlbqpemkqnmnkomqgvnofnqqnpkqkkeivsnddltpkmepvpsqpmrrtfmkkminlmmiolfkrnmliryznosmc|sv}fofaedisgvqrrpoupkqt}qvskunrkqlolxh}snnqlhrjjlkqnggplrcwnoomwmvqphnotnihqcowxmrrijlpsrfsuqpbe}lquopmmtjmkhpnvhqunusnropst_kqnr}mo{ojlmup{oornylat}qtislflqillmswmlflrmipihnrytncfghnommhmysnznknwhfqolfrjqnsnrntg~quibqnhqzmks|klh|wtklqllotwbhrhrusrirpXmkmlnhqorjmwkriej`}lihnxohqnehgttlhnkorcf[simknno`tfginnwklqljgilsjhmopcxgiwiko{vwjpdphsdhh~mnnsVoenoSsnplnpeuloewrmgtnmmpzhp}q`fewksol`ueqdmjlkriljbfsmnfsowrhopn`lrppdnvohqs{jennndicotWgkmonmksnpjsxs|sqp}gnokicrsrimenp|sqrrkifrstmpenqg|qqnnpiosnukroznkmtqkim{ukmr}lnonnroojnnnl`mhmohq_pr]knnsnppdnoOmmnoknppeqlMmfcqiXustnormr}ln`oppsrqlpqpjrmtjtrprsumoap^gmsppqbnnkqllxinvnummoymp~lqmhsojplpVymoipnndn_rWklymjbugmnspm]kfZtoqq[fknqrotoqrljklplyoqsjlgq\ononsmrjmomsdlshwmskljp{prmqgntlminoqmpnherlornqltmloriqtowgnnXemlnfnloliknq_rm|rlznfhrhvlhqpmtnchnsqvmjpfpofq~ogivjYbtyrnkosjjozs\qnnll\omnkvoo_jruogmxkoirp`nomwlgltnmnmwmztjzjlq`lkukqotpqrmnkWwknsonpioqp]ntmltfnwpljmn{jvugprijhmpdrpnncmfoobgm_oltln{rnnkmmqko`pnpyknlreossowlrmnktjn\oasrqdfmhlmnjqrvqtqmmioqfmpimopqnimskkhoyllkgoltogloojnnnrqpimpknwnrfokjqlkgqolokrnzrpnnYpimXjloukooqismtkuuujkgoplijppjpgmqerunnhjklnopjiwrknqmmtxrkmqrjmhriilpgonjjhntjmfqolllnqsrmchopimpjnkrorko~`mmnspjk_kmqnlqnklltpeq|seimlwonoopqkuirplsmnrvxjmowkqosliqlnanli]fir_|sodchpnestb{g|iiongklhismqcfdnubnorr}hqtnczlhsrpprjroirsxkmp`thro^kiZoqfoqmgimgvumm}psvzmhm^ng_nospmlbmokrg]ndoiijrnhsRkovFnhjn|qtxjormkijrcwXogem^nyh]elpo^iqjpmxkqdsznhYolnmmbeiookphYgrjqpxrxokngmkwr`lyrkooewm`kgormcsvqmukjvqjnq\ptjmooBm[fopnoVknokkpqnrpmpmpololqomvobqlnnlqmjpnkpcnmiojPloMlepntqbfmiqhmqkmopunognpukxe_]ojqomlmtplmzxmolpqmmrnon{nonooplxos|owdmkpVnplklkki_qmmlyljovmspkonnrnpmrlolosqjvn`omim`xfoojpqpspizqnmwYmm^fnmntjgbd]viujpphkjounmmpqlmpkmnfvqrpcormqsnVknplrmovsdmlnjvpjofmqhuelnckrstsoktopmnm{qnzjxtngklopoqokrfrnomlqwjsjkntlbiphqodoghohulonnptokophimisinlwifpjmmksmnzwkoyneokkdnxoqljkomnprmmnovsmnoyopjzlnqnqou\jhxm_gpok{pqqqxhl~llmnmpnjhklmpqojijooisqmqetmopjrwjuzupvmgmkomnijkrmpzjfxlu_p_nvrlkonmujhpplmoustpngmoqvkXllporsqlkkqgeon}vami~yykmklsplg\uhvyoXnonnhjjiqviogqoppl]knjykmkufhrokmmi_ulgolbjosmvpUrjpZf^tsowjq|qkvssY|kxmujxqmii_jsuopmermbmrvj`csookflqkljkcopaqkkz[pmwhqkrkekX{ooosqa|kbhmmmnollaorqgspqikjqmldvgt]oikupshsl|yRqekmerfqsr\upiattpnqo^pnoregtlokwlmprqbmkwklalngrtjolphzrmsklqnknuipnourxpntojnnj`o{bkkkbvvxqolyk|noosrlcolmhxhutfoqnjmgmrnkynnaylbuv\pqrcmtYgjedm_ckmghqxlfgltpaosnnhkrnrtqpwmksgwpiaje|i`o]rjl{rimlfaWrmkjhjofjknso_lwpt\losirnwnpsiunkUspjidipffmqenlxqimaqiqkl{m}lvkfilqpjpnwmiqsozlmpmhlssqlkoigltvonorjrxpnonrlxhllrnispqnsnj~[kejsimkpxujrpk}prjsjgrnvmnoumrmznnnjgsgnpphwovlikmcrslgnehnqnlqnljrvlmbynhnkff|olpgtfpprlhhlrlrjloyvqfljgsqokmogerxofhlrqvrml~hpsmelkmpmtlwjmjownoupmmph{qontthj}mh`kqjpklfqjpcfefllunourjjo`h{hmsojmhpjmkltokmmpoflodjskoildvcuikynseqhglltjknrgmenfioftkliijlslgyubsmficnrrfcglkqmmks`lmcxofpjih`ipjhnoibndrnojhlm]rwrjjlsfmkqkllizjuculhkropn_`mvmrngslnolommdrjqorlnkjmmya`ldpbqznoohlqlqtxnpfmiwiruekppqhhlqejrpqoupcrmnhfsjsgtvtwlgqcn^ppqjmemukrshmsnhkjmhntpaofrrgjimigkjqi_slXijtmrmmjlqotjhkgfqnwsnorqmkmkikwmfnpmdolmpjijjul|hnustm^rgmj{eom{xbupopqlYmeoiwspuirjjgljonnuhnmfklniqppmlmnjqlijlqcruKnmnitlpkkmuokskpqlappmznmt~popolpnvolkjme`lkrpfqsknslbo[nSb_gmqprokjjs^eljketmk]rpwvznxnhvinvgssqlii`nnglkimutlnZhqfskmbrj`kullcm|siqnxtlhldmmpbrosu~npronnrnyiqgdjmpjnqsic|Xn_jjrj]kpkomflovmaulk_mc}sbjblcrmsoqnkbplcnnskirqeoklpsolsxptWcqrjjpo[xsshefognqqdkimlkuctql~lo|jejmxpmrmoipvnombujmoovqzlsm}edynkoiolnehuqmmvilijjmmrsjhimbmifboovi[qjrulpounpfhPumupPgcmunkspZpmcll|srnpjurmilswim|mslxqpjoo{ibnmovvoltkqngtmrwnllnnkkkrn{pwkpqmjlsqqvoqmrsmptsonpnomnnnk`gnkskqnndrjqqq^lklwomyispgtpkprtuijdugzhowkrqnlgfnigowqkpmpr`jnsrmhjmlmmtrptmkoroqmqrlrritwyopmmvdfilluppoooemdrp{memtgrhxpkZvslinvpfnpsnmulppyov{urnmngpsnujpmrnlhqrcblqhonpnlrntjrdjhlwnkkilolnnnmememgtnijhiojhzkrtopekljgirqhnkpolrjuzssebnrtmlnnmtiswqhkkcqnuritrqlghlluitlgquonnmi|epptmpeyn~ilwsrwih`chwgfkhkfoip\nkkgl`nimbjjmlsvmlrnqmmvolmnmithmltoZ\ltlr`piopuqhotmdllinpkqrhvuplkqbrtpj_cvnlsfqgrcfhgst_n~knnhmtkdmtolgfolqnusqlpdlmjn]osX[rnmov\pep_upocskkhnonpdjnnwpnhnmnlkmopnpCjkllopmnolnkmqplxhsrntlbnqlmnpulpkkosmjsfqvmikqlmmhkdqhnjnjrqronpjsvqjsxpp^lrgpuprhqorksnjktokm|mnkqoommkmuskkqjpnrnqmqmmyplmvomxlxf^oojlniedqu`liqpgrmkunmnmjifonenq}kmrnpyovmjpmkmrikooPspurlnjjmw^lnthmomsiqkkhuysjnfcmnpdnnkrmmjqs}gmombmgosc`f_nvju|ilncti}nqiliiqoahf_jxttsjnlbihkkolqiflotorsllrxclseproilnfrlosnoyqhlykqcolqjd~{nfijoh`pqmunmulhgnmhekqoffbarq~gztgni_hrojihWXiojtnawhjeblrqordxkdmg_pqoiplkjgsaflvjpkjkekmyrlmhsjwnrmiiylqqnpvnpctppoqhztomhblkosnjpnlqon+nshmmsmmmpdg|eXkljal{tmknpllkhqslkrmpmqotskenrkptouryilooukmglirYsrmpnmppmopnnoon_qkrkjnjjjrobrqf@jrqlmihqntgkpmnmelwofq}snamndmpdop4lehf#lmko|mepvvmonscf]ntrppmghssknmrjmmgbohmyjuigk^mppm_nemnpsijmvhtlivgu~mZiktEnpjtl]qpmamlulepjmlsohmlnllboepforoenqqklpq~gnmfrjnzk|rpodnjsxpheswvsilljlw_rqin{nsimykpkoeommwqlrmomhqqmtomkmoqnspnnmqgjopskhi{vtdtasnpotmasrqkhspplmotenpnxnmoiptjowlrhonp|zonyilmlonurllnhiigmkunonobolillmneisglpsjxwmijsokqvVe}mprmqpwnhpkkgstlimmnpmqpnnnwnposqtrqmwihmmnnoplhdsilg^smnogxqtofmooiofo}lqmovhnm}ipxpmmlonmlpj_lo_jmprglmsejSmlmuntmofifnpnmmpaonRibxjdk{cphkorlotlorqols{sklnqqohtplVsesqkrpcnlroonhnnpqnkdlsnljjonopjjnnnkgksuhnrnijlpmjro\eqm{e[rlkpjqdro]pspljafnllmpnlgnmewUkjjqrslmprsoonjthoukoniyuqjslmy\ymowtpttam`oZpqpn}vmlqnjporrpm{mpmsqtombsnfllopmfoipl[shsrqupblkmSpolmnokuomninpnmlkhmnemu{gcd^elsonlnkkq~hnfmmwhqygmnmkqZ{hiorpjkqtxnsoptk|nsvmkmomchwngppkgsl}lpordjhjjpyampjmrnsfoktkjnomsv`ipmfmnmlk|rnmxhqkmplqmkg}{{djqdsqakomqonstlrqrdljmuermlnwgong}hssmk\qsxvqfjkvjcqjpji{lsnjovntjgtrprovhgfmkkqlsivnsesimhwejllsjosofnknjhmpnfnirlouqcnolfjj_okmnmpjjlcqjozqkklpgvnhtkdvsbotkmlfpykrjftmuojmmmkqomtgjnhjnmmoqnqpmugluorinsnfrjrfZbumhpmtoqnouljmqsm_fpwkmgyrmnmppjjqt_nrerqjduygsiviitlimonqkmyjrrpkwlkuomrwqoeqcqksssimxlgwjnjjkmmmggtokwgfmpjloeMploikmmoknvmffmlsnqlpfmlxjkekmyl~k[moinYmZromolkwqocirssWrdsogksnknxaurdhooeqnlzjomo|`rlokm\konoqwvmmukouhobvsmfrgulklkrlomjlkoagvfqdprjmftwukn[fmUuhtlxolqkknqy^y_oqnlukrUomvtslty{ovbrik}eoitvlklmnYvordllkxpqwpoqssrntjeoonqj|nllgoOclqomorxpoluumwn`hooYZqyoqnrosppmopkhiojsm|mx^lzoNoqm[qnoipnpoppmwopukkqkdjo|moomkkndppgkooolOukprksmNitimgpmjlqlno|lotlnqnklllpdavtlpynsorsmomninspollQoqkpnp|yimjhkoof|Tn]pnppzdpkjnnslvlmqqqnuogkWtpnjtlporqoppdmjpnmomroonve}xpnopnnSg^onsrujnhl_wyonjlivshneontlrnpjgmqhigqlftqhlsrpphtpmvrunqrdjkdheg|mkglnnmhrmwswprtvlphdeosckiokkirojgstjflhnq_mrnnZjijkjnlsqhjolujkhmxoeljsjmroohnnnsusknnmmrmnumnequkolhlhennrrpidqcjl[ojpmotkkqnlhpqns^spnje|okhlqolgmslrozl{mpfnssoylpskioiduiqlxrqpqqqkxyxljjqopnjutjlhkosnrzlxo_pnqoipqeqnliognobukapjmomqqpopf^kppmrkofrjqkqVnqmfmn`okjiomyn}Ziqipu{ZemnlrkplcnpqRlrpukhnqsrqkos]npopfynpramlnmmiokqkpolmlhrpmlmhoKmn}qroqmriomqsekkorpr^o]n`immn}uijxinor}qpoaqksltuootkikonokxssiomqslmmmcoqlpqnqtjnlzYZuqkqkpmdbglllmYl{o{nVtrlnlhqrrhnohwpjmjrwoxinngqXlgiopqagmnkzmwqm`npuoV[mgnnfp}lmiuqromgon^mmtpgse]khhqmlrolgxt}gQipofleirjlrloYvkwoRpirmtmqqionldncioqqqli{gpnijrnmmjjomthqfojohqmpinvoiy\ohnYnxoltmtmrolemclrqnkqhouOlnrohq{yndzjvtlspp|rsppllypolkooa`bpmhpelrz`|prtisin_k}pupkmmRfqpk_romnmmnkpmjp~}pngoonnpornmqpmp|omooozklWgqxmxmtn`nimmslbqroqol]nzikvglm\qrsupkmlqsinmfgmojpynkvqgqmrpshkknfqowlb~lqppnZqldpkog~knfmSrcnkpplknmrnkjoOrpllono{kfnslnwq\oqr[mmphkosemopn{znotpmvm[flwutplgnmoqlppnjmopqmbomo{rnuktn{kr[aUjmplb_mnpynznlop{hnkklpooalmngmommnkpni^nYlkprnpjqnp{lnhkm|uoVpshlfppnrnkmmdorplllmp\pskm[jmsvklpnjlt{ojmxtrlkj{rtoplmm{vskqwnhvoqlniqmlopoaqnsmpmb_Rrmzmtl~nqlornvonqnps[~nokpkpisnaql`nmrlpiokmrkoqYplpmspnonfqktM]nxqkpkmmkqsomqmqjqqmnkdppnvm`mppg\nrzmidphrlnwrpknholrq]mmqSmoohhlnmurmnVzlvnpnnrlolmkcOozqksoubofkoprnrkepmsojpmookmZom_kwfqgo|wrmolqmjVjprhpmpnghmloononctrk_plnlmpnq}pjr}pXlrvtkndxoqnkoylzlkrokmhjpnslo}{nfsljmas|ndlkdlijhv_nmooi\ppymoolg[nmprltsno^Zr`~o]poxlmzognsknqlmwqnpQr[srmkslmpertqnoluljlxmjlinqorycpmgjiutmn_sdXhnnllptpokisllzln~jtqlkWlbop^krtlmkjnWrmlqcuqmthkifkgtjipkplgkmscjcjulgmlmuuqofgh|hd{ikhklsxperdpgqsukoknir\yrloqmrpuinropktmijgohijolcmmdq}fnkqqloellfshejjqpfmlmtboouemmqrjlhktqjnlnflUheojiqhxktdppsl]mebomhulvksopoqoqilnpnommdfsknsrnqrlquqpijoqokqokofonm^tjloinmoqpomllbphrfspuwtiakbu\lmmsnblmtloklmkTiqolkfgmxkmrnjhllhnmnvmrpqjqlpzhisZugqqmrm\pmolfljnltllolsgrmwnqkqos]nmnsosglohuujmqqnrhy{r|wl}lxfolonokkzpirkklltvmpqnqq{t\cnxll_moonljprnjmloonhplnQ~qplplZkrWdgisk`Seoqqoujiirqmkjkoqwrssztlnwpwzdmr\llpoj~lwgqWcphnqvpkjtemsroovihiolqu{enil[iqrqqqdumhrkfmrropnevjphqqpwfxkszhmrk{XXqmtmpjjorktnorxltixhrpnZskcfqtpnqqnmliqgbpfsqkmhskolmmnpfe^{ssoqeqekqmsnkfjgspnsnnqtgmlnpeipsfZormsnslylpklbglp\ednmq`n]mpmiiljoskgmykrtonqeiyrqmpmfpfqphe`mkmwgodnWlkmqzknvaukqzmixokffommqeldnrXsiqidspmknjhltmonpgpknfekkpkjrqopmmsopvhqswlvomjypiudqjj|f]fppodcsmgs`jrkhnoq\oqnihnsklmmlvmpsmrqhkdergubrntqkkiqbhvknsingmWmktpp[ihoekmhrqfcofqnvherpRqn\lpqrqvltnjkhmy{_imoiojspk]nioonmrukfymlatpupk~lmo~prjkp[pmpokpplbjklckplot_nmenqxqlnposqnpjkgo`tientSw_gjrQlsp`rpxqdpmlnlnppqjd{s~{gjnolqlmkpovskplovrtntqmpxermmekn_noyr_fnqnqoampmqklizpmgptpfkmojlkqtknqmra}lrmsno^wgnbxnPq{fplsmqleymq\oonpiapnwiloqxi\reFrj|gptikcolnmolnloolnf]istkopnxvkkslafpyltunnsspligyjqqqlp`snvrpupkolnsqknuhx|jtorzfmjugvkopotozpnolmosprmngqopqmqnvkokrwkzgrrkljfrnswztvcholmntivhqdmwhorrvhnqlkpyqqmknkmesnunqqktppjqomztirzvnkst_rfgrzikqithim_mqojqnvllkjknknqjvlnniursulmoflg{toj|qoojjxmwlUv}qfslriNprsgipkdtelpkgvupnmvipspthmpqYoknkoqoqlintkgormhoprls`mm{ingmkklpqpkmpk|moopxqkov]mtoqnkqkmllenoorplknygosXmurfqmnkrimkdspjqkkmqg^ktnooqjdfqrpsmo~mqgr]oknikolpoernrbpaomzsmnsnoylqnqmgjunopbptnjqjpdokjnqmyp`rwomnpgrlgejplokor~niemfp^unvlioiuroyronorqrpnwlmnskzppoqmpw]hoqmsngszldncgntntjplk}pooonmtmmuoxvlnqlmoiplmnokmntsnemlWllqssVmrmhnnlpnntkplnokmmvluroc{kmwz\mklrnolklbnwmnmkpeplnlolmvbljoZonmopoqsgnrnZmbootpplfUhlmol|n\npimpppplhplnumlomllolhmlqipnt]wlwlllgnjke[hppqmtmotpolpmjsi\jjrsnprijtnfnrmsmootrll`tqnvmtmosnToqtm}]ohrmtklmppdnkneuqpwvllatqllinln^qkloqnsoljooromsoqm|nanjtsnpsimiojzo~qpiljnnpwr{lk_rkjpX_oTjpmmjrbnulmposjswpoonjogsmrsmr}qsqtumpspemspqhlmg_Rxrmojlunqslokpsigpnmd{lklompizpn~gjrolc^lynmngruhxxtqpnmonsxqmkpijhn`tmmmorjksvrpgompqugpmomm`tjoogpoheoktirrgropokmniqtmnononojivtpvurbpjqpmqpusmtluspbfpfkspquxthojrsinmioqmmmplnkrljhpntqjljplpssrptrgqtvjqkulotlqoqhpnkhpnhkjinumepiarzrfkpqmwoqmnglnvinjgoplhofronnmylbmpkpldqgrninYxjnpprmsrnmslhltnmrljmnlkttlrtsnbmj_kkvkrmynststjkkqdeonohlmmlmldmjkokormxmhplmpmpklkrnTmsqnn]knpnilmomjmmmkjnoghoo_kjinnnnnhkonnojqpo[nk{m]Vj|jposqtfnguvnsllpmqp`xpVli_ojqnkmlomnivoacrquojkmootsqfelpqxjslnkcodojk_lmnnknonyfpokmrmcsp`phomhr{lhpu^njpmlq{oobwr^n[|cqejnqljep[mmiok`kqcpljlslajdkttjlwjqkkvnumrqpoompqdzfpshmrop|vcotnmsqqcinrpf_\jnmqpopzqdl^dioircwqrr}oklffsoqT|`copgsprjvortldpokwlrvmgnllqepnytqpnu]nqlpppnpmrfurjq|poijjsyaoXpkmie~isn`pnioshhkpqkldTpljmhrhYblnmhoopoqj|frj\ykjaltsjob{nkvaqsr;kq`npurpzlfnpdkqnurgmveokmrwn^Uoltuko|qsq\eyMxmjvgunhkjriOmtqqnmmv|tkiuoifjozlpmpfelo}prjh|uelrdq`ppj|niqgipqrijpivmfjnqjrzrpqd|tknbelncukitrksnwolthremqkjlintprnojifTmn|gewfks|zerwnsilpqlnklilrufvjqqzqinouxhrnlfkixhrtebupetpmhnXtsjoljohq{jcojfrlnlellgnifmljrsonpregerinmwkfiolsmhlllmlnqvpjolrdr{chwuiyjlrmkkwjkqmmsgjmcqinzqlomg`kwkmpscrfone^mtbviplhimqjfopnmogllreptsxb`nwqjmiuhzopjlpkftwsprjo\ptdnfvnkvlmcyqgoqhwmugyoiiexnhylYkvih^ksaikj{nmwni`acompsepomqhmmkpohoov[phloqmrpomojzrc_vjuepoikmqss}rhpptrlmqutunmgtnmdhkaoxqjiuppmgm_mzllivnrjrhlniYmvxpokdokyj`pzbhvkpcejlkdwyuji`rpludhJseZmmnkisopmxjnkZoqnpurpmnqmomnunplkntppohgfoonkSn]_okdopaouq]qmvqprmnlqprmynmqpobnltpunpmnkamaq}rnpjoSpkmlnnndltlscostknkpoelonmmfrmqojr_kbonymvqftiqlomvplppqnxamlmlmq||zoqkpoYdmqiomoikelublloopmmrjqlpnmlfobKre_mnsmpsqipqpnnmk^komqmtnqpokn}nkltnlpvqiwpXojonvbpnnrkolvjloprqsn^moouinclqonnslpmmvlToodvgpdlonpinqnmwnfigmmmkprvmghm]ckuioofnpnmg}phlyqnplojplnjhnnpvvol?rm}mojpbdkrp]nwqr{lmlqyqowmpohnvdlmoonnmnkljnnommlmmyp[ylamhofksllonnpkbbppngonqwqpsp]rkmwcrlhnpjkjrplmtpilopnplpVcsncorqk`ieilvrNrgsmkpnnmunpmkotongpkornxlmoo`sanlmjmtmknpis\jlkvt}jalbsrmkg}kpdnmpmlhlnhnnkhVgi~hhonormmryqMpilomm^sojmipqhrjnrqomSrjpnjdpsqqnhmonokinpiokvmymoopehnletpmvhsdnrnqrqf^eqgkl`ovoYn^lmqm~l|xspqmqmmmmjqqliyox^fkyrpegkfobnhnmmmojmmjri^oipwml|q|hmnptnrovrn]rlnq~untn\ooo{nllhnolnyjpnonsvlqnjoomnmkxqk_jjbj{znjiftzqrlzqn~qepqljnkco_\o{bknt[grqnnpqibk{p[|pmwuhlponlpoyqqvnjqjipknl}eknmin[nnnokqcl}kollfnosnsomnhfpqhlpvnoklojon}bnykrSlmimn{jokh`am^zwmlp`hlqNonumbwckvj~pvjrvpnnk{munmmkkqjntWoisklhooqgeprrumpplldjirpsnqbopmvnlnwhloholmntjlomlonomnionmnn{jvlnorvjp[kznknkoonuprkmolpllns{rpsitlWimlpjnll^lml[tnorq^fkkqjsmo]nmlo]tlpnkgjpqngndnlbllhmkvmmimhjvpnymjkmkojkkn__nnqlpmnhrnSkkgpYnq{lpkigvppiqpnikmngpjrnqmitkrjplmmfmqmmjnoposvo_llmtogypdoojoh^koimvxptrrguqqnnrqpjmlrjnjoqmllpqotfpngnlprrqolpomnCqkoltqvkjfpxngliqmbs[lmmqmnvoVng[sdnpbo]qlrmnjqtquxlqhswklpmnlnvdslksqsnllospnqn{pZqlmqhjqkm_mkpforelmmoooonhpvVpnrrjofyplllhn_zvq_mmnnfnlhfhkol{vlosionpiVq`ligmpnjkskfmflmhonymnojhfyoqkglpgzSmtpons]knreoqjnsjnno^qkn}sgkqknkinlns|m\promnlkvpps[rmpi|pfzrnjnzlnmso{qnupynqnmoqmnrvn\qpfjgxnporupmjvktdmolmyinjlpnmjdspqipVlqlp`\nio\o`rrWqqlyvVmmipnjkmqvmmmovlnomltnljrjrmlznsdmpoqujlemmqjvglihmlnk^_klrlmun{pmfehdblmxlpxkknslqnmodnko[qYqngmiolzjoknisbonimyklxwmnsspcskxorlriaruibwgloklrfoxclgqirqsojijeikfppsmktpsjkojrgimmolflitsnjxkhiqhsllcluopmnuqamoilsdmvohgr|kjrfkqnxkmldfzklxpoiammootmilpgoppnjlodmeloslqninhhqogq_fjdvjmhjirpwngprnhkrpmntmhkuqqfoonfikq|grlqlmrmgqjqldhklnojnqo{nxxgjhknjriqssjqlqgilollpqnlksrpliyrml{vommslonvnlqalqonehflpoki{aokscsxjqorrel`skvowochqppcilqpoukntqvfkvqvS{qnumkmpoulssZrjosxfyrtkgomsbggtqveimrfp{}mriopronolsnnznhojmknmvrorlmrhnpkjmljnprdkknlhkqsunpgnmplk`uxmgX`rrlncnsckl}qjfnnu`rj|lmsktdmepismpxtatlmgdwklowsmqswnomiztmeqoopgnhxnpsmklqlugnolnoijvnooyiromolpnmsmnmrpknrmuphqqmrlnrmmojqoofjjjpjmrjnsorqisqsknimrtjmwnpjqmqlqpoqnlpsipkirkjporrvjsqnmrniroololmjmlrktnmmotnlnpskrmfnum|rntomnjnpkkrnlhnsjmrijnkkmronkmmooqnonnqsmgmfknjoio}pmrrommonoolmqjinmjmollqjnsknqmnosvlnkmmnonmpgyrjmj|okhmhnlnsrkqSqulnoxonvcqpoqrjomqnlum^pofuj{o|ull_mqmumnnudnnroontpjnroqufSoploqknYmTyx|oqescmnpolqknrnmi|mjilpvlloqolloesjSnjobc_jlrkunioidknmpootkktfYomjksicxpnesqcmgcimYjormkhnllmnmmmqmogtnsopk\nwl~comqjlpmxlqllknknpslujppmgnrqmotmomvrcatilbqernnmjjqlm^kmmeosorpnknzllonnmunllmljiklnripnhnknrjumkntnkinbo_mqmkqocmvjkfvhi\yhnglsqonvo]ok]onnm|joolpjmkbvoo[ps^pmjnqxnmpwpkpo]pmohmjonymuorqjclnnlqrrjmkTmlnpsnl\Wlomlon|gklukolk[iksyyllnlxnnwpitipjppcuigmnvjkhkwopqmologjiorvfsmolionaqfmlnuvrsnlwsngmlsnibnqnnckjvummrn[wimsqlnjmymg{nopsrjrklrftodpnmnqoinrkpkrlbmej^nlfhtlfutlwgonqrnytgppkfndmnsmrooorlhiihiqhfivl^frlmnttchfrqyikf{vomnxrlulmjcpfjqlbsfpmrtihjnfc_rimonisdfkiohqohnvjqjsllkjnykoqqlmcnkqigtrnl|mujzujilsmjnmilxlwtqikkirlnksrvsmeulprmejfinhlkikjojjhxnlqoplmprl\ltipnmllkpqkiglqlhdjsigipkqibrokrmjnlfvvmmvimqoaiq|ktjgnffvslyzahapuikkxixsskejilnilhsgwlmfmrlpoibeqlujhsmq^npfljn|haiodmoojtijo_pxlhagelomoisrjjtqouwjoplvgjdqqnf_ipkkrkilpsrknqonzmjsvrlldgxtx\uv|njnclqnmqtummgZrjpivuoslm`fmtrfojnnmlqltsnjmkekitlklaolmo}nllmmmfoyk]igmrql|msjnnlljpkklgmaukvegkpqxnonmtmkuhgphrohjozqmlqfn`usoph{grouosilwhUeofsophiinnqnqntkqxsfofnegn}kwlqnmmonksojyphonmqconpviokdomsllhjnkioleilkjqimz`jofoirk]rkpnlgitaxoorrluismiio|emoihwlnenfnjtnnophsommkwmmwnqqfsimuloqmlpnolajihgVgjfmpjnpplprnpmpkrlohgefrmlglorkpklnqlsmlklknkloemc~nmSiimomqtrsuphoohmhkpkmewspqjoqpocnnksnsjmlhkkkmrloalmsjkgnirukiratlrglrrpihoknclnpvkjmgnhhqokqjmlqplrnmkoomoqrlquhptpmlojiopmgompmrjkchidofmsitrom^reikplkm{hodrrsnriodkknnnkhieiuqkiplilppplmlkmkswqrnphop`slincjpnicoqnjqnlnmonlirl_njupZopo[kyo]mokcjnfoqpknpmlvpeomzcqyxmhjkqnocl[mmsnlrrqglmljlmwiojtcquoiuqqwmlqqn|imhnlm{t|uoolqpPlkkpjnpptspoqvjplprqosvhoatsnpdlXjegplpjfhlklkopp_lrqqjuogkl}ghhqjiooqhmppipnqii{nmmybmnrkn`lp]\ennjp_rodpXlXnppoyqnnvnmkgoonkrlplinlokmlslmnomniknnqfkvoovij^niqkqrhnumfknirwmqlonlntYiiqlkvykqynhpkmbowoomnogr}uqrkqlmjynlklmlojjsvolol`otmmbrljoomWmcqYljfqlltnvwilph`lmmojmjpunojmfpuyzo~qorjnglqnlpmrVjrmpmunwllumrlm^ipplqriioippmnrmtlndhjprcn]mokvWlnohTlrqoqmcs{ipujawnoohrjfxknikzvnkqnetzlkkjjmrhqrpnmkhjcglpmfihlmhdjlhlrnosfpoeYnhquflohg\hvliamtjunrkfklp`khgiujhqdqpjlpqtsojhtsqlhgk\npmmhrohoquwnlolohnpm_gsxfkkwopikmrnnksunhkmpfivjl^kjshjol~theomdgdbqpkmtwukjhekjfltprq}rdoopciuhn}ph}mggl~olmfdkcolmyplgpymgu{huupunioqlesuilfpjupktvlonofoglnlrh`ejuroglnzppavgfokopsqwlmjrymfpspgmunpjvlproqsghjkohqwvm{vk|piaypymhtojmxmpgqolhqkkiuymikkslnjqjhpgurilzksqjncnsksalymngnklkpnglcjhjuhlmlounfqpppwdsrpiek}cffoikoqljkniislwoumlpq{uqkfhhmwqomjhrwkgqp_ndmnckgulxfpupkljgpf}gfxljln`qncuxovkcjipsilmqqphmepkipulqhpurotojrkm_{exrrhlaw]mepyxonuiuknkok_msXfop{cadurmmkoqozno]tehsvrkronlspvqeilmhq^wl{m^lvowklmjpwkjlhnotmpmomhmlkqgm]ojjqvipqkqrysvkuslkpoom[fckbvkjoossscjjrnbqlj_poos~hpgozrfwosbjnnq]mhlplmmoxknmvr^rmpaspbooektppphoolujnpmmwtnkmsulppqknbnqkrrmmogj`lqomrkfonlknnqnn`qiLhdomdosm`gdroxqrsmlnn\oxmyvjcozpmnornkMlqktvrowwarkpnumnevfrqrooopngrytptnqm_npqwkopzoo`nfpemqckpminqknjlc{nnjmjr_mrckdligppionpdsylslpqkkgelkgmmrpblntpHhmpnqoim{opqqllqjupkloqlkn|ntln^ldlptneop]lPlhvkklopse`nuonjq]eigiaxivnplskpymssipospiitmua{e{mmoorphcnkfoclwknqmllfusjgptmsqlnsslutomimqwbs{gihuruipvctkoojkjgqofopvmjqlqlmstrhopxj{krdotjsfqinqsynqcdkcjbjxordia|wppmnrnlnirsdpblqap|pklsmomollmbhkpqnswqtqtylofWilkkqpemkcr|ogtmkryghqkouinrillrjorepzf_rl^smzlteilsbgnlohodomkoljmirotluhlk^vggjwrdjjrkljmfjogpfmjrju\mjom`qqgpmjglq`wp^hhpjerchsiciqsserqksZvjfuehhphsggfsYlih\lqomhnaqekiqqijejsuqfrfnsjrvqo]qoomq}psjorkxsqupuohnqhtmhkq_maljtrnu{pmmulqqlnbopzcjpqmkugzimsfenoemtskplTtsamjmngenypfrrjwqfknprjpeobrrjjnzsimqmmozpml^inmtwsiosemcmmonlonkmj^pmdrnkswprtfmvovnnogoowqtnnnqpolotjpPrp[psrvjmrpnrtr}lofnnpngigmlijmmpntl|niFjl~mlgkkmhn]lmtnnnujrondmaoUmoxksmltmpqmnamknklop\ho\gpphqboclnmqkjoepomqltnq}jkik|hieihmrwnlusouqymvmsrjn`kqn}|mnjrnamqyuimmssvuollsfrsolnlammmgplp_npoqgjmnYvnoeekklorgkjhknpokoinpenzjnhsn`l^nlkrgnwrckmpmpnoolrehsu{lhhmgrmlypolqqnsoyjljnmwm_qojmnocQgjtoonponmzekslkm[u^lnqoulgureolmqiyolpobijqprmkmislVxsio~lfs_oqmikrsgfmmnw`mp[ohrnslwq^mpkblkpmolmynlopoxmqkmmmptrkyqjlnoumpjqm[pqp[ng{hqqqmkokjdguwllth_ggjlkmpllvncgjs{pqprojchfxYpbmkmmjimcpaklkdhmufnihkhnqfmknkukmfgZn`i|ktl]hqengzfcbhYSmpftifqamhmco_kRnlrlkmkb~mveupqhekiyojlbhp}fdboumdwymniijphlknjhktljnjmfnms\eiotjoecjhnkWtoqpqigokk`olf~ytpoptvhjqjmozttdkknrmsilmoromhlklndiZjWlfjPriirwrwlqsdqkpn_ollioonjnqilf`kdqkbfumnojkVerZps[lunqjkkgpnrknmmoklklonknjmapgmeksjnmhpnomgmohxkifxfxrqpcomjqqjrlumgujmh`pommrmlfjnnlpknlltahaflslnnotkqpprnlilpsxjhnkbm{crndkvjnkkzphtlfue{rrpijongimomommgsloihxnjprnpenpupnjuljjgmnmkufpkajkhomhllousp~ojw}jjkd|kfrrmpxxmp{jzolnkmhmrlirgtyw}onpiviiypfnmcjhlpjppn|nspnmknnojjbnrvtofoxrkpjton~dqqmnvxcqnow|wlcuptqmnnqcznjmtkylppktjspooqksmujrpoqlrlnqnnl{nilhsttmknspmjkdoirpnpjnnokposkmspmlfintolfonnqonfoljannopmjkrsoropqopqo{orns~kwuknonlhpqokwlvpklilstmuulriurojlgqkgidjhfipipugohovtnshigifkjkbtekpmfh]qpmhlnmtnrj^Znknforqlsntikugmscjorkungapqirnrksimcnhnmrghouprmnlcokrhbinstalnouigipplokklkinemogytmxmfoqw~mejplqgmsulf_qamw`rslwninfkphlkjnyy`djmnhix{nkgslxurosk^nqkrmpnfmpmpqqnpnojjqnrup~mjikrwsgkntz|olgralfnxqonmrmlpkrkkpqlnvjpmjqosltgbpithmk|mkptoqkrmnmlfiutnpqnamxrjloujlmkhriombimskkms{o[jjolqkpmqqmytqlzbn\ghpppqcnpekmkrjktkxqkkjlziktbkiomllpjnfv^liellor]j]pvjkkmiZfmwlkyolrp\jonponmoXlqrlqnrtnonggltqc|jqlpnomyswhehlmhklxlrjorkinqjchocprqnmuognuqplphlnnlqkonmytqrnpifkmmtorn{|nksllxmcqfrijo^VklcmtkqfprjjponikpXnqimsiqnhpZqqisknfxpeoocnnmk}mhifptkhnnoklmfamntr`\ktfqinYpbjrkgtsroggmrhqdilggqmgkqlihjhsWZjfjocnbonojonlljjc}jknpalfoiksnilslnkrkompwiuwnlkbconn\qlwmrqjwmqnmZ^qqreolp`rikm_koVnrvoopilrri`rolqpxmarhrglqnondkjm`shssrrk{riunoknwn^nnkljpkglqflnrrs{ocljrpkrmnoqinsrnmimpiksihlkqjpooqlloollx}oohptyrknobiiknrrkmkfmndhvokmo[pls_jlpewmlnpllkpmqlvnlrqrprwmqomrzbpngkmfhsjnmnlkimlniwkmowmljjprnrgj`nlsnlmoj`qnfmlnirspelpxcowhlroftkhkqwojjokmopjlplkknnpltoenygxkrtlqmorhX[uosjmpcloujmomcqgtkgXjwWovklzonlz\rrlkbpimogqkrvjpq~sbikleirmjveppnljvurmf}oddmruyqnqrbsyhrc}jpoorrldoztvlptqlonslo}ljpqsmqnabghlpn[gjlypovdqoirnnljefcnnopl`lgciouupgnddlmhdnpqxgqeqrl`\n_lvuomokvejeqityomcjvrsrmnmqoXkktgyglxfyifnkvnnoijrnnnpi`qlWgk^ukroiZmtsdjgqnmmnlspxw^jgmvumiqttljsfgrosnnqucljorrulhjpqkmzuumpttn_mlnmrbtsvojohoj\qgnopytcymjphpsmdprfinjtotrklqulimqoimolqjvwmtiesojhjdineoolxqghknnklopwmwjnhn^jilrpjollcmlqsoudn_micqqpondrijzutkexvjomtlwqtlmsnwpmoinpkprwgjmosqehsoaqnprnq[nppjpnpnmpnoprtoramnmndmlolmrppoquvliiqr\Yqy[mdpXldjnrnlwnolokmjmgtis^l}eXomgnoprmnoBjovpqjrpskppnljxrhm~oipnlrk~kmpvkvnommhlvvdqmrkqntokeklnoqonnemr|mjipnnjn~lyqjTmn`upomnpir}lpVlpsqhrnpdllqo_ltjrqmfYpnwllfsenqonmoptnlnwyysqumjpM`gnokrbqoep\mrjjjqloealk`lkpnmpmflUgokhrhmpnrlqlXsmjihlrnpigljrsfnkqonpnmdnmnllhlnlznkknfnlpnihplofnmijmmryoigdniillmibmeuc{rmjdmklqhohbjljjqnoqogonplmtqwnpjqkpx_nj`mp_qjoipnlkiqrzgluqljqmgopjpoojnjjjkmomnlfltonoydlokp}rmonrkqerd{tknkidahpndqrmplsrjkmrolghrtqoopqmbndmndmlooHupnlxoqntlonimmlporomimjvnnpoolpmonDynrorxkl\orem|pvmloorn`qxknonlopldOodelzhSdlinlnpnSnaohanpkrlmplomlhjropvmbllmmonflommtmnslomff`kllplrhpoqoklsmhrlkms^nlqlqmjvkm|gnankizkqonsofloq{qnpnulnnclplmossg~hjnhrnqlkkolmoopqlrepmnl}yuoonlp[ijllrrpjzn`poxpdkptrokrykjoognnhqunhojowgsqknqknmcjnfinl}ifnjjlhmliwzwnipp`ohfdxiohkmdm{pkqogmrfhnmgbophlgsanonlywnolda~xprcopgrtdlpasuqkrjkjmnihsp^mqmhtnnflmorsondomkwfllpoqtrnxkinoenjognnmkhnmtpllkn~ksrgkmmjiperoxqmivsmrjommeiiwfnrnqnw]kootuntlnjtanjkkarrmorrnaqusqkrndznnrqsonusnnroonqemqprrmqlkqkmpoqmpsSpfkf\mnRqeopzvVmijtnnypjonnrnoell~kuxr^qPrnlrpjmbryn{pjrqqNqvomlmozubpsqoHmnepqslpk\nnnmanknt{Uulqk\pvonbnnktrsqhkos}nkoqkppyqqefnemziymimqxtemouinompmrlppnbqowrrkenknnjn~nklkotkotsjknTirlp|lnkmTxijlh`xoomsomrpnQplqmwkmmvnnokkrnp[ynnxoqbqmlkmqqooqnliarnslgwrznvpsnrmcmmlfmntknppmqjji_plVl_pcmlmporlblcrknlohphnolln]yuoptkm[iobotuqonsmlmkunpmjyrpjoro_oq`oplgrrtirlxrrulmhr`celdrnnk~enoxonpsu{lsycnutgwouqjopomhjrm^jreqpslniojnhomims{lnn}hukn`nrpmjnlpn{brvl^soqienuilxnnyqlxjeqmscjoofmnmpcmdoskuk|mnmpvetoholitquhnphmprq|jthukhpzlppnpnotp}umhttnimkpulTsquqrkpooptxltlrfkoxqlxrodvjjplkkfnrlgmngoqrinknmqmqisrepqdqnljqqohprrklnkgkotqllkkpkwnggggomokhqqtvommmonfvenvomnpdlki|upxkptsoolkklpnxvfgmfbkonrptmtkelisrepphcnklnkxhuotowqiuiwn^fyblolpipkmjtjnloybmcepiykikjooolllatnrjmqqmtqfoupqkllmtpumjqpmo`unmxpgijtoruoaqmllkdqr}lfps|tuhrmvnpjwknn|qspa{qfhorsoflpmq`mturfkn]knmthhmtgiyxcrnmrjqimnipnoiikpnoojnirmfyqjtjtqhgemktlqrnaqehjrtiqkhdrnkilp_kylxpjkmotlmjotfbmlmhjnbihkqjhquknorqfcvp]tuqokDosjcyokxm^`neovxqjcps\o|gniopWobbrzkgpan`kptnuoptelspdcgjo`inpkbiWfsqUonjjnehsjmhhdH{bwpirokmjgkqsklbYpnoomqk|efdirbmmovroxdpsckgguiZhphmfblvvdqmpndmzmmptmhgo^mpoimehWwgntUnqg\zlqonmntqnkmr}wonmfpppxnqsstpiulqomsvpk^lhaonjenPmwmuokpkoljhzjorkntsqpqpqcrnmlooospjuiu}ujll`sugpmmpioscmfrpouookoipiglinflkgkctkkqllpqpp~okhbjom{ggmxhunpisqbbrkppoqboqomlmlwknqiiqdnghlolokindptunqr`tqgbqbr\lmspknnrjjawntiljl^kipmjakqjljonrpoqbo}rmnlhliXso_noqloxstiimloupmywqkj`mqdsqflrjnusgtvnohnsopnsmfnpn^mqmksmiold`smvmkmgwikmonmkkmpmnqxchwcnjqkmnpnvgijnoTuohmiodngonojimymkeqohrhhqfktrvhphhujnjmmwkhhngdjn_fjtgiwrjgiopnrmeqzrtkzhoillpnsighnlomosjypnfumduupmsonlniqqohuimgrngkdmnmmtwnvjxbkmloogrylpmoswyqchhZhmlvlteyobeyptmrfincqkmtbilqkijkksljpfmtnmmkmjvpwqjfjorlekkl`nlhhqnqgt~glmhnhnpopjsg]quhkpmmhov`qlpkijdjlrtnqfojnsipokt]ojskjooqokrpjhuohgftoqpsmbknoeeojm]h~xlrpmflqjlllhmirkghtppqamrtjpjrpipowlqrusjnZocomllfcpnqxt{~cgejmkqommvgpmyplhkqhntpjflsksmurflionhprhkmjmep]tznroogkkql_qpemionhnhqhehmtrhlllrsmq_pkjnlqqieqpmdinnion_nnmloqnnz`lxnjlqmnlkoozekjlhfkpfoqsoyo}qopaonrmsnlklpotlYqqldpnpe|orjojpmotqlilpskanrnlnkogckpl`lsZopcpz{oqocntkowolk_kunlwnaj{no~ommkqioqnntljqkvpmboqmgmhol^eiotlsoxukn]slpqjZlmvnjcmwjkjKploiooqnioqplmmonigopmejrpn|jvmopfomjih\sn|khlrklrkidpjm}pmnzmmndolorckom]`kmlmmlnsrmlnsmpnkdoifopnXj{opppqopxkklronmmmkihmuir}\ijglosmoemlsppnim{jrrmrppqyrnlwnshokZsxgmmnbl|lnynkrMrjl]msqkqkqqnpsslqlnkm]lornmpvjhpijnpoxu`nnloopenquSnkniylllmtnpgnnvmnUrfpknuompkvnhlnppn]pnlgwYntkjwnmTpnoppmEqpynkpan`qooeemomumnJh`p`n{ssrfcvpzkrduqWZpnodmmgrblnekxdmfvncpfnblQsmqrbmccunsompjpnhkolkknsWlncnogkyprw`qqpgXyrqcqRonnoraohkjjnhqqr`ruqePrloenq|rsw~oiPujosnmhklon{jqvgkklqkp`mrrrkepjqabmhdsoh^kqmmpgnohO_mwmqlojujnbiPujsm^i~tyqsxeTfmqqnuklofimopdpoutlpdi{o_lmlqkmeliudgeuorfnlpmgokj_rbxvrux_hnzoqitqxpfqn|lnsmbwnlhi~jpwqrewkpgjnpqsopYppmnkjthwv}nsoyqlnldpunmvjjmjinlmsudpmhlqeilt_`qkpxmkpfqlnrnpnbmnrVsokquabosyivhipdnhqmmkmmo`lslqk`jjijlkfmqsi\nromlmikkjnrkqlnoyqta]lrrqlqnslojekomiqqmbopjqjhjsitolhoplnhmckpjqglfmlmd`exudvrqxk_psmqpqsmijgkx|zsoisjqflsomsokojlfpkwnrplgjmnnwzygnegjjrnjurmlkdwjlqjwdx\vqbgjkzplmqrfjodagrqtwqoggmgfojoltnontunuzk_ignosuilejqhbohqkgfjlpfpgrmuYdrhxpgmmilrtmmomidjbhmxpprhmltekiouofpkevqqk^pwsjneo|mninilosonjrjomlmrr`mnkkmgwsmq^tn^ojllrujnodolmmljmqlqllcinmohhhoijrokkxmlqlk^ng~eyotm{mernoqncnnrhnmlnqnllwaixu{t|[yiolmqldpkseqnqnleqqqoqvowtkkrhmmfronmjokotnplmkjjnj\yllxmroZmowminpsnmnhqlonknmghnhmokbrmlpusnaslqnlnoopnnnlamq}qlblxpoijpinqrqmlkookjrmloxsnqchhmuqn]oofePjqqltsnkqrpnwqjknrqelixiotsemoujoomjuo}mlrosumnuhoqolpzkkfzgpmnmxhorqmpikdstovstitrspqntkkppsoylotqocpimbhxo`kmnfgksucsrqkpsutouqpjrrpnrqrnpdrkgnixokmnrmqmmrxtssklmtyftokqtylqioznnmnersmylpppjiwjmzZow{qqnornsnsrypl_hvthqbommy_gpk`oemokf{timlzqpqvhqqourqgooqmqstrpunhyjpuoq|llX{hmntmkdryrhhqqpptmqbnqi{otniiqlaniolraotsjqeml`nymuneqiqpikfteftmlocjpmZps{reyowmuuconfere{mgirgmoivsofitqolsqijpoj\qgsvrlmoslqmtoq^mrzldmmn|inqpjlqoxklnrtqngupbimjigpskorjmlyrkgoonuu|jisu\pnvmj{muhzxykxfjxtoxpjgi}lijghjsmgibkfezqknhl}mslormjmtkhelpcwmjvnqpsshopmpokntrsskk]xkjowkqrqhpmjkhmppwkmjlinlcrthsqrhpognqgprsszmmjmYmpfle~mvhsnlooyookqrmkjlnqjqglplgroqlnlploknnWkoryjrmqqnjtpmljeptglgkqkt|nhkiolskoporvnvpjcqkkmkppiijrpnjtqgmplrychwhprvojnnuomfhokorqjbmgtjngdpmn}mpplqjpripjermnnmpofngrf`sgnllknpkpsrgpkqifjgprldlmnnxli{m2qnhoogofepnpkonbklegjlmqsnogjknijlll_rootnctnrfrmftkpaicqnnujmcuupum[rzklonbxpyookjrkjjkpspikakl_npioiln|lkl`rtroquoqrrakpxcslZvpnolejoposvocsqlgrknsjhpjtriss[[qjbjmdqpjrlxlrgaoMkcglqulgk`ieenoVnnnnsnLnnohmlnitbnqq^vlsho_}ounqnnqYlnpvwotlpvjmilcnjmnqkgimnoo~smlotqp[mkp~nppWknaomoojponcow^ktOrmuxpptomtinnkUr\qrmtoOwsohonnosmtkPrwuml]nfnqrlqwomvrlka`frnejsqXnlfmomrnmupjqv]mllmnpx}o|foqmgxrudoolkl[isrrnojslmofrmqpisek_hlmprhknujhojmkojmjrmmunfhu^k^nmhnuinptkuosotpmlklnTkhpnnpqr`vmonnqnppfnnt_l}korpnpkpoooyokrnnRjx`fdrvmritmpqcnnomlqxnbghgbniff|vflqplrzkr~wnlilkqmpnilltxtjsqrd\oogomYotoknnvmkrgpmQalnnp_parmvqrnjpovljqbdhjmkmlsnvopprlz}ryklsod|pukpoonhpmllllqmlpwoqzhkjfonknrptnhooknoapmni^ltroeppqbqksunbppop|nknllojemjntonl_mtkionmqnsnosllmoqjnmnspnltunjqnmreoptgqejqnqkdrofm|jmnlnmtngrmxigknuwnqoopnirmem|nnokljlpknpmmgrsomkpqjlmppklmorqnnkogomolnimncpjq~lksknlkotqpoq]wnnloolkkqoojlclltynnmmnptmjmwioonikmommoolkjxmdspqgjoonmqrdolnplknroomZiholgmfoop{{nlpqomlnkuhnjkupollsmonaosnqepkoonoplnpmnlpmkorhuhmbqntkemuimkkmmkqmpkoqq_jtrhnrkonmjmmolmmtonpjbqojimohrnlhnomrdnmhfsvmttllhnrinrnnqopmmfiocljonprjfnnrooomskvjqpjokpgoltppnmokospjmmmlmtk^llprrknhqojkrnlthljopnllocmphopsrnpkngogjqriosmtnkpprfmphrtrnnqulmjsrrkrmmitsmorjstqgurnpwjlqrmmnpkpuntdqomlmnnqpkjkomnlogorrlkkyrri`nrsgmhlsnorqqnopqoienhjpmepkqjxrpjinogliTmykmsksimnmsoplipsigmopmkdlxsmpobkwonpmluipmtokjbnynpbpootpoppml^eomsoomopqppptsn~ifuqpqnvpindtlmnrtonqliqlplrivpkngsmonlrleokjopjmnmnpslmslzkpponhnqqpnapnimmknq`_nrqtjuorfnlkgtqpPLqomoovonq{sphkssmkmindqupkipviom_p^kkmlvroohnkjnppnolqjkormlmnl\izm_ojkhnqokmc|itklsOphxplnxusolilknlqkdtpimufnemqloommqrlYlnkqshmnoxngnojuq`rqplvnmolmmq|rpoenikbrplqplfnqmqvosoglwmnorlnkplllnp|qorpnarkjolssjknrfgkrojnaip^qplimjpliklqobloquklnkuoplilplimhhkjnjnskhnkqlqarklpkfkojjgnuwnforoipnqnwmonlrnnimiqmmnnqlvopnqpjsnnmvseoqnlmnpljqjjgbmnjqpkrrhsmnmonomrqokollmksmoptknpopnfiikrnmmclgo}ofrhjenu|sitmpmqfnrrqpaiqmqdqmlnotkxropnuujmcsqhtimnkkimlpqoomjlojhpmknvloofqlinikllkljnnjkqjiljnsjgjjltijhltmuulkqoebnaomhpnrnvoavjty{nrllinplnilgooppninioinupnlsnivqqlmkmqiltpmxorlramostsqndiqrimj{nijlwqZufrhplhtqoihrqllkngkfsmjnkrntgonipmvmhidbqorefioilutrklifmxhdmqkkmikmcikqlgqgonmvklnijeohoalnmslppjdq`mrqoqmrnhlnikppmjlkvqksodnmoipimmiiemlhqelvnnnnsjnsrosrmoppgnmonpmmopflnypjqnomoonponkpcmspnoskjotinjp}nrikjoijlnnnmnlvmlnrllio~qmqeoonoodowjarkkulnkpoplqoymoiomnpjpn{k`fpkquornnpnppvjhmnblgpnmmlpnnnnsokk~}oomprnjionwiqpo\prixqmkn_jjkXioppkopjinlkhl|dl~slvqpkomlpgolmnlnmpnno}cdiomogppwnpmmnrjmlmjtlktsrsnlrinmuirlrmppsmuqmjjldqirrokqpspenmerjknujnprrjmplvnnmgrkommpnmmwqmlsnqplooknorqqkqlpkpqkhpjmklmlvmqompjmsrloummbjpirtllpkslrolmlpqjogimkynntrwmmmpwp{kjomkpnonnntkoqqnptinoysukrpsjkprnijormlomoujjwomnvphznslpmqwsplqpgsniosjmoskrjonqnqqntqrstprjunilkhhnoontlnnpulmiWipklknrqsqknjdqiomnonnlinmloionkqog_kxzlfonnnkapnetmomqhmmrotnnhqklnohqgnoonrbqglfpmnoplmoqqmknvnilkfmrrkmtmhjmmqsommmppllqpxuolmrpgoqskooosomnnmmomnqupq|sknymqbonmwlnlnlqvekohumoo|rmomkknmjqnqxmkqulnfnrfldomlnskkionmjmcsnfkklnunblmrhxonqluokmmnmnemnpipmngpunglokopxpniopYonnkqnprms{gmpplvivrqqznioonloqpp_jmknpqonumwvnqmovnomnwkkoolql]qnqkopogqsjnojnsnrprknismmepjtmnmrnmmmpknnrpinnvmmmrrmermorqnjmjqinomoplhklqrplkprkskgmnlss]iuhunrowhoouootorpmn`trlrmmlnpojfnkoooormmlnqqnnmsmelnilansnlorosrosqggeqnmllgksimqloppmiljplnnkmplogkgopnpklopjrolrkkignmjnvtnolpmmotsqokolofpjoppotoluolqoleornpmirmorrlpcsnlhnptrnhpoiknmqimoookcmcoomohrniqppmlkomsqtpmqliijljpjnlopqeuhnojnklminqmoqplmpkoomopnqjhoqnwkjpbpmnrqmjrnnfrjjkrptjnppinnmoiswpnnsmprskkonzlnssplpxqoqqiarffopdorikitmlpk~mnmokmboftmflqsutkpwpqrorolologmbilnoouqeno}snqonitismdtmpxommmrnh}pqvrvcjpmprresmqqj}nhoullktukhmtplmhpOeinokilmwhkqmnonrrjwoqrg{rtlcjbtiophmohppniomoo}knlrpkm_nqsnruskolrlnsoshXhjmh{hprcpoikpmrprqpmowjmipjrslloocmmnwpotkqeqovqnp{nmjkknmkrmnrhloljmmjomotqkhlnhiqrnonokosgnoqsihqptoossl`jnnumllqoonomnmmlnomoj|olqlfxopmkpkonmhp_mvjjlrjjkkolntnrmkmjimoflouqpfnnknopokgomqlolnnporjpnoxmpopnklkloumknnnmmfppoyjpqqupltppmronfciykprlovnqlopsofextpwssnonurqmljoeommmmpspluqnlgrliprpkopopmhspqlnrkljindonisqonlunpomkklqmurptqnonlllqjonlmxrprqmklhqojtjnr|qnmmhnissoppsnnulnlmmrnkdprpsigooiqlrmqrlljmrnsmmnhohhkqqfoqbmnpmndnmqnlmprpmkqjhrtoqnsoslpkojnljivlllnqqisgkocpdn|invoojhlkqlppksgjnuhqqmznnhomukoiblp_ynkinnllglspjmkulmhoijpanhkknjnplwtmlpowmiqqmpljkllkq~lophdippmiopepbptkmlljlkjn^{cnhilpwkoldfinrkkjhmntlojrnlnkpmluvogpjmrloomsksnnkngkoombphlhkm`rsjqmq^mlinoktq[qgaannqljmfskominknmopmpnnZoenliplkqngnnkmvmmocpmspllpikojmrphkonilmfniqmnqijnkqlsmhthjrgugmonrmmo^efqsmplmnilanrfjummellspsjeoqnhnklnisnnkomXlrlmnnrivgjiomrl{mimncjlkdslpqikpooqkkonjhnqtkkolseomnnlcnhpmglqknosiqnivptnvlsikpnpiomgplqnklqghqsrojrlkqqoohipliolonomo^jiqqqlpgnkojjcnhmpdljhnmtokpjqqolokjhjjmumhnlkoymllmqlppspyofrooppnonjoltmrplqhklonmqhpjovjpnfkrmljmnlltrnpodtmnnqpiosmjnljmhmqomplnlpmrolmcnmmmjnlprkilgknnflmpnmnnqjslnlquihimnpjhqntqmqunooxhm`nhnlooonsojlmjcjnb_kovrknmqplljjkpmllqqqnrlmoptokkqinbmmjorhmqopqyknqolnsnooomfk`mlennnkknrmom\mlpokpmtnmqnmimbphmooomneqnkjimpnqolmlmoknsoijlskmjlommpmouojqomnnvnjnyryoppldkpomhmmookvnpnhhimnkpgqspljknlumnmqojlotmmmmirknrlnornlkmwzljqlnorinqiokpdmlmrrmtnllnqkmoumykpkhkeoUhqmpoolocpjoiomllogomnrgqpeqnjpjogkonkoljoqmrogklsommicaplnktlxmoslmnlnskpnpncltorrllhqnrllsmnmopqmnjiwropknsmfwmoropjnqrie_jrooootmsvmunlolookwomnfuhtoxqdlmdqvqosppmlnnktoovonppshsimnsjgmwpndnbqnmppppsioognjnnnluo{pncsq}mjwmqgtmelohmsmtjmpkknjmf`gnpmmqtsnjpoimnmlpujohpqnpppnethn^evhnpioslnlpoppjnukqmrlojihrnloqnslmnkfnkWobpmmnknjkqjn}_hokqknrnqmmionhnnrrdo}ooqssslqkllqpmonmpkpnpimqrksspmqslmejnpr{hpvpquropsqosdaimmrimlmplkomkpoirnolklprpirmotokplljlppqltnohlksnfijosjpmqrkiqlooojommplkninvsnnlojoolqmqrnmpklsnknpmmntjohqplpiprjpuunhprnsomhommpnfolllllrqromqomrmmsttmvpnjmnrlrmmkkrkliiprloqmjmroolkmprloompkmpplpjoqooiookpqlspinmlzqotfemnnipplmhhnonklronilrlrilsmohlpppllntllqprinngtjmrugjpoflkjqzhnppnkijkpjlf^ojmkomprsvnpjpvhotnqskloipxopplsnorgrvjolqmoehomrrlijsnoprsomulntbtmokjomlloivnrumxokkmkklfbmgkvuoelcjpqomqkninrwmfgrwpkg\nlilgljinkhoojklxljsnoqnilaromwtipldnnjolssw^vozpjpnnqqnpk`vvtorqukfprlibopfokjmrlopkprlnnspovnqrlnlmnmtimopdonm]onlqqmlnnmjmvfobnknppjsnolellmrnqnmlnqrqlounmnrmnolmolmmknqldtphmkoq^lmopoplmkpjodimonqsmpomqllvtmnmomklnqorjnpmjnoqpslmmenphonpjkamploknmplrsnlehmooporsilmionwojpxlxrmmoonnkcpnmnploqtmmnnpnwoodhmkonrpntqrnnmommommkntwprnpojmmvpqmlmlnqmkoplnmjoqnqrmooxknotkjpzmkinjnnnmnleojmkskklsnoojlkipvjjdomvqmlsnolurqmppprplpkqmnnnnqmokponmqanjkbjjholoohopsmrjkmphpqiouppnklpnalojlrmmlpqsspkljlrnmrhnktpwmmklyfuumrjooklolnmotlnqis}psnkkmljnnjlvkonnhnsnwqouuonqkjpdmjqmqljkuomfofjlmnlmliponqwoportcnopmhmsnmgj}{meoteululpoojrlwkufnmlnloinlnpjjogjolrilp{ipttpxrg|prlnmtnlqqcrxnpuomnuonkiodqqcpjugepnchlqrqkhmkepplgadm{{mkliklqjnnstnlkrplrqznmnotdmfeopjjupvjmoyl~j}rgfkmooopkfpkjkqtisgqdgsqolplnimlpnnjgmrhompqrsonqkjnmnj~gqlpiorkbmmhpslnwqlqhlmngnkkolkjllmjonokmom|bqnom`msyopgqkujjktrrksklojpmlnpqjvpnhqnhsnomglomntrpnlmmqjnnnuiknpnktmttoorjjsrrqnoqpxpqklfinoqoynhooqpjwmmpsfkvrukuqnpnpgnsnvrlgvkkvjospolkswqkksjrj~mbrjlrgtqumsolllmolguhlkwponnrqkuokqfskpokjmid{ih}nhhtfplksvxtojwl|qlojwlqmuqmkirmjrsoqkprmnkjklnqtrokilwtpkkikrgiosoogpnqjjpmsngrlklphqwvnrmnrijrjkmkilmkmljmmmkrnptljklriqitiosooqslmmromqmo}mgqmplqsp}jnshjognulnm[lonopfmphnoqriopoiimtnnoqpnnooinnggormlkflhwmpmgkpnmnqqnierpfmpmlcmqpnoponmiqslcjijhfnnpnqsloppnrlnlvpqnnsmvosijnojqognmmolqtnmrjkqootklnorllriolotmqlnqhnrvlmkmumlmutipyxnppmokksnhlonhphlllphzoofmmownpmfom[hnlnpolljnr`llnln`uyorrmomnvkrqdsmntnojnltkooqksqw{lpnmndsdjnirnodimnrklunqnoummmroksonmhqmsmonXspnmooofmao_kjwnsjaogqmnpoajl^ppqncllnmknolmmfjinqntkqpnpkn]ocnlokknnpkifmqlqnommkoqmlpqkrnljnkkmolntloilqmpptoopilpsopjlnjjpqmmmnpjimnpilizjkoqhoslrlirmnqkhlmkqrnmqlkoipujmnqndfrumpmqmnmop~p\woomlhllnojookloukiosrmmmmrhnlrppjkpokniwfvnnrkknirpuknonpnqqkn`ulmpososqin~fnoonqlooonrsosnl{inqmiknpmnrlohqenslpnklillovpnnmpmrmnhnmliklmqjnnppmjuormnwpmdmkrpfukopjimmpmmsgnppgnslrklnoqmitminmomippmglnkgoiikilksgpspmqmmoomdprqjtntqnmmovomlnpjkskspqlpenkmvlrkunwmhlqhkpkntgfoorpqkoknmdmhoqmiogmlsnplnkmppnnoimprujsqhoiltkkmqljpplqmqnlmfrmmkgmovpnqngokkjqgmlmmjmsnljnlosmlkosekpklmrommrtrmmqnnijsqjsnposgobppnpmhojspqjcnhpniunigjoeblrie[opnjopmqpreqi\lleoiotgjxmnspoipikkcqplknhoopomontnskinihprgnlopapulsomnrkknnoikhtfpbzgprlrphvnmoqkgqspsqatlfpgnoqTdnriymorogjkxhngqkqdneitjlnrq{llmmocknkgrypufosmwjrqmomfvhtqqqlmhmwmrysumpjgsgpildmupognkllgoomkqjqkpltrqtitmk^mqnn_oVjbgmnoncglkmqjoqoommnnomkmnnnwmnknpllnmplpovnmdnonmjZunYmip}nrnennmplnpnspnxkriopskrmh`mlnnnkmsnmo{tmnnlrolmoqomuoopooqmoooxkpjlplamsimmmmm}hyonmnukxonomookqmprnmsoioorniospeoomocrjltomjnljooysplmtcomkjopqpnichcrlqllqnnmmsnnmopnolomolnnnoknplnnibonsjonnsnirkvlpqholspjhheeqfpnnqspoolmpoglmtomlqllnwlprkliinqpsrjnlnomouorotoinlsjlohnlnsomirmlmkkkgmqfnnomqvpgnkniqkknvmnqopmkronppognslepkmoglphoujskpoitmmoqgontpnlkiovhlsrsorijhkoqlprjqrlkzoqmehmjpmiqjnmmjumtninsqupljnlqllnutimshmzlsfnioorpqoofkliqslqnlshpqnonmhmqqv`}npkiypiouolrmroohehopmopmtmtpiqdurmptntlqespnqZqidnmkmm[hjrnqilomhhgqpiufjppklmmlmqjVjyjcntrpnjywsorlspqspmojsllmmpsropopqwkepimgeipofmponqkdepghvjo]jphhmuqqmmsvnlpmhrmq{rrmmnemjlibphrlsgoxoppjwrkkwmq_jpkvpeomonskmmpqhmr|mnnhnlutovtkrkplrona{konjlpekip`votkoinbfuljpmpn{njpophnwnlomorpnvvtpdoqpo\swuljolliotqonmqfnjkoujijmqishulpvkplsjkkktbmypqivhkvmjpjslklnlqrolshfkljolkwjdmckmljslklsootmlnopjnnmnimtkcnap{m{qnjsicesmnokonwmjmpm\kzm}hljknrqqtivnkwg\mroohomigoomgltrkmgtmjlmrloloqniloqplsopolmqotqmnkbltqfmpltioomvlmllkvnsknnjjloipnkryohiqnzittjooqotivoppjnmchlptnrqkumtiolmpommhlqjmrk}jplpsklijnwxmolqnikqskigxjpppojrojeumupsmhpnppjhqowkommrronnmlppaptqrkomhpgiltworpskfihlpkknmqkorqnnjknkgnmkknvlynjunnnjuirnklkmptkmeopokooopyrlpkgnspomloliprmqlolmlskpoomjknhkorumgoioqiptjckcnsjgirrstmflvgnogueljrkkqsol{ebfomakfskijknopcnp~ihrtgffelpmjlrgiijqlp~morolepdcnymtjuimnt^pgntkrtnonlqlpliojvuopncloifqdpoqmppoknqobpemimrjggnkqrdu}tfjljrkqefvplrlmeoamqjrllprrnlqtkkrfnfmiqjlgi_kipzrwqkqjpjrsnnqpjoqqnkxipqnkqjfpekqkjsoaqfokujlxopkqxifrklqknnlonjmjnspgtmpmmoiumolhiknpnqlvqqrloepinkjfqmwliolnornenimmuommkmmnjngjoopppqfqlorqrriqmjsotlnkvmjq_oizmkqmmjqmunhsnmsqoqqovojmsolpolnjonpsikneklpshmmjopjknhmahgnmqnonlllqdnkkkjpmncrppmqo{otwnqskponmikfnoklnlkqrkl`pimnkkjnnnmsmmhljolqmyqtrrapqkgwiopqltm{uhnm{simqolnflidllmjulnjkinmvlrjokqowqrgskynrnphrvmqlejjrmhovonppvlhjhlmnnntokhknkogmnpjglisvokmgouplyjodhlnljmsmpllsxskmvonqqm{nmkoolpgnvmqnqmplnmmkmoojppknoomjmwnkhtkmujnpon_opmqjgnnnpomsnpmmojpotgtnmukymijmpntlnmnsnmoqkmlllmmqqnjmuouthnngrowkljhmqklmsrnpprerropnponkpelypnknoinrqrksjxbujlqkvosrmgmlolvnnnjukspmjplqrjflkhpklwlornuodaqxswcisooopglhoolkqmkihthmokpjegmnupjlrjomorokqijooolhnnjpkgntlohnqjkhqntmnivyilbvjqjdnrklcrqhrojokon_nqjoj{iyorozptomprkqto}sstqpnenmgejlnisktmwunmlommknlrkknrlnormmfgmmrkpgommeqorolonehnkmkmnoomhnshrmnqpqmjgbnrqnmnnompipminnormqmsmtormpsmpkplnhmlolkkefgpmnjponhnvurqnnonqhoilknnqmpnlgponthlpiimghnmkuollmorklpjnilpmfomjkoijmjtjhzopmnkrprlkmqrprrkklmpmojkqsjnrkmzknofpinmjhsomlioqkmmoqmxnsrojfiqfhmnimllgkkojkmwpognlloocojmcooneopliooophlnmxqpcmnmppnnkonTjphqklomqnpmljqnptmnmnmojmnoknqwmrrplsmrkjkjunlnppkmmjlokqqkgpomopkmurpluqpp`mmmmqoplnwoslnpmnlxnqom~kmomnqolnpmploqmqsrnnnookwtumoonyonl`pommohllnqeloonhloiwnolnjiekrpmlvononoqoqomnlnknlnnoXrqrnkmlknueqmrjllnrlokpbplpfqjfqqvhhooqumqvpujqglgoflmvgoukneqkmpskrpyorjjrgnkrdiknjktq`lmmininnmjqjerenoumkndljklo|hqgqltqrjtli|kjmvkrjrkkohjvosomhffpqlmlklipelnoglqptmgsmquqrqrsiiprthvhdafnpoxhfsmhgdlulzlpymfboigtijophkkknujmdnqpqqelwmhrnpcnrdllmqkirpmmkovqwmruotultqqkmqqmpnlmnqljplyloncjlovnqrnvpqlpoolopinnjyhwsplpnpvorqmmlhillnqnpojohmnijkqomtnnoohorqupqnnlokkejinfxwhofuRjlirshbmthknjdrmmsklmlpqu\skplllpornknplnkoqmipwljpnfmmooqkkjqrjmfjmkmnnwonrjuumnniipiwpppl]jononrlpioronmpqlnnkoshqntknuslmnqmkktrplfnkqpqlmmotminoltmjr|pkypomlktmmoeomrnlmspmkkmhloosmpiqptrsnmiuojlllpnjsrnpompppopkhnmjmqprmknkokolpjflkqnjlnmjojlnmrqnljpjmmjoiesrrnnolpjnnohkmmpmhlnloopnlortomknlnnnmsslolpknomgmujpkxompnomjolkumllkmhllmumlijnnooqmqmmrkfojoiqrknoqpnnzoqnpmlmtqjotnilnlonnpqunqormjpnrjkkgnrmjkrsnolsqpojolqomklwsllmrkmnwmkuolmqnloqnjnlkhojiokqtqlm^nhmrltqlifikmonomfoobnhpijkvdnmplooorlk{onjpoxopmshmpmtqkj^shprlomimmnorojlmsjnnfoslmnnrornoqnnnuhstnkom}nomopoviqmkjpyptlfpmlpmqfvmdjmmondmmmmnmnkgogbrVmljposnkqmonjokwimmnoqltromqoulnsfuolrnoqncmdlhlnok~pnuolqniqjoltjlfiuolnfqlkoknnhjqrnhaojnpmuqaktoekikonoinfndoqmmmmlinojnmsbglghoqpmlnkmozoglqknpsskkrppqexnmdqmjjnmoskhmynyjomohlnjsikpniimmkrmzklnjkukhhruhoonqsnumnlpiuoqmmn`koqmkqpkukllltgjnitjqpkgo|llnjrmhkpkmmpinoyqnjkkkmizwnrqgomiwnsolhcoomtjj~okqeqqonoqpqjsqoooqsnmjnmnfnpnmlnjrhmptistkjrbhoubnlgqtpoomgqqefomnlmmtprhlqcu~npgirugnqnloprjpljrmjmjkmgrtplrmlgnlqpmwquqhnclrmkokhnxojmnomtophtlnjntmykkinqdeyhkkfquijqpsmmklouprtonloprspfrlhkjoilspqfukpnps\pwiqnnnmqmsnhmlqnrgqtrmupkrnmqxpqislopomqqoqjrosnlnlnkojiotookipojomm`lnmllquosokjmpllmsnlqfm}jliplihpljmhqgknfjjkompokopkmpqurgqlmllqrnlkqkvp]koifqkpplskvlrejpjdkbinmjoqvmsnpnoijgorlbekumnmkljnjtllokgq^omlnjolmrslndnn`qpklqzsimoovlopzlxcmrnkqoklmrqnljqynwokimoolmproovkkilgqonotnloioqqnstmskonfjirrlykmfoo]fnlmxhmmnloopqnprkjlmhbnxmpmonrlmnlqxmkpomqrsmsckrn[oqp`ponolppmmpoqosjlokmfjmtrnmojmnilymolnotn]pnlnmooZknrnhnmrmupln{mnljlrjopnmligspnvqwljlosnsmopmrqmib]msonlmtsgllhqrofobscsmoqtimlqnnporjollnpmqlkdssrosiqmmpohndoomoommrlpnnpqtojnlno^mjomurpkolmfssnlokrsqmmjotqlompinonjqnmnpoqmqnomllojlnnvqjkljifgmoqpklpnlmhkmukloppqimmojopkpshmplkmngpkrorprnnoqhobptooplntqlkkxmmltknjmlqtlhkkspjpmluomvmmkmjqmlmjlnmlinhlnirnlpmogsigkflrkmnwlmqpnolnvlmdiokjj}njqnmkkqmolntsmwjnnmniormolojplipomltqnlopjmlnpkknpprgeqpoomnqnqxpokoflmppkpkilmopphlnmsphnnnqnotnolncjmrnzjrjqjimylinnntlnuliplmlpnqprdnsnlqv]glprqnkpeoqq_mojqsmojltmlpqeoopxjtlnoepvjnmqhqkimmmnktfpqonnkk[qmpoqmlonpmjmsdlkonop^nfpjlokowtloukmmlxhnqjtnnlnsnmmmmnlmojpp~spqpolokrliosnmommrjnmxjeqljprpmkkjolkpyfqyqtnetnmnujslpmqqouqpowmnmm}tomokpdomjmlsihmtdtjnoicnqwobjmljtlqlsukfiqnonmomfmqlonnlqlrhrlpqnmjypfUnnnqmdlqqpjtnltoqp^okeqkkokhmqmnlcjpplnljqdrnoikntqmohpnslrbqlnjpqpluqslxgnmn_ospiofnopmoenmsjprqrdmodpjlpnruwmtqjrrlkrqvloodnivonkpppefjrmipmllqjonlonrmnfljssnmldkqnicphphniilomkowrkngqqropoponpknnvhkpqlxpm`lnsknjpnholonnqjlojprl_nwelokhncrsounmkmhnlnj]qnkklykloojtmwnrjoloi}kpxlgtmmnnl_nkhlnphuwkmll_pjmssmnnooqpnlq\upmnpnnrifpvroopgrwtblnrjp~qofpnnpqqnmsmqnqakppvmoohkjtopnrqnmnoqopdmmnyxrsnsnwloghbmlpngiojoroskomquinjmonlnbmpnkqnmptjonkfkclrplmnonolumnislumnkrsrpdnmmpnllnbpmomqlnqemriojljsuyxnonpqnpnijsznommmtlrnrlkmvrojwmokpknlmjkllnrngmkklmlgkhonulsnxnnsmpnppoopnqewmmnrmmktnkopaqnnunpjoqqqjmnZwnomqumnqmnpnkq`dlsmxknilnjnlmkpnokmtnpnnxjrkojdmovheqoumjjlhnlglpokoanmlrdnllbnmmimpnpmnmo]zjtoomilnpmnmj`nqvmrpoolg|nnjjnqjdnnrlmlnnmmjanraktjimnztmpqkqokbnupmplnpowkhlrmqlffpjr_noonnopmupkvuocimpllnlvqonnpynsknrmnnnkotlkptvnomrokkptpemqkmjphr`lnookdmmwsnpoh`mooolmmkmebvjvpcpntlkprfnloorlponoo\qgnlmmoloogvqqpmhokklrnotevnnqqdxmfyippmlkbnegnkomtmnpohimijhwlfpipufdjhmquoqmmokpkjqqlonproomigkogmplpxloloilpmwitmjksgmqjtjlkrltkhjhnoomjelhnoolpos{vjprhkmmmopivnlkmn_jlkknnkjlinulnsulhnuulonjnjmgnqjtohompohktlkcpjvomrqnlnlcoofrinopekoqoqkkrqmmmpxmfloqokqqfolpiqjmnnkimntngqiimohoqoroimwiinqmqljqlimimloeqjpmsmnlnnjomuhokpmuntysqjmgmdnlk|pmepmnoqllptmw]nt{lij]mkunjmlfjifqujlsopnormqnn|josbnlrmnlldqonkhmnlkjlnosrjqmqpokrjocqlmoptipkltujonnondrtpyppyn~onpjqnhp{nirzmqpmqsmkupqulyoakpwlqblqomlmjpmnmllmnnokm[woqmok`no`fnlqkfdfmpmqpnpl|puigjkooilpohnirpbnonknmogpsrmtmiqsqknonnknv}on|kitohnqkjnmnlopnnjktnpookgosulnpokpqz]omlrmyooos]rimnonbmnsppkfpmkuilqqmnpekljljennnlokmooopqpmksmhon]rgorpwjlkpjchlrjppgptrmnnqkoqlqkmnlssmkmlorohijrrlprlmqokykomqllongmsopknpolmkpnqsnmmlnpuqtnomoqmhnukejpvlijngsfnmklhflkxsmvmnondp`qkvnimrrhpknomniku|nklbonpojnsmsmmulmgpkpkfqjinhqtpkrotqjshriolkzpmulZgunocawmjsnmuehqpqhtnpmintghmqcnkoqikjldpnjkwsgfjtvnlrgqzevqnlhngmjqnnnmoxfnkhtnlmp|klihonqq|iqspthfeopicjjnpoqlnjmmhhqdmklmlkqmrronwuqlhgionkqnzejkqg\orhntjhnnbsnjornqnimjlglpoophmolrptplmpnppqoirkrisjdkoasfqltqcnnpgloulolpomokqoowklvkswnonxokmmnmn~qoojprhroppplrnwiknthomlnktmeknloroekomooqjwypodswklkojmnolpmnojng~mnnonlntiofpmamyn{qkumnmivjpfmkptkmnolkpmjrijkgVrnrlntlojosmjpqpkosomqnbhjirnsprot|omomdcpqnntqmeipoki~npmddptlnpojpmhnrnmlnnlqsqp{monpproseptloialpiolpnpokkmjpojtopmrsmlqoqnjlnpptknlfsokgkrlqkqmrokhqmxmpooowjpomkqoimonlbtfmnqrpkujmsmonklomkrtlompcnddpsmilpwmqgnkmkmnqupnommmjmojtrktlhkmkrponokjrasnwipnllqlpp|lpmjnoznqqoyjpopmiqkmljkslnrmmlolnnunjrixlnnmhjnjjlmomklmpooknmsjlnuhnfnlnqmpmkkljommrmumklqcpnkmnnqpnprenmoromhmsippcjquhrplknlmkfomonrllonbmnonnnolgpnnlomrolplcnnknkmmnkimpqeqflnwnqntpn{kmopmfnlpoqcmrpntkvgzmrmpmpptjn{mmrrmrok`sllolyopuomppenxhoropqokyppsojnpmmxnlzmqmrsnppmnponybhpqoqmkoslfmhmplommrnmwpmp{qlmnppomqrjntqlpnmolnlonlwrnmtp_mkmjngmspsnomnqmmfrlopqnmlnuspjxpptx^tmnnqmnorojyqjnnmklqopolopepmrbmnyrpmmpdnjrfnhomtopme`hnomlurjpqjppntnmpmlkwvmmorolorknmqompckqpsjlhiljki^kojsqqorrkomnjnnmflpminonllqnnmlnpkomookq_linzltnpvrcpnppvfnjnkqtlkpqugnomhrplxomnhmrnnhljndplpllmmoklknrsrlnkipmjlnpjnkojmlrkrmzmonlnnnquptkrmiijpZhqgmopnntnimlkooomlopkqmmmfnloorqpompnkqnomqjopponmrmm_rqlmovkqnospnmlqjnrolioipnonoowlpwknnoloemrinpgsvksoqmonkmmqrlorqovtltdomrnnoqmqoooqnmolnknnmjlftnlnlpnkhropoonumrjqkoguopriqzdkrepfonoootqpmlhnrolpmhkpnmtioskqplnvqknompsnkrlnmqmomhhimrnrnpzsoemumujqvkslnvqroohodsmlllorlhsnoqopplsifqmkpmjohjlXsloltonknoskhopnqqoomrolsp^jlglqoqwpnqqi{kmoqsnwvomlehleokuonoqliksiojnooihtqnzonjooulorxntrjilzplsqrnlpseomhrrnpunrrkmftomlljpqhlsrknmoniljkrpomnnlpk`kgjoo[nmnmoomkloqoklnkunkhmj|p]^oyounomrinimrnoqknmurftnelmiqkrmonnompxjxhbiqmhqmoljjjtmohsjoujjfnrap{hmsnerkimntpksugooqnqp`qmcmnomhvzokmxcqpnqnkxuopdxkdnalgtmmnqkmfke~hnplkenjirkimohajhqpl{nlqomopuonnrsolmprmrulrpjnqlopqlqpmmsnpelnonptVqnllloot\nnglgq]l{nnlqlknjopdlrmfqibniqrxmrqpohnlpqellopr_lkhonqonoljlhkconkoouq^liiljsumjwnpjjkerdmdmpmysokgdqnnovhlmmjkXkpqo`lmhiiprlgqtqljkmemndoblckro{moathlt`tmrUmlqmutqnzlllfilnrpompgnlpopnbidnqprjoolstViyZrkvlmsjslmmn_prsrrmpqkklpmmmfnopnbl|l_phfjqujmykll_lpgwmproqknklnngrmioolgulnkmmjrnooohqvphfrrppmlkilrxprqnvorlqromsleimiqipkornhoxjrmgoltakmsinpgmknljpqpplmgmonmp_jrkphlmskighfmmprnshlhpgfpqmlmktjkijnknllooqmknqtinnhpgqptprhsknprropmnnkqjwmonooqimpjmhtpnooplrqnoljnhloivnmlommnqqkqmomonjgmonymvuphiscqumapjk`ehmlof{olsmumzovunpuposrzth`kwgqppgvlmqkkkjl}kknnljgrfcqktguoltmrlromljzqvkjnnl`spspceo\ezuiflloomlonhilmopqworlrhmkm^npojlmlslsnhzomimtqgotfsip|nllkgonsppirotononjorgsqhnihqonmqpvgdimfnluqojojkuhwvlmtmn]lixkjrsuiujsnpqkiegqpotbrrtjrhIqaalksmlqokntjnm^nqkqsnlnotmnsznpopkoolminrchonon_pabqm`ovljonlhooqommnooomuppnlirncoirlqpmlnofnfh}tkkklWrqoomqmimsmpenqsjkqmplonnkplkspolqhicnntnsmjoojpmokroslrqwgpnqplntuuoxnln[ijpgonnhnijqlnmqntkoplpopmqljqhVol_qnropopjnimnmioenpmrnulonlsnnwvrnltponopkqpfgmmnrdmipsmnnumnlpppmjcnknpklcqmmnrpmmmrrk]nrhqhxvggmlnonrpppnkhjknpnnoqnjlmgdmrm~monmqnmiwlon{qlmrkjokosojnmtonvSkpwmmhmiklmocopjkosnmozrpoyonmmppokmolnnpnkpq~jmooposloo`uklpgngnmnnqqlongpnqollnqqoqqmdumnoippmklknnomkmopjonomnmnxbgqnjoppngisnntn]skjoroiijolvnqlkwmnn|njlyjopquoinjdqdnqhmmsklnomxmesnkrtzmgjimrnnmtnnbunjmpljohnolocmguhvhrnqoqpmqm_rtunnkmeoqnqimplriqsrlogpmjmicmnpnnejnlnlkooltmnmtkmnphkmlirnmiimvjkoouulcgiolkkmqoo_njknplt{ltpnqopqzpokmmonmirstenjpjncmpkplnlnmpmjimonrhj{omsslpzmxmnpqomnorvnhnsomvqqkq`pnulknlokmkuhonsqonnqklpololnrqmdpmgmwvsnpgmvnng{qnriglpolpljledludlqqdhoronponnmuo^snlqkomrmnjumrmpjtgoiolmopwdlmmkmbnlpmmphcyknlpjlttoolknklprsnmsmnmlnnnmtno}mrUpplqnwlmko`diismrnehmmcnnnmdtbjolsivrprrorlyolojriq}nlnk`pmrlonknohmpnsompnmnfmopomnmjrnkominwmonkjoilnmmn}kn{nmmlpqqflpusimrqymjjkuhkomlnmnsnnnoksonhpognnqrnrgpjblplmnpnobkko[norqjfklkmpnmqeoop{kgmppmrjomqmknhnjeqklmksonimjlrkj|lnlkmsqqmkhhmmksupnlrocjlho]ivotooplkxoitklnlqlqtpkjmsllrmtkplpokmklplonmpmsmnmmnpnkyqiqmlopginnimvtlunslomoooktnlnknnoqollolonnnhmmkwmwqropmkomoto[mkplwqt~nw~pljumjsoqneqcknnmolumczohanojpjocmlqnojokrmpkmhntklnrhrmsmtkotjnzomjkuoloqqodnlnployilodpnknmoeomnpmmtmnoqconlrlmwmuqjknimfmnihnnnljiljoopnqwwopwoqnmrl]jctomgmmmomtphpgopfliuoooioomjqmjmoorcosoo{olbjjmlmoopnnookeqnkyomllmrpjrionuwlionomkoqmmqqdqnpnqijvlkupuksnpnponlkrrnolpovpqloelljliwqplpsoo}pgqikmlqrspnlnnkmigskm~no^oneqhanqpbocinapqmvmcqniptmknrvlmommptqkluspnnqpqjnvmrhjslmpfikmlvmqpjndpmpnaemmymkpntridijxpljowjntpqolnpolmklmndmetnhmkpounnpmnohrojpummksiomolhukrqslxprrjkummgpoiprogjqmqnmyogokmjmkrnqsbrkpqoofmjmjmnqlpkmvmklnmminlrnqofrptkrkpsgmpfiknshwjmqbiloonmlrqhlmvlpnvpkfhpskylsqnsoojomjokkmpoqlolhqnrpmlkijjfojpioiimnmlqqnskmfqenojlmqrkplnksjmrnmprnmjnligsilysnjnomspnkppqvlsskmmmonokoqjelijoplmptlglsnlqixsrotlokjsponqnppnlnmogkllpomotplltgkpsqlloobliontjpnjklrmnmrmnpponlmrmlmmsevqklqkonolvqkmenkkunhmppjhhmojjqmpqlknphouvonotqnmnrnnpossmnlkmmknqnorpvimmmnmmklqqrokuujl|lmvnujfnstomhomnjjinloojpnnjqonljqopnrjooomqphnfnknqkrmlpmonbpplupupponsonmkyuqkvqpmlsnmtmollrulfrummkmosnukmnzmlmllkiqoploopppookprjoqlmlnmlnmjhlnorplnokmrwnjprojljojjlmqqllpqtkrutpsmlmmrqompnlmmnsvononnlmqmmlmllmnpjtmorqmmnnrmlknnpmqnolmntnoknmqiomnjmonkmognuomllmmqlmjmoqppsoqonoqmnppjswiqrqokmotmmmmrnqpolookkpnqjprmqprmoooyomoqiiosnumukpnkmglokhnmrunnm]kkplkpknhjpwrqqmnqnlmkuzofmllpjumulnymdnomtmnklbmloknpwmmxkmqkikchwlopnncl`qttmkmmfjmjnpnmnnllllhkjlsmhtjjmkohpl]mmohhdkmnoxnbjklmmolnlsqlmq^nmnopiashnhrmgkkghi`lnlloiosppkooqrnpcmlqhvteotm|nknuomoosmpllkmllqplvlqpjhmmoompkroupkiokhdnmnponajonmaloponpipmlintlooolqjpmnmlinjnntnk|onnowvpqlnjhltilknekgknokmnimtfoinildrmqlnopplnlfpbinolnvimlrfnmteqmidnnbnnomlqnqlsnmnofonmiollnonqnlmpeolnonnqjml]kmpoqnmhdno}orlozjonrinonfmlqptjkolsmounkrmnojjlxqnknmtnoknqqonoqnlkmnltyhsmmnklmjkdpqqqvoqoltnpelemvmelerolhfvqnlvkxqlnjnqpnllvlprnshogrlqnmoqknwikrsprjsljpsnlposnjqimojtpqpjcnmlljnlnxjnisfqlnmmersqnigdwopoqhqojpmjiqlpmrYmqknsmnqqsklluoonmnokmhijnjpilwopmokumjbsnkrnlptjmqqpknpohlokvqqroktpknfkcjmpnmlookmwoonimlmloo{lpfkmjpmlpkmksonompeppaqnmmqpngjdpjookjujjwskpsliilrkj`hilrmopktqpnqjmmnvjhnnfhlghrrptvoimnjnmjlnkgfmkjokukmpjniklppsjktfmoinlpppmmmjignhsykjlhjnjmjopllmlrprpxpmqjlmpnkqsfjmmilpktooesjnsnlmkkprqokpqqhqlkqnlasnshkomtnihlvjiofqmoksoonzpigprlrlplhwqkfspqljmakmpnkproml^klihrplmkklksmnvosollkskienkoitmkmVoojjoqpdysjoinpoukydnmpduolhwqoqanopnjmlgbqehlogmbnnioinfiimuhoqglnnplqkhmkgrkvrqllpxm`djmvbgmsurhopoplxj`klkimXhmSsipnhialllonlordklzpi_p^oWjtmpsxpmjomkrmrrikwn]qroclnmgmmrmqgjqfpklq{fmqrjpjstnpnrnnjp\gksorapoqpoqa_cqhooxltkon|rokoqnn{odlrsfelnjnrimgrNtninmololhounjntnkmjhielnnmrfljjkpporskholqmninpnnmulXjmjmlnjrppqnohjrqrojegxjtosiqtr`lpmoqjknnipojlwlnvlrqmpnoqoojpolqkmknrseopgipwhksotl{omjqiskklhlkkljllohrpnmmnsrqqokmnhpminlegomnipenlqkcrgevkpmnobmejnpmgmbnkopnpmfnikjkpkjgkrltpqkpnqmmmwlkkm|nnjqurqropiohppmnjiqoinklpnolqloknjlqldomnjcoqodptqinlqhmnkonmljpnlrorqnsesozwonmjpnngnbnmpjkmmtljnonooqjmmrnpt|okunk{ljqlounjjnopprxmopmtsanmnolonsnylkosoomnqopppjniunhnondphonmolihlnlllpngnolmmrkhghs|fnnoinvmnjrkopmskjpsnnnxblmmilhnqgedpopojppcl[nfonqnpvppmxoopknonllhkmglloillwqkmonooknoqqlmkmtmqbmmpnomgoqkfdnokrmqmnnl~prbljplpnxooynjnmpkosqzmkhlkwmlolmnllrnnkomm}nljoqonqkgoqmqjopktrwkn^ngmamojnlnqmtvnhojhnommokmnlmqlnjo}n{pxsokmkljnjnpmnbnmvlnnlxikqgnloalpmknqlknjpnjmpjmknfelpogneonascppmi`pqrkrqhjtjlqmlbqnwwqplqjmrmYmtolngpmpqrknkkjqnnsiknhikjrrmkirnmpkjgsmqknmlqicjjnnjpphpflpimtmrfpplmjrfhjhk{fnzjkrnirsmtmnpllcmnsvlhj~knqmejnljqhsqolqjiusxsournymvgkgppirommqfskrhpcimijhkrimfsmbnkoigrkmsjioirkiujnkmnonolmnncbsqapsmlyqnoriqk~skojkskognqnonqro^pmipp`sniuemnuqgqoprynsoqtroojlipnkpkiflhqmfrqwkl`ohrehloppvmjkxopfywninrlrjmlirvnoihgnokmqrpwypskenvspropthoummfulmloml`nmkpkjmgmjolnoqrumfpmtodpgsqllcmpoyfkfrqipamlnlpthpkmqsocnlsgvopoiqfn}iimijksooklmilmoynwrlpqqqkhlqmp{rtjmhqsnikrifkhlelnpnvikqilnsfmjxhksmmlpbrjouvksokoeqnnnsnjqin`rqknnkmjhjunnhkvlkiqkqwmqrlgqhnjroznlkjloolpkknmfmpn|igjrpkrikqsuo~n]ogjmplktnqmpojlglomorgrrwjinofupolqkuoktptmpmnsvghkljonlmqgixlgsmntmtqjfnomxmnlkhjlgcvmknnsqp\pnloeporfmqlhxnshjcsoskndqnopcldpmhjltqoplmr^oin`soepffkqmsqkrllpgqknnrrqomsqoqqqmlhnmkoxnlnromhnnlpnmllnpeqolnj_sc[nilmjmhnfiermrm~mpqjnmipp}nvlgltpwohponpl\orjtspnpnjnnoslolkpgjkunlypnorqnmlpsoconnnnmovqmofmlljmlekmormuirnpc|ommqnnnymohnhonotkilnnfrtjmujmqnicnlqnopkjqorlYjolonmnrtpqolpnuhlonnpgewkjvoonplqiomsnlhncmZlrznhmonmgjlncykomqgsufqnnknglkrjtnkfhqppllpuninmtojgpqojrllmkqrmi_dqljlnzqppmsnrvrhprjplplljrqpgpqioqkjseehhvmmjok^lrnnqrsjipm\motpsjjgrosrmulpqpnnmjmounnjiggpdmplpmlglvnmmqokkljwmlqbpiilq{mjphejnpmfpfuormsiqoonqli\klnloopoglrsmnqpkjsdlpnisopjorjokoqhmxmjlykgvqnsqnhkkeqippp_nliromlqprjjenopfqrkhoonpiogrjopjphouqmnommnqvoolmochsnogsruznkgklppwtnrumnlnitmsmriitk|ekkkhj_ijmnmnmjmmoqeprltkoindjonlmmjnmmsmlglmbmhpqtrjnojgntrspojonlnmfqjen_qlimjzpmujoiooosgkujjkpnlpmonljlifkjumk~mikmarrhqkmmfifkolioumjkhpokkqnmdprlklzyqglvnpowplmhjqnpsnknwhmdorlqorommresolrrroqmlrsmplunqmgnmnlvnmommpqmrin`unbrqmqjoppmppu{ooilpmigmoponmoirposxnlYmmwnjfmpmfnhollkonpptqnhlfpcrmrjookqntmnmhpklnpqoodjobhmojocmfjmjljkskllsqqqmqxmlfnukmgogkoqjnmmnrqtmkopplkemmovpnopsocppunpmsptqonmqmjljdlljninmogvemrlnlqkkdrmnejqknkrllilmoivolikpontoqjrpjqdopnojmligolmkmqsmj~omggtq{rnmqhkpmqmqpokmtrrnjnqotpgrohdtjfgpjnoorokkxmtmnnmllgyemmflqmfominimwlupmnmijilmsnlsesm^slmptllrfpoomnnvjsmolptemkjrnqkpmlscgkmdmlminlqqmknmisowsjnkvnrnupllnwjprrlpjcmmn_nnwrmrfqkfsnkuq{flnqplhpnknonlovnqoiljsnpjslkikhmfiviqntnvqqlronolqglninmnlqmjfhp{gmkmtlhkmqmpnpfhnln_upiihnpgsrmmh]upnfpiqlmnqjtkkkegpljnhlpkoqplkikroskpoplnospljnojujoijhnemgnpfkqgmmnonlvqpgkahjlnlnptosotoinpbqesnpxoknumjhpoenumvqokmocmhmhtkiviskjpnlfmhqumhqlojgn_tiourskiposs}omnsmloqnlsnhlkknqqmkhgkqxckewnc}egrkksnhmrknnomhihluhnkqjmofhjjguknmocdgtljiqcnxtixnqfqoplktwrnmwunhnomzpqunlqnnmskgmipknlushvowumjpzoujnquslikhyclrkdmZmsshnrnwlywqognletdhkrrke~pninhrpmgnkgjogmititlmmoinsiqsqlvlvojihlqplktklkhjwpzsuofqlookpjknwppomnoj|nnnmmjnirgvlqnohn}nqsummohmtuloullppnrnnlobmmsorkqpqlgunsqqorqjomhmlrbjwloqvlnoqjxmupkooquonrkgrmnnotnnppovrpomerlpsrkpntpnnnwjgiqxzopnwspysmjlsljlplnnlhs{noneqilnnsonklpqkpuopommnnktmkkmsooknmkmmqfiknqnirjkrpmuptthxqlooqmoruspkjmhlntspimtoktrnhtkokmymimimekhpsrmkqrtpoloonoplhhrmfpqmijtmrnsjeokrkgfmkpgnpmmhmpmrollmgprmpfnwienkpjrmionkrmmplqt]nojmlhohmsomnqltplqqsphomromlplnnnfknkmunrjkngp}oeiooolhqunhiqcprekqtppjsdlogfpjlmshsrgnlpjtpjpmlnplhnffllnrqrkmeiopnmkmpqknokrutwommnjntqlmmqpurpshoolhrprlxpnshohonjnlprmmopospjjpmlwrkkzplimpsgoiilqelpfnnnqnppmlislnmnjovvklohklfkronokimokoohhgwwplvkmuhfgnqrlopudptmrgnnsmnmcmkjnsrlmgoushinklmpokgglonioiihplnqlmjnitqquunqvuikrjigjljfnnwkmlqtuoqlmjhlvprwnksfkppqlljjnpikrlroqqpcilkbojrqpnilpppflmokpxnkoglp^zkmnqdrkoufrjktosornnsxlwk{pomiqpng`kqpsmwqrmlloimkogpurmgq`mjslkoqfieqesoeokjmnmoeolgWm`gvpmgrknirkhsyopoknmsiwidlwelsnlonkllklrgmgigsoqpkohjcpenn`ipcoflpnpnksgnrckoqmlhmsmrlonollmkfnhqmqrrhykhqigjjkqoallkpqvrsnalklshitmm`rqprlir^mkionohqrpocnqnsqlpincolkjmnolekjhwgnolqlsqqqlqmpnnjtjplojikooonnglirliqhyrmjoosmpuoqpnkonnnpgphnjmnpopjollomfzlntlpr{qfrmlemsjlgogmoikmzfupkrvmqnkqsoqpnjkmunllmmoplrmpomnnjrofliu}holripkj|ktpmmijegpiomng~ovgmotosfrmokomtjipnrmXqlocvoljnipkpinnjnkplqnloollnrliuloqnpqilkmmmnlvmxmwerjlmqqlnijhvqktmcvlsnljhqhung`hlkeulpts{mc^gvjqvrqgrfkhociyopkjrkrndoklhrrpnepszswodk|ipq|qrsqo{fmqrrcvosimoqskoo}mplprniqunjsnmeumkmokihonhlijmmlp`pknwjpioghnkvpiqnmlppjkmslulnojvkinntlurcllookoKqjeurqnoootjgoupxgomtoooeldoprwoqdpsujrinuexkkkkwmwkypqznnmopnelofonpxkqvdwpnlknnspmdulwruzhjmqplrfqslqrpsjrjlsksvmlloqsknqgoepoionqpmllumnplndksshpypenjtvrkjmm]vjvoj|q}hnkriinqjojmnopmopjmoktmmmmvnkluvoriqfomjltuflitmtjonpkmmoonqtjofmnknjppmnsltwhnnmumVqnljjtoqjnhtngooskgwnoshrnpqvhlnnuoptqhoopomikkpqohmsoatrmookbqmnimkprnlnkqnkloeqnq}njnoomonlmmksqmrsprp`dotXoinbnfpisnzjsmpnoomoonskr`kof`wlmpkmplloWkrpkkkm}ormqrlngvnji{rkvoplkiunklmmtnokjopmhirnsmrnunlknloompnukmstpnmoknlnvmypnanknoqmknpgpskn_rqooimnofhqpqeooivnoldrninnmojnonkrmoonlqqxpoooynp_jmqpkohrpjncnmwpcqiqgtnndthkkoqnhl`pkltlroqrsqqurcjopynojtokqmnopmhoknipkvpxoptknpkslnmophpplpmnmlnjpriomsimmisphuipqpnninrnlr\mukllrqqkpnnphqomortrjoqnjommpnnthlrolknlnlrupkhiplqlonllmpjlphholnjqoqlnqohmpglnmosqkoqtopqpmplljjqwlomlomkkknoxoqqpppnlknkoikppjmmnpmlxmspohnnqlXwnmmwksrknsnqnpkppsnnrlnomooroqokooPmluqpvmkZlyiovnkompnqniktooolnnnmk]liiotl_hmjplnon]mgogmnpikxnnonnpmqlnqpuqggmploolnppwnspoqnmqhkmlnkqhnilnnonmlnlsmklofmnpommnmonrlpomelqqpponqfoloxonlnwmomenkpmomoiwkljirlnqlppininlplljnnnpxvolnn|mlfllonqoonuncnjwuolvprsqplllrmfnntbdqlnqomjqvxpnooqmrljlrgqlkrkjolkjpnbwnmlmbnocuhjnlolgmnulpnaqmonjjvieqsqmrcgmnjkqymnnxbsmgdonsuofumjglsnmwqnmqnmleekmmjnmhhmrnrmprboofahjnmkqoounhlkdppsipqognnoommrpmombsinklmnmtkxkqljuqzmljmkasoqmvobqmsobkrmpnmrqlpthnhijmoqnottrgpmlkoqpgysnnogoompnorqonnjlmnrpqnppolnkqonqjcpjnldptdpksnrpelkkppm}okolpumoimktmsummhobooonmmiincl|ulhnqZprqnqklkqipl}ooZnpdmqronrbnnikgplqxyZmmlodkolnipkolrjjimnkrnlptnpktookgoioumpo}mnjrrdloumpmns|mlrlppnfsuopckhglokppzofonnphlmolim`ilspupmnnhmnmokeyrmqpquknlm^pnmpymoqsnnrlmmnnftnotolhmomolksoomqmlfrpuojwqumnqknprannijlmonnpm|npnoocoq\q_qdnllpoplglmplnqoppmknlkngqqoprlqgosgmpmmnoqpojqsmmmskvppkqrpgmnhonmmoqrnnpkmqomningfemfooplzhntprmknrwmptgrmpjrnpoooookhkpniqphnklnoolbpkmmolprnnnolpqnentnnhutqqooumqslcrohodovnqfllovjmjkmonhoopoxpnoloqjktrfpfmqrismlyihonenhnkfsqqvqtpotqolqicqlqonlnqhqqkqutljrqmnfugkplkilrhlsojoiftkmolspjmpirrikhmnqnpiunkrhlljmprnkqjmonlp|pnmfuhrqkklostpnqklmamprklippjpjpkmpjrkbpnhmpvnqxqmsmllgjthdoxsnpssotpmfppnmojtkmejonppnqnjufmmsmlonkpkvxqgqkpsqrgpsojliojqroerrnmvemmpnmlolglojhkkpemjnmvrixoploosowlommplqtolkkppqnnjlmjslqemylegfrxrjpqmtmdlieommqmmltomskksqtnnr|qpoqpgm|hoiqlilnhnsulpoknngouspphlllkqskirmnplkknrmkmmlmkuhmvefkqlvvmqklbtihmmhtpsomiphnmsjhriqpmlpjkniseknksjnmkfmlmplgkjsnqpgvgmen\osllhsosfvlssjncprnjpjmjmqmohohjijmninsonmgnesthhkiplekohkepokojrjgakqjmkjqr[hspnjowfzpgretlitkltljhlsxfrolmgttfkndpboeomgelvomgpqhdihnsqlknmtiospmfnqjljdomqknthttpjskolhmqinnlmjjnktnlomiinlhmimhoipviktgojhglmlqqjikijlmmlqqtnnimjnlmyoqnektli`mrnmp}oeorsmh\ronhgjtlgprjjnoghhklprpnpdpt_qvopprmgpthlqkqnqygnimmslpqcsonmtkqnlenjthsrlqqxmonnmojl[lxrqjloqipuyrotohrmquljljurqopnskoptfnshr`omikkiknrnriplrngidemftblssxkgiwpbg~vntjglsoloqpblpmolpmmoqnnwxlomojliamlnrkoonmqujlbjlsslnjrljopnekocskmonuiiluoa{mlotqoipiojrdojqoyin^slqiiqnoibfllpmoqnpgmoqitnjnsksilvmjjorfoidrsvqoooinrrplmqtjknlnrospqornoormwqnmmqlmnkqn^glmohdiqjjkoqroiilropgojpsrnqmcnlrpmosmromjojsogommnapnoqldrlkntuusioopinmjoirqqpomntjlopnsjhrmpoyqmslokhjgokmujjlwpjqtolkkkgmlorkllglkfkhogmjpprppqkihoppopmjvlllbtomdtfnhinmnf_rhjqpkovnstqkoslrmlmjkl{erqqgrmkjmeiomoobonqjjnlZnjojpnmrjjmjjpfotmgnjrmhmfookgjniumq[thnlmnvjmovitncprmouormljknmqlmksononlkklmqgigpslimnppsjrvpdjoiqinyqlphqnqkmqkqmflkopjpjsroqeotjpnlimimmpjqmrqkrdnkknqmemkpjilmgomplhmvlofoplipllhklninppdknnmkljpzojlikmolqrnmsfnuoonkhonsnmpjnjpmkjsipnjkvkpnnkfjmvmnnonmnltodnpnkplsmwnqnnlnlijzsplmlrmdknkprtoiglqifnkbpojmqqnonknknpqmnodnnpmnnjjsonymoonnimpqrljlnonojiqmollqimfmflupnsloroplslrojalotlmloshklrcpmsnkzlknopnolptnpnlmmcnpmiqowoopopnonjcpmunmpskqolqmnrnvknmunomiknoqlhmnffnyommrpoqollklnnlommffqo}pantnppoioislpmqpooonommmprlufnmnlpnoqnnksxmmleptlonkmlpjoppmzqtkrnentiornjmqmqnnmn}^qjndqmojnlpoknrqjslonp]mkqqmnrmlokjotnuqiolmmppfjlvaumrjmsoqnonlolixjr`pmooounmmnposlpmnkbplpgvdpnijsnndlrqnpkWpjwinrvzmmrodlum|mpcpmnksasimqlkknozplmjmkpmwsuljkghxpmvog~kjnmmuoomnrjplmdlcppofkrovmnkpposqZhqmqeosmrlvs}huqcttsomytpmkg~qrnpoxaogtgnojloqnqopoinxppqkrxllphp]duponblkgfyjnoslJsoikrprfogcmjfphfrmnomnjk}rUhldlpjtkohmjRqdifkm]qnkrqpfqrrkqzommmvlgpquxmlpmnnwkfrkolopmpxhnnhhogvnqnlnljoknpmvmluqm{xgvm`npmpqqlmpoeonooqoomnpjmmlnplmlnknnmpnmoimmmnikmfjmtrmlojijpmqpwlpjmkqlmowhnjmmmljrmpnZgllntnlkljmqnnnqlooojpllkppmikjostmonnkotlmqrppsnokolokolfnnl{mpnolooonrvhurqolnulpkqpzjglompqntnkfmoknkoqjokqknpnmlnoqolntlymjncpogmkuigoshim|q|mmo~inmqploqtimmrqkyrtcmjmipoknpqnhlmdgslxprkjlnp]ljsmgshqlnrokqpjpsmfjlpflcrmwkhninotlkqnmhshllpljsppfjommmjqqklrgrjomsqmifnmmkmkmndplmmopnmnmoqlwppmnnjnjpghqmmfnpnlonjinlerrpmrplpnmlhmskqcsomipioooqtqokfmnnntknkopkmnnpjmmkqookijjpovnimkvpforomnqlkuempspmilrmlrjkhopimpiomnmqldkopoqoommskxnpnokolpmnjkorjlhppnpnljthnwsprpohqmomnooknhqcmmmkkfqtoqqnpjsipscnnkpopmmmnppqlunnmkpnqdqnopmqmemqqmnpppklpkrnommqsnjfhlomktknunnqhwoknplnkwqmoohlnoxlnlnposlk{qnolkmqmqnslolmonnrrpmdjkklrlbmnpp_npnlnsomlpokilapltollpmjppspkimkdkrjkozpivquppfompojqqptulvcrqwmrjrnqnpeljpknslooomrrpmqoikcnjzropofzomkkfrvkdmlshmmjmjhoqkiohwnsnqgmoqmkfvsollmkrpnookpprprolmqppnotmrzdmfkvkoouqdoomnsijrprkotrujkqpn\kv{jostmjlunlxkimoksnrkllqlprqkjojoqoeqolmnqllrppmipqkwqnnooirrlgoppsmhjpmmgomilkhipk_qrqdqrneshuieglglirpokyighlmiheogjkmfoibqqnqnhlimoikinompkmnmkknpk{nlslitxmglurrqxkmmiqknmof{srnipzrjlnn~lutmirmyhrmpjmoqmnrlp`qulYrowvjhlkfjrkzlrnmpppenmlhqsqolnooqjqirsvjfomil|m[qq^litmonkko\kclljocjiyploqtjqxhwhmqljqlkseunlrpkqyt|shmogpkkimfnfk{xqpkzlloktkvovmsknzywmqoqlqkqa{oinkdnshljpmlrjxkpptrnmqgooopkqtonmsr}omutsrtgohqmhsxlinmwr{kmnjppXkylmnnoqsopznionhlohylmmmgomsponr}hovpppjlutkgmkmjiopkolnumnnmkqoimgpm|mmsllrq|oolppvjjstloskkknphslwmqottrsqllpolptoqgoilrjnpnssmkjpnokmjujmjqktmolq^njknkqrmrkhqdkomqnhkvthmoqorrmqgikqhlmmmmjhmqmnsnnqimymjnjrkokhlnuhbspkxltrmyploqqtjwpfilqpmrpkhmljnmkhnijjqrlgtpjromhnnnkmolnlpnfovonvmmnddprpoimqngnnlnrpmtoolktoknmloqlmrmnnfpnmmovmhncllknpmpojoomgmqmonvonotnllozmrjmkkonppkmiimplurlnmqkjmlkjptqqsmpmofpmproookZoqpppnqpnqjmukjhmlllohkmnnpynumkmnotodpinwoosdgpejoonmmmmcnwcn|_qosrlmonjomkmlesirpmin\nonpoooknmmnYotgmqflynnqroprgrsplnumhroinpkankemnplplvmlqoflponmoyrwo~kopnhfsnkrmrhjfinspopnronmmqqoollgonlqinnllppojpomlqknopmqpnennajhkonktqnqnpqkoowrhmmon\mlpnnmsoljpmonkqojhposcm}olmpomnknjuykzmjkrxajqkljnhnpmsknxpfkmoimnonb`jgfjnklzolpmlotvnkyonkpfnionmiilhunmjlqj`lprlobnmpgqqnjmlnql`ijohphijnjvnnonml{kklj_kknrmmkkto|omomzl{qvkmmtejotmnkmfroqppnmkologjpmplomspomosmonpmikiopo|ihksqnhqprhomotmguoomvkrqlnptiriojmlmikommnpooglonkhpnnklmjpkqpmqmmkmrnpnospanlpulooinnmlymnmpmoumjnktmnonjsmpmqpnjrlrmsunnmnmomnmkpmjpommhppdnkumnoloqnppqopoooknlomhpjpppnmqmhjnlnlmnyonlilqjonppmoemjqvpmmnknuokjrfkqmmplnkopjnprrkkqqphrnjnngptnpoomnmkoonbggjqhllmnnntojnmpmnmkliojjmmnpoqhpnmnlqrimpcinprqmknqsninoqqxmlgjspnvqsihoiondknllnqoblmpojrnnsmfjmrmrnqmhtlpnshkpqjsqmpuokqjsojoodtgjplisogmksonololtgniohgkhkjmrpwnsineqpsrohnfklnjonmmppltkqqmljgmsqnlmslsmojjqknpqmkppmkopwjhsimhtoryknnjkfonprhopnphljismorqslkmopqphoqorsnlknrjolmlsnmoumqnxmqqlqomppooplmmmlmsnoqmqpmonkooopvprgltoph[mlslnkvuponopmoonohikmlnopnlnmsjpomhnhrolqvsonfmoitnnkllpnmtlfnlmlkkntkpushksojomipfonrnmpejvmphkipclljqoqakolnnjkoqmmmtmopxvqnpromirkllnnjnplmnnnnrllqprhspqkmlorlrkpmnrpplmngqjmkgmkjvnpmojolkqqqhonngpklskpnskxzpobrnsmskokrinqonqolqmsnsusmjphipmjmnmhqnUrctnlsqo|oxnrupnjvhnmipnpntmmopporqjpnmknlp^rhlmmkpsfdfrlmenlphqoomqqqorosmmmpohqnimjjqlnnohpjidisstnnsaohphqfntuhrqomjpnopspqupjpuinnumfmp`jopnqnqkfpkausnxssslmrslnmmmzifemoovtquktosngmjnnnmsknkmknoppnq}kkoqljlmoxnrlkirmjptqnipnpmwkmjkjdgjfoysgjggqklnlzoe{kjmlnlmwmghglmidmorrlokorrlmorikmljlmkemnrkqokcmjljmkiqkpimjprnlptmgmnp|sjmgnhkripjjqrmgmnloolksrmhnkozkrqrliktpriooqkkprloopigtqtqmvjkoqpilpromhompjsmninclflflxionokmoomfiwkpnmrnqtoliimomkiqlklolqmmntnumynknksqnamnovonrhpihpomplrnihmejimhmmmprmkgopjrnilmmmopjwkvpliooqmsrkhkqswllmkwpmunqmvnimdhpjkmmfpkmuggqtlofnonjsmaqkpifmnpznsqiprmpjfrlwntlsomrkqkkmppfqrjivmfmo|ofomnmmwnitjippkoplngklpmt`mnknrphljglgrkonlemdrikjrrmpnkneminnjnkklkntnlqnlmnfjnoknkmklokojnlmpnonmprppnkmsikjqlkomznojpqnopsqqomvnnolqkpipnmhnip|morknndgrlrppnq{mjprtlpnwsjqkmqppmhrlljnlmqksprjnnokhnqptksmhonulcholosntooqpnmwnkonjqmmipvmokpkpnnmmpynqnmmsfnklrqpqpkoqhrsmlpfnnmboosrivmoionllmiumnttmpnmgnqnqtmnpmmpoonlnvnknjklenqjkqkmnmlgonmpmvqvpvqjulnpsnsjkqspluwosjmnhnloqnjpnqklkjnqnlhriipjlqemmulknjsoooluologjnhlktjqotqpnqymjmlniiqlfmilm}nqplmgqopgznnqskoekpmsrohimsponkshqrgjmmniomrvnljnnmjqykapnnrnpoqo|knrpnnudkiupqoonioqlnplimnkoonoqsqmktivponopqnpgqjqppnlmpmmspkioppsvknlpoqmqnpqolioqongsnlnqnpomloroppcknonkorpppnokinlpnnmmljnnonklklokmphooxojponnmimmmqlolrnpkomppsrppqq{hnjmoqoqdnhotqppmoimonmopprnpmkkooqjjlnpnlpoonpjonnlmtuqonnmrlmnlmkmoqqnlooqiulppoqlqqhoympfornkpskonruaonenlslzmmqolllmlpnouvorvoomonjmgmrnmomnkpppjngnnslqmojmoomrkoonlnvrouknlhlonqompmnnklonhorponnonnhmoprqpomlkugmqlqllsivosmompnoqqpneqnmmptpnknrmnsnopproprlmopmmniqepmnqrspiolnlqnmknlmtoeooonlolpmloqqkooqspooknkrrrurmoponrmqrnqmhoqnpenkfjhnkpmlprhvkqnllvmjnmbpnjktroptmoqnrmoncoqosrpnnqlmgklponpognmnpnlomplmmnqsholkomsqlsrmpngslpnstjnrqilmprmurnnmrpmonpnprowpqlnlnojslsnrpqqfpmnoqnmoxoyoookposqsiljprsqqomnqpommmgonmqzdmotrdshjsnlonispjjmimplmsqjnlomiimnmkmjskrpogpknlillmnmiqqmokmiqogqnljlinmrqrqmnoipnrnimjnnloklsljmmrqkofmsrmhqmoosompqvomomrqwopjmnpomnkopallngqknopjnmokoqqtqjqwriqlszxjlpniprpkmnywuknkhhloooglto~qxolnlsp}srekxTlqdregppnnulpsnoqqfjumqkrtjkitomrtlqvjppnnglrkseytqprhqkojlqnsrsnrpounqplfflposgkorpprsplnoomcnrlqjttsiglhlilllrtspoqopnrmlgqesjjqiiktjksmssqrkoonpnjgvonclynkpikoronqkmokrmnnoprhqonpkspoqirrnmsoipqjponqjwkjlonoqmrlmloigoqmolopjbklnnknpnpllokmnlnmupnlponolmjmnonumlptxnjpkomqoopmmhxmnsjaxpnllnomkrkmjhjwllomljpmpmrpokmnjmkjcqouotjnnoqmqpiijkskrihlrlqhnolqoopunojgpnwnkmtvikomllropoo}xntmmnnomipq{kmomlslrhnmpoikwmppnptmlvlqkonokqokqqkpmomimjmpolmpoqrqoslrnoqromlqgnolpoiqsprirponmlirocpnnuprnpnnophoonkjrpxoqlmkqnisqmornmrppngukkopqmmjnohomplelktgqqkjifooplptnmololnorifngilrlilkdpprlkiqpmmpstnqgjqcojlnonoesnhlppnkntpoqomprmrmnoejhoxnnrqzromfopiumopqpkmppixmnnoolhlnflohnrmmklpljnnooooqpplrnofimgokmknngskknnrlijoskjjvn_npggvnsrilgbfpsetdotoqoshhksmjoqoqtqutkhkmpmqnnrlmpprolnlkrphsikpejjljnirmsr{kokomkopcogpnownnmpbmqkjntoishoqjrnkipptkhkltatlqpljjjrolkm^ontjopjllrsmgqtkmtupmlrimjgmnlpom{llgrmclgmnpprsohloeplprpepqenpqospjnqlglqjkpppnokwmvotqlqoiolljjplnkjholmngprjphpjtupgmgqkmqjnoonmnkojqklklmngnoronilkoortmpkhlnrqmoovqoikqnnlilkplkjmipponmqlnotonopanmollnsomplsnmonnpujjhopkpmlqjnoihkopnnijmnjprkonpokpnonnplnojsjlnptoiiknulplomhnrlnqnornnkenoknmmljpmsokmqikqmmjgcpzinxmprrmrkpqojmnphnojlhnnklmnrhppkrnqolphnplmnnnqllnmoknjmlpollkpplnnoooqosoklnnqjnqnkmopllnnorpkemnlrngjqhmpmmnmntrmhlplnnmkouojlmkgpnhnopqnmmnonqqqtqlnqkpjomnnopkmnispkrrlrlmmgopnpnqhmkokn{rnqnlnlnglsimopollomsmwfnnnmonnskninpgmjmmnnqnooinopmjmnrslmprosmlmmmssyrpiknomnmopnoopopotqomsltlnnmpnplpgmnqmkskmjkmmnpnpirpolfnlmqlnoolmtopnmninnimimommmponrumjiopjl^oppokommmkusmvphklnjmkmorjpnlqlpggtnlmsntkljnjnomlmkliponqlqsomljokqnmhpmomopvnhomunlphkmlmopmmqmsppnmmprjqnoklnnlqoplqppmmjmlriyqpnooqtsrovlmmhjrnozpmiknnhmbhnnnkpmonrpsmgnllmqvonnkugmorlrlmnpsjnkp{nkhqulnoenlmroilsqjkkjhnqnulsrsmmzsokorjmkpopnenqpkspnopyinrmomhlqnokovjstpnfkrlpfommsnsouksopnnkmmpnoolmogttmmisnrjromrpunmygrqklomilojqjlrpmlwlopnsokljnntopmipimkmljmlnliooviqnvkmpnolsnknnqophdrptqkpulqotnrkpkmtrpnkomqlnnorrhnjnnqnojmmosrpkqnnopqpsjopmpnmnqgsnqkeikkpnxklnuhqonollotllmnnnpqqpimjnttlnoyjtqqirkspnovnlllnnklporojlnpmklknvglmlkktuklknpjlmmlrqkkonhpoqxpltmmpmmiomnnrqqvnenopvspkjkojpnrrqknokmvloirsinkmmntmpnqlqrwujpholnpjnpjlrmmrllkjolntmninnrkoqoiomqgmjkpqglnulqmnpjljmlgmmhmomomfmplnipoqmkkmqqoimmqrvooxeplkmdppukpnomoohjtjqnnljhmospjvmykuoimjntulkiopjloflmlpmijnolkqgmknjmmnlkmhjrlphlumjqxmoiustpmimqjuosniemjkopmoprmlqvnkllo^nrpnnumfmssgmqsqqmlrlfmspmmovjjkmkjqioipkronpmp{lnmmjppimgqmqrpsrkvolnqlgrnbrqjinmjlnpljivrrqopqoptpmkkrqknojgophonmnmmnmolmsoppooimoozinonfmllbkopprpmommjnskkfqlnnoklmonhnioomnmpfonvnrpklojminrrnqmminopmjtlmonoqgmpqoomnloogrcmomoqtpoolonnpqnmnujnirmqnolmpoilnmmqommdquilrmnnhmnhpnmomplsmpfmlqpnpstkmnkplpmjprjspoklonnqgopplpmmnmrljnonnqobmononmmlnmkmknnqnqrklmryrlpmnsjmrqnnonmftposqlklqkomnqhkklinhwonkqhxmorlmlmerohnqmliknnnlqrmmmjnrlovkpnmmpkkqokuqikqkkomlrntnkksmmqrnmnmlmkgqmspnmosijlnlmooompdrqmlunorossqmkqlolqmunnprooplnnmkonmonnumoqsoolmkkokkplonmsohlnjtmskrmflmjkmjjotnoonnqnholnknoolpirkqhmmmnqoqjprmklpqmokmolrkpmlipvlmorklqmmoqpnqmpnqpqpnupnkmnlmmqlcnmomkmljotpnmokumluomrrkmrqpbnhgxqgmpot`ooksqmpnmooniilopksumwqpijomikdrtinkppgugmpljhrimlrilgomohotitolijkswjnonogoimoopljtlqoionjobidmfkkoiqmmosqknkmtmknljlpimlkrqpmloonlmrjojiooopqomzgjmijnofqmjsqvonkolorgklmkmgpnnmnooelsljiokoknoljwqorjmmopukkoqdpknlgqonmlnrkvpkknnhpmmjkgosimfror~qsrnnmnoprfoktknnossrnnopjopkskkngsnmmqkinovsurjstjnpinfuomhpmmqkokhioqnngnmnlpuipgnpprn`ljorntsnoknqwkrmcmsplilqlrjllplknsllnqnrnolulqlnnmkodkmomnppqiqjpvkjqnhhrpnmnpqioinmjoxnomorlmpopmrmsjru{nlokkqpsoprnZmspkrmjommhlpnopkpsvskjnnnkklolpjpunmhmkqimppmmqupkmlspnqljmmnmoqnodlmnompjnhprklopkinomtunqpmooohsnmmmrnmoronspprnoopmklrliommolljomppmmdmrqqmmqnpoonhplpjpplmkpinkopksknnpoqklsnqplptonkrnrommmnqriqqkmkpokmrqkjnlknlkopnqrirmrqnnottqxoqnvmqnnpolmpqnmjlnrtmiqnolonpvgmspnnnprnklvooolrnsnllonpmompigkonkpoixqrdomlonmmnknfpknpnklolksbnnkslhkwpupmlooqrljpqnjqkpmmnpqloilkmr~lsimsklnmplmloukprpjoporjnomonpnolomlppoqppk^doqnpjniofpkjnsolhjnnnonsufllmjorpilmpjlkrloimkllskopklqnjpcpiomnlnjqpmhnjprqmnllknoipnmnqooljlqpljoskomnnnnornmnhonvpvomngjnmnlnrmnpknphmmtmmkmjoonnmoptmrjkimnqtomojnpnorlpnkmhfounkoqnnkqovjkwponkookqoqmlqhroqnnpwppllshmlqoolmnokqmononmoolonnmmkqmmonpmmkdummnlpnmpmnqhhroirkpomnmoomlqykprpmnnqimormglpimiqmgmnrmnrpsmlnnnoqkpnplnjooknmlmglsnnlorkqgmjoltmijmlkshoptqjvojpfilnpqlllqoqpfnkrkttkgposkusllmshnrqnskonjnonlmoktmimolonrmnuomjnmorllnlpspnxlrkknwpqjrtppoqmntotjnnpklmljojupgmitnjlolqonlmprklupkjfonlglkppiikvmmrllnnmmklnnglkklokojpimtlnqspsimlflowlntmpprqmjmkwiqknrmttlnnpqfinluomxnrnokmnilpnpknmpjmoow`rnolopqn\tjooillojmrlnqplppqquslellupkltorucpqphejpqjmrlnkmqposokoqnpmomgipknmlmpklnqqkpslkttkoqkmmncijpmnktlljsplmvlnjkonpksimrcpjraiptrhmonlmimqjnhmilljdjsojmsr~tpnpokiokmptlphtrnkcokrloipkjmionoinuonutkskrfscmlrnksnmgjhsnhirplnfnfkmopfhplpkjmplpjo^jahummninjsmomoqrplnmpmpoopnnvrognoliqkplonrnpiipmpiimkcmkmvnomplomvkklknnonnphomjtopljlonnpmlqponnvonqipnljpoompilsmnnompqsklkooofklnkmlllumvpnppqmvplnnqoklkourqqompmonlwlnompsonmrjovlnjolkksorolmneoliilopkrqnljqrnmoplmmklmomqompmnmnlmrkmlllpnplippnmoppslhqmnkpqlsl~molqdlpgopnkuprmmlljjgnliljtolmrqjsfikohnwcqmkililnlrnnp}kkmojnomrooqqrgtqmnolmehohknkkrrnjmljllrmiiolqpklggrlmrsouqnrlojnpfrmkoqihimnnoinskjqnrvpplerjqkntqogtgmnqvoojqupluqmnionlimonmnlmiqlovllloiniknijmoonsnlipmjntjnpspoqmrjhqnprtnrqtooomnptkooxlm[innnjhplrvpnlmopksiknlnmpipkolmkkljopsknknikqpnpfnpqktnniqnsnplpmmhhnqpnlkopmqloioollrtmlpnmmplqmhhlqsfjumnllpplbooiipmrplomrmmvkooonroonionlonkpemprmqonplrknnmomhonqnrpvmknjlqnpqnm{lommohlkhjkllogsqirnmrkrlrspnkoolqmlmtogpnskispnlilrlphmnllhoknonprlpkip_rooonm_ijtkqmkqqovperlolnoqmqnplotqmtnkqvhomyngkimpnmsvnomqktmnuosllckuoqoplrslnrolhrllglmpnuhljtjjimqcoocqomnnjkzpjqpllpkkmklonlvhlfqpksklllqjknmqooooplppplrilmpkkbymlpipnjlqnoqdjsmtmolunwkoolqniqqftwon{qlkksrmjhtnompwmnnjjpxnsompmttpnptksmprflplohkmpmunkgmnnnpkpktoppjpmipkwnrklmjonljpkmsmhqponnepiqsjpqrlutjurlosrjnnpoonksnnlppgkmojonmqpljmunrslqsonlipkohfpmmgponsowdimjoqmqqkjnmoplwmmrhnhmnnklpnnmlmmmroosmomnsrqnnlqksnlnoknqhojowzospukmnijpkkkpnlllkjmoonmlolmkkmnmpnomqppvolnoolvppniokgnkilmqjooolhgmnloloknwpmlpgqmpuhjbugjrnohqqrllnmflknmnjfljnpqjooemqpijylqvmisoplponqpolnnmskjnqlnkllokwmnqkonmknkjpeqqp\jqkwmnmqhikottjolhlljmhmnmkmnlshptkrllmlolqpsqkmjmkonnjknktnsmojinfrrmnropknnrlpklmrokcpodrmhknmqlipmmipropsqokgnpqosromlinplnpimmmpgjiokojnlttaxlnqmotoopgllmlnkknlpqmspneooppkmnqrnnqmmunpmimkvsmiojmttnljpljsxoljmnlpfrnrmnokrorojlmqnslpskpsolmlipkpmimqklqqqlqrolopoolonnsorgsorljnnluoonnhuhmqmjssmqqropoorponpmrobplinknqpklntpmgjnfmhmioktlkvpnqnhnpnmnqok]lmrlroorhopjqnnponqqkmsnnpnnponmiqmrpomjlomqplnpplpokrnmvjpnmlkkppqpjoppgqmmmkqjoloniiqqvolenmhnjjnojooupnrvlmlpkqnm`pgnpmomnjpkpokpoqnqrnglkjpoodkinwnowhontmptohmlmptkmhqinpnpsllnlllpllqjinmmpljilokpniknqkrpmtolmgmoofprnhfpnipplnxmnjmmolsno|njjpqmouspoppjfntknopjllonqrjlplpmgnnrnpmtqmnlnprnmqmlpsmookrpplkfnnotjnglpqioiklonhjspotjsnjqronmmpjmjnsrokgmolnprkpwrhrillgnpuonompncpooonmnsolgknhmniknhtqotmnpnroglqqquosmpmkqoimonknvnlropnoqfomnqplnnlmqkspnkmnjlltrrphnqwlpkprkllltnoourlnoqoimmjrhncemokklullinrntjpmtmqmojvnynpoktopdprporpvoosonllnrmojslknsqpyqqmmmoqkulnogosjdnvpspnr|fhimlonlttuoqpogkftqjilmmremhjppmixirkojonpptlintupqogojpnrmqrmjnkmpuqnsjjjnt[mljrnfptosammmehnvjrmqlmlqnknjzpgnnkeftltvgikkqqfimmkqomulroqqsnqnngjolhmqrlfkponmwntoppgsslhonqptkonqoijmnunumrklltrsrqljpqghpjowmokqriootlmkvmllrlqnqjrsolinmnomtjjpkinplljqhrkslmhqnknonlmqnoolhpmmjjkgpnn^gpoonermslnppklponjphnjmlglnimlsoqhonsmongolrqjinnjsjqomonnomnkmsjononqprrmqkmonjtmommokrnnnmkr{snpmqolqpoopolnpkpmlpspoohomimnlnonpnklsmiqqmniojonkninopgnomunopikloopsontnmqollponmnokqqmpnmfnomolkmkmopwmonjotprmokjn{qocnhejl}kmhmsqomkhsmmmjhiepwqkopkjnonikssksvsrkcpurpxknlgonqqjmllfqiqmnkkilnlmlnoqpgmfllotrfjnkrvlunotnokpsmofllpliipoqlmijhspmqikjlqorskiiulollppkonplopkfhnqipmegplmmqeotgpilmoomklqmrkomkkylpqplqiprrpqslrljgqoglrnnqqnfopsqspoqrkhllmotnjtklsjxmqlljqombntcpmmlnknonklpolmnjqmmtnoqllgmompsuroinmoplgsrnilopomqnnpmnjmroptlnoosmmmmjpmpqokkklgnnmpkposqnqppojllmrmornoillmpopmllrjjmrommnmnhmptnoljqopnqnqoqsnllpjmkorltnjnplnomnmolrpnmqgoljqnmlqnmlrkjkmsllqpnkoepnmnlnrlsnkqoomnrkoronmmmmmomnrnnkpomnpinorqnnillkuikqjwwokolmiospnoonrlntpommimlmopptlgnwpmlmsnrmhwronmlmhmntmlojlhnhsmplkgmmppnkkptmpnlmqlklkmlnoiotlnqknnpcpqlppspqospmnomqnnokokjrnouklgkqmolljjrsqprtppnlmnmmgounekqmhprqnopookunmijimnohkltmpmsqtnrsnloipsjlmnrrntjlmninnqoqmmltrompponpsonnommorkomimppnnnnkppmupooompvlgtlqonmonpoupniolrkmqkimnnmsjnlpmkhjookmkqommhnjmop{pnohiklknlnolpfokprginkolkmspjro}mooqkpqsokpmnjmwvoqodrngqnjnjrnqmonntnokkp^nrommnpqppokpmmhppoonjjrltpmlo|irohlq|msnmmrgppsjuosoomirggnpmpopgllciplokimpuklpnloplnpmqmolofppopqnqnpjhqnlomhvrmoinlkimowiltlopqonnqorktlomoomkqnonqmmronophknmkmmpshkipiokmlnlruonitqnknhkqjmnlmpspuhfjoqoqmnnlmuoprplhltnqotqonqoonmonlwlrmqonnsopptlpkmnmokomnmqmkjnlsnlorkrlknsminnlllsonolqlt}oopmnmholkkotpklnnoprkodomtmmwoqxpkpgonenljmmnqnkmoojllpszjpqlkpnpmjqknjlhhlqothoriojjhqskmxnmhuojmxormkkljmlrorllsutwolmjnslpoqhkpksckki}ppmknlhiueqnponillrqhpjnmbqhplmglilydhlmkoloonqrnrtmvompoqnkjmunokjlnikmoqljmqsmojkopppgynjojmrrkhjiodlliuleiknimnpmbimvwoqqsjmhpmllsqkuvkgnlwnnsmoimqnovgppkoqopnsnkophorltmppvjqqkompsrolqmsppppsunsnssplqjmeiomlojnpnhnjgojpommlpummmmnnlpnlrmofjkplpjpooooojmknonnjjelopknolqigppokhvtoopsqolnmlspfonnmmumkpqmjlqhnnpdmgipoqjnulnomrpjnhnlnjomgkonmnqlqnqpmolrhqnkojlnptvm}jlmjkpknqurnnjorklmqungnmkrpnnfjnmfkksoywjglmjooooqdnvmgpqlkqomklrmonmlmmwoktoupfljoonoklnolhinmktmoprorpkprmmhmmmgcmynnllnrsonmoymnjprniuutgnrm_npkbtnqpmlmnompomlnokrjolosrinmllpmpmiooopoiaqlkmtpnjmrqjqsmvnqolmrmrlsnmlpjinnihqomtproqomvnmniooornmi^knnmklvriljmorohsflcpnkpqbpnipmooqpnnknojmjnlqwtvmnkmiomnqjomnmpnkqmmokdsslenllqlikqnrlknmhoilvmcknprnkqkoosmlpngqmogqjpnmnonnpnmpqlqopkuojoolmhksmonlmonnjgiotollolrjmiljnniqkhonmkimlslsnnttgrnltoflmmunookqokltmmvnkqolmnongoljrlpknskokmrkoninmslompplpqmmlxnqlpnmpmpnolstkonrspnnkelzslfnjrojpkolkrnopopltmnlzpmrnjjmmnmmkmmqksnmmislmlnklnkklilllsogjpkkoqqnnqqjolgrqooomnrmnlpollmkomlpnmsmkoonkoenkjkqlllomtnslilmntpnvplnnmionnoobptimmrgiknrronnhpjohrpkopsooouwjnojnosnmopononuimmnrmlmlkkmnpjqsnonnnfqmrnqnkorlmlrjpmnmoomfmiocnmimnupnomonpslokppmsmijolhnogplktpjzqmrlnppkmqmmoplonpumpmqmjpmnoollsmilqqrtjmsqtoopbjnsdqrkpqlorlrplmhomrpplsmnkmjmpoqohnnkppmiqpksoskkmpmromqtpnnikmknqqrqmmonnkoullnqmkrnomqornhkmpoljpjjpllnpmmslhpqemponlqnnmmnjomslqjnulpopnspsokkopnsnnipmnjfonphpolrnnlkclklgnsomqvxfkrskkmqoinnknmgmsjkimsknplmlpnqsildnjkooopppijmnnmmkonimlmmkmlloksnplpnolojnpkgnirjlmnmqmpmntpneqntnoomqmoknqttpmhkrmmdnmllonkmomprnjlmllkkpmnmuhntpmmhpohrmjkmmtrtjiomlhnjnjkssomhqoopqnhroosjhwmponngoohkmlkvrnnmlilmlmrmmnqknqmpmenqpnrllpjmmrokqomromdoolglvporqoqlppoprolurdsqiuiopkolnmmrommjomopnjqmnvlplnrlpknhnhnqpohlkmnpqttkporloomlljnmjoorojwnomlmjimfonolqnooolnmnkonjkjjrpmnhprmopnnmjmkomomkphooknimopp{jonoqqnnyourrpninrqmqjrnnmirpnlponhnuonooplnpnkniniqlgodkmsknlrpopmqmkmssookeplqmpjqopmfprbnnksojkooqqpqognrqknynosplukmr_qpukpyolenmjmjopomookolqnlqmoqtpqmnqmjlqrmjlpgpnkormnomoomqdmmojojnhpoolqomnavonnnmllnnoljkhmlmqonjgnkzmjjpmnpolntnmklopjoiorjknnnnpmmnmplpnigqqkhinosivmpnomkjrmnlpisopoopmorokmpmmomnknofxqlmknslppmmmonklpnlomokmmlkmpjmmo\kphnnllpiqnjuijklxnnllmkmqpknglnhonnklniqlpporrnnpnolmnkompdikmmqonmofjrnonolqlnqmjruniqgkomsnpnjpkprikslqnlmlkkjmmqmminkynmollrhljipkvp^sphmnlsosnluqmmomlknqhgrqshlqgvnmnpyphqlitiopoooqlnjpqfntnmuuqmnfkjmmimnsnlrnjmnsnihlmjojojhrnmjoomgoko|mjoppfjfvuplkpgphkoonmspsnvpnomkkomhnmujngtohhngpstkonjrqgkpnmno}lgslnmlpkpqssskknmndomuhklnlnonoqkosqovjmjoomnlrlnlpmpmpnjlnqungpnlqqrlkopwklhonpilhnpkpmmomoptinokpompkmmwnsgmrqnnmgjrvonrpioljtwnknjlsojloqnnkskrofjlppmlphspsljnqloljnlilrknqlnnomjqnmlmmqjjqqr|lqjnnjfqonuppsoqntplpnjpnxfkvppomprnnmsoomnjpqmqllfqltmllmpnnqmnmtnpnmgomvmrnrnqtiqktmqjkopppmoi_hronjsjnqhjlrsoliolrlnnqmmlqnjnmkosrklnkqtnnrkqninoipkopnmofnvinqpoogsnmmkommmknnpmompjkjnorgpnlmjsqtjmkmomqkmlnqmmiopllosqglmklnmjoslhnqnpooiosolpmmolmjngrllinsnkklqnlpomrqmlrpkrlljonjunrkponoplnognsmoxpooorxnnnoopmljorqnjlrlknohukljroqqltoqioplqstmnlmqj_monnhllptkljtvppoldjmkqnrposmjnrnjlxoimllpoqrlmqdnmeqkinonpgnmommpmvlsmnnoomlspnjroolptkmjngbiilkrsolorjpgoqqmemkjonrmktnlkklsqiuongmlmlogmomnhgpnlorntokljmenroomknpornlmpxlomutmllnoqngqpnolkjqqipnijrorvlmsrmrlrpromknniqljmkkoirmimrkrnpnnosrniomsmlpknmnplkpmiroknjoqonmhoiolposjkohknloqmjmpmqnkitqinlhkt_phuiqokmonnnnxllpposonmoh|qlmhrxiprtnnpomjprrprnlwornpnpomlxlmquljshnlrllqmmupmjrlolnmiytmmjnpohrphkloormjqpohwllpnmroqllmqncn|jopkvmkrmrikhlmnmlgnomipjmrhhoo_niwnommqpmtojonqkqtjklnbnpsonmnnmssoomjejpxomsmlWeqmmqykntgbntjqnmnzommonfmrpohltqrsrmlrlrltoplopannjlgmoopp_nkxopsofkrqounlrnhriolpmqihnqloqpqinlgwqnmqqnholqnqpmiotmulnqoonhklkoqpitjnqnlmmlpsjrnjjmowmolgqlsmqqlmjmlkoplmjhqlooxklnixnoiqmuohrplpowslqjpnkrpopsnprslpljrmopnlntoionromjolqopnuololnmhmxlinltrnpolkmimpnnjkkopjlpsomiomukniohmpknoknmqnmqonihoxnqckooknokz|okolommmqninunmpfmprhnrkomfohksnmjsnpmrjllqomomplnmjqrmtpomlhnmpmonlplimlmgpljorpnoqmptpmnonipmolmoonommmoqsmjnojnppmnsnmpumtlsunmpnmonpusmqpkntopgnpmmmknmnljnllornpsonlmnhnqlmtnoshrkmqojmpnlmnqqnmntkoqmuonqrlnmnnopnosonnojnnllnnqomrsrkphoplnmtjfmposnoilsnohsomlqmjgmnmmoormojesomkmokmlhkktolkjooololinrkqlmdkltlkoqngolohonlquqkrofqjmonnnqllmnmlpqiklmmrjmnpponurlmqnqlokltmuknookimngkkprmloorolmnnhkkhpnqtomtopmopoipoloqrqmmulqpqrpqmmnlilqnnylnplmmsfmpqimnmomqmmmljplmoknkkpnjkippimpnponnnvomklhrklnqrkonpmlpnjpmrmmnkmnlqkmnpolnolnhllfnolnkqrqknnooqmrpjnnoqolqmhqmnojmrsnrmnlknmlmmqlopggponnlspskkpnomioooqppnsksmkmnprrmpjommfjjjvpooqqqkqltorlkoprkpounrntkmgjlsrnlpiqqjngnoqkpqmmmunjmmhkporssrhqonqolknppoomqohlyolknvojlliprptoolmkqsesndmsnslslhplmryqkfqufkxpounqoho|klunnrrjmqrpnrosphmqjkympqkqqpgqnnkokcwlselnhmprojsxqjodnppmnnklronmopsgooqpkkpoonkpulwnppllhmnnkqmlssvlondlrmlhtmhgikoqktpondnilsoprimowpk|klqtrioozjpo{msmlqixnhmqonmqoljlntppoqpyppnstomnmmom|jmpmllnpoknroojkomlmoskpnnnmmihnqomsopnonjoosqnlljmocdrolxopppoooqojompnmlqlqmgihmqloomqosnsztsndnolkiqnomplpmmjqmnsqopnnilthmmnmojoopnmnuvglnnopsioqhkkolmnplkrthmropjr~{nmhpljnjolqjkotjodlkpjokmgkooqmknlpkfnlhnoumkmnmmopqqonjlmmnonnqorkpmnpmqmlrgmousoiiknork]otnnnopklonsmmmhlllkoonomhlnmqmlnqkmgimljmuomomdgsmnkhknlnjnneslrllipoljxjmjqistmkhponofjdlqhokjponmphnnntplriiohohqjlurpighmnmqjnfjkfmonnonolnpknomolpsofktnlnlnknntmogmnsesiooqnpmnqqpqkrnrmlmnkjhkmkmpltnssirofpoknmmsn{mirlnqnmpjnnslpqmqoklporjokmmnykkkqkljglpmhmorktoloriljotonnhnolnmjjmmklkjvppvppqpqprqnelstnlmoknrpkolremnlkmpljpnmkqjslmnbssokxinipjsomhpnrhoninlfvhjomssojplmoqrlsoeollqpmipnooqjlnmrrsommtqkjqjhmhsqvnipqklrvopnrknutmowtjpkomnoqqpovqkmkrmkrlnxpinsmosoltoninplkqixqknpqpmolnkpkkrlmqorkkkkpukoxnluplqplooolokontpummjottjklrrchmospxspmmjmgopn}pthoioolmnollllnjqyqkmrsepmifhpnlhoerrnsqcpykollpokllemomqmsnncnmmlqkogpjshnppstnovqnmignnjmxnnonpwlnnmpsktsrmirfsvnmkonoslmtiknkinrnkonjolhqgjpnkhfmnpoupkpqnonjpfkimqknekjqpjqlsognmtgvqnmohpovrllikrkefclobqononnonosmgmnnqompmqnqniupqnnkplnmonsjopiksioohlnfmulnmlnlpnqqnknlmmqkqnlkjhpmnnposnnomsqqhlqpmnlnbppmpohlfjnomipomoohmplmmlnppmrpllkplkpmpmjlpolmonnmlmnnpm{flkokmjpnnonlqsnkjppnrloorfmjpopmnmsmrrmoiooploojqkekmmmnnmplnnljmrlnoppjkrppmmpnipmmlpomrtromwlqomoogkrorqnnijopolspnnmmmmijiphlnnolmnoskohqprlkyojinmowmqookonfllmolnpmonoqklskkrioklqhnjtlooulnqqnqqeqpmmotqjjseonhmomkkjomslpsqiqqpmnqmlnppsnmlmqjpkkppmnolk{nrknppmlsmkmpjn]pokponkohymnlopprlipspkpphlokqsjmmfrmqllonoowqornokqmnnjnlrommppipsnmlhasroopwkmmnn{nnplmnoqnimoqrnlrqoonnfmennpnkmsqookplnnpsqnxpikooskonnoolrnqpmljppmquqosoklogsqopmlllphnnropnpdljmrnmouthopqilbprllkgqtjlojlmsnnnklmsoroopgjpppnoglmlkolvjotlmnpkolmqkpfnmndlklormpqkllmpqropnqerkmppooqvmsnnqkgmlnkomnppolsppoopngmnljjlpuoskrpmphoommnopnlo{trqogqmnqlinniqnppkonpqlronoqpkjmmnhlppnpullhkoxkjlmoonvmovqmlnkpnlqngijnjumnemqomlnopkjjnnkmpmnpnoomqpmpjlnolrlvknopmjmlomnjolnmnnjpqqnmmnpmlsponnpprrskktmnolnmnmpknulmdnpkorslnkrkjpsqkklnkmmmklmnnjcmnqqjnqnsmmpnktomoninosmkpufrppilnmppsjqooikqpmlissokpmnmonmsnkouomllmpmkipon{kpvmmmoqmrhnjwrpqnrstpzqoepvngmpqvqnommpmojmlllltjvujnlllnnrlmjpkooh^qqojpinmptnnkmgmoryqgtmlprlmmtmkmjlmhmgkotrqmpkiktmnqllmikllnnnctnmlqrmnkpmbqnmoiuuqqjotinwpovpnpojrmpjmlkoqukqpikmjpmiomprjnmlqorkjoopssskolnlmmmkjlnpnqpkomnlqllnntqknmprrqojlphnomjrmpmptpurnkmmlktnrpdkimplnrshqznmmwlilnomhmhkmmljnmokqmqfqikslmgqjlnnnolknknnmxujmnnonnrmrkpwnmuroplrmklqtphmlmnlnurlqmlqnmsmtmonofpomllmnmmqmpnlpmpomlpgniqpiknnjsjklpeonoqtsmopnnnjpkgpfjpkhgminlrpmnmommklrnloqnnolqnppmskekoqnvmgggqnnnlnnjkokmjpnopmlpjpqsnskonxtogonpopnrqnoojmnkoqlinmmnlonnnprqinmnkjnmpmnpnqtnljlrgfttmonsojvqilhsmlrotrnonnnpqoopnymngqqjpkgnknppnlogkopumfnnlplmkoqtnlnllrlppktxoromntiotopnojnqopjlimoowmiocmnmrfjmomnnnmrrpnpmkkhnmooonmoomnppnnnqnpmoelnkmknollllnoofrmjmqnlsslnqkmlnluhpkpmpphnhummlnlrlnmhoeknrhompkmokclrolnpksonopnmnjnnjulmohjisnnhnnonnpkkpoinonnqprronmofpsolmmpksomonmkijfnonpmjmqprooqlpqsskpkkmnmmtrnkimrnsrjnkmujpplolnmkjinempmnsnlfljo|tnnimfojrrpmnmklnqostmkjpmjslnilmkstmsmkmpqnvqoopkukommkpsllrkokolpojmgnrlnnotopjonnpenvoogqorhnnnphktrnmmovpmmksirlpqnnniqinnppqmkkomnebqmkllknknnlmoloftslsrpnelpovjrjrmnjlqrpppjlrwkmpmrllfkommuroojmmpgjomrmjppsnnllrqnslnjndlhqoskjkmqqjiosnkmmmpkmunkppvpporklnhjnosqhppilqkpoclhlqskxsjlloophlqnlpqpnlmmljrmpsmmooounhrroqrmnqpminoijpsqbsononjpmoknnpljknljoloopkrqlholrkmnkoskekonmloplqooklnnqkgirqlmmkokxqllvoullolqloopmttlpqkkldlnntrnqmtmluuwrormiqopjlrpnmsttktmpoprforqposquunlqdljkrnpiskqkjkhmumnjplominqslsnilmomokqinrmkmoxsijkipufruqnqnmkmsmnmmloikolorknnhmnmqosrlqlvnhmplkmlnosmnpqmunltpoqmmplloilmxmqoomzjoqnnlmolgmnkssppijwnqnotrmnodnvmqqnspnmlpjllmnnvrmonplinqloonmmeogookpklqlqnkpmrknropokollnrnmhoknrwrholhlonpjellnnplmpntnnohkoppnmmmlnprmoiiolmptgosijnjmnjnnlpnunmonlsmpxonkjsufqrvnntollqoojsnpnolnpomnnkjnnphmmormrqmplkgjnkposiplmmijoplpopomnomlommqnlmmnlnrmjnoopshmmwlorqojntxroxprnpornkrnkkklnnkolpmlnnnrkmfwkpjnoroommfogooolqqomnolqmrjoprcnojnnqnmnnonmnnpmhmomiqkhnnnomkllpmlnoomnkrohinoqmppjlposnrpmmromqlnqojmqoqqnqrqrnminlkmonjlqmlokknmmnkoqmnommmjmlnopsjpomnnmpimkoppmqokmlnknvmrokoktnlksfmnnknqntumkpnjmnrlpksnpjonfqilpprtfpiZpqknlnnlomulnznmkjimqrqimorntlllnqkmouotkgmiqkqig|lpkkm|osomprmnonkvmmtpoooiopngnmdqqpopkqkomplpkovslrnlmcvnjosmnplvmnmolqgonqqjsnmnjkppnijqmpnollsulerjqqpplmnvrmqskmmfnoulmmnpomqlnsjnunmjqosopommjmpnlnpwnronphnkpvpsipjlooldjmlogilmhjnnimimlohohnfpnololouzkjtpoolllulnphmljlvnnqrhsiiogglhsjlmkoqiloowrgjnlqoonmlfkpnglmlfrlinlkhnpmqwkqmlgonmlqkkjmjlkqwkohronpnlpojtqolpnqmocokoqivjmjlquwpqurplhjmpmmoonpopqnejqqpkjkpowooprlnnjnfmmmntqvppnfmogknlmnlpilnlmfrpknrnppOkpkngfrnj|ikjlmnnqjjpltmpnwqpyly{npxoirmpmntmdmpcnl`mgngooqhlmolnojmnolpjpkopylmonpkonjnqmbkgnnnjolthoqpxhfjoojkokmrgqnupkqwgompckljcnmpmlolqq\ljsmlqmpojmktjoomcgnqgpqpnjp_mlsnnnomqfpnlnnnqhzkrtpmhrjpmnemprlnroomqvrokjmhnrzomqmnlrusiolnqnlmmmfmnqmmgrrlmxlkk}tppnpokjRmknmilippriklkninnlslkogopmppmpnohmrqlpxjqljloksllunm`kkjqkqsmqpjnlonrnqqijljrkhlvrpjxqqkkmqomqhlrimnnnikimrqqmfnmmmukpolikpoYmmlhmqkhonmjkojnmovogndpojysmqlnnoloqmknnloplplmoirloeqnmktqhgojjunnpjkrkrekgjlmnpmuqmkolnmkkqtmnoskkmmlolkloqinikvommpmvplknuqqonllmfnoiomkpmljlnnjnllkoqnnpsmjpjlojjqoipqnknqmkomoqrmlmmmkqlqqoohnpqvuqlqnqlohshnolniiolpnopnmniqmlpososrnpnrqoqnqntonillpyrlompmmmcnkrmlmmoospnsommoknmjnpnoeqoknjndmlmnnqninmomppomknqihmlnjnkqzmmkqpmjoinpomplrlmlmomnohjsmjmhnpmkoooppcpkiqfqinmrnnspqoqojokpooqnqjkmlnolnmqojnloplqnkuompmpmorhnlprksoomjlknrktllllmnsoncjilipmllkvonpmqqknmqqlmmmvmtnkrlplroqornn{qpplsnmookomsqlknmnspplgkklajphmpmlmvrplomjmnmokqikqnjopknquursqonmmkohvkojmrdlnklmonvmnlksoigrntmmmmmmonnjoolnomjipqlfninmpjhnooodrrmkmmlgqnmnmojokqgoqosmmjjnijnhmholnnljnntkhnhgoqmgipmqjqhnunnxqlmokpppomlmsqlunpjonndptkmrmfnqmlkojfokjqjcnlldijilomqohrrmimnrmimlikoolmmpmmjpwipnolkxjpoqmnnsllpmlgxoljmoknoonmhojoslijplmnorklmnmpgikplopotjjpmkookerllnmiponprmboqnpmpmnqjkkiqonjmodriuhononrmhmmiojhnngnoiorrcjsmntnpwtlron`lspnemnqjmkniqqrsnjmoozckpjnkonomrsokwplpmtoprmmjrtnkmpmomqnopqrmtvhmlsojpomomniqltsnokypmlnnlonlomoplpkpmnoohqohomooolwplojrxmkjsqnmdnonqppnnqnmsijpmrojdonjkmjpnhileqplplttlnkkmpspjpmrkkzntjpypnsmloolhlmonnoohmnlounhmiplllpmqpsqlkonhmknwlntmqlhrnmm}moolniioollnjonqrnlriokmolgllfueonnmklxtmmmhfopooqqfqokjlsqvhsmojorpoppmzsmjhlojtkunmknkknjrummooutjpdrmmvlnnnnoollipjlmlrtjsookoqndpkhnpqxljmmqnoqmmoilmomihliizmqlptokgomijltmleomlfxpjinpndnlmkpmsqiniponklvmomotvklkqiomaoefpnpsornomtonmkoponvkrmoptlqnjopirrrmnglmqrqlpnqommmirklnromn[ufpjooomkknnmshnoojonniojwlqmhoskrmmtnlpp_klnpmrqmrdoghtokotrjkjsqnxlolnqmnplrqmkpopmnkwupnjknrksnilpljmqmprjlhnqkhkohvlqvkmlohmrlmnpojtqnntjpomnhnmnrptlnlkonipmppoelonllnnmlnnprkookhpsnnmsnokmmmlpksiqgkeqotopmhomnnlrjsmnppnlqgmmkmmloimkhnppllimjolomyi}jojcl{vllolmvlenohnlnomrqlmltrlplijoloqmnmnhknoilijrespokjlttpqplppsonkproluqllooqingnkrkwtouplolismonlnnhliqellpxjsmsoeokippndnlmmvrokmkootlnplqiplnnmokqnjkjgrlqlilnnoonokjosomhoqrqmrrrmqklliqqtlorplprkroqmpkwfnojhm{mqjpgntgopdlollonokqlojtqoknnsnotqrojhmmnsjprqpjnnmqqomgtjmmlfkksnlnmrnbfmpkknnqsomkdywnnoinxqjmoioinkomvqqlpjmmijloomrpnpklmksmlmjbmpqkhpojjommirllpmxononmsqkomnmlmrnmgpgijfnlmntojimoompppmamikonpmoqkllngtmmonqloyphqkmoopomtlihlpknkmpnnnjmpjklgoptplonvqpmoqllnkopniontpoonnpkmenrnlkrmllngnnqrrllsnmpflmoxmpolwoqlinnnkmmmnosoknojtnrpmpkjpkxutgnmmlijgpoonnmpopnqntmm`pinnmjmlkmoololinofoqmomllmkptnnjoionnmmngkolommppfnnklmuphoonlrnpohvnmimonpksnnlolomujnkklnompklpqonpmjnmknnlooossokllnhmoootmmomvrpkoikrnklknmmpolkkpjjjmoonlnhxknmlnilkononnnokurjlloprmktmtojmnoppohmrmmnommmmhjnmqvnqllslpmnjmlopqpqmporllnmrnqoopgnsnldnkhrnpnoonrlqnqolmppljpmtnooktqoklpknmnokmkmremjkllmolmlgmpmmqkokoonpppkqpvomopqnnmjmnnpqjmoounllnnpkmiqpntmnlrorolnnmrnhjmkmlmnjopmnteptnhmnumlqpokmpprfnpoiojilqrokiminprniqphrjpn^plnjukulnnbnqkkhnnqhoenpigmnlhsnjnpmnhrmnkimdopnemtnppkkqnjhsrmgipfrqrnmkqykmrqihppoilqoipqiohmmernkmpmnrqornlnmqkfmljrsjqokxpproklkohgoslorppljgjjnsnipknlmnhvljrmo}oip~oktsnkmpgonmklnepmptlnoooloprlgnplizpmmhjiqlnqqe|inmomjnjxdttmmnnjovfpjfnpnkklgnhpomdogoklklowujllf{lsmonfnlnnlollm{llhpmjiyojriopikgoonmlvirntfp`auyomieiurnookdqqhrnmmnolfoonlpkrlklpgmnonnixkkqqlopnqgludqxsmtmmpunlnnmm|lmmeimmknvtlqdrjnhoqolqokmojmrjqnpsnihsplpipmmmsoplljqqlsprmllknhpnrjluqlqlnqnynhkmkipgmnfnmomopmgomqmlorojonlmlmpmhjlrnpsomjilqqnmpkjnrpxsinniqlj~oshkgpqhoolqnollqmrmppmplpknltmnrmomhnjrijosooomnelrtolljsmjlrkjhkmpnqosqwcmmqroorqpqrkmoslnppsmqkllkiqnpmmoknijrtnrnrplnuoopokmoplomnovnmvkkpompmhmjmmmkqnmklikspkroikjpnrkpopomtpnlqkmnnspqpoupnpromloojhropkqqpqpkpomuojrmnohioinooqnmmonmpmsotkpoklmmonqnornoklqrnlsioqlonknmlpolmmsjsfnulonngkppolnqptiiojnonppnplnkrlokpnntmkrniqrplokjkpukkmlwovmrnmjpoiloolppmtjlnpmokmsjonpomioqrhtppjgoummosnipmqmqpknsnjomfogkpnrljjqmkmpmmfnzjtlnkkklo}gnkjntnnmphmcpoljlpqpsimioimqpvlqqpmolprpnrnlnkltomnspkjqlnqq`nnolkrnnlmink`omqiikrpnlrmooilqnmnnqmkofjjppfkmnestlenrppoqmpqkqmjinspmplrlmolnkiflkqnqlsljnmlvrnnomngoqnhrijhmlkjeqomkpgqlglorpnmjolpohhlvnohnmnpkhoosmnsopmuprjwnuornlqmtporpunfmpkwlnolnuorzokmkrqopmopqeqkrvnlkqgookrnmoljmro|qmmooknmspmkioglimlonplirmnnnmnnosmkmmrooonotmnorklnmvolpnqsmqnmroqinnmoqmlolnontljllronuiojoljojmppnpqnqomlqqlqrnojqrqnlopltpomnpplqinkroonkrmllonmrolmmpkhsqnookcpkknkmmooqmmlrrjmlmsollthotnnpmmkmpnowoolnoopljnnlloosoolpmproqommmmorojiqkljolqjjogfkpjqnzhuspkkjiolqmsojnimtoztpio_cxfsklojqmktmmsrplmwo}qm`jumojkqrmkmplqdmpnlrlirxrjftmjTnmzqpdopsmpstlrrpqlmprnlrjqnjkooynngoojollptipppmlpgmkm}hongmoqmosnholfkkptsmhokvk}priilnhfhomujsljqxgkomnlkhgqllrmtoloktokkkrpkpopppkpjwlkrpinpsmmuqhrslsmvdnpmqtdfqtpjmmmrlcrmprnpmmmjmmlborhmgllooqsikqunmdoljroikljjjpvmpojslgsiiligsqqnlwqrqlnollpxngqnnsslpprkotinjnmludiqurulrlpfqqookresgkskqqpliwqimffqprqononmpklukeonjlumlmkpnlqpokzrmliuqkuoljndpmoqrnyq`xomonnlmhqigpqorurqmrollsnuoqsomminlolvppl_nllgpolxkrpuvrlfjpnhppimpomqqhegnupmnolxrkjquprnkmhqogqqvunvqupfpsxnpoqnzomhjqlnhhlnnpoinrjqqqpduinrmgnipinoilvgpiesm\nnskmvpokonsenooomhnsoknrofqpjnpmjlmqunspjoikhmqmmmvrinsrinwnklrjkxjllrnnthm}rnqoikdqhoplntp_wpoqrmnrtokmsipnpiqpmpkoflrnlolokqlkllmjpqhoksqtjlkmskhtropppgnrojhkmwjjmoomujrhnoftpnoonqmoltnjltrmiprmngvp^nikjlknpqowmpommsonjqmrkmelkhfsqmnmloomlmnepoorrkolqolpmpojiwjkqpplmknmqrompmlqopprkonmpnlloqlolpnronpomlprmkosmplqvosqofmokymokoulnmnkfipnigkjsjmmjnkkmjnsokfppolnonlnqlmnoooooonvmnmlmmnojpsookoflnjppqrollomplwqrmhogpoomomqullqmmmkknqpogsoqqoskmlufrpqomndmigomlcownmvlkjlhmnmppllgijnnugplomnlkogmuivllwhmllmisssonowdwokfphljokmqknnqlxslpmkjlkmrmoukmklmmlrrkovitptjkojmnlilonmwmnqimxlrnnqnljpqrmshokomrniqjngnnkqjmlhophijnqmglllpsqlrpoqrwknmmlmmkonknlooqoimoeonkmiommmhqlmrjpmpnnlqnomnlkkqnkolomrmnl^pooirhmthjriprpnmmnotnlmtomlrommolkmrkpoufnoomlqoobkgshumnokvmlmqqmlohqrlfpgplnmklomlosmmqlnolodfqkmnmmpimlqmoolmpqpqqmenkomplkqnlpprkmkiuqkopmrnknnqpmnlvipoipmlpmntpwitpnmmpnoqpmmokkmmsnipnphsmoomwongkgnlnk~mnmsilmornlqhrkhqgoglpmnlynhiyqnlrkrtiqpjpsolqijmk[frxrqjppiqlmimropfopmgnioqmijqoimqksqlyiwqgwnorgckspmnrnlohaiastlmpmjgnopgpnmorolukkummlspgjonjhnllpuhnipltlsu{ilkkfdjnnkpmlmnnmglnkkeltqlppjogmwhnjiboinpurpemlknqqplljolfpn{p^mompwrjrmspzsmvkikmirmir~nosjgknnzjnntppnomsmiqoonkoopkqgrinonrpoqoilppltnooqfklkhrqteolopmsimllsmmrlplmmopnhmhqgrqsqktbononllelpgnxvqpnjhmsksqlrlpkmlrkpcpoiqlqmmtgnqfkkokqqnfimsmdqsmnlmsnnokkknootlorpkknptmipmimmmopnkomuqhklmnpplswpnzmmlplupfklrjuoliloooimuplmnqpmorjhnqssmnipqkxonqofoqloqqikmnncrppnoqmnsknmokorphnnmoolnplnnkmmonmohnpnsknmsmrvnomjmqpknnnjoonqnnowojnnmlpkgkjrgnllolrpomnmnooktooppnklpnpmsppmlmqoknmlqmloljoonmormlnnpnrknppnnqolnqplmnprpglmlrenrnjospnymqoprmppqvolpnqplkqnppmojnmllonktshnmnnolommknnnornomlonoqmgmummprsqlmopoqnlmqnlpsokioumknoimqmnorowltopmimnlgqnnpnmgmnrjnfhlimssnqerionqmrpmmllnqppphknoqqnlpjplmpnmiokmqonnphhmngnrmkshkpmgtplkeknknkmonooojpomslolorjndlnmmrmomiqnoognllrqspioolhmuelomnnqlliqmopkoomqoinmkjnrnkoqpmtnnmoolnplqjnnorkmnponnqkmirqspjjnrjomnoqknnqqnmoppminpne|bnktniplqgxmmomnomromkfoqmmpnhplinlynhjnhppnklqiokpnsqolkmkmrglnppolnlolnuumqkokqmnmnoqonuqnslkoqfjjqujplphmpmnwolnkjmikplhqmoofomrlfhmnloippsoghppjmhmkpuoiqoqkjpsojqipooriklqpokpnlsnooihvnwjnnmjjsocpronmqllopspkponokmcmnpopnlqokmmrnplolkpnkskpqpniqlojqrzpntjonmmittokimleqkolnnngkkpkolhmlqjnrkmopjfluooifxpomkndllnqerojmlqimmnojlmemopmmhorempllmqplnpfnnsrlmjsqjjqqsponnsknilqmonnoqhmqmntkolonmlptjsllpnoimjlnhxnmklmrqmkolpnoplqxmiifinqllnkoflnjnllsnnlqenpioninslnkm[nklovmgoosqonompjhnkqrmiqodmmolmmhlknogfpmWsmprpmnkoynooqnnyohjpnpolivnkrnkflmomhjpkjhrnlik^nhnkrkpmtowntvmpkqhflsnpnsqmgpnsjtpkqjsqngpfhjoojxnrifg{jkjmnpknmmiltqprplkjorilslnvlmlpjpognhohjprsoxlyplloiiulplplklmnlpmgmmonqoknlnompkqpnqionksinnpqmtkokuqwmpqlqlsmmlwhlrmqnmqmlhlrlpmgipoplslmplkqnrogop^ppipjprjslyljoqfmdkmpqpiplkpwlknpmrovumpnjjmjloXpdnpkronqnooh}liolankkmmkkqnggopnkmjfglonhqprqlllsrhqejvkolim~qgkltuiljromhwlol_pljqmlmkknpkljllioriimrokautjoiipxkmqmkqlhtskzphkponelmmqlotpblormommptomgomqqnkkfo~nnrnrnskqnpvltopljspmmjfkqlhjcrpohjhmjmkljrvjsojgrqgrqnoqmpummpnjpneljnmprjkhpmmislnhohfpxvkmsklvphyiznpirqmnyvlookmrppgmqnkrqhuplvokopmsonkiljofewjgkqpnuslmilmplnnmskrttsmfquhmlnnmnrmpmlorppkswoosqpmkneslkqnnlrjnkkmltpjoxrlqiojskoiirmrlmqmlnjnnmmpnnrn_miitomcljnnpltmmnpnrgmhikjqosokkmomwnmnlnknmpkkmomiminrnolnijioltpmjirnnmpjmlmknnopomolvlqqsqpmimonpmihmrjoqkmnoormftnmliollvnpnopnlpktohkmltpjnroqisqopkmjllnfookkpomponoknlrlnndnomonmemtrmrlonlmmoomkjcmiopjjonpnrlnimflfmrpmqnthjkommnomdnpopqvotlmlwionorlmolnlrnkmqsnmolppklrlnmmqkpoqqppokgonqkrorljknkmjqosmkkrpmljmmqnmllnqgovprnnojmonnkppnjkpikgnq{meplntonjmnookpoppkrmnilqplqrmilmmmlpooooksrkklovlnoommlmrkqjuropqmimnjmqmhnsontmnowapnnononpnkjolnsmopiokoimmoqkmooongmommrohomonkmklrldsmqnqolptmmijlopqmbkmmjmonnmponsnonoqhnlpiphpmimtnmooomrooaqorlxlli`jmjpkoprpkqotlmpoiieoqgmmouonkoqxfptmgoqtugmntmqokdphkpooshnrmrkno{kspmjnlsllviooelpjnmop}kngnlmmnknxqsgvlnmowmpnolnnmjnnkhjmms{kojiolponmlppnitsjmipjojjotjmqjtllnhrqqnppqnnoqpjiqnpmdpqrijlrkknlqkmtmolopsllmoxlnspkhknhrmllioljpihqlmoqstpdsnfnoqjq^mrmtmuxeollotnprdiioglmxqmoignllrjmtqmdpfrpylkkjcinimpkjptkhpmnhjtmkgqpkknnkvolklmiikjmocopjfntocqwlqpngokgrmolistpkujnkmifkmnnpmplkkkmkjuirhqntonomvpodfslozlnmukxomnmelkrmoqnipvunpjgmlsptonwkkqspnknqnlmlmmjqupmpemnmqotdknijoyqmjlqliloshlqtqpmrnmpiqonokpimlopoorllpjimlkkoxsq|qpyonnloqmnonnoxouxugjlinkttmompkphminljuqppnrolelnnokplqkmromqnpminljssjpmoylihsippnkljssinllnnloronnjsposinniipikmogtnndnvprlpnsmqmlnotqljindkmpsmlmmiqktopnfkhrnpnlneionnmqqpprjmoodlmjmpjhrmpsnnuorpkmksjvmrnnpnomnkpioklmlsqplgnmpnwprqpnsiopooptkoqeomopnjnukmwlkmmnikqhnompoplpnltkqmnopluhlrrmcnlnnolnnvmmnonlpngnrjnvtrpokfjlnjmmnmpkmjkmlolmnqqpoqnqslnnqlolnssmllnlponpskolllhenplsopjalouomngqmiomnipknknmnfljopjsinqomnlnnjnplmntvlonmlmoummnpon{ns}pomqmironoontpnpnoronnkspkpnngnllhdhoqpolrmlqtjnvnlmokpmkjjolrlppkohlomonqjonoippsqsgpolrmvpmqrrnxrlponxnjpikorksprpsnqhpnokjooclnnjmnpqknqvgokskojdlnjpofpimkqpvopnnjgupujpqlsqnlukqlllrnloqnktpquimooqnnslmufrptkmpiqnqmsnoqpmmrunnourrhinjomlrqtnsqrnikmrljtostpnpfonoptojpmpqpniporxjfkpjslpkrprpporlnnnolnmmrlnomhnqyfnllpmojlojmrsmmnqsopossgrjluqmimglrmonrnjsmipohsprormkomnsgqimrpkpshqkrtlolqmnqnuoepklniXoowlsyjfimohrnpnrimorpooospol|orljlolpnmppmektqkgodmpprqiknleokrfqrpkinnqolmommko{rklslskmimjrnlgvpknralnkomjsplgrsomkndmnjormqkonjkhskjmmohkrjckpkmkooqmrtQosloonkmqegoqokppmlumnmmfolpmhprkolgnesnoqmzunoknplpnhnmljoxnm}mmmkhposmqqmpkmpmwjxnnkomoljntnjplnutkimhumpkomvgsqplqmonollplllmjomiqilqmlolmpqottklmpkmkmrlsmilqolioomopni`lpmgpnlonkqmlhlsnqrqplqojplokmguohqmmjjkshnllnlnpkpnnnmlljmnpmnmmmnqklrkmqqmonkkuqpKlnqpoqlmrgjflslkooptommoemkonnqjmrumnnsmrjtoqkorqkmonjnolkiunssijomqqoeplnnqqhnkohkoplnktltmrlnokxkkojooknlonmmtlppjnqrlknoggnnpimnttmomniplolojrlolnmqmkmqqpmotqmjopmhmniphkpnoohoomnolikqsmloqmmqnponmonknonumxnolhnnnmiomqnnmkmjplpnmqjnmloltkonrllknnlmnpooilnssonmnsqmaoqmkvmpqqqonvnlgnpmmsnksnjpupvolmpmvpg}otoknlpkhnjkukknikpknolosgmptsporokplnflgomoolpkdppqpplpknonq^uoqpmmppoloopppkmnmoqijornnornmmlhopollkrqnmrammonmqvnrqnnkonjnjnqnnrsmfooitpnnpiknllqllnrgmjtoliokhopmppmtpmrnpkonotsommhminoorimoplqpmmmjnjpkinaoiolmqlppihmmppssmnnntgmqmokjoojknknqougmnnueprhpmopmqlpinrlrknmllnooghlnmoloipljllqontp~mqllnpoipplrnkojsnpoqqljlqommgmnqkqnkjilmsregolmpjnmljlrpmvrpskqpgilnmlmomnpoylogluswnssonsmtnouonopkolmrpomjqronprrlkpnjqntlpmnppqmqjmmmqlitqjmmrtkokllsmjsnmqroonlknnimklqpjnclqldrnfnfnlmsopusnmolkknomlolrlhhkzmo`nknhonkeknnjwonnhnpmlb|k|ajomstnjkopnrgncvippnmssnsmpvim[ktilbpnfpjqllqnklpmjnnijhndsfnnepiqnoqknpnknnjoo`wojqkokrpqovnpdmouqpvnnqmpvnn|pmqohoolkorpqpo{d\sklcnmlnppoformmooljkoo\ghflnpqkoiysootmrfnlflprxiqolkkmonupppqmjtqmussjmlqnhqolomjmeknniuptermsmlnmklojmmmmriokisqjlnqrolmtpnqnjnnoplrrgpqosjltwomkoouoosfnlirnesrpmtkplmmqpljmpmvnkkmnpqmjokqmiunrnnoptolporkllpnjnooopqnqngqpjhhkoonlqoltkxnqwtqmrlgsppmnrqtpnosnmn^pimpoohqjklmjfnmjkqsnkooprkkmqilljjvmuomulhsmopkqnrdktloootopelblnnbrp|nrljjikonpmkmsrnmqpmpgUrsndpihurpjqionlkiobkqlmkppvglkolomhpnnlehkxmoklmoolrkulefminpmormoievknkpjrjinfmillumhognimsjtnnhmkkoilnmkeppnoofohkmlqjrmsmjrvpqkewtqqwkopothmoojnmrknvrvuloxpomqlookpnkltslcrnovllpnrmhlktlwqstkuclnkxpeoltkikmhpnqjlpmpmnk}ponlrnrtrnkkmsjgjvnvkfmhmrlorovklosxlhnlujoukhtqhvinskghmkoomnomemij_qrldhhosopmrkoiqdzmopmnimiokmouoemkkylmkkl|qmkkkojqlpsqptm|lopl_pejoimjulqiqohelqmpmhimtnqmqkndspoqhjrotnlqpolpsgxpjnlqhrrhjhigfmmloxmmqpkpsikkilmrmilnimmlilikkllmkpolk_ipolhepjWkqrrrklpihvjkpnjlklhiqocdspn{mltsknotmkkoriqljponnvqtjlkpsfgnljloepmjorjlrnqyfpmn^pykdkmihjrkqtmgonjjTXopmnnipaoqqdjhhplqlnflldmlosqopjgnnmeollmmfmtrilkghngpiltjnrmnpipinqmkbnmhiqxifoppckfkqni{mjukrrotoenllkvqkgnlmbjljjlmk]cmptuo|iomtlnnnootjkjicjqmnntnkkdlrnwgltkyhinpjnmgohenumwjvoqpornvemgkjakiarflsqjmrljynlhqgbmqhorloih{sunlrptzlnkhfutppe|Vkipijdkjthmc_oojvubk~tqmejplqiqmrusrhsepojoniicqglkelclrrtjjolkdpytkotijoocknoaokowdomvnqsmonvlkmajkSokdoppiolivpyoqoivmvnovkkmflcmgnhtnunplprpqqoofq]mun|fnlomormpp{lopmmkmlohkqleonprqonopmonopnormnronnhjwjnimlpwmnnhnnanmlomtolsnslnnotmteoldnolnqdlptlqppnpulpnlpplwppmryjljpnrpZnpmnynoqorpjqzljqnhmhjoojnrmmhoomqlqtxollqlijlkpqpqznhqqlponpmarmqRkrpkn~kojpnqmnhzphrmlnoopspqmimwpsnoomkpnqrimrloiqmxoujkhlkiolqqumqmjmitrnuloizijnrqqhuqmgqrbkmrdusphwnnlnisqtmnrkmxlkpiljjjknsyrosljrophmnldjmlnjinnmkoqllpjo\qumdkqzrrmimnpqulsn`pnqonpimdwlyninjqmsionjqulfnmnomlrlkpbknoukemvrbqrtlgwprrmomknlvvjqpglpWpuoppksxfnomolquzonevrmqtjmqjsirmnnmgqreowjniiiom|mimjplplkmwontlsnjp\goqpqrmmopokk_pmqrlqkqplomteogpolmtmsmomvgrolpyrhboruoem{mmq\qogomlpnrop{olro{{orn|fnlmpnoldllnblmrlkkqolmnpkpzkkmjmmvoqqkmqormpmanmrmnptbygppnmraiqimonnrgnsno}polnnkluxdnol[mnozhoollosmkqdtnknsjppuqqkirhbs~kitzklrqpinhpknkolrgoooephmmnlmrotlcpkmasompnwqdronoljnsofrhqwkspojnqrlnmnspkgploikqnmlosgnpkqwpznohiolnqmlkqpogijmplnnnwoktjyomlrsjnumnopmqmhkghplnokoolqrknqimlpqmpxofgkkrmkrhomlnlnmnoiqgmuknmnllkolompkrmnqgqnnkqlm]meobojdnmimjhnnpkvdop^pnpozmlmgqlskunaqihnmwomomooogmmpioqrorpnhlqiprnhooqeanmkj^smnomkshlvlrqcloq[drkppgpmnpsmoqnmmesikkighdcmgnipuwnnlowkppohefphlnznqmqpnopzosgpsefjrllpjlmlqztxrqloreiushif{mlnmnqjobomfnokhnnohqllqhscpoitmerplmoksoknslekpoqylvrwqqnookntrppherdyjprmantmigtqmljkinlomrdbjeksozpmtfjomq|jnglknnflhpmhl\jnfbplonvmqtrlppgoqhjriwpmuqllrn[tn~rpo]esjky]olskojpqzrmdhrumoiwkduzsinuyj|jozplqlmkkq`llnqlgvgqtojlpapoljlvcfpaljrf~qntw|{eksfniymskjypknjrlqrqkqqhvnrmmo`iiomlegklcophjrjmlxqtmioghljptlu~qnjgsqquqlipmo]mhulkdntiolunomthppiovforlurds~bbofslnfxnbpunpkto~kzmigqrermcammpmuqvqQsihinrlmonklljpljmommjqllnnqoplnjmkkmmnplmrmjjqrolmnfxmqqoopqjgomfqlkrojmnpdhswvl{ljkqqmpmqplfpvumlkrdojnppplqcojlZrsfojlrvnmrlnmvkmfolmifproqshrmolrnlopmlinkqvhlnklpptolrtlhgpnzloqpmmhpjpsyinqmnpnhisnsmhlypkktkkpjphlmilpmltrlpmpmoikmiqmcppsijpgjjjwqrpktjgkolmoiklffintomopmliqdsqnmrniigkmklnpotqkppsherfisiposm|nprhspepnnnojlrimsghoospdzrnourlminv{juotkZsnsplqdm`^ccikjllpljjpgnooyimknomho_kstokouprjooljod^jmnmriwokhqlingkrlpsomynlnsltcnmkluxpmjnrqgovqfqdmflftnfjrmsomhsqosipsrnd`oorsnhjolnmlnupkmjplomsarijmniqthkpjhmknqiinvbnqglopomno`lrvet{pmvpnvgqjpamrmlmnrzjqoskynpmmyqlommmkitkkj[uqqmilisp{ttmyumnnfjjvull}pkxrp^mlumpxkmmpslekmjq`mjqhrnrkrogkornusmkhm\oclxvxljmkfoomunowmsalmnlklmole`mnjnovmjnmufkkdtpnxpsrmwcqpiishknlknoloompdkkunpdjrsiwk~sefnttlken{k|qnh|pmkqopktqiicilknwqnkkoqjmnoopiigqmhmuqummutkogoqmjlnrkjnkowohjhopkkrjiuhrjhnhniiloomiQr{gnmunrrmsjuonnpqjnlqlbqnolnok[nioqrlqdlgkljkqjiqonpkjlhmrwmllnpqipnmnjsmkgqrpqormgmnjnlkkioidoqfqahqlimqilumwrrklqnnolmmommlrmlkqjmphpsltnhppmmkomooknqkhnqkplqpllojknmo\yojpjpmlfonoqkmhnoknnmkmmolmnhllknor{nbokpsh_inlkspinmnrkngrlsoorjn|oszla]nqmijgujnllpsstoypnnqmvuppooooqophmgopmnpoqhlokqqlwlnnnlouxmmpnandmmnjonqmonoonvcjlmlpqjrmmroh[kasnokmnlg^kniclnmmphljsromsoixq{klflmiklfoulqnjkpsxknnrj|mpmnfqnullkoqmqzlln]mglkjmimopn`nmnhmmnojkdmkployqpsnqonlkpmnmwlmeemjrlYlrvlencnlmkto{oolrmkklznwvoofmmqgtlqmnqnnelhnohnompmtnnorkngtsilfpkhqnqkmsokmunorlvrlnklgnnknmmsnqqikmkjknool`donmqjncmhnnqnmnq]~rnophcxnllvnmnohimnrnnznrjk^hooqzmnnnlpl}lnmnpmtxrnmhogxlzopjnTjvmnsowvpmljprngnmoulntontmjoknojmmq|enmsnnwmllmsqdkmmtipqqqnoqtnqulolgotiqnouksnnplmnolhkgfjioxprhkqmqoiqoksntlmjfswmnpr`plh\mmtnnmnoemornknojwsppmklummlnnotthtwpfloe`knkknsyollqlpvcms^rtqnvhtqqlmhuus]pwwlknoknjxionokspcklhromlrklkonojjiknqptlmlvltlomkojdoqfm^gmuuqoooqlgdollkqrgOhot`ejoi\ztgnmokp`jggopaekzrpgqfssoomjnkhjnmbxqljtdprlrvkprpnnkptcvl]hltmckpvj|kus|gjoidhlejlgpohcZgtrmlr]k~nsoonpmoiorlfmjmjlnnmqogktmvokrhppnx~qvllertmqcktpijofunsfkmq|[nmnnstaeijuibrvrUluprnxn[lqixqjmgsligskknlPoctppsigphlitjtz`kltjmrwmtkftpmpnknmkqxolpgopnsepkmnoqlypprjookrmninskqbepnlpgrlrmurmnnlnppuokplpnmnmpiomnwlmlujkstkjonvpnplltaitpmoxynnjrrpqugojmwmmrnolmlolhpoqvoinlqlkrkktonmmspYknlqgnkqiskqqqsmoknpuslhnquomnjioxxrojojoplqrohpknpdnklempkqlrrmtvqmjlmvqmlhpsmvnglotkontksonkmommmolwnpollrjnrplmppXjonomkmonojnhojfpmlppmomoocfommpvmmzqi{pkmnnirmromqulnmjlsqo`xkpmofk\noilonnrvngmZdopdj~mmmoomnuqkmo{kpomqomwmnkkjosmlprmqUuornjrrmjnmjorofnmsnllfnlomknjqhuodmqtnrmvrpnoqjssipdnolrkhmnonogkmtuokjrpiopqoplmnnfplmpnplookqoilsnopnvrmoihlmkroornmswinpsqqlstomoqskiqfqolnnhmolomlnmqnrpokopkrmmonksrywqokkojjionboqsnompttnnosqdpklq`lkftnpklirlplliplvkrjyequlnninnpmqrmkmmsolnplpogjpmhonjojpmmhgrmnonhmmjksmrqlnqmmtltmmmmmeltjsrooongopitfilpponpftnpqplxnsmrpnjpgmislqnowqjgkpnunlnnkqlmnlkllkjkonnosuqknmniorpohhnpnuqtmkkjosokjhlpljmnmoiilesihojltonqnqbkfertmliqmllokquxposgimhqpmhloqulnptlnrnhnlbflyvitlvqvxpmuokgoiqhokqnlmpipimnlumpeptopnojfmbmrnmlosqnprjymkhiimpnmqepkmiwmqumjhmktpoksnhjhrsmboulkkrpotrpfgjmiplipmllmhnjnmmnekphotilopqflgtkpnlkpktholmhqqmtotqokqksjhlpqgfhnjahnrWrsoslgmkltrn{iqannnnnwumuuvtoiqqrm_vsqsulpsfpmlkfsumbwoklqljllpnoxqqvt~xbpqhpXs`jtmmneowoTnuzmvremuos{ftppkssmlnbpxnjrmprpqwqnhnugdlw|qjqrgdtwpvs{tlwwnf{sqoeosTpnrzcgdwmotejho`psvkmnhnjlexriorsilrjmkqhXicpkktnnpnztmkxaqsunoppqowhmrtkplqroveclillnkolrkqrllnuquknh|cjoimnrispnrlvlnphmrnknetjqojplnncjplsllqlmpipopjjpjnonrjlpmhqmutlopmktlponqurckopkqukoipovjprelmnlkjmntlcnnlsvlmmnnfo|sliipnphrtmsmtsmlsonsflmpkjonumhgpmilrmjslrlompjoirjqfqqpjtzmolpnpdorkjvnyokswkmujhmingmjhnlotmrkrncgllnoirpmqkipznsiqlkhmvwnohvklkipqnljqnllbmelnlpn{ovWnolpnmhpqn]lgrmomnncnpclqjlkbl}owmmonlnmmvitnoolnqkookpojpsjjzpoomlfngnnomingiooonktkummslqrsmnqnkpgskroto`ronrmis^pdkankxmuffnqrmqhtcsmlnonlkjmkjpnpqsjnnjrlnprmlipllZmqnnlnqlllnmpqmnvktqpmuxmlipgmnkmjtjhqjlhplmqjpmmvlunrkjqprcpp_omeopnjnnirpqblowqgymlsrkepgmqmuncnplonlqkmnojn|jkpxkkltoojolqqkumvrffnmnvlpkllpio^uqlilvsvlmimoepopsmqnsqlmnqhwhoroin`lldnmoornjhpp`uomnpilcjuqfprlitahvnlgll{hp|fmsmldkjnrqsmmling\of]nponjmgknlnnokolmqonoxnrimuppuitoqmptipikdpmlzulrlrlkprkqzfhmojkof{klptqgmmijopk|olnqqnqtllrmipqxnrqnnlpmsmrnpikvrnqomjqrrqrynrmbilr`nokphekmmnvrfmopvuwljjolfsoqmvnlpnrkkonlnmqogknjtqjksorplylpvmopmtlcgirjjj{yyjktqllnmbqlhidlimsumltomqjtonhkrnilmjqypjrtmgkegjruqpfqgpnmnsqnonqjllllkpjnliqslpolhomkpoufawospfRhomuooyrmrrvgqeimlnoiidqjnwy}wpnkpqwqmxjiinhikqrpopok`ovkominciboaszdgqunjnkkflahskfufnqpwsmfYjrhyqgumn`}nflzhqjmvoiniqdqwpl~d|gmnlourqqmdTpirjkoprnujnjsrd[dpkpp{imlokljlklonajlpojviligplou]skblkemxthioipw}}ifwnbjtpmzjls|olmielkvsqqosnuoorpmojnfkoqok`unpplornnollpokrqgpnokmkhpopokylkmjqvpqqrnlsgik]nkllnphnoolmkmrnnllxqmilnrjdojinjqknolylknmmkloklmhpplsotjlosopqljnyluholmgoynmhoqowntrmkopk{pnrnmofnmnhlnwkotommouikqhqlrok}gutlnjonlkg}qoor{doqonltmkonmi_kn~kmvlogosomqlkomopnmhiqqkjmopnkqmjjpkpkpmnmmsljpojqqzpfwkfmqklokovnmmlplmnrqfojqmupojvnrkktlnms{rmqpsjqpkpompmmmmnnmpmporomiiqqmprjnpgmiqrpmpjmrellqgklgiqppmdnqoqqtqlnkskvbooojnlnniuqmonipkqhmoopqoimjpnlpppnmqnlioltigppqqoshnqglmnqjirkvpingqnmsijnnkfsmropsopkomqkpdmlsjjknqpoplwsokmpipmmmkiuopqklpjptrtqrmlklsl_mmjvvhkkhzrknpqjpgmlnnkqdpspqpprllkgfprjskwncwkjmlspjjcgoqjmhvlkplqcdrtoskknukvohp^mlpq{sq|sipemhknoatjqoivkoroowhplgl{pk`mqkjnsklgpmmnflsxksqvjksmkkkjlpngnnhstlksilsmoekqsnomuijrro`mnokpoup^t~mlpmmhnjpilhonpmtqslmwgqrmgospekhncljkjskoqkplsjipxmpmohmcnkadqr^klmkjgxipopkqiokorkfeluonsvjwlpkeorrjhlqkkllftlpvijulpifkwljnajroofithippumkderwmnqnypjqnpnqpnnjk_glolqdknborsiorilortqftolggmioklelnippmolmq^lupmmlehelgfmustfrmllsgkooicnsmhigmqmppkkkoqf~lxhttefvinohrfllqmuiqkoggirisjrllokpojdmpnmhggfnqrgmqkonkvjkorjvrnrmqqnksynmkomdlppnpljkomippmjkpskfihhjltpokvlhlftoljtluhqjkfprnpmlnmojujlgnkkiinlhffqlkqrpsmfsjofglflnsmklom`irpqyoolgrqjvmsrkvomrmklkdgomknmunoqhuqljhtgnqnhoyrmgjhquvnoqlilksissntonrinhmpskrumrmnqhlkkelnmronstmmqrlhmkvxojqllmmllsofpmmipnojltkmhdshmi|yg]]zmejhkgi}pnnho`jjpodj`d`jkqvpunlmoqigpbo`kulmmoeprmtjopdknmukplnhmomokxoaoowkddpuptlldmpenrrnm`nmlmpYnlnmpkppnfjpfmlqqvpnfp^hrpklnlnimngglpj_pjlajkmmeihinjpsqnmmkjgzqmtlnqhqtzl_mknemrlhwyq]wkwolpgnllnonkmnqmpklbrmjkinjpil`llssrolpkiznpbggk{lttqgqorklnlvfklmknnqomqtpknn|knrmoonmkklmigpqorlwuororkkqjmmrllmkjnojonmnkmjsnikkrrrmwhpxgnngufmswnqkgdojomoqnhonmlsmmbpslhnnkqnrnonkilnjjpkqnqkloqinhoqoirmtjoqklqknojfxmspbkm]oirljqglrhlloip`omilnqmnmkqmliqnforlmjpaknqrfokmomnnuknn`nmorlojsjzusmqnrjnoptsjpkeqlqhlpqszxjppgjowesqcmfjrojskioficobo[lphiepppopurgsr~jnnktpwqigdlncqvugnncrnkojom~lyfprnmjduwxouerkroujmxikri[mgnksnkVqpkvdonspkn{gdpmjoonloltlspmfpgnlmqjxsmlynsmooilrgpmnulunknqmo_ujnljufvmmqfcggmbfkrlpprmnnnip_lmppcimheomqmesmjokwplksmuspahpkkolfllkoppjulkvlpkgomwpttulloxpnlciqimeopnffkinnkqgyppltpopjmjloonpmsmnk^kmpnxmojhnlpmdhqfpkonxgolqrqvqpupkflsbtjhporrljpgqmqqmnpqlhwcpnyqloklqpkopnkmmsjtntkkoooctmmrphlqmhmpstolppghqnnotjlnsjmmlnf]pqnmnqpsoniloinnkyuppuowgnlqfmpeihplkjhrfyjlnnoirmfmlnwbgiolmrpzjqbmqomhdsk]djepodik[^hlposndjdhqrgenjspmuymmjikikgnmnoanslhnmqkmktjrgepknjgXgimjpkv\lrijhatqqpql_olniqioidpjNXdknencmlmpmgjmjodumq^nukfcnerkilfgfhvlmpgpnsllsiandlhnpzumonmhnoVjsmkBrsrffan^hgkmiglq[zl|tltbjepupjwnjjfjhcolkek^unifqchnrhumonvzgpnilhj|ig`mkroccpkndiiifjjnljmkpgmpoqinnnonolnqjnn[poylnrjwwkkdooopponxkmqolqmppmltpkpks~jnhxnosrpolqmojofoimlillpmpkvnxlpjiwkmsnpmmqprpnzmqhnsminvniovnrlijlljpmopplllqlgllmpqmlpetploynpk_sxmmhgghkykfjnnnqmqjpkhtonflpbglvllkrmpnznmnqlplfkqljjmpnmniqnpgmqpfgjpprpprsrnlykmklozfrqfrtiiofsmopnltpunmfem^punslqpmmqanlkoenqpmlmpnunqokmjnjtnjlepiwrvxoiq\lnmslghgqwvjopzhjplqyserlmnodplpovmhmlllsnqnqhonmljpolmgrqlrdhrqrqkynqljytrhknlejojvuhslvonpoknvsoikrkykkfmntltlpskuiolhoqojeoxalfkoventpqrpuqhliwqmromkniqaqqjemklifnwkjuu{imloquklfprupqqojbrpikhotlsokqkrnowsiplqjmkosnnmjjflotrjpsrsnqrwnloemoohopmtqljnppxoro_hdlfnfovomwwomsuikpunmprrmomiqmlmmnnnqoo}ujqrdkolrmmfkmjpomjjlnmmnsjoqlmkoxocxtpqnnronhmnvollw|nieknpjeemllmmrvqprnsonlomlgomorlanl}kmimvrrrkwlnnpbogororljmlqiupfqgluokmolsfqlmrnqkmqlpoullponsnnlmmslrpghmppokwprjmomolqmolbooomlnollspqnnnuijnqsllnprj{ppjknhlsksukjmpptukvooksssonpplosjojpnoqulnlqrqlhlmomqqnllljnlmmkjlulfnqppppnqpmpumnloumhjnvrvqojljenmrnrrmllptmnpkkomohmonsjnpllhhmmpjnwjpmmmqnkpmhkpioonilwqrhkpkpmsqlopkplllkwmkn`kkp`momoomloklnnxlprnnlnnominjfjnmohrqdgkp^qanmotmpmofmloqnklmilyYhjrhkltluknsrnipo}nwvoopeljrmnnlld|olm]mkhoikmhipmjmprllmrnjbltloqlmoqnnoolmhimocnmm|onksmqycmncflzkupdrwkolgjlmhopmmnjknlvmnlpkqwfnfmgkjlpmnoomonmnklotgmllm}wkkn|omqbvlhxrtupjjdldonrjeqkpmlhmomiqoqsimmjpqpjqpjpiqloprnnteqqnqolqhlouentmdlnqrrojlwmlrlpmjohkntpjxjdpilplslomlrvdmkqrqtmrpojdohwjksupjtoonjwvmqlroqskommojkqngmtnjnmkqknpmnqlnqtlnonhglyrppwpj{qejgleknpkkngmeuunothoopmpspllvnwrkoknpomkinrpokmlkhlnnnrjonompsmokhlosulbipjtnokat{ilnqpienkeoimmmisnpvuqsnplglnho|htfkkhymvyrdnhptoenky}pnooqmmxuqiynhqrmfnkkotmmlulghpkmlflvwkkisd_uhdoojlkeoihapspytpfhsjqzkukjp|lfrhsidginnprhfgpuiqomolgrvjsmishumkfrq~igwpvnogqpngcsnpmtompmipnwrmnmlmiklnjkhrpgqfwu~rqjqxllngpjpp}qzklhqnoqkmudjksjnmohuslgjmpomglodrjomjqkknmnhrlmopmoqpmmhjknoqkqt`ojpmlkjqepvsrnjpopogmhtoijjlkjcmmohojjiqpmrugjmgokmjvoolmqnqnrruotitfqqmgjlrpjojsipplnjonjnjomhmolnpneonkmpmiuqjpkpnknomqmlkmqpqhqvolrqkifmqdnllmnbomkqfqkkmkjopkunqklmmpjxlkxnnnnlomnvmgomppmiikmnuneskhrrsekmvkkwpppmo[iojq{nirylmmtkkfkikko`bnpoumilnjtmpiqkqnnkmjurrpsncmpmfuononkpmonlrmlonkoonnuunlomsogenvp_oommqYooppsjpVosnohqoxllqpjtpnrqmqkopoqlkailntoslollxnnnjpnpnnnfhnkpkir~puppkjompxelgpmpnmpnlomonloklpjmnojlo]onxorfnolnpqllmooqimnuoolrqwnmnmjjnZs\omonkmmfliotglhkcrlplfimoiqiojmokpniomikpdokiksrknnml}pgkfjkfekpvkmkooomlemyixqoilonjmkqhdlsofilugnvqmo`jmwk_prjnelsillhklpjijxptkkmhlskkioomihpiqioyhjjnonsoimkokqmhmnnjpmenlmgmllphjssljflrthjrnpkhq}njfpnqhhnpjdsnmqjlvqpsldprtusnyoomqhmklnqmqnorulojqowptqopnnmsugkmgsjmmlmmrprmcpkmqnipphorowlomnmofnhoprqnjmiiorgvpsrnjplrmtonnmpxqnvqfnlplipnowlpopkqyefnomrlmkisthmklqljpllqlphlthnnrjilvkrkm|klqmrmlrmpokprjmolnnloekmrmqprrpjtlnupmloppkm~hnnmpmnxtpplkmumtfqremslnofomjlmmkloiypxtkrlmjmlpqjmpprpmmslonrsovohojrlmmqnlnnvenlqlkekmkkqlkqnrqkljrplnomqlmusobtmonsokmmrwnrqpojkfddrslk`qoldmmfomookiolnonieiqnnol|wkmvloljrqkjhlucqkkvzojmpnqnlkqoejcnpgmfwqnoomrfmkornnoonulpnsnrlzmjorhoirliipsemnmullkiljmknVlehijulnlngfknkumronmjmilmxoxdupjuljnorsmpombmlonmnqvnlonjjmpjlhoorq{lnrlkmgolulwlnppfknon_qopnrjookmelnrpnenploonqinllnoyxnslm{ip`rtpmsopoolvimsommoophmgnromwmrmfnmmnnjqlsimtpmoknplnjopmnnotlopmupjxlkqk`splmplehrppipbo}vnindlhpmhomommklgnp`qnmnnlpsknorqn~nnovkmnnoji~nqkfnqnrqmpopnnoeksuvpkplkolnlkmsnpolnnmdmoppigompn{np^bijojincmqksipomropmkrsnommtlpnppompklmnjflinmlnqnmrnsurnmmmrttplj`omkxoomjsmripmloonm_kiomfimjrzwkrlpkpmtrqljqnmnixnppklkoxsnljwlkrkoqpormjpimhkmonpobi`loonmoumpsllouknmjoobqnkpnnpkinknrenkqlsmmlknllllkorpowpnhqnolnrZ]juilrmolqlmnrnnmmmonnlomgkqinolbko}mgkrsojgpklnrnimnntookmajnnmnpoeloiltqln[rnkmlnkookjnpjnp{olvksZjkxlpntmomjlmprqjnpinnbnpnkqqmfoxxnooqompanopcrnpnluoposqgmuppjniooloqglsvpmmsmpnopprnfiolookomnllpmrlhmppopivkmkmlmkdvtojllsmnnmjhrlllt[ljngqsnsnojioqplmrjhmkmmepoonnqnhmslmnnklqmn`mdkopommodmoormnpqpnmtqmgrfprnpvjlshqiwvhrfsjpqmnkhqlkrkliorllpsh{sjsojmkplnbjupplolrijth~jolqfkqmimllvfepiu{miognlstwdngpryhqtmqnjglkopnmgkssqupojfmodjlptvltjmwtormmjrnrkponqnlmffpnrkrluifgmhoknrmrnmqpioilmgsnmmkgvkmmofsoljqfcokqrgfspmplqnrqmoopllsl}ojnsloi~kklnjuljqmutnoliiggniolomoqprpjjmkokonrolprljpmnvmpnnopnimsoslipjqomqmnhn[kslpnomwknoljmlovmlmot\iosmmkukhqntqoqlkqt|nnoofqqjppspprulnnvpnjjimm_qnlpfiknkokjnlznimqnqojnopoophonkmpoptmnnklncxnltorzmnfogmkmojrrosjnsjlomnfqnmmonaevmnjmfqlkmlmrmnnlnnqmjllkdnpqonjomenopmleconlsnjqkdgjsrhenr_wljyfdliihxjkuerporrvkrsfgvmpnqvmttqhnjsjftj_jtossiriiiqtpsqqgvrglrerprnzmysurolgfsuvqlogpzstrgvmtkrfdpojqtoqmndpenlp{mnj`{luilnisjmqhqlcnpdodmiqmusjmjedtmpoukmlnmsmpbfniocpkonsjidmmjzgnkc``qrmojrkoppolodiklpnjpgomogcjigqg^msmms|qrygkklmtoosgopp`tomttinohnmmuhjxvvunooomohmugjggnrnmqfuqhnuqenqhjsmrjiknholrhpnmqntnrqillpotolknnspoknxkdpqnsspukipkoyjpjhkoklplmmmmonkkkbjpqnylprkvloqlnlmnutosnmumkmfrfjpmogpliqsprmpwp`kistovlkpbulnfkimm`jmislpmncvmjllnktnkijwjipiprgmidpokrlmjillnpmmqjpmrnrmlkomkpmznnrlpoqljnnhmkkloqhpilqtenofqogoppnllilnqhlnooijnt`mbcrpnionlgrponooqmpkolnx}litoqvdnt}orqpnemzqpisnkkvlmmmkhkdgoknjgodlprkdjnosqmlllmoonut|gognonsqojknnfmqomppnqlsnnjo`xjpmpnSowjjkknpi^uno_qonokgnqlklkmnliw^Tqm}onkqmnlsoqnlqlpmopm_pikmmnuqmvspprpxnluslorsijohlqbqnnphoq]poindilpnomkkloznswowvlkjuixtxfwojyltkjrsmppqenikplmtndtmgnmromdqpqnxoijoplpbpeoolrj}uarkerrnltr|xnnmpjtnkqplsskmodkppjilirpelmhkrrolotxn}ojoeqoqvysvlmlhkspylsoqnpnlpm{nkvogipxtqgnmnsnhoomskqpiphu\rnomyosroonlkrpqkutppihjsqqjjpgmorncmkib{oomotmqtoploojnopnjk~nsknnqjnmnnkpmoqpotmppmizqkwnsdnnqpnkm~hnnkjqmjholfn|bnm\qnovrpolqnprfksnxhomsvboonnpnrciopuenmjomomfsrnqjposntonkbvnmnplnnmmpppsnrlnlmoqrhnsmojprizmbnorkllkpnlnnhhqqhoqmqmmqlqvlqrpjqz^ienlerrfjlsluorlorokvooocnmplmkkonpirlnijkgrroiqlgjqoxhmlkskmmzmqnpmmmpvwmormqmqrpphimmrykposn`hlqlskoopuokohnnomqposommvnrqojvngtpkinlnnkjnlmsoqmpuigmqqmsqisknmganqnhnpkljpmnclfnnkpqpddiimrmnkhmmjmlnknrlnunrlkmmonpngmunmkmq\rjtqnjlnipo_jpqilsoknlokoolflctspooqrsmsmmmsksmlmrjnnwopnolpsonuuknqnpvanhngo{nqllkspuqvtjqmooojjexqkonomqjplgprpvntkrmqsoinelkmnocpilponlkponipmknmmk`luefdjqfttmmckkuqgrlstsqqkqomoilhsmmjlogkbmsojdrmlnqqsjnojtlrmocmpnmlnyjwpltkhljojhppsnxnsqpnsgsiqrpq~lwmcjvlnj`lsgopnmqmoononnngpreteedkpojmslqpnonrnnknsmjmkqdjwllqnrlhrtrkmksrjnpkrkrkloqjsmpprtlmslqumsemnonmsmgnotnnswdlmpoekpqsqplqzknkmpronnszmlmomnjloqjlhxonoqsmjjvioonmknqqhxlorjoinijlomukqmqypkoapyokpmoqnspmkinlnpngoponmhominomvlxqqpsqgqwormmpritjlvptnqnttprmmqrokokcmriqrrqruhmfotnomjnrsgmm^likkqonpllnmoqpnmmnmqojwqrvnleiooyklppjbnupmmgrksojpolmnsohqqooslmmgoojoopoorppmqibqvmlqpjvpdcrrnoopoopmoipmnqmootmfvndruekognlpopnszitscnomoiepqqpnlnpiqhrunlnmscosjnpqlohrolnowy|rlnjnipiggdqsmmnrnpoqjopqphmowwlpfql_lkwmmpnnpmigoj|mpnnjnonqjqomqleojriisnomqplosltlonmpnnqmgoslnnrlnm}xamonputnhgnopdgpghssmlnriflwgtspwafqpntlkdpnh|{hbhammjrtritxzigip`{jonPnqzxmnsjiljiprkpqoqtrmjk_nrllrsj\thmhPmtTkjf~ctuky|udjvh\osnojvrjqbprghuovrpeoksnmwsagkhtjnenYjptr{xionoomqiuppfpkrkjlimshmrpluetvjwlhrfjelkojpaohsuxql|trmrlpnlqsjintrq|njqiolptoqnsro}k^iNqsgnjtmpcqrbminhonmlenwnplrrjbqjkrrljjknmsmqkpojonkjrlfpupoonoyunnjqlohhnnljpnsnsrjhklmp~`vmnsirqskocqttolnjpnorsejqtpsmhrlkmttmkknnoqkgmiqqllolrelqvjnnsdkepgphogpmtnjljnmsjmkknpeqqpdjv_ohjmportvptkjppnrwojtpsovkqojhgnlonpwqfrmpoilkrknrpipmyqvkgoulqlqsnrkqmj[rmmrrVnpRqgesqlopikqorlommcmmmmhnqtoogrelksmwmnnmngjogknmgprltwjnkpmooiojprmpipohlrlu{qgtrlbkpkkmetllilajkonoglnjhnhnngkmmibkomviopvxkvnqnjtrqqebprskjqtntniljlhfhntoqcx`ptqkljrgmnpqqqhmgflhbbqrotolianozsmjnruirym{vonuklpkzkri_ukrisnqjqrumjueptqqkwrmmoqaiphowqrnnomll^kqmiontpkrqnd|ovpklnnhnrolxmlglgZklikllkxqanppipnvormiqlloppportftopklmuoolopoohwqsnnmr]nloqmhmqqphogprlrktnljpmowlopllglmYeluntlnphjpiornpqsmqmowdlnqgmmsxsmontmciloillqkkcineenoojvnmpqomprlgngknh`rniiknopnppokpnijmmgjrmlqo{ons}pnkqkiqpoolnnlmolrbllqfilpvjskgilimjolnbnipnkollilppqwombkjfpnqknoklnoqkktmhmplmnmipmliioijiditlnpornkknqjholnpohelpnmikkirmlqWmlinmimcjmmnhmrfnqqkld{shotlnnhnpspqpuolilnliopprlkbgxpcjnomionjtlmqjp~okorqqnkpnmlmocqhsmhwfvnblojqmpnqmqmjlrmjlqlmifqoilonmnglonqp]xllqzmrppgnyilln{tppxkontpfqoqknoikq`nlnknkiqorvojemonnwzpfpmotollosomrlpplmnkhnvpngkpposskxlmqnkmoWqsgmkspconkmmumqkjlmkurXlivnfdsjompkmmqnlmhnigmmonlpklpomkjnqirolxhlopnnrkjmnkkqilgqdnemmlswumqknplmrmmqmmnrqirmmnnoqhnmnmllimtmnmonroookiltnlqpplxitnlmjsxmomoifmpnoynkjmbnlrvplmojkpmkmnommnoonljjnloppvlrcmohju}tnnlmompoynnlnknnmoondngcpvskrq`hqoqnkjplorpoulntkknmkqmnmvnmonhnlnnsmkvmltrgqkjnkjlninzlmqqpndonpqmmnoonkonuhomktorirlnnokXpomqo{nmnshgrfkmlnklrmpenmplgqivtkmqzlnlpmhopnjmlqoqslonwenlpknoknlgmlrkruiqnhgpmngkoxknlprkqkrrmpkqjfoomlnmmsmmomuimolqopmpomprymmoouphnoosinvinpqssnjulnynqnolp`jormmrmqdmitgvlnjhhpnnlirnvdpjl{nispimnkllqoonklmollnppznnmkhmsjonmmpompmsnpgjjloppiijml]kpkm^owounnplmmojqjplnnjmlroqmpnkhlopiimrokporqcmollmnmpmmnsokpmiojnoxojoljmqyoqpromrlnroplnrgjqmoojmpnlwpmopnhxmvmonnpqtpnnnWmmqqrknzqx{jnnsnmnjsnqrennntnptobpqcfpjmknjqpnnopnolvwljmntoolmnmqkfokimooqmnmottoopzqilqqlon{rmogpmistpikmpqrnpmpmh_mtmtjlhnsdmmkoe{jqgmnmhkjpqnhmposynkslnnqoo_icopmhqohojnnjoioklnpqlpjpjjomqnjpne{]nqllypqhqksljqlmninpojonopnrnokokpslnnoxo`kmnnorrommhkllolyigqurbolokntousommnnnmoontmmoepoiginmrjpnln{ltpsfomjpumplhspnlkoktyqocqjjpgepnjjnikqilrooi]pmjlppkrmkkollsnhjnntwmmplpmfkrlrjpomskkrdnmmh{fmohemqlkhkprknjkrnvbnrlphomknnsqnnqonpnkmpnpmjfppgmkloslinrlqjoiirknpoauonokankfmjjgkjksgdpljlmqnnqtrmkm^kcnlgjkplej}mlmljplbkrlsnkpotdfmohwlkmgtfinmhppkgsmhnpmirkllmpfmzlmngqknprmf_bsnmrcjsfyokqsllodrkhgllnmimjrmnrmjlpessormnqlsdgmmtpnoklrdnsolgftginoh[qnhqptonlosmhvllyhmxqornoluiobonllkmpll`mioskfknonojqnsojrnnkknnkgofnlstilkqnmipmenioneksjkmqckqqjgkpgrjubqnolqwyq~cknhrfoXajtiroclehowjuonnpflmllwetrorytnripwlomiry`nngppgttgglzpjVh^dqufhphhsouqmnuksfutlipnpwflipiiurlsklke`kpkorpqhjlrqotWissrmuloomkgooj\pwliatkoklahmqimq|nrpmlgkivpomngpqxmrjqnyn]flki|lomwnrnmqj}qphdtmlnwkrmchljgnftpgotpxq^rpjkfpsnommkuhsukoneptqmorofkomfp_nshqksnmlujool\knpfnoonpqrjjo{nrwnnjjukmiirr}gjdrjhelklpsqmkonplrnmvkvookvojj{pfglkgspsooklkvxo^unqsvodpwsmjnurnohnqjkqonnekfksmuskjqiijmkononlsohrrvlvofdpvilqpmooturjmfjlkltjoqjqlsllnnrqtrmujonnvkiputnqjjslppgqpnkn`llkaorkoo|mnfdkzmloljujmojfrmekrarmymq}myrimolwrnmnlqononmrnitozplhjf}osmpmnmak\tgroolukqrnnmjnknvml`olflorstnnqoqmhknjnloajjoonotmhmnmmmkktooinlgalqmnqtsvnpnjiknwpglakoqlmdopllnlkoknkopkmqoj`pwwssqlnolmkwlolmklqmknmgslpsnlnnnexdnqzosmpkkhvkqnpnlslnlfpslksooppmppsplmoklzononomqpppqqpxllnmwwrr}nqpsoumhnmhghnmmpnokmohnlyqncygkjpnlqlwsgmhfopjryqnlopiloqnq`mpeqiolermnopokpmhornkmpqnyqlmnnngmmnomrmoro[kmqlonlk^gn}pozlomllulmlm`rpsvlnplhuqmmkornjrmmkrojqqoonljoqopolmooiqnotirpojnmknlpknjotystqnpsouklmvlvsomunpnfkpogbglqkkkukpnn^noofwimnjsiopmmonrwkgqmryqonn{kpbirnqjppkthmglrbomlmjloospzokmrgunnj^mhooqkgnrmmnaulrkqkoonkitkhnmptngllfqlknifoxqtiiloltoqojsrttkqqjskonovrqginmrosllpsojpmpvrg[jkoqksnimuokompnimojqisrrnlkoifmlnljmpjnrgjrprjuqrqjklskjooorhjgclnojolneklrithohfowkjonlpohoclriffhpk]lspoklponcq~iqdqojjpyopfknskinouhze`rohkqlnwlpzupnhjz|btplochmshlbkirmncejllokjlpjvkffsnhoonmjhsbjrnklnpemtlipmipjjnouoqkjijgoonlr~jghkroiinknfZkfokpejmqkopdqnfawmpnnqrlhjsmxonwmemgjppkgokmglpijkjtltruqhhptkpmcouosmnrylpqpfrmfillsomjpi[sinkmokotrufnoogjmpqlenmkoknlpmrrrfoltkqoqriplol|kulmpsmmnlqpmjliotrjjplfmpmouqqikpprkslousnloikplnoqoooplosomlrtsjmuoprpjnbsntrniqnnnjhpmkfmfinsnonhoisprknvqojolllmljoq_vomqpqhrfnnslpmrqoqplrwionloqllsmoouptikmmespmmmskntmpropnkloonpflpomjxnyqXllgnngmfmmpmlonhmpmogjrjqqohlxreqnorjgqvooolohkoonyYvsiclimportipnknsmlsgoimnolkirstmnkunrsgzllpchpgneljixlkmnhimnumponllnmjvmwlklmnilqjoqknpjpnixfnnjfodsqppkkopylupqhjmnuijxhnkfnfpmrmicnippknsfkfqmqhn|millkqmnqjpumnnngotopsmronhhffqtolgtimhmwmjmm{lkloknrmhpkniljppqpomvomqlmniolomnrlfolroiq\wjkfmmqmnqnnjnfqrmorropnlipnmlpi{tpoopqqmpokcjqomnjnoiplnqjmjmliscpnolklpnlml{mpulpmlp~pvrnkpqn`riolmomnunosntrokpionxtilftr{nxmjhgjmrnjqokknlnnkjmfnqnmmfsmvwipkpstoroonqnomnmmnplonpjjgldndprsjgkmknnmmgpgrelknjo}lkopmhkokpnjllhrrnonrrptokooomqqmmlomjnnrkpknmnojmpnqnomoolppllkllylliikmtnmjirnosppnngxwinlnjprtjpomjninslj}skwommmoforsklqkljklomysoimcmglnlmnknnoofonneomopohpmooikoglm{oowlmoikfohnlonmabmmnppuoqnoulxpr_mmmqnjpdnqkolnnpinnupnknhmdrnnzcqooshvmnlhundorxnjnphx\uo_omdmnmwkldldmlntikkerjsqutsukaunonpgplkpxbkhpmdkpxqqglsuumxgrj{d}uljrXnxrplkl^c}rjjqochlnlw^cwdiupnrllemtplorhjeiqqgkokjfimmpktfmpsgqmugqlpmkezoklghj]njcrgjjsqnqmgvtholupgxliouimqlmektoiq^jshinilrdq^_lnjkujrekrlnroljinltnkiiefhrskk_sqnvhhmuhrifmlijn]cgohmjpzr]rkmjnsntnimpmmqmkmpkojqqjowmphklqknnnnkonkbovridopgpglmrhqooloodg{sgpletglmrsoolrb`hqiqkj`\qjprhingmoksnnqgnqnsckckkqonummjnmjp^o_nhnrjnkleemrnhhmmiloerohgqdpnlfhlofmvlf\olphgrcpr~pxqqmnilknqlrrjdimlrrplnojgslspdqmmvoljruksksvk`nfqtlnopkkrndqejtpiklmoqhhqjrpnonkmoqmmoomllnmtossjvruekpcploininpmnukiojomioflj[ksontevnppnulolnlgoktlmjnhlmrpgqltnoflmrr]nmphfookqglrinpmnrhwidnnmqmolmpjomcmjosroqlpsmmomjjnphnbrnkhihtrlmfnkrlkprnoqgnpikllormunofslirkbqposlnnopimiuiplmmrhlrmhvmmmknnuopwlmskjqjmkl|pqsmkjmmwnnlfnhrnkunnogliknmmlmtqmkoirjskdovUokokmmoommjroppsllmlln_jn|iq}knwpskpnvuplXlnwltlqplemqmqpkngqhklqnnsoqkr|pmrqtmjjpmmnohrlmphmjocpqhnmmpplomssmsopkooqhtlomh`molppiqmnnstln_ppmmkommtspknjlnuv_rnzoksojmqhmpnlrmpmjmkrkvmjqluolbvfjjqlnnpcr_plmjmglvqvehpkncplkmnnbqlrnoktolnpkqtrolihfvqljjo{mjbmmilqennkixnumolstfqrijphgsmslhmorrjqfvhfqjutskpcrknpnoprmstmdegkqmtrlknsiioqlnzjnkknsnoukonqmvrnfnducgllqmqnrjtsnnnwionopemmnlpdwklqcpgisixjfjkimsnlntqmjsnmmnoqpjahuutpncsmhmh{ogmlnrhlhwuvmlzbqxuptslmmhtlqckmujjmjofnjjlpppqgbmlmkosoioonortpbmpfpskdohlerhfnclpdorqohdpmnlmnrngkfofpcoshntgjnqnopqmhojrkurfisrkljnbsmopmenpqmeiglriompijpmdllliqjrqupmnojsiolrrnonpnjkrjwnjnmgrjknqjqmclttrnffonkqnkppjgponilheqgmsnpernndfkzrqskqkckknipooycrfmpjxmloorodrppljmecqnkouuojmnvoqrtojpvkrl`lnomlskpmem_pmnpmjqlnofsjjilljpqm^onopohiltpqnomnmilmjoobogrpnilqokllpporiuqi[knppgnlqollnooloppkmSjdtjrmnlqjnkmloinncpplmfkjoksmnploqommkopflmpsrmkocho^prmru_nkrnonqmmuqmnmmvmnplohntjrmnloqpnnsqnnkpmpmrspmgsqntpkhmimhmmktnmnolommfhlhqiiqmpinqopinnmmknkmkemlxkmcgooolmjplipmknonfojinnill{lhmkpqopemvmlpqorlm{nrjrfqqm}npjksmliloautnnpl|qmnlfojmrlmnvogUontmnnopoznumnyjlo`linlomomeqmnnopmroskmomghkriqqjhpodjoioqddlimolsnlsoubmnjxknjononrsjuvijnlepqooqmloovjmtnltomnogqrpppltoumvpiklkdjvpkzlgltpeon]ojpowlgirrrk`tloqnzjaqmlhdcsdpstghhmfpolnehosmrlnpominosjjku_uomnlnnmgmtofklvptualjhckepfkjwvklrpihmppjo\zmomdsul`jorfnrsmnrknqshloforqjslggjrxksotqioljpnmYl_|menmimripqmheqqmimmspnldqumtxmlvprwkmrsjzhnjmntpn_ulmplnknkhusnlkjqkolourljkhxrmktfjvhzjrdonlms{nmgngpnjnmyfnvkojlmjjnsqnqqq_vmhkuqrprpjnk^nhfmfwsnmreotxrrornyljlrluugjontqoqoxneqtpjimnp{dqjhvmkknkonlljknqmhismmksljonmhkjihozmplhfqr}jumhlpnlgqvmosihhmflzflhqilpgrronnosksdnhqjqrkfnvsonrikflmnwlpexurihtktrsjlhmkmjkpjkrnhtjhmrdpljnnoerssojnpdkpqtqjjkkrimxuhoqmknooyunommrmiqndplmjjwofqnuqvmmdqdslrntfnmksj|or]qmthopmqvptpglrkktogmpvstzqlylokpoitjuwlmtemqnmjslzosqrjoklomnumsqkkiqnmkpwmojpphiwlltr|osnrirtjsnljmpfmkmmnrnosskuiumvpjpipmmjhymkohnsgtmngopqlproinugpnossjpgcrrqislqfpnmloknpjlmncmnyitsqq{xorrnxnmulhjmkxhmkgnpuqoommrqovslmnmlllpulgvfjhimitarqlogjomjluojshlnmjmotlntmqklvnnsjmptmljpjotuimmmennsrnfofmmn`skqo{nlqlqhohponjmokosfxijmlqmimreolpkjwshkgipiqlinlthnqpsxhmrlmseiinpmkfrtkpkriplkprgingiptwonrhkrkmenhntonmmipnijikmiiqpmvsmioypnhosqmvkjslqnlhwsmknvthihng_rlrrpgtumqojnqndkoqjh_gnpmtglhmimfjemikptinldl}urhgzlkkbliqppbmldjpftgmnp_qhjinvoqpsfpmxhpckgkvqlT_ptjohrnVkluhpnkkhojjilkermnolnlnopdqjlzomognymdljmpjjppqwnjnoolqnhmknkXklvpllrxonni`qopqokqmffppljmfjnptoqslmnqmocijhjohgjsquimrnnjkpom`lrkkjuqjuopgjiKinofxole_uolnnqlpeokanmgfjqojplubtqiekjlljlrbqpormzqiuobgoljtcunpknpYoqopanlzygjchjmkkr_lktae]lkqko\[ormqsdqlmjtfhonocoijzkvmmmmgjjrowiouroliwpuvqjqljlm{ghpmkjhjgmokpvpfr|`ljomhokk^nkicospfojznjkmmippp|nmonikuspxifpOsdsfotloupsnkykvsrtjvkjm{lwneohppjkpycnjwooujtnqrkqmkpokpkkqqawloonloonoiolmsmvnonqmomkeomlnhnplmqpkbrnlnlqmlooopnnmqpmjofnnpcmiinmoqlnqmj`krqitmjkpinjlqnpkmnosoflslntsqlpmoilpmykqkmvmlinqqkqlnqpkllskprqortmmpjpozojiomqlqphkfognikmfmmipnlpjmkxomyqijoqlomqkqjplmpqpqumstbkqrifmrl\rrllnkmlprnvqlllrnpjoauplomkniupksmojcdmirpiqhlptqo}ollnnimmqnwpltjoljlrmkorvmmosmkpp]pmvfmqnjnroklmgmlkonkdildkmbZolphgnpfkomsnnqmfqnkgjqilkmpmpohjopqpmssvngmpslnnlmmintopoqvnpdpohkompmjgrmvkpwtmpqjvZttoornthnkkhtswgqknkokmqmplmmikomlfvktnrmjlriolooq^rljjqnwtjmmpallh{pqemonzs^mpmtmnosoq|pmplqmmmpnrpnwoflmnloqovillnpjopmoqolvlisqkshpkuipkojlmkgmgpsnqpqknrohlunzjkuqdnjrmqhrkkhoooxlkpohjmrmpigovppynkngplmdsrnsjjziqfpwieotrvpnoqekmfloqqskjktlnpdmmrpoqovrihislqnimpurlpimp}pwrojtkmognqhkgkrggqpkpqmrivfnmhjmsknsmlkrmhcmlofomrqlsnrrnomoommn{rjknnlqnjnnphzmenlqniekthnmpkojmnsolwspjknplm`~jqmsk[\vminpnqmnodshyrlnnysoomtiphvmlptok|hnronnnqnunqnqompo~njkopnjqloqirnmnmlimomluonjlpolonoggekq_uklnmoknmjpaompldiooaonmnlntojnljfmktlngmtkulkontoklliltlnlmuon[kklmiofmqoojnnrlioornjnowgmhnhtmyqwqomoljmkvpojpklhrnjudohampphwsolkmkdqltoqmrnijmlhjkmkqkpplvomimpnronpip_jljoppmofpnlrmjrhnpsqpophrrpjfnkdolotqmooorunklorsookksmunovpvphhlsmlklpfuhmokhqrmnkmqvwonn}mpgpfopmonnpkoxqmhrkpkmpiklnnwqbolnonnnlnsprqmkqmmemnnlskqnsslmjmnqpqvcnnmp_slonymmmmmmmijpmlumqngompkkqpokpmmqQtmtplpnqoojgnpljmontlngtonoomklonfasignrlemmjmpnlp_mhnobmnni{oqnnpmo`folorqmqkorptnqlksmqknxlonkscnnonijnpkknpollgonjpmcjkioplmwnqtikjoolojqnnrohpno}mnomtmnoclninnnrpqooqlpmlnmoojopmoqnjnoopvwsnlqm{omgrhontrvssxnfimoosmpnk}knmojdknmmoprqmikmdnnwqfllkmjqqmkerfflntoi_t_lniurowrbnmlnrljdsndpprfskktononqoqjnqjogsrjkpumeinnujrjbhoposqhurrpinqrkehompepmmlfynqmjkqmzimknqmlolphotphlmjglnfhkk[ni\lskqromnopsbltltr`ntmogrlkzojiolvsllkslkllwsqlknikmksjrnonnwhfqumlininrtkmnqolsvqwhlnwnojrofnldjommpmrqrioostmqkmpmkkilovuhlonnjnojmumqonjnqmpqnsocpnnpijln_mfpsmpjh]jqlpmkpfipximnoobqhpknpoxrhjk{piYkngivtnhhblpmomphopsdsmkldosoojkonrnlumiqotollmnphllobrnnnsasnqfmo`qfqiuirqmppnm[mosrotozuktjmomeqmqmokiktmmorqqmdjomjlnlokdmqmofmdomqpmm{lqlq\ppeoijpqonoqkpprpnvnnpllappnlpoklnrrsmfojvhjvlqksrlosngookoponjmpn{qpmprlpkatfp`kqlmmmlojfhonpqyklmqkpoXrrpropj^pplptrppmoohrnopol}gtnmnmsmihlvmrjpprommlploojmirftenglppltlrnslnstquolyepnkmpoolplilqnqtiilnhmmppmmmunjlmmomqoqptqulohkdonf{voqnoqhssnmilopjojonolputhvkpoqrqijjqmmpmkkmupljtpznmsjmnqkmlmmtpomkohnlkoflrephpmvosqpmmlksugnqrommhesjkorimjoljrorqpkvhpjpnkpkgtuepiqnmkokloonnpdjknonomqokoklukliqtpjpnmnqurrrofwonrktrtqoloioolijgpqil_vjylmtlqypt~dpfoonqlkjpithyrllsfhonmosrhropnnwplnpltmlhmpmqmknmnhlolpmkpqurk{droorrnxqxomnflomjqpflpowlunfjl}mmrmojqhpgjohjqjmlpnmfqgmljijpsmmqiqroonjgojnpmnknqrrppimulqoqopllvnndbtoojpjqmnnpjioojrurfjlpsgrnnookmgqjiniphqlmnrrtpkhohuslkurktsjonuomoonxlqmlrslokmnoounhjjlmhojplmjqgfsmoolpmtlkopolqqkqorgppktnvmnlpnlmijpsmyjhcooqmonhmjepljvnkumkolpfrnqnpanitgyqim\pujoeizkli[jgjrtunofnqjmninlmrlqhkijnofglnsqnkollcglcgpmkoqlinhndjrjwoljullj^poqnnnhckklmpplxiojqrlmqorqumjmrgmdntkrjpjiiikqksgbmmfjnmmmhkormmimvkxnog`hvooipohj||kehmogqllthgulsnllonospmrmpohnfitmpoqm\kgiqpkeqgljinrqoonpmtojmkspqkwmrobdmjlnmnqsnozqnmrhnlgnormujhlnofkktqhplmikykpphnhtjqqrssnphu`nkom^vlroqyomnomonowjmipwdgqmqnmqjtnpssvmxnoqyoqijoppprmgpolmlkpqpogklrnlhnkrijrsilpqmqmlmlrmcnlrlmpiunaplojlrqnlrrqomnglhjnnlqornklkixoolnmmyrjqjojvmonkqmmllrqgihsixjjqljqvpjmzy{okmprjbpmjnftrmxhpqlmlngjmiobnldakulksxjqbsrnjiurlplzqqnjtxolitripporpomqlhfgnjxvqnqspnqvofnmfky|iukvsfjohkrdahmqsmqnsuomogomjwqq`jnjmrknn_mpgmzsotoxnkpgjukkilqdlojrosimojpvpqpenklpnmqnkpmtpsinennisum{plkipfkpn\ifplunxjohliltjltcpnnppnpotmwppnqmkkquotloxivmun{lounlfhrnnfuxwomlliljjqdripvrttckulnoqqkimcjkiklrploohmkjmprjslpnqqlrmr~hkojnnqskrfnijmhknttcuqnougeqjlupukqlmhvmqmnndiqnr|nirmlolokoqspptjlhjxncnhovfoqqjjehfvppnnkltnnqnnxnipnppughhoootmrsphypklmpmjpvrrpmktfgnoqnxrntjvliprlenmqmjlilhmoprpmnozopmnhnioosaonnfnlkroopknlonovpmrbqmnnpmpktppt{mqjpmljnmpwmntmpmqmigormmlkojkptq_mtfhurkwompmrnnqxftupclkpssoqjmljlZnngn`pmmnifjpsohpcnrmpmqqrecpnnkmitsqjqppmvqrnmtkvroqqknnfruqrpmnlmbjjyloopwvpunpjmjtcnlwrnlnuqkn~ejnqjpjppoltlmpkkjllnonhrpnmtojrpnqrqjnmnlirnfjpmqnmhkmplvglovmloojpnonjlnoip~oqopnilrnnppmqokjolkojpnfptnlqoonnpmomollpgnhgmqmgo|cglkppnpgklumkpomjowsonlrpn{umumoppukmgkphmmmjlwppvjpow[nnndkzlqlkojlnrmkmkqoedqjsjonsnpnnprnnsyhiqnmpokumfbemlswlomfonqnlwsingopmsnlpplqonnnmlnmjnmnrp_qlqnwon]smpmmkdimokvkapyjtokuumlrigmrmrosvjsqsonklkflulrrpqmomprtoipinoqdplxljpkmak^mtikpmpkmoqooivmpuonipmrmhmkgnkqppgmpjknmnupgqlilqlzenmprurhmrnhmjnrhinionkpklnronkrkkljrnklkorkmmkqmnputnmoiqolumnqqqrjof~pnmoitllnnkmthokimqnoiksqtotqaijnqhnnsmpnohkjnljppslijgm_qqokqjipjoopgkssxjjiokooilorpjkpmr|qoplpmkjjkukppjmllkkqrqvjinqnnloqodwlk|onon|qpjsohmnuhptlkkorpidokkmkrliuolnorloskmeptkmnmkxpjtmooqmmrnqmlnpmrrmiqpilqinltpnqrjkpwrwnnnihoqjqplirikgqltlrpmpmozoqotvnmjkonpfithmvusrjlllitmjppilmzkrmksq{tnnmvlnqnhxptlonkknelvxplmrlqqqjcg^lpkolp^lqUnpjwpknkfhoqqqqllinjopmcngdlzkimirlqonosuopnlspmfpnqvnhjurnsoigvqkqqnlglrin{nm{kwvjkomlhfmdlegrhoiko^lmpnuppkdthsloqkqnmhksgngi{okntpbopprmqmqqozsonhoqxsncqooXnngenbkiajmqmhlotoktnvgpumottmQnoznmiylfivkbjmqpnogrpnjhmpinkqhmpqolqkonoksmrotmkrmslpnqjemlgpfaejtknitmonogmnphrnjkpopknpmmq{rjflmqojxmjtppltpinepnrmnpmnlmmtiksmtlisouqoqovrlrnodtsokqmjnmnlmqsmmlhajjnqykmpkklpjorlioollpopnqrmmmponrnnjmnoimqoqppkomlrtmmgnorqsrlrvnjcqnpfpgokrskjjlcnnqpofwetoqk{tkfqlrpkmlymmnsnnkklmoigsoknmeokpjVsnlkmrkftkompgoloqrmpnxwopdbnnkwupngpniiommmopotorlsmpnviphqlqhpmllwulnjskoukxlpqroojlprpkvrkomlypphfreqlhqsmjtizpqtpm{irnupxuuulnopopnppsmokrjrjmoimqpklpljkrnnkqmpanlvnirmtnwohunpkolvmnzqwjl{rqmssprmqmvqorrrnkinplnkhmjstqtulmq`mnlqokqokksgqhnmvpsuulnomnuopjtnllpqqoqjqsjlvrupsqkhpqqomoqlsjjpmqelhsifkmmvnflnpmmo}rxnpkfl{dlnknpmssknmukpqppmpnpstoo|tlusxqsspslm`rruiopfkkqguhpjkqom^mnodnfimojmctpmlimnjyvsqohqmlnmruoomrmvnlmjgwltpquprqyprpmnljolnpiknnunmtmkqptnpthrrraloumplnkwpyhnjvpoqoppmkoulvdlqqqwmleknjrp{tpweomnf\nrm`nptkvoqpomi{emogvoniqsqlkmofmhjpunostmgrgqqostnsmiswiqqnvqlkgl|lh_omlhkqljyjtmnkgnolmOlrkppuimimghqpzkcklqqcqmflmshtimomnmlspnkmlpsoilmlsplrullqrvphkrqthnkqrhojpilhol`jsmlohqjqkqimomlokomnfnfmqhrhpprpjqiqhqgqmlpgnmdvulihulowhrpwisrmrlsvooitngjkphpmiinkmdkpntqinjprydmhejqvlknbrskmskoqnjjlxhlurvmmfotgihuoqoopidhpjmonxjlnjgngnoltklfspgplvrmln}nbhjollkoufxhlg~noqhinxmnoqpwlfrjgnhjllmjopnlrqmhnooioukppmlrlpkhrgotnonsdsqyqokkspmorqmtmwwpeunrurpngpsqogkpmllhom|dnclloookkhpjhvljiljxrmnnprlmrjodiqptitquphlpopopnckf|jpmkfvmqnqimqanoksknnlvulnwojlmmijipmqoppzmssmnlsqnginremhn_onfitqlmjlmhjmij{fjjsuyp{oorrklneud}nnrdgltpqnkmnjmio\mnngjn|lkluokriqgklpcbmzninllgionnjlmnhnolkjdmnrjjkrvq{tiing~sifknohthllVljnkoknlfknpsorlggthicnmrnolmhnoolmmoihmolvjfkgmfpnovhlosbroktlsepjol^mlltpmmm_nmmprjnttipnugmsmmoppxlnonjsp|monlxWnphiknxmtoinomkpklrlo~nbqldbhherusfounomtkqrtmlmjptjnpjloqqoimlogjorhnhZpmjpkkpnilppycdonlqcpjlokoplkporolrhjmnknloxszrlmpow}qvhmnkkrnonlnpnmhnljpolpoyqo{|libmllolnqqnjooqmociok}w`jknklrkvkpkrpqofpmmvpmkijolgomkoqlojnqljqnkphqpnrnqopojmmpklnlttpjojimrvrngnmlpnnmktnppynnlimpopgwlufhmjmolkoonmmplmpnponkkvpsoloikerqosirnslmoporlpnppptqknomeqlnmdpfn{nnlppopknnkkklumknhlptlvnppoimfnysopnpprongtplinmrollrsihoorhiopokplnloklkmkmommrqknoekminjmqomhqwoloqqhkmlokuoqqnpooonmmknmppnniwqmlpnmgjlmmmnpupphmspkmmpovnnnsjppoqlllnpkouklnmqklkkjqunpurppprslmlnomgqmmolpqcqrkpqnymmumnqqpknnkrpsooqnjljnhtnpmlnqlonkskrqlonljokomnomjonnkqprmmjopomlnmpjiollomoqqmoppooojpmpnrliprgnulpknrqornnnrppzmmonooskpmoknskmhpnostpjomlonomspsngqpqponojklqtpqnrmroijkonnplnlppmlmjloljnltmlnqptuk^kpnqnnmrtnltnppnpnnkkhmsnkkkloppooonolpogmlkmrqmsolpkqopiliiflmnsnqirvlkommkplploomlnpkminonsopmlpnoiolprnqfmnntjssnomlnqqnynknppomjrlrlxojhmqllmplmomoonlnrrltsphojnommolnppojrnmqqktmnonmnmnrponqoioooqpjue[lloqlkjnylmjorpkjglmllpqlrvtujnijmjopjliokhptlmknkfrbrlolhnoqdmlmmhrsrlnlhopzporqcq|pjkrnhioskortqqmmh|\pnllmgsplomjqqrppojtqlojdonjhpmifmpnriqmonuklerumormmkgdqqspojnlhpvvsqomgspmfepntmsknhrqplnmipolnoonqipppijasmmlmohphqnlrmpmlsshpnpllneprapnnnojkoiqntghompnmlhh|nqqynnrkjmkkloemxlmhqnomlsmaorllnpikqjejihsctmoroelokokopqiommimqllckpomgjpqsjsptoilmjmnohnkmhpkqilnngpnmjxdlwoonqlkqjmnnhomgjmonlmrodmnqpklpnrmlsuqjpmqmqrqojnjjssmjklkmmlommqhmoji_opnkhojnyjlnmqpgrlmxmntlriwmqoopnlkqosiljsnomomliiqqlonjlfkjlinelmoqnodomodrpfnorso^soirnopstrsmvrkwomvjnhjiqphmnhogfmokjmkonmmommoppqpkmromor}tnqqxs}qkijpngdqeilrtmimxvckfklmmllkpknnlnmilknfrjkmommkqokpnlruinh|pppnktulmomrimfllmrnmmqfknkqnlskllpnvqiwlkkovqqonhkmismodmiogrmron^phqgrnpqmpnnqymmkkjefqokoojokkkoljnemnqnimnkmkpqppoomsnnmmoonllqimmrqkonkopspkmmktnpolonqllkpqqlnuoqnljnjnlmmonnlpoikonirmvphsjpplmqlmmmnqonolkplookqnloppnprnspkpndkoolqmoqoqpplqlkrnlmknoplnnoninopqnnstmllknrjmmooqonmmmqnuqnqsdlmm`lmpkmvmornnpikk{lornnotnrpnmlonnnoqnoqnootljnnonmplxltlpjkloomosmmpmkmdootserssokglnjgukokomdqnvomoqusjqmjgpnsmqskpoqigqgemponmjmtvgjomrlnkmiqonldiowoqmqlrkujqtlpcmkrlpqonqfsnqonlfxplllrlqvrjtkrnoqsloonqqmfoimsngmlnpnmkpwjhmordjpnmlmpmmkrovnlvnnmsvooblntmqihlnkmkmsjkjkpcsrheorslmirpnqlljmqnnpplmmksnvplmhkloknrqrrkmjooimjrplnpjolnrponcnonqmkpplpmmuhnnnqlluklonmosnplmsnrhmprlnnppnohmomlknnnollrnntonuiroodlmlorlmkrjhnoonpmlqqphklnmopoljrlsmrjlnlnnlmoifonoopolunnplpkqmpkmrnpplnoompnnmnpmotqjovrrhojptslnmnsslokcrlqtumnlomljlklkttkpmtmmqnljlgnrompmpnlnmjllqolnlmnrldojmjpnlpmwolmkmnsjnqplnmpkorlmlnlomnpoprolmopmlnnonppjprjkriupommmrnlnmnlnntlflplrnoonoqmopnlqtpprjnuopioillmlmmqjnoljmnnoiqiloonmpkmonnmojhpoepqooolkrposkllqpnjpqmnlipkmooqpolonnblmpklopojlplopmrnvfmo_nkkoqommklkmqrkjohlootrnrnmnogmolpmnnkrloomnnjmljnnopmpljjsqmqpnmlllfnlio|fnhapjjnmnpniqqqklnojoqkokdnpqnimisippnookhokqmmkmnmknmmqpkpnjrmqpokomktsmrhkmjstkplmujifqpcsmroopititmpgvgpmkqnmtmiooqolpklqjqkonqtotruoltkkjmmomeroklimpmtklhrnrjnqmoqinppsmpfgmroslrqijpnnpthkgjrvrklriqjml_nnomklnjkrlipionrsoqwnnpnqclpmkoqmogkloqjyfopl{rmkdnjzeoikyksjkijlmmsrf_qt|npnomnkluqoykpcnmlvlnpplworkqhroegpjlnijkh|inllmuixqWoqm`nyohyVrjjuvllinomuxwntglnnnlmjWnuilsfinjrulnkfotnnqnyrcttjfhhndhugsprjvpoohtlvoseqozlZkgoktloqlkmvmhsppegnilqlomop`iqajzjyiqwts^urujl|ipjpkqpitvppsr]spqntompdrgmknlsnmqojljjllmomnpqqnlmiollnonnrkmmnlnvpkkrkkkpmlhmojnpnkqmopkmkoprnpmpe|mluqjqkpimnnpmmlrfmwpjlqqhsknomrpqkmljbptkkqpornnlpnmyjmmnqoogrknuosjinpsnrokpinlllqnjlmknqlonnqlomniqipprmmmldnromksnoinomrnonjgrqornsmjqlpnilkomonoonnqonmjjnlqompojsolnllgsnnpmylkojmpnlnleompwnmjlkllnjrnnwtmhsknlskproikrpprlftjmrlagmiwopkpknko|nrjuppsmjoomnjfkipilmprmnosunrlminkkrqjloiqbmjejnlnmmkpvoennptmoinmklmkqrlnnnqrpommiknnjeqooplypolnmqgnko|lsmlloormnmmhnmohwwiknonokllsmjjkinfitjkrmolmiqqnilmrqohinkkkmimkinmpnozkomnolmkkimmqmmmniglllpynqqolpqlnmkmqokm{rnpmmgooinqoiomsejnltnntlpljlopmoojoooqilhjnqnylnnjoornoooljlso^imxrrppugpvlnbwlqmojimnqinpkgrqovulnngioqnsjjlnnnqplkpnhrkklmvjtliljnhkuwkplkomqshqjmhonpolgkpljnjmjkrulqighskjsmoqnimpmqguloniqmmnumokkslpnoeqmnlklqnqkmsoippkpjkmmglojkotritqmqniopqomipjjiskivnokrooltqnmjgmnmspimmptiphdpronjpnlknllvhpknkjolnkuppkkqnrtnljsrrglook\poulompnsolkjopkkqklqopohornkwmlkiljieelknpmlljoguloomlmocoogbkjmprqpkolrqlopmjumnqymvtnqkmillonrpnnlrmpokojiinkiwtonnjorpmhoqlgqroqtjnjrtnprlnsllooninvkpnknmnjtopqgppmkolmnmjmnknolpomroklnpllpnmuroklqopnhlmjnmkiomowlmgklommhonlonmimfnigklmpmkomlmnylnoqnousqplnjkoqmpkioooqokmnojnoooovmllnhpymplmomhkdllgmnlinqplomvinommlpholmtqlinrtpnqmnliipniglpqolpmlnqohkmmkms|lkhnnsnnnmnpommnonnmlnnnompnokmpmomllplpqtllkmklokqjpmtnhonotolktjnhmnmnnomlrolnpooomornmliooponlpprlmkgpmmppmpmpknmlootmlqokmrkphoprqpmmrjslljjnkiqgmjomhrmpomjljonromplrnmoktooolnnmmamjnnnnnmvokoonmmlnmpoodlnmnlnokhrmeopsmliuoponmlutpmrlmnqjoomfpqmmolkkckpionnqopokuprnommnwomnmqmlnrpnlnblomnprqmnlplouislluuonmjojhqmkjnnmipsklkkpkqmkmmlmmnoktkmsrmlrqtsqumimkrmjqsm{ilmqqmjovmgjoknirspnkmmokjovlnnroolnepoopjgtkjmiohijlwlnmnonmluipnimmpmrmrkkmjntnkqtinqopjinnrmvminmkllvmjonqhknohmmiomloprikxnltpqhmkuhminqltnsononmmppromvnimmnppmomjiklqjokpmqkqnpncfpplnkmlklpypnkmfsigoilfksnmnmnllloqnlmuimiqllonoprgstmhunusjxlneqnonmbnsnrlrppkplopmpsj^optmlljljolkjtjvpojwhkooljmmnlnkkkpkokiokrsmnplikvjjlhniqqldorhqlvpllqinxkwkmljsokhmqoiqhpnkmsummkmhpipshqjxknwkekqknkxqirnmgnmltqonolxkpintnomqlruljllqpmnrllplnjmqtkinniqnqkruqndkmnpquqo^oljeqorpnrrospdkjjrolniohnmrpirpkmpmsnhnmkqqoonoktqhxrmopkjorqtiomprloqpmnjpunjlimxohopngnfhlhqljlomkqmommiknnkqlntopieqmwklononokpmmnoiskhpanikdmmlmollgoomqopqldollnqjnpnuhmqupmnqnmoqnuotrqrpZpjohkknoieqlntqn`nnrnqmnqokpkhkmkisnlpmqsnphmnlvplrlpmnrlnrmhpml`plonrnopknmnihnglknpnpoonlkpojpqjlopiluqijlolkqhnoovlonmlnnmfnpmnlnidmmmomkkntqmpbhpmouonkplqrnnrnloylnvnmomrknlokmtprmnlmhmupornkmlmnjonnmmjqoolhomonmnpvmlniprvompojtonlpoxnmjqnnrmsmpqmmnnnpsrnnpoppolonmjpomnnkonkmmnoplrmrnmmlupnnkmnnjnnqolrominopqhopoblnp^minjzqlplnoljlonmnpoogovjsppplpmmluoutmkqmnoknmmsnlqogkqvlmrjnrhioqqyqketojljiqplnoljmmmoflmkppmmpnolpprolpkonknjjlhipjnqpsploqnrmnokpmnvqsnlqlqnpnnoqtnoolmptqqujkpoqndqkjnplfmqhmjpjtrnjjnpkrmuinmnphnpllikprstomkoknpsrsjlkkonrkmjnqlouqqokmmrghnnnlsuhthqsorrkuhznsnfikplkpljpvpqprfsjsugmnpph{njkphqqpllilmonrjjmqnorlqopjdqpqngoapplilvi{sionmsjsqkaqspvlnigltlljumqslngjmqjkimrhjlllimqpgbglqmhqnnlrpkkemramlifusloprkchngjroqummklqlrhrnlmliqmxpoeljjpkdlgnioWplmnojhohinumgpmqgknqloolrmqhpriiglmp{oupqrentfinorwkmlrqpnqwtqujomostkmiioqlpungmjsyjqjhntjpvksisoquroorhpoqnjoromqonjnknmklaontyjfqrthkkprpjlrlkkrrifpofstpopqni}rnhtmjrmolnpmsipqcloujolsljilovndpikonhpnomnrmsooumiqpkskwqmlqjopzjrmkespnjpkojnkqoolhdpmuvjnvuppwnmpmkmwonlvqsqimonoqpomorfnmmloprnplnpgspptfnlqp^hhcpklr}xqponqkoimjnrpqgmlhojnntommjnhomriwomopluosjrqorpkpponmoloikqkmklojnnphshcpjonpelnoipjhjmpnyrekpomoromonkokmnjknldovnmemknhnntrplqrpppnqlnnmdnrotpqlqmpaovpmqwnsnrnmngoiknommjpmsvkjfmqqplnorklrwqqmhknomvhmsrupruvopvjjolqqjltipnkpwpmnwwgrpopmnlionopsmookonqkoqonnqqkqmmnqqninkjlpnkofqkwrnhpnmpnpmjklgmqpmlnnpkmoioqmpnfoyptnnnomlomoirmqnqpplpnpmliqolowkmkomfolnkmoknlrmqlrksnqnntnjoimkimmnmolqnnohconnimnhqgldnnkmsqjlqonrmrfpkiolmmkqnlloppmkqpohkqqknomnlnofllllnnmooppqntnnsnunmlvrpirngogmmformsknrpokppopoujjohmpnpmjlmlllpplonmqjromlmnrlmomlyttipmlonojijlknrollononnxfmmpopkrmnjmqqmqtntldmlmrorplrlnjmhmomhkuonljnnqkonoqorlojmnmphqkmnoktkprjntnrrklrlnhqoonnmkqnspxlnunpxknokoqnmukmnilunkmmpnqrlllntmoerhhpopoqmknmnomqnkoppojmknnmoqmmpiyrpqqliijnmrolqjlukqymjkkpsmokngnloriomkptqlolpuophlnnqngsmojhmmuknnqrpmtmjnnlkmqoqkmokkloqlntwqqikmlqlfjtskinlpsbpjphnrlillmprpjrynnjhntoqkpnmqkpkmnlpnnkoksnpqmnfgquojofnklkmpoosjompoqmpknlpksngmslpwtmojshmpktsltmslkoqlthrhppngkrooglvrkepqqoikymrnlsjnipqoknjnpjlnpnonnlpimqnk\mjmvkkptmltiiklltkqv{psjlmsumdpommio`onlflfiqpoqnslilekrikrnjkliplnohiptqiqqimkmnkunxi]orljcZpantqinimpqkbohmnpjmqqpnnnjkqmgqlgmnkjlkofslej\iotmnppq{tiqpqomfepknnumm{sjlppjklnqqpjoomjkgotqojsirhqojromommm|nxwpmkwmnitpnvnquhkircpiiupmjrrmpmnlslnhnrlnnoogjplmlqmmspolqpojlipmnppmmppoospmnnlqqokmjimlopoamkmmnlinlnmmnnooqlmqokhpopnmrlkulonoqmtknkqqnnnipolpoonmplnokqqmnnlwqnipomjlsmkkkomqlrmmpkppuklnlpnmmlnonpumnknnllpqnokolmnjrlpmnnhoqhllsrnsnsgmlrlmqmmmhkoirkuooponkluoqmnloqmoonijqqnmnmnopjkpnolrmomniorrllnsklnnjqgmhlmnolqwnkkknmmjonlqimnjsoilnsnmlqsnmonnolminmosnoonkppnqqolooqolojmsqpmojnlniomrulnlnmwpplinoloqpmlkilipomnkhpligonnonlnnomlmknnqpokooopnmcnknnomnkplmlopnqmmqrlkntkjqknomljoompkknlomonpqnipmpktnqnoonlimsrolqoplnmknlnnmqqplotpoptiljmprkkrmnlohh`{ploomlxlhmwkqpkogpiripinglflngcqgoootp~qikhqipdmjirmlnnwihomhrmmismlmoimnllikrplkojp^muqgpxispsudnklorklpbknmgjnolqoogonj|jlnkywnlvtqoqfmrgllrpenvzmwkrlki|ohnmjkdoqoklpopmnsefninbklqfkijidlmmolgjmhmqaoppkpljuljmoklpbnuvnrldqoipk|grrikrlliqxokmlkojnik}iiojjrenmlklmuookoogmmpilmormomnoqdinojouxnimmpnnuopmokfqnnphlqcqljooppthenpnnqmpmqcpkmrmjnnprhmpjobomqmkzotmmqmdkmpqmhoyoslhomkqzjmjotkonillmolgminiooomgnlpkjmjllgnsurrluppqlllftomnmjmrtkjmeknoqmopcmpjmnjighjpsonkmksjmujnlqmmpmkpjqjmmhponmorsjkkgheonfrmppsjvkioomqmnppjloijjljomngrqnpimssmujmppmhpnjponotqjolivmnjqilkgrjonpoholplmlpqnpvqmqoohnnoqkmgomoouljjpnhnoqlllpfoonpnmoknorqomn`hokppmphhnqptislmlrmnsmlijqpwvjrmpogqphlwmlgnjsvhhlmonmhlnqhlrqlknpqnohrppqmlwlprmmnnqmmqlkontnslqnllmprnimqnonopirpmmijhqlniihoorslvlhmhljsepkiujuopqmkkimfvlhlirrnsqkvqqhrkphcqcinjhlprpkns|mrnmhrqfpipmdprnnuimnjskmqkfq~edoqwkspnmnminulpprnnns{priokukmpiljhlkukkptnqtrlkonlsvplmojjnunnilonilumtoppdkmnqmnqtnejoprrqhwxljpohmwmljmrqntksnkfpnostgmqinpmkmotkrsykrplrnstriifsmogmplqmtmonmkmrnjppjiofpklooofjkrlm{pnpnpmoomoqmjimlqqopqpikqrokhjpojphnnrloooqlndojirkmfnrmmlhlmpnrhrmsmpmmoflkmhnirolkqlkwmkiqjqrosjplmpplmmnkolssrmrqnjskloqlnlmnpmmnnpionmmmqmonjinllomljpnmppoonokgljnnolmmknmmmjojljohmhmmpknoenknnmojmnnoblosomokommloopolorkrqtomopmnllnglljqlrypsqoquoqowmtlhhofjmrrfpompjjqxpklpkqllvpiutlqovkqmkilngroojlnnrjgkioqjjmowhusrldlopl|anmpfeujogpoiwsoomqgmxmrgolprk~lonttkqoqpknqtnoimkrpqlumdnpooqqmnjrlmloqokrjonkssllrfplmnemj_qjrldqlm_nosopseqmprlskmqmvaljmromlrnomjnfnropmmpnjononpolkjlkmklqhrpnudsrmoltjjmlrektonomlllkmqmtoklkkkillqpnvno|mokqgirqsjgmtmgmrqqmpcmnsmkkdholpikmlhmtnqqkkguljnktrlnolojoopjmqjxjhkonpnsokothpppgtompnonnlpioponimxokrtlpqlxulkmjqqlnootspmphppfnvjlmqosskoujnlocmthkpjipmmsoqvllrlomkqulrgjmpnppqsjjoininnjndkdilkrnppmpmomhnknlingknrllsqkkxqpmhontmmppgpooqmvplmmmoeltmpo`llhqgvorqnikpoonrjoloomikqkrjppmmlgevuqnidqnjmnjznnkofbntnmimcarqnqrflmmjlgtokjnjnnktmffnfsmyepmqkknplgilnnnkllnmkwunnpwkjqlnqnglposcltrkhccdmosmojgllkptlpsfmpnphwpplonmtnpnonoppnoslmiloknplkmwjhlkjdppqrfoilqpjphnhmmmlpopolomokmlmwkoolmnonlpqomeqpwmpnqp}omqkikinooklnkolmnmmponomtroxinjlomrnntmqeojqmommsrlljmpoqoplnmlxmobolmnppnqmtoojopmmnuomloyooonnoolomjonmlmomlnlltmrlqlpskprnmpdoomonomnoqplllmkunlppmtojriluolprpoonmnoonpnqmomoonpbmlpnmpgnmrmwslqmlhmppllpsqgomjnimoyhopqsrofrooknhkmommqhcmjbnpoolt|mlrmipojpnpkpkmkpmvrmmlnmomnoroksmlnxqnoq_mdlwlhqjrnlhjlgpnpsqukomrornjmpskqinkphbnjolwknjirnrlogprnmimujjtspodkhqlltjjlnjiqwsixmohpnrkrlkmqtqeukggkpqqopswdqyoqkpqnlemjkgqprpinuolirokjssroremqmgmrjmmlinkkjklrknobvolimokjqpppqkfsplmojjaqnjpmhhkiqiqvohpquiqunlgmonwumdklonmbpuogkmmoopeslomqn`jqtn[iknYpqmdm|gwnmxzjinljmnvjllo^njoutolmhplvjllnvuki}yloljnnkpoinim{wmlslpoymopnpnpkolqlfjwlokohankqjtplmqfjjijnlnmsookzsetnnllmprp~msmojnfrnnmpjkpjiiiouqmomohng{nmpjorkepemklklkmophrpzkopriqcjohlnpktpunlkqlliehlfnlooqqngpomlmkmnmqnoqqljlliulhmmohppmoojrmtnhmkguiwpnn_jlnklcokpqkhpniknljnopnggjokpmt~srqronpnmosmpnqnoqkmlkmjqpodmxoronvvkinpktqloqwkoskkklkkjgljmlpofmqonketblcknormpoosoqqzehlmsmtkqmnonkhklonqlonliipqmp[oloqooatsrlsqniqokogmoqqnnrppokjkoonunmnonmonpksnjtmlookgnlnqrnpapkmmgrpmmknlkqlolknndoqoonotoojopnllpozmrrnnrkrnmnnnknlukpqinkgpklplmnpoomlijrjol^hvmmomopnpopmmoolorjnnhxljpktotgrmenl{msthpqlopnlqqmjonrmjmmnqnmjmjqmloknllsopnnlpnmhnkmmmlmpojqospxmulnplomnqpiskinelhjqmmplmkknsilupqmnnolnlnknkrlolknhtnnnnlhsmstprrhlsohmnqsomnmonbmwpmnknlmnqmmtokrlkmnmklommjpykrnqsenpqrmormnovnovrnjlognpqpnpppmqlkjqmlkknmnkoqsinlmmmmlpqrolqrjuslkinppompor|olomoelntmmlllomonosilnhlmomiiwtwlqoktmmonkponnnllmjjoppuwnrnmnpknjikpknqhgjmrqpmjsjjhlrpngshskmolljmvssnimkmmkqqdnpoqkmllxmpupiiogrell|tnpqokpjrlnkujruupflkhtvqnnvenmismgcussjdfnp`ljgptuppmrkcjqrpqktnnsgimftiirppfnhjemmertqfjopqhlq^qhm]kmloirrfnrbkuownq|otmntqsiqgqnmnmmpvmkmnsqfmnpkkrnloohunbpjwszomjonlmnhulrr{rnepllsopqssnlqkqrongposgqkplqgpkkokmjhpilokorqomkmusmmkpmmoqnnkulnmmrmnlmlokkhmnqqjemronmpkumogpmqnsonsknpmolpsimgpppdrnnpknkqdpwrpokqkinnlhporojollmrnjsnkoilj`npmpnnmjlmvksnllmgopkjijnolllknllqkoskeutmljnwjmllvwhlknpijpohmpnmwiokxmslpnnlkqnojkoogmpmnonpnnnlmnopmhshoktlhijuknpknlpmbhpmoqjklpojmqoncnnnmnkhlrqllmolmmnpownjppmounrqinnjknmnhllmmmjpnonnpnmmkqkilmlsmnonlmonpvlmnonplgpmnrklo`pqkljrmtmmnlmvlnnpkqjoonnoocpmnslolnmnrjqmominkkqhhnmpjjoxomnnjnnnlneoinomjnmokomlnqoinpimmqlmjfnoqqphlnmlpkoinpmlkmltkpnopsloionloepkllpnnqlkoippjnnlumlmonllohmlnjlrtjnpnmmkogrlmlnnmlnjnwogonmlhhmoimknomlolmmsluqnljonlmnvmrpoqgrnnlnpmlmhnptnnommjhmsqpzkmmsnkkssnpmkrqkkmqpnnjhjjmknqijlnqmmjknmplnmgpgokoqiwopnmmlrrmnllfflkrskponwkoqkneopoomqnrovopjjpvrptkmsplsmmojwnhkpmopqmnlmpvmpjmlnnipnlsppopkilhknusknqkpkohnnnqpkmnmolmqmkmqmofmilnoskqoqinmkrpomqknpqmrlpommpomojimnnnnnpmogorlkstnjsjppqmmlvknimolqrsllnminlukqmnqmktnkinnllpnnlpnmjnkmloponnnnngonmnmoopklqkqqlkmmpppjolmgpokoplvnnjomopmsofmnmnpmnoqnnknmqmvtrpmnnnroqsrlnpoponmukmpsroqmkrroojqllllooloqpopkjnjpnlomnorppqolnhnopojrmmlpmlnkompmqmmrismgkkinmfmliorknlmlmmnhlsoqnrolllnlmpiqwnssoplnolohqookrnoklmjlmpgrlmnhlmcnnipglppqmonioqeomlsoksltmoonlylnlomoprnmipoggrqohmipmoozlpglkllppqmqnqhjhfppmqpiojmmkinqeqjmunmopprnporjlmpodooopoqsnqihonkqlloqpjnmmnikookpmmpnlonskdnmpbnmlljkljmrmnlsmppooplnnkojnpntlorolhur{mqkhomkqpmqvpokmlmlinjllnnkqhkqnpnnkmnqpntomoljuqptkokmlqnomjkmjsjrqmeppqmkjhjpmjlmmpxknlnhlgjnknonmolqimpdlgjmkkpqpmntoqqmmlqljnnrhjtnmlgnrlugnmgqnlmhonqnwmlknnomllmqmpookmmipokqgpnpnprnoemllpkmmfnlkomunnqnroompmolmnlrnolpnjrknmiiplomomriqqpksnolqkmqnjosgqjktnoojpmrjqlmmsonhminqjomppstpooooplrporppllqtskollmonlonnmomnummnmojnokomjomnlolipgnntllpopnqmnnqmonnrlllmkpopoxnolknqemhjrkmmnmkonrkfomnnotnklpmrloocgnqpkrmmnnokrpnlnllnmlmnoklommopolptlpplrnommkjljjhpmplnmjnilknsknkootmmrqmneuppnmmlmphmnlmnqpponkpqjj{olmsnonlknsomoppnmmjnrlmppmnnsponmnqlnmrommqkolsvplnpthnorqnkirntnnnnmompnmmeoppmqllkrromluooorqmoolopqmlmsrmnnpongqqploolmjjnnkpnkjnfksqnmonlipkionmnmomholongopnknqmolrnoknnqnnqarjomjlnomokrlpnrqtnrlokukjuokqllrmvgnekpjoqnrqmpomfiiplilkormznnqrolknnomvipjjniololpjongokmlrjoiogknkrkkpnswmhqkkpmlsflkokwrtllqnmeplnql`emrsvoolgjlslirtvnlhmpoknkkollnmmfnyxmunlnnijonpomigpsmrnnnnnooilkjmnqinqelfnovoptnlihtgnqllsknomnennolnjlkoprpmrpmpslokyhioqmqtntkvolmmkkhlgqrlonppnjoohmntpomokljkmnonsnqkonlpmpnpnmnokokppppogncmolmopkwkmqonqnoppmkosfqovmnlmqrmmnoolnmeqzrkjksvmmlljrposmlkjmolqlsnhpknojnjgmllojpwqnnppmlnnhlolmiopmokppomopnqmftooynqmpulrolqoqisumoxjlsqmqmooqnokrmilmmiomimmpmnmpllmmommlonmhmkllqpjoleknlolgfmnommpqmpolqkwojkiiktgmltqmoqjolpmknppllkokxnlroqrqqsulhymrpmfqqnijrnqqqmnooonjnqmojpflnuummmkiormrpktpkphaimnpekrpspnnhrrotqiqymnmmkhlmqoojnotljlmnipulolikpmpqjnqopnjorpijhmmnshlvopmqonnnljqmnnmolcipkolhskktrtosjqmmpsohppltplrqwnnnkopmmeunhknnnlsjkxjpnprnoikumkx~mkij|kjmhopnjmlpjnkprnnotpnryopti~rmpjmqngiprpqoftsbonqmoijogmrjnibokonnmpkbrlqnjrgj\qmpulsljrpmovrngtttunmpbqspnpsooopnpnijoZlncitlqhelprohlntmsjowmtigrjoflurjnhsonmnoqommlklpnlnlnhnqriqzonlmkppm}ppomlmjjjmdrmnklreqxnlmnlmkknvpslnlqolsqopolnljndowjrrljkofspoonplomimlljrqkqimlqwooopoooskoollkoqojmklfmkpolkpnlmmcmplknopmonoorslnsjpuknmrqooktnpsrmgmqomumnnkmonginojgpqomhroglolqpqhpnkmlmlrrnngmsoqrjmonohkhonpqmxllnoopkonompnhmvouliloqmhsnm^pjoqoqopqmlmjoplrh`nkxonlllontnilpqmoiompiokppmptpnqornmmnrhkrlpoilsnplmolrmmhZmqgrqoqpnrnuofmsnmmmpnpginnrneoondoqk_lvoiukmnumdosnionpleqjomkqkqnplmq|pnhnoohdllqqirvJnelsolbihqmolqlpiippoooroiikoloqllhmkmlmqkogpsrojtnxnmhlpmpqmhptpojnmoollnqipsnttnjxqrpodnmlpqpqostnourvrropimnmo{nploentmyupmkvqpkcmhikhokknjptjnnkmxpemwunkposknoomnmplnopjmptnpmnmvmqkonmqpnmponsofpkorllomokkjhmpnp|jmokmmljorohopjlmdnpqqqqiqrpmpiqpmnmompokoholmlmmfnqruqjpnnhqinmlkroqsnklnlgmnlnrnoovolpmonqmnkmoknnkknonrmoqnqoqpnpqnptjnommnsnnkonlnqmnjnppkhsrmmtnopppunqooonrnkqplpmmnlnhonoqmllkjmpoloefpqnmojmnlnwnopnpknrromnqqphlstmnnkmqooupnnmnmvmnnoohjkhkrromorppmmmmnjomppqmlpovppmspjpljmnlkolrlnrnrrmnphmnnqpmqljmmllfmoqlnpomnmmmdnhomqnqnhkllnmmrnpojnmnnkmnnhmpxmlmnmlpmnjpnllomkioonmmpnloomihoqlnlnompovlpnppgmspmlnknqlminnlokmlmmnl{ipnmqmrloopbrslopgpjjooropprkpomqpnklvnnmkkqsnmolnsompljopsjmlnprnpnkofmqiprnmllypppnkmqfnmmmvsmqollpjikiqonkgimqnnqpriqomklknjokopmnhoiljhtmwsppprkkrormpnqmjqnonnimhorlpplonqnmlhompipjlnnnkqppkmuoouornhmsnnqknsjkjlknnmpmnmmmpjoolllnqmoqnnnmlovmunnkmkmolppjmslkpnoliltqlmkksmpllmopnjppgsjjonqilsloqot}qopknvmpsohmpgnmmpspjongmpqkpnqlopnnnqouomhmnqmoiolopmorpskljosjjrrrqnroqqxllzfmipuojjponouhmpogoriojmpfqqplrnoqqoqkjlmmnpklntpltrinjisqiiwnsmprjprnmskupmrqljimnpuhnlqjqmjstqppxdjosltpnlnpljmjqmsoogplppsqrniqoklkpmonmlquqomlqookumsmrjmnmkmnmnlknnmppoomrnrjlqmmfrofmknmnpqpmnkdpulnlpiunfkosqxnooknnmjrnnpmtoulmujmmqkiskupnpnmktlwogqrothjsoqpnmonoolsjmpollgnsknootohoorplqxmnknonqmeookmonmlrppnpqerroolotumnjrodllsfnnmmsgiikjqkomnlklmtpkjlrjiomtnnnqonlnnotnllpmomnlnnmsqmlmmpolxsknnqmumqknotkmvpponnhqkpcnqoimqqjcjskrkgmtqsljun|enlwmkhniozjhurnnzmnqnpzp`muqrjoliijhmrpjppwpmspqoiosojjilbmjqff`vUkccq~bqnmepviqmj`pgnrlvtlmmcjnhjnkolpjrnoint{odkliphnmpcqojposomjlmrplhnvnlmcoflyrnrhoovm}hptptzonnikwrknjljogglvjl~nlkrrtolnqlmqknhhqonhnoppplmkspgogodlljgmokoerlilrlqgopnmkmkkrmpjmok`onlnkxojnoonpsplokojqiqhmpminomquknqotmnjponnoolrjommkjtyqyjfonqitkgfhlpmedpnklokjthoovlotoojqmjskjsrnirkkoppmqnnmpjmpsmulmltkkpjonoqoolmeqnkslnkpkmnpqqpoppntpghnlqkpnjhmjkplkqmnqlruhqjnnnjzkholinnrlklovjnqmplojfpjmjcrjorkpmdeltljwotqxkkiwzluj`imlukpokomnlehulto|jlfhlnpgklfmgrnmmojbkijptilkjqjmdongpsnlqmhq~nmpqlushkfi{nnv`qnxljjhqplopjmjigzroummkpfhukyqljvkkplpokgqrmi]onxhpkvmurhuigtpihknieobmzjiqkmomincxqjinbpn_jnqhfpnhjvqyqqshnpgpmjmohmcunrujolsrokknkkkplmgspgmssnopluistfnmpommpjoomlokinmjopurormlusqqnmjpnmrpnrvmndknhnmimmdkqjjomolkltjtnommoooonomronnnrjjtlnolrjsiqrmkkrskrlnommpqplkokopmnkrliimrlnpkknrknpblmqmunnmrponpsnnnmokmtrnolmilsqrnn|mmvmejpohqnnilejmninrqgonppqtmkpommnemojlqgkomlplknpknslmonposlonmwnpusqjkooiorplokklnonpimlokmmnoprmklqtmjnpmfmniomnoollmnjpnnjkngpqpsnfnkitpnokumjtklmompomnhfmmijkjqsnlnqmokmoekqmmoolrpnknpmnmrlmkgroloknrlpkonfptimonnnhqmontnnmhojqnpmlmjljmkq{jknnnojgqnjloplkuqqllorojuolornqklmopgonjmkrphphqpkoklplkrlmhomppokppqrjnqnnmqplurtkoplbsjokmlkkknnsmqmntomnoknlpmstpkonoeklgkonqolmlmmntopkmikstho}omjrmnspomkmpnpnnmmmnppsnulrkonotomollnmcojklomoglronpmorkjmolslgooplkglpnopllnojpplmfnomnpmilmnoqniqkmjllxgknnmimoplonknpmmpgnfknpnorplklqlmluophqklmnikmkoompiljmmppqniokjlmnoonqojsjinnmppmgononmpmnnkloioqpronkocmoozmommponklinmpqlooknipmkonpprkmqnmltrrlzolptnnhtpmknommokomgmhhpnimrnfhmolommnkorrkxnppoqsnilmrnpnloohokmlkjosknnsjnkniqkpkeitrnkkomlmlunpmnqmpslmnjnklqonoolnsoqeqiknrynmnqheonhtonmlkmnepjpnliiqrrlotnnpnllnullmmnpormponlorpnlqnmrknkolopnomnhrnoqionprrphojllpmmjomoppololnsmhlmrlohmkqrkorsvsmtnqynrrgproqmnqollnpromnmnxqnnjominqnnlpnonrinknompnmmhkntpnomqnowqlojnjookmjjomjqmimmmhsroolnmkqjppmlnsknkomihjnlnloolntloprmohlvqmmnmolspkzkppnojopprmpjqlknmqoljrnoompnjoumnmnoqrknnqonmjmmmorjjplkpuolpoonmkmoopomlnnjpojpknkpkpotkmmmtosoplpmhopnpkeqpkovkoxpsvomopmnnkqnkoknkqnpoqmhyomhnlimslmpornmljjnspnmpolokmonlnqlsllmpovknnntrlnroohqnlmqnsnkokmrmtoolmonhmnmoknlnlknqomzksphnokkltjqjlolnnqnmmjklksumpnonpnnvcmkmjminomnmoommlononloolmmjnkmsnhmnlpeltopwnmhjnnkjkoolmmmmjnjnsqpqoopmnjjpnpuoimolmoqmmlnnmnpoopnjmrlpnqmnmnpiumrpolomnopsokpnjlqljqpsplpmmosnglsqnonhsqopmojnlnooquopismhomjnpnklimplkqnsdgpollokmpprlpngnjlnnksrompnpofmuksknqnhpmmhmmnnskllmkmonminmnmonnmrsgllnpjmlompopplropnnmkkoqpljsjmmkrlqmonmsqjmnjqqikkogonpmfrilkookmpmirhpphinjmoskjompokwmghklomsjintkkoolkqnnppplonckprpfifjnnnhmrjpjmlorsumolopglinlxamkcjldqllolcntknuokqsrsokspnlpllrpkjuoholknmmljilrmjorqtmdrcsmopomdpkodnokpqppljlpmdoqqksqkgmksnnmqihnrktptjtqrsktsmlqmmunpiooovqookmqjkonklojmvhqqmkjnplqpqilosmolsikgollgmkqfoqmkrloissopnrmqnonnlvnqknmnhjqflrpgsmjmhelwoqlqnkilnmgukklmrutqjqsookomsmqkfmkqrlkkolirneijjjwmmlmkjsqvnqnnmljnnooorptjnmlnloooqooojhrmlomrojjnosnvmlonqiomjlfginoohktunkprpjpgpnnqnemknlop`qlsnrhqkmllkjmolsoironknqplpotjomcspnjmumqmkhppijqlolmpqrkphhrnmnilqinlpnjjjponopmjsrnotqpomoqlpqprcokplnlojmniempoqilolnlsnmnlsltuoommfonotovapgopklonngupompktidjqwqqsmpkmnnkpspnikosqqhfmmqpnmmukpoommnpknmlnlonnohfoonnoohlpioqkwkmolglqgplqolknqpsltroanjownookpktnkpnnikjmnllnoplspqtnlqrtslqksnmhmpkqouujmmnlmmokmqpmhoppjoonpqpmnliqkqilroqnpnivqlpkrjmmqlmoprojonnskmqdnmpkqopmmjzosoikpmzisnopmlaoaouqmlqlpppiotkmltrprkpnmjmolmnlinpmmrqkloojllsnqmrlfsosolnloloqjpngmomkstksnlnnqnluipqenopnpimplnklprjnorokphpmfnpyqptmjpnikotnknmnlrqkoookpppmpsnodrfkmomkmojljpkkqpmhoqpjhrmnhnnmproomrnnnpklopllnnqqrmjnonvnjnms|qnzmmpwotmjnmngkoonppnpnlpqntmogtinpnoponqkjhklnnkprqmqllmmvoomnjqlcmnqninmllpnkpqkmrolroooomnlorqinnmsmmoonoekmpmnkojilo|pospvljlvlnrlgomlloinrnqmohlnomkpjnjvnmoqoipmnnplkloqmnmpomomlmonnlmlolhllpqrlppnqrmplqnpnnmlmqqfmhmtoqstmsopnumjkjqnkolvpmmnlrqslkpknppmlqoromnmtptkmrloilnorijnjooookopmfniouppornronmcqjoospgponnoulnptlmnmkoqepppmrsmmsmmpmvnmjpmihnmknmvmpkrmrjpnsslqbmppnmoslllumjlmoqikqjnljkinnplpjlolqmrpoqlmlnnlvjtorllnsrkmnksololmjjlknohnnmjmkmrnxnmmjoflmojqnfpillsmiqnsmmlpkmpnponnplnppkmsnkkppnjqnmmqroiplnsmlmosmkjmlpkkspqlkilonhjmloinsomnlmk|ogenlnooqllpomognnikjooonmmyjpmseorkpkoimkxgllmpngnnitlsmoomipmmpoqpkmimninonunhqouinjkqnnmofjjrlnpnhlmjopovjpvjpmtmopjrdqmnbolioslnonropklpuqkooooslljunjunpnillnldnrlpmsolu`nmmoopijnmmpooojqrinmtmsmomnlpilkklorrqjlnnplnnmjnngmpmnfdlsokkoootphooppkhkoonmmkoqmhvbknqjlxglnnlrnkinmknlglklalqfl{smkolplmqmnormrjplhnoeo`jjmnktnoloknujomskrngmrkejiotlnspnlqocumoovsnp{nkipniqimnjihlpoqjpgnmsnpnikkiopkqmonjgqvqnxsoqnwogrdsogknqmnshphItgdlnlnlnompmrilgnnkknqlpmpqhnuknpmpkmmzonntmkjosprpnlijhpkontklpamlqjtiqenlnljmnlfroornolemmqpknpkhmkkolonqqsmhlnmmngqjonpsnXlqinlnjllsql}ogikosipglorikniomqoovqxpmpopqhonlmomknoonnmnjpqjqmaqqllplnkkzpijlopnpgmunvmooiooonkkjnpigkqmmtpsmfhhnkoplrlnplnnmktokononnpqqqnwkmmonmsnokpmmlnlmpqlmftkoenmmqoroklnfmqlonoompmmmonlmfvstnnplsmmmnflpomnsnmllmmpqkilmopkpoymjqpnrlnkknnpmnonovpyhnsnrlcmorljpnnlnomlmpmmninosqlojtlxoxhcufommqknnnpqmkonioopnktokmkxrclnnnnwnppqonpnpoookollpbmnqflklpqkgnnnhjnnhmhrmkmjnmsnintllpkmlllqiopgornqlpnolnkjnorlkutnnikpislomllflnoommmmnlsknorpmulqmkoonmkurnomlpmppqll}nnlnwnplpnmlnoonomnqnqmhorqllmnmoroonnmpqpnonkniojpripinpmsphlmpinorskormqqrompnrnqrtqnprnqomskmrmhhnmtlmolonnmipnmhponpjsnkliloqnnkpkmojpnnllhmlovkmonnkoqnmntmeqbusnoiqjuQommpnfooqwiq\pfocmjlilnlzqseupulisnsknplqqqrclljomornqrijnqvkqoqmop_tjmnankrkiimrlyhfhme|kzkoq_jspjmnqrjobqtofkmkdgiqqhljjhhlkmpiqliomigqoymqnmohgsqfnjihavjfmikmkpnclrsmtoktqgwlolr{jmpkjg|qrhodfrhskhloieffmgjufnnalwkfmrphht}oumov`selqnjglontjtinigrmmk_lnbojljvorlhelnmsonmisqotmklmlmjfmfnppngpqhgfrljxnpjkolofnmonijlkmkokkolqunnpougkospiiimjojetsojnynnlqkmfrosptoflnnlnjpjmkioommjnnnomkmkorojgncnqnrmlinhlnqonlelnoinmkppjnqrmrpihisgnxpmgpknojgngoikmnomrhljkrkmpnjjmmpqmmnqoniomifrhlsioionfkomwoqknkdonjnpenmrrpqnnpojkppqrlfokmrnnpnoolmslrmplmsoqoonlmij`mpisoompnnpsjoqpnnkilikotsgpmtpnknmmooklrqhijmoiopqmmmrrsmfpipromsnnmiskqohpmrmplnrkzjlmpnpnunniknminhojnkufillnlnnmnqkmksnpoffmumgiqmkmlplqqsinmknonksjpjl]pjslkmnktqpprnomlmspnogkspkoogpmdkhjlpjlpfmslhpiloplopmljmmrvmpjimnrmhpnolmjlkflnopsporonpekjgnr`tjbmpmknkmksmtirnnnklnkoowmrpjoovtlnjnopndqlnynokqnjpoljnkojqnljnpm~qglqrnmmoopqiolmmnkqnmnlqinknmkolnqppmnpmenoqpooplokoslllmtqtotplrmtqimcsioojimprmpppmhuspmilkroqpmllmomnnnmoqorrnornnoksopamojmmmkiigndsmqrdjqroenelntennphkrmnimomgqnspqlotsjsljeuomjlmplkkmmlkmjmmnllmkfnnlopfklohlnomlqmqnirpqlnfpqntpslomennllmhslrkoejvrjpnlpnglkelsrolifjplprlqmrrpnomnlllqbpnqjlkrklkmnpjumlmjpipkjstpkilknmpkpmolmhklomiqpkmjnjlompishjhooosonltgponnpqpornjhmpllojqhqipmnpomrposilkpolnqpluiinmjnqpnjplnposommqipmnofqnupqinrmqmpnkjnmrmrmlpkkoiuqlmrsepknonmllkhphllq|sknkphjnprorninnmorpjkikojplpnqgqhqgookooojtkptljknnjpllmmqhljmonlqgnskmhlomgkomqojokooiploonohnnoprohlormnojorhvmklkqgqljpkpunmnlmoiosoqromnkqnojlfqnjnnkvqjjiolpmnomslooisnmqqqnwojntronfkoomnpnnkiqenjmrpsmqnhgqoonmnqxkpmoqpmronljrmqkoqnnklnqnpjomnrlppprimmonqourklgmolllponisnogpnmmrkncokpmrolpolmmqnlinoktppninlnonlnllpprmplnsmspqpnnpnlllemtymrvglhmmpmlvhpqjimooqnomjpopqnqnkoomlsppmonmslmpplnonpmmmkjlomlhlnonprlmqsoliqmlljfnkrlqjoomkpmnoommphnnplnjhponloklmqoomjqlhkjsmlqkotmillmpppqnnkoqonoonnmo}jmkqtnypnoomnmjljjnxkmmprkonjqpoopsqnonpnhpnnrknmrjsnrmmqqonftjlnnnmngooqnmphmpqiolommoomlqjjtohkollqkkpfpnnrhppptmonmpimoltmlmrirwmpnmjqllmkollnqmlilrtqkmkrooomlqomtjqmolopgmqkknmmpjpqokomglslnofsoisrmnllmnlkrhnmikkmipkfqqniosokclpolnmvnqgknoriiorlnkokmlmqmoumqsjkofomnmlnncfnloktlipihinprnnohjloeqpjollpopnqmklnkqmiokomornjkmklomoqoklnklpllpmonlrqklqmrqoqrkkjlpnjnpoprhjkmrrniqpmmti{rnuprmllnqprtmsnunrjlslqprlqmlunoipptodtrtplqikslqovljotjqilklllqiommqsvpljrovnmhpqnnponjljj|pekspimfjgbwmpymlmmilozrlmpmiqmpkpppigsompnmgqqntondgpoloi|ondlggmpsqqbmsltm|imnomiilllmjmlompnojmhmnmworllrq`niklrqutlqopppkonqlncnmuommofllfmfgpqiqknthtmprntllnpuqgokpjl`mmnprlyqqljkprkpnhootmjmqjqhpnjkoroomik^oqiloshndinn{nkqmpmrtylmnkogmqomummiloqpnromkttipposktgmnknnnjrmunnosnrrqgpqpmmjkjkkljjlmgpvrpvchqsqwpoorpimmtgomqvmplpolsjgpmopolrirqwnqkkqnpnoskrjrjroo~onjumpnmprlirqloonnp|opesiplnoljjlqoplqplmgmmkploprrlnnostmnqulnorlnrothnnocqqpmolrhnjmlmltlcmqhikkvgsnkgjllrnqnmnhnwlgoipm]nomjmosmwnrloplutptmmrjlmnnnjjsjfnhnlonknonmopkolmnrpjrnnhpvjqkmrmommnllp}sdwpnmootjjjhpimiqqpoujiptqilrpnqlnkktjnlilllmohemmjmqlolqplmntkqjlofnirqpnllkqpgmhfoonpkknvksgtvmklko^srnkkoopnslimnj^kqkmfpbqknnkoomipwssstrpisvmqnrnniphonolok`hpmlpsqiheoqkkjngnlpmojmmljmreoqmkflpkqsooronknsgoaomanqnmksmndpjpjqpppmlsonjfqsnqamolpnllmqqoqnmodtqpfoglliuphlrnkvokoxouklmrlkmqgolmrmilmjonunrlnijnrsgmjjmqlomminktuoopppplrmmkplnvckmtotbifmlpoorlmmipjttmmlkqrmumkmronnlmimrrhnqoqpqlpqsqoqhssmonsnsooqqn_npphsncgm`inqhsntqpcojnqprpopnhmgkkpnlllrknmoppjlcnepqgiopojlljutnlmmorprpqopnnnsmqslnudmxohgvoermwnroqplojqmrkdmmnolhksmkkonvnlmjosovnktnlontmogpvllqnlnojpojlomippotnmqnfgkroplneoxinjilqlpsjmnnrlqplhhionjslrnmv_opkktnknjslcqlplrkkxoomlmmlolkpnklninnpmo~lhnplshflmfqmrqpplpuqnkonzornnmjokf{olfjqnjlqjmfpppmmjnmnommlnnljllprqntljunlkvlmlncllqnnnnqnclrlmh{mmjpljrpqmodmoonpmkmknkemrklunlkoromlkmmtmqpkrppnrslomkrrlrnqnpojrqqnonslpnnlnhhonkjoopsjktnnppmp`mmll~pnmqnmqhudksoornxrmiollpklpikkrnknrmqnsmhmqujcllremhmorgqpgpqlemplsmjercslmjnjrlqpmrongnkngonmqijotroonsnommniqrhnnlnnkpkqlrmsmmlrulmjofrlspllogornhlmopsnjirtllpioikppojljlnrqk`ooqmiopijppjljmqrpjhouroqnkqjmnmvommmkrjijolptmqpnirpgrlo{knpnmvkjnnjomug]hvmo|nrpkkmknrmsmmijnnkkonklnnpqmmqlporqommtqhnmnnakkmfsqmrmlop]ptncmnplomopkklnommlrmqcnelnenmrukmmgupmsrimnokniqmokkprrphnmnlnrkleqqlxnooqtomltoglisglommrdu`mmjppnmoljpkmjinlkpqliosnrronqlkmornnnnppfpnnklpjmnrrkeqnqllohsrmqqlnlsorjlotonojqollpsomqplmsylleqqfsmrpljknltkpknmikoprnqpqopqoqimphlplqknnlnoqnmpfrorpnonkgplnhqnmtpsokpqnmpmqmuvkponljrpgnmmrupeoqnihomodknroomkoqmyktppmqnnnojspnonphksrjqpopnmkronwnmnovosoppknotpllykmvnpjpqiloslmpoolklqullmotljpnqlpponnnokungmtporjlpsoqoklinlnqqipnpmlkknmnoooemnljrrllmnlplwqpntlklrpmomskkpmosnmpiquoolntnncmrojppmkkomjpofmulknpkrontkhofqnvmljmlpqonnnlpmmjmgjmrrljrqpsqrlkrmnlpjmjpknokkknnosmphmnplnrdmlrnklphmologmmnqkoqnnlqojtslmnpovoposlonmmonytlkpiplomjpuqnnmfkoqnqjnkluppnkpjkupoqrtnonsjomvkqrgnprslminmilipqgorjmomsprrsnsnnrjsqjnlnjopjpomshmoomlrfopqmpljlnnkoolonkqqlgnmimnmp`rqqokhmnkmpllkpojpqjnuqnpoqpnmnkmnm]onqnmnoonqqdmqnlomlnnmmppkmomlnmmlkoljolmllsnmokmpisjrqjnmomtnkolnlmngqkjqllrplmnplnkmtmqlmqmlmdppjonmfokmmlmnmrnnoopoilpollmpnsnnsmqmlnjjmtlonmnrnosolmprjnnknonlqkmqpnmqjpmnlmnjjmlmnlmlnmkonnrmotlvnninjmmnnwqormeljeornrmktflkphgilmkkgilqmpmllnzqrplkjvppemllbknrmojmtdkgmrkrqfklgjukpliknnllwktndzjolksppjfvnlpnpjqni|klgktiqljqrspyllsvphhjknvoinmchkliflmjwmjmnixonnrmmfipiukvngwsmhkqgjflVoq]jonkhnnokxuivtpkmiljkokkuphloWmqqrknpm^kgsnoo]mmkpsuirlqnk}khrtjrjssklypspjqqstoqplpmsmkphllmionppmqkoqkmmqqmonnnlonmpoksnjlptgnojmpioifspklljmpofnpkpmmknekjnojkmnmlrnmrlliqro|jnlpniojjkponnpllkummbrmmpoplkqgoqppookluubnmqooqmqommlogjllkolqnknnpkqkmqlomqnmplqpommngslomlklmnprnlfmmtoooqppholooppmmsnlmsnomntoqknlpppnjmmmpljtqlknpqlqnktvnprmhprnpmoqpmmipksknojqolnlminnnooqomnppkjmllsopjop{pplfnrlglmlmnnlnhomypnoonlpultjwjlolnnmlloplrnnilnqomnommmwmoisoiorknpnmqlkqlnlolnmxlspmmoplhjkqmqnlmspqmnqrknppnrmploqpotlpinqppnrrppmnuooqnpomnnqoiomlnqhpnhlpmqoospemipoinnooppnkppqlnkomltjpoqopnotonpnsrfqpprmtojucfhhokmlysqnpofkiiplinpnjjnqspiixrogsk_hymjtpojhntplqqnrnkmnopmnormnjmnjvmpjtokektjimmnkgrmmkljonrtlqximoriolkpmjmmqnihgnnjomlonmjrponmrmnnrrqpmrkiolfoqmqnlkoiobrqrtpomslmoolhnnhmollkqhvnokkltskjlnmmjhnrmmklnmnrkltosonqtmnknmoposrqmjnkntrnmupofuulmmnduoltkomkjoqkjhknrnwnpgijposmjnljrogjnjolrrfrfpmfnnnltmkolmookpllnmoponnfknppfmjnlkqljpmropjulolmhsnqgnmmmpnooltltotmsmookkeolmsoqlymmjkkjnrlmsltoqpinklmsknqgpsmnqllipnjlpjqqmqonokjulqinljkosnuolprmlnnkllojrvirhjnsnoimtoxtiomljnlmoomskteklmlqkqlqgimeinqnmanmosoirksjttilmqqnnslrlmkmgkjmqvgonmknljrohnelmwkmkiovnnqiqpkmgmnhhfnnqlmpmpomqpslmngolopmrhhlsktrpmpijnouokkcpopimllsllqrumsllolpirmilrtolmkkqm`qmntnnuflngjjpdginjohohnnpnoookkrhqmfksekprnjnorjnmhplonqjepnpglqolimllipkqkpljojhpomknmhnedpqogqzpootpplhpmplvnoqhpjnxonhm]hjollnngliqplgn^jocimplhejompeicpmsfnnnpinrpmjinqtjqpqjgppvknnnaqholkljpkjuopnhplphnjmqkkqqokmohngonnnlouvqltxnlsltnnpmrilmnjfjloidhllnlzprhpnnlwsknkkppvjmkrqselijmtflhlgdimrmodpp\ononjklnpouoxgilmmoalnmmllpnmfhjmnnqpkjipmpwjjnj_sjmhkmlllsnomljnlpnpkkqpruppommooplmmnnoorkmijsollrkrnljqgjlksoorrrpohjpppponkomsolkmonrmkoonkpomsnooqmpnknqtmqomkurnminrnqnqkgpknflplmpqntqjnpmlomrkqroommkrjomkymmppnokpjpnppkqnmfnkjloqqojknslqpjljpsmqpqptknlqtsnmmnqknmlmrrmpqqqkmookjokmnrmlmlnpronqkkploqnmoflhiwllnnnkpszvosmmmooYpnjqomqnmkqoflhwposqvklhqqnmnhoheonllmnmjlnhqponuwmqlqwhlnojlli|moqhnongjspkpmttrnyqokpjgnqqrsnmlnjrnlkkqqprokkmomnojnntqnripmtpohprrkiwqnmwnlcsqkpmoqvplvkokjelsqmrgmpgqynhtlefwpvfipjpqrskltvlekoirneoonmpljklmxl{pkqqlrrlhisnmklvrknrnimlonimqqjoompoopjqmjnornmriqmnkpnnksunmpmilonqhrkxqmpolpmrmmknnojommqnmtobkohmrnlqtpqlnmnqqoxrljmliriokkomolkklonllnnpijprpnqrgoqppnpnrheipnlphmrjjomnmsopmommrhlnoonjmqnoumpmlmhijqsnslsmkqmomonpfnninoumqkplumlkuomspmimmnjnookllsnminplnoompooppmrokhslqlnrqrmrmmkoknrnklvnojkomnnplpmlkouopppnplqmnkoormlfkkslnrqlmmnnkmpnjolnpnrlmpllnlqmmpuimnnmmpnlmonpnmnmmtulrmlqmoonorqsonommlnpmmpojlrpojmppvhninioppnmololpqnmojqmlioknlnoopinrnrsopogokqmmrkmmmejmomnpmrolnpllpojlkunjqltoomqnlkmonnlkqnlgjgoppkoloeoknnljekpqlsmlnwlipmlhnimrnpmdspoipoppmjotmoqmklmqjloiiqrfhonvroliuqlljqqqklndfjkmpnlnpnpppmvlmsmxnin`orr}vcnkqlokootuwwvromoirpqiutnmlpmwnphp_kpoikfonknpuolppnipjnnqmhiounpmtpkqutplptodpnmsllqlkafnjemhgo|mlsnfepticrnvmrglkrjpYmqnmpmlqnroioqkoqprqunsoopjnpoomnmodnnnkppokllhonomkmknrmpsnormrqloglkoonnpnuqgnklrmpuoopqmommlowmmlnplorlspmqqmpjoliqnqlnnjmvpmkjqnpwvlgmlongwmqronlksnnnnlnlrnslmpmoioqkpnpnrlmjmooopolqmqlilmpnmlnqmomgosqorloonmtpqlnjpqrloonkmrloqnmkplnqpnrmlrokmqogqimnlkqrkuxnopnrmpninokorpkkoqpnkpsmlopsmtrsknqiseqllkqroke{ngqrrkpnskrnlmohnmjorkulsnjilglloqnnlrmfnqnqoomljkkwmnnklnmpnprlpsgkiomkmipoilkkppopkmsehoqiokksumlmkjromulmsojpcqqqqfpmiphnbiqmnqrpmislqiihprimrqollqknkjnjlijjppmeomgnlomlnpknmqlinpmlriwnnoomfoipjomhllmmooqllpmylqpoomnoqqklpnolmnfllonnmoqnnqnpjnnjnmlrimmnvnlnsphojnjqngnnhlnommokmnjoqpllkoptsjmtnjinnlsosnmujjomnpntokkqpomronmhpmmplppksqognkqokmminllolrnngnpolsnlugpooronmmnommmrqonmpnmnlrjnomotijkppqnskmpskpfhkmonmjl{mnklpnmkrokononkmlilpwkjojkqrohupjmknvnpnnnmpnuomrpqolgisopomfolkkgosmmqkpmjkqlnlhmrnkioolrqprmknmkrnnkqpimmlpsmlqnlimjltnxqogkqkoounlqmnkfoloqp{qnpikpoknmnmsglkprpooksnirrlfgrkqljinpmsmqnknpv}hppsminmpmljnqnrjmlipmruqoospnjjqphmlpekmqkljormmmpoljsqptosrplkqxnxmlsnnkjgsqloolmqqplirllqklplslponrmmlrllpooookolpiijkqrkpmmpvvnmknnqpjlnnstunmiruekprqsopohojubkrldnoopnpjpiqfxqnfnojlhlioqhemhjpgmnovtolslojjmt~lvlnjpjovoknpammswliolokmjpjjklinykpqmmrkvoqkmbglmmlYqqnnvnnqlonrigmhqrsilnsnenuopmoj{lsoplnmwporrcmrgiqooeqmpyikqiowhklnknmpneh}iltvollmjpjzsjpqqppjplfpknhgmumlnmqtppmkolqdnpnkgljrdojhuqnnlxllmhcnosonnpoklosmknloiuojnkhblpoqqpmiknlrtmkjmrtmmsmonrhnmkoommksgjqnkcpslmmmfk^nsitlqktopo\orompflinmojjumpjmhojonpjlpnikuriqmkpoflnflmuqxmlomnknmlmqnlmtqpkkqjqlnowmonpjloklqqlqgpgpkhnlhqonjnnykjtlonkpqollnjpllrrykliksjnlloiqmojkhjmpqpmmqsrmekoqftrnvomspnloilmolmom~mrlnlinpqjsni{usknsninqorspmlqlxmovqolnplnkknqmmkopdsmjjqlmjkohvlmhgorptvuooknlqspt}npfpsslpdgroqojmpnsnhklojioohupolnolnrljqkofmqorrlmmkmgqotpljiwmmqipinpqrsgkslxslihotntrkmpmlpkpuorzkkqnljrjgtjonmnjtmvqnqptpmmln`pjmmnjosqohjjsnoposdumkmniropnllooiknnjspnmrpjnvtogomnlnqpronmxpqmkomrwriyookpnoqelmghpponnqnnoskpvikrqqpqlnnolkmmlvkpqqmpjoollpnnrjqkjdqpvlnjrnopqpookpokqoqiemmlnokonnllnomppnomkoilponkioumon~qlophlqppnmsmhglndlmninlmngmonjnlmhowjimonoookoklinlpnpmknrmpmnoinklpwmsqnmlqqmoqlplijmndkmrkqonogkmmlkqtojmomohnorimklmmromnqorlojmnampoqjlknkkkqnsonlmlnposmhlkkimonqsrmokrmpuquhponnpqmolkmmkmnnqnmlmmamkmohfmnnonpoimjmnleomohomsjmllkmmnonrsnpnirqlkjuqkpnwpqtnqywpnlopnjrkphklolnjmmrmkninlnmpqpqjroonolounnmoklojlmnshhnnslnqmqnknmonokmljrnrprmpmgpmnlonnmnmnnnponlglnpmplolmnmljtoqjqrlrjhnhtlm_ovmhnpnokoorolqkknqrqlppsojqmopqlornmoiipqjoppkrjmmllpmleonnpepnmlpqmorlomnrnsomqnmmtiionnkovnnlmqnrlpkjmootnllonpqmlnunnknjhlnoonrmksnkwlphmosnmimqqiksvnimmnornlnrrjjnnknomojlonjhnllknqmnqlpsllmojomnhrmnmflnpohqjpulioknnhkjplnominspoulslrnqlkmokpsnkgknimljsphmmrqmoopnnqospkjmnmosjliphpsmrkonqlpmpkwnntjznkqtamiommmpplnnjknpojnnppppgijmlnpmoroprnmoqomlgojnpknlmhpolpnqjmmpnqjoqmmpqllgqmookjooklkroppojmnmmoeommxptlomlqooopnsplqomqlnoqqpnhnstmojrjklqrjorrmprojjqnnmmjqqlmmtjnlommniepmnjuotnomohlpmmrnpktmlonqnokbmtlrnlrplnkponlmlkmokphqkpiplmnkjrjhnnnomnmlllironqomqpodjlhpnontnikptflolknmonipnpumllnnomolmnrokljlnnmpmkhnlikomqenmlllnoqvnimrnlisqrnqmkilljlosloqkpnniqoontmoimnnqqmqjmopmgoklnosoqkmmnlsknqmmnnlkqmpofqirlplnntklupmslkmspllpponlniiornqnnlpoppqiklqsjlkVoiqhirqmvjvlsyklnothnhmllnomifmkpvshnwlnlrikjlplulhkkherrkimkmjsommtnlmjllkigokuukkpisumjmkjsojigqmnokjmatmqjlnjmnphljkkoqnionpvnmommolrmhpuhlkromnpn`lmhqpqhuukqroljqsfkxnmmorntmmonhsoqpmjlrmhynqookvjkjjrehnonipjlibapmhoplgxgrjmmoomhpodpjiekknmnlkijlorpevjqrmlkmqnhanokpmmlpbssngtnnkismformo{_lqljvtslnrmuorojiykqnmjodtlpkpurnqnljjrqlihmhrjmfotolmmpjlmoooonnloclvjsqqkqnopksqlpoqnokrqlkomcphmqpqo\olmnkjklfonnnrnrovkmp_eholonilkqkgejhqqqmsnlqoonnppmknlmslroopijelseqmivmfrmomnsniylpgptnnpmsqgomqhkgniiiikagiqpebshrkpupkkowqomlmngn]wqlvqompwklim}io}\gmmqsbxknu^kknhlcqjjkjl\brgkmpwl_vmuepmsmnlkdtciqmtniltnkmmklumgolqklkrgkqhrpgpikshqtqliqpqkjnoenjrjsmngmquonrmnWtnmmmmqlsrnqolhmlpqsllilkjinqfcnfompiskrnpeqokjrmpzkemlmmoisnkluoppmplmkkmnomnooimslpnnkjokmnoskmpknnklnrjknoqmnonnnonmolpmmmoulqomllqnqmrrlnmjomdoknqmnlpqpoqkqqpnmponoronjnmqndmmnprlpoommlorponnqnmoqnplomnioqljmqnoprpnpniolpnomrnntsnrnnoljponflmolkvnmiomoomlullqrqornonosnnmimommonnmkqmjqqinjmmnprkkllhnmmoomwmofslnrftinoskllslnspnmkmpnplqhjlmfwjjjfinok[ojikonjjlolkmnkrgnlcenhnlemrklnojnornqmupfmkmpidrnmnqlqulpmg^ntmgqqgcplngpgkmqjknosvmlimiolgsomnjppqnnigpdkrnwlilqlemqlqqvppoplqpgorqssmspjblutorof\intkmpmjjpnoplhxnvvmp\plppioonpknmomhqnjltjklkjoonkrooqpunqrmkmpnpmmqqijrprlhmpnprrqnhrommoqokppmlhmnnomhllmnqpijopmkorlolphmn{llqqolrnwnhlpsmktkmkknpqsokhjnmqlonolplnnukklswnmoqkiqmnknnrlrpnptmqqlmnyjlhnomnpfjqmkrnqnnjrnktqmmnrnnlqkmmnkrnjppqjonpomjjqnmmoolknkvonromnnqmnnmljnlnommupunokonslonnnkppnpmnncpoqkllnqjmnmsesqmlkkmlqlrlmpplnqonookhnorlimomnmpnilnrnoopnonqnmplvookonllnlnnllnmnoqonohkktqoewrqnlnmqopnlnmdnokljmmnnmmjniolmmkopvoklompnlojmwsmjkkpololmnmqnlnpnnooqoosjlnpsmpkplkaljodopooohmigppokqhnkgrpnonvnllnnillninqoqjrlonoooploroooomnpomjrlgipmqpmmhjrommppmnlmgrrhpknnjhpn^tltmsppxqlojpqoposknpopikkgljrlnrskpqnsfmxljnklnolppmyhnontznrlmlukiongnehoru^npqnnillknawoimfhnojmnnjsjmoxgsikinrosrqsfglmrjmnmipmkpmopjrnlopnqsuhprnsqpvrbokoomroqplhlqnnomcpmpiopsborrmoqeloqlnsotlpukmmeopknqnflflnepamokmqaslokqjivmjsmprnjlmnpixhjvqjmmupmt~`ljm{xjmfhgijmpdhwumslmonktqklinuUkoosjops`spptdpnvskkgsoqqpqrggvnnpilmtej|rrtwnhmvqcspmsdusoqushqlmohrqnkyqpludjoqkrtlmfkrwlgoqjozfknhmmninivpriklqjmrqkoupipvphjmnpu`qnlmuyqj{k~yidkiSrunwrlpigmxjpprlvmhrqpnkzpli|nvwmqvumk{rprkopmipjipllprkommvjqelhnommornfkpoenmkmomiokslpphqoiglpnrtjhzqokplkolqoqmprmjnklipjsnmoporghlporkmrqlophoompumolmljojpnrokkklklnkkunnmrmpmrmmmrmmqljnspisenqkmqnmonmoomknmomookummokllomfylmpmnlnpnlotjmkmosnlwmlppnlrnppmpkjotompnnnlmlnpnmkomilqfppmgomnmlmmjmnlhrpmkpimsnlnommfhlmnjkpsjogqeonnssliqkkkqhneolnrognkgntdklonjjgnojjmokqloqqqhnpqmnnjlkrmkpdqoqaolnkwosoomgnrpslijomclmgbnkojpmmmljlnmotnljkilohrndopqqmpkkhpnnknqqnnmjvnlopphknjq{omgnqnqromojinnomjjldhomnjsioqmiujmckirsnlhpqrlqnjllmnokknojkohhilppksnrqnnmllontiksyQoqtnmmpndsgojrwgsvZvknupvkltqsqigbkentpmmolhqsotlriojnoknsurrkhqminlvtqjdmmklwmionwjtpWrjtctpkopsYumliihsmiormdoulkpfyrcumpwlprrocjrnhmqlbomlkklpknpknzmorukrjfkrqmpetmqsmszsqpmmmkqnndollphkvWmkppillknmlmomwqoylsn_kommgoeqllkphhhogoochmjfropmmkmnpeopkqilooxzojikomlsnpoppjrsrrolmlkprfmqmloilknpunhpkgphppqsononcjrpfimkmpklhlltmqsmlnnqlrjsoepomhjgpiiniuom{_rpollcrpelomlktnehhmtlohrnmklqjnomrqlsokjmqqoikllvpxpollitmplglgkqmqqltljiqkmqloqkonimuopjl{jlnjiokkpfn~onjoknqojmomprmkbknoosrqpopjpmjjmrmoknlssmmoljnnnftpinlkqokomnnlkkjnniphokkmoqokrqllpllpinluwmjsmhpijkopnqmnnnpnppmnonqjrlponrqkommpnoljqrqhmpqmqlqglompkolmrmooqmknpimpqmsnooppqollrqnnqlnqtunoookllqpllnmolqnomlmmknmpnioljnlpkfpllmrjqnrnomqspnompnqproolompoonqpmmlkngonoptopolnqnrkoonkpkpmolnpcrlpnnkuplnoholnwponmkolfonlmmmokmhlolkmnlnkqnopqkfonookjniamrqgjlqnqnjknlkgnnqplnnoonquprnmqkdjrnpiroonnsokmmijpmqloolmknplponjnpmoonnootykmpsojpmtqplnomjmkolognnrjpmlopnipolvmpnopndkknilpcnjdssomonujntmpknijmionulnsjpqhllrqmshkimlilnmqnplmplpllnlpnmsmsklamnllnljonpqpinljuoktnflnhlioojonhmknqnponnlmqojkookkmqopmlmujnohns{lsmhmogmopstollllkqpmksmiljlurmrspmhmoahqjjpmnhqmojiolomotnqoylpqorlpqnmpqvotkiliknvlpemrlshjkoononqrtqjilnklomqqlwspmtonlpomomqkoooooesrklooohmmnmnompknqpilsqoorppootpjoojkprmnmhjnplolrnoktjonqrlnooorqmmagqqlqcppXejqgqrpq{bvmrppimhptppfgmkgkfrtllebosmr`mlpohgimeoksohomumromoprmmrjwrmqmnput[uaiaiqqrmlb~lmiihvnmvhn_dgfrgditijfqfwnvphbpllljnrlqrqrrotopp`qjjnniiprpovoymarqssisossimlqomsjYlnoqmooYepkmellknmenmixlvkrrPjrpglqjnjjlgnYfrrilcllolxjeoshsmksjjnvoetchmktomkqnn[rnrmmqqjnqnqtlhnbipoplrmmgmosrktpgsnpnonojpjponrnempvnkposmoqipqnikfqnojvmnsvmlltmprgnnerriqvmnqhrslimwpmusdmppnkhlpmnvmioijojkwonplkprrqheokmjklokogopomgpqlqlumiskuormpilrmnmhntupnoqorthotwnlootpiljnriumqquullrqmqppniqpmofglrjonmiqpmnnlpjpiqitnukmuqprohkomjmomkinnlnnlornnkmlopmrqrpqtplmnomnoqpkjknnklmikinoopmpomnqsqqjmnqmqkikqlloopswhqpmonoppwkirmoomfnklmpkojlmnpololojmlnpppnlllpkmkqmpnpnnlrmsmlmnmnormmpnoqjkooqnoooqplmpooqpsjqompnrlpllofolloqpoknknrmmpjolkolmklhooksospjmtnnnoommlnlnllnllrplomptvpmsqqtoormflpiljlivrmkmnkkopnjqpqnpmnkkoonqolmmijrpnrnnmmoqntoopqnpopnmminmpilmpnnlrntmilpowmkljqgojlqoeojcmpnnqpkmjnmnnrljmlonqlmulpotkfmlnkrenmjoqnooooluqkkonmlpqpmpprnpkopnkoolmjkllmmnmpjqolpmrprbpmkpnrunlpoommhhgsorljonqmjnnjjnvqrtpmormlnsonorlphnmnllqpkmidnmxrrkirpqsrmnlmhmjopoorkokkjmpquppolkpzknvmrmonoolnn_mkgoollmrnmoqlmunimmnmjlmpnlkjoospjnppupnonkcposopklullnpumolnppmnnikgjkkojkinjqlnppjppto`nrmqmjmojikpkpopmnmrwokiokpppoptoqomqkqbnqnnpkspjjkgnmpqlflpkvompnnmlpnjnommqnqnpspnmnotjlnhlpmgkgppkkrlholonidiohvjpjnsloylvoprqjppqvnnoqgpghlilpqedkwqmnrrsoghlmiqlruamtqrksqpgjolnnlpgoefmmkVpgnprsmtto^jpu`cjufulp^nrimqgrohqjo}vnnobclkkmcpufonwkrpsrmoUsvlghmfrskotu{vcrokxrqmvueknhmsrpOplsnqlp[tlppkrdjqwn^rokxkrsojTqwomqrdphgpslf`vrpm`vomqrrqusrfnrnmjm{qgov{sqtnunnpqjemhfqiorpspqonpmmqmhjnmunonloqonlrjjmtjujomrolslpqnnjoopqmkornoinnkkpoppwmklqloooucxlplnsnnhroskmmojvqgloortqqkpmonkmsijmqjolnmfksloqrtnpqpmrrmqmpmnpmqroptppplhlmspjtnkmlnirpqjrshmsmlkqqgqlZmofnkqooirpoemokonoqlqpoqrplloooppllqjoolkopnmtkplorpqminnlpnnorjnkogroummknrppnmolqonnqmmoqnlpnqilinpnrgm_omlhmkrpmmniiooookognshmnoopgctpqonhmlmfskqnonqmfmsllqjliljgmplnmmlkimnmgnoomonlmpoplnrnklsnoohipnnokoqkppmdoomrmljjgpooltmmamjsnminpfli}rkkmrrnokhlnlnhrrhkpmlnphmktkenpmnnmkmlmnnrnhlolqnmrtmmmoojmjjkmjmknlkqnpkqrnnl{rronmmlnqonnosohnqonommmpsolompoxnmoohlqnkknpllhofknqroopqppkmkoortgqnlnnqoojohiqnumloowmmmlnnmmuqlkrklnmmoomlniojrpnknpklxopjnmolnjoknqpnporhkpnspnoormmfmromhrpnorinslnmmnhjs{nnlmpknopiormqmrifeqoljnqonmlpmoollmllmomnkomlookpmniqrmnotioiplnjoyllsgimnjpZqmtnmnqkkmmpilpp`nmwipklohnmnoommoskhltpqvjpspnmpcnpplknjpqlsnrpmlqkhgorpngkslflhoqotllluqmnpquvoqmpxlrvorommkninimomkqsmnmnotmnnjmvhpljgjkrpnkpcernlopnklknoqlonklpljjpinlqqmrklonhymljnpnsm}njypoqfplpsomjkqmlmhnoyopmqnnqmqjoiiumpolntrmqrqmnmoiopYzomniqopowokkirjmjppknzmdrxtqqmlgkkmo|lpomdoqlkoWkqpionnmpinojoikphgokrkkphjsknmsqpmirdlligpiqpqimjjflqg{pikkmmikkofmrnltol|qprmlnhlklpqnommptlljiptpmljumsviponkgklgimiunovplgnmsjip_tnjrmoonmkqpmgilnlpnrroqtrnlqlesopnim{lrxqtnttmillnhpipkmlmuiiqlmoutkqokpklnkrnrppmlnqkmjjkmoommnnfsjgolmqnusnokrpjukomonnmkjmmpnlnmsmnhpoomnnknkoofqmloiwortlpmjpmllrlnpommijlmpmlnmkjnlkjmpulnppognmkkoqnkhrporrolnirnrgompmmlimkqklnnjmlpkoqisiojopkopspmokpmpotlnngmjmpmnlkmljmfqovpilpspmnnojqknkpnnommonpjqnqkjnopliprqnonkjslomgjhnjqqnsmloplglnolmfnqqokqnekmlmhpoqwnmmmrpllpsyokujpknkrpoppnumtsqoommjqjqnooklrmomnupmjtonmolojqmokmooppqigmvppiqlnnmqprolrlklmlqkrnptoqhsjmqmirqltqoqnlmjolmlroqirnqrooqllkiinqpmlpolptmphmnslopmmpmswoapofmljsnmlnnuopkmnkmolnlqooroktjvnmqnqmnjnriloootnjmqklornqnnqkim{mrluqmwqdphpmnxpjrknkhjjjmkmnonjogpuklqjscnninojmhnjdnnmmlspmmkmomllrtqonmmmnqpoholtgqlXpqnsglnnormjhrqpksjjlmlmnpmpqmnjmrokmlnqmmlmmmmhmnjogokqsloosljmimlppqlrovinsknsiopuhlidklrnhiknlkngpzmivrmnmqokkp_lnmkiprqihmmlijpnlognlqnonoiljuotnmqlrhimmilolhljqqbejooqtoipkshmjoitkspmqmgctirhonvlahjkllgpjnohoomjphombmnnhdfqooqpmhmhqqkrcjoodmlmgrokqohgmrpqmbprnrjlklrongigonlomgxpqjresmlinkkspjqnmkmgjlimonssbpgqllngpnhnolsumoiphmsmmooiakroiyem]hrupiyknvnl{jpnwhzspo^qmmninkkmmoijfrmmhoepoklmnkompsljolissgsooijnjloimkshqnllnlmmnomknofnjomlmnjiktnnupiokmpkqmvrsnhsklljsnoqnponntlnqpqmpktsriirnqkrrplgjqnmnllvkumjigmnpollrqimprlrisonjoojqqommrnpohijokpmnfrjjntmhnpqplfppkhmorsmmloqmsiorqrrslnspoomnrnpemnpjsqoljnnwmjlsiljrncmpnmhmqnnkokinpqmrqrhqlimlrlswqnljmkmmipo^lipmnkntuccullmolholoqpjnokfsprkiljnhmdqlnqoemojl~nhqonkomknmnqyqoofnkollioioilmsslinrn`nhltnumljo`qjrukllosliqgjllmplhprijldqoopnelhgkmjkcnrnonopjnjgnpjgphikptjnlojgmqmpoosiqkhspoqlniqornbongjimlqdjnkmmqoisikojqniolpljmmmikljmjjsllokmmqnrormiionkmqmquklmpljmolproppomjonnpkrssqqpmthnlnlkkrnmfmiinpspnonplnh~imlonnomnnkqqjmmpoqhqnrnijhmpmqnooqmnqlqjmvjqmnlgnminmlnosolivomknqimrilmjronpimhkpujqgomolmkpjpmpnpnmsipmlrnpmqppsrsqlplhntlnomkooqojmllkldnpopniknfljnhqogtpnnjfqposlomopknlnmongoopkmnnrntqsmmpprlpnpkmpmrloqkppmmnlnkjrnltpspmnqoijonnjomofsgmkkkrnpluonoqprrqiwnqeqomnislmopcljsnnqlmornrphmongmmjsxlnmnosmiqnikjrmpmkfplmpfnxolkrmnnpppojoqlpolnlnlnmpoknqlqnnlpnjpmjqommommpoqouofponmmnprnkkkoomsolkmompnnjonjmnnqnpolnqjoolhqnnpnlqnnlmomjtnqmqoionpiqlqmmknpppqrmqiqnnmphknstponpnqqlhnqnponjngmxlopmmrnoklnmrnjropkqvlmqpmprnlngqomnlmrnqlpplnjlklnmjmnjmphsnkopppotsskpnrqnqkrplsklntmsmnmkntnoooklnpnmnkpdnnqnqlottnirskolpmoltpnqnhnslmkjmjulnqemjlkkqlkvknlpononlljlruppjjpllnmknoojommrolplomtmlmnqqqvpnmropopnolmnnjmmjnirk^aooioikn]eklhqwmfzctoooomolqwqnlibpbp_mpmhbakpjiiltvpagklmkdon`kkqielsqlkmkihltnlpklzvZndcelxmhql^}mrrcaijhnkm^olhpijmmhmjnfwpsjh^pikfnnlpniqmomonksanjmnlduwnjkujypjllnwxowhsgerjsnsh^phmlignPljmrmimjpinprrphlollnVqqmlgponkkjgn`krpni`nmmmuomrsdmnnqplovnhelimninoipjjoonqlnpkplpdnonnlnvlmlnpirknnlmovojrowsngnrqklnmqqpotmgomokplknpnnqtnronklmlsjnmqjpqqjojlmskqmhknormlhkrolsqlumqpnmlonmpirloqsmjpnlqsmjlkknjnjnopmmqmlkpprrllljooomkmnlhovqmqkinlonhkemnqpotloqpjosolxljonnotoromnjnqkplkmomrmoijkokootkpnrngimmjoqrumrsnmmkjimtqpoqonnijeskollcjqpppjnp`rumorqvnfjrnlknpoqmqnlqqjlprollmnqoprliyllkksnnq`keoolnmrronmnnpzkqrnjqlpsvnvgyrqnispuoojlkpooxjijipqmkmjjulggpoohlsjslpgjnmnjomikkktlnzmpfqllrljqksoohmqmeqqlqmpmmiiwomuosqtkgnntiroqmnmmkpgnsonlmprrlrpjoormponpmmnjfoximil{vnfnmnpmopsmmskqpnllspjnnksqogkvnnijojlnfjkjtgplxmhroqlnlttjnprkmnniiokjjomsoqmosqfmpo{lpoirjqjpmvmkmpnwmppjjmqotkljlmkropnmnmmpnnmjmlnmlmnjjmkmuooiqnrniplkllinlmogtlpqonmkmkhpinpmowuvqroognifmontmqnkqpvjlopmjirqokjulmmmomlluoqnmmrqmopjmloonhnonnhminllsrsmvjnoqjoponstlqprlpmmlpqohmnjnnmllnqommnpsrlrjnkijnpmnntllkornnvjmkoklonkqmqnpmqnmlwpoljpfnsnlgpnollllolmuorsqlpqronmruolmlpnilkmrtqnnpqktonnnmkjjqijomoqrnfnhnnpmopnmrlmmrrmjprqlrknlmlnoqknlmmlnrmkjoneosonpliokqrmnmmlpmnmnosmmponpijormlllnnlpomlooqkmqslrnmmmnmpnqnlkokmlnqnloknnomltpnkomnmjmplmlnlkumoupjgolmrpkcnnjppokhlmsornopnpgnrjmkmionlqolkknnkjmjokhpmnniojpjrqplrinllklgomqomnioomiksnlllnpnkplmroqsnmpfoqnklmmioqkrokpjioworunqllorkonmkimnhmnmomqnosgljmjnznklolqlmmpooplnkooknjommnnnpolqnunlnposnmrttpmotkmmktoklmmpnhlkqkqmrppgplnponnkllqmknllnmmqpptpqkkomkuknpnhnnmrunikkomphplkkmlminppkgokopminrpnoqpqmmkotnkmonkppmmmrsonklmlorummmmqqojplopiljjonmlnnoiiokmpolsilpjgqnqnknjnnmwonroqnlollnoklmmoknlrmqrlmkknvmntpmqspxqopqqnnnonqkmkmokompukojnlmnonikekoklnomoookmnvhjjlnujolpkelkkgqjxmrlmmfonwlnklqpkrmnhwooplrlpkjmaslomlnskjmpqitomoimkoikjirinpprmolkbqpjltvolnljkukhkmirnrqnagsnqlimnmkilrmpkolmnkokgmmrlokilqknkiiobnmlahopemqpmilqmkmmkquobklogolr^khlkqlnriqlrplnswlpkkiqmqmpplsokqtkmhoodmpolproqlhnonhnpppstqpnoonjnilolomnqomgrmhklpoonlmonndplolpkqmrnjlppknloomhkknlkrksqnoljqmmkopkkknomokmqonoojljklnllplqljlnkjknpoojrxnnlnoplkiomlnlkkkorkpnllnqnijjgopmloilmloqoqpogqolqmolpoowknkosomkklqtljxlolpihioojmllmvjmklkommuejppkropuoromlonpmolknikjqkmmkomnomnjmoonnlukpjsonnlsroptnppoekmsrsnmosommnpnmnmmonajpqnloomjmmmnpsomnnsjljnpollmmnnmppolpmnonjnkmlgjnlkjtrooonmkjnnmlnqbunmiqmkplqoopjwpikpplrnlnqhooqonooplkmplvohmnnnnmnrhnmkmgpnlhrhmqpoqnolroqqorjgmkqpkhnnlolmnpdomomkulpnljolkmmkpuplnoqmkmtnlmpmollkqnmkumpmmpkhmlioglmnooponmmjljimoqnleplinpsksqlmlkoplmnwpjioomjoplmnmrutojljmgsqqqmjmpmkjnlooetqmolonlqtlmpmomljpinlriniphmshfolkqmomofmkplpojfrnokklonmonlrjrklhokhlqngslproinkhmplmgnnonklqrkmsqlqmnpntsnmnmmipmqnlfkqolkslmkkkmoplmwlqhwppkjnqsqdnrknooekkkmmrkqqpmpiilokskkmnlpmnqminrghnpmknjnlplgqnkmpplpisqqpmnnhnomnknoptkklnnmokorkolykmqmppsmnpojoihpqpnnonimoprmpgotkprqoojplomnoklmpolqomlpohmlqiopnnmpnnkmtklmirmmrkilnrspommnqopmmnplnnmnknknmnpnqmnqolqnnjknfprkjrlmppqnsnmoqolnohprmsnmpkiiopnqpunnknonornpqnqmnonlqqlrnommhmmrqsilomsolnmnjmqsrpkokmqqkknolnpmnpkopmsnjlnjoqnnninnmnolpqglmhlnlqdqoninmkiomkhlnnoqononpllirtuonsmmollplpilpvkonettlnnnrnnlmpmogtomngqoipnlqgnqlklloohpqpnrqrormlpnimnnspfppktnknnnkonpppnsjomhpqnmnhokumqpllnlnqmndjmjotholjjkorpqnllooenrmnlnmrnmqpmkkmkkjpojpkonnlptmqnqqjljonhknxohmrmmnnmmoponjnnorpmmlomlnjmqlmjrprlknqmlomkkikonqppgmnqmlnojjmqonmopjjkjmqoqnoklpikzomkonqopoopmlknokjoliljqmnmnjooqqppjnnonmnliponnlpllkionqlkonqlrmiknmollnzjknnonwmtopplpnlhmnonvkoonoqknilopmmmrolmpplrplompknnkloppnjmomjknoommjomgktlpqoonlwmonskmmnannnrlknlzllltqrrsnqknjipsminnmlpnmoupmpqmknnnhsgkrorlnqnlnnljonnumnongnoihqmlnmqpkrlmormslhnnnnnolqkmmlomljnosmpjklnmppmplmoqmkrpnmnnhoooploqnolnmopnmpkmlhkmompnoqnimlpqhmlpqilopqmpomjuhnkmlxpliokfpoqfliikrkonqnsmnknimklnojmnmlnrkmpoopmrmrolpngprmoqlllmqpmolromnnppiopolnskmoonimomppnllmknnslpptmomkjlplpnrnlnnoopnnpnnmmnqopopslnpoqoprmirnjnmeolmllmmmnrprmmmnq|qnlirnmmknlpklnroqplqmmpmnofnfoippkhjmllonfpnpjnlplmlmkoqilinrnnqnfprlpoorqmlpksooojoqllioojmnmqoknmlhmohpmmlpooonmopllnnkghnnmnmolenkoplpqpqropmslrsotmoopnyklommkjomjjlmlmoqknmsmhsmoumuqpojpnhmkkomjqllmonnojoplrhmpqipvognnomnqpuqpnmnrklpprjjjloilroomrvrqnmrtpplnmmnmuhmmjllknxpkkonnmlimjojopmnnfkopnjnfnhqtmomjkvqqpjnntllinpvlnkovmspnrntsnlmnkkkuqonwrtntgnlolqmqmotpuomnnppukskboiinlplmlqxmpnppronji]lmipmnkpqrmilmshmmomqhnnqonjrpnqmmnplmmnluljjkninmqlqgpnkqmnrponvilmlpmnmmoljjolpiohnprmslpkpiqmukonnpjmlkmojpwknhmpoqgllskmpmjnlnkmhpjommqpjnpmjliplsonpimprqplqrmqroomhqonlplznfflfqmnmlmkojnpkjjljppjooonpelolkopnmngmonrknqpnmnkomknpioioloqsorrmpnmoojknpsopgipoqoqjpmjcinnmmniknokkpngmknnkponnrumjpqqslpnnsmhoqqnllonmnloqmljqnqdpcmgonlqikqilmppkqnjolslkuknkjtqmlnpltoknlpvkqqruoojsmmnqopqolqnmknsgoknmnpkoqqqqlpjnenkjqoslmllpmmpmonpqlmmnnnlkinknnmljjmnnlmoliiiprsonlqpmooimnjkhopononmmjlohlnqnmmlpkupnoljkimupkqnlrjvotmipsknlsjtvoomjghmlroqoonmwopgiivoommxkhnmqoqlopnnnorlomgpkhnhkmjprpnkrojotqsspmqnpplnmorhgqjno\mlqroqoqlknsmtmrmlhjuqolnorsg}rklolomqmnkmolnjemlrqqonmiidjnngkiliqooksnxiqpvsunnlspopwltnkokoqespliknnxooopjshrlhnlmwnjqnimpjjmplijqejmllmoroootlnkneoklhpkmpoosmlnpnnmemnqjoppmrloompmhmupllnmknlhlmrmlolnojfenmkqmokkknrjkpoonlmqoqtomqmozhmomkkmmklkpohmqlhsvmqpmnioqgnjkompppkoqjnomrkommjmmqmrjopnmnppomplojlrnlqfqooomklpkpgwmoqqlbolsnnjjoooiolqjtkfqqlmmlomnokpirifllxknnnrqnmoippqmomkmnhegjnmmpmnvltqmqinmlpnojjn}jqllvwomxm_mnlhgjr}qkpjpfldnobnrnnimmpjni{oemkq^mlnihnnnohwpoomlqoskljorlprpkmmljxsmgtnpjxkvrlqjtkroumpafgnnol|hlkbptooklnqlmhmnqkwplujqkqknmnrqkrolmhpgksrpkoooptrujjglsngmmjtrknjpemqsbnltonukrsjlxi`lnYlpkksmolibothkkpnnolomorjrykjxlorjnmkmnropnimnmrklnmknhporjuoknqmlnpnoltsoontlkpkqnponrsnnuplhlmemoqnrtojnmnjjppnoqsmmlnmpnmtfilitqotqnmkopnroloqslqopneoqrnmomolslqisnjpikoikopqlmrpmqqmohpkknmnqpoopirmnokpijnrnnoookmlrmrnomlumlfnllkmjopmsksrmnoonnopnnjmunsmnllmmortjoknonpmlnojronormnnopomnlokmmmpoliommrksijnpmmjpmnjjnropompmkltronnkommrqllksoptkojlnmtmoqmppliqmnolrnhklmmmnmnlnpmmnrolmnnlopmpoqnknolkolmqsorlnmmluonlkhqsvnkkpoomorgnompolopujlomjmoogmnqploinrnlpmukomlomookelvnrtokjhgpoonpnrmngnnmknpnoqporkkllqnrkmmkqlqqtljnmmqnnnqlpmtipkplljnlqtgoqoqrjjlmfsrhhjomunoqqmilnjlopksbooinnlnomsmnokmprloojpsjgrrhiqmjoniinjkfepnbrnpokinjmqojmonmoqmfgpjjljmnruziongolpmolqjqcooemgqlgilskjmpjnmpkkkpkonltnonhmqppomrmioejkokpqtpoplrqmpmopljrvnqbinqonjoloijhtlfmoomqgnkpmqhpnkgojxpntmlnlporoommomilnqkmjlknlnorrqglpnxpnlmlklrxknvmvhlovoklplmqnpppnkpkyqqqpfolrtjmljmlpnllliiv_osllfioonsroqnphopmknpnpvnrlkqllpwmnlrmjpskkmorgrnjmqpoevirlnxworpgoqipmnjtpmqqkklmnqqwihmqrqirupolmqkkkjjpkiqnmpsmnspnlinjpnmlnqkjniporinsqntrqjnoxlhcljjvqpymhpkqlqtokintrknsqonmpjioxnrpmonunnqipqloskyhqqsormfkmimmqsounmnjqnrmupnnnkqnmsolkmmmnqnmpqkiilifujrolllmnmmpmrmjnpoqonpklqijponiplrknklntrllqilqnkqlloloomqplppntlptmjkqohnnqqlimksnjntormmsrmtimonoimpmpojmprympllknmujmkpremsrkkkmonjillmsnnnkiqmpopnkpnjppnempqmminkqommpmnjmnlmlmnipmqtpoolonlnnjorrmklsqoupoomnvhpnz`nprlroolkkmmonpqqnoifojno`mrnltgpptgmkqjrrmmjqprogovkjjmqdjonoqvinssopqnqohlhphpendoomjtjpcigfiwcknqdooknmsntjpklovpmolmplopnpnngmoqhrirqlnnkojpkj`poimttnpknnpimlmtriqkmenmunqmlqwk{omknvrsqjlnltlitmgoijiwrjyjohrrmnqpwnqhollpoptlrejumkmklpuqfkjrkeblummirkfrkolkqpcwhrmmqprkojogmmohkejmlsllslknkqlpqlnipkorjnoojkkoptinrhmpmqrpuoplllqsgnlojplrknnjnfnnihdnhummghopmmkplnmmmmporoxirjsrhnsgnornqqsmongmjpqoiopnnrnnrucjqmvcnxolkrlriipofiqoitnl\oomompinlvlnomrrqrpsphlpnotmqokgmmjlfpphpflmoppnhtpminomqoprkqmfoqrlrm}tq^kftisnqyuxmqllnyqkimrnklomkmbperkwmjltigmnntizpngpqmkomsgkjsolotkmmofknolhmlo`lqqinfniom]drmnedqnompnjniilomxqmqqollqnkmmsijjjqicoogkmumqumkmqldrzlgolnnnpmmmjkodnllmrlqqpnmkjppikpqlonlllglllvmnmpohjmvkmicnijjqqqmjomdqpnmllkenoqrojmtjmpmllmrokojtmnonrkpnnjmpmlnkmjnptqkqnogoopjllqpmmnnmruonmmlnoolopmpjnnoqnpnkjolnmnoonnpopnlmnoqnmslopoormnoijlkjrjnopmopnmqklolpqimnnononomwpjopoomqdkmommooohmnsoqossnpllqnqlplmolnmmqqlnhnpjpsknlqkojmprqmknisoomnnimpskmovnojqojmnnpnljmjpolnoooqmoonlmrqmoupkkomvokrojnnokjmfjmnqnnmmjjrpknrjnpnmnhpnoqspjlpnjnmqholrmyprtioqsllmnoonqpljopooplnknkgqonohjskkkppimjhpfhpfnoqpplllmmjkssolndqmmlnpmiqnmpiqmmmqoplpopgotmoomlmtqnnhmtpjpmnzoqnqmmhippilkoojqnnqiomnmtnospmkkmmnopmkpntmqjnhopipokomrknnoolpnmsnlonqjnmlnlmoqlnmlmmnjoooqpshjknxjkmnqmfmnpmnslldoqopnioljoommmrnqmivmpjopwmnwjjkmooinoiihprlsmqpmlmqoqokmqqpnppkrpmnloihhnlqojjrkplqoollikngkpnolmjongjmllkprpqnimrmoklnnlulrlpqqmpmmknpmrrknonnqkmospnomgohjkpilnlknnonumomplclppmnnnonnkgpnopsmoonsnlokloplnoplnknmjlhlonqwnwpkqqilmillsjsouoynmmnjkrplinnsjpionopnunmnnnpllhpqoormnommrnqoppnokqhomklwnnonponolopnlmoopnoigmmnnqllppllrplmolponqiosnpjkqoqjnkskqmqmqmojlmnnjnonntptnnnkmnjnlsmrljmlntlmnjklnkmlilonomjdnlspmnonlpormsoinmmqplqgmpmmloqtqpljlmlmkjpmlkmnnopnjlmlidqrlknjmoqmsmrpnlkqoimrkljmpnjolsnjlkomookprmljknmsmnmopoojlnnnlumqnjlmoo|qomonmonokpsornpmmlnjlllrtpnoiokdjrqrkjpkjkmrmnophrloomqvnnslqgnuirrnlnmnmnnrpnjpjoklotzqnopmmloonmqinknknonngtoroqmkfnrohkrpmnmpomlpnikprlimonmmkpololmlmjjnrknqiqplomsnhnlmlnmnqklopntfnlompnmomklqqpoiprmgnoknqrlkqnjgolskkpjnqommmonnklpnpnmnmmkmnmimjllnnpfmq{mqmunmkjkniltonlokotonnqrmmogjpmmklilnmkmsiponhlpnqhnimnohlmlonlplqkmsmmmkronjnomnmqprsoopjorrplolnlqknomlhhlojnlkumlpilomomxsqknommrlnnmijlplpnmuimknokiokimlgpnoqomntoonllmmmlnosjenltpiqllslmppotooqqkmnjpnnkjopnoqmmropomgnioqjnoolqkmpnmnpprnnorkjqnpmjurmopkkdosnmrmhlrjpoolsrmmuonqnwokkrlnopntoorompnjmktnnmookpjqoolvpooqllolonknnomomnnqpmhlknrqnndmnmmongnmmlnpqyommnqqkjpnrnpqoqfmponlnoukqoplkppqknojlnnlostjprijoknoomiphosomrmkmonopeijnkomnmimklmkmilmlonqmhlqommothlminlpqpmgqnsnloneslsmlpileunonomoplmriolsmlmmmpknolknojmronqtkqprnmhnckmsmfmnpknthgnppknospnpmhmnnnokletsjolrjnlmkktktlrsmkuomopmqmpkqpotlrpmmlmopsjrpnkpnpljjpnonkwkpvilnsmpwfojrqbkpjhkimmhomnlkjkrhsopulshlnrpooipnamoigqmkolnlmnrnohsimksointotlopqenoqplkrihekhfjopesjpcjjojkmrqkmkkolilmwpllgnqqrgmdrsqiqllkikoshjlnnliljmnqkqomppsotsopbolihotmsoogkpomhkpqnqfngjrjlojnljmsommpoqqepmplkmpkmmnmmrooomknmmqujnnlpimnouirnlnnsvwpknnomnqqinvrnkiodikgnrmmmjmkpinkmsrqplollqonnmomooonkhpjutolppqmldomqnnjqokpnpiqdftocqowwncgjnjplxloxivornhji|rqphlrzplinpogjjxjkr\ngxoolohjoljm~pnnnslkrsqirgolorjnouknqonqlgcckkatmyrjuonhtiqbgnporxtlojlglkpmstpmskuq`hnmhvsZtnriyn`pkrnmenimvklmljipqhegbkkopmmxmq~photuqmplqsl|jwexntpeglniimxuas_ljiimmejnmvkqnlrgrjmrtpwntlqninqyilm|vnoqtrmpkommqpghmmmmnrorqpnshlmnqnnrnlnnknjmqkpglnkhn}pqlsnqkqqouioollnllsnnnpoflnoonvnpnllolkhoejnmnsmnkokllkplnqljllnlskpqqmqquoohnpoolnmkjmmonpoppronnsooppqpklmmnmqsrkqofqjlnrtqpenmmioinknnmlmomolrmmlmlonpnomornpqqpmmlnklnpnpmlmpspmlqrnppmdnnkrnmlmnkpnmfompnjnptploomjnmnpopnnmronjklroknmmmmlnntpmnnnjopspnooposoqnkmnikhmnmnlomnlnkponhhvonsommloonkmrnoolmooplokmlqonolimqolmoqmsnomiqsopkloostpknskipnnmooooomokspnhhpmmninnilnprpvmjsmntqmmlkqnmnjksnkomqfkmkmojjovhliqmnlnonmonlnnhpmsnnmphnnqmmnokxnnqosqmpokmonkhmhopmpinmlroroinnljnpoplnpngnmonljmkakqjiokuljhjjgpilpoqkokmipunmnpnmrpmmhlqnpinqprvnpmpmdlefnloohkslnnsnknjupqpuuklrpmmhmomjtpilmjqmjlmuv`nkomtqntoqhovksrdjniuqmmstiiqppqqkopllkkrnlnhorgltvilkhkliore{jkjnonlomjhr\joqknqglpsohrljltqtlpnjppkoukoomrsmvngpnogceqnjoaqmffqjisukfvjvkljphicppinjmnpemcmriqfitoqnnjzsnnokpllppi[nspmqjonnkononirlimmjnw`lclhynmenkctssoebjmowpjenliknmmnlkpmhjpuogdmjogliinpjrkkjnoqojldnmvgimmiopjpmnoloorhwjrhfssnoqqkkkfowlo`llpnlpkmfrooimmuizmrocoonkmolnjmmqpfnuevnlhjmgnnorpgskmirnovqckvfspujnlcmjvljfwljjqwlpunqjtshitnqmsm{kqmlywrrpnjok_nnqjnpnknrrixlniospikmspmopqnppnimsmo[s^mgnhqrrnrkggskpqnskmknrknktooizikqndjmgiupmniomlojrlulnwomojufokomhukprojposnnkoqkmsomprppkrnjqoxdlmmijpetloivlldlqkfkbporqoopjqvnkqkrlnquikrppimhkppjpknpkkilnqrsk{lkoqujvgZtngmnkqwroqjnpjihppoliskioepfonhlefqtjnnosoqlpjtwpozqoklnfmpnommmqijoqkomlpgpkiotkonojguspmkgsrlqlnebsjnojnqpoqidkqmqdlmlllmsjLooomknromnmnqljnljnjqpoptnqqhroljkqqlmkklkmgonkhqjlqvkvupmqnlfrojqnjlnrpkmgpnmlqpmnodopmmiokjqhmlpqlnrjktpjmtmoknfgmlolnommsluolkupnohoqsqrqnmnnnnnopnoknknijlpkllgnclipmoqmuoqmqqohoomnmkknpojpqmkmlsmmqrnpjnmkoinmnnnnqnomplltllslplkomrqpkmrionnrnrooojnl{oqanpnnmfmqnmmoomolpqmqnmsmmljptnnkonunspioelnjmqoknkpnlpmmpnpmlmmlpmrrcnmomnpnlnmqnsmqjmqlhnnqgloqmmjoovokrnplssnkqlijkrmnhpkkoqknprkpnmlnjophnoprsuommkljomnjrskllnlknopnrnjolmmoirorjoolkmlnrnjpofninmhjjplopnpnlwljpnmlrmolllkmqrmoooymnnpprpngmlqrnqqjmiloumnnnrqfpnmjpnnkqnvlmijodmmnrmkjliqflmhmltknnnnokmlmonjqmkgiolgnnqnmornlqkpqmpjrogqlmmnnoooqmopqlmoplnjpmnqmmomnirmlmonnctlqhoojkmrnmerygjeomonmgmcmiopljsuprundlqsqiplutevkrprunpmnlvnmmkphkppqeoplkmnlytmjjlepujnkzjiqhiogksorotdlprmmncjrkmljrokrl`lrmprhigsokkjpjmollohmpfomdqljkhkmklnpolpojplnloomipojqikkhljmnsogujqmosmoqnsrlnmntlemkiwpllrpklmtnqnqlmrmjjijosnmojmukompgpkntpbpwixsmmnz`mjjlkkpwqtvopsnqixonsjoosoonhnolnrnqkigoopgolpnnttonnksnnmjopomlokmnpkrlmlkmrpookh]hgki[ijjpenhlpdmnfvlpmsmjoxnij|fmmmpmpgnnjflpnnlomnlkmpnmnnfgwkrrrlpnntpimnluornpnnttipqhjmpnlunnhlmmklskginmmuqjmosoioisoljyogmprnikhpomonjnnorolkojodrqrqsmnknmqelmoookqjjkromilosojnkmonnmnupppmkjmllhlkjvjprnqmhoerslqnmjvjnmppqnmoiktmlkniphqktvkkprjolkmrppmnmnqnrkomhqormnhjjqlemmpljnmlsmqlsnolpnmspcnjnknipljnllonhngqlsrmrnnnlnmrnnllkmrltpfloohpqqowmlhjqlmmnnlnopjnoilkrolq`lqsmsoqnpinmnklomrsqljnknkgnpnopksrmmomcpppsqtnnonujmkqlrnjlpdokpnoploosmmnimojnslgirlmropfnhrmrogmonhunrjknolklqlmkrmlonnouphrnrjkicikqrnnmohtmlmmnkoponllkllnmrfmponjptpujiklokknmnnonikpnqsnoljpoqnolsmlnnoqmpqophnmkodnollonmlkqmnlqqeomnnmrmpnllommntnpiplikkkminqmponqklknkjorkmoonnnlrnppglpqjpjplfxplarllhpqruqlloihnpmqoolppnoohnsqnprlhxolipq{korpqopljtomuffksinlrmuunonqkrmnhpknmsnjqohrkwrisfiqeloojioeppttkgprrmosrrouplxptppkmpkqqoltqlpsovorpoohpnqrvmltopnumprtqjlnojoqojlqmrnlsunpgpsskkmlionsrqffqelkmjoeqrpopmtttlnokliqnpmttykrnjplpqpuioioproqolqyhgtjqrljkplmhojqmoprwnmoolonqglnkqgjhkmmsirltrflkjkkojnrmilmmphppinsrkwfmnnnmnjpijsippoksimlremprplnirpnqpbklnrlqfrsmjlomnlpjognnqijohmmnkmkkpoopkfsknnklykmnkkmolqmjplpptopjltlonponhgpmekqgkbpljmqnmjkvmunjlonnpprpon^oqrnnqilgomdhcnuqqjdhookqnsifojlptnqopmjtpqtoqqntslkmnupmllljlmoonmmnnlolnpqrnqokjiqrpmlltolkcmtmlnktjmnsnmjnmlnnfntnkkqnntrokqomponunnlkemnkmemlmpolnlpmlmljogkjlnokmjnmprlmonnocnslnnlonljomprljrrmkonfopkmqmpkjonmnokmmnnrjrmlomunovolnlnmnltkommojrmlslolkrqqomkomlnkmnnlopnojoqmhoimlpornlmktmsiikuolionpopnprgoppjhonnnhprqmplloopnlpmknompqoknnlmohinpslojpnpnjppqorllnklnonrrlopoptynpiqokomlmmklknmmsmqlqoknnrmmnmjqilmqmlshnnttmnnnrnonklmpnkmplommpqnlimoqhmkjknnmnmmmsononkknomhjonmnmjesoplqnlkqntmqooppgvnpospqnpitnnpnolnnmmipknnjjmjjlppqmeukmqkphjlrtqpevqoopsjnoozhjprlploqmxpkmjornnoklkplqqopmtrnmpmjjdmjklqdmopihgmqkjljmhmnruoopqpdrouigpmnommjrimsjolqnlikgmgsjrjqroosjmqthklngnflopsinlnlovqckmtkkxopmqsqelnlnkqsoeplpioqjfmeosdomrnmonkhmnqpplphllrlphxnjiilkmhsksdopjlnnnpnjmnomotmtpqodmoonqllopvbwnslinplqrorhl{nnskmennploovslvqlskhuojjoqmnokxjrimionpjpjpqqlrnqrmsomrlsrnspokmqpzpwnmppohowmllkknnrqmnrojtohsbmrnqjkkiknqrlrqmlwlsnnnpmomnonsiljqjuqnqnlnhnpiqomkpbqgl{fqxvnpqromllpopppomnmnqqlmplmnhnppnmmolqqulmooqpusmlhhojovonmssmrnnpjkqomonkpjnmkopmrlsjklnkrulomplzgkloinkmpqjpiqmlolnkoppmnjkrjlomkkkrypqnqsjplnlqnnpmmqpjllmnoniumpnqoppunplphnpqrvrsqjpqsrqdfzjlpmoqjlkjmmoqmjnujnqolstlfiolopqokqquqpqoonVmmqmrlihsromylnpujppnnnqkijlqomlokplntjsrmmgiqoopjkmrlrpmowqpsoooksrkoolindjpmonnkojemplillopnymrlqnpqqykpmpkippqonmmrlojpphojqimiimkrkpqpjljoprnomnqmlmijpnproopljsqrylunolgmmlkkokqinmkoqlnnpqntjiwnknioljqoiormtqlplfrrmpnogoohlmjspolujgmkqpljonnoojjpmlsokkmlpnksinllnnmnonnknmnkmkmpnqnjoompqnmklrjrophmssktovekopnrrmsmpmosolqloqkmkpqkpknmmkhpommonoiopmqmpkoqpqtkrmipmjolnwibcpmltfnqgtrnpmnigtdokpmojnlmrhlnipqml_jxpnhmokmrVmqnmfhlligmonZsmrimpmpjkjkvpfopttinmrgkklhouhlqj`somgaikljlnremplkqmkmmlimmtnooigkdlpglruolsmlnprpncormineqypgptktmdwnnroqmnqlsqmnlrmjnllpvrgaqmkrjrohnpqgtojpntmlncosnnqnqmkllojfjtvtqkkoptqoppqnemoonlmrmho`bcrpnpfqmYcoviunlgucopmqrhjkrrinegkkmjanoknecenmqsobsolljlimqqpknonlnhqopjrlmnnnqnqloowcmlqcmsq_ilgsqsrccjjotnmfbqjppgqoplsoempypqkketklnllplnntkznolimhlmlgfrlxmlnsxfommrkrlppqenqmhptelohmqshVcllokqsiquohmkqnnuppt]oorkmrjmlul\nYkrpprgllsnujlnlinjonlenxnht~dnnklm[kllkrkptnnhejjlknlprokmmhblxolfpolgngknipkztolkopontnjrqkjqlgq}iqolkhrnklnapjuqnkngkmkvmmgrip]jkjvknn{qrjnsholuillepqpfuoniorlrlpnkupbjmopjoprmgrgklismlldhijsmppniimoooojmknnmkunrdorrqmilx`ktoj}pshgllqmtjlmptogtogpqinwnkmkshppgvklwtmeonnpjfrrmbprmqloundqoolmpmpqjfpkomnkoqpqonmlomhoinfsonpqlklmslojoljknnqoqnqkkgmlkskmmpompoplosmgnlqsjiqmplltlonlfqhhkymmnpnkcjkplnnotlmmhnvqkpgngponjoomqolmlolsnmonnpqjjmnqmnoormelmnqksimoponplpnrnkkppiokmkpnnqjojnoproltlllstirnmokmpokmppijoooolpmpojmlfmrpknmxmknqnwtrhtmjqpgnknquvqrrmokilumtnnoxqlpqknlrynrtltkmmmejitqopkhomljopoqrmpllkilllkjnklknfllqrkmmqjn`jsklnrmqmglmpqospnsloslpnpmppnhpvknljormqoqjnrrononnslrtpjntmomjopohpmkqlmliqmqnololin{ttntjrmsiksosjlnlmninzoooprptmkqpsdngmqknspihomqmnnmrornljrrrnpmlommqmjpnp{pkmpofeounrohlokpomoqrrsnqonqlpnpoqonoonlnpmignplskjqioprpnmmmqownsppomoqqoipkioplklqpimlijjroknjlmoqqspnomqmrkpjnkkorjiolpopnklmnkllrnlpulijnipjnlppknnnjmpmknnprmnmmppoimo|mnrnmilnmnnpjrkqngnlmjksknhrmtkqugniuppjtoqmnilrnonmooqkmmpourjmkksplprklpmkkornossshwrrqmnmqosdngmnmjvolkmmfmpqmppkqlroowoepirjthlpooqmotqvnlmnmtmrnrplpriphorpooliqkmkinpmynkkrknknonruqqonljrttjplprkokmpspnmmlmommnqomnlrsmonqjqnihjomlhnnmlqknmhnlmmjsinrijlrnmknjflonninrlniiqnkpjkkhutnkqjnoivmomklsjolqknnmmlonrllqmqrrnosmmoinqnlrmiopnklnjqlpnvlopmkkllinonljqopoqpmomqnnpnolqkpmnjppklmmnpnnkojlkmmoqommppnnolnonoommqoomooosnnmpjqmjklrtomokjvlqlkqmnmklnnmonnmjmporoomonlplpqnlpqglnmmnlmnmpnnoumnonqonommmmplqsophmnjmpnnnrloslnbqqqllpmpmmnjolnnplwqlnpmllonmololloolonmnkommpmompoqnnuoopnnlloktnkqnfnvopnmqhnmrorgtlkpkomnmsokruxmslolmxwnotqfpcnormqorjpopnowimmogqpknjzpomqjkojnrinljopoqprklmivgpn`lpoqestloinonp~rnoljmnokkokmnjqlplomcjmklpppkqpkomkmgkjmvjrvkoloostqlno^pqkojnnmlmprrrmrpotqkjmkmsgsroopnlktsromnomnilmplhknlkmlkoqorskqhppnookiiiqmkrlrilgqollqslpuqskhlbjopmjqkpqlopgvkrqlnprnqlnmomkpjnmkqpgslnomnlopopoiknmlkikmkpklnlmlilihnnolfnkkisnmmomomnrjmggppopjjnxnnhnmlosqoknmnjqjnlqkspjkolnilrnqlnmmkmoqnmpnuqppsormlqolumiopbqlpkqkjufrlolkglpqnlenlplkoknpeuprlmnpoonlnqoqmmroknocipiknprplsormqnmjpmlnpoqlmkokksinlmnqlmnnommtnklooihnlmpomlojnmnnljkmmrnmnkoqomommmjpkonsqokloknunjomqsfpoppulmpmoornkkmmqnnqiolomnmqktmnmvqltlnnqoomlmqnkloknlkwonenpmojnnpsmmorknmnpnkeoqoomsnmmnomkknxqojnpmrprpsnmlqpmsjmnommkpotqlmsnpkmmnnnnnrpoopmqnmnnonglmnmmkllpnnoknrllonoqkoltkqvnpsplmlkpqhmmqozqooqlkmlrlnkqqqrrnllmlpqqoklhmprhmjtnmljomononmnnpmoooposmhkilmyomnrqpntqkqomjmeqqkhliomplnknlpjmtkmoqolupoopcmnjopojijlllnqponpwpmormqsrhlomnpnrmkplclwrminqtkmnqvsqjomsmvpljpopsleionpnrplfooisopntlnnmokopkpmmptnxlmnrjnlriplnpiquppoqlsllqdrqpomooshlojolmoolmkpwkrkoqmrklkpnhnnjiojmmmninvngooklolmmlqejnmelpsliknprsmoqllnpmoljkjnsgsmpsklqklumopjqlqpjqoonnsoqnneklfnnqnklkngilomopmhnginkmsjinhonnzklknomrmqqnokpmkmtojrogmmqrmqpliqlnouilnjlovkljqgpmslfnhmnlpnopqokorlpomosnmpqpmstjotnnonlnomnpshqqmorhjlsmpgirplxujnknnokonokpmljgnxmhpjkjrosknjxlmmmopnmmlsllljnkpswsimmkiprjsompjhordkqkvohuqkqhllsmoqvntklnnnmomnnjtknonjlonmleoinjplnrnmlsilhnpkpl`lkmslkrlisplirjinmjnqnnlmnkotmcimjrkslnikmllpkgpiponbopnunmlinkgmnomomsjqkopnrejohonmdnnipshnpohqrnzlojoppnnmornoonqljmnmpkshmmpnrkpmkplnmlnhlprocmmpnnoqyn]hnmqpnnktnrenqiqlvqnnnrolohnqmoqonlllunebppknjfinmkimlpugkqoqshpioompknnqsqok{osmprlnmkmpkpqwliomrkolstspqitklnojsqjonprwolpqlsmlnttmpnojlolmmsjnmrowlqkkpmhlomsp_jlqinlkmirmmqnmmllklzrkpkljpnlolmqqwnimknwkzqrnligpsxkrrunpunkromtonqqokpkknpnmqrimomqorqjhsozdnrmlmqlmnmgitldj~mkolnpikkogwnnrmhiqliieppsnohookl^ligpokolrpijnsxjgnlkkjqhnommplollnnqmronkinqtmfotmukylplojkioprplrjzlkjihnqqnllkmmofprglonmhpqnjphpljiojslioqkpxlmn`olonwlgsrqestpronnspomhokmnj{hmhmkswnlkmksnqtjvmqkilkonknmjmoqwkotqnqlqvnolsirkkklkljtnownolfqjlmepmnqtmptmnrllmqmminblkvvnmrsonhkkkexrrvmkypugkotpwlitmfipnlneoonmvshnmsjonmnmkktmmflmmkghsiphllpmppbptptnnmnrjjnoumpglqnmkwnjpmtkljgogtuzom{npnpnmnjqdninmtlolipskmnhoigqhsmmqlosjnlnqrpojpqlerojjnvlihmhkjpkjlokqljmloqopjpkmmooqnponjtumljiminmpuqrfjonplqonkljnimnipuopnjkipklpmlnimjrkomjroonnnsjmpnhpootrsllhlprnkhmoopkrmnoolljklhkmenmljnvliqojmpoklvqmnpomnpnkjlomvsqomlelpspnqjrnonlpljnonnivlopntlpoumnjslpklppqpmhmmkmkqmmopnlinsnkmmjljmkonlkkunqlkpmonlrloqnlolnkomokqmkrqmnqnnqmlnnnronqqtlnnmnljrpppgrollololontkkoplnnnnorjnnjmlqskltltmonmnwlgnnnnmrpnmlpmpvtkoknnlsnognrmmpoonopmonmnwjqjnppqlwkkjnomrlsknrlklonlnlrkrnnknlmljqnlsmnoqponjmlollpnmpsoolmlqlooqqmmolksknqinmlnpmlolqntlinnnnnnnhrplinmkmmjkmpqj\imokllqrnowklonqieidvnsnllpqsnpuxijunnkrjpjrmlmlqqollppqkrknokepfkohbqojmrkknplqpnpqtkmrim{onnrnpjfjqprvqrppksjqnllphelsnjmglspd{mnkligmlroolrqumgnmflhoqmkngnunhngmmqrpkxorqnhlonkjnolnnslkljvrhojupltvmntoonnmusnoopqosnlpokrpimpmponohipnqlollgeplshnfqvlpjupijkmgomplsmnkqopqrekrrjnjktrnknsnlnmolkppoujqnpmlmhoorknjmqjopjqlpmsilmlmjjkpklrplmokhnpmmogrkkpmppvloklqqmvpnlppplmnnonpllrqknkgnonoqhloqojonrqrkgqjklpjisplpeomnosfpmoocmpkmimmpoppekpplmuppprrqmisltynnmhqoeoiojk|spomnpoklhmmqmomlqqlmmmpnomhgjnnqlimtljlkeijppilkpoXopmipqjkveqoqrotghpotlhjpmkonmlnifjptlicmeoinjkmmnrmnmlnnikmmmkkunnqufosktmmnhnpkjrugnnpkohhpkmcckiljejglpnmmooljmmtropjkmksjiimyommrnpmrpnflmmfjvixpjmvoviiohrlimhfqjqjlomoo]nqhpstmcnomnmkqnjpmuooxupoljnfijooonfqrvmjojinfjdkklrgqkojjfrjlhloontnolbkmjpohoidnkmjjrrisjninnmjpooqloqlppimiopkkklloprin}mlipnqnlmoofokpppknqmlqprmlomollqoniommkogsmmqanoqokjnrnmniilohqyiqoiumnipqpmoemjomjpqmnjrjkipqnngpnmlosmksqqqmqshnmnolnpmpnulokmpqhqdmpqolhnqdomrhltijolnntmtksmarnlorlknnkomkjkommrilnomplkofkomolnolsliltlinqpnjjppsjknpomrrrtnoqlkqqmpolmpumjmvkxouisklrsmlxmloonlkmsmnqqnmorgppmomnlnrkoolxlloroo{pmhjrqnsnrlhpjprkjppvnqri|jsorpmoolqpropktkonpormtnlrmojjnjnvpmnolpnwlplisnpoopqmgslkrrqppmjosimqkmiqmofnlqssklmpriroolqonvmkknwpmnprrsmnkmpnklwmlrnsjoklonlloplinop{arlsnsetj_hokpopnkoblmjkmolnrlnmokimsofpioofqrookenspnompqmnkmikmojnchowmtqtolrkmvqkpdwjltnnplgrnmigjoejczmvmqrqcuepjjomqrqo_rpnktkobqogqpqnjmljkmjrmuionimvlopmmpmikhkjqpkpfpnfurnlnkpmpvoosippplmktfhmkmoynonrkopokknjmrsmmlnqnljmrkmojinnllllikonrjo_igruskmuyjqrhrwpgplpmjnoqqgupoognomljlrqlntnomfnnuqrrojjmpofnpmtnliqsnldnmilmmrtqomomnegqvosnonthmlhlikpslkzmpivuknqsomkwmnrikpoopnmjnvnjcmotjtkombmnjqslnrqmhhsnooonknknomjlrmmpljpsfoimlppjmqnnqskjkn|mmnjjkkenijlqmnpnstlmdmeitmqriijofqsrmttuhikplmmkllnskjplqommjoostplmosnpljloijmolypnpinfqnomfmnknkpnnqnjsuimmpqnlmpljqqkqqnnolknnpkqmmprqmsoojoioesnjpmlpolljqooppknlmnjmlmknmmshpjljimpkonlokjjmnsijnnhgmllnnpmkoqkoqpkmssqoonjkqorkhllknpnnoknnsjngkpjknqnormmpomwllnlpgllnrmonnpfklqpkpklnfplkummnkpmfnoqmnqmrrpnnkonqgmlrmmoompomotjlpkqppnpompnqqnumnpmqmognlloijpnpqknlgqkpsoqnkmmijoojlopokkqkrpjqlmlpkmontrooiookiotchpkoplomllohnjqkjninplmlnoponopmqpmniqmnjprnooqnmloorolntljnlhollnomnlmynnqppjlpl|spkjnsooqjpinoiilhnnhnorlqrljqwgojrmjmpnokmnnjlnljmmqmlrknpnhookqqnnlpinonpfmknjmpolnmrljkjnlmnimqmromnovmrlonnjljlknlkkorooolj`kjmqon~lnmgpnyqkmppposspkqlnnmippnmhlqlokilpjlnnpoknlninllnkmllhxnltlrslojnkjopjrijmoouiminonlnroooqnmuqkkmnpnboqpppnvpppujpmnpztoknnrjnjlmilojlmmomrpmjmkrtprusupooaqmlljognmnmoinnp|ljqlllmponpqjjmpqlpomsf^0Ev!jtz6}uI0Ra~`]giX4<GmHOOit{cK~x]8lCb4q^r?T8 v^sYktAUCla]9kGUG[WVL\XO]^dW[VrX7VOXT@AW_Q^[WX^CUIOTZS[W\STS[TXVVXWSNF]\QPUUPZTXRULYTS[XUVUX[TSUVUUN_ZVXXSWXMRXXZ\NXZZWE\UU]YUWWU[[U\ZYXW_UW[YL`VSFUXVYVWWVPSVTOUQVTWRZ]YXSTY[UUYXX[XSUTZ[OYWZRQ]]XWP\SWX[WSUJPVXWV\UPYBYYVRbS[@UVTZYVUWa_UY]_LYTTVU`XXPZYYVXWYW\UPWVRUVU_UWVXSRUUY\SQ\[VSXP`[VTURX\RRUUUW[\XXXQURT_VZWZN\TX^ZVWSRUUR[UQRS]\ZTcX[YUWXW^QWU\Y`?[ZUV]WWR\][RRYXZZRP_ZWRU`]?bMMqSUR[XYWVYi[ZZ[UPYYLV_W[VWSTY`P[T^Y^V[WYMJO^TTZY_YSIY]\[Y\F\TL]Q`\[]^VYQ[M_S[W]\^b]XO[VW[YX[G[WWXxWT]SVPWRTYTfVVXWX]^_XTYWgVPcSqWVV_\VZVSXLWUWQQcRU\OPZVGZbQRV[WYYLY[VaJcTaY[MXXUVOiU_TVYXDYXbYBWTZUYXXXVHU^RWWU\`Zc\XO<_ZW[SYBZWAZXR]]ocZZT\XQYYR[XJWUZ\YT[>`@]YTRV9RZZqP\WVUc_TVY\TLYToRObkTZ]eVWZW[WX]VbVtZaZKa:RNLSVVW_iX\FRVVNWTdYfVTWVXZYQN]XRXUUQXVVVV[aWVUXPTQY[SX]L[XXW^Z[ZSZVZZWZY\XXW\SXGmZTSVYW[Y\XYYPWMY@OVW\W@]XWPZWTP[[YUYWXGZMWTO_YPRWT]XY]ZRWZa[KWYUXsYVX\VYYWVNXZ\WYZZZYLLVrSXYXXaWPXXZ[]WVVZPXRURUSTPPYXVWYWSX\GWVUQVXWXbVYT`YYUWZWPXUPXXXW\UOXXTWXZRPWPWSTXZW[YXSYM]WYSU[ZYWVXVWWYVVVV^[YSZRXXUWVRYU\VVVXWY\dSYVUVTTPWZ\XYXYXEN`YWQTMXUYWUWPVVMSXSZXZVWVWQXSXSVUaV[XX[Y\RS\URXUXOVOWSZS[`USWWYSZWYY[VW[X[VWZYZTUTUVWXXWQIWZUOFTU^Ti[XS[V[YYNTTYWNWSYGTUYSTgUcVQP_X.TRSTLQQUXRDRUPHdRT`WZKURVUmRTV~bbSYUtFTXrQRWORUR U[SsXh^\fRROJUPOYfnUdJSZURWWyU8SUTRPUTkTgWQJWVSUPTTSSFOUSRR`SEWSb`W`ROU`WUZRQYXUVMVXY_ZS_\dXX]WUPYYLVUUQHXNZVY\XXKTXX[ZZY\[WSVVYMW[WaW[UXYSZX[^WSXXJVWMWZVYYTQ[RZW\\LZVSSf]SMY][KV[UYUZV\SOZTVVVT[[VYXXWXZYX\_VY[XSYYYVXAYXTKLVXWRZZWXWZYYPVY\QSZUh[YV\VYVRYWU^YYXiWeNSPIXWWVV\YZURWQYOXLZVLY]XZWYWYZ\Y[YTZZWYS^\RZX\GYYTYXYiUVVVRhXRYXfSVRWTLVURZISVWWW`V_Xk^Q]ZTW\ZRWWNU=S8CcUKUFQUXQWWYUQ][fVWUIVIWeRkSIRRVQYR_SnSS_XMUV?T|XTWVPTVOS^_bSYVUURSQ_WUcWUTWUTeTV:U\PWVNWYVVXUW[SWSS[_VVVVLVdWN^Q`]PQ^X\Z[HVWVAQZTEZPXUXWWQa^ZUWeURYOWI]jQLOPVZ_WWQ;T`NUQX[XXXXUZZVTXYY@YeWSTXVTYTTMlVRNWZRWVS[XWSUV\WVMVTVXVLYZXZVVITWXTWP\KDCV\W\WTZXSX[`V[UkWmTTSjWUUqUWP\RSQZWWXlU]UQZDWRT\]YWYkWDLWOVPVUMUUY]XZUWU]Y`]YXVTV]VVYX]RWVVSXVTMWX`X\\XWTWXWVZOYd[XU\ZVXVWUPYQQ{RaUW[XOYUXWQXbWURkXVT\UU[NU]TWVTShVTYQW[^[QUZSZUW]SSPUZbXZYYVX`WYWYY]]UZTVEVVWWYYUUU\WVUXXWUXZV^]\`Zg[Q]LSL]^[W^W[^_TDS^\WRb__UZQtXUW_S\`Z^XYV_VRFUYOZcYZY\[OVeSX]_Q]]X[SL`TZVMV]^ZV][P_aP^Q]U\^b^Z_^\^_ZZZ^U\\]^\a`WO[P[Z]X_U\^VXSW^_WWZ_MWWTQ]_VWYY`WWYUZM\]]XYYXaWUQWUWZVXXUL]V]_XLTWWNWcUVWTX\YYY][VSRISVXcZYWVTcYG[YVWWVVOXW[UVY]UVKWLWXTVXZXW[Q]_WR[YWWSXIVXUWT\\ZXZ]WWVVVXUVWXK]VZWa:WTXjaRXTZT`XZXX^XLX`YMWR[MU]WRVdWYXS[MYXXc\`\]V[VPSWOZXPdWYWWXU`YWVW^YUXW]XVY^DT\UUXTQZVMP[XZZVYVVVPVUJRVVSVVUSUUTLXMVVVXWV\XRQaTL]YOPYU\XTQXVUOW[XTdPSUYTQXRSUTX[QWVHUYXVUS[\ZXV^TUXSUP_ZX`WXUXRWPSZWSTQUUQHXVTWWWXTQSR^ZYZPSUZT^R`VWDWXRWZZZeXSXSRYWXYZa[UXXSNW^QLaIVSNYdTRZTLXD[SNP^ScWYV[VMUVVVV4WSX^UQZQiZTTWYUYR\iP_IW[RVW\CXRWXWXZYVTVvUSXUYRTUUTTYWJXXXVfToTVXS^]TZZUYVWRYYVPUXVPXMZTY\cTZXPSOUXcRZU_SWTVPVX[Z^b^VQZRPZWYcVUVZV^ZVTXVZPTYZ[Q_UVTcVWKXPYY[YXTUT[VOTXUYZcVZVb[\P^YYX\YV[RTU`ZZZ\TQYUVVOYbWOSVZWVZYWVWVPWT[U\\YU\ZZWYSQXR[KXXQ\YW\QWVZUXYVYZ]WTVXV]aU\WXXPXYYQTWYX_TSYRWPY\Z[SQPTRU;ZVUQP_QYUVLUVN[VQW[YWV[X^ZTWrZSHVU[SSUQVkQ?UUYR`QTX\ZJUYvKNTSX_VPV]VSWU_UJ]RRXTXVXXLW_TRXTTIVVTFXZR_DZT]\XWQUTdUJSVYWCWROWVTQVTXXU[NJRYVXWQLZT\QTRIOVYTESHYRVUOQWQ\KWUTXUX\TW\[RPUWPXVaUY\V[]ZYY\SUOW[VXTPX]MdTM]SQ^bZZUIY\ZUT_YVXXWS]VXY[ZWSW]Y_XO\WXUMZWYXhRRUUYUF]LUQNVUNGPWXOZ[YWSO]UY\Xea`LV\IZKY^]QPd]\`XWg]Z`eP`dimmg\SVc`XV\XR^T_;WWV\@]YVU]]UUe\ed\RZ=[_TPbH^NFQY^UTW`xQ__]ZT`i_xXT\Wa[XV`][_ZX^f`[WNObjL[[]XN\rXXrWW]WZJXOWXWXW_UYZ[[YYVR_RTB]Hb^^\TZYVUXY_ZY]^WVXXW\V\VaWLXb[TZZZWYGWVNW^JZSSWUXYTmX[VZYZRYPOZ\XU[\ZZZNWVUX[WXWZXYN[VY\WVTZXUOXYZXRYY\WXVVYQRVZTYYTY_ZTM]]\[U\SSWWW^X]\PWV]YYPUTRRdaPZTQ[WWWPYYdXXYU_PVSUTR[XZb^VWWZ`T\W`ZPVVT_\^XWb`^UMTUUZZ]Ri][WY[YQSZY`Z]_UTOUTDPXALY[VU?][WTZYhcZUY[VW>M[c^URWW`TXURNYNUK_qPbfVXTOU[A\YX[RaS\[K[S[kWLXMpVX[VOT\WOYLX^RcmUfU]WUWWTOSHVa\YU^ZSSjJ[LUWV\V\VbSTQKV^X]YUXTUZUUOSVHVUUZM[ZQgXZX[XXZWU[[^[WTTXPT^_W[W[TaV^TRX\TUb]^XXXT[RT_TRUVWaTZYVN[VPXZWWUW\WI]TRXVOUK^cRVVXSZYTWV\X[]YTLYXUYPT\LXU[T[X\MQXZYIV[UU[SRYRX\V[RQZXWXNUY\MVWWWTVYUZMZ`ZUWWUY\WPXKXXUTVXYYVXWSXVVZWUXTWXVVY]YRRTYTWaWHURQVaWVYQURVTZXYWXYZWZNDY\[XXLVYZ\YpVTWVRFUJTUSYk\ZYZ]ISCbQ@BXOLVUW^XW^XO\TY`PZX>OYSSQ\aUN`R`XWVURW^Y_cKWY[XRTUWWTKNXTWaVTYWVU[aXYa[[WVRTLYcWVYXXVX VPWTWSWYXVVdXWYXUTZ[XRVVRTYTZUiUCSXbXSYWXTTWVSWPW\SKTXW_X[LVVMTVTTU]ZZW[XQPSURYR[[YT[UdTS[TNV[YXYQYYXT\XWUUWUNYYVY`ZZXRZTTY\XTRVTYQSN]_T[ZVU^QUSZZSQOVUZV_VRWV\ZZXXXSbRURYYX^YYSXTMOOYT[WZ_^VWTVUOVZYYg\M[WTYVVYXYZRM]XVVYY[XXXRWH[WXL[STTW^WWWYZYNYWZSXYWWQVUHXMZP`SYXVVVXVPSTPZQNV^XUSXZKVWIUQWVYaOXMYUW[UUQRc[TLNTYbZTWPWqPNBT_PXSUXaSXRRYRHW{\L\SVsORW^ZMP[RSWYT[UVRQYP.DNUKYXPUZ\QHYUUTXXSZW\TSQUSWUTQRS`NSSTPSTTKYKLWWWWGPUWWMRW_WXSjRVRObVP^V`S\^XXW`PZ[][VWXVXUGYLZUUZWR\SVXbZN\[_`LWYX]VX`VXU`TXYQVXWTTVUWTSUPZZZWXXYQYUZVQRXTTRWRWNWPY[WZbQ\XRZY\UTW]WXUXQXUVWRXbXWYMcZTRYRXVVWX[VUKVZSTUVYVb]]YQ[WZXPW[VV2\SSXXSUVW[`SVYNUR\WX]V`PVXWLd^ZVZU[VSYMZXXW]W[ULVW[WVRSWWSVTOOJUZV][XbJfN[VUUW]SC\UOWWV[`_VXXJW\ZXRS^YZYPUXYTXYZWRWXQXOU]YNZ^^SIT[V\^\OXWX\WX\SYZ\OXXTYZQV[VXMQU[YTV[WVUYN\][U]ZQY[TTTXTWNZWU[^XYWVUWQWTMT[U[RYUX^YWXRY[SV\ZXT[XYTQQ\KVWZT\P\RYVTEZVZKTWOTR]UXXKU`VNVSZTXVWUbUVV[[\WZQ[U[WUW][UWVRTYS[MXYTT[YWUUTYYYXYTcVS`WFYZSZV_[W[VPTZSZ\\d_aRT_NYR[_\]T[[[]UNRZYYZc[d[TWsPRQ[R]X[X]]]^tRQWTWoe[[N\RT[fTY\^XcXVM[OQN_^QX_\ZO[YFU\W]M]XO^S]YYZ`Z[Vac\OZX\]`^^YZ]RV^Z[_Q`BSZRPe]VZT]VXT[WWW]VXU\YbUXX][OXVVV_YU[RLXP^UQY[[ZWYTaaVWYXZWWXTUZV^YTXYSUWWUXXVSWUUTSVUVXWFWW\Y\WZTXR^WNXRWWVW[\YZ\[YTXWVXVVSYbZWY9YXZXZPUPWXYVWVWSWRKZXXXS`ZbP_]dX[UWQY\ZU[WKZV[kVU[Y[TX\\TWTXYUaZXYmYXYRS`VOPVVWX]\[HY[WVJVW[WZYYWXYXWRVaZPUYXW[\TZ`_cgUV\\VWdXPPUQbOTcTJRYRN[MSRXQdSPUYZd\hRNXaMNhXFORXXZTSQ^YhNU]S\MN^V]LYMPPUSYV4XM^[JMWXUSSYQXAUPcSBRSTYGSfSRXWQVRTW8UVYUSW]SSRSYQNOQ`URYWUUgVTOYUd[OVWXXV4R[WP`XUUROCQbQfZY\[[MWRTXjWeXUdx]YZPYXYdZ\\SY\UQUVZMZHSZkGRJXTZPWQ]\NrVYUaUPKW0XQVSVVT]WHZXVUYXTVVZOTBMYWRVfX`XSNZUXUYKZTYZZY^ZZZW[X^Y[ZV]VPYrXFYNNW`ZYYWSZ^\[dXZKRBSW[EZWUZZUZn[PXSXSOUWXVVZP[U\W[UOOY]]OZYsZJXRXY_[[Y[\RYUYWZ^[YUWWJ]WZMYe[RSW>YYLRTLTaWZU[^LWTVXW^VW^WMQ|Z:TTV_WTeWTUU^VVXcmQTKbdQWSrV_UVVdSSU\Tj\H\VExXO[]UYR]DXICXQQYV]YVUWUVTSUWISXXR[PXU[QYXXROHXZVTQUUR[YWX^YSVXSZQQPPTRXUXYXP]ZZV]RVRY]T^VUW^ZUXU\XW\ZYWYW^XTV]HNZYUW_XVWZUWKX]SFVS_OY\XOVg[]SRZsVXTGWUXTHgUPhSXVU[\V\JV]XaXRFV^XWWYWTVSZaWVXWYUZOTWYVbRVXTYOWUXR^]_XXYS]XNVHSWXXZVSS[VX`VX^WSXUZWVTRVOZSZRbXVTXY\UW[UYWYWXUZWU\YTXWZ[WXWZRXYWZ^S[WWRRX[ZZWXUZKZZ^TPhNYWSZTX]YaZ[YN[VWUZQX[ZYXWW[QVSLUUWTUYSVUS\RUVUUPWUWQNVVi\R\YQ[WMTYTZSWZX_TAUVTCRTVMWVZZTXTRYUSRT[ST7fUM]STSYbb^F`YMTQUPEVGXNWU[UVKMKXLTWW[VRY^\WY\TVVXKSFWUYTWTTWfZRWRU]YjTTW^UNSWXXQ[aRVXXWWUUXRTVVBZYYRWVWTSY[VSRWbTQTZWY[UUOT[VOVZXWc^VPRNWTGjTQSSVVMWQW\TVWWVPTeZWVSWXPZWXZ^ZYZW]WbW[TX]VW[YWMYbWV[X]WWTUXYUTVXQ\UgP6PRYYYT_Y[XYQUVUR]K\QQ^ZWXSSJ\YVXYoTWTUUWWQXOWVN\WWXNSTeCVQVLXX7WqWZV[TWXVUgXXTUTSZTTPiUT]XVUZ\UIZV[ZUSVXYXUWTY_VbUVZScWWW\Ti[YVOZOXXNXWTSZSZVOYK[JVY`F\XXUXXX]XWZ^VYXQX^PTbYW_IZ]YVRdW_[\WWRVUXVYXWVWZXXY[b\SYXXT\QUVdXTVZXVX[WJY[YY_R[YVVXUXIVMY\[Xa[]WYU[V^XMUYS[UZlXRZVsZ[Yd\kY[Vh^ZZYT\Q`ZWYTUWUKYDY[4AXSPX\]XZiW3OZMUi[YIYaWZX\WYZ_ZzPR\WYSZZVUY[MZXXUCVWQSWSLfZQW[WTUUV[QWSSVWRSQSRYOG\KPXR[YQYWSTVSUVSD[UUXZAhVTbSSRUXYSKWVPMUSQY[^W]ZWYJXUTQ]\T[NURSTT`TUTTLTUZTUQP\SSQ_RX]UPZMWUSRYVSY\SXXf[YY[X[Y\[X_ZZ]V]XV\[YO\G^^QIUSW\n\[\Vv]WXDKJU\XN[^YOYVXR]YWNXVZjYSSUGNTHgaVV`WD]_][^Xi[_E\VZV[[YZX`\DX^VZYZW]\Sf_P]\ZYYSZFWOWTZ]XXUZVQ^YS\YVWTRX`XXfU^KWUY]YWWVV^Y_W_UZYRSRW\SYYS^\QY^SWWYS\[TOQXTVUZXUZXXXVXUSZOSYVRZV][RZ\\UXVWVYQURWUW[]WOSVS\VV]_YSWXYZRYOTXYYYHZZVZP\YSZXUQN^[TSSQUUUV^[WXTYTV]PVYY^TZYU_^\IT^WS[[UZUVWcWWaDT\W^SXWUYUL\WZR]SWYRWXYTDUWTRRSVSRU]SZ]Z\NOaN\VTW\MU\^QYYVSaZXNWYWNXQWWQSYR\X[UQWXWSXXZ^`^VVZURWTWW_UYXXWRP\UT]XVYN\S[RVYXVSV]\XW`YS[T[WUYRWXW^__ZYXXYaYRQZVWRWVVXYYUVTRTUUVWXWTYYWTRYZ[]WWXX[UVYaUVZX[WRIZ[VXcVZVWVkVE`XWCWXT]dXMYWiVX[eI|U`RVWWXjXWOZYWWZYSZgWa\aPV[\XTYYWQWU@bXdYTVW`XVZYYZ[ZZ`cW\U^X[V[QSYVTUYZZXYVXZ\Y[bLO]TU_YZ^XU^]a[XEZWY\P6WYUs{Y\LU]RY\\[P\R[+_eeeWM\][C[S\V]SYb]YWMWW\_op\^AS]]ZO8Ydk\T[[[VXWoZ]]]\[YV`[O\YY^WXORUae_]\[\_ZZQWS\_VWQRYUTWO[XQ^VVXYWW][XJTX\U\WYZQT[VWWWOZ_WYYX`PXUMP\b[ZY@Y][RXUV\\Y[YRVUXSYZXXV[YXdZQVTWXHYX[T]W^R]RWkYZS[MZWX[XXWXKQV[WNXVVRUQSZVWPUVSUSZMWWXW\RUZVXZSWODbO[[TW[WYWUKT_WZP_TXRbXTQcTQU\TUTKQ[VHUSWM[NSX^V[RVX`RWLVVTRWWMXXWVVZSYYLSQRSVVUTWRSRZVZXUUNWXTSVSRZWWVRU`X\NX\\WSNVUSRU[X[YOQ`RSR[WXGVZ\XZVSUPW_X[K`RIY]PV`^WVYSS[RQ]PV^SfXTWO\\ZOTXWXXU[ZWSO][XYZYYWXUZ]SYWANT[JOZ\X]_YQT_ZQKXY[U\YZWUZVYPRMS[XSWZWYPWZQTRWWXY]VXYZ[]USU[SXWVYVZOSYTXN]ZNSYX[YYYQRW]XV\VXQTYVQWYTUVY^XTWSZISURYZ[VSRWZ\UZV\YXZQQTRYUNZYRRUSX\XYU0VSgTVWVRUVW\YLUWXPZVUZZZTYeRLQVU[UUgZXVTSXWXDVUYMU]WWVSY^ZUXTUUXVWQW[WQJPWO`[XSWR[V^VWXXVUW`UUXRYXZVV]VZRSPVX\ZXYN\]YdSVXVPTYZTyVXNRYeQ`WXUOSg[VYSYOWW^[(\T8`a^VTY\KQ^WQaX]VHEaTYhr^UM`XVQUS[TxVQZOTb]XH[YK\\U]O`o\bS[VYSRXOU[VUWYSWVYXvWUUVV`Y\S`T]BZVU\VMUgYYPTXWVQ^eVUZY]WTXVTWT]Oe[RMXX_ROT\ZZTT[ZULV\U`[U\\a[]XcOXTSQWZWDUYX[QZWPU\ZTZXZVR]YTOWWTVUY]_UVXQVQWXgaXaSDWaYXLPWS^W`YVW`[WSS\VVbTZ[WWQ][XXXZW_ZYUUFSYXVVVTbc/^[VSWYRX[WYSXYVdSE^QZ\Y\X[T\\XWU[MY\T]VWZTW_ZT^SWYYSXYVTYQWhZOVYaXXXY\[ZRTiXUZXYVV\[]YX^[WWTYQ[\UWTWTaXZL[X\OXTYYUVPXTO\T_[XQX`YMXYZXYWYZU\SUVYZVXSgVbSOS`TXZ\\W]TY[[VXW[TZ[WYTV`TVTW]U\SYVVFPVTYTZYTXTUZQZcTUUScTMXZULWVZMTZRT\SRSROPVS[XYRXTZVVX\VWSW^ZMURcXSY\XWXVTTXZNXXYVSSTYTeXWYP_]OZYV[WZUOX^UW[TXZOOZUXYZTZXNWTOX[XVDVZWWMRT`Y]WXWXYPXPIXV_YWNWYUYXVUZ[VWXTXKTXXS`XVT`SUSPTPXVXWV\QVGMUWoSR]YbYXYVHVYVGNZU\[X[WVhVZH`[WS>SS[bWH__`BUWNZSZSOZWcXWYQWXZAWUVZSWRXU\\?UYZTTUSOSTXZOQTU_VMQ\WY\XYVLXdT^Z[]IUEZVVWl`WVZOgYb_es9ZPR_nZNZVM[H\O^MX_|ZXVu[fda]VV;VXVYV_WTYqWOqT_ZZibV]G\OXSZSYTY^WWWYXZ\]R\XXY`NYa^TbJ_XQ]O]PVZTZVWUZi^TXVUZWRVZWZSTVXWTcSb[POPW[UWW[WWWXWXZccc\TWYRY[ZW[[\WYTGYW\9YOSVj[UbXWZZUTTWGdVa]SYQIXcYUXTWWW]ZAZYTWVXUVTTRYWNZXSWVRZVTWTK\V\Z]WY[[ZT[VRQUYRZ`QOXXUYVT[[YYOTTTZMX\XW[X[YUagWaOM^Y\XSSSSS\VZ[YXWZXX[WJbWXYPYZb]V_ZTYWWTYYUSXTZ[T\K[RZTY\cTVW_ZZZY]TW]VVV TTKVUMUNWWY^]QXWYOZWUVWYETkWbQLZ^UTOXWWVKUNXhRmNLX]RXST]]iZUUPIWTWDYNYKY^XRLRUYS`VVjZZ^V?XVVUpYIYXWWWUVWTSOTV^\RWZPY?}YUQ\[VQVXXYSWWSZYW[ZRVXSJHXWX^]X\WRQWV]_W\XYKWZSOSWPXRW_YXRU_\YTSW_WXbX\Y]S\ZPUVUYWNU[XULXYWf`TYY_ZPTUTW]UNV]VW[]WUX]TVSNVVWYUWZ_VO_XQ[XSsVY@ZWVUNWUUSSZXUUV[RUUUblMb^Y_PQRRRYTTVTYVaTdQXXU\WSSVTXXQSWRQgU[WX[O_]IUWP\QZV\JPbbWVUVVXeRNTTXUWRTTZgPTTWUTPTO\`RJTSWUVcV`X[]XYZ[WKXLXTXWX^VWXXTUXVV\YW[jdYK\YVYm\YVZSXQX_hXVUZ^VVWTW[ZWXWWdVUXnZa`]ROWbW^]XSNMVKeWZURYTLVOXUYXV[ZSWOWSUZWQTUXQZUkYXZWZOVOQLTYN^YUX^STWMYZT[PVUWTTVUHU[^\XWY[WZ[XTT\ZVWWR[ZZVJ[XW]W`RU[[cW^ZZZZ[MSOXVWWZW_VNZTXT\V^YPYS\ZZV\UTOVTPTT[VQYQI\KNL[YbYZXU[URTTZUKUWESY`ZXZ\_RYa]Y[XeTYV\T^XiP?W_WWVWaUUY[JYLY]fZP]Tg[XXY[TUYZV[cVU[UYA[U`pZN]\\\UXeZ^E[UVNWX,YaZVY[UZX_`u]U^VY]ZV[UVUb\^XRZb\_QW/VXKXV^TRVUS_TNRNWYWSUWXdTYcB^e_YRgT]TVWSRVUVReKWSYXURTd[EIQWRSYW_VU]YWVSPVX\T\UWcXYXQXbZQDHUOVUUTRSXUTZSTQUYbZVZROWWVYZTXQSY^YVYEVYUNZVRVWTXUW\[RNMR\T\WWYWXUVTWWRSPYQXYXWVUTUVUWWRXWV[TSVNZT^Z_ZWVRfZ[RV\WXUZWWYVUZRM[aWWZWTYWW`VWV[\WSWQ[VZTR^UW_VZSVWWaUCXTWXNSYZUVTZYXYS[VT][]ZQYYX^VWW[QPRQTSZY[WF^OXKY_`LXZWZVPRZYXUTUU?TOSYUVQMXVRIUOVSTYh^TZZPZUeBKdaV`RSpTVWUSVXSCqVSUXURTVGYGWUVTTUSYWNVNSNL`RZYRYLYn6RPLTTW_RWOTLXKVRWUTZQPZZLSSXWSTW^Y`WUYUU[XT\M_\V`T[TU[WLYZWWUTZV[UTTU\YNS\\UZ[XUR]VUUMT\WR[a\UKT\YRWSWXTZWYY\SXUYXSVUXXWZWQ[WYV^RWXQXYV]VUSUGWXYWUXXWX[TTQLYWUc\XYWXWZX^Z^YWXSUW]XXUVXWWWRX]YWWVQYVYVV]]_PcTaX`T\[XZZW^UWURPEWWX\`VYWVXTUXXUAWUYKVZVW\WXVU[XZXXTS\\UYX\XT[X^ZTWYWUYOW[XVVXWWWXSQWYSSVUVY]W[WWSZZ[WVZUTYVWXXRXY[W[XXYVXRX6WIT\TXUXY[VXYYYXVRZdWUVP\SXOWLUVZXXhUXZ]WXWWbRYRUVYVXTUZ[KWXYMXU^Z^ZUY[UXX\XYYUVWVXXXXRTTQ`XXUYNWF[ZHaSYYS]USZ\YQXWUHUS]ZQRKUSYVXWQYPXZYPZVW[WZW[TSWXBgYY\L[\OXVOWQUZUV[aXNYTRXVWT`iWWUMPZ`VKW[c]^YVVYac]bU[]_NWU[X`TYUUiUUZXV`RWTSYAWYa\V`Z]TUOSZRRUTYTRSVSVjU`Q>VK\nQRIXZRUMRQV_N\WIZXGX\JWgUUV[]PYXVGUdRUkZPIrY[KWUXVSZR\SPUVaX\SPUPUSUPRTUXITUSSTRPWTSVVWSV\UXZSeWRUWXZUXYWWWR[]UXZNVVXZ[F]PPTZFVUI\TUWZRcXXXaIPU^XSYWO\XbORYUTtXU_PXQOZNMXWRVVUTV_ZoYX\XOTYRUKWRXTUWTTZgUQWXX]ZXURVcW^UX^WX[]ZTwYU^XW\XVXYY^Z_YZW]aW\XTUXVJT]R`SURZXZUWXrX\VXVJYYNBYUWHYTQVZUZaUUX[XURWW^YO^TZVVTOZ\VX^WTWWPZOXSWYZUXP[U_V[XZXYXVWUXUSYWUVW\^VWOWU]VUL]QSTO_TTSVQSN]ZVNPSK9a>D^KcXRSS[RT[XTR\qE\HTGOUUDQRScT_WLVVO_TMWY>SX\YPSSN[MZ@LQTRWTQGVJSRXNXUWRSCNXOSTNQL]ZXOJTTTQRQP[Z_fV]VVYZPV[WXRXSWW\PX`R[\T]\\OYYYXPTVUUg]VVZ[_]]\Q]LjG^XMUOZYVXYbYU[OTVWTPSX`VW\[WSYVMQZUYX\_Q^XZTUYYcXVSWXlMQYWJT[UZQVWTT[XZPaS]?SRWX]UV^TZVS]TWVYTK]W]WTVTN]HXWTwORMWX\VVYKZ[\aVSaBXXRW^ao]YRSBSV[QV^WK[]ZM`V[UXXWZVcV]QJUYOT[TKVRPXVWQ\WWQSWV\Y]\YUKZRVVXRXY\]P\]RQ\f[P^U_OTKZeYYZLZb_W]eUbQIYV_ZfR^XZ\W]V\[YPN]O`UdWM^PYScPdWVThQ^Rf]Q_VXN[]YN[K\V_bR`TZ_RYP`]a[_[VTWVf``X^]NOJ[T^SZ_YQ]PU\WY^UTQNZmMbVTT?XA[VUWdHWTXQhUfRwZXPXVYDTVUYRU_ZJ^:Tcf[YPPZULLeVUS[ROVgZLeViXQ_bYSUE\T[VNVVV_UVHS]VVVUYYWAWM\WWRRXY\aSLYURfR[SFQUMDPcLOP_JIK^PDQGLVIKMTJQJLI<@F`NoTHQRRLO\LRRDB4SGOGBPWWOFEZNUM:N[SLQIUa?:MOP[VBUN5LP:FWINUWUN7PDQMNMOJDGM_COOCDKPR^KQIGQVILHNUUaTVZSYOVYUV[^PnVTWXvXWWYSxSiZ`TF[SZWVVRYVKXSVTglN\VOVTXUR]WYXZXsS_UTOX^eXTOfLZXVaLTiaVTTRU\\WKWZUWTVXIY9VVUVTWSQRS]VYZXWUWCUZUV\XWWXV[_XUWY[[V\UVWSWSQYXVYTUXYWYZZTWZ\[UTTXbV^XSE[YZX[ZXXXXYV6WXVZ[V\VSWVUWWWEMWXY[ZWNWXXTZVXU_WPYXQTX]YXXO_S_STZZVWV[]S\ZVTXYRXVTVWS[]SRUQTWUTPZWXUR^^QWQ\Z]RUXVVXXUSVSZ_U[XTTSPeVVZ]`RUZUXXSXSUSUT][YVO]WUQYWTWQ\XY^W[W^W\TSVWY\[UWRNYLJVZX^VU\TWa[ULYWYWUWYW_UW[XYJSYXUSTY7WWT[T\YUTSOWV[WYYWT[TRQ^YUPWPZJ\Q\XMYOYZV\[[bUP[USTZWtYXWQZUPTZX[Pd6_X\TB\]XVOZ\qIeRVQ`KXWW_ZW[]V[^@TSRWVV\[PW^L]\X]bYPVOT]VR^]Z{DRZ\S^aXnBZUYlXS]ZdXUZYZXVcYwWPQY\[VVZbjW_PYVVVOX\ZYUSbMW\U_XZSXZXU[P[XXQTUGWUYYVVWWZUTLYTTZUWYVUYSTWYUPMWP_YTQUWXTVZVUXN\WWVTcVWS^R\WQ^UUOUSXTNXZT[UU[IW`Z>\TUWV[ZCUXUVMTSa_V[V_SQT\P[SXSST\TTRZ\^O]Y]XR\ZYK\RX[WY]XYXXWPQS][PVMX[Z\i\cZW^OPX]U]XQ\OWNX_ZbUZWL\WUKOXZ\]Y\NYOSVUUS`YTQNTTRUWZS\ZYUSTTS^W[U_WYYP\]UVVVSXXTWX_WST\U]TTRXVXSVXUxWQ^[UQQa^QKWZXQ_UYU:I^Yc[GV[TWUTJNV\ShXVWpPKZnHAURbUUTV>[Ug_UPRSSVaVGXTVXVVU\P:OZRRTVQUVT[YZ@SVZUUJQXQh[bUHMYXZZd\UWVVRXTLYYQRSUWY[VV\XV_ZRUZ]TUX`VXZS]X`WVR\]UWUPWQX][\VO[XXYVQWZVVZXXUVWY_YVXWPZTW]]UKXXXU]UIUV`U[WOWYVZYXU^SR[LV\XH]aYUYSZUZZ[PWd\\\S=S[YXYX\QdiIWX[W[H\W^YWZ=[^TUYZRGZYUQZ[]T]^XSWZVV[`YKsh[VQXW\RRw[m_]hX?Y]LXqVW[]W\[X^PUT]Y]\_[WRUXX}^W[ZTYYX\ZV^SXSU\W]YP]SRL[\ZVLaUX][[W\WTOUXVO]P[\fWYVUV\SO`eZTW_KPSWTVX\U[YU\OVZU[]XUUTeYYZYaRU[XaVZZTSSSWTQRO[WHY\T[T^W__XTRMY[VTWRUWSYW^RLTTUZVYWWUXVURU[V[RXWP[PO\TV[XWSYPbKX[]\VWV^^\[Y\[VVPWTYWXNTWYQ]UVYP^ZUTXYUSWZUTTX`[VURWOZVRXVYTXWVSY_VTSZXRRVQXWWXVWUUX`ZVXX[YO\TXUU[XIZZYXWXUQXTUWYNYWNUYTTZZWY]WUV[RVXTQXUYT^]]TZWSWVUZQU\YT]ZUZVYTXTY[VQ_[YUYbSYOWUY]]VOXS[Q]GUOYTWQWaV_R[MVYVZTTTXUTXYV[XQWQFSUOU\Z[YV[hWY\TQZ_Y[ZUXJkNrX]kYYf[[WX[YR[UKj\]^GW[SGYWYVUVXWNZ\XXYWUZ^NZgQVNQXUYW]X|XWYXXb\W[Z\XXXSXcYUZU[VY[U]CZSc)RPWU\ZTXYZYYYQX]^2XX[YX[VYZYUVZU[`WQYHY]WRM[[][SV]VVkYnE[_VL]UlZlXVXZUY[PVSTYXWYYWTXPQXU\ZYTZMXPYYMZVRU[]\WYXXXQbWZVXYXZUXW]W?NXMXUWO[PWMYXWVSX\BL^\S_\XXQVMR`ZWZ]XV[TYYaWULXWVWZ[ZMCVuRZX[YYW]X\XWX]]XVW^d[UXYUTXRUWZY^YZZRZPXVH]QckYWURZSVYZN[VVW[TTQXTX_XSWVSVY_[[SY[UVXYeXMX]STYNTXVX^YURZUWaVVVVYOW]YXVUVUWUZXYY__TUXXVJQWZYW]SVP\U[\VRYVUXUWYUUUMQWWS_VT[[YLVVWRRQ_TVZT_UVV[^Q\QZRV[XYa]XVVQWX[LYYR^]WUSO[RWUUa[WTZT\]WZIUMTSVR[XTWU\ZQYW\QQWUQfZ\XZaV\RVO]VUU[AZVUXX]ZRS[USY`WTbVYa\WNXWUWXXYPNTWVXZWXVTUYWVZYWZWWYRZ[U2DcYWMZWNVOYWLV]ULzcT_QlWUTMVOQVWUY_T^XbTgRSZQTbUTXYUcmX]CXNXMWWRWIXYVXZUWZXeV]QXSWYVW^P[CO[U[UQXSW\U\]XSVVTOY\\F\U\W]VVXWYZT_]abTYOWT\^`Y]Z[VZYZZYcTZS][ZYJW\YU[SUHXVYh[I[UVOZfQYYYVUT[i_XR\WYWZ\~[_Y\W[[ZZe]T]UYWY_\UPXb=XXV\kXRVWZXVUTVYdWUZVTX\Q]WXPVYNP[YWZ[aZ[TZYROSb[Z][ZZZ]VPSQNTV]`YMWTRXWRZUXZPXSXUPVZSRV]S\[U\Z[[VSZSTVVXV[QQYZ]UWWWPWWOVPaZXQWZXVXV[PRSTdXX6fXWU^XR[LXPTTUVZRXXYWSa=aXA]OUUNYXUV=WYXIPdLPYPPWUZcZZSXWS;V\WHYS\NUYVZUWZMSKZZHMUQXX[TTVYWK\TTVUbTNSUR[TXYXUk`TUkWWOQM[dUU@UJ_VUWUWTQSNWKSNU]KUSVSOLUc;[R`[WYTYQ_TSLTUUXRdPOW\QTVVSRZ`QVX]SYTMVYU_\ZS]^UUMUX1RWYUPU^UYPQJUSWTSPVLRPQ[MWURRQWX_QFJRUTT^SXRWSUVk^XN[YYYWUULVTUPMNXSP^TQSDSLN9ORUJMSD]OOQ2NEPQQ;VTORLXPQDKSNLXI_JZlMcOVRTKMNIM_LWULMNHLIOQQQRDJ\GKLPVTXZHYWN`WYS]TWWZPHTTWWQU\WWE\]XSVYZWF]YUXSXWXYY]XRZXYXOTaUVWYQXXX_XTUUXSYZUV]YVWRWXW^]VTWWXY[TY]RWO\QXYWZ^_U\UXVNZSWYOW\SS\\VVZQYWOUPUTMUUZ]XLXZSUZVW[\XZWSMVU_]^ZXXMWYSYX[TXUJOWU`]VZRW\[bY]XYQ_XPZXYZRWQX[XZOYPWXM[UXXVYZLWY[WRUY[OY[X\VXT\WV[]X]WXHXWOW^MYYZ\WW\[WUSYW\\VTYWXbZVZX]SQUZY^YUOYUZXXNXVRQSVUYWY]XZb]YXLVSX_WYUUQWTYWXWRYYYTTVXVWLUSYUXWWW^WOUWSV\VPY`]YUYX_YXY^QLHZYXOXTTZ[MW[XWYUPE\UaYX\TXVUT[MTKWUYRMN`[IXWTQ[ZZWKYW^WTYZWMT\Z\OecXRWWXYZWPVQV^Ya]SZZVTXSVXVY^SVU[]Y[Z[YK]XVXW]XRLYZUWWOWKWWR^WZ_Y^XW_WPSVY_[U^WgUXbYZUXQYUYSX[[`^ROVVXS^YYVYUTYV`V^XR`_VU\VWTPkW[UVT`\[SW^SQ`WWX[_VTT\ZWT]SU\YUZ[bXYXV[]UW[VWU\SeW[UPYWW^^_`aWRXT`XU]TZZZZUVWpWWRYVOUWUUV^[ZVSUX_XWWQT\ZeYXPaWZ]TTXYTWXVUVVNW^QV\YVUSSL[XTYTQTUX0WKSaTSV]UVQVWR[SOSVWUZWUPYZVZUUSVWNTS[TVUVWTSVPKWVVSUUSRS\[O`LS^X]\WU]OPWU[YYUTSQMTdXRR[SZVX`YVQW^VTVWXXQU[XTeVSXWT]VWVXMUMTKWKaWZYZT\VUTRZQYVYMZUbYLX\NZWXUUXWH\WSUWYYRTUOULYZXRYXXUVQXY[WVIVUOUYPSTYWVO][WTUSEXYUVO`Ymb>W[RV[YMXXUVbUTWXZJVVPNXXSXXRPWWQWJVZWTdPVZTUZQ[[RUX\VpVUVT\TSPX[ZWVWWTUZU[WUYTXZXXUbWZ]JWUWVaXhUZQWUUXWeXSXWUQZTQSWRYVUWWTYUKVZEYVb[VZYRVW_TQV_ZNWPUYTXYKTUXYWYTnUYXVWUQUSMTRX[VWV^XQMVU[SJX[^VWVTTVSVXWRXZVUTVWSUVVWU`YTWWVOVVYTHZ]ZQ\OXXWY[uTWX]XXB\YX[ae]^GEaU^[YYZYUZ[M\Q[Q[nOVYT_\U\_KcX`^ZMYN_]XYVZOGY]JTc_T]eWAJX\]ZXaEY\XZXWX][_a_\XcWXWURYPYVTY`XZ[XZbVWZXTOUSbUVWXVQXYXWVWMNTUSTNXSe`GVU`WV@UXVXIV[VWbKWTYZWRW^XYNXUVV_XYUUW\SYaQXc\Z[TV\XSWXVNVJWVZVjVXUYRWWOVTUU[TVRX[]XNT`aUU\U^VcWWJYRNWVXNVWZZbVTWXWVUPZVUUGX]UKPXWTXUYUVWVKXYVcVHWPRPaUXQWSSVY\XVZUYMYaTQaU[[YR[VYUN]RfY[UWYSIXEWPWWUXWQ^Z]SXXWXVSUPZSYVZXWVYXJVNXUT^^U[SXSW^VYYV[TUYMVZTZUY[ZR[PQXT]^YSU]WRW[TZWJWQUKJXWTQXURTWWYYX]O[WTV_ZTPZYZWXSXQYIY]VU[\VQUU[ZVYZYUWRWYVSTXY^XXSYNZUZWSVVVYxVSSXWdZQWVZPWXRYU[X]UVUZFYRhY\XUU[ZMURTVWU^Ve__`WbUUWTVXZZRSX8V]Vk[RWZcJWYUZY[WS_RbXWVYQVU\UWUWWU[TVMWMXVYXQUUZYSQVYIUXYYXUOXPZORWXYOcWUPTN\WXYOZYNSQZYMWkYW[`S\WVbOJXQQOXVQSXR^^HbTN_\\^Ya\NgRZW[NSYVNWV]SINQT[QJcPS[N[XZ_KYTNTFJSYV]_[X_Y[UR=VWYS]d]Y[RTXZWV\XZCYW_PbXXUXQ[[VTSo_YT[[cSK^HP[U]VY_XTXVKXSV?@UTW^=WUSQ[aGT]WUNVR\EVQVUIVYOPQSYUSeZ_VYeWXSW]X[WRWYUZW\XJQZYVWZUWYZNV_TZUVUVXVYRWUUSVRNJPSUTWYXTWTXG^WWZhKUACIdaZNVSSP[T^UcR[VTRY[N\QR=TLQZSWL]PWYGZGU\C:YVMURWRQXOELS^RXT\GSISVURUSS^[_Q\\UQRWKNFUUYIVVYTQXIUU^VVPVYYVVUVVYWWXUWWXUVZXYUQHNR[_UZZUYVVWXVUaSVSRSMVPUTVTX]SUUXUAXWYQTPUWUUVNZSYSWQ[TBTUSXOYV]UbVRWWWTTTYFQRRWYRWSTUZUPRYXRU^U\UWUXVMUW[`^XXX[MTU\UWIKZZY[gZtSR[gT]\UA[XYY]Y^VSPCXSWWVUX^YTSUUr^MWj]fTXH[bcUWYT]ZZWh]NSWPZUW\d[][V[WUVX\SU\LXWZS\WPZ[[U_XWZZRUGYUeZWbWYQU[[Z[NYHcX_UIJSR\Sk[wJDFQ[UY]MTRYYS\P[QMNSRbZTXRW[ZYQdL[XYNZJWSYWbI_^\WX]ZRRWOkYYXKT\=XVX[[a\YhdMQQYYXZY]]S[ZQc[Za_d^9RPUQLMUHT^ZO^KYRZJPW_OZSM[WXLTWVOLRUTRQSFM^XLYCYcSJLX?|QLj]OcUNWLSL\O[^bTWNGNZVTINcXUVVTT_TXN=YQWNVPJPKS^\^UD`OQW|OdZdP`PPS=UY_aWWtQUdP[WZYYXX\[ZXZUXNW[YWV^TS@IcVX\UXZ[ZXR\YZVV@eS]YS[[WTUWSYUWZaXYTZU_RXIbY^QP[UWPNVNUYP\^XR^WUXVYXUVWZV]RNWXYWSVVUVWU[WWSVWUvVWZOBT\_PUWTQLUYWUZMLXVZUZYVXTXSWVWVZV_X]\VTXZ[V\TX_XdIZ]IL\YXeTRYUWXY\YQU^VLZXX`WYWXWRTYW^XSjP\VTOUYSUUX]VWXYSSTR\V\T`YVZUcTTTX[WAWY\]W[`YYZW^XxXUV^TRXYUYZWO\l[T[SU\RXZX[PXPZ`j\S_W^SYZ_TLYWXXYiZYSfX\SQQbZcMTS^ZhaZNZdZc\XPXbW[YWW[ZL]gVZd[WZY\]QLYXZZW\V\Y^XWIVRWYYXS^VUXVXVYUVSRRUYTUS[VKdW[SZVSQVXUUTV[WMaRUV_QVUUSWXM\ZTPOU\XaXBZ`i_UY^ZVTUSRWJfUWUWVYUU\WUUVRYWPULXSUXUTVUXZTXNTTW^TOWmVT7XUIYVQVRYQTaYZVTWXSXUWZWdV@^dPiWYUWSWTUSDVRWRbMZTUNUXUQYJSSUXXTTWX`WVWVGJWK\XVSU`kVTVSWVOYSQVUVTWUUWXZQGXYSWWUWUXUIVQgWWRU]V]U[^^_]WMQSXQ\NRYZXXWS\aJV[NS_ZVTRVYWWYS[Qa[UMXZYWWVe^\XX]S]VWZ[U^[UXY[XTWR[XWZ[YHUNWY]UZZZRXW[U]X]YYVA^VWVVYXe\Y\Y]O[UIXXdYPJRX\\RR[[XUYPYWXW[KYYV[OV\Xd\_XPXXaQRUW[X\TTWVRW^WYPWWX[WV\WOY_bRYZVaQ\X][US]SZWUQ\\U_VW[^YYUZUUSXQJYXVPRXZWW\`MYT\XTa`XXV^XVXVX\W\ZY[bT]]XYZWYRMSUVVTXNXSTZWWZWRVXU[X[VWRZRSVPUPX[[\_RSWWUWWWSSUYYYaXTTUT[VVT]XSWXZUSWUYSSY^ZVXHQUSWXTXZOVUV]STR^XTVO`ZYWTUZTWTO[SZY^Qad\Q]NXU]_TNZPd_bLeU_Z[[F`PUZLYWX]Z[X`]_V`Z^JN`[NT\WWQJc`\Y[VU]XTXL[W_TW`\MhOZYWYP`I[ZT`YX[W^LYSY[Z^YW]NZTVX]W]fcPZUQ^ZUT^UZbXVZWShXXQZRWWUTXLTSVTQPZUSXKUTMYY]SSYXYXSWY`SYVEUZT\`IO\XdX`[`TW[i[QVgV]VP[`TY[WVVVZWV\VY^V^XNdWUWZXXWVW]Y[UURVZYTTRdR]Z_VXX[hSOUTTY_RU[TQUQWX[SXRSJTXUUX]\ZSVVVYUVWYSZLOaWW[WWYTXTEXXXU\SZPZV\Wg[TVGZUWX[V[PY[Q_ZZX[eUZeVQXSWU^TRRSRQVYUVSbSU[TVSJbTV^VTZ[^XWVZWY6VRUWR^S]SXU_XOTTTTZPRWZTnXqBIFYSMWWTSRTVGV\XGeITWXZUUYRWhLXSUS=SYVpVbQXYYVNZWWSTZqVY[WJUW[ZZZARUTUTWXdUJUWPUUWUOVXKVC^XTTUUREXL[`_dXOOY[RYPQV^[XYXWWWYYVW`Y_\WV[[XZYIO\TVRTXTYSUW[cSaVSTUY[YW\ZGWVdeXYVVVWVTVZPUXXYXXR[YYRRYZUUXU\UQS\TWPWWXXTUV[_VFZ\TPVZVWZUY.YT[VTYWWVYO]_VPVVPYSUXQYh_V]`PhVWVWSV`TQUQRVCMU^IZEYU[WUSFUYTYUZUWZWTZUHGSJ\\WUXY_[SXPRWU]S]ZEUQSWWVULSR\VVTVSP[WaG]MXSTaVKRZTTHTX_XS_TVVRR`W:RSST`UUXUWZPYPRNWU`[WTYTTRQTWRO[TQRYELVWSX[NTUSW:SZVEVLQRT^REdSVNSWZU?_TQXPXQOYVVPTWWTUTO>RYMXXWRRVZPWO`TUOSNVcXWRWTbUTNXXTU]UZXMTYVUPTS[WMK[VXXV\VSXWXSSXYWVYWYW[PURRYWWZXSYQUXWSWWU]X_XWQ\]UVLWTWR]WWVZNYU`UYXW^V]T`MTX_XSZXUU^cYXV]VWWSUSWY]PXYR[YVU\]WS_\UYZPYX[XNP_YYXQYTWWZXWVR\TX\UXTXWYUXR]TVYXV^V]SYAV]XXU^ZVURXWWQ[WXWVVU^b]YVYXWZSYWUSTYSTMFX`]WWPPS_UQOXV[U\OSYVYPUWFQUIZTUVZV_YbXUXYT\UYSXWTWQRTW\W[XVXUWLWWXWOV^UVYVcg[W^QZWVVX\V\XTZTVYXUVUXW\WWZOXWSNZXYT]V\VUPVXRSV]PQ[QVXP\XU`\Y_XXVUW^SZXVRWVWJTVNOZRRHVUVbUJ[YWMQ_ZWTR]OGfYYZV`JWtR\XTIYQ\LbKTIaD\TTN[HbU[XQKSZ[EYI`WbOY]TR\ZSVOYG_WbT\R[OULVMWRNWUfYMYPTVTSXLV_RVUQWSVWHXpWYjW[Q[WWXeTVQ_YQUXVT^HWZ[XTZ^S8PYZiURX]ZWTYYY`M@QF\KVT[eWXMSZZXYVV[MU^OZWTTZYXXPVeCWMWKWWVWLYZWVVWSVW]YYZNPZXZXUS]`X[DYTRVUY_UX]WTiVZSLWZVX]XTXZWSOLXVYYO]PT]NVYXVVMTHZTSWXUKZRV`UYHWW`ZSWS\VR]YY]VSX^PTZ\bXXWVVWUS`XYVL^^XXUYWVXSRUVTYS[RXTTWbY`W\XWUXZ^\]^[[Wf\P^UVXKWRTQVXZQVRSYPVVTPVZ^QcP\UZUS[XPZTYVX\[UY[]TNLUVcTYcWW[VWQRWUZVZVSWX^[Y\YUVVY]\YVZYZ^TUXXYWSLWYWR[W\YVVZX[UXVWWVWRZYaRPWZZTNWWcVVXNXQXWXXZIYWQPSPRW]WWYZZ\XXYZRRYQX\V^X^WN^\USXPU]YSZIXTTQW]^XYTT^VXXSW[YXYXY[Wc\ZXVYU]YWXXZFXWW[_?OWJEU[[W[ZVYY\VZUVVVZSWVXaXSVXXVV\[UUZRWYSLPQ^TUQ\ZY\W[VV_U_VUXUSWVKWXT?VVMYXY[WXU[XYSaWYTWWXYWYUZVVQ^QXSVXUPW\WWYVSYZWXYQTZ[M]_SRTUXOSaXXM[XSUPXYXWYY@Y[LTYKWPXY[TWU]ZYXSTZZZ^>Zs8RR`ZUWX\ZdYUOZaVhX[YSdiZXWZ[WcQaWV\ZY[f[a\Zc^Y_IW\SWNJ^wSZPXUYZYZCVTYZXXWXZVZUUZZ\XbV\vXF]XWUZP\KUZVUcTTVYS[Z\QRZ^_PZUVZ[SdVY[UWUSX`WWTTYaP[WRV[UT]U][eSZTJ\^ZXKTXT[\VVXXSW[UO`XRR`UWTKRYW\VY[ZYUWSUNY\VLV`VP[HOV^TXXZYVWY_XabTWXRY)UT^ZUXSZXWRa[WTWVgXSSX_VTHWQbWXRcUOTTVTRU\UfOXTQUVRVQdXMLTXRU:V[TZVAPNF_UAdVTRXHaVAaUNZIXT]VFYPTUZXWHQDUPTVXVXXUVHXGfUYVW]PGTMT\V[VRZXYXad[]YUJdRVZLRS[Z[YZYUYVXVWPXYS\U^XL[XZQbd`UZTX^]YZLVL][X\\SVUV[WWWXS^]WWPQUUKYTX^_Y[WUXXQYYXVZ`YZIP`W]CUZZWZXYXZ\VUYUYK\\YWThYYZZW`\IZ[YPSWX[\UQ\pJ`mZVOZ\=WnVT;WaZ_\FRR`FY]S^]_KYaXYB[[X:UPXG\aVTFRZNTLUbapYHV_WRf]TWTXWXY\f\hXLUWZZd[`ZZZP`W[OSU[=كèΐpᾶž~kuOuُգoiREMlyoB~b͍x£|Ƣ4d֕nQ~})w}mo~Z~zk{hevv]~zqno}jrw~jy~wo~yyy~uco{|vx~ȯQf}gmt{ęřƗsx|kՌ~utuvu~v{dzd}v~xyx{|~z{z|v~vh|yury¢tĊzp~{z\~ژחwz|{uzDž}}l{z}}{t|z~֧|_|]ɗs`qtj{}|k{{}nɘzzwoΚwxm}szm}qy}q˙}syzlzw{{yo|svowvl{xwwŚ{^~}{~}ĜysyvĔznsn}~Ιqyl|{xz|~~}zql}n}{s|w{̚|Þzwz}w{ݖš|{}yygkØ~Qyy|y|{xʔ}{|i~bv|~|~}sz}pth}~}qxq{lyvx~|~uuymzÚy~|~vtskn}ԫtytlyuyw|rwlÔƚxhbvv|wskri}w~x|zw}}~|ow|}tv{yw|z~}g{}yɖ~zlvä~zx~wx~v~xwwysxs~zqs{}}rnv•՘{{{ƒz~|yzn{{}y{jt~t|~}{~{7j`}~mw{o|lVtg|hg|~{{zhuzn}wv^uw~~xve||po|}~t~|{yy}~||~|qvv}|j7kwrvwO~|e|uS}o~z̕Z~||@z}x|bzy|w}~|~|]||yx{}~sx|xvt~|{uJV`xmf N}ȅ~~}{|zx8px{~r|v_o{x{}~~~n[zsy~vTynq~~~}zs|}{~}s~~~v~Uy}~{z~~{qsšl~\XWz~|f||6\||ks}xsgvzsuba#k_ښ{Řz4~|wYA1yKqPǕ]y=E;zzbdm`xP@Hmۉd ,y'qNxŌzOruYg_fmihCdl}woccn'{xs`N oezyWw]]ȃym jZolAi=gWsv[c&z`S8{^^gtpwtpstktujsofqghmss}wjhspqysvlljppuvpqswji{thwmoy}poloqtnvmihqvpnrhnrvtsofunuttuchs~reupol_nrvkxnmujofyssxqrlkwyupqnpsmuktqqtrrsruqyumtvrsuqtmlsktmjukronorrssuoxnonrpzrnonptrtvol~onnsri`rspqmwopyporwpl{ps~fvptkk_woit}wpiuouyt]qjlbltvovjqsso{uzmxhlk_glrknorufmwqVmfremev^srfoqrrmsdvlcnwtnypwZaorpuewl}mnozpqqnhjswejmqtjysofknjostrxjiiexrhktilklpfgsipgoogxt_tfwxddoobnhqrosppqwqrypqpsq[qoqpppqonponrnpnspotqqpnpr|qpqporspqqmpoppupnoobnrtevprg]|fmouqoi_lrw\ffwuwausmtkbsunyXorop}hre^ryqz~fjm^fmeokjkkl{utxoxqrqqnlvqzssqnisuywnwz|otrrqsqnjpomqsf_{zqol{odpptlpxu~tmirjy{sdmjyziq{fwohmpu~aswrowlyn|hil`gnfrqgnnmin|mzpqxtvoxiklqwcz~rplpmvxtsgliv}ltvntsunxqtpx{qpjtmpnqrteq{xveljnkmcyqqjppsTcbgjpwunhnluqsqn|jfjmloomsoqafurvqjnrtes|lyhkuljskp:rsvvrso~cvGpqvdm~low~wt^rc|nusw[dthl{hpoyssycwtwmzcmjl|Ohe{~Otenrl`dpnvY^xk{oz{~mple^urqc`wqd^qosytn~jq|cmshiirybohjnrxlpzcpvkjiuijjklsithqokn|~svocsw|qyuqtotrknoyonmjnutvjjqvvtsruqmomdtmjftghnpormtsgiokrq~oee~{ndkptofmzt'om`mudvkRvrxnptywchumylkvzp}}qur{}gromiwktnkq}v{~oordnvvqlwkhkkopitrnqqy]ovdk}yylskkvnvwsz}ytsnjk@ollyq|olktjthnnn{rswnprtqj~msswwykmjmqfqirhrsmnturpo|sxifkprertpnqynvwwlPqpakprlkJw~rtwfkiusxxohvtl}vqotrnwtbnz}}xlnprnrttmSyrvvwtk|~yWxtmpgqxuwtwrplvrvqqmtcotwuzrznturzw{qj_ssvxvqb{}x}h]qoo`fLqhhtgvl\tjsprvtbmgtq\lpmhjojq~mxnsqjknbxwyzk}Szuujclmgqnurpmktumuukixouussytqkqqj~poquywoxplpwr|cqk|pottssmvqprimsrsonzohyu-txqvpntx|{cmowktlwurp{zuqpoHrsrooown~tyw{xkv{pwXpzshssugrqguktmrYqwpknj]bqmahl]vqwyozrotmjnl~opkgommmchqxrngqx}oqrY|rKeer{prnimqwsd\gn_bwrPdvqnbszevdhg{sprfpprztrZfkyacxqElT}budqld\_x{mall^fpqo{m\spchwkhuslsK||bnrtmruqvp{jxrkznrlptrlsqrqmspsupsjrjopl|rktrqpqtwklsnjvskqrorunoxphpjl|}{jvpvq{swkkqhtw|hr{oukmz|sjxnxysuwohokfmt|p}urv|pegrftbnyrlweYetfsd|{kubxsppijnpvl`mwqiuag~kpuwiiouc}idsoikrd]elrsmcjunreohnjqvgsursuklvnbfmnuqysrhljutnmshd\}nswXo{qsoohipcoqnsow]kvmorqpltemmnshukprhoiunvp{mhisoqrmlofzqwpt`pxcrohuumsrijslnsryessdynnrmswrugu^lmvminolmmqslxipmoisp{rnrnokpr`opjrqp~bwnsrooqrypsrnymmvtipujnoxsomlgpnmqpomprhrportnqrmsompo~usrorovtojhotmmtjrttmmqqwssqpjx_qkywxouvqkssdapmnaopt}oqhxcglooopjrlngetwmpswusvosfrtkkwz`qm{iegrrqpulmtcqsgrkosmtojunlpsxmrttkqqgtrpkujqsnmit}atrcfhbsjfuqYutnu}rjsvnpeq[ut{l~umwlw\Yuk~xhtq`rnxvlss}s[zrronyhmqnlwuupghayxrrlqvznsrocolxmndfvluts|y}|quknqrcspopoppwsrqvpjqonqrpomsrnppooppsopooopppprnpqqtonppmrpumnpxqpnpctqu^plyrduowrwgvupntrqomYqlipkn`hpqVjx^qkfvhgp]arvRgn]wbmtvvdhri}sssesq{cte}qthUnyr}mdr|rpkiqzr}qmixxwgxp}pwsjjv[~sopywWrwwvsYuqhctysgoxvqpjwuxpt\yw{vvo`urwfwstt|fssufdwulfw_rd|tmhrmomomq|djhhxs``aivzfgpfclsskjmhrjfreozfieliifclitonizhw|~Itrl~ot}~tko^wtj~rpkzs{plll`olsqYlof~n~cvqwpcn{ng{eiyrphtomjzlnmg}poikzeqthilkpuhgthuwillgjfwlgmlj|tgkgwphklmahjt{mpnivlwtqwnyruxhxf\ssfvpwtmroyltuqi}ywwvtwtucxnnxoqqsnmsdoauvshPn{pihnnl[nrxY{eewpqykmxysppgjjtoghlwqwlotpi|xmrtsZ}upswqpvp{vsqrlsfptssqnlludxqmmegtolmqxwsipmhnjstmpqetsvzprriptqqqppuomqnprvmqpqpuooqnurrtpqpprrqpsrpiqpqpprvpppsqqpqqpsnqoqtqpqpclqppd{jqm|iksKrpkrxulxshmkqnmotjjlnkohitojcig}pijpyfhnvsmdixui^bcMmriwh`xy^ryydmqhWvqkgdb|ldxldsSjvg}}ubpm^~xS]uemopnrzvsetsDoxjlpy}rlstvwupsmpyuez}s}ql{n{punilrmjrrttktxurqytnsuqprnqmoqpionjlronmuowsvt}qolsqpttnkkqnkeqvqopomnwrwqpoorqoprproswZozvyqvnoryoqpijgtmrrqyoqtquqnkrilo|srrtmmgtlmkksiostkpsoruu[d\x{hqjqmvrerryqnrgniRmos{zpnnsxptmtuoil_mjvdZ`omqpjsVghmjtoomdmootiukZtpnnpvs^ti{wjgjqf{|eotlj{krzn{ttsag}|dijvssrvnbtwsqmsqsuqqtgsp|rqszejuevswiljd|qnnwookqrmbrfwlzp`vyurrnmtnpilnpqlzvqqouumjpuosrsplotdnkqjlttjmupworkvvqsltksmucmqktpvrojspqmynwkjposrunozsigurkqorqnpmnelhoomhontjivtuletrounnrmzwauytnkipxlqonzmtouxnmortwrokklmhxgwwm|yrvsrkonqpxouotnununmonzpsyqlqkyw|nqx{nywu_sugfsXwys{hcphyumqpnvqvowwr{oo[svumrlknmpnyt{pnrvtsrxm|tljnroqpuktk}kxrzjtghgqutr}sv{qmupisdorqptqompmrndrvjkcygjnkop[hbqaqoknijyiKmcjbgor\pmiqoy|micompthtqy][vuly]xjsnnq|nojm[^lpi~npkuwmkn}n}attzq{t{xsdrmr_mrutwk{infb{lqjpqmsmazrmolarqmnq|rsovybxqIp{qisjsojst|tkjjkips[nowkyozuozm|x^ulkzxjjqrovsarrtwaymXxtuuqmkmuurm_nsstustxsuut}ustlu}gswuvtu{}e`srpvtxZJ|cpwfarjgonniqomstSvo}moonvsz^q{civkwifal{njenjesxteqxTscjduitounsryxtsptnvuwkxzuixqv{pqltmoq|hkkpheollqrnziqg^tsdclqhjjq{aaksilcrfcgf[qredntfgt_ftgqeir[ml^ofty}icbfnixmovywntvonnnqlktqusoxp|}wcmjkwhouiqwr`ylkn}oyh\onskujroqnunfmwnrjIqvnTp}q{qtwpmnsrs{goorssq`zlxvrqobqrerhdop~znmk|q||ojuspqzd~rzl~hpt={zyqgpjsyppun}l"v|pyxhOqpomqoqmuik>|lvwrrqqnqsqqqpqnopnqpppqoprrqrqqqppoqsmqposqnsqqooqppoqrsprrprpoprvyuutnb{nt}pvwv!ucvjpius{mqmrjt|wt_wrrjowtrm{nstkmqux`YnwmjqEZx|upw{{UmJvBrmtf|cuuwarqvpMzzjxnywrr}n]}sWsf^}yWpXgnkxrnynqrrjmtpirpolnhqunorwyrvrlkrkjoomuprv}sompqppuqvqqhnlmxslqtngsotseh}skpnvmap\ykonmduploqkyvkappqlrjmutuhgm~vrjomrmotsnssrtufn~zpdpuyniunrqpu|rmolxvn^lutgmjqfmixpprokyejyh~wgg`pqxorZngkiyxozcepgkfoeoqevipjshrfkpYrmwvmxqdtmjhjnm]xjdzbczkw{jipnvhomlrrpqqvtrxlxyijwqvmj|lippnvwitrqiwtlswnmtqiuwsjxpvtqnvrxksplyznpjqgomrouxxqk|rpokpiotsiligvqtvlowjvjjtpomnqprxxlv{vrxnrtvuscuvbjomURtilsytrrevxzk{mtqcpg]qj_oyfqXowyh]qnrbelo~aaal`cnNsdi|rlcsnsirmonutnndnjnnofnzfizwiq^ct}qp[{tl|pk~pqvxzqsepfttlrrrrssppknqqqqqlqotrqtusnuprsplpoosrosopxrruprupsqvqooprrpqorzl|qrnvxtqhuuuyqktjhivl}vwms~twkpy{{_iruw{dzrhqtwpmjz~njqlfnulexZnmpmlljlovmoqopqqf~owgpnonngvfmpfuvnsbknuvkziekmtrovqpt{pslmspms|usrvklqq{tzhuoxngxpmptyyjubrnorrnnsvqvfntdnjtpwosprpqr{ppssropqqpoqqrnqqqqrrqqpnqqppqpqqrppqrqrrqosqosqppppprqpki{wwnosuqrunmqq~yr_rjflcpmuxszfuq`wsfpymmtxkephuywooqyuxwk{vtulukulpqrpjfadrksrr}~t|h||mxl`nsnlqpjktudpewj]wcvx{jn]knnjzttgp\euwumowk7|f~kvqtmsqv|rnpXv~hs{uporsnxgtupvtrrwiqomroirqvdquklowr}qoyqswXhgydio{me{danrroejhcvjuquksmupordzt}qrvjlqnfforsws{osnlpqfpikhldogsqsrvtolplusurswpvnznisxlrivsskkxxmgqosguqpjvivsk{rorpznspmolrwlrkkqsimkqqpsoolkkitmptmupnopnvjlptmopmkytsl_Wrok`fqvp[kskja~rd~|ltkvwnwnnuolm{ghpe|ii{ivzltvstw}vzutsqudhus~cpnslooxojpmrlsqplnxsmovpzrqool{{ovhuqqurqupglozunotreznstbksxicnj{rtu}|npuo]gs|sju~rivfpgnwrjdrvan}vponkppjtsnxzwiplnqj^`ykscxd{rk~iurloti{xpvkpZuioisrdolyhnqtxxjs{fdpfstrsnptpkauosgoolkrlmspnrxognspmloqnqrhmkslrqkplovjniksttjnvvpoidengsotpkwst~quvzhtsrlmclvmbf}nkf{urpj|runyjjpyysh}rwqpyuo~pssnrlopmqupynqsskrlogyyqgusnsdnqksokpmqrsxqposqh|mnhsimrnrpkrpilvskvdgmxoawdok{qulyplipiq}rqgrclrq|sdql~kodsopzxjhywrtf}ojlopmnhq\/fegeof+cpeqnt~UzXegkwzggqpudoe\ovnPznbvw|zpl_r`}t{i{jorultqtqtrwtla}synsmwer_rvrzqkln\rkmlqihqooz}kucnro_nlnv}nxoqrrrpqq{ppqpqqrptqpqotrrroqprprrprpqkqpqrqsrppprqspqrprqqqqsqqqqj|gek\zgIskq{zlvn|i}tsncdvnygryt^j~nqo~j\f_pkz{vwgonvjuKjrwufnrkr~Zjrwyfnzbxj{ksgpwekhkhmekitqoTyjejsltwzpfse|qndlroytpqqqsqurwktezqltfnwtjsgmutiusoxzs~znp{htsohiuyntqmoqmhdgynruxqtrforhxsqksunsom{rzujus|yrnpyrvtwriouwqwtrrvuqhqx}v{vuwfmqlkprpuluqmzs{Yqmszohkwfiewqgpkl|wmuykntqpyymyncusxnqnnv_tjnhnpirjvoXsqfpjqsqtrpyjvbrumunhJkntbinUmmfthfqfn{wDaoRximnv{vyhyeioigo]evZ}qmzwdvsZrtpro\|nsfmmu]vn~vmh}{rvuxgcoysrqlonsuqilpxposrxosrknkxh{qrfr{qqmtiuuugqynrkebhyqwtquovpvp_qjpmptrqxxpmlurusosimsmhlqftknnollinqnmyuplorpstistwpounqriojvqoqn}wqmtkyoinrttq{v{llhxrsolnqtvovnzrosuttpkrmmwpbxjntq]sol|ejisnqjzxzonwmtsvullrzzstrhqq|i|sngpytnahuuutkvyl{]ihhhmvpsojo_pbopqxsjnwsqvoivmqjsntj|xwdnrkrsuhzrqmfqwpkvtimlofskqkrposnmqcsohuwy]fsqgdmevqsmtzpwjn|ks~jokcjuvxjkilwfrmvuhirqxi]bkwuo|mrvptpuls{tfn}peqehtuivpx]qnw}^uj[rwj~{|{skmquyxsw|frpqutjmgpmmqxoqqwldttmnnimnmgkpixqtptqrnpeksmjgnpxmzlmtkpohqipsqppqqprssqotqrprppqpqqsqqqspqqprqppqqpqpqqqroqqpqptpqrorqrqqmqsrrpdropnunklmuuplkxsqsxlrk[lmvg{e}pupqkpnin~uxzlfmkktuws{tntrlnkn|pwohtp`upt={f~m~now|pshwsgjvrzdkwqh]|nri|ve}lp}ow`pswttoommonz{hyvrjethijmloprs`dyttsqtptsypnmhpdrwqy|rvc~lkjmuboqulsS\{uzmlsjnqjlpqrjot|btigVrt`eqcnssfhlxbRqjltgt\m{ohkwynToiedhwqqoqs|npprmqkmpqrztmmeqrivsrl{vuzxqypnhdrkknfmmtxc|tltvsqynprnebmuqpl}rokqvmyjomjmsznm|kolprogoklvNllrklpmlrfhovemniptjmg]owirlhyvowrwromitmkurtqvzt~pnp{pp}txpqygz}ntzpwmurvneymnyrlmxp`gkxtknmNmueuiv{y\vysrfsx`qwnM{phwrluhr|}okxqhw}yxtn{onh+jgsoqzttyurwvwr{sxsqlprovvpeilvzstr?zyowmtvqtvppgspltq|twTutqsqommnusqftuorqptt}bpomywpqnlpmnpjmsucjnoxvsgxpvrimppo~nplsovlgckqyrdw{lnotlutljrsounphoroodssrsurqxq}kqzmjutjmllskttoysfsvsmuezmtmyswnq;ownvx}muwwztpmyqjuweysvtuznxqv[j}e|{gptn~svwesu`hrtll|sfte[osiulpo^lfptudrym~lhodiruqhxjxsrsvp{gevzoGnogznlqmmpqovn}qzoppoqgnxsgl|qywlp}ptgujqtryvumliolthjkwnqm`txhojXmgbcyeklt\b{\~napkufjnnsyuqjjbwhzkqgesq}\Myvb\~fgroruupz{syumxrblonrupuvy[ejlmqyopqsjnb{ilo{ukmxufpduxwlprsetlsdwwjkyfbgskopzfxnqwvsjmovvfuud_ovsn`kkszplqubwvkytjoso}`nylqqrpjstoypm\{lzlssy{ym{mrrjmqtdoznonswpnxkjruknncmi{plerrpidorwtlggztqnll}i{nxk>urwydlflvxqxyfp{om~llXZhl|yipw{som}Zdrquz`p|lmpumrjtgrsxzimjxlkxsxlpcqwqsmuhmurwdrsmknsk|jqmqtqsq|nrnkpvovmrvnwohqqmsnkxp}suqjbnphktpitqpvfnowllqylwkwqotq^t~pyosrnuqw{tU{osjytwsgoujvlfskrqcktltmxkoimskjvplmdnornrcrsonraunrrm|rqophtrtorqrdtotvnsnolltrsgy~~rsenxzmirpqqns}qnmf{iqnqqrwqnqtrzpply}npursntjrrsvrsqrjjoptvyknwqsixsvkhtqxtxlnrxmrqvmprtswqnwlmsjpnqpk}tmvvn|rnnpoprmqwmsyqxgrnvwyv{qltlsunkqomsuzlkrsowns`gwphm{eervqtrqsynvronqorxruqo~nxltqqxntqoiopzpvpkpqnlstnpykrvlokoyoppoynlsnqtlswmqvfmqprvppxqppmoqrmpnronul~uvlg|onjrmnmvtrwwrmqpoi|kg{tgtv`z\|vwmqxqltrsp{uphpttrusepqwhjoslnmurtsgphpyhirqlqrcgllnhiyd~u}llpmkonf{htqehlcf{aviyt^fmlsduuhplfgrrYjrs_fskWhnjqprgivpnkYrnq}o}rmpnpomrpoviooqsqkhfhucjlplkjlrnfrpyhqmosvmpkwkomju}sirm}qkrrzjtsxsbpshnioonowenonrkxgxpordpgniu{`{gtpr_mqilmekn{ppUouqjpnjkkcorskmooincenmupw\pkvptz{ssqtm}nrpeuyrwpufquotvrnsmkripsf|qkpmvzvi\mljup|iurpwmp}jhluoqpnmlqshzckouqppvhptzlpdjmtojqnvjrxrqrosromsoshipopmisqqmtmolnuruqlpkrqulqkeulvnluuovjvTnuorvllphriujonppirpvolqrgbsmhos{jrqwnfsnusop|rqppzonpjmrtisvksryjroivpjlpsrsomwvsnypsvwspqoqssnpqwqptqo{qotprtttlqvtproxwplhuyeruof|gulskuqslnnotjouotqqwzphslbnfvduqpsoqmvnkrsprhrnyrxmprv~yjsvuottxmlrsosxvkqrnrpvjqlvvrosvxlqsfrpurvnamnfzsqoamln{Xymtnx}cpyhdzrysmnuksmooxpkupcuqjwshqm_rsufjbopqplsnh~n|{pm|lv_lthyv^|twsomgsrovnznkyosxr{vzypx{qpell]r{vrp~xwpppqpqqqqqsprsso`ojppnuqpqpoqroppsprqprqoopwrqorpprnrpmpnqrtotppixtmww^gnv^ltq}stjsggqwts}cozsuwBdsqluwoywspsvyzkdkcz{onuxqwlsqtwwnukou{wu}prqutpgieqtsoltooppijbrjtgnnssrxwqirgntfpp{vvnlsmyyosvspnql}rq{psnvpnvzgmorcroowps{atrcqiyqp^_jqocsitzxiqrsnnqmsvjolmnslorwr]twqs^ugzqkwpkmrqrwstmrrttr~nxyqjoomtivrpqlzlsvptpspiouwtqiz|pxoiozwtfscvlucupeylnoinu{vgogrxru~romhqqrkr{krxlpjtupltshpnrprr|vovtpqoeiouqsfomqpxpqsvyvo|srpoktptnnnyosltmoxqjonqxlhjmjqxmuynfrkrvsvsiyjprrrnym{jpqtkorztrpq{^xjtwkt}|gte~_xszbtkpxoxnxtqqnWqucslsq{lxrte}pzwsxom`px{mylmqsiux~qpmstaupyhx~nt}smmhmhksj~iore~jnqunochiypismtjjtopuhmtfktukrjsfnju>lytppgliwtxnpipiqxGrrrrxpSomljmhjoqscntjrotswcyrks_wlvzeiowttuzneefsivul}tnwqzpwxol`vrkyuhtfx|ootkmuzrwzn`XtuWmuzq{\rcsNL{wrzmsyukl}uiwro}wskfqzqyvlvakjvcjicicnfxpypjzgtpznmwohpjujsljhz|usltulskvrtynnirtmkkrkydsqtpkxopjnnvmzqropoprysppsolrpooorprnqpqpporrpqpqrpqpppqrtqprqooqpporqprozopoonissqjt}pomrkoztlnipqhxmoptvuwtuognq^uurymrrtoqqkkpjlsqprsqruilwxlZxmdqysYt~uh~{nh|djqnj||srqguyqlyzznrmmqs}p{gewtmmZpojp`n|mp\rp|tw|tQzrv~yqkgtnqr^uinqjiqrjtypf`sorlvkv}}qnz{qmoqropvloqmkwrqmWp|porkknnuudlmptjphtrmsnqsprirqinxlspidrymdpnpomrj|lbtooyfj~wgsxs|qnworhmwt{f`pvtn|uqqsgajqsj|qgxy|ws|pwuyjvd|vigipnlpdhtwjrcil`r}qxueh|m|iwlqolnuksuzyzp{kgjg`~||v~vwntmtjueqvvkqs|kp{pybfhqrtpynokwgmflrpjoiqupojjnihp{jrvUw{rlqpwnqprxh~skxrodsojspnvvwyruolidnsplywmjkfvruwqqs~omutqnsvutottqtspupmcmrptunjr`knptorqr}otpgwpo{zqsuomtvkkmlsrso_nqrtpopunmoqr`qs}r|omvsubtltjm{crwmnly}lrrojvbjpmvdsxkcmjnzjzevkerjplmsrlklalrpqmqqrewraqfwrlxfs}_n~qvkmgowlufvrrauoczlqph~ono}dvuqrsvoh}vkxvqslsp|srstkvkujtsrpyrmkfpvt{ptvprpr}rtjmksogkoqquypujqspvqozwtx|tcnz}h|`tknfr8qsknaoktuvflqmkoyWprrtum{mqzpxonttkh}pmixtxtmvssiqtrpnqtm\yqktrt~~|yuiqqxlqwufVttkfplomqjww}qlzgtqok{nmwmdlqolmuoppumlstrttskmrjzuxsopkloysnsofsxhpgkmhizsururmuq{lsnnlumnohonnnzwotgsippsttppaqomp|k|qgiwolrwq}dptgjrvtqkyjcmjv~vppq]htlxolnoqoln`ljamljsxktossqvsylxxskxkrlpqqugwvzzflup_cvjvpstuukyqxqxqsk{slzpnw}oojrv{otzttkrqoqikvqumvqqpmmqmtpvsqtoyqrnwkirlrppxptrskoksrpsprrwynobnnvunqwppsnn{ldytwjllrurq{onr{vrmpxqmnamomqnkskqv^uvjvjlgutzrnokglgrjktqtxoyrktpv{ipjxlrpnplfpreqwnr}ms|mjssuptKgvxrwpjnr{crmstkoMOszt}qxwrlsotwusvtqkpjvnrtmwom{kmnIfj^tpYmgljgforsrgmtv}wqsaspOrwquwtensZ}|opss{ekv{tosxsrnyqssuqorrhkbopnjwryblqrwsqrrtvtpusltnntqvrso{smlpmmwmssuunmtullskquy}oewopkmprspvlqxoqptprvpswprqlltjklvwnqoxsmqxsVxxshen:ivqfqHq~tvnzkrnmqijojb|xhiprlpqnnnpnpvurdqkqtq|v~ghrtpqopqurpqrrnrpsorrpnorppppppqoqoqqrqpqqqrrrprsqoqqpqqupqqtqppprstoqqxoqqrnpvpvdps~xwtxtkrpxjkprfswjruxuqslspsdvssnwvszqsjpgmvopsomurujpmsmlrrrimnranttqxvyohltrgvwpx~qtwsornxixqmukmltnkyzy}}~gi}vxowywpvsvzvq|vuwpxp~hgxxmhxmlutur^op{tx|k]tx{hvtuwyqtlznlrrxtzqw~ipnzfwpvqy|rytyrlw_fntjgzwxj}przthltmxnxzmol|k}vqcvseisPwtuqdpqvyxopvzguswsnn|nov{xznnwstizxl~xt~votnosv~nolwrpjnjssxrosoxrxscl_xqkqomewtcmjuoolb]~kyo{vnctknkrtcruipYokTrljliwplugpvjojunsktklbonqinmfqokomkhqimvtmxfumlrpkukoqunxrpqrurlriqxpssz|rsqkvitxowpqp]luvlvtjpsrokslkopotmqsnphjtqpthvpmrorqnpssrsroplrmntzvusksszostoxnwfnysrimrpsrlkywoopuln|~mpmuxpqorrlnsrmmrsplqzn{rpuperppvmngkvziqnkoposryspzr{nq`tosg{uwlpqhsnpprxrtipouvsqhsqtvy|nukqjsttrrthouvjrpnkpstnnwmrtpzkppvr]fpm`yvpt[qsoymmdosmwwpoplegsomaknUqo_ltfq^xWYpklgbipkv{nfsgxxmnwoxruzpynxsqoxsmsettnjsptzwu`tyitos}q{hlmqpsorbmvjptqsslwpX{rmzrnnnlr}fmvlp~jdplvnqtkqopuvnnynpwnomkkuxmomknwnmqrxljos|okmkjgmkvl.hnierZjhS{tlz_qcottjirypixy]}sowd^s~fzupwnqlnp`loztnusorulguqorwp}pgpnqzrjsjhoelknpnnpuzlozjtmppuunmmmlutuvonqqnlqqwqjposmoqnurnoqislnpzusxjrwwbywj~nrsssxnq|pupqumvvnrrlvrqelupzyniytzwpxronprzugwuxoblwnpjlspo^uquolur|syxxummpdrgat}yor{rsjmotjukqmqonuqhou{ppxjrlgxjy~xwcqnqkvasprrk~otiplpk{mkklor|key}pwo{sp]pzyltwyzovitpqxtpzojpoovewstvslvvuzx|rrsvtovGosyuvkrwoaspkllfpuvmjqtsnrsprsuwprnvfWtslnoq\uxsepqnnr{kpRUhdtkwpwrulosn9or{bsst?~mtunplxnovmmrvs}sby|rtpifszojp|rlsbsqxggnvrqhhrugupfzzkx{noq}rspokopyxjtuo[ssmt|tzpaks}ymdussrxzu{qoin^{osh_junqegpugdcufgtmcihnz~peiyxgku|y|Ykhmphuxvnyto{qrmprivprnjrkqpjbrrwzvuyns|rql{ppmvZkwmioywqoikmqdngsttpmrpwhit|kson}kssp|ynnulrmjrshrlurrrkxztuzst}i~qrtszt8ymp{{u|vyzj|vpWwA~p~A~4~zZwvu1{}Vc|ncq}_|~x}|vzsu|k}ydwv||zzt{~zy~u~~~u}~|zvq|jv~CToks}MSno|MjgX]z^MĐz~rtwqwke}zwyptURwk^poB|jw{+~g}^wgnp\{}oܴgyfkVzqrNw|s~~~rqsQ]myÜsuuO|cd]il3yTq[sowew|zZbz{{Xhx}tprYx|[wxi[XiqrbYhs}n}knv}`~y}zhhspyy{Qo~qds{rrqxbpLqpvbudztuYghlwvzgtndPoNjdmLx~pJpmz~snppdt1ZjzDž|rǡcz~^Mi~|pSotrkgmsztos_fLknv}l{b}_buH|ta=Gyx{zgppkyzz~w|f|p}hr|suS}bvuv|m~v|yxzx~y~}|_Jvwfc||WzqJv}eyeyv}xw{xyurztx~wt{t{{y|ts|~^xjx}g}qu|`y^^}u~udmscxhll[q:zjlFRppYgu{za`\hvvsh}RcNUb_j_qDlehX:Œx|ox~jsvedp.dVe__{}S^nTcyei[Yy{xfutfWg|oos{v|N}{ӉViEv{{ov~zduqpeqwvxs~ޘ{qlzkbyt}^{j{pk~w[vŲcv_xuzswYhZlrorpwg8_g\g{~lR]xpvkzogeqj`~vjm{SW|~u~n\Z{s}CF{|L|^Ygzg}kludKyzz\yzsRlNgU~}dǶrv{gr׌ljGLb{ln}Hbsuzpqxxiu{kmmy|ih{}~nvjyzuuzfrmrllyjtlxv|xojwwyp}W~sisaflp~YXEuxckiceu~Imf|tsw]h\No[Yotypąz`ypipye^ye}ykav|wzX^e}_l}qwl}fn}`VteP{e\Tiw]}aufcaum|pmRy|r|ts~zdvvS\_ғxy}{|Zbt[dyat{f`xH{ux:]l^c|tyvJ]WOZ[jiiho}}~__}{kavoqu|qqfg~rNuui|3slXujS_gRymzyztp}rf{sy\ljxfnp|{wskp~ptwKa|~yjЋpy~qxp^vvixw}xlzsd~pxzaytp~~ovt_|~{fvuk||~pHx{uyvtyx||re{~n\k~{`Dxssnzuot~ofpuhux~sju{z}|zhusu}}z}f}|g:gtYxqw}~y{[~~plr1x{hnk{|~}{~~}q}sw}zohegU}veMpl.ilq}%nVcŽo_k{rjhtw\epx}~|xmd~uXBol|{oyz_|q{tl{lwzu~}wvy~}y~~}|ty~}x|oKoGx?vrgr|~\bzchfUơɂWpxEn|}xv|y]pvpu|xtmclsuAltp}qYy_Ϧmsfg|z~{h~vw|uuw{f{tjsvN~tp_k{sj{1|x{rO}pf{w}hwt~z^yv}sOxpziRgty0kq`wÖWkna~]zb~`t}/zE]z~tnoɅi|}]asscfce|~v}MyfazvvqBg\j~ǁsbli{Kmw}l}uLnb`WW^t`ajր~hto6ioxUNu~x||}~zsv}z~z}}}~~z}t~~~~z~{{t}tw|{pwzy{}{yp~~}{xv~vw~{}}}{{zx}}yx~|~xz|ty~y}~|}}~}|~~wpr}nwyx}vw}v|z}l}vx~sm|z~y{{rw~z~|~p~|u{}{zyx}}}xquj~sxvq|{z{{|}}}~}~tuwk{~}x~|v{{m}w~s}zory|{xzqw}sww|~}~|||x|{|~zy~x~ysuw}wot|}u}{|~zru{~~|xy~}}y~~{~}v~vxs~gtr}z{~xs~zp~vw|r~q}zuu~|zuv|~zwv||}l|~xz~wwz|}z~y}uzy~sywy{|z~~}~|~}{~y}}z}uxw~x|k{}}~|x}yv{~}{oz~x}~~w{~w|y|~y|wvv}ztz}zyuw}~zvsvz~}}}|t~|}{}~~~~{~z~{vyysy}{}~|}x{twt{{}~}zz{~|u}}x|z|t~z{{~|{}}}|~|~}zv{{|x~{~{~{|w}~|zw|amy}z}z~~~~uz}u{x~xtwz{~{}}~|}{yyz}~v|yzxz}~z~|~}zywz{|u{~~~xw|wzr~{zvswsy|uu}zyzxq~{xy}|x}~|q~|}z~x~z|vux|{||vw|ysx||~xws~|~~pxz~{izq{{tz}x{~ty{~}~}|||}{zu}|r{vs~q~pyyzv~}zu{~|w{~w}}|}~yx}w{z||wikr}tox{|_x|~j~m{~v{}}~|~~lvv{ye~x}x}z}y{{y}~v}|~~w{ex{v~|}}}}|m}y~z~v}~zwv|zq~|wtv~{v}yw~x~~w}w{{|z~y}{~r{rwxz|~~zsxy}}y~}~{{|yy~}}~o{}~u~}t{~|y~y{}~{zxy||wy~tzxzt|}suz}}wz||przw~t}}}yx}~|~~~||~{|m{z|x}{|y}}{yx}}vvp~{x~zw~t}{z|wt}|twt}w~y}}|{zy~|v}z{rwu|{~zx~|~y|z~|z~zo~{}~{xy~||y|ywwpu}}yz}}k}~|~~w}zzzo|z~}|v|w{{}{|z}|}yvy|{|}z~~v|zvwzyv~wyu|x|~sq}}}}vxt}|x}xn|w}y|{~{xz~~|~x{}zrzz~}{v}~~}xyu{px}~|m~{|z{}{z}zzy~~||w~}q{zz~x~n|ui|zww{{v~rr}|}z{x}zu{{w|{|~wu~r|t|~~~z|u~wnzp~}zsmq}}s|y|}}xyyu}qy{zukuw~}r|}~{~x}{}|p}~~r}~~|r~}~~pwt~}x~o}~t}~~|}~xuyttu~|{w}zp}z}}y~v}|s}}|d~{w{}r~{ztv{t|z~vw~}mw}}||||||{x{{~v{~}v}~|}~{}w}~zx}~zl}zwty{yz~|xr~uz~wy~lsz}~v|x~}t|{~yv{~{}}|x{~y~{y|}wzw}{{wzuw|u}s{~~z~z{~t}}}}{z~|xz{|z|zxx~~|~{}wy|~{z~q|qy|}u|uuytp~{wuw{{}n}||{px~}y~}~}z~|}{{z}|}uy~|w}|}~y~y}}{{~~|~|~zz}~m{xxq|}~y|w}x~|~~qx{zxx~z|}}{y|yv|w{}yoz}y|z||~yyz|syu|{wz{~}px}x{~x~{}|t~vx}|~|z~w||}s~}}}~{vw}~~us~{{t{~y~zx{o}|~zw~yz|{{{u}|t~{~pzyu~x{{s{~{{u}y}xuy{}~y{w{~~~{y~rmy~~zyv}~vwxyx|}zx|}~j|~~~{ozzz{~|uz}~}yyy{}hvzu{}~z}~}~n|m~xr}~{uwx{{z~~vuy}~|x}~|{|}y|~||{|}}wzx}puqv~{z~w~s~}~z{zv~||}fyq|}wty}z~vz~|s|zzq|yx{wxu|zz|z{|~|s}|ywt{{z{zyvsu}k{~}yq~tyvzyxl|{~~uvt{q||}~}~z{}}}uxyx|~ox}~vwz~v}{u}w~vz~qt}xly}yx{}y{}~|zw}|t|zzx|}u~|{{|}xyyt}zz~wxwxz{~o~vwv~|~wz|w|mx}yx~px|{~tr~~ujr{v~a~}~y}}qz{v}~}|yv~~w}{z~~}h|uvwyyy{x}y~z}sz{sz{z{}}}~yx~iy~{zuyx}|}ys}|w~o}uv~ty~z{}|~~~~~}~|}w|v{||}{y~~~v|y|tz{w}y|{yz}{sryy||yts||~}{~w~zp|}~}{x|}ot~x}|~vuu|s{}{znvvwcyowyxr}}{v|vtz{{t}zo|ywx~vryys~xmu{yuzt|~x{{zpyy~zv}y~wy|ozu}~yoyq~|{||tv~~|x{z|y~uzu{r|x|{~s|wx~~~}}z|w~yjq{{z~{{~~{|nph|oz~zv~u}|z~mzxvt}|{~xw}~{}u{yu|{o|{x|z}xrz{zwn}~}~noxw~yxzwkv}||{w||}z}yv|xux|u~lw}~x}~z||mu}~}x~xo~yu~|{v~ttsxlzqvyr~~r{}x||zu}t}|yy||fyzuv}wg|~}wuqpu{u}|vw{tz}^tz~w{|~qxrt~rlhy}z}tz~x}|kxwrw~}q}ypz~~v{~{xi}twvxvbv{}zy}|vz~tsia~xzh|z}}~y|{r{}||yz||~u}xr|zuwz}x}uvwx~j{~~|{~}~|wv{u}zz}v~n}}z~wmy{w{}vx}}uxsvzys~y~owu|}zz~q~~{vxxw~{zxuz{p}xx|}r{ymy}|v~q}w}|w}|w~~}yzy|{|ww{||y}}|}|}}~~x}}}~yz~u~~|}zt|y{tu}mz||~{~~{z|smte~x~~y{{r}}ul}}t}y~r~ylf||}ty}x~|s}~}}u||zyx|w}|zz|}xe~{~}{i{~}~~~}}{x{ztxyqw}zfoqum|}k|v{{{}zv|~zt~zv{~uw{uzk{zo{y}woaqs{}s}~~wy}vsxt}y{kxp{[y{a~qzzwyzg{|s|~}x|w~{z~xwpo~w~vyuytu{s~gvx}e}y{|xntytwzxu{nuvxrq|~|t}avz}y|vzxxr}}y}owvzw|{~~u|}z}w{~p{~y~z{xy}~~}uw{|yt{j}~hxw~zopwvx|{xxyxz}wm~syz{x~}iz}~zlpz~~~}rszvw|bq|tx~{ets}{|wx|{qzz~xr|{{u~}tx|}v~pwv~|x|qzz~zx|~||z|v{|~|z}u|foyvzwx}{{zx|xzzq~}~|l~wz~}}~zyx}{zt{~y|gzy}~}{|{|yyx{}~yu~zoyyq||r{u|~ss{~x~z~~}zz||}wy{~o|{x{z{u~~~y~v~}{{qul|rxtnxy~x{~yz{{xx}y~u{v}{x|~s|y|}}k|xy|tuw{y|}zz~|~|wzwzw~~}zuv{~|{}t}p~x~py|z}z}~zxyu~{y{uy|xy}{xn|vhxu|v}uyyv|v~sr~{|~t}~{|yz~}}~vxyyt}p{|yo{s|z}{zq~zoz}~yz}~~}}~{~o|~{x~s~vt~~~r}uy{{u~ptx|~vzw||vp}{h}{}yo}oy~~ywx}|u~~u{vx|xny~{x~}~~l|~}~w}~~~||}~|||~}}|~}~|yy{zuz|}y~|y|}wyy|x~~}{}~}z~~{|v~~{~|{~}yw}{|{}~{}}~z|}|xy|y}x}}~zx~}z~w~||w~~{{}|~}{y~|x~x~|~~~z}}vuw~{|~~|s|~|~|}}x~}~~}y|z}y}|}{~|||}}~~~~{{{u}~}}z{{z~~w|w~u||txsy~z{zz|}z~~z}|}}}~|{x{|}|~~|}yv{}||t{~~||{}{~~~~{{|z|y~y}wxz|{}~~z{}x~|}|y~}zu}|v|}~{~{~}~~~|s{y}z}~~~|ex|}yy~}z~|y}w~|u~{|~~|{~y}}|}yu}~~}|~~z~x}~|{}}uy|yt~y}y}~x{xyvtyy{}x~|~}~{{~~y}~z~~~}z}~}}~|v|}}}~w{~w{}x~z|{~|}}~}~p~|}~{y}~}~~l~~~y~~}~{yw}z~~zwz|y|y{{~~q{z|{||||}~~|yu}}~}}z|~z}~z|||~|~~~|~}|z~|z~v|~t}~~~|}}}}|||u{{vz}~|}~~~z{|~{~{}}~~~{|{z}~wx}|~}~~~~}}u}~}~|}|w}~}yyx}~{y~~zy{zzw~|w|uy~}zzx}{{{~tx}|~|{s{~|{~~z~}y~|~}~|{z~}}}z~}uxzx{~~~~}t}}}}zy~~~~~~|~~~~v}x~}}~{|y~yz~}}~|}xy{{}}~~{}v}}vx|{~zwxw~|~}wz}}|~}}{}z{{y}~x}x~~u|{~|~||vy|~wz|y~|{z}}}{~}|~~|y~v}y~}}}~~~~}z|z||}~~~v|z}}r}}zy~|zz}}z|}z{z{|~}~}{z}~}}|}}yv}yyx{}}w|x~~|~}}}{~}~}{y~~{{}~x~~t~|w~~xz~m 3aU!{v1UO^Rjo-EP? `qFX_ 5isfeLd_[?`WNXgVToL&_VC!DJ+iQ!;>1I{q5kL*i1bEg~z?I{ln eX=^HJY1 ff=ff=aа= >a >а= Lff=ff=aа=@> Cü >= ffaа=`>; >bh> 33s=ff=33#>a Cа=bh>z^= >bh8> =ff=33C>aPа=bh>=/= >bhX> =ff=33c>ay<а=bh>=/= >bhx> >ff=>a|=а=bh>> >14> <>ff=>az^=а=bh>'> >14> \>ff=>az^=а=bh>G> >14> |>ff=>a=/>а=bh>g> >14> ff>ff=>a=/?>а=bh>˃> >14> ff>ff=>a=/_>а=14?˓> >14> ff>ff=>a=/>а=14?ˣ> >14> ff>ff=>a>а=14?˳> >14> ff>ff=?a>а=14?> >? ff>ff=?a>а=14 ?> >? ff>ff=?a>а=14(?> >? ff>ff=?a>а=140?> >? 33?ff= ?a>а=148?? >&? 33?ff=(?a>а=14@? ? >.? 33?ff=0?a>а=14H?? >6? 33?ff=8?a?а=14P?? >>? 33'?ff=@?a?а=14X?!? >F? 33/?ff=H?a?а=14`?)? >N? 337?ff=P?a?а=14h?1? >V? 33??ff=X?a'?а=14p?9? >^? 33G?ff=`?a/?а=14x?A? >f? 33O?ff=h?a7?а=?I? >n? 33W?ff=p?a??а=?Q? >v? 33_?ff=x?aG?а=?Y? >~? 33g?ff=ff?aO?а=?a? > ? 33o?ff=ff?aW?а=?i? > ?L ff=ff= Cü= >a@>а=LLff=ff= Cü=@> Cü@>=Lff Cü=`>;@>bh>L33s=ff=33#> Cü C=bh>z^=@>bh8>L=ff=33C> CüP=bh>=/=@>bhX>L=ff=33c> Cüy<=bh>=/=@>bhx>L>ff=> Cü|==bh>>@>14>L<>ff=> Cüz^==bh>'>@>14>L\>ff=> Cüz^==bh>G>@>14>L|>ff=> Cü=/>=bh>g>@>14>Lff>ff=> Cü=/?>=bh>˃>@>14>Lff>ff=> Cü=/_>=14?˓>@>14>Lff>ff=> Cü=/>=14?ˣ>@>14>Lff>ff=> Cü>=14?˳>@>14>Lff>ff=? Cü>=14?>@>?Lff>ff=? Cü>=14 ?>@>?Lff>ff=? Cü>=14(?>@>?Lff>ff=? Cü>=140?>@>?L33?ff= ? Cü>=148??@>&?L33?ff=(? Cü>=14@? ?@>.?L33?ff=0? Cü>=14H??@>6?L33?ff=8? Cü?=14P??@>>?L33'?ff=@? Cü?=14X?!?@>F?L33/?ff=H? Cü?=14`?)?@>N?L337?ff=P? Cü?=14h?1?@>V?L33??ff=X? Cü'?=14p?9?@>^?L33G?ff=`? Cü/?=14x?A?@>f?L33O?ff=h? Cü7?=?I?@>n?L33W?ff=p? Cü??=?Q?@>v?L33_?ff=x? CüG?=?Y?@>~?L33g?ff=ff? CüO?=?a?@> ?L33o?ff=ff? CüW?=?i?@> ?ff< 33>ff=;bh> >a`>а=ffff=;bh>@> Cü`>=ff33>;bh>`>;`>bh>ff<33s=33>33#>; Cbh>bh>z^=`>bh8>ff<=33>33C>;Pbh>bh>=/=`>bhX>ff<=33>33c>;ybh>=/=`>bhx>ff<>33>>;|=bh>bh>>`>14>ff<<>33>>;z^=bh>bh>'>`>14>ff<\>33>>;z^=bh>bh>G>`>14>ff<|>33>>;=/>bh>bh>g>`>14>ff33>>;=/?>bh>bh>˃>`>14>ff33>>;=/_>bh>14?˓>`>14>ff33>>;=/>bh>14?ˣ>`>14>ff33>>;>bh>14?˳>`>14>ff33>?;>bh>14?>`>?ff33>?;>bh>14 ?>`>?ff33>?;>bh>14(?>`>?ff33>?;>bh>140?>`>?ff<33?33> ?;>bh>148??`>&?ff<33?33>(?;>bh>14@? ?`>.?ff<33?33>0?;>bh>14H??`>6?ff<33?33>8?;?bh>14P??`>>?ff<33'?33>@?;?bh>14X?!?`>F?ff<33/?33>H?;?bh>14`?)?`>N?ff<337?33>P?;?bh>14h?1?`>V?ff<33??33>X?;'?bh>14p?9?`>^?ff<33G?33>`?;/?bh>14x?A?`>f?ff<33O?33>h?;7?bh>?I?`>n?ff<33W?33>p?;??bh>?Q?`>v?ff<33_?33>x?;G?bh>?Y?`>~?ff<33g?33>ff?;O?bh>?a?`> ?ff<33o?33>ff?;W?bh>?i?`> ?33s= 33#>ff=z^=bh8> > Cabh>а=33s=L33#>ff=z^=bh8>@> C Cübh>=33s=ff<33#>33>z^=bh8>`> C;bh>bh>33s=33s=33#>33#>z^= Cbh8>bh> Cz^=bh>bh8>33s==33#>33C>z^=Pbh8>bh> C=/=bh>bhX>33s==33#>33c>z^=ybh> C=/=bh>bhx>33s=>33#>>z^=|=bh8>bh> C>bh>14>33s=<>33#>>z^=z^=bh8>bh> C'>bh>14>33s=\>33#>>z^=z^=bh8>bh> CG>bh>14>33s=|>33#>>z^==/>bh8>bh> Cg>bh>14>33s=ff>33#>>z^==/?>bh8>bh> C˃>bh>14>33s=ff>33#>>z^==/_>bh8>14? C˓>bh>14>33s=ff>33#>>z^==/>bh8>14? Cˣ>bh>14>33s=ff>33#>>z^=>bh8>14? C˳>bh>14>33s=ff>33#>?z^=>bh8>14? C>bh>?33s=ff>33#>?z^=>bh8>14 ? C>bh>?33s=ff>33#>?z^=>bh8>14(? C>bh>?33s=ff>33#>?z^=>bh8>140? C>bh>?33s=33?33#> ?z^=>bh8>148? C?bh>&?33s=33?33#>(?z^=>bh8>14@? C ?bh>.?33s=33?33#>0?z^=>bh8>14H? C?bh>6?33s=33?33#>8?z^=?bh8>14P? C?bh>>?33s=33'?33#>@?z^=?bh8>14X? C!?bh>F?33s=33/?33#>H?z^=?bh8>14`? C)?bh>N?33s=337?33#>P?z^=?bh8>14h? C1?bh>V?33s=33??33#>X?z^='?bh8>14p? C9?bh>^?33s=33G?33#>`?z^=/?bh8>14x? CA?bh>f?33s=33O?33#>h?z^=7?bh8>? CI?bh>n?33s=33W?33#>p?z^=??bh8>? CQ?bh>v?33s=33_?33#>x?z^=G?bh8>? CY?bh>~?33s=33g?33#>ff?z^=O?bh8>? Ca?bh> ?33s=33o?33#>ff?z^=W?bh8>? Ci?bh> ?= 33C>ff==/=bhX> >Pabh>а==L33C>ff==/=bhX>@>P Cübh>==ff<33C>33>=/=bhX>`>P;bh>bh>=33s=33C>33#>=/= CbhX>bh>Pz^=bh>bh8>==33C>33C>=/=PbhX>bh>P=/=bh>bhX>==33C>33c>=/=ybh>P=/=bh>bhx>=>33C>>=/=|=bhX>bh>P>bh>14>=<>33C>>=/=z^=bhX>bh>P'>bh>14>=\>33C>>=/=z^=bhX>bh>PG>bh>14>=|>33C>>=/==/>bhX>bh>Pg>bh>14>=ff>33C>>=/==/?>bhX>bh>P˃>bh>14>=ff>33C>>=/==/_>bhX>14?P˓>bh>14>=ff>33C>>=/==/>bhX>14?Pˣ>bh>14>=ff>33C>>=/=>bhX>14?P˳>bh>14>=ff>33C>?=/=>bhX>14?P>bh>?=ff>33C>?=/=>bhX>14 ?P>bh>?=ff>33C>?=/=>bhX>14(?P>bh>?=ff>33C>?=/=>bhX>140?P>bh>?=33?33C> ?=/=>bhX>148?P?bh>&?=33?33C>(?=/=>bhX>14@?P ?bh>.?=33?33C>0?=/=>bhX>14H?P?bh>6?=33?33C>8?=/=?bhX>14P?P?bh>>?=33'?33C>@?=/=?bhX>14X?P!?bh>F?=33/?33C>H?=/=?bhX>14`?P)?bh>N?=337?33C>P?=/=?bhX>14h?P1?bh>V?=33??33C>X?=/='?bhX>14p?P9?bh>^?=33G?33C>`?=/=/?bhX>14x?PA?bh>f?=33O?33C>h?=/=7?bhX>?PI?bh>n?=33W?33C>p?=/=??bhX>?PQ?bh>v?=33_?33C>x?=/=G?bhX>?PY?bh>~?=33g?33C>ff?=/=O?bhX>?Pa?bh> ?=33o?33C>ff?=/=W?bhX>?Pi?bh> ?= 33c>ff==/=bhx> >yа==L33c>ff==/=bhx>@>y< Cübh>==ff<33c>33>=/=bhx>`>y<;bh>bh>=33s=33c>33#>=/= Cbhx>bh>ybh8>==33c>33C>=/=Pbhx>bh>y<=/=bh>bhX>==33c>33c>=/=ybh>y<=/=bh>bhx>=>33c>>=/=|=bhx>bh>y<>bh>14>=<>33c>>=/=z^=bhx>bh>y<'>bh>14>=\>33c>>=/=z^=bhx>bh>ybh>14>=|>33c>>=/==/>bhx>bh>ybh>14>=ff>33c>>=/==/?>bhx>bh>y<˃>bh>14>=ff>33c>>=/==/_>bhx>14?y<˓>bh>14>=ff>33c>>=/==/>bhx>14?y<ˣ>bh>14>=ff>33c>>=/=>bhx>14?y<˳>bh>14>=ff>33c>?=/=>bhx>14?y<>bh>?=ff>33c>?=/=>bhx>14 ?y<>bh>?=ff>33c>?=/=>bhx>14(?y<>bh>?=ff>33c>?=/=>bhx>140?y<>bh>?=33?33c> ?=/=>bhx>148?y<?bh>&?=33?33c>(?=/=>bhx>14@?y< ?bh>.?=33?33c>0?=/=>bhx>14H?y<?bh>6?=33?33c>8?=/=?bhx>14P?y<?bh>>?=33'?33c>@?=/=?bhx>14X?yF?=33/?33c>H?=/=?bhx>14`?y<)?bh>N?=337?33c>P?=/=?bhx>14h?y<1?bh>V?=33??33c>X?=/='?bhx>14p?y<9?bh>^?=33G?33c>`?=/=/?bhx>14x?yf?=33O?33c>h?=/=7?bhx>?yn?=33W?33c>p?=/=??bhx>?yv?=33_?33c>x?=/=G?bhx>?y~?=33g?33c>ff?=/=O?bhx>?y ?=33o?33c>ff?=/=W?bhx>?y ?> >ff=>14> >|=abh>а=>L>ff=>14>@>|= Cübh>=>ff<>33>>14>`>|=;bh>bh>>33s=>33#>> C14>bh>|=z^=bh>bh8>>=>33C>>P14>bh>|==/=bh>bhX>>=>33c>>y<14>bh>|==/=bh>bhx>>>>>>|=14>bh>|=>bh>14>><>>>>z^=14>bh>|='>bh>14>>\>>>>z^=14>bh>|=G>bh>14>>|>>>>=/>14>bh>|=g>bh>14>>ff>>>>=/?>14>bh>|=˃>bh>14>>ff>>>>=/_>14>14?|=˓>bh>14>>ff>>>>=/>14>14?|=ˣ>bh>14>>ff>>>>>14>14?|=˳>bh>14>>ff>>?>>14>14?|=>bh>?>ff>>?>>14>14 ?|=>bh>?>ff>>?>>14>14(?|=>bh>?>ff>>?>>14>140?|=>bh>?>33?> ?>>14>148?|=?bh>&?>33?>(?>>14>14@?|= ?bh>.?>33?>0?>>14>14H?|=?bh>6?>33?>8?>?14>14P?|=?bh>>?>33'?>@?>?14>14X?|=!?bh>F?>33/?>H?>?14>14`?|=)?bh>N?>337?>P?>?14>14h?|=1?bh>V?>33??>X?>'?14>14p?|=9?bh>^?>33G?>`?>/?14>14x?|=A?bh>f?>33O?>h?>7?14>?|=I?bh>n?>33W?>p?>??14>?|=Q?bh>v?>33_?>x?>G?14>?|=Y?bh>~?>33g?>ff?>O?14>?|=a?bh> ?>33o?>ff?>W?14>?|=i?bh> ?<> >ff='>14> >z^=abh>а=<>L>ff='>14>@>z^= Cübh>=<>ff<>33>'>14>`>z^=;bh>bh><>33s=>33#>'> C14>bh>z^=z^=bh>bh8><>=>33C>'>P14>bh>z^==/=bh>bhX><>=>33c>'>y<14>bh>z^==/=bh>bhx><>>>>'>|=14>bh>z^=>bh>14><><>>>'>z^=14>bh>z^='>bh>14><>\>>>'>z^=14>bh>z^=G>bh>14><>|>>>'>=/>14>bh>z^=g>bh>14><>ff>>>'>=/?>14>bh>z^=˃>bh>14><>ff>>>'>=/_>14>14?z^=˓>bh>14><>ff>>>'>=/>14>14?z^=ˣ>bh>14><>ff>>>'>>14>14?z^=˳>bh>14><>ff>>?'>>14>14?z^=>bh>?<>ff>>?'>>14>14 ?z^=>bh>?<>ff>>?'>>14>14(?z^=>bh>?<>ff>>?'>>14>140?z^=>bh>?<>33?> ?'>>14>148?z^=?bh>&?<>33?>(?'>>14>14@?z^= ?bh>.?<>33?>0?'>>14>14H?z^=?bh>6?<>33?>8?'>?14>14P?z^=?bh>>?<>33'?>@?'>?14>14X?z^=!?bh>F?<>33/?>H?'>?14>14`?z^=)?bh>N?<>337?>P?'>?14>14h?z^=1?bh>V?<>33??>X?'>'?14>14p?z^=9?bh>^?<>33G?>`?'>/?14>14x?z^=A?bh>f?<>33O?>h?'>7?14>?z^=I?bh>n?<>33W?>p?'>??14>?z^=Q?bh>v?<>33_?>x?'>G?14>?z^=Y?bh>~?<>33g?>ff?'>O?14>?z^=a?bh> ?<>33o?>ff?'>W?14>?z^=i?bh> ?\> >ff=G>14> >z^=abh>а=\>L>ff=G>14>@>z^= Cübh>=\>ff<>33>G>14>`>z^=;bh>bh>\>33s=>33#>G> C14>bh>z^=z^=bh>bh8>\>=>33C>G>P14>bh>z^==/=bh>bhX>\>=>33c>G>y<14>bh>z^==/=bh>bhx>\>>>>G>|=14>bh>z^=>bh>14>\><>>>G>z^=14>bh>z^='>bh>14>\>\>>>G>z^=14>bh>z^=G>bh>14>\>|>>>G>=/>14>bh>z^=g>bh>14>\>ff>>>G>=/?>14>bh>z^=˃>bh>14>\>ff>>>G>=/_>14>14?z^=˓>bh>14>\>ff>>>G>=/>14>14?z^=ˣ>bh>14>\>ff>>>G>>14>14?z^=˳>bh>14>\>ff>>?G>>14>14?z^=>bh>?\>ff>>?G>>14>14 ?z^=>bh>?\>ff>>?G>>14>14(?z^=>bh>?\>ff>>?G>>14>140?z^=>bh>?\>33?> ?G>>14>148?z^=?bh>&?\>33?>(?G>>14>14@?z^= ?bh>.?\>33?>0?G>>14>14H?z^=?bh>6?\>33?>8?G>?14>14P?z^=?bh>>?\>33'?>@?G>?14>14X?z^=!?bh>F?\>33/?>H?G>?14>14`?z^=)?bh>N?\>337?>P?G>?14>14h?z^=1?bh>V?\>33??>X?G>'?14>14p?z^=9?bh>^?\>33G?>`?G>/?14>14x?z^=A?bh>f?\>33O?>h?G>7?14>?z^=I?bh>n?\>33W?>p?G>??14>?z^=Q?bh>v?\>33_?>x?G>G?14>?z^=Y?bh>~?\>33g?>ff?G>O?14>?z^=a?bh> ?\>33o?>ff?G>W?14>?z^=i?bh> ?|> >ff=g>14> >=/>abh>а=|>L>ff=g>14>@>=/> Cübh>=|>ff<>33>g>14>`>=/>;bh>bh>|>33s=>33#>g> C14>bh>=/>z^=bh>bh8>|>=>33C>g>P14>bh>=/>=/=bh>bhX>|>=>33c>g>y<14>bh>=/>=/=bh>bhx>|>>>>g>|=14>bh>=/>>bh>14>|><>>>g>z^=14>bh>=/>'>bh>14>|>\>>>g>z^=14>bh>=/>G>bh>14>|>|>>>g>=/>14>bh>=/>g>bh>14>|>ff>>>g>=/?>14>bh>=/>˃>bh>14>|>ff>>>g>=/_>14>14?=/>˓>bh>14>|>ff>>>g>=/>14>14?=/>ˣ>bh>14>|>ff>>>g>>14>14?=/>˳>bh>14>|>ff>>?g>>14>14?=/>>bh>?|>ff>>?g>>14>14 ?=/>>bh>?|>ff>>?g>>14>14(?=/>>bh>?|>ff>>?g>>14>140?=/>>bh>?|>33?> ?g>>14>148?=/>?bh>&?|>33?>(?g>>14>14@?=/> ?bh>.?|>33?>0?g>>14>14H?=/>?bh>6?|>33?>8?g>?14>14P?=/>?bh>>?|>33'?>@?g>?14>14X?=/>!?bh>F?|>33/?>H?g>?14>14`?=/>)?bh>N?|>337?>P?g>?14>14h?=/>1?bh>V?|>33??>X?g>'?14>14p?=/>9?bh>^?|>33G?>`?g>/?14>14x?=/>A?bh>f?|>33O?>h?g>7?14>?=/>I?bh>n?|>33W?>p?g>??14>?=/>Q?bh>v?|>33_?>x?g>G?14>?=/>Y?bh>~?|>33g?>ff?g>O?14>?=/>a?bh> ?|>33o?>ff?g>W?14>?=/>i?bh> ?ff> >ff=˃>14> >=/?>abh>а=ff>L>ff=˃>14>@>=/?> Cübh>=ff>ff<>33>˃>14>`>=/?>;bh>bh>ff>33s=>33#>˃> C14>bh>=/?>z^=bh>bh8>ff>=>33C>˃>P14>bh>=/?>=/=bh>bhX>ff>=>33c>˃>y<14>bh>=/?>=/=bh>bhx>ff>>>>˃>|=14>bh>=/?>>bh>14>ff><>>>˃>z^=14>bh>=/?>'>bh>14>ff>\>>>˃>z^=14>bh>=/?>G>bh>14>ff>|>>>˃>=/>14>bh>=/?>g>bh>14>ff>ff>>>˃>=/?>14>bh>=/?>˃>bh>14>ff>ff>>>˃>=/_>14>14?=/?>˓>bh>14>ff>ff>>>˃>=/>14>14?=/?>ˣ>bh>14>ff>ff>>>˃>>14>14?=/?>˳>bh>14>ff>ff>>?˃>>14>14?=/?>>bh>?ff>ff>>?˃>>14>14 ?=/?>>bh>?ff>ff>>?˃>>14>14(?=/?>>bh>?ff>ff>>?˃>>14>140?=/?>>bh>?ff>33?> ?˃>>14>148?=/?>?bh>&?ff>33?>(?˃>>14>14@?=/?> ?bh>.?ff>33?>0?˃>>14>14H?=/?>?bh>6?ff>33?>8?˃>?14>14P?=/?>?bh>>?ff>33'?>@?˃>?14>14X?=/?>!?bh>F?ff>33/?>H?˃>?14>14`?=/?>)?bh>N?ff>337?>P?˃>?14>14h?=/?>1?bh>V?ff>33??>X?˃>'?14>14p?=/?>9?bh>^?ff>33G?>`?˃>/?14>14x?=/?>A?bh>f?ff>33O?>h?˃>7?14>?=/?>I?bh>n?ff>33W?>p?˃>??14>?=/?>Q?bh>v?ff>33_?>x?˃>G?14>?=/?>Y?bh>~?ff>33g?>ff?˃>O?14>?=/?>a?bh> ?ff>33o?>ff?˃>W?14>?=/?>i?bh> ?ff> >ff=˓>14> >=/_>a14?а=ff>L>ff=˓>14>@>=/_> Cü14?=ff>ff<>33>˓>14>`>=/_>;14?bh>ff>33s=>33#>˓> C14>bh>=/_>z^=14?bh8>ff>=>33C>˓>P14>bh>=/_>=/=14?bhX>ff>=>33c>˓>y<14>bh>=/_>=/=14?bhx>ff>>>>˓>|=14>bh>=/_>>14?14>ff><>>>˓>z^=14>bh>=/_>'>14?14>ff>\>>>˓>z^=14>bh>=/_>G>14?14>ff>|>>>˓>=/>14>bh>=/_>g>14?14>ff>ff>>>˓>=/?>14>bh>=/_>˃>14?14>ff>ff>>>˓>=/_>14>14?=/_>˓>14?14>ff>ff>>>˓>=/>14>14?=/_>ˣ>14?14>ff>ff>>>˓>>14>14?=/_>˳>14?14>ff>ff>>?˓>>14>14?=/_>>14??ff>ff>>?˓>>14>14 ?=/_>>14??ff>ff>>?˓>>14>14(?=/_>>14??ff>ff>>?˓>>14>140?=/_>>14??ff>33?> ?˓>>14>148?=/_>?14?&?ff>33?>(?˓>>14>14@?=/_> ?14?.?ff>33?>0?˓>>14>14H?=/_>?14?6?ff>33?>8?˓>?14>14P?=/_>?14?>?ff>33'?>@?˓>?14>14X?=/_>!?14?F?ff>33/?>H?˓>?14>14`?=/_>)?14?N?ff>337?>P?˓>?14>14h?=/_>1?14?V?ff>33??>X?˓>'?14>14p?=/_>9?14?^?ff>33G?>`?˓>/?14>14x?=/_>A?14?f?ff>33O?>h?˓>7?14>?=/_>I?14?n?ff>33W?>p?˓>??14>?=/_>Q?14?v?ff>33_?>x?˓>G?14>?=/_>Y?14?~?ff>33g?>ff?˓>O?14>?=/_>a?14? ?ff>33o?>ff?˓>W?14>?=/_>i?14? ?ff> >ff=ˣ>14> >=/>a14?а=ff>L>ff=ˣ>14>@>=/> Cü14?=ff>ff<>33>ˣ>14>`>=/>;14?bh>ff>33s=>33#>ˣ> C14>bh>=/>z^=14?bh8>ff>=>33C>ˣ>P14>bh>=/>=/=14?bhX>ff>=>33c>ˣ>y<14>bh>=/>=/=14?bhx>ff>>>>ˣ>|=14>bh>=/>>14?14>ff><>>>ˣ>z^=14>bh>=/>'>14?14>ff>\>>>ˣ>z^=14>bh>=/>G>14?14>ff>|>>>ˣ>=/>14>bh>=/>g>14?14>ff>ff>>>ˣ>=/?>14>bh>=/>˃>14?14>ff>ff>>>ˣ>=/_>14>14?=/>˓>14?14>ff>ff>>>ˣ>=/>14>14?=/>ˣ>14?14>ff>ff>>>ˣ>>14>14?=/>˳>14?14>ff>ff>>?ˣ>>14>14?=/>>14??ff>ff>>?ˣ>>14>14 ?=/>>14??ff>ff>>?ˣ>>14>14(?=/>>14??ff>ff>>?ˣ>>14>140?=/>>14??ff>33?> ?ˣ>>14>148?=/>?14?&?ff>33?>(?ˣ>>14>14@?=/> ?14?.?ff>33?>0?ˣ>>14>14H?=/>?14?6?ff>33?>8?ˣ>?14>14P?=/>?14?>?ff>33'?>@?ˣ>?14>14X?=/>!?14?F?ff>33/?>H?ˣ>?14>14`?=/>)?14?N?ff>337?>P?ˣ>?14>14h?=/>1?14?V?ff>33??>X?ˣ>'?14>14p?=/>9?14?^?ff>33G?>`?ˣ>/?14>14x?=/>A?14?f?ff>33O?>h?ˣ>7?14>?=/>I?14?n?ff>33W?>p?ˣ>??14>?=/>Q?14?v?ff>33_?>x?ˣ>G?14>?=/>Y?14?~?ff>33g?>ff?ˣ>O?14>?=/>a?14? ?ff>33o?>ff?ˣ>W?14>?=/>i?14? ?ff> >ff=˳>14> >>a14?а=ff>L>ff=˳>14>@>> Cü14?=ff>ff<>33>˳>14>`>>;14?bh>ff>33s=>33#>˳> C14>bh>>z^=14?bh8>ff>=>33C>˳>P14>bh>>=/=14?bhX>ff>=>33c>˳>y<14>bh>>=/=14?bhx>ff>>>>˳>|=14>bh>>>14?14>ff><>>>˳>z^=14>bh>>'>14?14>ff>\>>>˳>z^=14>bh>>G>14?14>ff>|>>>˳>=/>14>bh>>g>14?14>ff>ff>>>˳>=/?>14>bh>>˃>14?14>ff>ff>>>˳>=/_>14>14?>˓>14?14>ff>ff>>>˳>=/>14>14?>ˣ>14?14>ff>ff>>>˳>>14>14?>˳>14?14>ff>ff>>?˳>>14>14?>>14??ff>ff>>?˳>>14>14 ?>>14??ff>ff>>?˳>>14>14(?>>14??ff>ff>>?˳>>14>140?>>14??ff>33?> ?˳>>14>148?>?14?&?ff>33?>(?˳>>14>14@?> ?14?.?ff>33?>0?˳>>14>14H?>?14?6?ff>33?>8?˳>?14>14P?>?14?>?ff>33'?>@?˳>?14>14X?>!?14?F?ff>33/?>H?˳>?14>14`?>)?14?N?ff>337?>P?˳>?14>14h?>1?14?V?ff>33??>X?˳>'?14>14p?>9?14?^?ff>33G?>`?˳>/?14>14x?>A?14?f?ff>33O?>h?˳>7?14>?>I?14?n?ff>33W?>p?˳>??14>?>Q?14?v?ff>33_?>x?˳>G?14>?>Y?14?~?ff>33g?>ff?˳>O?14>?>a?14? ?ff>33o?>ff?˳>W?14>?>i?14? ?ff> ?ff=>? >>a14?а=ff>L?ff=>?@>> Cü14?=ff>ff<?33>>?`>>;14?bh>ff>33s=?33#>> C?bh>>z^=14?bh8>ff>=?33C>>P?bh>>=/=14?bhX>ff>=?33c>>y<?bh>>=/=14?bhx>ff>>?>>|=?bh>>>14?14>ff><>?>>z^=?bh>>'>14?14>ff>\>?>>z^=?bh>>G>14?14>ff>|>?>>=/>?bh>>g>14?14>ff>ff>?>>=/?>?bh>>˃>14?14>ff>ff>?>>=/_>?14?>˓>14?14>ff>ff>?>>=/>?14?>ˣ>14?14>ff>ff>?>>>?14?>˳>14?14>ff>ff>??>>?14?>>14??ff>ff>??>>?14 ?>>14??ff>ff>??>>?14(?>>14??ff>ff>??>>?140?>>14??ff>33?? ?>>?148?>?14?&?ff>33??(?>>?14@?> ?14?.?ff>33??0?>>?14H?>?14?6?ff>33??8?>??14P?>?14?>?ff>33'??@?>??14X?>!?14?F?ff>33/??H?>??14`?>)?14?N?ff>337??P?>??14h?>1?14?V?ff>33???X?>'??14p?>9?14?^?ff>33G??`?>/??14x?>A?14?f?ff>33O??h?>7???>I?14?n?ff>33W??p?>????>Q?14?v?ff>33_??x?>G???>Y?14?~?ff>33g??ff?>O???>a?14? ?ff>33o??ff?>W???>i?14? ?ff> ?ff=>? >>a14 ?а=ff>L?ff=>?@>> Cü14 ?=ff>ff<?33>>?`>>;14 ?bh>ff>33s=?33#>> C?bh>>z^=14 ?bh8>ff>=?33C>>P?bh>>=/=14 ?bhX>ff>=?33c>>y<?bh>>=/=14 ?bhx>ff>>?>>|=?bh>>>14 ?14>ff><>?>>z^=?bh>>'>14 ?14>ff>\>?>>z^=?bh>>G>14 ?14>ff>|>?>>=/>?bh>>g>14 ?14>ff>ff>?>>=/?>?bh>>˃>14 ?14>ff>ff>?>>=/_>?14?>˓>14 ?14>ff>ff>?>>=/>?14?>ˣ>14 ?14>ff>ff>?>>>?14?>˳>14 ?14>ff>ff>??>>?14?>>14 ??ff>ff>??>>?14 ?>>14 ??ff>ff>??>>?14(?>>14 ??ff>ff>??>>?140?>>14 ??ff>33?? ?>>?148?>?14 ?&?ff>33??(?>>?14@?> ?14 ?.?ff>33??0?>>?14H?>?14 ?6?ff>33??8?>??14P?>?14 ?>?ff>33'??@?>??14X?>!?14 ?F?ff>33/??H?>??14`?>)?14 ?N?ff>337??P?>??14h?>1?14 ?V?ff>33???X?>'??14p?>9?14 ?^?ff>33G??`?>/??14x?>A?14 ?f?ff>33O??h?>7???>I?14 ?n?ff>33W??p?>????>Q?14 ?v?ff>33_??x?>G???>Y?14 ?~?ff>33g??ff?>O???>a?14 ? ?ff>33o??ff?>W???>i?14 ? ?ff> ?ff=>? >>a14(?а=ff>L?ff=>?@>> Cü14(?=ff>ff<?33>>?`>>;14(?bh>ff>33s=?33#>> C?bh>>z^=14(?bh8>ff>=?33C>>P?bh>>=/=14(?bhX>ff>=?33c>>y<?bh>>=/=14(?bhx>ff>>?>>|=?bh>>>14(?14>ff><>?>>z^=?bh>>'>14(?14>ff>\>?>>z^=?bh>>G>14(?14>ff>|>?>>=/>?bh>>g>14(?14>ff>ff>?>>=/?>?bh>>˃>14(?14>ff>ff>?>>=/_>?14?>˓>14(?14>ff>ff>?>>=/>?14?>ˣ>14(?14>ff>ff>?>>>?14?>˳>14(?14>ff>ff>??>>?14?>>14(??ff>ff>??>>?14 ?>>14(??ff>ff>??>>?14(?>>14(??ff>ff>??>>?140?>>14(??ff>33?? ?>>?148?>?14(?&?ff>33??(?>>?14@?> ?14(?.?ff>33??0?>>?14H?>?14(?6?ff>33??8?>??14P?>?14(?>?ff>33'??@?>??14X?>!?14(?F?ff>33/??H?>??14`?>)?14(?N?ff>337??P?>??14h?>1?14(?V?ff>33???X?>'??14p?>9?14(?^?ff>33G??`?>/??14x?>A?14(?f?ff>33O??h?>7???>I?14(?n?ff>33W??p?>????>Q?14(?v?ff>33_??x?>G???>Y?14(?~?ff>33g??ff?>O???>a?14(? ?ff>33o??ff?>W???>i?14(? ?ff> ?ff=>? >>a140?а=ff>L?ff=>?@>> Cü140?=ff>ff<?33>>?`>>;140?bh>ff>33s=?33#>> C?bh>>z^=140?bh8>ff>=?33C>>P?bh>>=/=140?bhX>ff>=?33c>>y<?bh>>=/=140?bhx>ff>>?>>|=?bh>>>140?14>ff><>?>>z^=?bh>>'>140?14>ff>\>?>>z^=?bh>>G>140?14>ff>|>?>>=/>?bh>>g>140?14>ff>ff>?>>=/?>?bh>>˃>140?14>ff>ff>?>>=/_>?14?>˓>140?14>ff>ff>?>>=/>?14?>ˣ>140?14>ff>ff>?>>>?14?>˳>140?14>ff>ff>??>>?14?>>140??ff>ff>??>>?14 ?>>140??ff>ff>??>>?14(?>>140??ff>ff>??>>?140?>>140??ff>33?? ?>>?148?>?140?&?ff>33??(?>>?14@?> ?140?.?ff>33??0?>>?14H?>?140?6?ff>33??8?>??14P?>?140?>?ff>33'??@?>??14X?>!?140?F?ff>33/??H?>??14`?>)?140?N?ff>337??P?>??14h?>1?140?V?ff>33???X?>'??14p?>9?140?^?ff>33G??`?>/??14x?>A?140?f?ff>33O??h?>7???>I?140?n?ff>33W??p?>????>Q?140?v?ff>33_??x?>G???>Y?140?~?ff>33g??ff?>O???>a?140? ?ff>33o??ff?>W???>i?140? ?33? ?ff=?&? >>a148?а=33?L ?ff=?&?@>> Cü148?=33?ff< ?33>?&?`>>;148?bh>33?33s= ?33#>? C&?bh>>z^=148?bh8>33?= ?33C>?P&?bh>>=/=148?bhX>33?= ?33c>?y<&?bh>>=/=148?bhx>33?> ?>?|=&?bh>>>148?14>33?<> ?>?z^=&?bh>>'>148?14>33?\> ?>?z^=&?bh>>G>148?14>33?|> ?>?=/>&?bh>>g>148?14>33?ff> ?>?=/?>&?bh>>˃>148?14>33?ff> ?>?=/_>&?14?>˓>148?14>33?ff> ?>?=/>&?14?>ˣ>148?14>33?ff> ?>?>&?14?>˳>148?14>33?ff> ???>&?14?>>148??33?ff> ???>&?14 ?>>148??33?ff> ???>&?14(?>>148??33?ff> ???>&?140?>>148??33?33? ? ??>&?148?>?148?&?33?33? ?(??>&?14@?> ?148?.?33?33? ?0??>&?14H?>?148?6?33?33? ?8???&?14P?>?148?>?33?33'? ?@???&?14X?>!?148?F?33?33/? ?H???&?14`?>)?148?N?33?337? ?P???&?14h?>1?148?V?33?33?? ?X??'?&?14p?>9?148?^?33?33G? ?`??/?&?14x?>A?148?f?33?33O? ?h??7?&??>I?148?n?33?33W? ?p????&??>Q?148?v?33?33_? ?x??G?&??>Y?148?~?33?33g? ?ff??O?&??>a?148? ?33?33o? ?ff??W?&??>i?148? ?33? (?ff= ?.? >>a14@?а=33?L(?ff= ?.?@>> Cü14@?=33?ff<(?33> ?.?`>>;14@?bh>33?33s=(?33#> ? C.?bh>>z^=14@?bh8>33?=(?33C> ?P.?bh>>=/=14@?bhX>33?=(?33c> ?y<.?bh>>=/=14@?bhx>33?>(?> ?|=.?bh>>>14@?14>33?<>(?> ?z^=.?bh>>'>14@?14>33?\>(?> ?z^=.?bh>>G>14@?14>33?|>(?> ?=/>.?bh>>g>14@?14>33?ff>(?> ?=/?>.?bh>>˃>14@?14>33?ff>(?> ?=/_>.?14?>˓>14@?14>33?ff>(?> ?=/>.?14?>ˣ>14@?14>33?ff>(?> ?>.?14?>˳>14@?14>33?ff>(?? ?>.?14?>>14@??33?ff>(?? ?>.?14 ?>>14@??33?ff>(?? ?>.?14(?>>14@??33?ff>(?? ?>.?140?>>14@??33?33?(? ? ?>.?148?>?14@?&?33?33?(?(? ?>.?14@?> ?14@?.?33?33?(?0? ?>.?14H?>?14@?6?33?33?(?8? ??.?14P?>?14@?>?33?33'?(?@? ??.?14X?>!?14@?F?33?33/?(?H? ??.?14`?>)?14@?N?33?337?(?P? ??.?14h?>1?14@?V?33?33??(?X? ?'?.?14p?>9?14@?^?33?33G?(?`? ?/?.?14x?>A?14@?f?33?33O?(?h? ?7?.??>I?14@?n?33?33W?(?p? ???.??>Q?14@?v?33?33_?(?x? ?G?.??>Y?14@?~?33?33g?(?ff? ?O?.??>a?14@? ?33?33o?(?ff? ?W?.??>i?14@? ?33? 0?ff=?6? >>a14H?а=33?L0?ff=?6?@>> Cü14H?=33?ff<0?33>?6?`>>;14H?bh>33?33s=0?33#>? C6?bh>>z^=14H?bh8>33?=0?33C>?P6?bh>>=/=14H?bhX>33?=0?33c>?y<6?bh>>=/=14H?bhx>33?>0?>?|=6?bh>>>14H?14>33?<>0?>?z^=6?bh>>'>14H?14>33?\>0?>?z^=6?bh>>G>14H?14>33?|>0?>?=/>6?bh>>g>14H?14>33?ff>0?>?=/?>6?bh>>˃>14H?14>33?ff>0?>?=/_>6?14?>˓>14H?14>33?ff>0?>?=/>6?14?>ˣ>14H?14>33?ff>0?>?>6?14?>˳>14H?14>33?ff>0???>6?14?>>14H??33?ff>0???>6?14 ?>>14H??33?ff>0???>6?14(?>>14H??33?ff>0???>6?140?>>14H??33?33?0? ??>6?148?>?14H?&?33?33?0?(??>6?14@?> ?14H?.?33?33?0?0??>6?14H?>?14H?6?33?33?0?8???6?14P?>?14H?>?33?33'?0?@???6?14X?>!?14H?F?33?33/?0?H???6?14`?>)?14H?N?33?337?0?P???6?14h?>1?14H?V?33?33??0?X??'?6?14p?>9?14H?^?33?33G?0?`??/?6?14x?>A?14H?f?33?33O?0?h??7?6??>I?14H?n?33?33W?0?p????6??>Q?14H?v?33?33_?0?x??G?6??>Y?14H?~?33?33g?0?ff??O?6??>a?14H? ?33?33o?0?ff??W?6??>i?14H? ?33? 8?ff=?>? >?a14P?а=33?L8?ff=?>?@>? Cü14P?=33?ff<8?33>?>?`>?;14P?bh>33?33s=8?33#>? C>?bh>?z^=14P?bh8>33?=8?33C>?P>?bh>?=/=14P?bhX>33?=8?33c>?y<>?bh>?=/=14P?bhx>33?>8?>?|=>?bh>?>14P?14>33?<>8?>?z^=>?bh>?'>14P?14>33?\>8?>?z^=>?bh>?G>14P?14>33?|>8?>?=/>>?bh>?g>14P?14>33?ff>8?>?=/?>>?bh>?˃>14P?14>33?ff>8?>?=/_>>?14??˓>14P?14>33?ff>8?>?=/>>?14??ˣ>14P?14>33?ff>8?>?>>?14??˳>14P?14>33?ff>8???>>?14??>14P??33?ff>8???>>?14 ??>14P??33?ff>8???>>?14(??>14P??33?ff>8???>>?140??>14P??33?33?8? ??>>?148???14P?&?33?33?8?(??>>?14@?? ?14P?.?33?33?8?0??>>?14H???14P?6?33?33?8?8???>?14P???14P?>?33?33'?8?@???>?14X??!?14P?F?33?33/?8?H???>?14`??)?14P?N?33?337?8?P???>?14h??1?14P?V?33?33??8?X??'?>?14p??9?14P?^?33?33G?8?`??/?>?14x??A?14P?f?33?33O?8?h??7?>???I?14P?n?33?33W?8?p????>???Q?14P?v?33?33_?8?x??G?>???Y?14P?~?33?33g?8?ff??O?>???a?14P? ?33?33o?8?ff??W?>???i?14P? ?33'? @?ff=!?F? >?a14X?а=33'?L@?ff=!?F?@>? Cü14X?=33'?ff<@?33>!?F?`>?;14X?bh>33'?33s=@?33#>!? CF?bh>?z^=14X?bh8>33'?=@?33C>!?PF?bh>?=/=14X?bhX>33'?=@?33c>!?y<F?bh>?=/=14X?bhx>33'?>@?>!?|=F?bh>?>14X?14>33'?<>@?>!?z^=F?bh>?'>14X?14>33'?\>@?>!?z^=F?bh>?G>14X?14>33'?|>@?>!?=/>F?bh>?g>14X?14>33'?ff>@?>!?=/?>F?bh>?˃>14X?14>33'?ff>@?>!?=/_>F?14??˓>14X?14>33'?ff>@?>!?=/>F?14??ˣ>14X?14>33'?ff>@?>!?>F?14??˳>14X?14>33'?ff>@??!?>F?14??>14X??33'?ff>@??!?>F?14 ??>14X??33'?ff>@??!?>F?14(??>14X??33'?ff>@??!?>F?140??>14X??33'?33?@? ?!?>F?148???14X?&?33'?33?@?(?!?>F?14@?? ?14X?.?33'?33?@?0?!?>F?14H???14X?6?33'?33?@?8?!??F?14P???14X?>?33'?33'?@?@?!??F?14X??!?14X?F?33'?33/?@?H?!??F?14`??)?14X?N?33'?337?@?P?!??F?14h??1?14X?V?33'?33??@?X?!?'?F?14p??9?14X?^?33'?33G?@?`?!?/?F?14x??A?14X?f?33'?33O?@?h?!?7?F???I?14X?n?33'?33W?@?p?!???F???Q?14X?v?33'?33_?@?x?!?G?F???Y?14X?~?33'?33g?@?ff?!?O?F???a?14X? ?33'?33o?@?ff?!?W?F???i?14X? ?33/? H?ff=)?N? >?a14`?а=33/?LH?ff=)?N?@>? Cü14`?=33/?ff)?N?`>?;14`?bh>33/?33s=H?33#>)? CN?bh>?z^=14`?bh8>33/?=H?33C>)?PN?bh>?=/=14`?bhX>33/?=H?33c>)?y<N?bh>?=/=14`?bhx>33/?>H?>)?|=N?bh>?>14`?14>33/?<>H?>)?z^=N?bh>?'>14`?14>33/?\>H?>)?z^=N?bh>?G>14`?14>33/?|>H?>)?=/>N?bh>?g>14`?14>33/?ff>H?>)?=/?>N?bh>?˃>14`?14>33/?ff>H?>)?=/_>N?14??˓>14`?14>33/?ff>H?>)?=/>N?14??ˣ>14`?14>33/?ff>H?>)?>N?14??˳>14`?14>33/?ff>H??)?>N?14??>14`??33/?ff>H??)?>N?14 ??>14`??33/?ff>H??)?>N?14(??>14`??33/?ff>H??)?>N?140??>14`??33/?33?H? ?)?>N?148???14`?&?33/?33?H?(?)?>N?14@?? ?14`?.?33/?33?H?0?)?>N?14H???14`?6?33/?33?H?8?)??N?14P???14`?>?33/?33'?H?@?)??N?14X??!?14`?F?33/?33/?H?H?)??N?14`??)?14`?N?33/?337?H?P?)??N?14h??1?14`?V?33/?33??H?X?)?'?N?14p??9?14`?^?33/?33G?H?`?)?/?N?14x??A?14`?f?33/?33O?H?h?)?7?N???I?14`?n?33/?33W?H?p?)???N???Q?14`?v?33/?33_?H?x?)?G?N???Y?14`?~?33/?33g?H?ff?)?O?N???a?14`? ?33/?33o?H?ff?)?W?N???i?14`? ?337? P?ff=1?V? >?a14h?а=337?LP?ff=1?V?@>? Cü14h?=337?ff1?V?`>?;14h?bh>337?33s=P?33#>1? CV?bh>?z^=14h?bh8>337?=P?33C>1?PV?bh>?=/=14h?bhX>337?=P?33c>1?y<V?bh>?=/=14h?bhx>337?>P?>1?|=V?bh>?>14h?14>337?<>P?>1?z^=V?bh>?'>14h?14>337?\>P?>1?z^=V?bh>?G>14h?14>337?|>P?>1?=/>V?bh>?g>14h?14>337?ff>P?>1?=/?>V?bh>?˃>14h?14>337?ff>P?>1?=/_>V?14??˓>14h?14>337?ff>P?>1?=/>V?14??ˣ>14h?14>337?ff>P?>1?>V?14??˳>14h?14>337?ff>P??1?>V?14??>14h??337?ff>P??1?>V?14 ??>14h??337?ff>P??1?>V?14(??>14h??337?ff>P??1?>V?140??>14h??337?33?P? ?1?>V?148???14h?&?337?33?P?(?1?>V?14@?? ?14h?.?337?33?P?0?1?>V?14H???14h?6?337?33?P?8?1??V?14P???14h?>?337?33'?P?@?1??V?14X??!?14h?F?337?33/?P?H?1??V?14`??)?14h?N?337?337?P?P?1??V?14h??1?14h?V?337?33??P?X?1?'?V?14p??9?14h?^?337?33G?P?`?1?/?V?14x??A?14h?f?337?33O?P?h?1?7?V???I?14h?n?337?33W?P?p?1???V???Q?14h?v?337?33_?P?x?1?G?V???Y?14h?~?337?33g?P?ff?1?O?V???a?14h? ?337?33o?P?ff?1?W?V???i?14h? ?33?? X?ff=9?^? >'?a14p?а=33??LX?ff=9?^?@>'? Cü14p?=33??ff9?^?`>'?;14p?bh>33??33s=X?33#>9? C^?bh>'?z^=14p?bh8>33??=X?33C>9?P^?bh>'?=/=14p?bhX>33??=X?33c>9?y<^?bh>'?=/=14p?bhx>33??>X?>9?|=^?bh>'?>14p?14>33??<>X?>9?z^=^?bh>'?'>14p?14>33??\>X?>9?z^=^?bh>'?G>14p?14>33??|>X?>9?=/>^?bh>'?g>14p?14>33??ff>X?>9?=/?>^?bh>'?˃>14p?14>33??ff>X?>9?=/_>^?14?'?˓>14p?14>33??ff>X?>9?=/>^?14?'?ˣ>14p?14>33??ff>X?>9?>^?14?'?˳>14p?14>33??ff>X??9?>^?14?'?>14p??33??ff>X??9?>^?14 ?'?>14p??33??ff>X??9?>^?14(?'?>14p??33??ff>X??9?>^?140?'?>14p??33??33?X? ?9?>^?148?'??14p?&?33??33?X?(?9?>^?14@?'? ?14p?.?33??33?X?0?9?>^?14H?'??14p?6?33??33?X?8?9??^?14P?'??14p?>?33??33'?X?@?9??^?14X?'?!?14p?F?33??33/?X?H?9??^?14`?'?)?14p?N?33??337?X?P?9??^?14h?'?1?14p?V?33??33??X?X?9?'?^?14p?'?9?14p?^?33??33G?X?`?9?/?^?14x?'?A?14p?f?33??33O?X?h?9?7?^??'?I?14p?n?33??33W?X?p?9???^??'?Q?14p?v?33??33_?X?x?9?G?^??'?Y?14p?~?33??33g?X?ff?9?O?^??'?a?14p? ?33??33o?X?ff?9?W?^??'?i?14p? ?33G? `?ff=A?f? >/?a14x?а=33G?L`?ff=A?f?@>/? Cü14x?=33G?ff<`?33>A?f?`>/?;14x?bh>33G?33s=`?33#>A? Cf?bh>/?z^=14x?bh8>33G?=`?33C>A?Pf?bh>/?=/=14x?bhX>33G?=`?33c>A?y<f?bh>/?=/=14x?bhx>33G?>`?>A?|=f?bh>/?>14x?14>33G?<>`?>A?z^=f?bh>/?'>14x?14>33G?\>`?>A?z^=f?bh>/?G>14x?14>33G?|>`?>A?=/>f?bh>/?g>14x?14>33G?ff>`?>A?=/?>f?bh>/?˃>14x?14>33G?ff>`?>A?=/_>f?14?/?˓>14x?14>33G?ff>`?>A?=/>f?14?/?ˣ>14x?14>33G?ff>`?>A?>f?14?/?˳>14x?14>33G?ff>`??A?>f?14?/?>14x??33G?ff>`??A?>f?14 ?/?>14x??33G?ff>`??A?>f?14(?/?>14x??33G?ff>`??A?>f?140?/?>14x??33G?33?`? ?A?>f?148?/??14x?&?33G?33?`?(?A?>f?14@?/? ?14x?.?33G?33?`?0?A?>f?14H?/??14x?6?33G?33?`?8?A??f?14P?/??14x?>?33G?33'?`?@?A??f?14X?/?!?14x?F?33G?33/?`?H?A??f?14`?/?)?14x?N?33G?337?`?P?A??f?14h?/?1?14x?V?33G?33??`?X?A?'?f?14p?/?9?14x?^?33G?33G?`?`?A?/?f?14x?/?A?14x?f?33G?33O?`?h?A?7?f??/?I?14x?n?33G?33W?`?p?A???f??/?Q?14x?v?33G?33_?`?x?A?G?f??/?Y?14x?~?33G?33g?`?ff?A?O?f??/?a?14x? ?33G?33o?`?ff?A?W?f??/?i?14x? ?33O? h?ff=I?n? >7?a?а=33O?Lh?ff=I?n?@>7? Cü?=33O?ffI?n?`>7?;?bh>33O?33s=h?33#>I? Cn?bh>7?z^=?bh8>33O?=h?33C>I?Pn?bh>7?=/=?bhX>33O?=h?33c>I?y<n?bh>7?=/=?bhx>33O?>h?>I?|=n?bh>7?>?14>33O?<>h?>I?z^=n?bh>7?'>?14>33O?\>h?>I?z^=n?bh>7?G>?14>33O?|>h?>I?=/>n?bh>7?g>?14>33O?ff>h?>I?=/?>n?bh>7?˃>?14>33O?ff>h?>I?=/_>n?14?7?˓>?14>33O?ff>h?>I?=/>n?14?7?ˣ>?14>33O?ff>h?>I?>n?14?7?˳>?14>33O?ff>h??I?>n?14?7?>??33O?ff>h??I?>n?14 ?7?>??33O?ff>h??I?>n?14(?7?>??33O?ff>h??I?>n?140?7?>??33O?33?h? ?I?>n?148?7???&?33O?33?h?(?I?>n?14@?7? ??.?33O?33?h?0?I?>n?14H?7???6?33O?33?h?8?I??n?14P?7???>?33O?33'?h?@?I??n?14X?7?!??F?33O?33/?h?H?I??n?14`?7?)??N?33O?337?h?P?I??n?14h?7?1??V?33O?33??h?X?I?'?n?14p?7?9??^?33O?33G?h?`?I?/?n?14x?7?A??f?33O?33O?h?h?I?7?n??7?I??n?33O?33W?h?p?I???n??7?Q??v?33O?33_?h?x?I?G?n??7?Y??~?33O?33g?h?ff?I?O?n??7?a?? ?33O?33o?h?ff?I?W?n??7?i?? ?33W? p?ff=Q?v? >??a?а=33W?Lp?ff=Q?v?@>?? Cü?=33W?ffQ?v?`>??;?bh>33W?33s=p?33#>Q? Cv?bh>??z^=?bh8>33W?=p?33C>Q?Pv?bh>??=/=?bhX>33W?=p?33c>Q?y<v?bh>??=/=?bhx>33W?>p?>Q?|=v?bh>??>?14>33W?<>p?>Q?z^=v?bh>??'>?14>33W?\>p?>Q?z^=v?bh>??G>?14>33W?|>p?>Q?=/>v?bh>??g>?14>33W?ff>p?>Q?=/?>v?bh>??˃>?14>33W?ff>p?>Q?=/_>v?14???˓>?14>33W?ff>p?>Q?=/>v?14???ˣ>?14>33W?ff>p?>Q?>v?14???˳>?14>33W?ff>p??Q?>v?14???>??33W?ff>p??Q?>v?14 ???>??33W?ff>p??Q?>v?14(???>??33W?ff>p??Q?>v?140???>??33W?33?p? ?Q?>v?148?????&?33W?33?p?(?Q?>v?14@??? ??.?33W?33?p?0?Q?>v?14H?????6?33W?33?p?8?Q??v?14P?????>?33W?33'?p?@?Q??v?14X???!??F?33W?33/?p?H?Q??v?14`???)??N?33W?337?p?P?Q??v?14h???1??V?33W?33??p?X?Q?'?v?14p???9??^?33W?33G?p?`?Q?/?v?14x???A??f?33W?33O?p?h?Q?7?v????I??n?33W?33W?p?p?Q???v????Q??v?33W?33_?p?x?Q?G?v????Y??~?33W?33g?p?ff?Q?O?v????a?? ?33W?33o?p?ff?Q?W?v????i?? ?33_? x?ff=Y?~? >G?a?а=33_?Lx?ff=Y?~?@>G? Cü?=33_?ffY?~?`>G?;?bh>33_?33s=x?33#>Y? C~?bh>G?z^=?bh8>33_?=x?33C>Y?P~?bh>G?=/=?bhX>33_?=x?33c>Y?y<~?bh>G?=/=?bhx>33_?>x?>Y?|=~?bh>G?>?14>33_?<>x?>Y?z^=~?bh>G?'>?14>33_?\>x?>Y?z^=~?bh>G?G>?14>33_?|>x?>Y?=/>~?bh>G?g>?14>33_?ff>x?>Y?=/?>~?bh>G?˃>?14>33_?ff>x?>Y?=/_>~?14?G?˓>?14>33_?ff>x?>Y?=/>~?14?G?ˣ>?14>33_?ff>x?>Y?>~?14?G?˳>?14>33_?ff>x??Y?>~?14?G?>??33_?ff>x??Y?>~?14 ?G?>??33_?ff>x??Y?>~?14(?G?>??33_?ff>x??Y?>~?140?G?>??33_?33?x? ?Y?>~?148?G???&?33_?33?x?(?Y?>~?14@?G? ??.?33_?33?x?0?Y?>~?14H?G???6?33_?33?x?8?Y??~?14P?G???>?33_?33'?x?@?Y??~?14X?G?!??F?33_?33/?x?H?Y??~?14`?G?)??N?33_?337?x?P?Y??~?14h?G?1??V?33_?33??x?X?Y?'?~?14p?G?9??^?33_?33G?x?`?Y?/?~?14x?G?A??f?33_?33O?x?h?Y?7?~??G?I??n?33_?33W?x?p?Y???~??G?Q??v?33_?33_?x?x?Y?G?~??G?Y??~?33_?33g?x?ff?Y?O?~??G?a?? ?33_?33o?x?ff?Y?W?~??G?i?? ?33g? ff?ff=a? ? >O?a?а=33g?Lff?ff=a? ?@>O? Cü?=33g?ffa? ?`>O?;?bh>33g?33s=ff?33#>a? C ?bh>O?z^=?bh8>33g?=ff?33C>a?P ?bh>O?=/=?bhX>33g?=ff?33c>a?y< ?bh>O?=/=?bhx>33g?>ff?>a?|= ?bh>O?>?14>33g?<>ff?>a?z^= ?bh>O?'>?14>33g?\>ff?>a?z^= ?bh>O?G>?14>33g?|>ff?>a?=/> ?bh>O?g>?14>33g?ff>ff?>a?=/?> ?bh>O?˃>?14>33g?ff>ff?>a?=/_> ?14?O?˓>?14>33g?ff>ff?>a?=/> ?14?O?ˣ>?14>33g?ff>ff?>a?> ?14?O?˳>?14>33g?ff>ff??a?> ?14?O?>??33g?ff>ff??a?> ?14 ?O?>??33g?ff>ff??a?> ?14(?O?>??33g?ff>ff??a?> ?140?O?>??33g?33?ff? ?a?> ?148?O???&?33g?33?ff?(?a?> ?14@?O? ??.?33g?33?ff?0?a?> ?14H?O???6?33g?33?ff?8?a?? ?14P?O???>?33g?33'?ff?@?a?? ?14X?O?!??F?33g?33/?ff?H?a?? ?14`?O?)??N?33g?337?ff?P?a?? ?14h?O?1??V?33g?33??ff?X?a?'? ?14p?O?9??^?33g?33G?ff?`?a?/? ?14x?O?A??f?33g?33O?ff?h?a?7? ??O?I??n?33g?33W?ff?p?a??? ??O?Q??v?33g?33_?ff?x?a?G? ??O?Y??~?33g?33g?ff?ff?a?O? ??O?a?? ?33g?33o?ff?ff?a?W? ??O?i?? ?33o? ff?ff=i? ? >W?a?а=33o?Lff?ff=i? ?@>W? Cü?=33o?ffi? ?`>W?;?bh>33o?33s=ff?33#>i? C ?bh>W?z^=?bh8>33o?=ff?33C>i?P ?bh>W?=/=?bhX>33o?=ff?33c>i?y< ?bh>W?=/=?bhx>33o?>ff?>i?|= ?bh>W?>?14>33o?<>ff?>i?z^= ?bh>W?'>?14>33o?\>ff?>i?z^= ?bh>W?G>?14>33o?|>ff?>i?=/> ?bh>W?g>?14>33o?ff>ff?>i?=/?> ?bh>W?˃>?14>33o?ff>ff?>i?=/_> ?14?W?˓>?14>33o?ff>ff?>i?=/> ?14?W?ˣ>?14>33o?ff>ff?>i?> ?14?W?˳>?14>33o?ff>ff??i?> ?14?W?>??33o?ff>ff??i?> ?14 ?W?>??33o?ff>ff??i?> ?14(?W?>??33o?ff>ff??i?> ?140?W?>??33o?33?ff? ?i?> ?148?W???&?33o?33?ff?(?i?> ?14@?W? ??.?33o?33?ff?0?i?> ?14H?W???6?33o?33?ff?8?i?? ?14P?W???>?33o?33'?ff?@?i?? ?14X?W?!??F?33o?33/?ff?H?i?? ?14`?W?)??N?33o?337?ff?P?i?? ?14h?W?1??V?33o?33??ff?X?i?'? ?14p?W?9??^?33o?33G?ff?`?i?/? ?14x?W?A??f?33o?33O?ff?h?i?7? ??W?I??n?33o?33W?ff?p?i??? ??W?Q??v?33o?33_?ff?x?i?G? ??W?Y??~?33o?33g?ff?ff?i?O? ??W?a?? ?33o?33o?ff?ff?i?W? ??W?i?? ?432343S>23S>[/6Y/6[/v>Y/v>VmSm]>>Vm]Sm>>쎽1v>1>3x鎽3>t>43df43S>>[/6^[/v>>VmSm>>Vm]L>^>쎽,bVv>1>33>tG>4343S>>[/6dX[/v>>Vmں>>Vm]Z%=>U[>쎽,bv>1>3-b=3>^>43833=43S>>[/6p +<[/v>>Vmj뼫>>Vm]=>U[>쎽XĬv>?3=3>^>43=43S>>[/6N=[/v>>VmJ +=>U[?Vm]VI!>>U[>쎽`v>?3D8>3>^>43,>43S>?[/6 >[/v>֋ ?VmZ%=>U[?Vm]VIa>>U[>쎽Pw&=v>%?3Dx>3>^>43l>43S>?[/6I>[/v>֋?Vm">>U['?Vm]>>?쎽;=v>5?3E>3>/?43gf>43S>$?[/6T>[/v>֋-?Vmb>>U[7?Vm]>>?쎽ԝ)>v>E?3E>3>/?43gf>43S>4?[/6T>[/v>֋=?VmVI>>U[G?Vm]>>'?쎽ԝi>v>U?3E>3>/!?43gf>43S>D?[/6T>[/v>֋M?VmVI>>U[W?Vm]>>7?쎽Δ>v>e?3E>3>/1?43gf>43S>T?[/6T>[/v>֋]?VmVI>>U[g?Vm]VR?>G?쎽δ>v>u?3"?3>/A?4343 ?43S>d?[/6*t?[/v>֋m?VmVI>>U[w?Vm]VR?>W?쎽>v>F̂?3"?3>/Q?4343?43S>t?[/6*t?[/v>֋}?Vm?>?Vm]VR(?>g?쎽>v>F̊?3".?3>/a?4343+?43S>ff?[/6*t"?[/v>ņ?Vm?>?Vm]VR8?>w?쎽ug +?v>F̒?3">?3>/q?4343;?43S>ff?[/6*t2?[/v>Ŏ?Vm(?>?Vm]VRH?>փ?쎽ug?v>F̚?3"N?3>?4343K?43S>ff?[/6*tB?[/v>Ŗ?Vm8?>?Vm]VRX?>֋?쎽ug*?v>F̢?3"^?3>?hf23>23S>^Y/6>Y/v>XSm]^>>VmSm>>1vG>1>&fVx鎽3>t>hfdf>>^콲^콮>>XSm^>>VmL>^>,bVvG>1>&fV3>tG>hf>>^dX>>Xں^>>VmZ%=>U[>,bvG>1>&fV-b=3>^>hf833=>>^p +<>>Xj뼫^>>Vm=>U[>XĬvG>?&fV=3>^>hf=>>^N=>>XJ +=^>U[?VmVI!>>U[>`vG>?&fVD8>3>^>hf,>>?^콧 >>֋ ?XZ%=^>U[?VmVIa>>U[>Pw&=vG>%?&fVDx>3>^>hfl>>?^콧I>>֋?X">^>U['?Vm>>?;=vG>5?&fVE>3>/?hfgf>>$?^T>>֋-?Xb>^>U[7?Vm>>?ԝ)>vG>E?&fVE>3>/?hfgf>>4?^T>>֋=?XVI>^>U[G?Vm>>'?ԝi>vG>U?&fVE>3>/!?hfgf>>D?^T>>֋M?XVI>^>U[W?Vm>>7?Δ>vG>e?&fVE>3>/1?hfgf>>T?^T>>֋]?XVI>^>U[g?VmVR?>G?δ>vG>u?&fV"?3>/A?hf43 ?>d?^*t?>֋m?XVI>^>U[w?VmVR?>W?>vG>F̂?&fV"?3>/Q?hf43?>t?^*t?>֋}?X?^>?VmVR(?>g?>vG>F̊?&fV".?3>/a?hf43+?>ff?^*t"?>ņ?X?^>?VmVR8?>w?ug +?vG>F̒?&fV">?3>/q?hf43;?>ff?^*t2?>Ŏ?X(?^>?VmVRH?>փ?ug?vG>F̚?&fV"N?3>?hf43K?>ff?^*tB?>Ŗ?X8?^>?VmVRX?>֋?ug*?vG>F̢?&fV"^?3>?23>23S>lXY/6>Y/v>T%=Sm]V[>>ںSm>>'b=1>1>&fx鎽3>t>df>>lX^콮>>T%=SmV[>>ںL>^>'b=,bV>1>&f3>tG>>>lXdX>>T%=ںV[>>ںZ%=>U[>'b=,b>1>&f-b=3>^>833=>>lXp +<>>T%=jV[>>ں=>U[>'b=XĬ>?&f=3>^>=>>lXN=>>T%=J +=V[>U[?ںVI!>>U[>'b=`>?&fD8>3>^>,>>?lX >>֋ ?T%=Z%=V[>U[?ںVIa>>U[>'b=Pw&=>%?&fDx>3>^>l>>?lXI>>֋?T%=">V[>U['?ں>>?'b=;=>5?&fE>3>/?gf>>$?lXT>>֋-?T%=b>V[>U[7?ں>>?'b=ԝ)>>E?&fE>3>/?gf>>4?lXT>>֋=?T%=VI>V[>U[G?ں>>'?'b=ԝi>>U?&fE>3>/!?gf>>D?lXT>>֋M?T%=VI>V[>U[W?ں>>7?'b=Δ>>e?&fE>3>/1?gf>>T?lXT>>֋]?T%=VI>V[>U[g?ںVR?>G?'b=δ>>u?&f"?3>/A?43 ?>d?lX*t?>֋m?T%=VI>V[>U[w?ںVR?>W?'b=>>F̂?&f"?3>/Q?43?>t?lX*t?>֋}?T%=?V[>?ںVR(?>g?'b=>>F̊?&f".?3>/a?43+?>ff?lX*t"?>ņ?T%=?V[>?ںVR8?>w?'b=ug +?>F̒?&f">?3>/q?43;?>ff?lX*t2?>Ŏ?T%=(?V[>?ںVRH?>փ?'b=ug?>F̚?&f"N?3>?43K?>ff?lX*tB?>Ŗ?T%=8?V[>?ںVRX?>֋?'b=ug*?>F̢?&f"^?3>?033=23>23S>P +Y/v>=Sm]V[>>jSm>>=1>1>L̬x鎽?t>033=df>>P +<^콮>>=SmV[>>jL>^>=,bV>1>L̬?tG>033=>>P +>=ںV[>>jZ%=>U[>=,b>1>L̬-b=?^>033=833=>>P +

>=jV[>>j뼭=>U[>=XĬ>?L̬=?^>033==>>P +>=J +=V[>U[?jVI!>>U[>=`>?L̬D8>?^>033=,>>?P +< >>֋ ?=Z%=V[>U[?jVIa>>U[>=Pw&=>%?L̬Dx>?^>033=l>>?P +>֋?=">V[>U['?j뼫>>?=;=>5?L̬E>?/?033=gf>>$?P +>֋-?=b>V[>U[7?j뼫>>?=ԝ)>>E?L̬E>?/?033=gf>>4?P +>֋=?=VI>V[>U[G?j뼫>>'?=ԝi>>U?L̬E>?/!?033=gf>>D?P +>֋M?=VI>V[>U[W?j뼫>>7?=Δ>>e?L̬E>?/1?033=gf>>T?P +>֋]?=VI>V[>U[g?jVR?>G?=δ>>u?L̬"??/A?033=43 ?>d?P +<*t?>֋m?=VI>V[>U[w?jVR?>W?=>>F̂?L̬"??/Q?033=43?>t?P +<*t?>֋}?=?V[>?jVR(?>g?=>>F̊?L̬".??/a?033=43+?>ff?P +<*t"?>ņ?=?V[>?jVR8?>w?=ug +?>F̒?L̬">??/q?033=43;?>ff?P +<*t2?>Ŏ?=(?V[>?jVRH?>փ?=ug?>F̚?L̬"N???033=43K?>ff?P +<*tB?>Ŗ?=8?V[>?jVRX?>֋?=ug*?>F̢?L̬"^???=23>23S>J=Y/6>Y/v>UI!>Sm]V[>>J +=SmV[?>8>1>1>01x鎽?t>=df>>J=^콮>>UI!>SmV[>>J +=LV[?^>8>,bV>1>01?tG>=>>J=dX>>UI!>ںV[>>J +=Z%=V[?U[>8>,b>1>01-b=?^>=833=>>J=p +<>>UI!>jV[>>J +==V[?U[>8>XĬ>?01=?^>==>>J=N=>>UI!>J +=V[>U[?J +=VI!>V[?U[>8>`>?01D8>?^>=,>>?J= >>֋ ?UI!>Z%=V[>U[?J +=VIa>V[?U[>8>Pw&=>%?01Dx>?^>=l>>?J=I>>֋?UI!>">V[>U['?J +=>V[??8>;=>5?01E>?/?=gf>>$?J=T>>֋-?UI!>b>V[>U[7?J +=>V[??8>ԝ)>>E?01E>?/?=gf>>4?J=T>>֋=?UI!>VI>V[>U[G?J +=>V[?'?8>ԝi>>U?01E>?/!?=gf>>D?J=T>>֋M?UI!>VI>V[>U[W?J +=>V[?7?8>Δ>>e?01E>?/1?=gf>>T?J=T>>֋]?UI!>VI>V[>U[g?J +=VR?V[?G?8>δ>>u?01"??/A?=43 ?>d?J=*t?>֋m?UI!>VI>V[>U[w?J +=VR?V[?W?8>>>F̂?01"??/Q?=43?>t?J=*t?>֋}?UI!>?V[>?J +=VR(?V[?g?8>>>F̊?01".??/a?=43+?>ff?J=*t"?>ņ?UI!>?V[>?J +=VR8?V[?w?8>ug +?>F̒?01">??/q?=43;?>ff?J=*t2?>Ŏ?UI!>(?V[>?J +=VRH?V[?փ?8>ug?>F̚?01"N???=43K?>ff?J=*tB?>Ŗ?UI!>8?V[>?J +=VRX?V[?֋?8>ug*?>F̢?01"^???,>23?23S> >Y/6׋ ?Y/v>UIa>Sm]V[>>T%=SmV[?>x>1>1>hg&=x鎽%?t>,>df?> >^׋ ?>UIa>SmV[>>T%=LV[?^>x>,bV>1>hg&=%?tG>,>?> >dX׋ ?>UIa>ںV[>>T%=Z%=V[?U[>x>,b>1>hg&=-b=%?^>,>833=?> >p +<׋ ?>UIa>jV[>>T%==V[?U[>x>XĬ>?hg&==%?^>,>=?> >N=׋ ?>UIa>J +=V[>U[?T%=VI!>V[?U[>x>`>?hg&=D8>%?^>,>,>?? > >׋ ?֋ ?UIa>Z%=V[>U[?T%=VIa>V[?U[>x>Pw&=>%?hg&=Dx>%?^>,>l>?? >I>׋ ?֋?UIa>">V[>U['?T%=>V[??x>;=>5?hg&=E>%?/?,>gf>?$? >T>׋ ?֋-?UIa>b>V[>U[7?T%=>V[??x>ԝ)>>E?hg&=E>%?/?,>gf>?4? >T>׋ ?֋=?UIa>VI>V[>U[G?T%=>V[?'?x>ԝi>>U?hg&=E>%?/!?,>gf>?D? >T>׋ ?֋M?UIa>VI>V[>U[W?T%=>V[?7?x>Δ>>e?hg&=E>%?/1?,>gf>?T? >T>׋ ?֋]?UIa>VI>V[>U[g?T%=VR?V[?G?x>δ>>u?hg&="?%?/A?,>43 ??d? >*t?׋ ?֋m?UIa>VI>V[>U[w?T%=VR?V[?W?x>>>F̂?hg&="?%?/Q?,>43??t? >*t?׋ ?֋}?UIa>?V[>?T%=VR(?V[?g?x>>>F̊?hg&=".?%?/a?,>43+??ff? >*t"?׋ ?ņ?UIa>?V[>?T%=VR8?V[?w?x>ug +?>F̒?hg&=">?%?/q?,>43;??ff? >*t2?׋ ?Ŏ?UIa>(?V[>?T%=VRH?V[?փ?x>ug?>F̚?hg&="N?%??,>43K??ff? >*tB?׋ ?Ŗ?UIa>8?V[>?T%=VRX?V[?֋?x>ug*?>F̢?hg&="^?%??l>23?23S>I>Y/6׋?Y/v>>Sm]?>">SmV['?>D>1?1>3=x鎽5?t>l>df?>I>^׋?>>Sm?>">LV['?^>D>,bV?1>3=5?tG>l>?>I>dX׋?>>ں?>">Z%=V['?U[>D>,b?1>3=-b=5?^>l>833=?>I>p +<׋?>>j뼫?>">=V['?U[>D>XĬ??3==5?^>l>=?>I>N=׋?>>J +=?U[?">VI!>V['?U[>D>`??3=D8>5?^>l>,>??I> >׋?֋ ?>Z%=?U[?">VIa>V['?U[>D>Pw&=?%?3=Dx>5?^>l>l>??I>I>׋?֋?>">?U['?">>V['??D>;=?5?3=E>5?/?l>gf>?$?I>T>׋?֋-?>b>?U[7?">>V['??D>ԝ)>?E?3=E>5?/?l>gf>?4?I>T>׋?֋=?>VI>?U[G?">>V['?'?D>ԝi>?U?3=E>5?/!?l>gf>?D?I>T>׋?֋M?>VI>?U[W?">>V['?7?D>Δ>?e?3=E>5?/1?l>gf>?T?I>T>׋?֋]?>VI>?U[g?">VR?V['?G?D>δ>?u?3="?5?/A?l>43 ??d?I>*t?׋?֋m?>VI>?U[w?">VR?V['?W?D>>?F̂?3="?5?/Q?l>43??t?I>*t?׋?֋}?>???">VR(?V['?g?D>>?F̊?3=".?5?/a?l>43+??ff?I>*t"?׋?ņ?>???">VR8?V['?w?D>ug +??F̒?3=">?5?/q?l>43;??ff?I>*t2?׋?Ŏ?>(???">VRH?V['?փ?D>ug??F̚?3="N?5??l>43K??ff?I>*tB?׋?Ŗ?>8???">VRX?V['?֋?D>ug*??F̢?3="^?5??ff>23$?23S>R>Y/6׋-?Y/v>>Sm]?>b>SmV[7?>D>1?1>ڙ)>x鎽E?t>ff>df$?>R>^׋-?>>Sm?>b>LV[7?^>D>,bV?1>ڙ)>E?tG>ff>$?>R>dX׋-?>>ں?>b>Z%=V[7?U[>D>,b?1>ڙ)>-b=E?^>ff>833=$?>R>p +<׋-?>>j뼫?>b>=V[7?U[>D>XĬ??ڙ)>=E?^>ff>=$?>R>N=׋-?>>J +=?U[?b>VI!>V[7?U[>D>`??ڙ)>D8>E?^>ff>,>$??R> >׋-?֋ ?>Z%=?U[?b>VIa>V[7?U[>D>Pw&=?%?ڙ)>Dx>E?^>ff>l>$??R>I>׋-?֋?>">?U['?b>>V[7??D>;=?5?ڙ)>E>E?/?ff>gf>$?$?R>T>׋-?֋-?>b>?U[7?b>>V[7??D>ԝ)>?E?ڙ)>E>E?/?ff>gf>$?4?R>T>׋-?֋=?>VI>?U[G?b>>V[7?'?D>ԝi>?U?ڙ)>E>E?/!?ff>gf>$?D?R>T>׋-?֋M?>VI>?U[W?b>>V[7?7?D>Δ>?e?ڙ)>E>E?/1?ff>gf>$?T?R>T>׋-?֋]?>VI>?U[g?b>VR?V[7?G?D>δ>?u?ڙ)>"?E?/A?ff>43 ?$?d?R>*t?׋-?֋m?>VI>?U[w?b>VR?V[7?W?D>>?F̂?ڙ)>"?E?/Q?ff>43?$?t?R>*t?׋-?֋}?>???b>VR(?V[7?g?D>>?F̊?ڙ)>".?E?/a?ff>43+?$?ff?R>*t"?׋-?ņ?>???b>VR8?V[7?w?D>ug +??F̒?ڙ)>">?E?/q?ff>43;?$?ff?R>*t2?׋-?Ŏ?>(???b>VRH?V[7?փ?D>ug??F̚?ڙ)>"N?E??ff>43K?$?ff?R>*tB?׋-?Ŗ?>8???b>VRX?V[7?֋?D>ug*??F̢?ڙ)>"^?E??ff>234?23S>R>Y/6׋=?Y/v>>Sm]'?>UI>SmV[G?>D>1!?1>ڙi>x鎽U?t>ff>df4?>R>^׋=?>>Sm'?>UI>LV[G?^>D>,bV!?1>ڙi>U?tG>ff>4?>R>dX׋=?>>ں'?>UI>Z%=V[G?U[>D>,b!?1>ڙi>-b=U?^>ff>833=4?>R>p +<׋=?>>j뼫'?>UI>=V[G?U[>D>XĬ!??ڙi>=U?^>ff>=4?>R>N=׋=?>>J +='?U[?UI>VI!>V[G?U[>D>`!??ڙi>D8>U?^>ff>,>4??R> >׋=?֋ ?>Z%='?U[?UI>VIa>V[G?U[>D>Pw&=!?%?ڙi>Dx>U?^>ff>l>4??R>I>׋=?֋?>">'?U['?UI>>V[G??D>;=!?5?ڙi>E>U?/?ff>gf>4?$?R>T>׋=?֋-?>b>'?U[7?UI>>V[G??D>ԝ)>!?E?ڙi>E>U?/?ff>gf>4?4?R>T>׋=?֋=?>VI>'?U[G?UI>>V[G?'?D>ԝi>!?U?ڙi>E>U?/!?ff>gf>4?D?R>T>׋=?֋M?>VI>'?U[W?UI>>V[G?7?D>Δ>!?e?ڙi>E>U?/1?ff>gf>4?T?R>T>׋=?֋]?>VI>'?U[g?UI>VR?V[G?G?D>δ>!?u?ڙi>"?U?/A?ff>43 ?4?d?R>*t?׋=?֋m?>VI>'?U[w?UI>VR?V[G?W?D>>!?F̂?ڙi>"?U?/Q?ff>43?4?t?R>*t?׋=?֋}?>?'??UI>VR(?V[G?g?D>>!?F̊?ڙi>".?U?/a?ff>43+?4?ff?R>*t"?׋=?ņ?>?'??UI>VR8?V[G?w?D>ug +?!?F̒?ڙi>">?U?/q?ff>43;?4?ff?R>*t2?׋=?Ŏ?>(?'??UI>VRH?V[G?փ?D>ug?!?F̚?ڙi>"N?U??ff>43K?4?ff?R>*tB?׋=?Ŗ?>8?'??UI>VRX?V[G?֋?D>ug*?!?F̢?ڙi>"^?U??ff>23D?23S>R>Y/6׋M?Y/v>>Sm]7?>UI>SmV[W?>D>11?1>̔>x鎽e?t>ff>dfD?>R>^׋M?>>Sm7?>UI>LV[W?^>D>,bV1?1>̔>e?tG>ff>D?>R>dX׋M?>>ں7?>UI>Z%=V[W?U[>D>,b1?1>̔>-b=e?^>ff>833=D?>R>p +<׋M?>>j뼫7?>UI>=V[W?U[>D>XĬ1??̔>=e?^>ff>=D?>R>N=׋M?>>J +=7?U[?UI>VI!>V[W?U[>D>`1??̔>D8>e?^>ff>,>D??R> >׋M?֋ ?>Z%=7?U[?UI>VIa>V[W?U[>D>Pw&=1?%?̔>Dx>e?^>ff>l>D??R>I>׋M?֋?>">7?U['?UI>>V[W??D>;=1?5?̔>E>e?/?ff>gf>D?$?R>T>׋M?֋-?>b>7?U[7?UI>>V[W??D>ԝ)>1?E?̔>E>e?/?ff>gf>D?4?R>T>׋M?֋=?>VI>7?U[G?UI>>V[W?'?D>ԝi>1?U?̔>E>e?/!?ff>gf>D?D?R>T>׋M?֋M?>VI>7?U[W?UI>>V[W?7?D>Δ>1?e?̔>E>e?/1?ff>gf>D?T?R>T>׋M?֋]?>VI>7?U[g?UI>VR?V[W?G?D>δ>1?u?̔>"?e?/A?ff>43 ?D?d?R>*t?׋M?֋m?>VI>7?U[w?UI>VR?V[W?W?D>>1?F̂?̔>"?e?/Q?ff>43?D?t?R>*t?׋M?֋}?>?7??UI>VR(?V[W?g?D>>1?F̊?̔>".?e?/a?ff>43+?D?ff?R>*t"?׋M?ņ?>?7??UI>VR8?V[W?w?D>ug +?1?F̒?̔>">?e?/q?ff>43;?D?ff?R>*t2?׋M?Ŏ?>(?7??UI>VRH?V[W?փ?D>ug?1?F̚?̔>"N?e??ff>43K?D?ff?R>*tB?׋M?Ŗ?>8?7??UI>VRX?V[W?֋?D>ug*?1?F̢?̔>"^?e??ff>23T?23S>R>Y/6׋]?Y/v>UR?Sm]G?>UI>SmV[g?>|"?1A?1>̴>x鎽u?t>ff>dfT?>R>^׋]?>UR?SmG?>UI>LV[g?^>|"?,bVA?1>̴>u?tG>ff>T?>R>dX׋]?>UR?ںG?>UI>Z%=V[g?U[>|"?,bA?1>̴>-b=u?^>ff>833=T?>R>p +<׋]?>UR?j뼫G?>UI>=V[g?U[>|"?XĬA??̴>=u?^>ff>=T?>R>N=׋]?>UR?J +=G?U[?UI>VI!>V[g?U[>|"?`A??̴>D8>u?^>ff>,>T??R> >׋]?֋ ?UR?Z%=G?U[?UI>VIa>V[g?U[>|"?Pw&=A?%?̴>Dx>u?^>ff>l>T??R>I>׋]?֋?UR?">G?U['?UI>>V[g??|"?;=A?5?̴>E>u?/?ff>gf>T?$?R>T>׋]?֋-?UR?b>G?U[7?UI>>V[g??|"?ԝ)>A?E?̴>E>u?/?ff>gf>T?4?R>T>׋]?֋=?UR?VI>G?U[G?UI>>V[g?'?|"?ԝi>A?U?̴>E>u?/!?ff>gf>T?D?R>T>׋]?֋M?UR?VI>G?U[W?UI>>V[g?7?|"?Δ>A?e?̴>E>u?/1?ff>gf>T?T?R>T>׋]?֋]?UR?VI>G?U[g?UI>VR?V[g?G?|"?δ>A?u?̴>"?u?/A?ff>43 ?T?d?R>*t?׋]?֋m?UR?VI>G?U[w?UI>VR?V[g?W?|"?>A?F̂?̴>"?u?/Q?ff>43?T?t?R>*t?׋]?֋}?UR??G??UI>VR(?V[g?g?|"?>A?F̊?̴>".?u?/a?ff>43+?T?ff?R>*t"?׋]?ņ?UR??G??UI>VR8?V[g?w?|"?ug +?A?F̒?̴>">?u?/q?ff>43;?T?ff?R>*t2?׋]?Ŏ?UR?(?G??UI>VRH?V[g?փ?|"?ug?A?F̚?̴>"N?u??ff>43K?T?ff?R>*tB?׋]?Ŗ?UR?8?G??UI>VRX?V[g?֋?|"?ug*?A?F̢?̴>"^?u??33 ?23d?23S>)t?Y/6׋m?Y/v>UR?Sm]W?>UI>SmV[w?>|"?1Q?1>>x鎽̂?t>33 ?dfd?>)t?^׋m?>UR?SmW?>UI>LV[w?^>|"?,bVQ?1>>̂?tG>33 ?d?>)t?dX׋m?>UR?ںW?>UI>Z%=V[w?U[>|"?,bQ?1>>-b=̂?^>33 ?833=d?>)t?p +<׋m?>UR?j뼫W?>UI>=V[w?U[>|"?XĬQ??>=̂?^>33 ?=d?>)t?N=׋m?>UR?J +=W?U[?UI>VI!>V[w?U[>|"?`Q??>D8>̂?^>33 ?,>d??)t? >׋m?֋ ?UR?Z%=W?U[?UI>VIa>V[w?U[>|"?Pw&=Q?%?>Dx>̂?^>33 ?l>d??)t?I>׋m?֋?UR?">W?U['?UI>>V[w??|"?;=Q?5?>E>̂?/?33 ?gf>d?$?)t?T>׋m?֋-?UR?b>W?U[7?UI>>V[w??|"?ԝ)>Q?E?>E>̂?/?33 ?gf>d?4?)t?T>׋m?֋=?UR?VI>W?U[G?UI>>V[w?'?|"?ԝi>Q?U?>E>̂?/!?33 ?gf>d?D?)t?T>׋m?֋M?UR?VI>W?U[W?UI>>V[w?7?|"?Δ>Q?e?>E>̂?/1?33 ?gf>d?T?)t?T>׋m?֋]?UR?VI>W?U[g?UI>VR?V[w?G?|"?δ>Q?u?>"?̂?/A?33 ?43 ?d?d?)t?*t?׋m?֋m?UR?VI>W?U[w?UI>VR?V[w?W?|"?>Q?F̂?>"?̂?/Q?33 ?43?d?t?)t?*t?׋m?֋}?UR??W??UI>VR(?V[w?g?|"?>Q?F̊?>".?̂?/a?33 ?43+?d?ff?)t?*t"?׋m?ņ?UR??W??UI>VR8?V[w?w?|"?ug +?Q?F̒?>">?̂?/q?33 ?43;?d?ff?)t?*t2?׋m?Ŏ?UR?(?W??UI>VRH?V[w?փ?|"?ug?Q?F̚?>"N?̂??33 ?43K?d?ff?)t?*tB?׋m?Ŗ?UR?8?W??UI>VRX?V[w?֋?|"?ug*?Q?F̢?>"^?̂??33?23t?23S>)t?Y/6׋}?Y/v>UR(?Sm]g?>?Sm?>|".?1a?1>>x鎽̊?t>33?dft?>)t?^׋}?>UR(?Smg?>?L?^>|".?,bVa?1>>̊?tG>33?t?>)t?dX׋}?>UR(?ںg?>?Z%=?U[>|".?,ba?1>>-b=̊?^>33?833=t?>)t?p +<׋}?>UR(?j뼫g?>?=?U[>|".?XĬa??>=̊?^>33?=t?>)t?N=׋}?>UR(?J +=g?U[??VI!>?U[>|".?`a??>D8>̊?^>33?,>t??)t? >׋}?֋ ?UR(?Z%=g?U[??VIa>?U[>|".?Pw&=a?%?>Dx>̊?^>33?l>t??)t?I>׋}?֋?UR(?">g?U['??>??|".?;=a?5?>E>̊?/?33?gf>t?$?)t?T>׋}?֋-?UR(?b>g?U[7??>??|".?ԝ)>a?E?>E>̊?/?33?gf>t?4?)t?T>׋}?֋=?UR(?VI>g?U[G??>?'?|".?ԝi>a?U?>E>̊?/!?33?gf>t?D?)t?T>׋}?֋M?UR(?VI>g?U[W??>?7?|".?Δ>a?e?>E>̊?/1?33?gf>t?T?)t?T>׋}?֋]?UR(?VI>g?U[g??VR??G?|".?δ>a?u?>"?̊?/A?33?43 ?t?d?)t?*t?׋}?֋m?UR(?VI>g?U[w??VR??W?|".?>a?F̂?>"?̊?/Q?33?43?t?t?)t?*t?׋}?֋}?UR(??g???VR(??g?|".?>a?F̊?>".?̊?/a?33?43+?t?ff?)t?*t"?׋}?ņ?UR(??g???VR8??w?|".?ug +?a?F̒?>">?̊?/q?33?43;?t?ff?)t?*t2?׋}?Ŏ?UR(?(?g???VRH??փ?|".?ug?a?F̚?>"N?̊??33?43K?t?ff?)t?*tB?׋}?Ŗ?UR(?8?g???VRX??֋?|".?ug*?a?F̢?>"^?̊??33+?23ff?23S>)t"?Y/6ņ?Y/v>UR8?Sm]w?>?Sm?>|">?1q?1>vf +?x鎽̒?t>33+?dfff?>)t"?^ņ?>UR8?Smw?>?L?^>|">?,bVq?1>vf +?̒?tG>33+?ff?>)t"?dXņ?>UR8?ںw?>?Z%=?U[>|">?,bq?1>vf +?-b=̒?^>33+?833=ff?>)t"?p +<ņ?>UR8?j뼫w?>?=?U[>|">?XĬq??vf +?=̒?^>33+?=ff?>)t"?N=ņ?>UR8?J +=w?U[??VI!>?U[>|">?`q??vf +?D8>̒?^>33+?,>ff??)t"? >ņ?֋ ?UR8?Z%=w?U[??VIa>?U[>|">?Pw&=q?%?vf +?Dx>̒?^>33+?l>ff??)t"?I>ņ?֋?UR8?">w?U['??>??|">?;=q?5?vf +?E>̒?/?33+?gf>ff?$?)t"?T>ņ?֋-?UR8?b>w?U[7??>??|">?ԝ)>q?E?vf +?E>̒?/?33+?gf>ff?4?)t"?T>ņ?֋=?UR8?VI>w?U[G??>?'?|">?ԝi>q?U?vf +?E>̒?/!?33+?gf>ff?D?)t"?T>ņ?֋M?UR8?VI>w?U[W??>?7?|">?Δ>q?e?vf +?E>̒?/1?33+?gf>ff?T?)t"?T>ņ?֋]?UR8?VI>w?U[g??VR??G?|">?δ>q?u?vf +?"?̒?/A?33+?43 ?ff?d?)t"?*t?ņ?֋m?UR8?VI>w?U[w??VR??W?|">?>q?F̂?vf +?"?̒?/Q?33+?43?ff?t?)t"?*t?ņ?֋}?UR8??w???VR(??g?|">?>q?F̊?vf +?".?̒?/a?33+?43+?ff?ff?)t"?*t"?ņ?ņ?UR8??w???VR8??w?|">?ug +?q?F̒?vf +?">?̒?/q?33+?43;?ff?ff?)t"?*t2?ņ?Ŏ?UR8?(?w???VRH??փ?|">?ug?q?F̚?vf +?"N?̒??33+?43K?ff?ff?)t"?*tB?ņ?Ŗ?UR8?8?w???VRX??֋?|">?ug*?q?F̢?vf +?"^?̒??33;?23ff?23S>)t2?Y/6Ŏ?Y/v>URH?Sm]փ?>(?Sm?>|"N?1?1>vf?x鎽̚?t>33;?dfff?>)t2?^Ŏ?>URH?Smփ?>(?L?^>|"N?,bV?1>vf?̚?tG>33;?ff?>)t2?dXŎ?>URH?ںփ?>(?Z%=?U[>|"N?,b?1>vf?-b=̚?^>33;?833=ff?>)t2?p +<Ŏ?>URH?jփ?>(?=?U[>|"N?XĬ??vf?=̚?^>33;?=ff?>)t2?N=Ŏ?>URH?J +=փ?U[?(?VI!>?U[>|"N?`??vf?D8>̚?^>33;?,>ff??)t2? >Ŏ?֋ ?URH?Z%=փ?U[?(?VIa>?U[>|"N?Pw&=?%?vf?Dx>̚?^>33;?l>ff??)t2?I>Ŏ?֋?URH?">փ?U['?(?>??|"N?;=?5?vf?E>̚?/?33;?gf>ff?$?)t2?T>Ŏ?֋-?URH?b>փ?U[7?(?>??|"N?ԝ)>?E?vf?E>̚?/?33;?gf>ff?4?)t2?T>Ŏ?֋=?URH?VI>փ?U[G?(?>?'?|"N?ԝi>?U?vf?E>̚?/!?33;?gf>ff?D?)t2?T>Ŏ?֋M?URH?VI>փ?U[W?(?>?7?|"N?Δ>?e?vf?E>̚?/1?33;?gf>ff?T?)t2?T>Ŏ?֋]?URH?VI>փ?U[g?(?VR??G?|"N?δ>?u?vf?"?̚?/A?33;?43 ?ff?d?)t2?*t?Ŏ?֋m?URH?VI>փ?U[w?(?VR??W?|"N?>?F̂?vf?"?̚?/Q?33;?43?ff?t?)t2?*t?Ŏ?֋}?URH??փ??(?VR(??g?|"N?>?F̊?vf?".?̚?/a?33;?43+?ff?ff?)t2?*t"?Ŏ?ņ?URH??փ??(?VR8??w?|"N?ug +??F̒?vf?">?̚?/q?33;?43;?ff?ff?)t2?*t2?Ŏ?Ŏ?URH?(?փ??(?VRH??փ?|"N?ug??F̚?vf?"N?̚??33;?43K?ff?ff?)t2?*tB?Ŏ?Ŗ?URH?8?փ??(?VRX??֋?|"N?ug*??F̢?vf?"^?̚??33K?23ff?23S>)tB?Y/6Ŗ?Y/v>URX?Sm]֋?>8?Sm?>|"^?1?1>vf*?x鎽̢?t>33K?dfff?>)tB?^Ŗ?>URX?Sm֋?>8?L?^>|"^?,bV?1>vf*?̢?tG>33K?ff?>)tB?dXŖ?>URX?ں֋?>8?Z%=?U[>|"^?,b?1>vf*?-b=̢?^>33K?833=ff?>)tB?p +<Ŗ?>URX?j֋?>8?=?U[>|"^?XĬ??vf*?=̢?^>33K?=ff?>)tB?N=Ŗ?>URX?J +=֋?U[?8?VI!>?U[>|"^?`??vf*?D8>̢?^>33K?,>ff??)tB? >Ŗ?֋ ?URX?Z%=֋?U[?8?VIa>?U[>|"^?Pw&=?%?vf*?Dx>̢?^>33K?l>ff??)tB?I>Ŗ?֋?URX?">֋?U['?8?>??|"^?;=?5?vf*?E>̢?/?33K?gf>ff?$?)tB?T>Ŗ?֋-?URX?b>֋?U[7?8?>??|"^?ԝ)>?E?vf*?E>̢?/?33K?gf>ff?4?)tB?T>Ŗ?֋=?URX?VI>֋?U[G?8?>?'?|"^?ԝi>?U?vf*?E>̢?/!?33K?gf>ff?D?)tB?T>Ŗ?֋M?URX?VI>֋?U[W?8?>?7?|"^?Δ>?e?vf*?E>̢?/1?33K?gf>ff?T?)tB?T>Ŗ?֋]?URX?VI>֋?U[g?8?VR??G?|"^?δ>?u?vf*?"?̢?/A?33K?43 ?ff?d?)tB?*t?Ŗ?֋m?URX?VI>֋?U[w?8?VR??W?|"^?>?F̂?vf*?"?̢?/Q?33K?43?ff?t?)tB?*t?Ŗ?֋}?URX??֋??8?VR(??g?|"^?>?F̊?vf*?".?̢?/a?33K?43+?ff?ff?)tB?*t"?Ŗ?ņ?URX??֋??8?VR8??w?|"^?ug +??F̒?vf*?">?̢?/q?33K?43;?ff?ff?)tB?*t2?Ŗ?Ŏ?URX?(?֋??8?VRH??փ?|"^?ug??F̚?vf*?"N?̢??33K?43K?ff?ff?)tB?*tB?Ŗ?Ŗ?URX?8?֋??8?VRX??֋?|"^?ug*??F̢?vf*?"^?̢??@?>>ccF>D> u>> >u>t׳:S>׳>>VS>@>>cǽF>D> *u>y +?/<>y>tg{:S>?0=>>@=>?c? 꽐'(u>y*? +>>y>t\:S>>?4,>>>@@>>0?cx>F>8? 8=u>yJ?}>>^?U>>?@>>P?c>F>X? U>u>yj?}>>:S>~?U>>4?@>>p?c>F>x? >u>:S>l?* ?>T?@?>?c^?F>Q|? >u>:S>l?* +?>t?@0?>?c^'?F>Q|? 꽇}?u>?t&?:S>l?* K?>ky??>>ǽcF>D>/<z>> * z +?u>0=׳>׳>\m{W?VS>>>ǽǽF>D>/< *z>y +? */0=g{>?\m{0=W?>=>?ǽ?/<'(z>y*? * +>z +?y>0=\>>?\m{4,>W?>@>>0?ǽx>F>8?/<8=z>yJ? *}>z +?^?\m{U>W??>>P?ǽ>F>X?/<U>z>yj? *}>z +?>~?\m{U>W?4?>>p?ǽ>F>x?/<>z>>l?\m{* ?W?T??>?ǽ^?F>Q|?/<>z>>l?\m{* +?W?t?0?>?ǽ^'?F>Q|?/<}?z>l?\m{* K?W?ky?=??> +>z>>'( z*?u>2,>׳>׳>W>?VS>=?><ǽ?D> +> *z>y +?'(/2,>g{>?0=W>?>==??<<?? +>'(z>y*?'( +>z*?y>2,>\>>?4,>W>?>=@>?0??8? +>8=z>yJ?'(}>z*?@ +;>^?U>W>??=>?P?<>?X? +>U>z>yj?'(}>z*?R>>~?U>W>?4?=>?p?<>?x? +>>z>)L>>l?* ?W>?T?=???<^??Q|? +>>z>)L>>l?* +?W>?t?=0???<^'??Q|? +>}?z>&?>l?* K?W>?ky??>?0?>t>c8?D>}>=A?>0= zJ?u>c>׳N?׳>T;W^?VS>?>0?>t>ǽ8?D>}> *=A?y +?0=/c>g{N??T;0=W^?>?>=0??t><8??}>'(=A?y*?0= +>zJ?y>c>\N?>?T;4,>W^?>?>@>0?0?t>x>8?8?}>8==A?yJ?0=}>zJ?@ +;N?^?T;U>W^???>>0?P?t>>8?X?}>U>=A?yj?0=}>zJ?R>N?~?T;U>W^?4??>>0?p?t>>8?x?}>>=A?)L>N?l?T;* ?W^?T??>?0??t>^?8?Q|?}>>=A?)L>N?l?T;* +?W^?t??>0?0??t>^'?8?Q|?}>}?=A?&?N?l?T;* K?W^?ky?>?P?>>cX?D>}>=A=?>U> zj?u>c>׳N4?׳>>W~?VS>>P?>>ǽX?D>}> *=A=?y +?U>/c>g{N4??>0=W~?>>=P??>'(=A=?y*?U> +>zj?y>c>\N4?>?>4,>W~?>>@>P?0?>x>X?8?}>8==A=?yJ?U>}>zj?@ +;N4?^?>U>W~??>>P?P?>>X?X?}>U>=A=?yj?U>}>zj?R>N4?~?>U>W~?4?>>P?p?>>X?x?}>>=A=?ľ?zj?)L>N4?l?>* ?W~?T?>?P??>^?X?Q|?}>>=A=?ľ"?zj?)L>N4?l?>* +?W~?t?>0?P??>^'?X?Q|?}>}?=A=?ľB?zj??c>&?N4?l?>* K?W~?ky?>?p?>>cx?D>þ?=A]?> > =A?u> ?׳NT?׳>RI>m?VS>>p?>>ǽx?D>þ? *=A]?y +? >/<=A?y> ?g{NT??RI>0=m?>>=p??> +>=A?y> ?\NT?>?RI>4,>m?>>@>p?0?>x>x?8?þ?8==A]?yJ? >}>=A?U>m??>>p?P?>>x?X?þ?U>=A]?yj? >}>=A?NT?~?RI>U>m?4?>>p?p?>>x?x?þ?>=A]?ľ?=A?NT?l?RI>* ?m?T?>?p??>^?x?Q|?þ?>=A]?ľ"?=A?NT?l?RI>* +?m?t?>0?p??>^'?x?Q|?þ?}?=A]?ľB?=A?? ?&?NT?l?RI>* K?m?ky????>]?cR|?D>þ"?=A}?> > =A?u> +?׳Nt?׳>RI>m?VS>??>]?ǽR|?D>þ"? *=A}?y +? >/<=A?y> +?g{Nt??RI>0=m?>?=??]? +>=A?y> +?\Nt?>?RI>4,>m?>?@>?0?]?x>R|?8?þ"?8==A}?yJ? >}>=A?U>m???>?P?]?>R|?X?þ"?U>=A}?yj? >}>=A?Nt?~?RI>U>m?4??>?p?]?>R|?x?þ"?>=A}?ľ?=A?Nt?l?RI>* ?m?T?????]?^?R|?Q|?þ"?>=A}?ľ"?=A?Nt?l?RI>* +?m?t??0???]?^'?R|?Q|?þ"?}?=A}?ľB?=A?? +?&?Nt?l?RI>* K?m?ky?0???>]'?cR|?D>þB??>}? =A?u> K?׳y?׳>$?m?VS>0??>]'?ǽR|?D>þB? *?y +?}?/<=A?y> K?g{y??$?0=m?>0?=??]'?=A?y> K?\y?>?$?4,>m?>0?@>?0?]'?x>R|?8?þB?8=?yJ?}?}>=A?m??0?>?P?]'?>R|?X?þB?U>?yj?}?}>=A?y?~?$?U>m?4?0?>?p?]'?>R|?x?þB?>?y?l?$?* ?m?T?0????]'?^?R|?Q|?þB?>?y?l?$?* +?m?t?0?0???]'?^'?R|?Q|?þB?}??ef>^5qZ5q>>zֽ:S>?=Stֽ?>H62>K0?H:C$0?>LL=gf>233?^5q`l<>VMU?=SƬ>??H,m@2>Kp?H:?>$0?|?L>gf>23s?^5qSe>>VM|?zֽY)>>Ԋ?=ScV>?Z?HPK~=2> ?H:>$0?|P?L ?gf>?^5q?>&?zֽƬ>>Ԫ?=S2+%??gj?Hjɟ>2> ?H:྄/?$0?>?L=L433?ef> lì>:S??LtֽU?>?>6 ?K0?t@C$p?>L=L=433?233? l<`lL?U?LƬ>U???>,m@ ?Kp?t@?>$p?|?L=>433?23s? lXMY)>?Ԋ?LcV>U?Z??>PK~= ? ?t@>$p?|P?L= ?433?? l<?XMƬ>?Ԫ?L2+%?U?gj??>jɟ> ? ?t@/?$p?>?>L43s?ef>Qe>Z5qXM|?>bV>:SZ??Y)>tֽԊ?>>6 P?K0?-~=C?>>L=43s?233?Qe>`lLZ?U?Y)>Ƭ>Ԋ??>,m@ P?Kp?-~=?>?|?>>43s?23s?Qe>Se>XM|?VM|?bV>Y)>Z?Ԋ?Y)>cV>Ԋ?Z?>PK~= P? ?-~=>?|P?> ?43s??Qe>?XM|?&?bV>Ƭ>Z?Ԫ?Y)>2+%?Ԋ?gj?>jɟ> P? ?-~=/??>? ?L?ef>?Z5q&?>1+%?:Shj??ì>tֽԪ?>/?6ྍ?K0?ş>C?> ?L=?233??`l<&?VMƬ>Ԫ??/?,m@?Kp?ş>?>?|? ?>?23s??Se>&?VM|?1+%?Y)>hj?Ԋ?ì>cV>Ԫ?Z?/?PK~=? ?ş>>?|P? ? ?????&?&?1+%?Ƭ>hj?Ԫ?ì>2+%?Ԫ?gj?/?jɟ>? ?ş>/??>?gf&?ff&?Y>Y>|/?z/? bh?P?P?ah?x#\q?⾰;<^q?E<>43>gf&?33?Y> Ӡ>|/?=˗? <>bh?ah?>/>P?04?x#<@5j==>V??^q?"{?23>43?ff&? Ӡ>Y>>˗?z/?14?P?<>bh?ah??X{?\q?j=;23>43>43?33? Ӡ> Ӡ>>˗?=˗?<>14?ah?<>>/>bh?04??@5j={?V?j=?x?"{?</U??/4(>?U?D-g><4F?O?|A0g>_P?3F? \ No newline at end of file diff --git a/weights/face_detection_model-weights_manifest.json b/weights/face_detection_model-weights_manifest.json new file mode 100644 index 00000000..f512c22f --- /dev/null +++ b/weights/face_detection_model-weights_manifest.json @@ -0,0 +1 @@ +[{"paths":["face_detection_model-shard1","face_detection_model-shard2"],"weights":[{"dtype":"float32","shape":[1,1,512,9],"quantization":{"scale":0.0026856216729856004,"min":-0.34107395246917127,"dtype":"uint8"},"name":"Prediction/BoxPredictor_0/ClassPredictor/weights"},{"dtype":"float32","shape":[9],"quantization":{"scale":0.00198518248165355,"min":-0.32159956202787515,"dtype":"uint8"},"name":"Prediction/BoxPredictor_0/ClassPredictor/biases"},{"dtype":"float32","shape":[1,1,1024,18],"quantization":{"scale":0.003060340296988394,"min":-0.489654447518143,"dtype":"uint8"},"name":"Prediction/BoxPredictor_1/ClassPredictor/weights"},{"dtype":"float32","shape":[18],"quantization":{"scale":0.0008040678851744708,"min":-0.12221831854651957,"dtype":"uint8"},"name":"Prediction/BoxPredictor_1/ClassPredictor/biases"},{"dtype":"float32","shape":[1,1,512,18],"quantization":{"scale":0.0012513800578958848,"min":-0.16017664741067325,"dtype":"uint8"},"name":"Prediction/BoxPredictor_2/ClassPredictor/weights"},{"dtype":"float32","shape":[18],"quantization":{"scale":0.000338070518245884,"min":-0.05510549447407909,"dtype":"uint8"},"name":"Prediction/BoxPredictor_2/ClassPredictor/biases"},{"dtype":"float32","shape":[1,1,256,18],"quantization":{"scale":0.0011819932975021064,"min":-0.1453851755927591,"dtype":"uint8"},"name":"Prediction/BoxPredictor_3/ClassPredictor/weights"},{"dtype":"float32","shape":[18],"quantization":{"scale":0.00015985782386041154,"min":-0.026536398760828316,"dtype":"uint8"},"name":"Prediction/BoxPredictor_3/ClassPredictor/biases"},{"dtype":"float32","shape":[1,1,256,18],"quantization":{"scale":0.0007035591438704846,"min":-0.08513065640832863,"dtype":"uint8"},"name":"Prediction/BoxPredictor_4/ClassPredictor/weights"},{"dtype":"float32","shape":[18],"quantization":{"scale":0.00008793946574716008,"min":-0.013190919862074012,"dtype":"uint8"},"name":"Prediction/BoxPredictor_4/ClassPredictor/biases"},{"dtype":"float32","shape":[1,1,128,18],"quantization":{"scale":0.00081320781918133,"min":-0.11059626340866088,"dtype":"uint8"},"name":"Prediction/BoxPredictor_5/ClassPredictor/weights"},{"dtype":"float32","shape":[18],"quantization":{"scale":0.0000980533805547976,"min":-0.014609953702664841,"dtype":"uint8"},"name":"Prediction/BoxPredictor_5/ClassPredictor/biases"},{"dtype":"int32","shape":[],"quantization":{"scale":1,"min":3,"dtype":"uint8"},"name":"Prediction/BoxPredictor_0/stack_1/2"},{"dtype":"int32","shape":[3],"quantization":{"scale":0.00392156862745098,"min":0,"dtype":"uint8"},"name":"Postprocessor/Slice/begin"},{"dtype":"int32","shape":[3],"quantization":{"scale":1,"min":-1,"dtype":"uint8"},"name":"Postprocessor/Slice/size"},{"dtype":"float32","shape":[1,1,512,12],"quantization":{"scale":0.003730384859384275,"min":-0.4327246436885759,"dtype":"uint8"},"name":"Prediction/BoxPredictor_0/BoxEncodingPredictor/weights"},{"dtype":"float32","shape":[12],"quantization":{"scale":0.0018744708568442102,"min":-0.3917644090804399,"dtype":"uint8"},"name":"Prediction/BoxPredictor_0/BoxEncodingPredictor/biases"},{"dtype":"int32","shape":[],"quantization":{"scale":1,"min":3072,"dtype":"uint8"},"name":"Prediction/BoxPredictor_0/stack_1/1"},{"dtype":"float32","shape":[1,1,1024,24],"quantization":{"scale":0.00157488017689948,"min":-0.20000978246623397,"dtype":"uint8"},"name":"Prediction/BoxPredictor_1/BoxEncodingPredictor/weights"},{"dtype":"float32","shape":[24],"quantization":{"scale":0.0002823906713256649,"min":-0.043488163384152394,"dtype":"uint8"},"name":"Prediction/BoxPredictor_1/BoxEncodingPredictor/biases"},{"dtype":"int32","shape":[],"quantization":{"scale":1,"min":1536,"dtype":"uint8"},"name":"Prediction/BoxPredictor_1/stack_1/1"},{"dtype":"float32","shape":[1,1,512,24],"quantization":{"scale":0.0007974451663447361,"min":-0.11004743295557358,"dtype":"uint8"},"name":"Prediction/BoxPredictor_2/BoxEncodingPredictor/weights"},{"dtype":"float32","shape":[24],"quantization":{"scale":0.0001350417988849621,"min":-0.02039131163162928,"dtype":"uint8"},"name":"Prediction/BoxPredictor_2/BoxEncodingPredictor/biases"},{"dtype":"int32","shape":[],"quantization":{"scale":1,"min":384,"dtype":"uint8"},"name":"Prediction/BoxPredictor_2/stack_1/1"},{"dtype":"float32","shape":[1,1,256,24],"quantization":{"scale":0.0007113990246080885,"min":-0.0860792819775787,"dtype":"uint8"},"name":"Prediction/BoxPredictor_3/BoxEncodingPredictor/weights"},{"dtype":"float32","shape":[24],"quantization":{"scale":0.000050115815418608046,"min":-0.007617603943628423,"dtype":"uint8"},"name":"Prediction/BoxPredictor_3/BoxEncodingPredictor/biases"},{"dtype":"int32","shape":[],"quantization":{"scale":1,"min":96,"dtype":"uint8"},"name":"Prediction/BoxPredictor_3/stack_1/1"},{"dtype":"float32","shape":[1,1,256,24],"quantization":{"scale":0.000590049314732645,"min":-0.06903576982371946,"dtype":"uint8"},"name":"Prediction/BoxPredictor_4/BoxEncodingPredictor/weights"},{"dtype":"float32","shape":[24],"quantization":{"scale":0.00003513663861097074,"min":-0.006359731588585704,"dtype":"uint8"},"name":"Prediction/BoxPredictor_4/BoxEncodingPredictor/biases"},{"dtype":"int32","shape":[],"quantization":{"scale":1,"min":24,"dtype":"uint8"},"name":"Prediction/BoxPredictor_4/stack_1/1"},{"dtype":"float32","shape":[1,1,128,24],"quantization":{"scale":0.0005990567744946948,"min":-0.07907549423329971,"dtype":"uint8"},"name":"Prediction/BoxPredictor_5/BoxEncodingPredictor/weights"},{"dtype":"float32","shape":[24],"quantization":{"scale":0.00003392884288640583,"min":-0.006039334033780238,"dtype":"uint8"},"name":"Prediction/BoxPredictor_5/BoxEncodingPredictor/biases"},{"dtype":"float32","shape":[],"quantization":{"scale":1,"min":0.007843137718737125,"dtype":"uint8"},"name":"Preprocessor/mul/x"},{"dtype":"int32","shape":[2],"quantization":{"scale":1,"min":512,"dtype":"uint8"},"name":"Preprocessor/ResizeImage/size"},{"dtype":"float32","shape":[],"quantization":{"scale":1,"min":1,"dtype":"uint8"},"name":"Preprocessor/sub/y"},{"dtype":"float32","shape":[3,3,3,32],"quantization":{"scale":0.03948551065781537,"min":-5.014659853542552,"dtype":"uint8"},"name":"MobilenetV1/Conv2d_0_pointwise/weights"},{"dtype":"float32","shape":[32],"quantization":{"scale":0.0498106133704092,"min":-7.371970778820562,"dtype":"uint8"},"name":"MobilenetV1/Conv2d_0_pointwise/convolution_bn_offset"},{"dtype":"float32","shape":[3,3,32,1],"quantization":{"scale":0.036833542468501075,"min":-4.714693435968138,"dtype":"uint8"},"name":"MobilenetV1/Conv2d_1_depthwise/depthwise_weights"},{"dtype":"float32","shape":[32],"quantization":{"scale":0.012173276705046495,"min":-0.012173276705046495,"dtype":"uint8"},"name":"MobilenetV1/Conv2d_1_depthwise/BatchNorm/gamma"},{"dtype":"float32","shape":[32],"quantization":{"scale":0.032182769214405736,"min":-2.4780732295092416,"dtype":"uint8"},"name":"MobilenetV1/Conv2d_1_depthwise/BatchNorm/beta"},{"dtype":"float32","shape":[32],"quantization":{"scale":0.028287527607936486,"min":-3.366215785344442,"dtype":"uint8"},"name":"MobilenetV1/Conv2d_1_depthwise/BatchNorm/moving_mean"},{"dtype":"float32","shape":[32],"quantization":{"scale":0.04716738532571232,"min":3.9071404665769224e-36,"dtype":"uint8"},"name":"MobilenetV1/Conv2d_1_depthwise/BatchNorm/moving_variance"},{"dtype":"float32","shape":[1,1,32,64],"quantization":{"scale":0.04010109433940812,"min":-4.290817094316669,"dtype":"uint8"},"name":"MobilenetV1/Conv2d_1_pointwise/weights"},{"dtype":"float32","shape":[64],"quantization":{"scale":0.2212210038129021,"min":-34.51047659481273,"dtype":"uint8"},"name":"MobilenetV1/Conv2d_1_pointwise/convolution_bn_offset"},{"dtype":"float32","shape":[3,3,64,1],"quantization":{"scale":0.010024750933927648,"min":-1.343316625146305,"dtype":"uint8"},"name":"MobilenetV1/Conv2d_2_depthwise/depthwise_weights"},{"dtype":"float32","shape":[64],"quantization":{"scale":0.006120916675118839,"min":0.5227176547050476,"dtype":"uint8"},"name":"MobilenetV1/Conv2d_2_depthwise/BatchNorm/gamma"},{"dtype":"float32","shape":[64],"quantization":{"scale":0.02317035385206634,"min":-0.7646216771181892,"dtype":"uint8"},"name":"MobilenetV1/Conv2d_2_depthwise/BatchNorm/beta"},{"dtype":"float32","shape":[64],"quantization":{"scale":0.04980821422502106,"min":-5.8275610643274645,"dtype":"uint8"},"name":"MobilenetV1/Conv2d_2_depthwise/BatchNorm/moving_mean"},{"dtype":"float32","shape":[64],"quantization":{"scale":0.051751047022202436,"min":3.916113799002297e-36,"dtype":"uint8"},"name":"MobilenetV1/Conv2d_2_depthwise/BatchNorm/moving_variance"},{"dtype":"float32","shape":[1,1,64,128],"quantization":{"scale":0.021979344124887504,"min":-2.1319963801140878,"dtype":"uint8"},"name":"MobilenetV1/Conv2d_2_pointwise/weights"},{"dtype":"float32","shape":[128],"quantization":{"scale":0.09958663267247816,"min":-11.054116226645077,"dtype":"uint8"},"name":"MobilenetV1/Conv2d_2_pointwise/convolution_bn_offset"},{"dtype":"float32","shape":[3,3,128,1],"quantization":{"scale":0.01943492702409333,"min":-2.6237151482525993,"dtype":"uint8"},"name":"MobilenetV1/Conv2d_3_depthwise/depthwise_weights"},{"dtype":"float32","shape":[128],"quantization":{"scale":0.017852897737540452,"min":0.40204083919525146,"dtype":"uint8"},"name":"MobilenetV1/Conv2d_3_depthwise/BatchNorm/gamma"},{"dtype":"float32","shape":[128],"quantization":{"scale":0.029888209174661076,"min":-1.972621805527631,"dtype":"uint8"},"name":"MobilenetV1/Conv2d_3_depthwise/BatchNorm/beta"},{"dtype":"float32","shape":[128],"quantization":{"scale":0.029319268581913967,"min":-5.130872001834945,"dtype":"uint8"},"name":"MobilenetV1/Conv2d_3_depthwise/BatchNorm/moving_mean"},{"dtype":"float32","shape":[128],"quantization":{"scale":0.014018708584355373,"min":3.9083178263362604e-36,"dtype":"uint8"},"name":"MobilenetV1/Conv2d_3_depthwise/BatchNorm/moving_variance"},{"dtype":"float32","shape":[1,1,128,128],"quantization":{"scale":0.020776657964669022,"min":-2.5347522716896207,"dtype":"uint8"},"name":"MobilenetV1/Conv2d_3_pointwise/weights"},{"dtype":"float32","shape":[128],"quantization":{"scale":0.14383157094319662,"min":-9.636715253194174,"dtype":"uint8"},"name":"MobilenetV1/Conv2d_3_pointwise/convolution_bn_offset"},{"dtype":"float32","shape":[3,3,128,1],"quantization":{"scale":0.004463558571011412,"min":-0.5981168485155293,"dtype":"uint8"},"name":"MobilenetV1/Conv2d_4_depthwise/depthwise_weights"},{"dtype":"float32","shape":[128],"quantization":{"scale":0.006487431245691636,"min":0.47910428047180176,"dtype":"uint8"},"name":"MobilenetV1/Conv2d_4_depthwise/BatchNorm/gamma"},{"dtype":"float32","shape":[128],"quantization":{"scale":0.026542164297664865,"min":-1.2209395576925839,"dtype":"uint8"},"name":"MobilenetV1/Conv2d_4_depthwise/BatchNorm/beta"},{"dtype":"float32","shape":[128],"quantization":{"scale":0.05119945675719018,"min":-8.60150873520795,"dtype":"uint8"},"name":"MobilenetV1/Conv2d_4_depthwise/BatchNorm/moving_mean"},{"dtype":"float32","shape":[128],"quantization":{"scale":0.03081628388049556,"min":3.911508751095344e-36,"dtype":"uint8"},"name":"MobilenetV1/Conv2d_4_depthwise/BatchNorm/moving_variance"},{"dtype":"float32","shape":[1,1,128,256],"quantization":{"scale":0.010758659886378868,"min":-1.0328313490923713,"dtype":"uint8"},"name":"MobilenetV1/Conv2d_4_pointwise/weights"},{"dtype":"float32","shape":[256],"quantization":{"scale":0.08058219610476026,"min":-9.34753474815219,"dtype":"uint8"},"name":"MobilenetV1/Conv2d_4_pointwise/convolution_bn_offset"},{"dtype":"float32","shape":[3,3,256,1],"quantization":{"scale":0.01145936741548426,"min":-1.3292866201961742,"dtype":"uint8"},"name":"MobilenetV1/Conv2d_5_depthwise/depthwise_weights"},{"dtype":"float32","shape":[256],"quantization":{"scale":0.0083988838336047,"min":0.36280909180641174,"dtype":"uint8"},"name":"MobilenetV1/Conv2d_5_depthwise/BatchNorm/gamma"},{"dtype":"float32","shape":[256],"quantization":{"scale":0.02858148649627087,"min":-3.6584302715226715,"dtype":"uint8"},"name":"MobilenetV1/Conv2d_5_depthwise/BatchNorm/beta"},{"dtype":"float32","shape":[256],"quantization":{"scale":0.03988401375564874,"min":-7.099354448505476,"dtype":"uint8"},"name":"MobilenetV1/Conv2d_5_depthwise/BatchNorm/moving_mean"},{"dtype":"float32","shape":[256],"quantization":{"scale":0.009090481683904049,"min":0.020878996700048447,"dtype":"uint8"},"name":"MobilenetV1/Conv2d_5_depthwise/BatchNorm/moving_variance"},{"dtype":"float32","shape":[1,1,256,256],"quantization":{"scale":0.008951201625898773,"min":-1.1189002032373465,"dtype":"uint8"},"name":"MobilenetV1/Conv2d_5_pointwise/weights"},{"dtype":"float32","shape":[256],"quantization":{"scale":0.051758006974762565,"min":-5.745138774198645,"dtype":"uint8"},"name":"MobilenetV1/Conv2d_5_pointwise/convolution_bn_offset"},{"dtype":"float32","shape":[3,3,256,1],"quantization":{"scale":0.004110433190476661,"min":-0.6042336790000691,"dtype":"uint8"},"name":"MobilenetV1/Conv2d_6_depthwise/depthwise_weights"},{"dtype":"float32","shape":[256],"quantization":{"scale":0.013170199768216002,"min":0.3386639356613159,"dtype":"uint8"},"name":"MobilenetV1/Conv2d_6_depthwise/BatchNorm/gamma"},{"dtype":"float32","shape":[256],"quantization":{"scale":0.03599378548416437,"min":-3.70735990486893,"dtype":"uint8"},"name":"MobilenetV1/Conv2d_6_depthwise/BatchNorm/beta"},{"dtype":"float32","shape":[256],"quantization":{"scale":0.026967673208199296,"min":-3.748506575939702,"dtype":"uint8"},"name":"MobilenetV1/Conv2d_6_depthwise/BatchNorm/moving_mean"},{"dtype":"float32","shape":[256],"quantization":{"scale":0.012615410486857097,"min":3.9111388979838637e-36,"dtype":"uint8"},"name":"MobilenetV1/Conv2d_6_depthwise/BatchNorm/moving_variance"},{"dtype":"float32","shape":[1,1,256,512],"quantization":{"scale":0.00822840648538926,"min":-1.1848905338960536,"dtype":"uint8"},"name":"MobilenetV1/Conv2d_6_pointwise/weights"},{"dtype":"float32","shape":[512],"quantization":{"scale":0.06608965817619772,"min":-7.468131373910342,"dtype":"uint8"},"name":"MobilenetV1/Conv2d_6_pointwise/convolution_bn_offset"},{"dtype":"float32","shape":[3,3,512,1],"quantization":{"scale":0.008801074355256323,"min":-0.9593171047229393,"dtype":"uint8"},"name":"MobilenetV1/Conv2d_7_depthwise/depthwise_weights"},{"dtype":"float32","shape":[512],"quantization":{"scale":0.030577416513480393,"min":0.3285980224609375,"dtype":"uint8"},"name":"MobilenetV1/Conv2d_7_depthwise/BatchNorm/gamma"},{"dtype":"float32","shape":[512],"quantization":{"scale":0.04778536441279393,"min":-8.935863145192464,"dtype":"uint8"},"name":"MobilenetV1/Conv2d_7_depthwise/BatchNorm/beta"},{"dtype":"float32","shape":[512],"quantization":{"scale":0.04331884945140165,"min":-9.660103427662568,"dtype":"uint8"},"name":"MobilenetV1/Conv2d_7_depthwise/BatchNorm/moving_mean"},{"dtype":"float32","shape":[512],"quantization":{"scale":0.04126455444367785,"min":0.000604183878749609,"dtype":"uint8"},"name":"MobilenetV1/Conv2d_7_depthwise/BatchNorm/moving_variance"},{"dtype":"float32","shape":[1,1,512,512],"quantization":{"scale":0.009305818408143287,"min":-1.1446156642016243,"dtype":"uint8"},"name":"MobilenetV1/Conv2d_7_pointwise/weights"},{"dtype":"float32","shape":[512],"quantization":{"scale":0.04640720217835669,"min":-4.733534622192383,"dtype":"uint8"},"name":"MobilenetV1/Conv2d_7_pointwise/convolution_bn_offset"},{"dtype":"float32","shape":[3,3,512,1],"quantization":{"scale":0.008138792655047248,"min":-0.9766551186056698,"dtype":"uint8"},"name":"MobilenetV1/Conv2d_8_depthwise/depthwise_weights"},{"dtype":"float32","shape":[512],"quantization":{"scale":0.027351748358969596,"min":0.34030041098594666,"dtype":"uint8"},"name":"MobilenetV1/Conv2d_8_depthwise/BatchNorm/gamma"},{"dtype":"float32","shape":[512],"quantization":{"scale":0.04415061053107767,"min":-7.019947074441349,"dtype":"uint8"},"name":"MobilenetV1/Conv2d_8_depthwise/BatchNorm/beta"},{"dtype":"float32","shape":[512],"quantization":{"scale":0.02476683784933651,"min":-2.9224868662217083,"dtype":"uint8"},"name":"MobilenetV1/Conv2d_8_depthwise/BatchNorm/moving_mean"},{"dtype":"float32","shape":[512],"quantization":{"scale":0.02547598832684076,"min":0.00026032101595774293,"dtype":"uint8"},"name":"MobilenetV1/Conv2d_8_depthwise/BatchNorm/moving_variance"},{"dtype":"float32","shape":[1,1,512,512],"quantization":{"scale":0.01083052625843123,"min":-1.2563410459780227,"dtype":"uint8"},"name":"MobilenetV1/Conv2d_8_pointwise/weights"},{"dtype":"float32","shape":[512],"quantization":{"scale":0.06360894371481503,"min":-7.951117964351878,"dtype":"uint8"},"name":"MobilenetV1/Conv2d_8_pointwise/convolution_bn_offset"},{"dtype":"float32","shape":[3,3,512,1],"quantization":{"scale":0.006704086883395326,"min":-0.8648272079579971,"dtype":"uint8"},"name":"MobilenetV1/Conv2d_9_depthwise/depthwise_weights"},{"dtype":"float32","shape":[512],"quantization":{"scale":0.015343831567203297,"min":0.2711026668548584,"dtype":"uint8"},"name":"MobilenetV1/Conv2d_9_depthwise/BatchNorm/gamma"},{"dtype":"float32","shape":[512],"quantization":{"scale":0.03378283930759804,"min":-4.797163181678922,"dtype":"uint8"},"name":"MobilenetV1/Conv2d_9_depthwise/BatchNorm/beta"},{"dtype":"float32","shape":[512],"quantization":{"scale":0.021910778213949763,"min":-3.987761634938857,"dtype":"uint8"},"name":"MobilenetV1/Conv2d_9_depthwise/BatchNorm/moving_mean"},{"dtype":"float32","shape":[512],"quantization":{"scale":0.009284070410007296,"min":0.000021581046894425526,"dtype":"uint8"},"name":"MobilenetV1/Conv2d_9_depthwise/BatchNorm/moving_variance"},{"dtype":"float32","shape":[1,1,512,512],"quantization":{"scale":0.012783036979974485,"min":-1.9046725100161983,"dtype":"uint8"},"name":"MobilenetV1/Conv2d_9_pointwise/weights"},{"dtype":"float32","shape":[512],"quantization":{"scale":0.07273082733154297,"min":-9.52773838043213,"dtype":"uint8"},"name":"MobilenetV1/Conv2d_9_pointwise/convolution_bn_offset"},{"dtype":"float32","shape":[3,3,512,1],"quantization":{"scale":0.006126228033327589,"min":-0.7351473639993107,"dtype":"uint8"},"name":"MobilenetV1/Conv2d_10_depthwise/depthwise_weights"},{"dtype":"float32","shape":[512],"quantization":{"scale":0.029703759212119908,"min":0.28687000274658203,"dtype":"uint8"},"name":"MobilenetV1/Conv2d_10_depthwise/BatchNorm/gamma"},{"dtype":"float32","shape":[512],"quantization":{"scale":0.04394429898729511,"min":-6.3279790541704966,"dtype":"uint8"},"name":"MobilenetV1/Conv2d_10_depthwise/BatchNorm/beta"},{"dtype":"float32","shape":[512],"quantization":{"scale":0.016566915605582443,"min":-2.7501079905266854,"dtype":"uint8"},"name":"MobilenetV1/Conv2d_10_depthwise/BatchNorm/moving_mean"},{"dtype":"float32","shape":[512],"quantization":{"scale":0.012152872833551145,"min":3.913338286370366e-36,"dtype":"uint8"},"name":"MobilenetV1/Conv2d_10_depthwise/BatchNorm/moving_variance"},{"dtype":"float32","shape":[1,1,512,512],"quantization":{"scale":0.01354524388032801,"min":-1.7473364605623134,"dtype":"uint8"},"name":"MobilenetV1/Conv2d_10_pointwise/weights"},{"dtype":"float32","shape":[512],"quantization":{"scale":0.08566816367355047,"min":-9.937506986131854,"dtype":"uint8"},"name":"MobilenetV1/Conv2d_10_pointwise/convolution_bn_offset"},{"dtype":"float32","shape":[3,3,512,1],"quantization":{"scale":0.006012305558896532,"min":-0.7876120282154457,"dtype":"uint8"},"name":"MobilenetV1/Conv2d_11_depthwise/depthwise_weights"},{"dtype":"float32","shape":[512],"quantization":{"scale":0.01469323155926723,"min":0.29223933815956116,"dtype":"uint8"},"name":"MobilenetV1/Conv2d_11_depthwise/BatchNorm/gamma"},{"dtype":"float32","shape":[512],"quantization":{"scale":0.030889174517463234,"min":-3.2433633243336395,"dtype":"uint8"},"name":"MobilenetV1/Conv2d_11_depthwise/BatchNorm/beta"},{"dtype":"float32","shape":[512],"quantization":{"scale":0.014836942448335536,"min":-2.047498057870304,"dtype":"uint8"},"name":"MobilenetV1/Conv2d_11_depthwise/BatchNorm/moving_mean"},{"dtype":"float32","shape":[512],"quantization":{"scale":0.007234466105343445,"min":0.00013165915152058005,"dtype":"uint8"},"name":"MobilenetV1/Conv2d_11_depthwise/BatchNorm/moving_variance"},{"dtype":"float32","shape":[1,1,512,512],"quantization":{"scale":0.016261722527298274,"min":-1.4798167499841428,"dtype":"uint8"},"name":"MobilenetV1/Conv2d_11_pointwise/weights"},{"dtype":"float32","shape":[512],"quantization":{"scale":0.091437328563017,"min":-14.172785927267636,"dtype":"uint8"},"name":"MobilenetV1/Conv2d_11_pointwise/convolution_bn_offset"},{"dtype":"float32","shape":[3,3,512,1],"quantization":{"scale":0.004750356487199372,"min":-0.650798838746314,"dtype":"uint8"},"name":"MobilenetV1/Conv2d_12_depthwise/depthwise_weights"},{"dtype":"float32","shape":[512],"quantization":{"scale":0.008174965545242907,"min":0.3120670020580292,"dtype":"uint8"},"name":"MobilenetV1/Conv2d_12_depthwise/BatchNorm/gamma"},{"dtype":"float32","shape":[512],"quantization":{"scale":0.030133422215779623,"min":-2.41067377726237,"dtype":"uint8"},"name":"MobilenetV1/Conv2d_12_depthwise/BatchNorm/beta"},{"dtype":"float32","shape":[512],"quantization":{"scale":0.006088157261119169,"min":-0.7853722866843729,"dtype":"uint8"},"name":"MobilenetV1/Conv2d_12_depthwise/BatchNorm/moving_mean"},{"dtype":"float32","shape":[512],"quantization":{"scale":0.003668997334498985,"min":3.9124486300013356e-36,"dtype":"uint8"},"name":"MobilenetV1/Conv2d_12_depthwise/BatchNorm/moving_variance"},{"dtype":"float32","shape":[1,1,512,1024],"quantization":{"scale":0.010959514449624454,"min":-1.4028178495519301,"dtype":"uint8"},"name":"MobilenetV1/Conv2d_12_pointwise/weights"},{"dtype":"float32","shape":[1024],"quantization":{"scale":0.10896045834410424,"min":-14.818622334798176,"dtype":"uint8"},"name":"MobilenetV1/Conv2d_12_pointwise/convolution_bn_offset"},{"dtype":"float32","shape":[3,3,1024,1],"quantization":{"scale":0.004633033509347953,"min":-0.5652300881404502,"dtype":"uint8"},"name":"MobilenetV1/Conv2d_13_depthwise/depthwise_weights"},{"dtype":"float32","shape":[1024],"quantization":{"scale":0.022285057224479377,"min":0.23505790531635284,"dtype":"uint8"},"name":"MobilenetV1/Conv2d_13_depthwise/BatchNorm/gamma"},{"dtype":"float32","shape":[1024],"quantization":{"scale":0.0324854850769043,"min":-3.9957146644592285,"dtype":"uint8"},"name":"MobilenetV1/Conv2d_13_depthwise/BatchNorm/beta"},{"dtype":"float32","shape":[1024],"quantization":{"scale":0.014760061806323482,"min":-2.125448900110581,"dtype":"uint8"},"name":"MobilenetV1/Conv2d_13_depthwise/BatchNorm/moving_mean"},{"dtype":"float32","shape":[1024],"quantization":{"scale":0.0036057423142825855,"min":3.9067056828997994e-36,"dtype":"uint8"},"name":"MobilenetV1/Conv2d_13_depthwise/BatchNorm/moving_variance"},{"dtype":"float32","shape":[1,1,1024,1024],"quantization":{"scale":0.017311988157384536,"min":-2.094750567043529,"dtype":"uint8"},"name":"MobilenetV1/Conv2d_13_pointwise/weights"},{"dtype":"float32","shape":[1024],"quantization":{"scale":0.16447528764313343,"min":-25.658144872328815,"dtype":"uint8"},"name":"MobilenetV1/Conv2d_13_pointwise/convolution_bn_offset"},{"dtype":"float32","shape":[1,1,1024,256],"quantization":{"scale":0.0026493051472832175,"min":-0.36825341547236723,"dtype":"uint8"},"name":"Prediction/Conv2d_0_pointwise/weights"},{"dtype":"float32","shape":[256],"quantization":{"scale":0.012474596734140433,"min":-2.3078003958159803,"dtype":"uint8"},"name":"Prediction/Conv2d_0_pointwise/convolution_bn_offset"},{"dtype":"float32","shape":[3,3,256,512],"quantization":{"scale":0.014533351449405445,"min":-1.8166689311756807,"dtype":"uint8"},"name":"Prediction/Conv2d_1_pointwise/weights"},{"dtype":"float32","shape":[512],"quantization":{"scale":0.024268776762719248,"min":-2.4754152297973633,"dtype":"uint8"},"name":"Prediction/Conv2d_1_pointwise/convolution_bn_offset"},{"dtype":"float32","shape":[1,1,512,128],"quantization":{"scale":0.002208403746287028,"min":-0.28709248701731366,"dtype":"uint8"},"name":"Prediction/Conv2d_2_pointwise/weights"},{"dtype":"float32","shape":[128],"quantization":{"scale":0.012451349052728392,"min":-1.5937726787492341,"dtype":"uint8"},"name":"Prediction/Conv2d_2_pointwise/convolution_bn_offset"},{"dtype":"float32","shape":[3,3,128,256],"quantization":{"scale":0.026334229637594783,"min":-2.8967652601354263,"dtype":"uint8"},"name":"Prediction/Conv2d_3_pointwise/weights"},{"dtype":"float32","shape":[256],"quantization":{"scale":0.02509917792151956,"min":-1.4055539636050953,"dtype":"uint8"},"name":"Prediction/Conv2d_3_pointwise/convolution_bn_offset"},{"dtype":"float32","shape":[1,1,256,128],"quantization":{"scale":0.004565340046789132,"min":-0.3971845840706545,"dtype":"uint8"},"name":"Prediction/Conv2d_4_pointwise/weights"},{"dtype":"float32","shape":[128],"quantization":{"scale":0.017302456556581983,"min":-2.5953684834872974,"dtype":"uint8"},"name":"Prediction/Conv2d_4_pointwise/convolution_bn_offset"},{"dtype":"float32","shape":[3,3,128,256],"quantization":{"scale":0.025347338470758176,"min":-3.8527954475552426,"dtype":"uint8"},"name":"Prediction/Conv2d_5_pointwise/weights"},{"dtype":"float32","shape":[256],"quantization":{"scale":0.033134659598855414,"min":-2.9158500446992766,"dtype":"uint8"},"name":"Prediction/Conv2d_5_pointwise/convolution_bn_offset"},{"dtype":"float32","shape":[1,1,256,64],"quantization":{"scale":0.002493104397081861,"min":-0.2817207968702503,"dtype":"uint8"},"name":"Prediction/Conv2d_6_pointwise/weights"},{"dtype":"float32","shape":[64],"quantization":{"scale":0.011383360974928912,"min":-1.2749364291920382,"dtype":"uint8"},"name":"Prediction/Conv2d_6_pointwise/convolution_bn_offset"},{"dtype":"float32","shape":[3,3,64,128],"quantization":{"scale":0.020821522731407017,"min":-2.7484410005457263,"dtype":"uint8"},"name":"Prediction/Conv2d_7_pointwise/weights"},{"dtype":"float32","shape":[128],"quantization":{"scale":0.052144218893612135,"min":-3.5979511036592373,"dtype":"uint8"},"name":"Prediction/Conv2d_7_pointwise/convolution_bn_offset"},{"dtype":"int32","shape":[],"quantization":{"scale":1,"min":6,"dtype":"uint8"},"name":"Prediction/BoxPredictor_5/stack_1/1"},{"dtype":"int32","shape":[],"quantization":{"scale":1,"min":1,"dtype":"uint8"},"name":"concat_1/axis"},{"dtype":"int32","shape":[1],"quantization":{"scale":1,"min":0,"dtype":"uint8"},"name":"Prediction/BoxPredictor_0/strided_slice/stack"},{"dtype":"int32","shape":[1],"quantization":{"scale":1,"min":1,"dtype":"uint8"},"name":"Prediction/BoxPredictor_0/strided_slice/stack_1"},{"dtype":"int32","shape":[],"quantization":{"scale":1,"min":5118,"dtype":"uint8"},"name":"Postprocessor/stack/1"},{"dtype":"int32","shape":[],"quantization":{"scale":1,"min":4,"dtype":"uint8"},"name":"Prediction/BoxPredictor_0/stack/3"},{"dtype":"float32","shape":[1, 5118, 4],"name":"Output/extra_dim"}]}] \ No newline at end of file diff --git a/weights/face_landmark_68_model-shard1 b/weights/face_landmark_68_model-shard1 new file mode 100644 index 00000000..d67bfcf2 Binary files /dev/null and b/weights/face_landmark_68_model-shard1 differ diff --git a/weights/face_landmark_68_model-shard2 b/weights/face_landmark_68_model-shard2 new file mode 100644 index 00000000..3b2d76ca --- /dev/null +++ b/weights/face_landmark_68_model-shard2 @@ -0,0 +1 @@ +ʮ̯̯Ưίvïxƭįɯ̭ȭƮįԜ֮íڰӯͭحϻĭŭϭɭǮ̥Įî̯¯ɭ¯Ǩĺѭήƭ˭ʭ|ǫƮM}®UǯֵˮƮïǯؑѭ­ȭx®Ư•Pîծ¬ĭíŮįgįˮ®Įѭ|άm᭯ȭŭƬɭîţ¯ïŰǮįƬîݮ̮Įɚ׮ԯĮǭүŭɯȮƮĭ{ʮĪĭäƬ׬íŤ׮ήŬʧǮï˔ĢsƯŬzï®ׯԭ¯ͭȯѮsͰзmb~pI}Яtƭǭݭ˼j®ǯʭجyʯĭ֯œɯîp˯į—Ԯíʬ毯ƣюĭŮѭĭӦæƟ­±ίȮϯǟˬ̞įį|pr­ƭ~ʮoү}ˡwīȯ}ű|®{£Ǯǭ̣ܬʰѰ̭ĭíίȫĮȯƮǯcƮ|x®xk|ʯʮ~ĭôƭѭlüĭǸѯwέ~®ƯήˮĮsɭӯưĭȼȮǮѭ״cŮ޲ˮ¬į㮮έʭ¡Ŧ̯Ѯí׬ЭҮï~ʮˬ~Į®®ï¯yίo«Ϧ­ȰٮЯ[ѮȌǐdzí̴íx̮ͯΥ}y^ȭڭĭê­ġĭĥDzˬįï{íҭŰ}ɮدŮ~ŭǭЮԮŭƮ˭ɮѭҭz˭äĮŭ˭îЭ̬ϯįѾï­ȭîϮʮǬͭ§̮įٯŮ°Ʈ뮭ůίưӭʭĭwǮʇ⭭ͯŬ{Į˝Įíέ­ĔxÉŬůͭĬǽʕįŭŬw­ڏѮȭĩî®ͬȭƯĬɯ®ŮĭîŮɪǭĮɭɯۯĮŧïͮ}î̮­ϯî֮|ɭɭگЭԮͮåŮ~xͧͭŭɬä¯ƮwâwwﮯίNjìݯŭƮȮ¯ĭxů~ЮĕŭȯĬ¯Ţ­ĮЭ٭Öѩϭخέͭó~ƯĮíŸȬ֭ϯĭʮ魯įɭ֯ɪŮĪîsfɛ®Ǯɮzî¬îū嬭ЮĨޭŮԮҭíƮ­ͨάȟ쭯ѯîȭįƭĭޯΞǪîÿ­íʭʳí­­íȻ̡Ѯֳɭ߮~®ˮӯí̭˭үĭ¯ǬŭzįŮ~r°xdӬ̬}Ưήwy­¬ͮŭtíyí~ʭЯíŮr¯î¬ƭ̮v®®ƮΰĭŭɪŮ®ɧ¯ǬͯĭغϮ®Ƭȭůï®ԯƮóîƯrЮîҭ®̽ɬo̮ͯíïȯʛЭ̯ƭխƭˮnǯÐzȭťz䮭խìî̯vĮѮʯ®ɯ߯­ź׬{ïįŲñӮîŷn¯zŭǭȖծʮ̮^ɮŭ|ɭ{ĬɯǬĮŭɮƫɮ|zűѮɯǭȮɴĢǬnáíͬïȴʭu~[⯬ê}„ۯʭ˭ʮǯĮx|ϮήƭÍç̯íƬ¬ǮĮˮŵЮӮíĪƭƮŽ̮ͭȬïŽijӯlͭҮÌ̮vΏǬȭѭѯխήح®ɭˮׯ¯®­ƭɭʭȮN~Ь®ͮխƥʯǯίƭuĩl}ƭȬ¯x}Ѯ˯ݮŮҬ¯̭ίگî٭جȟθ­ծз~NõʭίɪŮsʭí{Ү鷫ˡƍynïĮïyŭˮǭ~ί|îưͤŭrkpp®ƮȮحĴƮʟƯư~v^uĦӬyznǮ­yģ{`rƯ{ĭ|xu¯ȝsʭŬǭ¡Į­լtŪӬ{mƮӭʬخլxĮ⮫q}íŵ߬ëᮬެ}ֺϮҭͭx`ŭ~ĮȡƯzU­B{cϮˮBӮïi˕^ȯïʯƯíïíʭϮܫí̮ͭмĮíïʭĭï̭įۯȭү˯¯ǭʭЮǮ׮¯ƭɹïŭ¬~ҮĦǭwƭtvƭϬί̯îȭ­᭮ڪ¬篯«w~ɯƯXssĭį­wĭz^ǭϢ­̬oĭȮͭ¨Ųȭخ­ʭĵԬïǭ¨׮ïȭÞѯ˯îկ{íwͭ¯›ΟŭĭįɤȮ˭ׯ¯ͭįŧЭɭbpƬȭȭwʭ±ȬȮ¢ͯɢŬȭЯ}ͯ޸ǭ˭qN|¬v|mŮ¯ƭswɮfy|ʭz魭ūЮݳѯlȭůٯîîدԭϨ̮ͭݯǭȬî㯮έĮĬĮîǭϭԬùհƮѭ|ɮ®¯įĬĮîƭȯگǮȧĭԮȭɭ{|ȩl}dídsűƯòxíͬwȭ|ǭͭmʭΙĭıŢeǯ®~ۯ׮ʯĮխ¢Ȯ¯ŭŖӯԯ˭ƭѫޱɮίҮүȮɮɭҶ꭮ʬĮzɦŬ㮯ϭʯίĮpʯɭíķ ͜zíwƭws˭ŵƫɬɮVíϮǮ­Ūīǭ­s¥ȯʬzЪʮ{ͮzʭusr|nhĮǬǮ̮祭įȯĬ­ҭƯï~ѠĭŬħȮɭЭڮcɭĭح[ˉįŭѮ¯ʮƺͮȯbǯݭίښ鯬¥ƮҬȭđíĭ¯Ư·Ů®ԯӮ`ˡŧʳuïƯҮ̭ǢͮͯǷŮyԬrƮrìXstt`ï{Į}qȵ­Ůĭүĭȯȯ٭Ư֯îʭʯ»ȩ˚ůʩ°ʮѭƬ͵گūʨ¯ȮҮŭ׮ªĠî~Ĭ|¬wtðģЬtɬʤɭƜſȬì{wֺ̮ϯí}gƮʩɰŮƬϚί­ƮƯȮțޮɬܯì֝íʈŮ̮ũɮfílůʽŭz|îmŮϯn׮ʮîî¶wíǮ¯Ǭ®įƯƯŭˮŮqׯ~ŮħȮɮï̭ƭ̮í¬ίñ®}įƭɯٮtڤůƯӮwîӭǬۭ{ήﯯĭŭƭʬέɬ­íϮíũ|®ȴƯĭέȣxȭʮʭ_®í¬έ¯Ф~Э|­®zίʬ¯~ȯƮǮȔʭʹȭìdǯ­}®~ϯ˭Ȯ՚Ơ̮ٱǭŮƯːĮ训ͭů˫Эƨֵ̯ѭǭ׭ƯƬүĭtħtůßî˭ƧîʭĮîȮîů쮮¯wʨԮoĮ«}ܯڭįwӗîʭГĭ{ï÷îӯs~zv­mpƯį|ĭĭʭ~ĮڭŮɨéȮĮî®ˮvĭƯɯѲɩƮ®έǮÜ­íȮū׭z˭ĮŮծƩ|ŮIJ_ĮʮǦŮ~ìyӮiŮůɮ­ĭŭqïǪʮڭƭȭ˯îͭǭį¯Ǯʬʯ­ͭ}ٮůǮsɮˮqԫøŭʧȮȬƮĮŬíǭįu¬íljȮƴ~}ɔ խî¯ØխɬĮŮ­үw䮭ͲʯȭЬ®ѯĪƬѮƙέvƬůŭĠׯǎðɯ®ϟίwȮ}Ǭ’xɮͬěĝðĭƭíŭǮǭԮįįڭ̮ʭήĭԹĮƮƜ{ƜQƮĭŮɗʭέî¬ʨɯɭĭıԴ˱éխ®Ɠ~tǭ㯫íЮu¬î±ӬƮȯʭׯί¯ĭĮή̮ŭ̮Ѯí|ͬůʮƭṷ̆ʷ{ŧ¯ĭȯ­®ʭƭůŭʮĮƭĶĮȭǮɭͭĮҮ®ϲǭլƭƮϮȯɭȭyîŭḽήïůծʬçɯǯѶ֯ɬ̯䮯ׯ˯Ů֮ϮկĮ٭Ƭѭܓ̵î`^ʮ{îíuǮíjBĭϮǮɯ̯׭Ǘ}ðˮpʲհϭEŮ䭫ǮǭĮ®˰ܲߩѮƯƯǮíį~ɮǭۛʭ̬¬~έ˯zƮ˭ˣíإŮHíýy̮dϬĮۮᯯڮҫáƮŭ̯¯{Ʈȭɯŭ׭ìɯĭ­Ǯաs|ҟЬѯˮmy®ͬkŭׯ̭Ʈʯ~ŮZhȬȭ}v}urիjȮǪŭή˭ưίӮ®ʮw᭛ƮqzǮǯg˭ǭîsp|s~p{̭ǹǮĤŬȮ֭ůįìĕОǯȬǯȤʭ|Ư̬µήvʮìTƭ®Юxœ¬ϯ~w®Ƭĭ®ÎخͯõίƯͭɭ¯îíƭ|ȷgƭĻǯʮˮƭƮ}ͬ¬¯߭ŭĭŷϬ˯®Ц˯īĮɮ¯ԯïĭ­±˫xĭӱxɯɭzϯƭͭ­ŭȭ¯ĮϢįjȯƭëzŭyìŭ}Ʊƭ±x¬íxöɯђíØͮ}ׯyǮĭũiïǯȭխ­¬­̮ɭo˭Ư¯άŬ­ˮʫȭϭծƭŭƩͮîǮϴ˯iϮЮxʓ{Ţǭ™­œȮԭǬ Į®ïpѨįȭȭɯԭǯֵɮuʭɭɟFʰíܫ×ɭîitįwɯr¯ϭŭd®ΨdůîŭȮů­²ԭ̮ͮ箧ġƭͯǮůįήȯ}Ů¯ůɬï®ƮůɯǮţíŮĝ­ɮîɭĭ}~w‘Įï¯̭Įŭլ­îƮϮݯư֭ĮȮþƬíҬķȭù̯ͮέĭůͭˮíխ֭ʬɭͮƯûϮ佯֭ϭǮബȮůŭşʪٯíˬůŬάĪƯ̹ȯƯȭǯɩȭͮ¬~{{zwĬdƯ֗­´tɫ|׭ҭ̮ѭíĮǭŮخ̭ĭЯ߭ίƮȮ¯İ٠ȬȬޮڮŭȩǮǭدîѯǯƯ̭m߮ɯqãŬ®ͬšͮծ˯ǪŮĮͭ¯Ʈů±îůĮϮĮɚtɯŭ~ǮþůwĮ˙ĭtįkȬï­ɭî˭îͭzȯŨîUЬ~]ɮz˯xɭ®ױǬįįuƬá{~ʮ}į­{ìïƬĮMOĮíԮ|Ȭ{Ʊˮŭîǭǣīǭȭѯj¹ǭٮkҶί˭îĨٮú­ɫЭfz®gٮʮɮЯȮ˭wx˭򭮮®ˬ­Эl­ҭϯ¬έíîĨgïbŮɯֈyŪ­Ʈ¬į˭֮yƯíǮįn|yö{ԡҮǬ¯ѬŮӭìߦ®Ǯ֮Ĩ¯ݯ̭ʯfUɭíƬĭ˾˓}oϮĭխ᭟íЭ̯íǯƭޯ®ůzƭ̯nŭøîϭϮ³Ĭ˪~vîӭîy­ï|ƭбƝůîǮưˮݩ̯Ǯխ¯íТȭy|dƯïyîoWyĭä¯åͯdî殭Ůͬ­ӯĬȯޮ­Э˯íˮ}ӮЮ}ů̮ϭ˯٬¯ìİܯƺׯǯ̱}˧˞ˮǖ­үïǮ°ɬѯͽ֮įЭ®ͭìǭ|îɭ¯ƭ®ů؞©ȮʩĜȯŮϭѮŭڮʭƮ®ѭЭȮӮâ¯ˣ䯯ׯĭʮ˪Ʈ¯ѯǯخę֯쳯í˞ѯѭ̭Ů­Įŗ¯ʭͮѭĭɮűͮɭȮƮį¯ĮïðϮƮ™ǮҠͫʭóì¹ϮͰà˭ȤخϮԭ{ݭðîz­nϗȭǐɮȬɛǮyĭí̭ĮƲūԯجèÞĪͮձԯƭҭέ¤îҪĮʭzx֭ïzݮέŮӭ{ʪدîĮ­íǯʟů­ĭcͰī­ž}­\sؑΔĮpέɭğŮ®ííӯ׮˭ɬĮĮƸŰȮô௯̟­ìծĮųϯɭïڬϮ͡ɮɮƭǮŮóṶ̊ǯɯƝ¯ȭϮحîįƱήïήñ˭xʭƯ¯k¯­z̮ïǮɭǯ̭̮ЮЯëǬzhĮ|ǭ|ǭ¯˭֢ήV}Ү˭}ӱŷΎɫʯӯЭƨ̮͒ϯt}}ưϯŞƯ®ƳíɷӮ˭®ǝέŮ|ŸǮ¯}îʎìĭ˯˯ͬ¯ĭů֬ªɯȘq}Ư}^Tz}ĸkxftïGǯƭŭ̯ĮȮ̮­î­įúǫɠȭ˭ЭήݬzíҬϭŬǯƭĦ}Ⱦʬïįî_Ѯy|ծ®ĮǰǮnı½ʮŭ­njŭIҮ}vxxr}ryƯίˢ̭ŮҮԮŮĮήưǭ®zìolm{vƬƶȨƮŮ~|ŭȮuɰگƭ¬ϮŽbάï˯íʯѯǭŮҮ¯®ƭˮ­î˯nɭyУέҮïŮiʭçǭĮůî|â̮í®îί˭̮ɯɯ­œq«ŭújƮ|zr|wzî|ͫîɮͶĬ­uwƨ­ï®xĭInnï}ȯĮdŮ୯ϮѭϭƮϮĮɭɧůwԯ˭îɡ{Ԯŭͮк¯®Ьůîȭz{կŢ}ixwĭ¯\ípǚ­ɋ}í{¯`Ư֕ЮӯȪͬɭ¯¯׮ĭ̱wՠîƮĬůɮŭz˭Ʈȭ­µ®¯ǯíįìí̬įůѮ ֬¯|ȯƦĮ̼կïzɮȮʬĮĮʪŮƮůѯͯ­ޭë~ʬz̮ŮŬw֭ĭέȯuɔõƯî}Ϫ®̮˭ƯȭϯîíٮůzʮȭîůΦ֭î֮Ƕʵƭ³խǟ֮ˮ̯ǬۭϯĮʭέïЯȮձǮڮ~ԭƭĮǪЕ뮷ɯʭǯҲɳȮɱŭ̮ӒͭɱïԭǯȗέŮŦŗĭžîή~Ǭsę­uŠȯԗ®ëȯ®{Ǯʯ}ƬιïԬƮ԰¥ªįîŮȭ̯~¡˭qɭŮЭͯ˯Ů­«~ĬŮ|ʭä¯Ůǯˬ®îȳîíܰ˯ṷҮ®Ŗ֬®Ĭ¤˰Ǭѭu̮ŭʭȯxĭ~wô׭ūĮɯخǩílᚬϬĮϭįʹƑɬɮ~ׯ̮­ҭƭȭŭ¯ǭɎ֭ĭ̫­歭έīã߯סƮoXyV~ͭqϬDŮĭ­̰Ǭƶ|Ȯ~ȯˮϭ˭ŮƯɘɯ|qŮn|ï®î˯ȭѭխ|ƮťĽîc¡ȯ®Įůɾ㯯}ȵɯtƬȭ⭮Ʀlu|ņ˜Ȭxtí®iˮ̬Ȩ߯٭­ïӯ®ȭɯŶЮ˪毯Ĭɯǯ̭ƭíŵȮǯ˰ǭήŹϨ殭ƴڭ|ɭ㯮ʯůɭǰŘ˭ɯĮϮɫŧrx®y}̬Ƭήĸ̮ɭЯƭ˯ɮ̭ywǭհŭƯټѯĥӬѮͤůۮݬڭǭqŨzƬ_uŮß⮭ǮѮɼ°Ԯȭɜ̯Ǭծͮɮðƭ®ŭïɭ­ƯŸʰ¦ǩŭǭǮ̯ƮŭƯӯȮǯˮҮ̮­Ʈʭ®筮ϮĶĽέǭүwïa̯í¢˯¯ŮϮѭҮ̜z~Ǫźˮ˭խ~ϭίêĭîĮƮŵƭïүͯàíí|ɨŮ{q}o}ğʹ©ʯíǫƭäˡ­ҮƯԭɭ稭Ϯˮ殯įz¯̪¡¯ʪîЬǭƯҭ°îŮͬˮůǞʮǯ³ǮͮǬѮjīǶĭǯíuŬǔĭʭ֫xíȠĥƮɮȬӭȮŮȭŴ®áɮ¬̭ͯ۬Ʈ˯Į٭ïʯɰͯ­}íkîmtnĿǭɮ˭oíʮĭ{ͮ{žƬîŷǬĮƯǯ®ʯͭĭЯ̭®îǯӭ֭îDz̬ïɯᡮűîůЬѭȯy¯ЯͯƬϭ˯ĮЯìîƯƯopkxxxu{píįůíǟծǭæ¯̯í­ʢkoĭp{|ٮ̮~r|Ǚiȭwĭ¬ƬĮЭíʮ¦ĭïİcƯȬƮͫǮ|ĥӮЯvЫǬxZȮŴ|v̮έίŮï­˯ĮЭ¬nƣŭ®ïŭįòޝĮŭ­¯ɲͭŮȮî¬Ưîð߬ʭ{Үîî[vjpf;>rѯ̭lůϰˬîέ˯ǯˮƣοì̮˭̭˯­ĭǮîѮïذƯríԬťƭty㯦Ҡװɮ{};yƯy«¥sytȮpc¯˯^x”ǭկoĮ¯i{ͰpɨƮȮůkïĮǯ®ĭĭʬ˫Ư˰ŭĮϯǯȮ˯ѭɬÝɬ¯®ʯʯîĵîƭíîx{ìƜϮz®v¥¯qw¯ŮʮpƮsĭ֬ȯ}îů䯮ЯȮîӮέĮŭƮ¯¬ǭЮǭĭʮƭ˨ĭۭĮǬŬƯǮqïҢ©˭îƭɮ­ܯ孭ǭͭήĮĭ®ݝǮЬ¯ĮۮӮv}ȮȮì­­Į|zNvĄԬѨЬyǮիӭɮɭʯǫ«wϭîŭȬdǭƮϣʯzҮŮή̯λĮŭïoЮ~|]Ʈ­yĭ­}yǮut¯zԭį|ǮrxhЯƮïǭЯ{ږgNJǮ~lq{|ίǗ¯خreí~yŭĮ|ͭͮĿ°ίŭͯɭŸƬ~Į̯t}ĭůǩˮĮĹĩįɭĮʯɮƭɯ֯ǯЮ̬{Įy{nʭʯϭ̬ĭĮ¯ɬ¬˯˯̯֮ͬ՜ˮůw٦ĭʪ̲ʮʭȡ|«ʭͮȮǮĨŮưĭȭ~Ϯ֬|ȫͭحǮϭ议ԥįƶٻ}|«¬ïԮíǥŮƮޮ˯ùڮƢ̱аŭîŮɯƮڮŭy­xãqííԫͭΠʊĮƭɮɮĮͰרϯîЭͬįįɭزɱǮǪȭíìȭƭʬsįȐƮíΜǮîí~dѯūqq]̯ȯ®ŭƮ{ί®ůXƯ}zxҬɯîͮĬϪǮį®ĮƤͭmįί}ì̮¯ƭƯ¯̬ŭ¯mìȮƭӬȭú˯uĭéƮ®¯zήͯŮàέ˯įΰ­կկêԮɯМȖĭyŭƮĭĸҰժڮׯϭͮ׭ɮʰҮŧҮĮˬ­­̫˭íįˮɭѪĮ֭Ȭ¬ƭɮíŭϩлܯίĹCíǨúʮ˶ܭḽɮìӭïŭĮ|¯l~Ǭm­ƯîvʯϯöwczƬԮĤ­sjqwŮĮɰyѣŤŬǨĤįĮͿˮèĮįʮέدȮɮ­ǭڮůȮʮ}Ǯέ¯ӬǺĞî®ƭïǭîîү¯ŭșͮƭЭí̯̽îĭȭŮȯѭóĭ˭vȰӮ¯®ŬĭïȭĭîȭŧĮͧĭǯŮ­ЮȮʯūǯįǮvsЬĮ˙Ʈ¬ƻƮƯïŰlīĭzԮ~Ȯϫ}ȯʭ®Ϭˮϯįƭɜ˭ɲ Ѷ®ŭîȭŭƭŦĭŮĝˮծƮǯ¯îĮȮ֭swí~®د̯Ѯǫ|ǮīɭϮͭƭů­˺íèŮs¯ðɭǟǮɈîɶȯȍ~įɪʮ|̨Ǯ̺̯®ѰҶĺ­îɭέӯ˭˭Ƽء}ǯʭ˭ǯ¯ɭ­Į{ì̮̯ƭ¿ͭôíȮƮî¯ƭĭ­Ͱǯí˯îķȮªլ󯮯ȭɻ®Ůծ֮θ­¯Ǯ¯íĮïïɭȭȬȬˮǮ˭Ѡ®ǮïųĭȯqůѠү¬tmuxǢnĮǚï­ů}ϯ¯ïɮŮîɭĭ׭îįϳʭׯ}Ͱƭ±ĬŭǮʡíî̮άêɮîǯ˯ñӮƑϬůĬ~Ƭìƭ®ȬŭԬĭìů¤ĬέԓȮïǭӛǯ֮į{կթyƭ˭ͮ~ŭř¯ǯ̟ȯȮà¯îѯŮȯrǮĮŭǰɭЮ̰֭}˯­~Üݴ­ڭɮĮŪЯŮʮĭǭ­ϬԮŮƭíϻz¯ŬʮɯˮČɰؕĬǭ}Įñ­ƮįӮïį¯î®ǯѭíԮϬŭɮɭƯįϮʭȯЯ_s~Ů~vxe§®tŮý­¢g[pgJqq{Vȯȭ}Ю˯ǮdƮŬywŮ¯~ٮحүǩ⬮îϮĮïꮭϭͮǮĮέ팭魮ĮdupZsîxïЩc~Į~iԮɮǭʮMnv~ݮ­­̮¯Ǯ¬ş®¯~z{ǬƮլ}uƬïˬýͮïvǯȮ­Ȯ~­ŭǭŬͭŭîǭѬƭ̮|ǬpȭǭͼįŮí{ƯƭŬįnưȭ}ƮPrzstʭǭʭ§ƯũǭͯʭǮíøǭ­خƠۮ®®ʯƯǯ¯ůzĭī̯ޮưįׯŮǮؚ̦ή­Ůϯɭŭحưǯ̯åխɭn̮wǯŮԮǯzniXoǯέ̯Ȯî°`ѭԮȯ˶ɮĚևɭȬïzΠ~̯ƮìĮǯ̻}ˮĭíѬ̭˯ϭŬǮĭůͮ²|֭ʮįǮϫvծϮخ԰~àӯ«zxÛq­íezkvĬ~ͬŭ`ƭǯȯίˮԯɭɮĬǮĮíx˽ĭǎͭͭɮŊƭiyzʯsX]ƽ̭íŭƭӭŮǭ}¯ǯȮyϯǮ̰ծsٯͯūРɮͭůǯį¬̭îƭìĹϮͯǭȮʭͭƗȮȭŭӭluív}zitw֭®p̭ήÆvyį~´έ̭ͬūʕíȭa̯­įѭ™ŮɭͯǮ̴ŭ寯ìѯȯǵɯy̮ŭìӮȷŭͮˮĭϭĪƮʯuǯήïn̮ʭxȬǯĮ¬̮ήĭϯǭĭ̭Ǯˬϻqʭɮݯί歮ìЮˢЭǮѯ̮ƞìxүĮ_whg_LŪʬٮĮɯ̮̯îɭҮׯ߭ЭҬ̯׮ǯíí˭ĭķp~Я´ͱĴrŮɯnnͮ­ŭű¯ȭѮɭzɮѥǯ²Ȯ¬Ůɯǯ׭ͪƮԬŭƮ㯯үĭíϬƮίʬíŬίǯ˭yɢɭí­ثٰj­¬®pеݫŮȯx}}ĭ}ϿĮįWjǮŭ̮˯̬ȬҭʮʭůæۭȯҮíϮȭɮ¬̮Ƭ됯ԯέή˫ͮnĬӢͮĬs®Į~®̭ĭߚɭwʯɮkʮİ}ǯ}Qѯjͮ}pķϬ­ůӮĮ˚ͭŭxĭáѯխʱǮƯƯĮ¯ůĭͭʯǮŭ­íˮ¯xxͭ˭խ՞­®ȮŮɪĬ̮̭ͫѫ㯯ʬͮǯݮ~ǮȮ­į®ͭŭίҭ®έï­}ǭ­ĮƬ~Ʈ~Ȋĭǯî|̯}ǭۯįƮŭͬ|ïøֱŭƨ­ǦǮ®ƭ˭Ӯάåɮͭ¯ȯí̮ŮȮ®ҬƯįŮŭvŰ®wuy}zïdέvͯyv±ƭ՘ïʫЭįîЮ¯򯮯ͮzîȰzíȮ­ɪ̭}ǖҮܭ̯íϏȏǭƮɭ̮٭ǩǸǬɭݮîǮٯį˯ɧvįŤܰuͮƮŝ˪įyˮկ¬ƮҭۭΤӮůʪˮ᭮ȭɬ议ǭί°ƬĭʯѭˮȭϣǬϮïůʯw¬òǯͷծɯ˯˯ȭǭȯ̭t­ˤɭįïƯɯȭwϭȬ¯îɭl|ƫw˭ԭέŭĭȭ}˭Ϭëɮsȯ?sҮƮƭůɭʫ୮ij³íȭijgϯڮخʭ²Įί¬ȭŪîƭ¢ȯïӭӮŮȮs ŵxǮȮͯȯȮɸ¬¨˯ǬŭȮó£ƨ̥ů˯®Żɭϭ°̯˭̮ȭį̭ͬɯǭĮęͯĭ̴ȭ~ůخȶʯ௮ɮƯήȯǭ̭íɯǰʭ¯Ưƭۮ֭xȭíȭŰǬήtŮîݮȭƭĭɭ̭ͭӬ¯®­ʯ®ʯhpMǮԣ}ïɮɮϭЯƨŰӰcÜŰǯƭѮخ®έ|®Ǭ­ѯfůȮүĮx{¢ɰǯĭӬȮî®­®կǮƬ®ůʯʮŬүµ®ŮȮѪğ̮ĭ¬íŭȮӯˬ̭xcƮ^zoïwrʮlt®ɯŮɪ̯°ݭɯɯeȭ̮ȰĬʯx~í̮ȫƭ®ίȮƦŷ{uҭ̭¬vĮϮ̮sĬĮyʯԯȯȭɢǯ٭ëżϭɮŭծhi}~tĭ˯u[Ŕzͧz̬wŮgҮȯxŬ̯­ά͜ɭÃȭuytĹ{Ƭͯ¯ŮīȭѮס¬ȮӭȬίͭϭɮìŭƬzѮīѭɭ­}­xǰĮɬ٭rqïǬŭįǭͯŬ­̪Ԯƭ̙ЭͯƭzíʭϭÐįïìoȯį®Ȭ~஬ЭɬͮˬïƯvĪi}x¯ůȰư٭­įʩ׮̭ȭ֧ȭЮ˯̘ǜĮְʭİĮ֬ïͭ歭ݮĮ{ɯ¯ԯĬٯ˭ǭƯ|ĭ¡wŮ͙y~ʨЮ̴Ȯ}ĮiЮ­{ĩŸͮŭ­ǭӬͧЯɮïŮϮĮqůͪ¯ļѯǮͭŭ⮮ĭUůҮƮïǯĭģ­îʢХ¬į®حp||írmɯrʭx¯ɭqίkɭrwnmή̯aƭŝЮʮЮծxįѯ~ʯíϭȯŬrɭìɬî®άŰ͢ɭͮʯɠƭṷ̊˯խsì~qϭ˭ѯn|eҭfí˯ŮvΤȯŬg}uƮǭǥmЭ߮ɮܭ_ڮ˧˭­ǯݭȮzĬ{y櫏˭ЮǭȮȭ®ϬΰίŬů}í³xұŬ设ĭʦūíï~íәɑţww̮®ưӮƯĬy̮x̯˭Ʈíy~­­­_~үĭįٗ{}vXԱyx׮r{usȭ­ˮѮܮխЭĮƭ¯ƮήºȮɯȒíȭŭ®áʪή~˭}ĭl{֮~v­°ǯ̮˭}ƭĭѭ®ðĮíƭƯ|ĮƯԮӯʯìŭЬޯĭ¯ǯȰحڭ̭zܬ­˰ڮꮮέˡpҮˮͯέΰǬïծ˱Į׭ٯŬܯˮ}~~{¯g˧e?Ö̯ƭÑȫƭ÷ĭǮƯmլʭۯ֭ȰƭĮ̭Ʈɯ̠ewssǮŭҭʭ®­аh~̮®||ĦŮ˰̮ᯭļƮĮĭ®†ɭƬï̬ϰ®ǮɭdzǮҔìȬ¬ĬíƭĮݬȮȸ­rƭƭǯį͋îϮí´c>ŭӬíկîήϭҰůůĪ­®ÜϮӭ®ɮ®Ʈϧ®Үèż׭DzɯƵĭحɮvǮïέ¯Ů|ۮîƭ}ͭЩϯ­Ĭqˋ̬ةӮįm¨ίįĬͭůܮêůø୮ͰůǮڱ­Ǯī̬ʬĭ¯ñƮjѧƮǵ¯tɯƯ~æƮȯśȭ߯˯|~ˬlήĮ̯ǯíάʮʯ߯ãܭЭůîɯȸǭ{ȎȬ^v}z{ïӮ˖ʯߞîʨ¯mƮɮƮ|­ܯ~y˭Į}ޯԮƭڭyïǭҮͮʭǮɯЯîƮүәεǯyįs{wĔįʯ¯ǯ®ɭɩǨzv¯ŪȭƭĨǨʼĵ­~|Įȭyw˯ïǭXԮȴӮǭŮoƯîĺǭĭíʮ᭬̪ͬˮí֮߮ïʯͯ­Ůȧ­ȴƮȣȾ~˭ŮήíĬɯïíӬîªʯŮ{ȭͭîƯˬϮĬ̢ȭó§¯̩ŋ¯̩~sįƬvӯîx}ȭġέĭ̪Ůŭ׭ϯˮǯŬŮîҭܰǬȥíĬȬŭ­­Ѯ୪îŮխ®u~ɮͭʮŭʯǭǭĮ̭ťí­®Ĭ˭ĭѭíĮ̯ɭ˩ưɮíϮҭʠ®~Ǘëxvůԭˮ[̭̭ůp~h{ɫծѮެ¯{׶ծЭ˯髭s˯ѯϪʭį˭ŮsqǮtvϯڭƮٯ­Kʵͭݭ1íƮ®ʯͮ˭ǰЬƵƮ·կŮ{ȭ٣ïsǭʬǫĬĮǬЬîªĮɮʭԭxyêɮxzŮկͭ΢ϮŮ֯ɮȭʯƯǮүʭЮ­íήѯ׬ĭɭîͶͯŬî˭íïĬخƮȭǭŬɮ®ǭˬˮŮ̯Яʭȭ˭|´kʯ¯ĪʭƢ®q­mq{yȬƯ¯˯|ƺŦPzo}lx{ٮάͭʭȯĮ¯ȬǯȮïǭƧέ|gydƨȧŭȮîëŭ«ǯֻĪ꟰ȯȯήįҭĮîծŭ®øϬ̯ѭ{Į̯ȯ{ٴʮí«}pʯͯɯҮΣˮoŮyƭ~}Ŭɭ²ï˭ǬˬϬîŮͦӬĭ˯Ȯ®}dҭׯհŭɭѭĭŬɬƭcŰЮĬɮǭѯ˭˕®ҮרϛЈ׮٫ݮޭw̮ҭƮ̮ȮìŮǰƮƮ|ƭʬˬ˦Ȯ̪ŭɮٯĭǯŭuŮ®xíìíѮЭӬϭխͯڭ԰įųïáحͮϮŮ®ѻǬ׮Ӫ˷­ʯz­y¬g˪­ŭӯí׭ɯjů֭ͭԮů˯ήŮȭгɮϮ̭¯Ʈyʮxk®wƮĭǬɬɭìĭƚ̮ͮͭɦǮqήҬٮȭȰȯv̭{îïïѮz­ЯíȯŭɮӮЮßϯŬ{ŮЭrƯ̮ƮʯíƮŮ׮֯ïí˭ЭȭĮГٮʮЮ˯ǮˮĮȮѭ¯կȮ˯ڬЬ˭СѯǮɮ̭®|ŬĮɬ̮ĮʹϬȮvįwì̯¯୮­©ɭȯίįʯǯƮǞƭƮʫů‰ʞҭ®îΣЭįϭ­ͯ˭ʷpï¬vîȬ֮zìyԱŭ—έíʩpĭBȧ}Ư|ǽͯŭʯƮȮŮ}ȯƯȯڮĬ^ȮŮҩijzȯíƏʭḽæǭʯǭ½ƭuȭíĮ®’˧ůŮíȮíîîƯŮIJʬǮɮìƮǥ⺮ɮŭįűĮ}ĮƯƭ®ᯮʯծɭή̮԰ťƯīǮïſǫ­Įۭ}ѬūǪܮʬ宮­ᮯϯĭ٭íǪtϭΥ᭯­˯iʯƯy|pqÝ­ʱůìíɯįγƭ˭ϭŮzέƭѭĸìέĬ[Ȯį^ϽůǐyɭȮ̭îîƮȭ·宪ȮȮɭҨ­һɺҬӭlx}Ŷ~ȯ®¢~tĨǭƫʭ¬آ׮ŮͭԯҬǯĮ¯筯óŬ˫uǮůzîy̭ǥϻzƸs}ʮ¯ǰĮĭ⭯y¯Ʊ®语ĭ¥ϮĴì͏Ɲ{ǬҦ¯¶îbۣƯvyƯ̮ɯžŬɮŮϬĭĬ®Įƭg~rqZ}ïtpZ}|z±ƭʩͨȮȭήízƭ®ʯٯĭ­ҮͮѤ|ijîƮǭǮîɮíͭǯijѭ­Ǯѭ˭|­t­ĩįöҮ˭ñˮίƭq|õh}ihtyu}Ѯɯt}[Ůƪ̯ŮŬvխɯԮ̮¬ůĭïҭîȭ̮̭ɭ͞ʭБЭƭʭЯɯݧƭ̯ȮĮǵî®ҬԭƭŜǮƯüЦŮͭŭŒḽͬBѭЭtɭî~ůjׯͮͯ񭯭㯺˹|Ůάˬ¯¯vȯ˭˫tw{ᮮuW̮}֬خ׮ǯXǕ{Ĭïҭͭ­߭Ǯ˯ʯyԤͮ{ŭȭǭYwǯŭή}ǬƘc­ʟڼƭͮƭ~Ŭʮϣĭӯ̞ƭ¯ήȮïɮˀ׭«ЮҮ¦ɰͰ̨ͯ箮̪ŭƮƯ϶ͬծסwĥuҭǮ쭭ȭĶԬѯɮխʶ¬ϭŬìέЮԭªåqʯȭŬ֯ӭ׬­ӮѭíŭͮȳëͭͮîʮŭƮĦ¯{nˡαztȯϮ®®ĪǬŮЭ¦¬®ծʮˮҴ̮é}Ĩî­Į~ƮĮȯíͮȮέʫŮĮ̭íϢȮʮ®ȯƭů®ޭǮǯkaėj°ɪ|̰խį֮ݭ}ȗѭ㭭ʮ᮰Ԯگ̢wʼȭ߬ŭۭڭѭůëƮگ~ĸȢưĨnŮЭ䬯®𭭬ɰŨ̽ůܨįʭíʭģƯȮɮ°®ŭŬîʬm}v{Ŧǭŭ®æu~|yîʭȨȭȝ˭ҮåƩ˭Įîį̮îȯЭɮƮʮ֯ǮЭ¯ƯĭȮíĮʭƮٯ̶ϡįɭʮƭyԧǭѮĬįĭǭ®ԭ˜ܭíɮ䭭ǬǮsǬĭlЮvĭͬĪʮͭíʪṷ̆­ͮɯîŶʯѯů歮ϳ˭ŬuԭZѭ褪|ɭŭ¯Įۯ|¯ìǯ̫îɢ|ĮѢïĭĭТˮvԮ{Ѯ®ø˭ƬĻƲį¯ïӮ̮ʛptʮɮƲϯ͜}}ϮTǮ}®~}ǭȲqˬv}įpάīsƨìCЦůĮګڮКį¨ƭŬ¯­ïǮˮη‘­ܮȮϯ˱vįįĭ¤ͯɨĭDZǭǯ­­ϥuwqǰɰϮ̯­ҮȮȜ¯̭ǡˮ˯ƭįǭä®ΫȮ̬ǖ­îǯŮ­¯ȮǭŰƮ}ˬ֯kլЭ~ҭįүȭǬŪܦy̭¯ǫî˯MǙ¯Σǯ ɫˮĭͯөɱ®­Ůկwzfɮ­¯Ů˭zȭǙįέõ­¯ĝĮƭȳʯʮ֭ŽƴɮǰڭĚƭ®íįםǮۯĭ̭td~Ĭǰmîŭ̠˭®Ưыѯ׭˭ԭĠѯŬĮ~zȮԬ̮Ʈ®ůȭ¬ǭîíɜƮǭƯǯŮ®¥ȮʭůĮŤãɦԭŮˬͮǼkӻw¯ǯ®ů꯬ʤmȭ­ͮƬŭ˯~αŬɮ̬ĭɰʵέ̬Ȯbįĭȭ®îtǮ˭}ƮȪĮ֮խ¯ɭĬíʯħϮǮx֧˭ɹ˨­Ljy}¯R~ɯƭͰЯɬw®ǯ{ȯԭŤݮɮîʮïɮˮr˻ŭŭ~®ϲƬˮЯǬ¯خ|ʲïӯ®j{į|wpvm{įĭųƬîǮ˽ҥîvĭ͟ŮƬϯ¯òļ̭ȝ֬îɛʯȭɥǯ~¯Ʈ̭ǡ®Эɭ«ĮϯǮîǭƹư¯®Ƹy}zqîȭѫ­ìȮͪ­ƺ̷ͭʬ­ʭ}­jǮ֮®z៪{}௙ʮ|~«˭ʭ­qůƬĮʯsɘ­|ͮɯɭʯŮƮxpk殮Ԯɋȯ̭ĬƮ̮ƭ®ήͯحͶȮǮ¯Ȯ®mǯy~ǵǭĬί¯įȮʬ®}y~ԯγ[ǭȭǮo玲ۖǯɦέ_íĮͭǰį­ׯƶíȭūvxƯƮĮƞƫ˻䯭̲̮®زïƯĮ¯׭Ϭ­ůɮɭĬ­ĭέȮ٭ǣ̭ͭɦƭ|Į­{uůůȭì¯ëů}ǮƯ­ŵɬƬίʯ˭¯č®­ƭӹŋƬĮѭǭص֮Ư~~ŮîǮyxծ|¯୭ǭϮʹǭʮ֮ЭĮĻݯÞȤȭůɭٮt֬¯ͮͷȬήܯƸ~ĭʵϰȭȮή~îŮ¯í̮įǬįɭįķȯîͷɭi{z}ȯrɤĩɭ®}t®ɮЭʣ̭ˬɭԯǭĮ®ƮĭïĬȮǮˮԯدǯíïȮyƮí~ͮػܭ˭ǮkkǮۯtz{ʯǭĮvWmrɯ׮ȭ|yzmƯíǯѭƯۯ­۽ěííŰƮίìʫ®®įĬ®įŸŮҢȬ`ծwWƮOìyķ|y[­Įۭ֭ò_ӯƭ~ī{qÙįîŬxxzˮ¯ǭɭļŭ׮|Ȯ­˯~®ujƯg|îĮʭ}­Ǯy|~şӯɭjЭǙ³ƭЮɯɯzϬͪȯĭĮ}˦ʭůʬ͡¯Э®ʰʯͮή孮ǮܮŮ̮э}ůȭƬ¯îծ®į¬ǭǯʶɭ˭՜ȭɗˮͯʮխȯïXȪʮȤwxʮǮǯį}˪׮z޵í{Į˯ïɫ̰Ǯ׮īάͯȭ®˯ŸɭĬЬ̯֮ͮɯzîƮȮǯƄwÕîbǓϰ˭߮ήƢʮįƭɬȓŮtî؞ʯ⯯įƯsˮ×ɧǭȨïʮyq]ůϯĩήĬҭíʭ®Ʈ̞ɭĭÞˮ±šǭįǭ°ۭ¯ۮũٯƯƮyȭĮƭů®ɬġƭ̯Ůĭ¯ɭ­ӯέĭʭƭǭȯȢʯٮέя߭¨Ĺ~ɭœʮïĩկ֭ƥ˭˯ʙí²Ʈ­dċ˧œ퟿ů֤uĭư­~w|˭ĭĭϬŭʯ̭ǭҭ}¯ʮëήŖʯʯԧ̯ǭ׮ɯέȭǰͯʯrɭ֬¬Ů|íϮƧĮȫĢ̮Ʈ̭rĭrĮn~ȮíЭṵ̆ί¶¯¯¦ۮԬɮѮĬɭ̰ŭ̸ɮɭҭϭ˨ȯįѯĮáî|zwcĽêέᮬƱäڭ~̮íëíΫȮǯĥ­ū¯Įśjųĭͱ~ɬͯĭȪׯÛ}حƭgͯĮsĔܭ­Ůëǯ֭ŭ{ŭȯ­ˮŮ¯Ȝṷ̊ï̮ȯʭ¯ƪۭĭʭȯĬíÙṶ̆ȯwĭ®¯îīíˮίxĮ֮ԯɬŮЮٯƪɩծxzz|­ïx{ЯƮůŸsp˝oҮĮȮîǭ¬ȮȢ­ʬ̯άį}dĪbϩĭ˯îͯ®Įǯíǯp~Ư®ɮƯǮíɬwfc{ĮȮ­x|ƯíĭʮƭîƭİǙ̮z¯ïįƮïáЫíѲeشǮ̭ȯ~ɬŬǯҭo{}8íZuέʯm~yrǮɭíάxͬŭ{Į|{z­ǬvįۮŮĮƯŲ®ŭ®Ӡ˭Ʈ௮̯íɦȖǢ ĮŰĮЭĬɭŮv̭ǯŦȩŮŭíԭϯŮ®êӤۮk׭ȮǮŭȮɭí®ƯïƮܮҭ͠Ѯ}Ůí{ŻŬȭ|zɬ}¯j̭gɯ|ɮʮ­ɯǒʫeĭNrqmͮׯƭů٭֨ʭyïĬˮĝŦĮįîǬȮŬůũįŬ寭ɭ®ë­ĭʌʯŮŬǭŢ̯IJͭȭĹŬ­ǭׯʮد­ʮíʮԬ­ͣɮ¬ӭŭ~xqs­ï̭֯ïѤүͮĭîƶŭƯɮ¬ǣ¢įưήqĭǭǮ®ïͭîŭĬïƯĬ[ʣpѮĮŭƮĬخͬ°ϭǬʮƯ~ӬĨ®̙ԾïϭέYɭ̭̬حԷșί̳ʓĭΨɯ¢֢íɭدȮƱî®˭ŮҮĭƬƯ«¯ï¬éů}ŭѤέj˫Ǯӯhͮ˭¯ÛƮ®ŮíZŮíƭҳϮԬîíu¬í­njŠŭūƭ~į°½uǮ|h~ϭí}xŭov{xuza͹ůᰒͯ¬̮ʯðƯˮ¯Я­rîkխ}ϯįvw®ŬŬ{ޭ¯ǭѯ׮ͱӯ̦ȮĬïä˭Ǯ~§حtӴyǭǮƮίʮ}ů̮ȬϮĚƳƝƯ}ŭ­pĬïír¯İimpίǮάˮĄǛͮĘʜϬѭ{ծxѬ¯˯ů¯kxŮqįy®ŬʮƮ§xĬɯ®ͨŭ®®Ǭ~êsЍìȮϮ~­íĭԱ̯ìʜʬtϮǯovȳ՞®ȭέzƮgƭT~įƮŭ]}myQǭǯήȭɭǭ­˭Ϯحدʮǭ¯ĮïDZįȬìĮ¯ĭƯέլƮɬŭǭȞŮίȯѯϡϥɮ˭âŮyɭŭĭrįZuyoŮ®Ưïǯ¯ĨīͫĭĬ–Ȯġ­ưȮîïƬtˬŮ}ؠɬ®dzqɯ®`j~Ŭ~{׮ĭȭˮĮĵЦǭìĬ̸­îǮƮ®ƫvƓ­­ˮ֯t{hívs|ɭѧÒ®ˮ®zzŭ~˯׮ְįʮʪ}xyy®ʭȪíɭƭĮͰ~yűî¤Ůƭ̭˯ïɩįծîůϮɯɭ­íͯwkóǥĭîʮƼ|ȮvŮŠĭîį°ɮ٭Ṷ̈̀Ӭ̯˲{ƪǮծîïƮįέíȭůį˯hǬǮˮȯگίͭŮϭĬxȌŭحǯĭ~bӯ®ŭʬ̯xskï̭ٮٯůǭ뢥Ԯ®ůë¬ŰůŮ߮ŝȷƭuʼĮƮ®̭̭ŰͬĮñĭƬ­ȯ{ƭȭ˭Ϯaհ˿ή­ȯˮêstܯíâǬƭǭȢĮƮ­ϻîůƭ³ð̯ūʮɯơœ¯îқ®zͪǯůǭ̮ʭ­Ǯìĭ®ͮƽ~}̱ĭƜʨȬ®ĮÚ­¯¯įŮǪů̮|¯Ʈŝ®®ŭŮЮܯƭή®ƪįůΰ¯®ǮаǮxͭڭƔՖƮ©ѻ³ȭ­Ȯy²ү­įïح­®®ƭƯƮïïƮƭțǭΦޮĮĭĥíϓίǮoϮ}n˭ĬƮǷϬíȭ­ƬɮǮĬǮʭïŮөЮíĭĮɮ֭ŭįŮگϏƮիׯвέǮ˯ïҮïįϭծԣƭDz¯îçĮЭήƮ¦®ήůɰíĮׯ߭΢ǮyǪɮĮƮͮ|t­îɯî¯ЯȯůˮŮŭЮĮɮĭѭҦ˙ΰŮ}ŠЬį~Ŭ­¬ïȯĭŮð~x~ĨůíĭˮĮįǯůɤqnǯǠĭiϦŮ}oȮέ˯lkȰŮvfͫǮɭͭ¬íͯϬƮ譯ͮد®•ݤǜ˭ͭϮíѯïˮɮѤϭԬƭ­ίЭаƮɯͯ¬®ªԮ֭ҮïɭլůʭϮѭγɯȮʮŮ­ȫDqt~˭ĮҮ}Ϯ{ÝȮů̺­¥ƭƯɯ̖ïƭɯåѳˮǡͯϯí¯ҮҬƮĭůԜr¯ǭš̬ٮíۮͯĭrȭvɫ§į­ʭˮy­ƮĭîȰɰǮݭ®ǮլҮİƬǭ­~¯Ұgǭ|ƯȮyƥz̭ϟíͯ¯ԬíîǬ¨®Ʈ̭ʭۯʸëӭ鯵ÿ©ȬǯɬʱӮƳǬyîêίշĮŮðí˯įȠɮîӯˮĮ̮ĭƯ{`q~xͮȯɬǭí˱ȭʮˮŮϯɭï؂Ɵɮ٭}ʫ}Įίˮíï§{^ʮʮypNǯɬîʮŧǬij¯έîɬĬ¬ήǬ|vͭ­ôȨ¯ɮЮ͛ݮѯخЭƮȯƮέþ׳ɬ~Ǡ֮îѭoϻȭ}iĭΕxãфƮ­دׯɭzϯӳԭʭ̯˭ϭǭʯxȬѮȮحȯӯƭ˽ίʯ¯ǭ̭ɮɨ›򮮯̯ȯůѯǮî¯ܯůƭ˯kŮɮǮcƮíʭ¯x͜Ůx¬íȪ¯ȭĭ~oɬuˮɮĬį˯ŮĽq¯|ṱůƮíŭuǬݮ¯ȭ­ɮЯ®ũ®¯Ů®ˮØܮȮ˭Ưǯ˯ïɯ®|°Ŭáz㳮ĠʯŬǭɭrǭìǭĮîu£ŭ­îѮDzɭîƮïŮïȭĭ嬯ֶ{ɮʭޮ°ڮ®wʌ{̢ѭبׯɯ}꯯íɮícծЮů›íƭѭŭʭǯɭœܰ¯̭ͮzȯĭʭȯrǭĮǮ˜Ǭ¯ثrͮǮ{о˭̭vzŮzŭĮ{˯~ïˮŵį¢ϯѮ̭ԭƯέ­֥¯ĭįƯ®Ůˮ­ͭ˭ˣ®௭ìƭɮstdĮĔhx­ʯԬήǰîůǼlyԁʬӯˮ΍|ůĮƮŭ˯̎®ůϮĭĭৣ|ɬ|ܬ̯ƮʭҮɰ˭qǨϯ~Ŭʮɮ߮ɮʞʮí˘έi|έȭέ®vʯ®­Ũȯͮî§ƭŭǬūvĭzͮϮɬԮȭǯxŮňqůүöҮåAʮzìíîqsƮosįǢЮүϯȮòկƮʬϭɯѬǮ̭Ԯɵ­ѮŮĮɬˮ{ʮîvŮή®ͭbrƭˬg٭{íƭǬí˭ëЙͭˬɭү̣¯ϙïůòʯͯϯĵ®ѭ­íЭƭįmĭvmǮŮ|xͬ{e欮ĭv­̮ï|Ȯįů~DZƯ|¯ï¤­p¯î~ѪusجkʪzȬƮsuynï¥į®ïܯŰǮ­ͬèĮÛ­w­ɨṷ̊~}x~ŭҭĬƯ˯ůʯЯ­ȭŦ¾ۯlŮƯҦέйɭ¯Ώ®ĭ{֨ȭîî®îîî}dĢǮǛɴ±nxƭȺĮɮƬȭʯ¯׭mخƯǭ®ˇ˭ŬîĬɬĮyƮѠկȯ¯̨s­¯௯ɭį٭ǮŭɹxǮɯͭȭǭί|ϭljͯ­Ÿ˭ӱįȯñíأ¯ïԭ`ɮíŮϮpܳ{ͬŭî¯í®ɬíԮíʭŲ­® ơFﮆ䯟歯٥ŬկѮ­u묬Ѯӭڭéί·rĮxxӬǮĬïîî®г®w֭Ĭ|ȮqtѯѨίzìíѮƭ®ҬŹʭ¯Үɭ٭̨ŭɮͮͭĭįɮŢ̭ɮˮĮưîԭ~{ίìĮۮǯïưŭɯį³¯˯ɬ®įǯƭ̯Ĭ­Ǵ̭ȮïХӭʬîîĮխůůŮīį¯ʯƭĮṶ̆éɛΛȭȯЯЯðͮίª®{¬yɯưƭíЯ®ůկƭyƭ·ĮíxhίîlnɯŲȯŭʭǼxɮ®ķ¯ůuɜʨƮŬѯî̯ƭȮo¯¯ɯίȮ­îۯįϮŭíø̮ԭɬʬƬ{®ұíŮŮήİȮɯ~ƭèЭ|íƮï̙qǭvɭí[ɭí٭{ʮƮǯ®®ϰĭȮέ̭ʬ­׮­ʳxɭ{ìѮȭ¯ԭƫŭîzΐĮĮӮ̬ŮïȯɮŮ~׮Ԧԭy®ʭʯˬӮʩzlŭî⭮áԮ­s˭¯˥ίĭǙʮƼȭǭïïĮ|oİƯ­ʭ~˶~Qḙ̂Ϯůæ̮yİŬʯ׮׮Ѯެêî®îʭƬ}ɮӯÖƯ®ӭˮүˮ֭正ǭŬ|ѭĩ¬IɬȭĩŮ߯ϕǭ̭ƮȭɭɭɮíäŅӬػȭέЫǯ{Эĭѯ̯׮x㭭iήĕ­ݯzjY}|p¯ǵέŭ¯ƮxܭˬǬ̭˯Θ­Эsŭ}᭰ѭ­ǙłǮ}Ʈ¬ůtìɮyr{­zyn~­î˰˯}̭}̭حȬҮƬʭũϭȮ̭¯ޭrԮpʯ¯~|ɰðѯuȮʬtͯˮżҭʮǭǰn­ګ֯ӭˮϮѭέǯ­Ϡڮįƭ~ñʯŠįСѪƮį̯ᮯǯگʭïíЭïϭѯίíWĮɮҮб|í‡ǯî̮ìtѯڬwäҮȨkǮӮw¯ꯙدǨŭǮzڮ᭯z­}¶аvԮȌŧɭɬӷǯŮȬ­ïĭ᮪Ṷ̂ʭîܯíǴƭ̭ЭĬٮݮԮˢƯ|ɮʸέȮlٮ˘ȭǣưŭâѭtµЮŭŭ֭ǮîɯĬǯέĭįìƭίǯˮ¬ɭկɮ®Ʈl®ĬȯyͭʭwPïdŭŭ̮ϭɭѮ~خŭ­ïǮ}ȭأԯ­ӭͮíѭ׺¯̯ɧȯѯ­­ƭ{ŬèƬįĜĭʭ­ŭǭĭïʯƭůƬ˭¬̭֫ʯĮǯŰԭͯث˜|ѯ}έ¡ЮŦɮͮĮŭ媮ѮʮŬŭĸףzůʮ̦ªʭȮЯ®Ƭɭάͭ{ŮůԱ¯ŭDZǭáïӯʬíį̭ĭŮ{ڮ֯¯}̮ᮯĭv˦íήí̭ͮȯízĭîů®åūǮluʯrj}ȭ¯ìvX®̯̯ͯĬ®¯Ůîƭȭð˯ĴíʬƬ˭ȯڪ˭ŬŬέv¯wtđ̮qį̬Þ̡¡ū¯ůϪȭǮŮȯ­í쮮ʏʬƕدկ˪ɭƨɯ­í˯̭ǭǮɜ֯ȭŭ­̯˝ìĭÓǯpǢʯwǫЬɯĭ­ήSحįƻܭیks¨Ȯyɭȣ؇խɮǮȮŮԮӭĬέϭ}ѡͭŮǯ˪y¬můɮQªvɯu¯Ӯ֨o}֯|zƮϬj~Ư­hηî۸®Ưï­î¯ήĭƮ­ѰʮǯͭǯƯ¯¸ԭíƮ|­ͮïŬîïޭǯ|ŭĭĭͮڮ﮵rѮiǭ©|Ȭjuhά«̬}­|íůįխˮȮˬͮȯǥŮ¯ĭṷ̆Ѯɔ׮ǭϬ˯î䬮ǭحưůկܮ{ɯì֮ǯɱȯįɭůƬŢîȯíҾĭӮܜNîծЯ|rɮŭǯyyǭįͮkŭǯح˦έɭ֭­­®ȯ⯬ǯįƫŮqïޭ~Ʈǭͯ˭ɮث¯ɬɭ~`ŬĮ{v|ɮ̮ǭƭ¯X¯s]­ĭǧ®ïîŭe_ǍzЮgϑíȪׯĮ®ŰѯʮiƻƯyŭǭ~Ȯ~˭ƭ®˭įƴïDDTM>JGKBO?KTGBOIZLKJJCqEJFKLKC=u?JELCEJLKEEFFG5eK6HBKKNKCKgCEG=3EOgL2WMFKFALvG_AG3JqBLFELCZHEKCK?\GGDKCJACIG@NDFGD}KKLJIIGAI8DE,Js@cSJ8JDAJCxCGAJIG>JKBDDMsKmBMqN:Dv[8GhCCKF6JE=;G2I=BJALKiMGJBC$Q1LKOMBi8IE%AD8}DEM?_K5AFLD:uFG:MjCGKFE6GJ@B!LLJ@JDElCNDK9EIAA>yg@IK@JKuCDAZDJsB9GJHI[69NJvCIBLDFJKF>KPFKHeJKLIDL8:KyC=@IJMK'DD@D@MD:KBBKtFGFD?KClKBJCPIIJJG@LEJ7QK@MI[EHEl+G96A>KJ>=J7\zC=8DFAFJ&@JEJCtHJAVKMLLBE[kO/6E5lAKN+OAHOJLJGDJ9EFDLKkHIKqLHFF1HJJFDMJKNMHFCDKl.BKPGKCJ=i@EKK5DjK1EEJFAJEJD;DJH?J4IGCEA^GIMIAKKFKG=PJDJoFGCDCJW2%Mm@FHCJJGJJiD8@8LD^DA9:@,IKFcdEJGGADAGE6DHKJKABr:FC1*ALEEDIFMFA=8C>EJKJB@ICOJ7@/Mqi{MGA6Mc _I??JJDL=CJKILGH~~~||w~|y}zu}~|z}{x~|}}~{~}~~~{xy~~{z}}z}{yy{x~}Ʀ~~z}{~x{{{z~y|~~~~}zwtppqtxssss{zyyz}{zz{|xvwxxw~}|~~}~~~}z}~{~||~{~||}|zyyz|sz}}xyvjr~P[iy}{{dowv{x{uvvt|xjosx|wtqpk}r}|}|x~|rlloot|}~|z}y|}~wjfok~fs~}~nt}}|}~}|ty~xsnh`{n~mmnpjb^ZYu|}{v{{pzzrtt}}}~z|}{yzz|}|~~{xxu||v|u~xqzg{[nNfQkUqcvovlhcn^XSE|vrsjTMLZ`ʊvvrΉ{u}}~|~~}}~{{}}~|{{~z|}|~~}aXYiup{oY{UV}GgZfr_WSJfru{vҔۍ{qĈĄMRTIJLmhniqm|yt|{vlqpyyxszn}niytq~~}~}~||~{}}|{{y{|~~~}zofvpnljjgddjghikyxwvvwqoopskkkkjk|{zz}|zy}||~~u}}}~w|~~~~xys|vv{}}}~}}~~~}}~}|~|zz}}}{|~}z}~~~~}~~}}~|yz|~|xw~|~{t{jv{|wz}sx|xy~z|}|~}~~}~~|~~{~|wnnoorsqonxvttu~|sqpqpq|{{|~}}~}|{~|}~~||~~|}~~~}}|}~|wtttw{~}}}|{|wuz~yzt|z;}Xtdgmsy|nzyttt{{{|y{}}~}{x}~~|||}|~~}morw}}{x{tvx|}}|~~~~~xx{{}{~|||v{vx|~}~~~~}~||}|}}~~}~}{~zy}{xxwwyr{z}}~x}}{}}y~{~~~|}u}{~~wvfngxhcrg[U_q|wwqmbw^oΐzxp|~w~z~oytpyf^djs|vsqyqrwyx}|xxz}~{}~wy}|~~}{}|~|}yvsqrtwz~{~{xwwwy{|xxy|{~zuv~zlklezgjrR}CÑ̖ɗe]͞£•px}v{}~~}~~~|~~~|zv{ngcfiqsv{|z||}|~~}|yz|}{zz~|}~}t}}~~}|~׼Ǥq]XUV]``kxgjda]xdL}||~bzbv^z`wamfdmwqzpnr~~z|{~~wwwy}UZ`q}xoeSMzG{~}}}}~~}}}}|{z{}|{zxvw}xwv~|{|r~x|~~}|||~vz|~zy}{{~~|||}{y}{~~~~{w}z|y~~zxwqmvzvuo}~||}{{|{z}tyqzvO}Wcjqrvu{rljnw}z~~~{wyy~ztv~}v~~~~}~|w~y}u}|z{||ww~utwxy~umiifhlnruvv{{zyxvsnvqomm{~~{vvvsnojig`cegnsnmifeil}|}y~~~~}vmt}}{~{uvkmbd}{v{zx~|~z{~z{|}~~~}}~}}~|y~{uetqwr}xxz{xtzzsp|m|vo~n~uqhe`YUW\~yoe\Wrc}sjhlu~iRdvq`x~}~}}|}}}}o~}|qpvz|{pu}|{wx}z}|x}y}}|w~}|}}}o~nguzyuz|wuxww|{zsw^kkkrq}~~~x|~z}||~}}|yy|~|~~}~~~{yyyyz|~~x}wnzl|}m~csz{|~{||~}~}}x|~|zz~~~~~~z|~{}}y~~~|~}~}|~}~}~|}~~{~~}~~~}|z~|x~|~}ypekljjʌzmxlffzopqqtvxtwwwuvsswvqwrqt~xuvppos|}uvxy|}yuo~~}~|~}|~~~v~uz}wz|}}}~}xxy|{|}~}~~~~}~~~~~~~}|z}}}yvxzywy}n~z~ox{~ywvx{x|{}{tiZs}ethgfez|c{d}eda`z}~w~|{}}{~}{{~|z~~}}}~}y|~~xtp~}}~~|{~|~~}~~y~ijwh}p~qox|vxpnu{wu}eYc[a]l`m[mWq[sdo|սzmoooxÎĖƧqV?$}BESQResuq]Z¨ESYVgGhImIc^jbrah__`cVg@WVL_J_N^whibdZa|~{zwsonv}|}yy~yz~zwuy}~yvwz}~{|t|x~~}}zy|yz|yz|~~~{tzz|}wx{{|{}{}x~~y|~~r~~z||~u|~z~~}}{~}|{|~}}{{~y{}vvvz}w|~y{}{szyz|}{~~}~~}}{|~|}{}}~xuy|wvttvxr{x|{~|~~{{~~{}}~~|ywz|}|zww{tq~x{}{zy|{z|{~{~~}x|{zz~~}~|~}~~|}}~v_vepqpisn}w}|zwspsmnps|ysi|gqvu}niy~y|m}~q~{{~~}}|{}}}y|z~~wyqz|~x|~m~~{t{~yh~k~~’җbm`w]\\rxnkgy{||{ʞբƞjoqronsvw~tzzz~}}}{~}|~|~|zxwz|qx~ttvxxw}~}~~~~|}~~~zzz~}~}y|~~}~}y{~~~y{xw|z}wtu}||ys~}{w}tzx|{~|}~|{~~~~~~z~}}~}|}wqqzzy}{z~{ux}||}~~|||~|}|}~zyxy~{}|~~|~~}~}}{y~}}}~}~~|}|}||}}}z}~~}}}w{~fq|~}Y`jpw{y|hkpuvprusxzthkokgjvnrt_tpl}}~}y}~~x{~y~~~}zw~|zyy}{yxx{{~yxx{~~~~xy|x~}z~|y~~|v~~{|tzx~~|~y}z}xmdbcfv||~}yx~vrqtzzyvt|yy|xv{~|zruy~|xv|dfghjpv~}vrpnmjz|{{|~~vyqlqyy}^xrbhkvzzq~phhfxxvkroo~}mjmvknt|z}|}xuxwq{q|tvkgxxzxzv{}zy|~~~|z{wttu|yy~~zv~~}~~^^blxvpm}Yinujpeukwcixjb}thcgamyty~rpv~ywto}|vrmp}ruvtxup~}~}}~~}z~}}~~}wuz}x{}|{}x~}}~~|yxx{~sw{{zzv}|vq~|zxyz{vwxwvvtuuwwy{{zzvyz~}|_A%oXsrzȌҏ΍˔ǘ{wywx{w|fq~nkmrv{vpkeQ\fuwootttyz{}imoyvsxstqsw|}zxx|}~~}{~~}}~~vtqoorv|}zyu|~y~~~}~~{~|}}}x{{zww{{~{}~}~~{}~~~~~~~}}~}|~~}u~}{~}~}}}z~{z~z~~||{}~|~|x}}{z}{~~~~qe`dpzrvgnxxw|tmh|y{}}~}~}}pwrzz}wz}{~}}~~}}~}|}{~~~y~}{~|xxz~teydzf|sqsv{x|xw|}~~~|}~~~SXfn~|xquwvrobJ|{y~~~~~|~}}z~}|~}~~x{w|~~~~~~{}~}}~{z}~|~vb~ͩx~rmvat[ez|qulndzj[|wx|vv{r}}zvurm~~}}|}}|z}|{x}~~|}|}~}~|}}|{{|~}{xv|{zzz~~}}|}}|{|~}}~}vwy{~~|~}{~zwu|xx}ttx~~yyy~~}}|{yz{|}~}~}zxz|~}rpmpz|~{yxuurligipvz|~}~}{yy}}{z{}}}~z~|}}~}z~}}~}~}|xy~|xy{|~y~~~}{{{~|}y~~|~}}|~~}~~}|{~{~}{|~~~||}y{zqx|}}zx~suttuy~~w{u{z||~yz~}||~|~z~}fwgher{|~|k^xtXpxqy{vvu{|z~~}|||~~~~|~}~}}~~}w{~|}}~~~}}}}y~}~{}|}|~{~|}~~x{|w{urxuxz|{}~|~~~~~|~{}y}}~}~~~~~~~|}}|w|zzxw|}~y}y~}~v}}yx|}{~}w{}~||||}ʛc\ysoKy\zgspcvRu/|>{GJL~`syorul{x||~|{{{z{{~}~|{|~~y~y~~~|~}{z}|~~}xx~}~~||}}}u~}zxqsx~{}z{}~zu|uystroxwyz|{}|{}{|plx|fUD8zzz~rs{|rninv{yt~~|}~~|~~}c`[X_ky~|~~~~~}wyz~~~~}yvvx{~}||{{zxxyz||{zzzz{}'Ij 6Oo߶uS1!6J^ u(s?qUolY{dp}}*-7'F(T/F2620)*054ETep|}ocSLep||od \ No newline at end of file diff --git a/weights/face_landmark_68_model-weights_manifest.json b/weights/face_landmark_68_model-weights_manifest.json new file mode 100644 index 00000000..1d9a94ff --- /dev/null +++ b/weights/face_landmark_68_model-weights_manifest.json @@ -0,0 +1 @@ +[{"weights": [{"name": "unused_Reshape/shape", "dtype": "int32", "shape": [4], "quantization": {"dtype": "uint8", "scale": 0.5058823529411764, "min": -1.011764705882353}}, {"name": "conv2d_0/kernel", "dtype": "float32", "shape": [3, 3, 3, 32], "quantization": {"dtype": "uint8", "scale": 0.006229220535240922, "min": -1.0963428142024023}}, {"name": "conv2d_0/bias", "dtype": "float32", "shape": [32], "quantization": {"dtype": "uint8", "scale": 0.009229176067838482, "min": -2.0211895588566273}}, {"name": "conv2d_1/kernel", "dtype": "float32", "shape": [3, 3, 32, 64], "quantization": {"dtype": "uint8", "scale": 0.00794055274888581, "min": -1.1513801485884423}}, {"name": "conv2d_1/bias", "dtype": "float32", "shape": [64], "quantization": {"dtype": "uint8", "scale": 0.004187015750828911, "min": -0.9839487014447941}}, {"name": "conv2d_2/kernel", "dtype": "float32", "shape": [3, 3, 64, 64], "quantization": {"dtype": "uint8", "scale": 0.013999465633841121, "min": -2.6318995391621307}}, {"name": "conv2d_2/bias", "dtype": "float32", "shape": [64], "quantization": {"dtype": "uint8", "scale": 0.0037124345699946085, "min": -0.8427226473887761}}, {"name": "conv2d_3/kernel", "dtype": "float32", "shape": [3, 3, 64, 64], "quantization": {"dtype": "uint8", "scale": 0.008715396301419128, "min": -1.368317219322803}}, {"name": "conv2d_3/bias", "dtype": "float32", "shape": [64], "quantization": {"dtype": "uint8", "scale": 0.0022804437753032236, "min": -0.5290629558703479}}, {"name": "conv2d_4/kernel", "dtype": "float32", "shape": [3, 3, 64, 64], "quantization": {"dtype": "uint8", "scale": 0.011885881891437605, "min": -2.2226599136988323}}, {"name": "conv2d_4/bias", "dtype": "float32", "shape": [64], "quantization": {"dtype": "uint8", "scale": 0.0020124191893082038, "min": -0.4809681862446607}}, {"name": "conv2d_5/kernel", "dtype": "float32", "shape": [3, 3, 64, 128], "quantization": {"dtype": "uint8", "scale": 0.011104925941018497, "min": -1.8212078543270336}}, {"name": "conv2d_5/bias", "dtype": "float32", "shape": [128], "quantization": {"dtype": "uint8", "scale": 0.0011017150592570212, "min": -0.24017388291803063}}, {"name": "conv2d_6/kernel", "dtype": "float32", "shape": [3, 3, 128, 128], "quantization": {"dtype": "uint8", "scale": 0.012181366191190831, "min": -2.009925421546487}}, {"name": "conv2d_6/bias", "dtype": "float32", "shape": [128], "quantization": {"dtype": "uint8", "scale": 0.0015788526511659809, "min": -0.3347167620471879}}, {"name": "conv2d_7/kernel", "dtype": "float32", "shape": [3, 3, 128, 256], "quantization": {"dtype": "uint8", "scale": 0.013691982100991642, "min": -2.3550209213705626}}, {"name": "conv2d_7/bias", "dtype": "float32", "shape": [256], "quantization": {"dtype": "uint8", "scale": 0.0009620819898212657, "min": -0.1452743804630111}}, {"name": "unused_flatten/Reshape/shape", "dtype": "int32", "shape": [2], "quantization": {"dtype": "uint8", "scale": 0.00784313725490196, "min": -1.003921568627451}}, {"name": "dense/kernel", "dtype": "float32", "shape": [6400, 1024], "quantization": {"dtype": "uint8", "scale": 0.01880466704275094, "min": -3.2720120654386635}}, {"name": "dense/bias", "dtype": "float32", "shape": [1024], "quantization": {"dtype": "uint8", "scale": 0.00283245981908312, "min": -0.24642400426023145}}, {"name": "logits/kernel", "dtype": "float32", "shape": [1024, 136], "quantization": {"dtype": "uint8", "scale": 0.005545294986051672, "min": -0.7818865930332858}}, {"name": "logits/bias", "dtype": "float32", "shape": [136], "quantization": {"dtype": "uint8", "scale": 0.002829533581640206, "min": 0.13660642504692078}}], "paths": ["face_landmark_68_model-shard1", "face_landmark_68_model-shard2"]}] \ No newline at end of file diff --git a/weights/face_recognition_model-shard1 b/weights/face_recognition_model-shard1 new file mode 100644 index 00000000..de532959 Binary files /dev/null and b/weights/face_recognition_model-shard1 differ diff --git a/weights/face_recognition_model-shard2 b/weights/face_recognition_model-shard2 new file mode 100644 index 00000000..c2e6bebe --- /dev/null +++ b/weights/face_recognition_model-shard2 @@ -0,0 +1,3742 @@ +Yfdejb`cf_]bbmY`hiZcgb_abmfc`fb]ed`d]mbbf[]agbdfhoZdkch`Tahdb_bbb_cagebdfacabehdgcc\a]^\i_g`edjmjfgbmj[fc]b_g`Zab_cdg__i`^t_bf\nc]bb^dhjf`cce\adke^^h^jfZiceag\eha```ee`__ehdh_]bibg``da^c`_cfac_\cp^aikf^accia^f]`fbh]ccid`kgdaiVg`cfbc`\hgck_cgfdd_fbi^__^gfkb_ehW^[h_Xaak`^ciaffaebec]Si_jaifaeedcbenaekih[Y^de_^__ehfeg`[_]hjb]echWdi_bnegdb_b`ei\bcecZkeYce`if__`h\lYcng[aYfk_hfbT^^d]bb[fcZeb_aiXfceiVdha_aV`hacad_f`bfg]\Z_gbciob^ahidckbc^dbghcbghawabga[b`i[b]ld_beae_`jgc]eaaZdcfUcb^gafehif`_gdYbe_^dbjjkclg]bbfg]`hhcccaebbbcbdedecbcbcdacgbdbhceeebd`cd`cbfbedfaddab_dfdcceddaccbcc`hcbcec_eed`fabbcdcbccbdbdedecbcbbbcbeceeaeecbcbgcahccdcfeabcbeegcedecedehcead`eb`cbbdadcccbffecdfbdcdbcebfccccbbeddbbdbcffeedcaddacbd`bdcafa`bbffadacdcbbdcdba`dbegbdacddeac`bbddcbdcbcgdcfddcedebdccbdcddccbeccdccdbdddcbccccccdcccccbccbcdcddbdbbccdddccccccccdccccccdbcdbcddccdcbbbdcccccbcdbccbccccccdcdcccbbbecbeccccdcdbddccbeccccccccbdcbcdbbccdbcbbbcdccdbbcdcdcbcdcbdcbcdcdcdcdccccccdedcbcccccccccdccccccccbccdbdcccbdccccdcdcccbcabccbcecbcccdbcbcdc]Zcamlcf]gaac`eihcfqj`h\e]fc_]gd[a^jci\V[knXr\lap\]`hZYb]iea\dda`]n_aeTe``[`Y`g`dbZia^eeloedbcUUdhpakfi`gTk`]hkbfe_cei^\^`rb_k]agcl[Zeifhfe_afc_b_f[[ebYkgdal`bace^\dsfbcbec\gaWh[dccfl`iX`r^hig`^^g]q\fe_]lh[]g[dbhqd_ljXn]Pb_ai_bth\[S_\`ajV^hYkoZibijloZj_paijkkgehcafaa_gdbdgagh]]b[aikc\Zl\_jamoe]bd^``fcbb`ddXebdX``^`ag^_i]kbfb\h``cij`dejeedadZd`^ce_]fYaeleeZ^b[j^`f`cde[c`ad]heeYg^cfie]hc_fcegf_dabbjcb^adea^ji`e]_hghh[g\f[^]]`ehf_bldXi`]a_ocgfdfgch^h_bdfdbYf`caf``gdcdgWhheb\^edkcfcfUgddTbmcmX]b]hc[[``bg_gebee^_fi]cf]`fpgM`fiij`hiY[]i_icj^_fRX_aX`de\d]blg^bgkfk^jfchbc`dd_\nc]c^hai`q\nfifn_mZj`_[g[mdea[_ad`kd\agjhTgbeli^^][``ch][ie\ehYkk`a^g`_gdiZicd_i\hbdf\Yk\`[d\_Tddgal_`[^dUd\fhbd`li]\p[g][e]fffac^]icff^hdda\kh\iZ]_fcb`d\fca`ah]ffp\eceefgbdbk^i^_hmeadhfm_f\`k_`ghb_c^Ya`fdeYfiZkj^``ig``dbk_ib[icfi\r`ich]`i[`kY]gd\g[`d\d``bagZfe^lYcdb_ggba^_`bokco]T]Xdb]hbfa^bh`h`^h_hcY`cjmgdb_`mhcUY[gk\gakhk`cZ`mdZ_aig\^fndhaajbaegedadZ_bci`afdccadgbjch`ikafdfeaiqggem]^bafdbhgei_d`c^`ic]e_flaa[ab[ph^dbaecal``jahc`ddnhbX_c^ehY``hg`ceeZd]hfagYfifda]j]lafbqdciY\ob_S`afdY]\[_ugecdf\b`^Wfa{ggmigcm\Z`]be^cg]cddefpk^i^[jdh_^\b`hWZgpabe]_j]_]k^fga_ahcd`u]coeegddcZ]cdieadde\__adb_ebat\e\]g_bdbfi^Zh`dkcbe_h_eYe_Yi\hd]kd`fjfihc_he`daZ^g]bk`bUlbi`g]iZ_l`Ubif\ahYbY`ndk]`Zjli`aikgiaf_eiRb^R^nghltn_l_s\^]ne[^__`hcdcbqZagrhe]lhd^Z\a\j_cj`b`ibd_Vd_gebkahnomaf[g`ccb[\ej^Zfe`[bdX\i`ac]kWgjhZkjd_Z[dbfohigaaggbbc^Y^ecdcgflad_f_q\mkVha_ljddc^`gWe`[ad_\`]caabbeddb[i_f[cee`^gdihZaod[agdo_^dcim]i[]_]de]`ec`apj`eo]hjce]eaca_^bgdcfc[`gj`gWldcdc\gfmbgShefcelfgaeeadf`_dacdfcbcd_`fgb^afaad^bfac`f`fbbgcaa_cea_gecbcgcaaica_`^abaefecccc]fbbc`dd_c_bf^bcidabeaafb_gdfecg`bac`cbecd`i_bgbab`aadcdbic^bahci`b_cfbagecfd_acd`gabcdcdf`eed`bbhcbgged``facaedeecddbecfbfe_^afcc_ba`b``accaakacbfbddbhcbdec_ca`bacbcdf`e_e`abccb_bdc`c`]af_aYcfk^]Yhek]`dajdRfaae[cUalge]dflf\cghaf_\Wjadhhebcccaif`i^ceble_gc\]Z\cY^ke_c`g\_mda^YnbRedejida]da\^donZebabbefeqifjbeg^idYb`]de`Y]a_mmjb_kh^ahhehafcae]ckVb]`g^e[gXp^_ddk_kVf`f`S[hglc\ad^g`eh_`gf]hndcjmWad\bhfa```lcjdWggdlxda]`ccba]dQ`af_`d`cWje^cccccccccccdcccccccccccccccbcccccccccccccccccdcbcccccdcccccccccccdcccccccccccccdcdcbccccccccbccbcccccdccccccccccccccdccccddccdcccbccccccdccccccdccbcccccbccccccccccbccccccccccdccccccccbcccdccdccccccccccdccccccccccccbccccbcdccdccccdcbdccccccccccccbccdcccccccmf^tlcc`_[ibnea^c`adfS_]]\e_icUlfgi\b`V^f`slrjjTbhjh^reeaZabfloeXbsZdYcg_b[hekfd]dm_fcPYaqhQa\fdpak]kb^kmedfinbcX`bW^bg`cSs\Zbbj^eg^\]fgdnfhglaeah\\ibmd\heaicde``bdmlT^\cc_hcaihnidkZaggiWiYjelc]]ihef]]gcY^d[bfde^]`Rg_kb]v]\f_`_Tcgcb]Slk`rZ^[`d`aef^f[c`am^kcccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccce[cZhY\panbZek_c^ffb_celkbhahd\kgak_ce`baceb_[kmhfhklYTmb^efdU^hb_i[`[d_`ch``oca]`cabb[^dfcefc\bg^Zd`cigjei_bd^hb_a`ghg`ZiY^iaYc_d`[cc`jh`bbfe^``k_d^\]cc^a`kU`faekdkef`flac[hidgch_bdc`_d`rb`jh^leXg]fbgff\bpfag]i`d]`facd`agi\fZiih^b^k^``\fd^cfg^cZaakm\]nbiee_cbbkf^^c_[ijkfdacjc_dhgbhha`be`]`b\`cdffljgbc^fa_c]g`c^a_igd^bdfbbcce_^^]^kge\`d\cai^fgg^f]a`bibcjbece`ccbdZeh\bedef]faejWahdga^b^ba\aeda`Y\cedl_ebjfadadgia`i`\ajdbeYagiga[fbb`hckcaae`[jahifbgY]iegafbh_c_`f[e]_gf[fadbd`eadfaf`c_dXl]^hbf`_alkeaaca^bbc]fafgakcge_`]dWt_ZbbaW_`gihc[wgahdogpf[eZbbfb^jcf\ij`^gbUgbUdjgdhb^hdfWcZZT`gabkbe]`[]bdYcYe_SX^o]bbe[kjXceccd]rp__o]j_l_][l`boZbf_kYa]b`haofjh^ZhX`ab``\gheVcnhba]lab]dXggX[dgda^fgf]fYalZfdg`fcbZ`bedr]d_bg`dkc\Tmlaa`^ci]ncNgebYZ[`echtb]`eiggbaddoh]fhfah`ieXbedlbmbfka_mfnijj_ah``i_cY[]kme[ff^ikbihee`badadhaccic_]f]]b]]]jcaf^gi`g[^acfl`d``ebc^Ycde`a[Xdeedlh`dggcedeid[eije[db]dacf_bY[fhn]hh`nf_^b`hbfZb]]aee[agjafha\b`hfagff`chhhdkjebS]bha\d^d[ihkgkf]^h]dn\eged_hbibgdlij]fe^\cbZ_`]eh]fda_a`lakc_\f`cYbaci]acbfj`cgZk`aedce_o\cbgdqmm\h[t_j^Y^diP_g\do]q\b\^hbge]dhZ^e_fb_dd_oc\eZ``\ocdhjnct\dilVafXgbcl`b]^phe]hddb^oa_kfdcbVedhWj[flfmegc\XXcfgpg\ce[ichVle^ja\[klcdbdak`_MZgje\Tf^]YYoiscf]a_\ffbWde^cbfk`bdgQf[gX^eidia^kdef[h]cchdi[`ed`kjcr`i`X\\e[Zgak\f\hj`ll^hxd_a]^Wcmmg^hdeq_bYadeYlh^Zhfgkdcae[d\hm^ZceZ`b^db`f_aeh_j`iol_caccnU_Q_ebg\a_jbbmlcbc\bf^ai`UbU`_adaid]f_afTfadok`ffbba[bcj\^db`f`cdefeb`lb`\b`j[\\i^dhbb\Ygb[k]fjhd[icdib`kYmc\hkfbihobdkafeeajgdfeg^hXckgjg`b^c`nbibkcghdef\eifhhWhdfd\dgm\^en\abc`Zf^jjaca`lfiacd]\bjkf]gla^iadf`cb^mZijbcef[]eeaje__\uh^difppbogfelZS^bj[\k__cXifV]kd^foacb^ge^hdkjfm`bac]ogal`jZ[cefYheakj]^dopSbfaia^iijbg^i_adfd\ea\kg^e]cb_^e[da^ebd[Uk^ffidX_]hTdaidae__f`jY^cfib``d^^Zkeeha_^ar^[]f`nruoj_bkgfhVfecgYdZ_mg`p`a`ZiZ`ddg^i`fdgc_]]jdd_lfaU\`frbbb\]djVdvlZddfXbjlcehbalWbck_apbf]`pRkZdijdi^c^^kfag^c\k`hdrj]\\ibhgkaihe`a^dbg_cmg_\abkideSnUX\dbaijg[dbebccYrXi_XWlkZ_dadgfkgU``^lb^Qgl_Yhcf`_dZ^^c`fbbjcg_lcacWhdmefcb_\Sd`dbco^gi^\fdrZZfaf`_hf_djgZll\kga_cbc_g_agec]gae`k^`^YdadfVaQc_\db_^dqad_\_`abab_agqcgc`aa`^Wbh^fegU]bdd^d]jlbkibejbeacX\b_b`]melV\dee^]hc]eZ\PYsmnZb`k^gbcc]bak^cmbg[cnd`X[bfwc`b_bfibaYabmejed_j\delXfcTgcYcfhigbeaj^hiffngaf__`[d[fjnjkckfadaja_a`fbUf]_j[\e^if^Ud`Wp]\befkmeY^gk[hpahh`fZ]`k]c]id\_faldjrc]c`gWaXd`d^i^cdkeagl`bd`bdhhf\cg`d^enY`fd`cccccdccccccbcccccccccdccccbccccccccccdcccdcccccbccccccccccccccccdcccccccccbcccccccddccccccccccccdccbccccccccccccccccccccccccccccccccccccccbcdbcccccccccccccccccccdcccdcccccccccccdcccccccccdcccbccccccddcdccdcccccccccccccccccccccdccccccccccccccdbcccccccdcccc`bkj]W`mZb`elifijd\kehj_cgbnXckKkX_e_`dg`jdk[Ygfe_lZjZc[[`albidfcc[d_da_f[pUc`]d]^a`Xedtfaflan^`begejibb\TTd`jbnf^bfg`gdiaabWpaekR`k\jqt``hlbVbd^Zb_milX\]bdPwe`jtbVialih[a^_\cad\Y_]pfaf`p\lbd[mald_mgUXidif^`XadfZik_abdef_iYi_cfnag_[VW`bfd`_kgadjiYjTnjeogZ_Y^`g`cfn^a_^aieeRjg[b^c`dee_cr^^gY\b_dafodedcbk^e^d^[aeaj`X_^baj^kZe_l[emf^fge`]hefee]cnc`Z\dZlgi]iiggo_`cifpXa[cffg`kf[pdnYft`debg_mfWkccd_gehk_Ua^ffjcZda\lXceibcdac[e]`aanbla\hf``bm[gecl_bdj`e`jhechfcl][ZXh^VfleZfg_Wfglh`a_WmY^bcOam^ZXh_Zg_gZdVnfjgjdcdZb\b^c]gae`Y]arhmgrdcemY`Yfk\dag\Phfbep]hdjdh`^]bchad\d]ieZbYj`^\ckce`kccyadf`na\ggmbX_jdh_dag`h]lff]ihejc`]ebhb]hcZcf`cbaekb`bj[]dXd\`fZllca\\g_nblanscj[`dYeSk^Zmfd_cggbjg\fiencicaiUjg[ebihgbii`gbdcaecdbidd_gbenhYmbda^ag^^_defglhefg^gefbg[dgbai]f\`c\bdceb]^Zkae`d^`did]_Wa`[kd^ddh_f\[]h]kebccade[d]ncdqcdkce^ddgrigcj]`jejmX[\ljdjd`dgdckgfidackedg\a^f_d`W_jdg``\``^\abjkie`lkcdpc_cjakccae^gehq`ao\brchdaSf\]^^`Xbcdj\h]Wafj^geacb]dYihZYaj[dk\kcXfZb]c`Vfk`i_ih_a`f^hbh[k`okqWefWi`vad^k`_\kVdn`k_g_Xbc^eba_YgabZ`nW\]cbffcaccbeedbdcdbbdbbdaddafdfdabdaadcd`cdbcdcfacda``bebeacdaebfcabbcbhacdaafefcceee`bddafeecabbedebfcccdddgecccfabdccdccbcdc`cdddbfadcdbdefccdcaaf_fdd`bebf_cbdcddcdde_dfccaadacgdbdcdcadfccecbceaacbaedcd`cbcdcabcbdfec`aebb`adcbaebeecb`cgbcdccdcbd`caacbddcbbaecddbddbbcceecaedbecebdcecdcfdfcdecddaeddeecbedbbddebdebcddacebeccddcdddcdbcefbcbedbedccacdebbeecdebbccdbdcfebdddedecebfcccccdddccfefedceddcdddfcbdccdedccdd`fdbecdaabbcdbddebdcdedbeddfefcdddcccfcddbcaccacecbadfabddbgdddcdfdcfbbddeddeeedcccecec`ccdebdefbccaccccccccccccdccddccccccdcccdcccccccccccccccccccccccccdccccccccccccdccccccccccccccccccdcccccccccccccccccdcccccccdcccccccccccccccccccccccccccccccccccdcccccccccccccccccccccccccccccddccccccccccccdccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccZcfcY_bag`_hecegb_bdf_df_faefigZfbYc[d_fa_b^dcc]`gZ\gafXahc^ejchheUjfk^iccgiiaeckhbbbdgcaahgbca^_ef`Z]bdaaahjbc^^bggace`bdjicgih^`c]hhhgd^geffggaQ_^b`eg^`ic_hbbabac\g`c_dfdfadjfV^`aeda]cbc_cbZdgchacfb]jeaed_e_e[mhfmbgidccfa`dfbl]dc`^gacbc^fdcieiealh_kla`jcg]fhl]nd[h_p]e\k^b`\^\kbbP_ce\mzqiba[`Y^\h_hfdde_kYgbclkfn`l^hh_\jc_Ugd\ab[cfg]dYd_hjlXi[chdfacfifkZ_`\bg\nkc_dkfl_dmccnb\e\^`dgajaP]imZkhZh`jfbek_Z^ffejgbeomhh^^[``u[dcYf`a_]bdgba^^fUc`\b]ea]cqe[tfalbc[baY`bYf`ea_]~dbf\_n_^f]^bnSdU^[[cdc_i^lcZY^rcid`W_`]gccbcccbcccccdcccdcdccccccccbcccdbcdccccdcccccdcccccccddccbdcccccdbdbcccdcccdccdccccccccccbccccccccccccccccbcccccbccddcccdccdccccccccccccdddcdccbccccccbbccccccccccbdcccccdcbccdccccdcdcccccccdddccccccccccccccdccddccdccdbccccbbddcccccccccdcbccdcccccbbccccccdbhcjbb^`lccd^j^[cbf]cddgbcad`gaaiagdaba`afhcdfaicic^gbdfda_cc^cb_eaefbcehf`acbfeb`cceb`e_df_aaf\[d^ace`_efgfc`degaa`e_adbfe\ea^f^abi]d^d__adcfbaebkccfagcdcg_fff`_gbcg_dbbgaabhadfd]bfd[adf`e]ceejbdd_eecdbg`bjcal`c_ge_b^dgc_abgbdgdcY__efjabbdcae[ee`daid^bi`bhcccbdedcdecbdcbcbccccccdddddcddccdcdcdccddccdebdcddcddbacbddccdccdcccccddddcccdebbcccbcbeccbdbbdddddbcbcddcbdddecdecccbcccbbcbcebdddcddcccddddccdcbcacbbdfbdcbbccdbebbcebcdcbcccbbeedcbbcbdadbcdbcccccbdecbbdcedcbbdccccbbdbdccadcaba`ebbcccbcdcbddcceecddfccdddlZ^m]cmd`^b`\fZ\`fg\kfhgc^adgjZcfZhdicjimbgcj]^gbceh^maleggcece``j\f\ci\ff_fee]amigdhf^aad^gf^e\obc^YchYc]piijbh]nbh]d_albl^cdZ]bVhki^Yh\c^h\ji_`Z`aa\mYd]fc`h]cdkafce`haa_]ajk`edde[lciji_ci]hsgegTpfkgek_`caemhak\hb[iZ`_bkeXZfdcd^fba`]icb\`ef`Vd\ne`d]\d[a[Yhd_hc_ee_^difd^]_gf`hhf`^ba^`edagaj]Y\aabYa[db``fgh_`gnicgepbah[icihhg]ed^ahYg^dfhhda[^`lbkde`]bc___\`^bl`lfkbZ^gg_c\dcjec`dc`hcdefdc^dec_[Zfdabecgkib_mbajdi_Y``]ahefe\^]fa`ckf^_ab_X^__eZ`Xc^_eb^_i`emgdde]fdkbfbf]dicec^]lcchha`djhbed[caee_dhci`fa__e^Ylc`diW_k_idiidebih_Ze[f_f_fef`X_ksbdxd]Uad[dgijjhbjkcdfXkc^[eale[dfp`[j_fXak_f_ddda]dXd`]dj`]ead^adiim_j]g`cmi[bkdYgfh_j`b`k`b_X`btdebjci_aie__hhmbldjpjafddcVc`a`b`[kgYgf[a^b^[^df^\g\gbihcipgij^^`e\fadc]eU]hacffpki\jnZ_ah^amhpi`e`g\]g^b_fd^g]hZbZiZcf__Y[]j\^qeld_]a`\^]_^daYbednffhkh^b`co]kj___VgdW`jdbXmgiba]fhXfa\TckWpredfcXbff^X[Qgf^i`hef\ab_fZaQmkZYk]kk_h\emjcehd`[Vce]gacbb]ddicf]fg_caemmcgY`dfgba]bj`o_hbibcU[[ZdkXfpgdeihgf`ldgg_jnW^ffhfjocjdp_mnom\cbYa]Ykgjde_`dr_g[e]iIib^odg[eZjo^^o]Z\Vhdaj\\iba`]i\Yb\pbgili]_ddijbe`b^ca][``ad^d^ig]pfmd[ZmfcZcfj_cdhbcq_l`Ygda^lcjgchj`bgdZc[[[ZadeceZglbc`keih]c\b^gXgab\c`la[^bbakaabbbfi^g`gg\c_gyfek_b[eedU`fbgeeaeadbcna_cg]`dnTa^^gfgg_ja`m]e]\aich]dfdeadhdhb`nacjf`Ybjcbckd`]egfl^`aek_`gkcbT\id_gb_o`alga[jqe]\b^bfc`Teh^kXcV^_dbeZf]\ogci^fRdigWcfmmafcjvaelYad`hZpcWct^ld[pXUci_NXj`Thdc[aa`Qh`X`ic^kl_`if^Y\a\U\hchlcZ`hWfgngek_Weoj_mUc\ZegZdkeg}ha_abbSajcXugXpaWaWbY\aXbhelmgkol_[c]cd`kh``kf]ndgt`pbc^f`]naad`daSheRjfjadehdsbfg^Wa^YY]eUXmVTQhkeZcn\ahY]`j\[bcWb^[[an^fbeefcgnbgki]fYgfjge_m\]gg^^[u_WaX`jc`ka_bZe__`dieknbrVbllfab[_nb_]p^]gjedegme^dl`hh_]fge_YbeRg_aX^mjRd_gj\d^dd^qcb_offhc[e`ep]Zded_hhe`bg_`]_f^_hbbgbeaeb^e_`bfhif_k``kaZjd]ccak]e]bZef^f^gackme^n_ge\_fflcdZ_ccj_bkqfime^_Zberhm^dVYa^bjaiZlZa_^jl^c^[]`ejjakec_eXhdaf_euhdha_b`cXj\gehh^d_hsb`_\jehakacehlacf^bfeahgdg`facVbh\dn_bZjoh]aed^bg^ejh`Ziic_Zai__chjagga]ZfXabaajfWad^fje`\ebha`g]icZ[^aZfkf_mn^hckheela]j]]`cldii[`ddiibdggcha\h_^^fdYkXce^^Zbaiba_^``d`jkf]bWeja_h\_hf`s`\g_[_c_Zgha\fq`[dab`i^h_fadji_^kiicefgbccc`ch_X`^[^_`dbe[mk_b][ndgad`i_did]gbfchhcdZimgb]Wjd_[fgg]k_agff`e[[edfj[k]eiZiV`e]cjc_cifgW]d`bZY^h_Zj]gb^a`iblX]Tc`hdbn]feei`lileafYYabYm\bkff[k`j`dg_h]l_cWkbgZgik_]g`aj[kh\bcc^`[dj^gagf_gahbehb_jjfdh`Za]\affl^Vajjf]jghf`edf_gn^s`\cldhj\[^^ec^ZbdZif`hZU^d`ljkj_b^jgiqfk_i`YdWrqhkhXdYadi^hk`]bholdj[]f\cebfekhg`n__kbc^]ec^d^bid^c^gfajefbldmiccfha]k]jf`bhkcaoahb\mbaibfc]]p^c`fkd^lZfggl`hb\f^ddabbdaY_cidde_V__dl[d`nh`Yhm_^ikaf^ehf^`fegadhgg_`ehfaiidfedmgi`a^[mfhgabg^_bct^Y`hdbbff`\[eccbcYch]kbYbggeXfc[ih]_b`caif``iabahab]jb_`^``mbagf[ddb]edanaj^^eb^jdea^cna]Wfkf]dddhicglY``ffZ`^d^hjd^gZ]aidgcn^ZhddZ^gd^chc`b_de_cgdb`l`jdg]la^^ddc_^Udf[\g\`eeh]a_h_cbg[jjcafce^fhbc^[cimiebcfd]ok``jcf`dicfh`a`kYgck^gbcbcf\ide_`blb^dj_bZ``ldbeX]ed_eccmebl`d]]]dm]_`c^bnf_b_aei^^a]hkecqgYZ`^^mglfgfb^gocr[elgk^^efh`\ifd[igmbqdmgd`f^\m_\ah^bUb^ofh_eaXdffea]]adi`fla[ienjbaghmdd_c]i\cii[\ipkkbaW^qei[YfcgbZifc`cmc]^hX\ld[e^`ajbdi^Yiif[deh\jde_`\jd^`wWa_gacfgWU`bs\_gd^ed^aafccc^richf`jaf[ic\\lVkg^g\]hltalek``dbee^Z]fTshaeof`_a__[_ceahi`ifZdi`^ldd`jbb`caikghQaaiq\Xlec[[ah^c\_okr^`\ed\hi_n^^amfkjWgbX`bac\b][`U^XYZeaVjbin``acl]cef_fci]Y`fPibc`d^hn^\laau\ma]\jecgddcamddY^aic[bY[`hZjTflef]hfaj^i^h^]jmSh[d]deibZhf^_V]Th_dTcbjdZibp[]`chcje[fee_TadlhijbYgcei`heeYg^YY^[pVp`YdSZ[\k[YeeZYbiiec\en_n[^cb_og`X^cpgr``be[bcZbl`rh`kd_rXdji]`Zbkbadjk_Qbe[Oedifecnji^ebceb^bfdpY\z[ba_[_hme`iZZclihikdgkS_h]^fijldb[X`^h]`a_Z^fi]ibahgeVc[hfeecTWganf[hjtVd^Zqnhjj_fgZhWhgkheZdbXg[kTab_bbXddl^Rf\h\a\_^hhmfdehlagg\blMjn_m^bkVh`Yg[W_eXQam^fj_e]erdhcg]h`e\^bh_t`k\e`PYaibk\a]hce^Tdcegbbecd_heg^`hd_b^ccdebj]abfeiha]gge`_blaafcghbfecicgchdjjc]deadab]cc`k^fcce^bghcbiebdbjejabobeac_agga_ai_e`_`ahaac\Yceb[aehb`d`adcebifbdhcgaa`cbbcdcaWhacjhil]cffbefa^hg_g`d_gec^e][`egee_ei]bdYcdc_dh`be[dhhehf_gd`\fd\cdhi^eckad`Zfdb^bacfc_ibddccbai_bececegbfgeechadnYa`aZ_`nddj\if[__hcf`cni_cjcgi_``d^cgbchhi^j\a_^^khcZcccajdf_d[c`edac^bnfcibhgjiiZn_f^cdZahgbf[cakl\jcd`X_keca[gbbfag]_ch_aiihbf_b\dd`caceedibe]^\`vj^ee`b^f]cf[d^bb`Yembd_gggdac\_cg^ddfdk^ndbj`dfea_acabg``ji`aambhb__cgidag^`\bchkeabch\ab_`Xci]fdcfZfbcb`ehafefdefecfbbfccdeaabcceccaacba`ce_d`bdcbeecd_cab`cie`hcebfdcaheddf`fcbccabbfhfc`bcbfcefcgebacedcbeedbcccdgdedceedccdefhccebgfdfbdbddcdaeajcbdebecdcdddcbdbbfccacbfadfbfcbccebcbfabdaecfa`begcd``ddcfdeagdbbfcbdffdedc`bacddaebdececdc`f`caegbbbbccbdeebeacabcbcbbcdcdbcabbabcacddcdbdbcccbbcacbcccccbccadcccbbcdccbcbdcbbccbcdccdbdcbbbcbbcbcbbbcbcbcccbbccbccbbbcbacbcbbccdcbdbbccbcdcbccccccdcbccbcbccccdcbcccabdbaccdcbbbcbbcbccacccdcdcccbcdccbcbcbcaccccbcccbccdcccdbecbebdccbbbbcbcbbcbdbbdbccdccccaccbbcbdbbcdbbcbcbdcbccccccdcdcdbdcddcccccccccccbddbcdbbccbcccdbbcccccccceccbcbcccddbdcbcbdcbbdbccbccccbcdbcbcacdccccbccccbdbbbdccdbdbdcbcccbcbbcbbcecccbcccccdcbdbcdcccbcbaccbddccbccdbccbddddccdbcccbccddbcbbdccdcccccbcccccbccbbdcccdccbcbcdcbccccccdbbccacdecccbcccdcbbccbcbcccgec^]`gfah_Ygd\b]hbca`hhb\glc\kubehb_lZ^bg^_nWdae[Y_aXjabdc]cbbc`ckbah]cafZebiief_^hhgc]mc^nlf\efa]WhWbbehbengmeg`ahcbai`YVa`XiYlakcegVahjdb_hea_l\XcX_\Zec\]hldd^hkkde`f`\^^`h_`ic_Yhgbi\age`dgbr^^ggZh`W_kec^bd[pbeaYh]^dga`ifpb`lgaa^fdTghZcbXp[defhhlebd``eZ[ql_`W[i^e]_he_hk\bce]aX\bad_e]afabfp`^^djhcl\klcbdZfdi[o^bfa``Zb^fdmhfi`gj`cd]\^r\`]]^cmgcheZevd`lk\_ihq^hfZogbhh^abgbhUjbcmefUegbii]PamuZ__d^eejd_hdbmcafcib^mYgdg^`]an_acec[e[cicbdUY^df]ba]b[\dfMb`_eYeee_b]]ieiffd[incdZ\ej_bc^eR^ifhbci\]^aaif``eaaWaxflcbcadd]af\d^bc`ddYcie`ea`c_`cccedhbf`e]bcdcb_edeed]adgcdb]]akmdbaf`fb`ceedcccec_\hZda_cgebbdd_ecb_daahaaa`dadefbhs``hee\chjea_`jbhfdebi_d_g`_i[bagjmee\e_^[fbahfaffjbhVg\Vega^jbfhgdfd_a`]gidZe_kgcbggdb[hocehkY^gfc`\dc`cjejbc`\_ahpd]eh]Zaibbggd^gc\fdd^hclbf_e`dfgh\\]afdjedjdfc]df`gUb_m`eeebbgf`cd_c[_bhbahk\acehai\^bX]dbea`^bi`Zde[dli`ckbg\e_abdcUdfl^hcjeccid``bhmfc[ejakjdc``^ci`fkjae_back`dhfe``a]c_^fddY__cZbb^b^i^cmbae\``fbhfh_Zd_gliifa\cdagi_fog]hYgfZZfebfcge^`degbjbdgcqbX_eha_agab`gipmch_]\eZccj`jbdaf_d_gbeedebcc`ebdcbcbbddcdfecdgeebcddcc`cfe`bcacfcccbbadedcddcabbbeacdccedcdbbddabbeefeaddccdfbeafdcddc`ddddfcee`ceccaafd_bccbhdcebcadcccaecbdb`ccdebcdadgeacbafb`bdb`cdb`edecbedcbb`e_ecbd`c`ecdebfbdedcebcccf`cfdbdfdabdabbdbccdbhcbgabb^babcccc^edccbdaccccabcbaeadfgdcccdcbdccccccccccbcddcbccbbcbcccdcccbccccccccccbccccdcdcccbccccbdcdccccccccbccccccccccbbccccccccbccccbccccbcdccdcbbccbcdbbcccccccdccdccccccccccccbcbcdcdcdcdccccccccddccccccccbccccdccccccccccccbccccccdcccbccccccccccccbeccccddccccbbccccbcdccbcdbdcbbdcccccccfg_hf]X]gggccke`aah]kfb^^ddVbf]V_]gjs`a]^WfTfdah^mec_wPm]eddd]a\]__^i]]ZlcldZ_o_enbWXTf_]dffcXckeecafdrd\ZdXXhVicUd\]j\dghWeYZ\ja`gd^mcofWX\^aiag`d__ceeb``a[fde_]_ZialjUZ`l[ce^aa\hg_`ag[^q`qmnvX`mcdflppaahZfdnaerbd`Ynm`]bjg[gcgafe]yfcfoj[hhjalcggYddkVndjcf^iicc^i\^`_fd[gd^b[i]d`Zaoehgalfbb`dX_`gd\]kgeg\Zck]]f`]\[fo]cfo^^adfb\Xb^kh`\gfSf][jcbi`gc]\`gdkY^diU\bdcPic]i]_]ge``djoeJd]tdd]cgidcgagihffcakd[epkrajZfbcigebfnb^`a_kgk``v\kn_d[jj\fercpad_ke_``i[]daffehgc_Yl]kUi_dff]r[bo\^`fmlOf`J[fk]ehe_d`a^febXbfdaoeb[ccbbddcdcbcacdbdddc`bcdcadccccbbccbccccbddcddccccbccdcdccbbdbcacdecbbcbdcebcaddadcccdbceccbbbbbcebcdcccdccbbdcdbdcdcddbcbebbdbbbbbbddcdcdbcacbcbceddcdbcddbdddcccecdbaccddbbdbbcebbccccddcccccddcddcdcbbccededdabbbdccbcbccdcbbccdddcbebccbdecddcedcadddccddcccb^qpib`]qVkj^ohbh\fbcdkcSgaaddh^[k`jaf^fXU^fhv_gWe[ehdjeabkhk_cRY\]rYC]Z[[gl]ijh[UYbYiZkcdg[jhkT{i_at^fa`_iVffseipm`jhlaiU^ahbZkVef_hUn`qjqhg`XXHgdagadaZY`abcran[\^Xeh^^w_e_i]i]gp_]jaYea\a_dZcheRNcSxXfj\_bdfe`c_rVajS^n_`m_N`hxc]WgGhfkeXh`\_od]l^epe^akcWhibdhfbdciegadc_i``dgce]gga``ccfdc^nabebciaecf[fg_abd`gamb_di\icfedfaelbb_d`bedadeZl]^hae``hbd\c]_aig_`a_be`hfd`bf`nebb_ehaehb]b_]fbfcfb\c_fbbdgcf_d_aech]fag_daeceeebie^ad^]dadh`ceahaa^jcbigfcf\bdg_fbbeane]ddb[eda`j\dhZdajjd^dceehfac]aab^cf^]ea__b`bgf[djh`edeecccccdcdccdcccccccccdcbcccccddccddccdcdcddccdcdcbcccdccbcccdcdccbccccccdcdcdbcbcccdddccddcdccccccccdcccccdcccdcdcccdcdccccdddccccccccccddbdcccccddcccccccbbcccdcddcccccdddcdccddccddcccccccdccddcccdcccddcdcccddccccdcccdcccddcccbcccdccccdbdcdddcccccccddccdcdccddbbbddbcccdcdcccdbbbbbcaccccdcbcccbbbebccccbdccbbcccacdbcccbbbddccbccbbcdccbcbcbbbcccdccccccbcccbdbcbcbcbbcbceccdcdcccccaaadcccbdcddbcbcbcbbccddbccbccbcdcdcbcccccccccbbcbbbdccbbcccadccbbcccbccbdcccbbcdcdcbcddbbccbbcccdcbcbcdcbcbcbcbbcccccbccbdccbcbdcbbbc]bcdlhXf\_a\cga^ec\[dh[V`dh\^b\i_abgpbZ`bo_[bXie_ff\ne<_q^dgb`_f^fb\^bd]Xfbhf^]f_bVbcfcchc\ViSgcbabl`c^jb_WZ_ebt_Zdkbk`fW^f^bh]Wlgrade\kia]bYacebxWla`^ge`_eaRchaxZgodqcj[W`fcTf`fgfbjZf^cadhfhXdr```\`_Wjf\\_cg`frh_Uccj]^_jbefjek\Zahd}h^a\i]fehZbYe]oe`mfcefmh_h]e_[h]ccedba_je]bgee^n^`]f^Yhh\^lkf\`fi][g\ileleifljbb[^^bbbhacef`bheic^daecjheg`edb`^cighf[daggdgcddglYea[\Zcb]_eck]jgigZe\accfc[dnZ^^`dg[jb]daebca_dfb^heh^_jefce`idba]nabc`_cd`efT^d\skf]i`ba`dkhZ^`e[c`_kZbh\ig_had`c[he^_[i_dfmjdbcchcdb]db``hig]dqbW^ebfcbaddgdbacdaece_aaheg_dcagebbd`cbbdbadbcbaeeeedaaiafn_bdddbgcc\gbecbcecbbbb`cacegieb`d`dcebdaaffbbaccd^efcb_`dg^bcaaefjebeaicfdceb\ce_d`aebdebfegcccedccec`ha^dddf_ddabbbbg\deacabkeaade__acceebdbcbiaaedbbedbc`bcdfgdebhfbdafecdbf^beeeh_dbbfc_h`icabccbfad`de^dwidcbdaXjWgfd]_YaajZYcrccdkagrjZgh]kXWfkfbhkdchdic`Xii`YgX^cca_b\Md`T\e^[uo`hjk\g^hd`^Y^ce`e^]Zldck\dgclb\hYjknab]acr]hzggb[\icl`hajh]bWkdc_][adi_iOcmk`fYd_nim\jkjaeg^^facddc^ggk_hd]Zdorjedbb\lgdnVhe[ia]`egbak^cfpqaZbaf[dj]b`[ehmbdbc]ek]ib`_YbfbfYi^Tbfgcbdcbadbccbcccbbabddccdcccccbdddccdcceccbccbcccdcbccccbcbcdccccbbdcbcbcccbcbbccccbcdccbbeccccbccdccdbcccbccbbcbdcbdcdcbcabdccaceccbbbbcccccabccbdccddbbabcdcbbcbdbbdcccccbccbbbcbbbbcdbbcccecccdcccbccccdcccccbcccbcbccccdbcbcdbbcbccbccdccccbbbbbcbedbccdcbbcbdjebadqaaec]]bcYjbaf`e]gddbhmkge`ddeh^hZie_ggZcsabZa`df^agRg\^gbd^aje`Y]Z`ciei^bd^cnijda^_bj]b\ffg^i_bgkj^jd\_a_Yd\]`ah^idl_egYbjgb`]aa_d[aX]cb^gefcdbZ]ad`bfZXhdjfdhX`]kbba[^jkdejceh]Z^jcghamccb^]l__eYicebci^ciYbf__hbjc^]gdekgia`^ia_a^f]ZgjUbc^cc`ldee_^ecjgiT]e]hkcZcja__d_cccif_dcgYdU_badlhda_dXhh_d\V\\bfpec\fc`eegfegf\jlh]c^bmZbWpaddfgdieklb^Wij]ckfN_`heabgcdXg`ckbgcdegiec]e]fiefUcjicQk[i]ej\_cjliff^e[`f]jbgddip^\eb_]pSiadea`cbch_\cd\p[`ha\Uhebj_bfxjkd]icYf_bhph_[dfdmddndie[acgahich[__ig\dfjcci]gbafcp`YoY\aaddcg]af`fabadadchc_dbied^dbcgc`bbcbcabefdf`b`deagccadbfe`bfbecaecbd`c`bcdcdedgedebcfdbhcbbeda``db`afbddadc`addadacfcfeade__dedc`gf_gabdedbfae`dedc_abced`ecebadbabafgdbc`e_bcddccabdgaddc`f^dcfbef_ecddecfccfcbfdbcacadagcaeaabfdgdacaeiabacffad`f^e`f`edbcgeeecccb`bcbdbcbcbbadbbcbdccccacbaaeccafbfbdbdbccabdbbedd`adbcbbbdebbdbbacecaaddecdcccaccccccbcbddddacbbaacceababdadbdgacbbd`ecccbcccd`cbbddcccccddbefecdecabhddbdafdbdecccccccac`cdcbcdbcacccbdbacbccccbf`eccbbfcebbdcebbdccdbbacedccbdebdddccgbecdbcdbadccdcfadcaaccccbdbcccccccdccdccbcccccdccdbbcdcbccbccccccccccccbcccccdccccccdccdccccdcddccdcdccdccccccdccccdcdcbdbcdbdccccccccccbcdccdddcccccccccccbcccdccccbcdcdccbdbcccccddddccdcddcdcbbdcdccccccbcccccdccccccbcccdcccccbbcccccbcddcccdccccccccccdddcbcccdccccdccdcccdcccccb\hma_j__fh^feakp\eeh`agaeedjhh]`beh]\bg_icZ`cf`h`e[dSkab\kc]gcd]db`cef_^hd^haeehbg\[_]efa]fdb^eka]deflj^k]_ifb_b^[gfea^ejfeabchg\_cb[`^_`hZdggdngff``hb``dj`ffbaa]hboa_`^bYl\accef`d^p_c`s_fkdjaib[cg\dgqebgf\oZaeaadZhhjmcdb[]dahh[bhdNa^hdeaikcgaabcdV\`e`bcnkbpl`jk_bZ^Xib^Zg]]^hkdpueea_dd{eqeealaoddlZiZZdglg[bdja^c\g]g\cja`Yb_]ijfUk]`j^iqlb`\f\a`ckb]e^a_fgb]bar`V_^Z_ddc\olin[cJXapea^acjcb`d]]`ddfTifb[]gmhZqaZc[g^bb^``ejlcbX^`_agm[igb]d]l^d^]pcbkYndhdicacZ^k]_bghhdg]Zmmbd_]e`cmZd\TSwebhkgicuf`ec_f[^dbY]fki^i]bijgZ_\_hhaLd^_ba_fjbcdjciof_li_Ydbf[d_cfZ`_ofbdegc_jZkagrpbgf_Xa`kamd__ffda``nepdla_^a^macieaXcYdbec\Y_bgfZejjgb^aeidY]faiWdbleq`]kZec_hok_h`c]a]gc_g\`TgY^Yrb\hafd]c\bhcefa^ed`^b[hcrda`X_m`hahcmgnhaa]fc^jhekYjd^laZa[]fgmbeaneeiiceY]dZi]\^f`eig_iXidofeVcsacccccdcccdccccccbccccdcccccccccdcdcccccccccccccccccccbcdccccccccccccccccccbccccccccdccccccbccdcccccccccddcddcccccdcdccccccbcdcccccbdccccccccccccccccccccccccdccccccddccdcccccccccddcbccbcdccdcccbccccccdcccccccccccdcccdcbccccccccccccccddccccdcccccbccccdcccccchaefbbbZgckkbd[Zdfm]_clb`X`j^hu\YbkaglgjY_j`bc[e]a]^^dbZdSaSYdgthgfnqcf]\ktbdaXY_YocXke\]]jmbZY^ebfYc^hfK`g_Zhi[XdkggghVe`\bZdYdf`mea[haWUc_ec\hekkdvaklgahjYdjgTojm^hed[\j_gbY\Y\Xef`[^\YdibqaXeZ_flbkbchbc`^fdcgbnc_hYdbqkgnok__`fYgbdlk^\ihelkdf``]eXnhcsiZge```abefcY__Shbcgeb_eiac_aae_g[bhf]m_`k\bieYgaZa_ea\fa[alf\af\e_ihed`_]bf_cagopfbmahfhejcXh^[bdpdbia^^fbbef]]bcajn_jajghakg[_f`hl^i\^gcaecfccc`ebcbfdhaa^lg[hflh[dhfheV\bYl]`h]od_d`_`f_cjebd]emhe^^gaod]h_cabhY_g^\jmp]][hega\jdm^jfbci]hcfjhc`cec[be[^cdbha^aeacccccccccccccbcdcdccccccdccbccccccdcdcbcccccccccccccccdccccccccddcccdccdcccdccdccccccdccccbccccccccccbcccccccccccccccbccccccddccddcccccccccccccdccccbcdcccccccccccbccccccccccccdcccccccbdcccccccccccccdcccccccbdccdcccccccdccccccccdcbcdcccccccccccbcbccbcccdccc]^niT_p^cc]iheW^eigkhammberbbmj\aZCmbcWdefbqj\eie^bZZj]bbpdjea_bfdSfkZd[^gv\gffRanZL_ea_iegecgebukVVc_\bg^Zabumf_`gfcaj[Waqc`lgm`\]_fndcsj]kabrf[mk[jtg``Z`aXlblXec^repg`YeYpdZ]bkj^Smihmbnpccdrsom_ZlqKc][kb[hPceacbdQedr]faca]`afhYgfbaaz^iadj_bgW[d_\NZmg^pd\cc`kiiod[eckRbef^ofjY{fTa`hEVpcqkkjffa`bdddoNs]_gbleYqmdc]_]e_vejkckeffdVW^k\]jh^[k^lZliod\cjikhdfdqlf^^jdq^ZadHdlb[hbqYcdecemb`Zx[ckZ^X_mfjt]^`nTe_ksejo]_]|[fc^if]epfX`h^j[ja`^`c^]iZl`YdWZgboiShX\gfbi[g\^^dfXoXncWo_jZk_cleaJ\`fkW]\_ire[qXZc^g[eU_[`cactfPii\cked]]h]]bfgibd]e]ejbefvg]l^Zchd\cifeda\i`b^V`af`i_b_cc_^bhbbkfbYZp_^g\djgogddgibcea`[cZibkde]^`\]c`d]dfd[_i\d_]g_dbdadkf]cbd`_c`_g^dc[aa_blekal\ghfa^bi\e^b\e_gc`bgm_dd[geffc][f^[jnf_dijcolnhbi]gdckhWbbd`a\in^pcblfk[WaYadk_\ag`rghd\jc`md`hi`^ah[[i]aid]^ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccbcbbccbbcccadfdcdccbcbccbcccdcccbccccdcdbccdccddbcdccccbbbdccccccbdccccbebcbcddcdcbcdcdbccaccbcbbcbebdbccccccdddcdcccdbdcbccccccbccdcbcccddccbcccbccbaccbbdccddbddcbcbdccccbcccbdbcadcccdccbcddabbccbccccdcdcdbbebecbccddceccbbdbccccccbccdcdcbccdbccccdbcbbcccccccccccccccccccccccccbcccccccccccccccccccccccccccccbcdcbccdccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccbcccccccccccccbcccccccccccccccccccccccccccccccccbcccccccccccccccccccccccccccccccccccccccccccbcccccccccbcbcccccccccccbahbcedfdddedacfdbbdecbbbadbbbfcbcdedaecdddebbcaacadbabecc`bddacbfbcbfbcddacfdbf_ecbcc`bbbbcbaddeaebcdbceaaedceeecedcc`dfabcdaddd`ddbdccdec`ccaecb_bbcbbag`ebcdfdd`dcbbddcbbeahcecdeccdceefcccccadddcc`dfcbdfbecbbdaedadbedccfcddfddccdbcccabcccacbb`befbeg`cbe^cccccccccccccdcccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccdccccccccccccccccccccccccccccccccccccamg`b_Wbe_Sj_feb\dj\]hdd`]]se_cc[mec^Zg`ej^flemckjehfacm^jh[bi`idj`pNdgZiiagOed]Hc^^So_i[Tdb``hje[^dd\n_d_[a^]Zbecb[VahmjaUb^cjfibfdfmiild_dhb^dedkc`hdofgbe\gaob\`n`b^\gacgY_`df\nckSLfcggadgcb_l\fj_]hgdZgbWgn^lhq[^`stc^d_liig[dW`h``duacjmfhjo_jccndhs`hc]j`ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccdccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc[iao^YnKjbkYnqgZef_mh>k_dWUljk][g]^Wk\ckieiwn__effmVnbgV^m][faf[abk^nTagnnj`kt][]bcZ`g]dNcqdd``pn\dda]ee`d\fWsZhg]cZgb\hfTcOQfTbaZel[bppjcZeXfee\ca^b]bbw[hh_qj[r\hhieXb\ie^ffT^`^ffrZfhie[fmcVmh_[bgau[^cZ[eOhrbcfguf`r`ddgc[`iu`fYbkj[ajaqcgaj_^kaas_\^tWt^phhccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccdcccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccjljcdTby^YfjccU`gcs\^o\X[UaggwndUVi[SfVg]ke`Se`feabbgeT]^_fcm`eYcYkajf^[\cZgcnbd`_bfdgp^bgVhdn_]^bcjdWX\dda]]og^^mbla`achcja`^uZd^lj_]cgeil_gYkj]xngh]ceQ_a`wjk`Zj`wlX_ZcgleYe_dj`__^b\S]hfa\^d\okcfWgcNgnn_idZZj^iihllJ^bodbe[eYf]fcVfd]_mdWm[aXSabg[^W_hcpqecegg`_\Xha^\`agXa\jcail_dmfRf\`egaY^e_Z`cqkejV]l_fdo``f]ka[p_]a]iX_fbaldaq\aPgZkjimc^cb`l^aXde[doWadVdkjdYkJcc\bc\ge`_]``]dgjkt]g\ngiZf`kidb_]]boflacjTYe_fcdbgiaZhc^c^]Wkcefcbdld][ddfijecf_bWadejh^glahXX[g^\cfaj`]d]fbaYdk^b_`eeaiehc_ic^bfjg_hh[``j`d_dhcbmkpcdccccdcdbdddecceddbdedcbbcbcccc`decdccdcccbcdeccdcccccbbbdcbbccbcebcccccddbcccddedddcbddcdbdccccdcccdcccbcccbbcbcbdcccdcddcccdddcbddddddebdbccdcccccdcccccbdbcdcccccdccddcdacbcccdcdccdbcccbcccdcdbdcdccbcccdcddccdbdbbedcdcddcbddcccccabccccdddbcccddcccdcccdcccjkibeeie^aaj]]\Ygpceo_]bbwchmg[\a[dfah`[ka]\o[kWXXhibW]Tn[^inilbhZchT]i]^Zxechkfl_d`Z_i_amhh\WgYjcpabcdeVcTqose_X\fWdhe_fgi[dplBlfeccrTyb^`fZeYc_Sobh\V]k`Kt_^bhclhNV_^efeakc_Zr[`ftg`kildjg_]ec^oiemPcg\[]d\`xjgGa|PMXbr`e_dgaaag_f]ehe\c]bcR^\UagUY\Z[eVY^cibdbc`acedcaaddecadccaeeebdacae`dbfbcccecddbbcaddbabadbdddgad`baaegbedbcaeedeecbagbhe^bdfafbacecc_cfdabcbeegcdaeadeddfbcbd`ebdbfad_edbb``bbdccddbddgaacccddgeffcdedffgcedcaeadb_ae_fccef]bccacaacbeaeb`bdddb`adedc`bdcgd_aaccddeebddeddddc`acfcced`ffdcbebbce``cdTgdmhtQ_f_emkhefea_`ifad]hi_flcp_ZQdsi[Zmc\c`ffhYYWfm\\b^p^ei_iiaYU`i^jldecbmj]a[e\WiibYfdjc]odpj`e^gkckv_fcbafe[idZbZaX]^lblan__h[^\gjjnghaYgdfkemcjf`sgg\`doajeW^nchgjdfcjbm\fg^t_^W]afhcnd\l[`\nn]diQc[dWc`f]ahiqYceZhjebd^X^\Y^al]f_b[c^^njN]daachbiddg^ckfgccbccccccccccbcbcccccccccccccccccccbcccccccbcccccccccdcccccccccccdccccccccccccccccccccccccccccbcccccccccccccbbbdccccbdcccbcdccbccccccccbccbcbcccccccccccccbccccbccbbccccccbccccccccccccccdccccccccccccccccccccccccccccccccccccccccdccccccddcbccbccccccccccccccccfddd`^cbl`c\_djkaib_bd\bddbYded[fb[`cai^i\gabcfcerh`hcca^bhaddf\e_Wcnihdf`^g\ccnhhbccYf]d`jfe_d\\c_ele`fkVh`bi\\eTe`ieafnhhfag^lcdacdeng`b`_kcbkca_bZea^aZifacXecabXadb]Yfcedeeb\^b[_`iibe^^dhaleededYfcbjaajbadh[ehbic_ffkYabchffjfdcacac_m`iaeccfbhd^adebibaliccccccccccccccccccccbccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccbccccccccccccccccccccccccccccccccccccccccbcccbccccccccccccccccccccccccbccccbccccccccccbccccccccccccccccccccccccccccccccdcccccccccccccbccccccccccccccccadccbcfcdcacbbdecdabadcdbe`cbddc`edb`ccddecbbc_e_bdcbbfcaadfbdeedbccbcbdba_bfeececddddebdece`dabbaeedeffccecadceccdbbfceeccdce`dbbcfacafhb_baeaabbbdccdcddadcbccbcfdcadddcbcbbcbeeceddcbedfccbccefaadebcgccdcdad_cbabed_dbfebcbcaedc`cbbe_adacca`cgc`ccbcbdbc_edcjomincffinangi^cfaZehafhc`b^`y^\foag_a^ji`dVc_c_aeXda[aReZahgir`]aaca``geme^g^`^`dcbmmWejgcfdi\g^`jk\djbgjb^gdmfhd^jgXg[Zah][Q]ag```m[aa^ak[gbeYmke[`Y\d]Z`dmb``ZgrbijXdb_jb`[bibTaiedWdfdiUa]ifXfmegi`h`e]eealkigVqch_K[]^k^Z^ZdSkc`dea]]_fdldcfciZ[i`aagk[qdccdbcddddccccccdccccdcccccdbccccdcccccdbccbdbcccbbcbbbbbccbbcdcccccccbbbcccdcccbccccccbddcccccdbccccdccdcdccdcedcbdcdccccbcbbccdbdccccdcccccccdcdddcbcbbccbbdcccbbccdcccdccccbccccccdbcccdcdccccdcdcdcbccccbccccccbcdccdddcdccdccbccbadddcccddccbddddbdbdccbbcc_h]e_pm^chfV^gf^hb[a]`f`ekfa^`\ba`bjk^_aclZc_\\^^]bZbjjogdki`Zeeifs`cddlS^bb[[beg_ao_dg`fidZdbf^c_dnfiXiZiWegcdilXcsha^h]ane^ndgelaf_ch`a_`dYh_hh~Yhai^aedhhd\gfai[ahfwb[ae[coYbbfcdc^^f]d^`_f]egVem\khg\\ej_`hicb`l`_ecjdb^a\cb`lbaZfe\gglco`fj^hkbdc`XoXgebb`ijib_ijbmghfeh_e^k]bnk_]ehebcbaeeUlfZbffciXi_kcebdjY]kY]aWakbffeUbfnejfWrfehedk]kYXX_bbjdgePc_dj_Zm[keheYrgef`lko_aib\[cdo`iek_jke[ef\Wfa__occba_aji^c_Zhgae_m_e_bf^aa]_^njgdgd[`a]dc_h`[adj_[blch^ddZ]_i`Wbaf_^dc]fbgebRmPlicb^h_fhigec_[jYUgd\^b```njXbjeaOzeemab^ea^fbdfcgcebi]ffcae_bdebegjjdda_`bjah]cffal^f\hadfdeXb`b\fag^bebfeaaf^gbdcggei`cdgccaibcbccfcjcgc`d_caf`medcdbge_kba`fehacbccadhcga_\Xcd`dg`abgc^he`hg`cfehhcfafo_`feedc_d``_]b`__idc^f^bd_cXdbc^e`a^ckgdhggef_e`_`g_i]g_ad_^\a^\fjga^f]d`b_caf^fej`chafddb`daSl\dW^kYfie`s`mr`Wn_kaZdVb`\Rfcoc[_Y_\SifRcTelbmkdca_`kcp\c]`YsjaSiX`qZgem_^ddXcmW\_db^Vj[[ltindim[k\hZ^Vhneg]\Tf^`mdco^^rhcanag]QVfbidqX\]v[f]ahjdbpvfkbj\abhke]mQqc^`Yfj_Ugcjb_[b[SkTac]abaicru^bbnmi_u`gac\R_d]_neaucc]aZsjZc^hjgT_^cfhdhjdmfdfhb^pn\han\T[bcbhadchdbc_aXbca][f^Vg\_cl^dddfflgc`\deZ^]\addkga[Vck_n]ahc\_`e_`bbgZcd^Z\dp`g`[ceZsmafeha^ffcch^ei\b`^hahcki^eahcefbfaiddfggXa]cgZ]ee_`h`^gggdabdjh[_adlZhekdhg\eaed^db]gccbie_ae`^dh[b``c`adgbdhcgd_`lcd`pdm`j[b]ib_jhpbYg_df`ij`b^icjfjb`nhejbffbgc``bdfe_ejhcbbccbbbcbcbcdcbddecbbcccbcccccccbccbcdcdcccbcbccbddcdbcbccbccbcdcbccccccccbccccbccbcccccccbcccccbbbcdcccbcbcbcccdccdbdcccaccbbccbcddcbcbcbecccbcbcccccddccdccbccbccbccccbcdcdcccdcdbcbdcccbbbccccbbbbbbccccccdccdccbcbbccbcdbcbcbbbbbccdbbdcccbcbccccbcccccabcci`d`ca^_dphXVc`e^[TagQ[lhge_a]b`pbclSgdc\bcfhk]a_mhhYZU`gilbb`ecWcd_e^fffbleaghhdlZdd_e[doaYjfimdhfZRcfhjkkYka\\]`i_hj]_TdbbfefeR}X]b]jcqU]]l`haf_h_VechjmZ[fSdcm]b^fZg_^_c`h_^fg[jgeSkc^bXiZ^dc`igpc\dubed[jfgia[ZniLmydbNefimcahqebcfkbhhikdcgfib_Ynphkdgdpff\h_[`_fanViaoeoo__^_h^n`dfeajYdZeh`ga\`ibaU\^j]ebgUdfYhkqZd^fkZQX`bceKaca`dgZ\^hZbdci_affcd`inh`ei_]gmm`W_[aida]ppeedf``dlmflfelTkd_bgb]ia\ghWb^[kqfabp[`da`dgc^lZ]\\`ncbl\[gfbpc_lXYh[df[laUfimkk]Vb`k\ded^k`ebcfaicTltls_`mkk``h\_[becib_Ydndfby_d`fo_egSaWhYg]ojgam^Zifcdfjkdi_aXe``]echad_dactj\ekZdg\bk`c_io^g\gdbgg_e[e^caacf_^`^[ekbcbZ_aceg]dbf\a^edhtk\j]eted``bgllcgdaedaccg^^jeglapeZ`bk_df^\c\\b^^abcgd[iWc^obid]]ebbfgbcgm__iahdae`aaY]ck_kgRie]i]eYgh]^``jfUfceceYecc[ligrcgbea_\`ca_gcifag^[[\]ddidjeedhbieba^]`cabccccbccccccbccccccdcccccddccccbccccccccccccdccccbcbcccccccdcdccccccdcdcdcccccdcdccbdccccdbccccbccccdbcccdcdcccccdddcccdccbccccccbcdcbcccccdcccccdddcccbcccdccdccddccccdccdccdccdcccccccccdcccccccccbccdddbcdccccdccccccccccccccccdccccccccccbcdccccccccccccccccXbiik`drdocX^hnbRgq\Qyelc^ape`aZ`pa`gh[]fQbag_j[[W]mQ[ajlf[kesk_dqjZi[\`a`ikY[a^Qead^hnjc_cb]VybgUV^^`Xqmlfp[cUj]`x]hi_hX=K]dr`fZ_`bhZdgerhlje^^dcdmjjiLbb^Zbf]k^dnp_]XYachjY^`]dg_di^ffX[neWd\c{eWxd_ufeZe`]ckWfZihUYkV\vkdgaifgTZpcaIUaDk_W_]`me_bddijteRbje^Ybbl]iXocWah_gVY_jagtqqkc\YykiajL\bc\bhmSd[`]d]dgVTk`jgnchgWfgqdd_Tnqjhef`mXmJ`a\Xof```k[]ad]XVk_cWWf]ebfed_Z[\cc_a^XXd`o`iYUngf^Xun^jaY`Zf`a]fabak_n_cfa`b`YnUU]^`hg_v[aV^\gcR_`bg_`jcla_]egc_Zmjjfb`fP\jgj[a[hfldtccqNblueqq^md]W^qoahf_aVjaghk^c`knd]XY`shheilfc_]h[g_]^ca_\g]_Z\c\\riegcdUk]dlbhc]hhjTf_uhhV\sbceapSbijehfUUaj_`ja^udc^^Okhc\gb\^jY^]be_aeeg_`hj[gdidZU]gjdtc`[dia^j]g}abqdeflbi^hhhelgU_fcqgoP_K[^b_he[bedbZcWgMXN^ulceb`]]b`j_cMkaYef^Sgl`V]egc^Xrha]_fcjdfffg__cg`^aieg\affddaiY^qjc_lZ`i^o_dfjl`jcjWkefYdcedfaaffd``dggccecbaf^_cbdebc\ldc`_`b_[_ec]`fdbic^e^dn_`eee`bdegXecdghde\ccbagehicdec_hdf`dfgbi]fgbl_beeecib_gabgadbcfgfbccjbibh^aejddabi`gdcg^c`fche`en`dbedec`ce^h[de_d``agfd`ld_ab`cigg^cbfleidbbaj]ag^hbe_`b_`^fj]`def`f\baiad`b^`j]`e]`jfgb_Yda]`b__``Xc]abcc_^daide_cka_a_cdZcjbdca^ajjWbbgeakchmo]\WT`i``mjfkkXbf^cbc^jZ_adbdbhglk_eb^d]bii\amdd^abdd\did_cqb[jb`__hiWVgebbh^eX^gl[aU`a]fahm^a`e^]ia_ki^Xkg^h\ka[cgcd\bbeliih^jYecbYafaamUbdebic\gcshck^_]iic_aaalkdd_dbcV_dfgebbaihkbha\hddfebcde`^cddb_k^ahfgbXhjia`m\ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccbccccccccccccbccccccdcccccccccccccccccccccccccccccccccccccccccccccccbcccccdccccccccccbccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccbccdeeeddeccddccdcdbcdbddbcdddcfccdbdccddcccdbdddcddebdcdcdddfdddaeddcecdbccbccaccfceddedcdebddeedcdcddddeddbbccfeecddcccfeedcfbbbcdddddcdcbddcccbecdcccdcdcdbecebeecccbdddcdbebbcbdddbedddcccdeddccacddcceddgccdbdbdeecdcdcbddfddccdceebccdbccdcdcc`ecbdddcdccaW`]cYbja_W]\fhfZbecm^WjtgbXqfia`^an];kbddmble`abkUo]c_hc\a_i\^khbijhfehgafg\calcc]hdZTehY`fXLo]Sn^AJghf\fWgcjfhjggg][ae]n^ke`bucXZflbhmmm[gcm`T]dcjdib_hjdcio\f^cjjfqiicae_``^cloeefV[`aeh]cqX\Vbr_^jccd_klhfjgh^pWX`YbiWaecllbijc^jjrnbb^fcohehb^ial_caegbcieddfg\]Lmn`femcUNjZacejf`dgf^]jieTkQXaUfZrZ[][lhhbbiiiYdabb_ejlo`kjeb^WahnU]Zbadfhlmndedga^[hailj;ecle^Ze_hZc`enre]e`bc_iejghkgk^YqimVm_uX^]ddhmkX_hbj\iY[`bW[__hk]j`mYi`eii]t\`_fj]Xc``hdlg`bbdofYccUh[kf\kh]aqlkodcfbf`cjSbnscY_bfcfjddd^ff\e`mcm`dgemdZq^aUaTl]ccbccccccccccdccccccccccbbbcccbccccccccccccccccdccccccccccccbccccdccccccccccdcccdcccccccccccccccccccccccccdccccddcccccccccccccccccccccccccccbcdcccccccccccdccdccccddcccccccccccccbccccccccccdcccccccccdccccccccccccccccccdcdcccccccbccccccbdccccccdcccdcccbccbccjg\aab`r_Xqclcllpcqhgcge^b\iqcRie`QXd\hlh\Saj[thnlfY^fgkiijX^XZ_hXUdlbcfock]abXie^\do[fajf`okeigladmjcjdZOeiWod`igepbanl`oYZS\^cqbpnhpiXll_pii\q\jYWloQkkj`kfReOiq]gscjeZfckflhb`\ephdS_cl\\iWbnh`fh[ec^[_ggxfs\iegddghbQlj_adjb`hUmmahc^`\[q_[BUqibiefegftblW]i^biY\e\dccjk^dlchfd]vdijabbqk_][_Z`_vckaeho_gg]Z_Us^`ane_ogg\bfhgdn]f[mdbpaYqkbi\fh[eagZp[Yhaj]cijod\g\eXqtagndicfdjhdY]`i^p]Z`rg]>hmff^eeeWhZ_ie^dT_eiejc`^haa_cfTdccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccbccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccbccccccccccccccccccccccccccccccdcccccccccccccdcbdccccccccccccccccccdcdcccccdccccccccdccccccdcccccccdccccccccccdcccdcccccdcccccccdccccccdcccccdcccccccdcccccccccddcccccccccccccccdcbccccdccdccccbcdcccccccccccdccccdcdccccccdccccddccccccccccdcccccdcccccccccdccccccdccddccccccccccdccccccEYe]gsecWg`W]obifj`e]g`Gg`Yffoe`\i^gjfYVgabXa[odab\gqc\mer^h^\U`k\eimorja`bkj\b`o_[\jp`a\m^geaSd[^lf`^j\fYnnhhgfcffgvch]QYaiamdabcYnjTicpoReq`cU[rrkg\[b^cgc[_d`\yYbWk]bkd`X]fi[glge\c]b_a\l\]k]Pddfgf_hkikiiidcZhl\nlaeahidm``et^]`t;hnbjhejffr^ac_dQZgQ_ch\ec]f^ombd[dYcRccifrZcafbh^qgpg\aoiUlchh[dn`nl`j]lW`aca_p:]]g^[ha[`R]_igffZ_Ye]bfj`kS_W_ojada^[h^Vaek_UUphhe`j_el__dk^hi_g`^_cPVhdjTd_adgjiddtnbilfiXeZfanXi`_djcf^\m]dadjcjajgbgafil`gaa]mgdkmgghhT^ppelb`cb[ebc_jib`bdbYlh^]gg]aj^i_]e[njXbXNd]g_^khad_e]feccbhmdaddebb\cecbede_`cgdbfhdbgbcecdacbdfddcdadbefbceccdeecafccabbcddbdc`dcdbahad`abg_ccebeeebdaccbdf``aecddefcdcdbefgcbgbdfead_cbaacagbdddbbdeccebafbccb_cbedebbedbeddbdc``geefggbcedeb_fccbfgcadceeddfbabdcdcbbeecdcbhdccedabebcgac``hbdccdbdeeechcfffcfcgeedfcadbecdccbcbccdcbdcccccccccbcccccdcccbcbccccccccccccbcccccccccccccccccccccbccccccdcccdccccccccccccccccccccccccdcccbcccdccccccccbcbcccccccccccbcdcccccccddcdcccccccccccdbdcccccdcccccccdcccccccbcccccccccccccccdcccccccccccccccccdcccccccddccbccccbbccdcccdccccccccbcccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccdcccccccdccdccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccdcccccccccccccccccccccccccdcccccccccccccccccccccccbcccccccccbbccccccdcccccdcdcccccccccccddcccccccbdcccccccccccccdcccdcccccdccdccccccccccccccccccccccccccccccccccccccccdbcddccdcccbc`qmgaZbrd_heaefdi\bfamdZcb^d]hk]\`gfdZcbYfadaffajabcWdYhid]bbh`fa^hi^mTdbgg]i_bghc`]dYebagbmd_Aj_ddbhb_ee[bYkgcej`d_ndeV]mhj\id^cdkefof^n`qd\]e^ci[ebdbd_\bgd_hge`\^jgl_aU^h_d[h\gR\^]lbafaleln[b^gd]ejW^adfhV^`hg]ctejbhclmdgkjhebfcWd`jfafm^eedgh_cb`\khfghbdflhdepm`fX`]a^aZihaaVbgbZbah_o[i`hb_bjb[dcp`g^cdddiZffgZa]`^ih``^`_ib_aX[mcQ_abchhe_`gk`h[aeeekfc_baab_[igigheSZ_kgfh_acl[gb[b]ocdfk`aghcg\a__bdefr^d[[bghag_[]l`gjXcmjobe]cdfbdgjccfbegVdihlie\^ho_c[ddd_WddebaTgd^if\fmdah\\\c`mcgkefejf]s]gfal]dea^cb^cdcojhlccdcccddddccdddcccccdccbcdcdccdcbcdcddccccccdccdcdccccccccccdcdbccccccccccccdcdcccddccdddccddcdcdcdcdddcdccccccdccdcddcdbccbcccddccccccccdbcdcccddcdcdcccccbcccddcdccdcddccdccccccdccccccdcdcccdccccccddcdccdcccdcdcccdccbcccccdccbdcdccdcddccbccccccbcbccdcccccbcccccccccccccccccccbcccbcbcccccccccccccccccccbccccbcccbcccccccbccccccbccccccccccccccccdcccccccccccccccccccccdccbccccccccccbbccccccccccbcccccccccccccccccbcccccccccccccccbccccccccbccccccccccccccccbccccdcccccccccccccbcccccccccbcccccccccbccccccccdccccccccdccccQk\k_]hcm]\a]hk[khe_c]`[mlcWhmknacdda\eidWZ]`ohhje[d^gffd`f^dbkYbadchogdZg^k^VhbVj_hjdcXTj[Yhkdi\Ybhimflgb]]fYbiiaeeq\abbXZ`[iflgd^i__U^m^Zhu`fkan^lkdcnW`fefgbl^aWd_fbi]YZl[cdgjjhc]jWigVc_geruflg\d_[a^bddif`m`iqgl^fblcqaijoYneiak_febfelhodh_deh^Zbec^ghNYhTfajinUM`NMe`cWefhj]amhfnW^clrpfUw^oek^[lWgfhe^_ba_liY\\dka\ibjTNhbaoc`af\jhpY^kjYZ[alvZgV`_ktXScZOkq^op\^XT`YfQcldcikag\cocpcrZV`j[kiZnenb_cadecZbVhBebho\jefhn^_cV\Sncdkl^[\Wjibl]dhdghd\``[_a^rPehhiiV`ck_jb_dy]foofo_o\qb_diioapfgYbliafb_^gihcf[gledYlabosVbdcddbcddccbbcdbcdcccbcdccccdddcccdddddbdcccbccccddccdcdcbcccccdcceccccdcccdbeccbcdcccccccdcdcdccddccccbdbdcdcccbdbdcbdcddcecdcccddcdbccbccdbbdccdcceddccbdcdcdccdddcdbcdcbbadacdccccccdceddbcccddcbdccddcccccdbdcdccecccccdcbedcccddcbdccbcccbddddeb`dbdbddcbddafR]ckZd_W[a\l`dfd`]Rhg\gkqYrjk_[l^Wcd^jVjliToa`[c^mijhcZdY`gkg_ffdhbubhr^jXk^iiaqkdelq^dgc\naR_[b[fkfcec^hbl^keiSbamegcXUegU]df[gac]dKknbh`^[j_^dh^d]W^Wdgebi[X^jmTlpeciph\^i`jkkpjf`h_i_c[f\Y_e`^h\pjggldiZdgd[kms\flfh[acbjeaZb\`mZ\`ge`hiieekgcbaafileXkhceb]cccccccccccccccbbccccccccccccccccccccccccccccbccccccccbcccccccccccccccccccccccccccccccccccccccccbccccccccccccccdccccccccccccccccccccccccccccccccccccccccccccbcccccccccbcccccccccdccccccccccccccccccdccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccYZ]jsogjYVfi`_Wbcg`hmdRgc`]lffaf`]adfddegacicljkk_`[fVihj]ihb`g_ldadeTYf[g\fgd[a]h^dqo`_gff\ginJghkcdd`gSkUmbeZeTfZkfTcghd`]jnec`eba^a_i[f`eaokig_dg`_baf^ge_l`g]^`]b`fcfdlhyfcqldm_g]daX_g]dagdlZga^]abgadnX]\jUieibba\T`V]igf^W^[i_fld\N^e^cacc_Sefg^bdh^^bfjghfmfjm]hajanW\e[jcbf_jc^^Y\mgV`bZa^j`em_f\g^cgXl\g`f`jlne^bilibohjjf_rdfg^hfcfa^h[gelcbjgilec_bpfd_NiX^lbni]^Vhf[gmfna^di\ig^cfdebdb]``[_ncbak`ZXdd^`oaY[gaggiYb_m^Vbc]_h\aUdfpklW^cV\bab\idedfZd\e`kRfa_jcab_c]igipb`fYchgajdYXfehgehmWke_ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccbccccccbccccccccbacdebbcdbbdbeadcefbdecacddccbdbcce_adcbdbccdedcbcbfbcdddcbccdcfccccbfacadcecedce_ccbcaegddbcaaccdebfc`cddecdfdddddbdbcddbcfaedafccabacdcbccdcceedcbc`dc`ebbcbebbcbfbbdbbcdbccccedeaebdeceacdcccdbbcdadddcccabbebbddbbbedaedcddbccdbdbecacacbddaccbbbccccdbcbcdccccbccccbccccdccbcccccdccccddccccccccccddccdcdcccccccbcccccdcccddccccccccccccdcccccccbbccccbcbcccbcccdcdccccbbcbcccccddcbcccccccccccdcccccdccccbcccbccadccccdcccbbbcccdcccccccdcbcdccccccbcccdcccccbcccdccdccccccccccccccccccccccccbcccccbcbcdcdcccccccbccccdccbbccdbccccdcdcbcccbcccbcbcbbcdcbcccccbcbccbcbccccbccdbdcccccccccccccccccbdccadcccccbcccccccdcdccdcccccdbcbbccccdccccccccbccccccccacccbcccbccdccdcbcccccdccccbbcccbcccccccccbcccbccccdbcbbccbdbcdcccbdcccbbcbbbcccbccccbccccccbcdbcccbddbccccdcccbcccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccdcccccccccccccccccccccccccccccccccccdcccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccbcccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc_bXQbjkhZcbda]hbihab`fW\YdcYo^Sfg^iseZhe_Vc7[^_ia_a_^V[\\[_gabeedkfZ_gid[]^j_Yc_\lb^\gdTVaffu`fbn[chebgf_gblgd]hkh[g_ddfd`Zg^_l^b]]gsU\Yga[ahmoi^awddgekabW]ej\meed\ak\^dd`Z]dYflcc]lgZkfgdpgf]rdoa[bp[ahe[mcfZfc`Xhkcbfi`b_\]d]kbjhfbij_i[cfhd]p_Zbk`ehjf_fX\ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc`c`deaccb`f`ddee_dcfacebc`afdccdb\_fa`fgbddcccea_`d^c`e`cfcdcdaadca`bh`ggbdcbbfccedbcbdbbaecdaabb`dddedc_c`edbabffeccebbdebccdheb_chddcedbfd`a`acddb]cb`bbced_`ddcacdaacaddk`hfcdcaecbaeafdcaddbaaaab_`bcagcbaef]dabdac_bh`dcddefacbbddbbcebbdbcaccgdcacbadeccgacdccccdccddccdcdccccbdccccdddcccdccbdcdcccccccdcbcccdcbcbccdcdcccdccbcccdbccddbdccdcdccccdcdddcdcdcccccccdccccddddcccccdddbccccccbdccdccddccbddcddbdbccdbbccccccccccddcdccdcccccdccccccbccccccdcbdccdcdcdddcccccccccdccbccdccdcddcdcccccccbccbdcdcdcccbccdcbcdccXYQ\ekgf^edffcacfiocc^egZeeb^^\`Y^[ax`cWSqakkfe[g^efocmg`dadbjc^aUrn`bffkccgc\\bccnjb^[^gfmgY[hhincaegbcZ_`lcZmajl^i__eX\fgogWqf`]gh`abh\cpgagVdfbm_eebdea_^c_hhibi`jc`dlifhedn\f]c\jjhll\]XgpcfaU]Wjd[j\_dabdabTdfkYih[ra`cZglhce]cbl^reba\niax_f`dcjfaibcd\\kcaUXOacd]b_bb`d^hdh`_pZkjdSbpich_lrbm^reZ]_mc^flgpglib]bkbcZc]e_lihcjdmma[bj_lsd]khfhfra]d\f\][ndhkaah`egd\`\ZheginkVehdfZ^k`a^]lmbZcc_c_ah;_db]dZeiiR\_`]hdfeck\hkm`[fd]kiTe``_e]ckcg`_ZXkegomb_ab_^oambjicdmidena]]dgWdcaaa_Y_jmb`_t[hoge`klYgiikgh^b[l^Xad`Xega`fbdfgfcddc_agdacfcb`fdcagddcb_aedb`_cdddcd]aab]]`__ea^fbacbef_aicdabadcdckg_bacdfjgd_a]fa_dfa^eedc^eff_cgcf`a`gfacbb`afa_b`gecfdfd_db^d\hccgdbdagc\b`bgefeg_dcdgdcbjeedaehcfebdbcdc_caceabafacgacad``cdegbbaad^bedebcaba^ecghbcagebce_dfi]agabdefbdca`dfbabcdfcccccccccccccccccccccccccccccccccccccccccccccccccccccccdccccccccccccccccccccccdccccccccccccccccccccccccccccccccccdccccccccccccccccccccccdccccccccccccccccccccccccccccccdccccccccccccccccccdcccccdcccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc[c[`]^jcc_ikhdf_`blga\ifkfdYf\Y]a^ccZ^[[qq`ml_dcfo_pbgb^]ucikgWbggbhXjh_cmcZgebVdS^cijdifdaYeqmihdc[`febg\bWmah`d^]Wg`gac]eabkeel^a`ccf_h_Wddd_g\pdbeebegadnYdnf`idcc]jwfj]j]addNien[^cfd\^aZ_hf_^cZj]dcmd]icleYjhcccqnj]]_eadcdcd`Xc`Vh_hXhdai`ncdide``kfikdYb^dcagYhl_ZdXaeXd_iffcjhnlbmre`ajdbo`Uid_bbhkQab`]lY_Xn^]_^g_jk^cgecdRfkcagg[gahYf^ga^oYYcdde`bUPhaaifhefZc_Whg^fd__ae^d`^cq^__WeYVaibgh^dZi]kRe_dgk_`Vc^eg\ga^kf]e]gj^lWm[haXaU_l`hdafcafgfwTgdj`lddf]`UnhaZckc^_`Ye]n\pf__bqick`a]apiiij__g^adia_sa]aieYd]^\ad^cdcbdccddcdcccdddccbccacccccccccccccbcbcccccccedbdcccdcccccdcdccdbdccccdcbcbbddcccccbcddbccccddbcdcccccdccccdddccccccdddcdccdccccccbbccccccbccccdcdcccddcccccbcccdcccccdcdcbcccddbccccbcccccccdddcddcccdccdcddcdcbcccdccccceccccdcdddcccbcccecdcccdebcccccbcdcccXbjY]jchmUdmjecgiba^nRgacti_\e^Nc[ajbZap_bm`j_YdUbgO[ai\d]r[`d\LdWhdvaahi^oqk`g^poYaV]a]fmdZfgOZ__hgWX_`Yae]bzje[^\c`g[\bncn`_^`gj^cdhgefd]g\d_nhjij__bZfcbo_Zh_an[j\hfjifnhcad`kVW_gfk[b_q\_nbddVgZZeeddnfbhleafelcjejk^fY^cZa__kegXggumbt[ns`i\brfgc]`kebeSYchdg]hShhb_fmb`cfZeelhc^bfk[sP\aii[ihhbb_cbZflic_iai^_in`bfknadlXk^njWci`_[b]^galYig_\caiicc`^[mgYbgbgd`__dg^gdhof]geem_je`]a^`cdiq_i\g\_g_bXg_ccig`jglgf]ij]ggg]bhg_abe_ljd`hh^gde]a_jmYc^QYZekoukk[ck_]add\`ddVnglcYikV]dd_mh^Sd]eZeami`be^hlcfma\faac`edbm^ZgfcccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccbccccccccccccccbbccccccccbccbccccccccccdccccccccccccccccbbcccccbcccccccccccccccccccccccccbccccccccccccccbccccccccccccccbcccccbccccccccccccccccccccccccccccccccbccccccccccccccccbcccbccbcccccccccccccccccdbcccccccccbcccccccccccccbccccccccccdcccccccccbccccbcccccccdbcbcccccccccccccccdcccccccccccccccbdcccdcccccccccbcccccccccbccccccdbcccddcccccccccbccccccccccccccccccdccccccccdcccccccdccbcccccbcbcccccccccccccccccccccccdcdcbccdcccccccccccccbcccccdcccccccdccdcccccccdcbcdccbccdccbcccccccccbccccccccbbccccccdcccbcccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccckcaYcYdo`gbTbbjjh\`ebbfnj^bam`eeb^ojX^dk`d_jemmedhYif[[]d\fbb^\jegdikocaai^Yco`bYf\`\c[chni]fd]mVfZZhd^a`anggVgbjdadfi`f\fQbbfX[idj[YdYU^Ze\cgjdZ^`bda]idfcgi\]\siZWmbmhh\]gc^gf_bfa^ckeeidcbZde\ofdYPdYcqjjdl`W`h[_uXe[[_miaejfoccjY_bgga_bji]d^jmibbbmf\dalgl]bacdbicjbdh_gdk`\`_k^``ahXmac_kfbe]Z]cW`^^\a]_el\Zbcaklb[gdahgjii`na\fe`bUg[Zbf[f_lmYbcdi_q]dj^`[ie`\_fejb^_gc`i_\bd^eedcefld^ca[hY`hab^`XW``dc_ee[gc\c`g[gYn[lbfgacclfobikdahea]h\_gh^c]`[bdca\bg_Z_[^gbjfi^k_n`^\bibjgj\blbaZ_`kcgla[[]aebcd`kZo_\n\\]qdY]eh]dccccccccccccccccccccbcccbbccccbccccccccccccccccccccccccccccccccccccccbccccbcccbccccccccdccbcccccccccccccccccdcdcccccccccccbbcccbccccccccccccccccccbcccccccbcccccccccccccccccccdccccccccccccbccbcccccccccccccccccccccccccbcccccbcccdcccccccccccbcccccccccdcccccccdb^e^hnk[\lrgbgrnc`n[YZvlF`gbc^dacdZe_kj[^oifb]cfjcgpeW_bdVamcggca``ekniZbV`]bZTYi_OQ_fgbjtiYal`w^eY^hnam@eojelS]l`^bWk_a^j``kLZ`[`VfcWf[Tpa]aZql_X_kjjkh\f\bfZlgx\]cehe^[^beeda_`q\i_hdekdkcdifXeXZc^d``ZlXi]_aimfgeheo\hnelh[UXZ\UgV_idUY]tpeflpigej`[mY__ktqfgij`TnbmdiYgbqdlm\ffheaelkekW}kYcnpjkggjYc[\ZdbkdT\\jTfg^g\b`aWX^Ygbdo_eX_gfk]hVcbnbYm]k]_]oeVXhkb`hadj`b[i_ia^SVlhYbe__`pecfpmidiVUbapeh\g_eo\a`V]e^oYocil]d_Mceg]cWbk`f^`]Yaajcc`hb]f_[Raeeg`ZgbfclqgVa[[\gg`c]_gaecohehgai[`ngdfrpVidc^Zbghlds]hX`hcjbn^bkg`]^]]`blib^cgdfhji_h^e_cge_Zeceadfgb]ee^ag_^_ec[ab`bfe]gbVfhgce_i`bfh^jbkbf_f`c_fc^W]ckdc_eZdahkbfef_ffd]dZc]llaegh\_cjdf]a`gdedhc_bYe^idfc_ddabf^dc`bdgidn^n^b^e_]_b`idfcbcj\aafb\febbmhheebd`]`_ic__`dlbecge^fbabccekafecgZa`bdfbd^ead]ej`fh`eekdcjalfage]a__e\hcdde\cabfd[lXcarhf[fgaZg^\hWdhiWbh^hj[_a`gjjdt`ehmfjlhiblgcWdn]cd^Y`gdecg^bewadebi_Zie_mf_beZ`mffggbffp_dfc_`XcHa`e`]ccake]ha_fiXae[ee_k^lg^nZ_d`=e^aa\]fjZcX^`emb^ikadc_^Xfmh`bkg_k^kecj]gkfecjeb^_ecc`cbd_hhkdXfc`i_deikYacmaibkc_egafXdage^a\cWUa[edoXife[e`]b[chjg``ib`abdb^eehqcfiflgk_bffd_cnaZ_jgfig^dcgic^egXd^hebfj`]eaf^g\]ab_dbjfXXce]`ghhd_^m\iif^_bgfYafghaYfeghcfkgdagk`da``hcbfdb_]kcgfd[kafd`]c[cficddc\XYga_ge`^_X\_mg_cdjk_kg[\debcabgf^ai^gc]gaf\oajkdcdea^`ecc^ga^gde\^deZaehegcbhbca^i\ddhe`kee_d^\ih_^dgbigddfc`bfgbcedabbd`b`dd_b`aacaeabbfagfaddbdc_afad`efceab_b_fdcea^_bddaacdbgfdcdgcbjaadbaa`^bffd_cccbdbfecafe_cb`jfaiab`eagc`cfea_cdhbdebchbcbf^bffgc_]caeciagfb]edefff_d_de`ejecddbcc_aeadh^jc`bdddbdghbbjfidicia_cdeaecfdkdbhieecjg`aegdb`cadfb`c^cgebddcdelebecadcbgjj[aee]eecdhfd[i_b[eb]ak]Zacja\r_jeea\l_`ajkbgfqe\kich`cbaeeedgdb]_ccbcd`bf_d__ddc]Ygbfddfkl`igZc_dgc`a`eadf`c^bhdfdbc^X]]baahce_ea]aed_j^`hiccbgd^g]lg`cd`fe`d[\haea\^ebbb_hgbhfehgid^hYcc`ba_bhd[bbdaa__cicfVbbdhfbgba`eei]abacecgaci_g^bciodijda^i]gf`f^bbfbjWgbefgc_hacaebmdhldacd[jbgfiaib_ceac[mgacehd_^i^`ggh_caaemhb\bebecacbehhdgc`aaeidfaf]`fj]b`b_h^kbegfghd`\k\_fcbhdc_b][d`d_jda]e^\]aceeZcZafcfeekid``h]iddcb[efhei_b^Zf`d`bfdj_fhjee`gdcafgcjgc`cahaffcakgd`j_]^cefccajc_^i_`_mb`g^c]Ygcbg\eb_^c_ba^`^^X_e`fcccccddccbcdbebcbdcdcceccaccccbdcddcedbcbcbcabdbcbbcbdbbcabdbbbcddcbbcebccbcdcbbacdccbbbcddccbbdbcbcdbbabceccccdcabccafcdcacdbcecccbccbbcccdbcccbcccdbbbdbcccbccccccbddccccccddcbeddbbbbdddcccdcbadcbaecddcbaccabdbcbdbdbccdcccccbcccdbcbccbccccacbabbccbdcbddcdcdgchkcc`ead\^^bccd`]gbi_aaeadek^ama_bafg\`ib`dbbe^h_^bmk`]bk`ekc_ceea^ajh_^_ebac`gaddc`ceebfb\ae[d^geeccbapl^mkbaeshdc_b_dgbh]dfbia]`cb_bg[jXgc\^a]jbbdYk^^^beYcdfjc`_aece^k_`^ce`_bema`ffc`^dea_akidfghgeaji`\``fba`^[`Zd_bb`[_kfc_`ieaga[aai`fe^ba_dcbdk``acfcccccccbcccdccbbccdccccccbcdcccdcccccdbcccccbccccdddccdccbccbcccbddcbcccccccdccccccdccccccccccbccccccccccccccccdcccdcccddccccccccbdcccccccccdbcccbcdccccdcdcccdcdcdcbcccccccccdccccccccdccccccccdcbcccccccccccdcdcdccccdccdbcdcccccbccbccbccbcdcccdbcccbcdccccccbeae`hd_dfe_aad_daibdc_befcaffad_cfdeccacdbbbhahbagcdf`beeibbegbd_dcebfefgda]afffcj`accedbgebafa^daffdacbb_afcbfad_fbbafce`cdbafg`ccachf``e\bh_cccfbehhb^`aa`bcdfbbecafbdababdc`cdbcebb_caeafebbc^imdcefd_bdcccbe`a`adaac_eeh^gcebbbed^bd^_cd_fccceb`eef`dbfdbb`cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccdcccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccdcccccc`^[Ykzd`gc__efi`_`]dd_gccefgaa]`_ia[_jdldeg`hbhgd`igecb^__f^_`dch`ecZcbbf`h`Yef`a]lp_`jacZhaig\dcdck]e`di`h\fef^db^Xbaf``\Zig^c]^lXec`]hk]dbbh^[a]fa_\ccnSoWma`Xaeebbkakcdceala\_cfXijae^e`hldf[`b`[ccclkf`kdh^dabacd^ej`e^iZ__gfdbddr[`^bbajaeh`g`iib^^g`Z]bbmgcccccccccccccccccccbccccccccccccdccccdccccccdcccccccdcccccccccccccccccccccccccccccccccccccccccdcccccccccdccccccccccccccccdcccbccccccccccccccccccccccccccccccccccccccccccddccccccccccccccccccccccccccccccccccccccccccdccccccccccccccccccccccccccccccccdccccccdcccccbcccccccccccccccccccbccccdcdccbccccdcdcccdcccccccccccccccdccccccccdccccddccccddcccccdcdcccccdccdcccccdcdccccddcdcccccccccddcccdccdcccccccccccccccdccccdccdcdcdcddccccccccccccdccccdcccbdccdccccddcccccccccbccccccccccccdcccccccccccdccccbcdcccccccbcbdccdccccbdddcdcccbbdccccddccdccbdcdccdaedccdcdcbcccddccddcccdecccdccddccedccdccddddddccddcdbcdccddcdcdbccdcdddcddcdcdddddddcdebbececcccdedcdcdddccccbdbcdccdccdccccbccddddecdcbdedddcdccdbccbdcddddcdddddccecccdcddcccddbdcbbdccdbddccddcdcdccbcccddddccdbccdaccccdcdcddacfegb\jdc]dngibjgajbccce^_jjcf^ifedbfcbmaiiafd]k_cbZ]heeaeaf_hgcagoabgceddZe\bg`[adc`]c`aZecgd[_iibdfbf\]^h^ebb`[hedcd\f]ea_ceh```bg[h_bab]^dc\bdef`]ai`e\lb_g\c__``_kbff_m^`begdgbheh^]e_``cdW^cb_ehf`Z`akb`_j^hZk^]afYkdh^f\ic^g^`lfafccbc_kec_`fgicbcbe\fiebe^eeedbc\b]dhahecded^ah\_aa]gch`]^kcfafcZa]b\`bba_hkkbab\cbchffc_bcccbcg[ccece^flgiiejg\ebccgfZd\ahcce``jZd`Wca_dh]eca\bbijYia]bkgZh_jhd`gb^bgjfa`bdi`adelfamd^ddheg_ag^bYbc^`^gb_h]biVh`ggchgfdeddhhkfe_dtcheec\hYe\Zf_k[kd_fgb^dbd^a]hh^bicf`fe_^aZbbgffbd`Tdjddecacabdbbccddedbbcdbbefccdccefecccacccdabc_bdecbgabcbbdfbfbbcdedccdbbeccbaeadbbebcdaddabbccdcdbabdcadcbaabbdbbdcecccbccbbbddcbcefbbbcdcccabddecbccbccbc`aeaf`caccbcaaefccbcaace`ad`deeccbbcdbbcedbeedcbccccbfcecbcccecaedcdedabebcdccbca`adedcaeceeddeacbbaeaedeigdfddakfb_hbfcgjd`egedfgacd\ik`da_a`ba_cg^hbcec_^f_c_ehaadic`jeka`bb[eaj[`d_^g^_dYf`b^Zf_djab^cajeZbab`ababbhlg^_^fcdjbacc_e`debi^hbe`e^h`bbcbb_]_`[db^bc``[dcih\g\`cW`Z_fe`fajfeb`kclbcaec]`g^`ebfg^bbhfcf[fj]f`_daach`hg_a_hfahg`cedgk`]`[afcmqZbgaadicba`d^`caS]g\d^f__keccfYjgg_`hbeeiald]eia`cdcchdad^^lbbecac_`jcd`][]]efq]iedkddeaaag`faghd[ae_]g^eaef[a\cecec\dYdgmc^hek`iaa`fcglde_^bmX`ga`f`acabahaachcobafb]cj^[ad`hcbc[[]anehd_`jbahabbej_`bhXmbjZabdhdZecdjdfc]`eheg^abbdcX`hiafcg_icm^e^ciabid\ibg\fe]]hgfcb_Wfgdgf_]eebabd`eic]fcgaf``edaaeada^_dbef`efedcaabhace`hb^efjc`d_edibc]a__ead^g\fe\a[idacgdbac_caddi`a^j`cjfh`\e[ldjg_^Y]eflagddg`bgj_gde_]big`egic``[ahcceal]d]\ffhj]gib]a`dh_f`ddd^gj]_j_hd`cbfbc]ebcegbacc\hcc_fbheh_kibhi\\m^eehbbd_gf]cmibef_fiefd[bbdbcg_daf^]cdcccbccbbccccbcdcccbcccbccccccbcccbccccdcdcdccccbbbccbbcccccccdcdccdbccddcccbcccccccccccdcccbccccccbcccdccdacccccccbccccccbcdccddccccccdcccbccbccdbcbccdcdcdbbbccccddcccccbccccdbddcdccccccccbcdccbbbcccbccccccccddccccccccbbcccdccbccccccccbbccdccbcccccbccdccccccccccccccdcccdccbdcccccbdcccdccdcddcdccccccccdccdddbdccdcccccccddcccdcccccccccccccddcccccdcddcdcdcccdcccdcdcdccccdccccdcdccddccdcccccccccccdccccccccccccccccccccdccccddcccbdcccdccdcccccdccccdccccccccdcccdcccdccccccccdccccdccccdcccccbdccccccccccccccccdcccgZfdabd`dgijdksbcijda`ae]``l`c\agkhehfbd\a_]]`]\pnre^[tcYqT_dbb\i`Xchhsi\^eQW_mcpcadf_deaXh_Xhkn^_YfzZ_Zce`QU\ZRknWmo_e]k]iea]_`gc_jf`\dY_`dahif_aS_ejgdoeg[ba`]YZt]heigcghfg[^\ek_[Wpi`ijbjcVXemd``fk`\iiaYekkafrXdpobbe`kbcaMe^a[fYVqPg_^a\mi_cRtkj_cOg_gch^odfecb`dcacdiagccchbceefcceeaceeb`gebf_ceeacccef`cfccedebabebbcc`cccfcdffcbbdcfefaddbdfcbaaabffdddbacddcbcebaccc]fcbabccdccecdfbf_eda`eccecadcbbbbaa_e`ccebbcfbfbdabcghgcceeb`bbabgbdbdcebdde_cdfdd^aedfafbddadbeeaebdccdcdb`gdcbc`dddecdecc^`eecdbfbfbcbbcafhc`c_c_i\hdfjcglbfjc[daa_gae[_gahgb_geac`gbc``_f\[fjcfa]agf[cgdd_eebd`egafbb_dc_`hddgd_f_aiee`l]_cjd_iedbccidccaie`eeiib_debfh`f`a^f^_\_fiaabc\b`dfdcY_ccfgcj`fgicegbbga_fekXfbdabjg_`bacdeedee`jadchd^f\ae`emdg^hcgi`aci\ea_kaddh[`bagaadgcb`bfff`e_adfdea_ffe`dd^c`acbfbcf``ageceddf_fece`cdmedefah]fgcbjcfblcdX^`_ddcg^ifc[`j\_aff[cecbgcbZnedj`a]`cecfg`iea`jdcekee`hg___ediecb_dmbkeba`a`^abg`d`c]cbhaffdaa]d`cgibgbjgaYbejacdbccj\dhdfcljgcf_cadga`cdgcfecdlbd_f_`dfk^gdca[a]ed`^ca`ff_f]d`]`e`bbd]eb_^Xb_cgabehffccbf_hb_ga_hdcgaddbbffiadd`ffa`acd^aceejfbcbhc_ab_ddgeh\hdcdc``fdc]adecec`fb`fcdafbac^eabbeg`d`edee\e_`dfe`addhb[`d_^ddbf^did_hceaabedaaeed`_de`bcb``ad`figecmecdccaaadddeaaeeabdeecfcdaeea`f`cbdiecde]bb``ahbd_iacdbeigibhgadechbgeiadcffejdhd_cdgbagjcachceijbdd`^fad`edc^ccbbcdceafcbbccbebbbebceecdbcbabdceebbcddccddddecdabcebch`efebbdbcccecccefcdcbfcbbdcecbcbeeadbcccdacbdcdaebddacecbfddbdcbd`bceccedccaddeeefbebbdchcfbcdcdd`fbadcccddcbbecdaadbdecccecdedbfbdcccdacbcfcdddadcedcbadddcbcbccbbcededfec`dfabcd`dfdbdfebacfeaeddbaebibbab]adcceddbefebec`c^be\a_a`jbffbdbecgfcd_ai`i_fcbbffgifcbb`agchdeebc`befcbbbejgfaehfa]]dbbbca_ga_a_ded_cghbc`bcdofabfbejgacdahfa`dcfa_c_edaeedidg`cef[acaagecebaaedaacacgea`e^e__aah^aa^d^c__hddbbbcbaefcdga_abcdbdd`dh`befa^dfcg^]gfcbbea^`bbf`dcmebe`ide_dedbehldbffaeh^baddg]ffif`cd\\m]oladdejaf]eeodhf`bhda\ic^fd]d``hfhcagchd]]^_cciaXcbbddca^egabc[\jba`j`afhhg[affgcU^a[Yaggga_Y[bhfc^b`_e_fja[]bgl^a`Ocdddhhhge^`[cljdbcel_`\dXefchc[difk\bnhghh^`[eZfaajdgcf_c]d^b\eo\`k_a^bcfd]Yakh[_fagWcgaf_f`d_[rbZna^ehc_hcmg_ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccae^]YdcamfabV`e_`^db^[ag`d\iflha`\`eYdbeQb`aidbdaWcb`dm[Zgn^bmeb``bbb`iafZibaVbaebpf]ddng`ng]d]cVebkZ]`d^i^ddfh_adc\alec`qgg\g[ebicibggg\^Whgq]ecWgadc__lchdhjid``]aPf\`afdb]cbad\_dlegee_Zag^ZVb^bjd_`\ck`eaogo\]hfbhr^hbjlfgfhg]_YhgajcddcgYfjae_]ml^fhcbb`dbccddecdbcccccccddddcccdccdbcdcdcceccddcccccbccdbdddbcdcecbcccbcccbbddbccbddbcdcdbddeccdccbcddccccceccdcccccccccccdccccbdccddddacbcbddccdcccbcdcdccdbdbccdecbdbcdcdccddccdddbbbbccedbddddbcbcdcccdbcccdcccdcbccccccaccddccbdcddcccdccddbdcacadddccdcbbaccebcdcbddacadbdecedbccdcccddbdeddcdbbdccbdccdddcbbcccccbdbeccccdddbddccbcddbcddccccccccbdcdcdececdbcbcbcddbdbcdcddccdcbccbbdcbccddbbbcdbddbcbcccccdccdccccccccecddddbbcbcccdcbbdddedceddbddbddcdcccddcccbcbcdcdccdcccbccecddcccbccdecdbcbddcbddccccbccdccddccdbcdcbdcccbbca\cgd^``_aj]fcYabb^egbnglgb]j^eh_cn`]_gebb^gg]c]f_bhcaggka_h^Zebca^gcfjjcedfa_ee_b^acla]c`c[kgg\ca^_di]`\e^gdddr]hljj]ahfd^a`giYld]ibXi\^d_db^^aa{_m^ghi\egcfgdhYanke]d`i^k\gdcfab]ga`iedia[cbedcfc^keegeYf\iebdoec`dabdb`^hbceedce_gcfZccjafmbhba[m\bfYeeef\bjbccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccbbbccccccdccccccccccccccbcccbcccccbccccccccccccccccbcccdcccccbcccdcccccbcdccdcccccccbcccccbbcccccdcccccccbcccccddcccbccbcbcccbccdbcccdbcbdccccbcbccccccccdcccdccccddccccccccccccdccdcdccccccdcccccccdcccbcccccdcccdbcccbccccccccccccdccccbcccccbcbccccbdccccbcbcccccccccddccbdcccccdbcbccccdccccbccdccccccbcdccccbccccccccdcccccccccccdbccdcccdcccccccccdcdccccccccddcccccbccccdddcddccccccccbbdcbcccccccccccbcbbccccccbccbdcdcdccccbccdcbcdcbdccccccccccccccddccccdccddcdccccccccccddccbdbcccdcccbccccccccdccccccccbccdccccbcdcccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccadiaebcb_dc_kd`ea\]c`afc^`_fddd_fcfhabaac_gahde]gb`hac`qaaca_ag_e`f]_babcbeece^d^bbaiaebeg_gbbbdcagebcbcecbdbfej`dcc`dbead`bibd_a_gddaedbh`_a`\chbcdd`ccba`cbdb`e^ddca__aecjaggbehdaa`bhbgdd]`_a^d^hdc`ebafeabadbgc[]c^cbfff_bieibdbc^addgb`__f`abadd`bcbfda_ece``ddecddcdae\caadhfebbeccgaccdddbc_c_eg_effcdcabacaeaababfcb`cb__dai`ce_fbcbe]b]b``e`bjb^d]b`cbbcaafdgc\dcdccfc^]abccbdfcd^fiagbbccb`bhda`aec`_adcadcbcfg_gaedchbffafeceghag`cadb_acfbcccca_bfbbdacde^^ceaaaded_e^efaZccabeedif`cbcfeaaaccbfig_bf_fbeai`ifbei_akbccccbcbbccbcbcbbccdbcccdbbbbccccbcccbbccbccbcccccbcbcccccbbacccdccbbbacccbcbbdccbcdcbcbcccbbbbcccbccbbcbcccdccbcbbeccccbcdcccbbccccccccbccbccccbbcbcbcbbccbbccbbcccdbcbbddccbcbccbbcdcbbbccccccbbbccbcbbbcbbcbcccbcccbccccdcdbbcccbccbccccbcbbbcccddcdcccbcccddccccccccdccccbcccccccccccdcccccccccccdcccdcccccccccccccbcccccccccbdccccccccccccccccdccdbcdccdddcccccccccddccdcccccccccccccccdcccccccccccccccdcdccccccccccccccccdcdccccccccccccccccccccccccccdcccccccccddddccccddccccccccccccccdcccdddccdcccccbcdccccccbcccccdcccfcdb^\^g^d`i_\_`bba`igfidgbcgrcmccicXecab`hdk_`\ei^hjf[hd]kf^ah[_deiZb^`Ycabjj_c_c^njZaYjec`hbcbiafe^a`UmegfbgeiXn_d_`^aY]mggaefccggZgd\daei\ed^`cab^jgg^`gbffWla]bg`g]bddlbagabfYladZbc\cahb\g]ckcbic_dchfgb]cfjgdf^_bclca^df_i^bd]fhbXhag]efc_e`eknfdbbgdfij_igd`e`db`bi``]^daeb_[diaecjefeeY\bh^fcg_`^_Zbdhea[jpef`hb]`ag^``a_cdheeg`bkdVafefeebcgbbddbdg`dc`cb]e_g\__cebckdij_fagcb_fmfce^_^`dh`ccfedbacepb^_ace`dcc_obc_a^balbd[[cfeec]f]baiiXhbbdY[bfef_jm`\hgcbeiamddgkh^bZ_cigd^_```ieaaibecc`habg`dd[_fc`a_c`hed_ideb\^cccbcccccbccdccdbbdcccbcccccdcccdcbccccccdcddccccccdddcccdcccccccdcccccccdddcbcccccdccccbcdcccccccdcccbccccddccdcdcccdccdcdcccdcbcccccdcbcccbcccdcdcaccccccdddccccbcccddcccdbbcbbccbcbcccccbdcbcdcdccbcdccbcbcbdcbbdcccdccccdcdccbcdcccccbbdccdcbccccddccdcccddcgc^g\h`blab`cc]`gZbfc_fdb`heb`ZaddZfeac_kgc_ehh`b`q^]bab_hhc^bhj`b`fedfgbdhc`ecc_ecg^`fhca^ddefbh`cebhiceYgepgb_]k`h`^e`afei^bb^c``agihiiid`bjhcd[hh`ek[Xbo^\aeca[bdb`bcg_i_`djgfjcdcb]`d\bb`bafcdejfbhffga`g\bhf\ddac`fidXej[^aa^f]bd__`d^bh`bb_l\il`dhdjagbd\hcccccccccccccccccccccccccbbccbccccdccccdccccccbcccdccccccbcccccccccccccccccccccbcccccccccccccdcdcccccccccccccccccccccccccdccccbccccdcccccccbccccccccccdcdcccccccccccbccbcccccccccccdccccdccbcccccccdccdccccccccccccccccccccccccccccccbccdcccdbccccccccdcccccccdccccbcccccbbcccccccccccccccccccbcccccccbcccbcbccdcbcccbcbcbccccbcdccccccccccdcccccccccccccccccbcbccccccccccbcccccccccccccccccccccccccdccccccdcbccccccccbcdcdcccccccbcbbcccccbccbcccbccccdcccccccccccccccbccccccccbbbcdcccbccccccccccbbbcccccccccccbcbcccccbccccccdfcebacbddcecebdadcdbdcdcdddbdecedcbcbbcbceeebebbccddbccbcdccddebbcb`ddbdbecbebecbbdaccddcbcdbcfbbecdccdbbccecdfcebfbdccbdbebcbdaaccddcdeceec`dcdcddebbccbbcbdccebcdccbgcddbcaddcacccdddccdddbbacdbddddcccddbcbddbdccbededccddcccbdedcbbccbbaeccebaebebdee`bddbcccccccccccccccccccccdccccccccccbcccdccccccccccccccccccddccccccccccccdcccccccddcccdcccccccccdccccccccdcccbcccccbccbcbcdcccccccccccccccccccccccccdccccccccccccccccccccbccdccccccccccccccdccccccccccdcccccbcccccccdcccccccccdcccdccccccccccccccccccccdcdcccccccbcccccccccccccccccccccccccccccccccccccdcccccccccccccdcddccccccdccccccccccccccccccccccccccccccccccccccccdcccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccdcccccccccccccccccdcccccccccccccccccccccccccccccccccccccccccccbdccdccccdcdbcccccccdbcccddccdccddccccccdcdddccddcdcddcccccbccccbcddccccccdccccdccccbcccdbcccdcdcdccdcdcccddcccddcdcccddcccccccdddddcdcccdcccdcccddbdddcccbddcccccdcccdcddcdddcccccccdccdccccccdccccdcdcdcdccccccdccdccccdddccccccccccccccccdcdcbccccbbccccdcdcd`f`kcccedbc``debac_fibabe`]g]dlhjja`icfea`eaci`k^eac\^k\_behgehdag_bhaeeiacf_c_k]affgbcicaahcabbc`a]cfeb_ae^`jhe`]`ia^`calcged`fcfdd`g`_adeaeacbg_]bacbc^j^g^dcfd^ac^bcbcbcbb_abha_ijjgbcjec_\f__fcef_gbYgceb\gceacbab^_]cd_adacaakbe_gcbedbbfccb`d`^cbfa^cbgghcebd`gaebccedhbf`bbdb`adacad`caededbdb`edebdbd``afcbecbbdcbb`dbaab`acddgecce`cgbcag`efcf`bcacddbeedcbdcf`decdbchcchdfdbf`bccfbbdae`cbfadd`eafebcbebdcacbfebecbdfcbdeedbbcbcab`cebgaeccb`daafbbeaddcegccafdcbcgdcacecdcbfdebcgfccddcagegccdacchcebdabcehbebefcbbb_erVoTgYS]igqorWWl_idcodkdOal]`gigXH[[e\hbgekljbdpcccccbccccccccccccccbcbccbccccccccccccccccccccbdcccdcbcccccccccdccccccccccccccccdccccccccccccccccccccccbcccccccccdcccccbccdccccbccccdccccccccccccbccccccdcccccccccccccccccccccccccccccdcccccdccccccccccbcccccccbcccbccccbccccbccccccccccbcbdccccccbcbccdccccccccccccdccccdcccccccccccccccccdccdccdcccccccccccccccccccccccdcccccccccccccdcccbccccccccccccccccccccccdcdcccbcdccccccccdccccccdcccccccccccbcccccccccccccccccdccccccccccccccccccdcccccccccccccccccccccccdcccccccccccccccccccddccccccccccccccdcccccccccccdcccccccdbcccdccccccccccccbccbcccccccccccccccdddcccccccccddcccccdcddccccccccdcccccccccdccccbccccccccccccdcccccccccccccccccccbccccccccccccdcccccccccccdccccccbccccccccdcccdccccccccccccdccccdccccccccccccccccdcccccccdccccdcdccccccccdcccccccbcbccdccdccdccccdcccbcccccccccccc`]abekkh\`k`bb]`c_ggkghacgfpb^^jaeecmhhi`f`gbZh[Y]_]`eYWdcbei^id`hja_gbda]^Wbebb\ci\be_Zec^^df`ae`_mbfa_]i_bcl`gdYajl_`adeechb\emcafab]_bca`^Zjdae^_f_cbd\be`ebcb_efdd`j`ccfcd]fd_hhhaa`jajabcah^bbhbccfbce\_nc^^i`b``eifcabbfnbrilah]^`\e`_`ci[fdabbg```b^gadgccccccccccccdccccccccccccdccdbdbcdcccdccbdccccbbcccbccdccdccccbccdcccdcccddccccdccccccccbccdcccbddcccccccccccbccccccdccccccccdccccccccdccccbcdccccccccdcdcccccdccdccbcdcccccccbccccccccccccccccccccccdccccccbccdbcccdcddcccccccccbcccdcdcdccdcddccccccccccdccccbcccdcccdcccccbbcbacdccbcdcdccbdccbbcdbddbbdcbcbdbbcccdccdcccdcccaccdbccbdddcbcdcbcccddbbcbdddabbcccbccccacccdbbdcddcdcbbdbbcbecdbbbcbccccbcccccccdcbbccccdbdccccdcbbcdbbcccbcbccccbcdbbcdcccbcbbcccddbdadcdcebcdccbbbbdcdccccbdcdcdcbddcccdbcdbdccdbddcccdcbcdcbdedebc`bddddadeebcbb`acceceebbbcebcbecbccdbddbdbdcbcddeacebcdfbeb`cdbba`eaccbbacecfabcccccccicddacedd`ddbfgggcccccchbddddcbdccdddbadbeeccbbddbbcebfeedfebadabdeaccecbbebddeddbccaca`cbdcbabadcbddcccdbecdeccddacccdbcbddbcbdcebcdce`dcdcddcedecbdddcegbbcbbebdcbdccdddddccccccbdecccccccddcccdcddddccccdddbdddccdddddccdccccdcddccccbddcdccccccddcccdecccdcccddccccdcecccdcddccccccdcdcddcdddbdcddddddddbcccccdccdcccddcccbccdddccdddbdddbcbcccddddccddcccdddcccccbddcdcadbccdcdccddddcdccccdddccdcccccecedccccddccccdcdcccdcdccj`bcbh_]g^[ee`f\e``emhb`defde]W_ed]`jba`emWa][[jh\kdgbi`gfcch^]dajYec[ffcfc\bdc`]nec_ecba`[afimi\Y[dadiblbfmb_TgibcbUcbhhchdhbgimk`c_afnba_g[fa^c]hf\bm]`aed`eeahZc\eejhg^Z]ihoee^g``bdbda`\b]ajge`^bebfde`dbbbej\``hhfekcdd]^dgfggakjhdfafmcedbe`^`afdk_``dfk`^ccdccccdcccccccccdcbccccccccdccccdcccdcccccccccccdcccccbcccdccccccdcccccccccbcccdccccccccccccccccccccccdcccccdccccccccccccccdcccccccdccccccdccccdcccccccbcdccccccccccccccccdcccccccccccccccbccccccdccccccccccccccccccccccccbcccccccccccddcccdcccccccddcccccddccc^eegdheaccYefcjgae[bacechg^chabd`_abc`f\hddgdee]iaacbbaYabeachgfhZea]b^^efd[[edbgh_`h]biagdaa`cdb]aambbi]`^da`fef^_kcahcdcqjca`bab`hhbieb`fgb\fcbb`bga_i^``ec^efgn]]d^amaa_k_cbc`bdbbZckg`bh]ehdc`egee_bhb`f^_fabj^`dgbdd`dfhkd`a^diZee]cfe\k`e_dhZg_ad_cdb_`jigccccccccccccccccdcdcccccdcccccccccdcdcccccccdccccccccccccccccccdccccccccccccccccccdcccccccccccccccddccccccccccccccccccccdcdcccccdcdccccccccbcccccdccccccbccccccccccccccccccccccccccdcccccccdcccccccbcccccccccccdccdccdccccdccccdcdcdcccdccbccccccccccccdccccccccccccccccccccccccccccccdcdccccccccccccdccccccccccccccccccccccccccccccccdccccccccccccdcccccdccccdccbcccccccccdcccbcccccccccdcccccccdcccccccccccccccccccccccccbbcccccbccdcccccccccccccccccccccccdcccccbccccccccdcccccdccccccccccccdcccccbcccccccdcccccccccccccccccdcccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccdccccccccccccccdcdccccccccccccccdccccccdccdcddbccccccccbddcccccccccccccccddccbcccccccccccccdcccccbcccccbcccbccccbcdcccccddccccccbdccccdccdcbccdcdcccccccbcccccccccccbccdcccbccccdcccccccccdcccccddcccbcccdccccccccccccccdcccdcccbccccccccdccbccccccccbbcccccccbcdbdcccccdcbdccdcdceccddcbebccccccbccbccccdcdccccccbcfcbceccccdbd`cdcdcddcddcccdccbdcdcdcddcdcccccdceccdbcdccdcbcdcdcbbdcdddcdccdcbdbddcdcddbedcccdcceccebdddbcdcbcddebdccddbcdcbbcbddbbbccccddcddccccccddcdbbbdcbbdcdcdcdcbcddddbcddbcccccccdcdcccddcbdccbccccdccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccabggaccfabchb`ceddaef`ddaacbbgccdg`cddcdecfb`cadjaecbcb`c``ceacac_ccbhebcc_abd_bbcbcadcc`cadfcbagbbej_e`ecdacec_efbfc`defaba`dacgdgchcbahbaeebce`_cgbeeaefeddcadgddb`jbdbcbcbdaadeabccdecccadf`cedcbddf`agbdcbbacccaffefcbfdgeaadbacfccd^`ca_acc_cf_hfbea`cfdg`acccccccccccdccdcccccccccccccdcccccccccccccccdcccccccccdcccccccccccccccccccccccccccccccccccccdcccccccccccccccccccddcccccccccccccccccccccccccccccccbccccccccccccccccccccccccddccccbccccccccccccccccccccccccccccccccccdcccccccccccccccccccccccccccccccccccccccccccd]aaedYif`dekg`e_`gedhag]gjcfdjefedbdacab_fiea`b[dfdkabkq]bdgagcfdibg_fhg`b_a`eggdf_cgc`mccc`_^`a^_efhcgegdehaccec`bdc`jahb_fgeagf`ecg]b`lkeifcc_c^gbdafeef^cbjchdhcfcc\hiiefeefbcagadadiefd_beebcglebgbchlgeccabeebXajdc`Zedff`_bbbgfeaZ]j_dcj^ac\[dc^`f`f`cba_fa\a`bcdfdcgbd`^cbcbbhbcbefdbga]eb_bg_`c`_ebbbdbee\eid^cfc`ce`cea_`df`bbac`dbfeg`agaabbebchcfdbbbfcdbbahgfddccebbebeccbfbbak_a`ddfbc^`c^`ccadkbdc`aeb``cbaecaaebfigdce_ddce`aeb_habecaef`debafa^_iehacdfabggddeed`acdfbddacheebikbcedg]ac`aaieafa_bf_`ebaa_bdeccbccdcdcccdccccccccccccdbccccccccbcccccccdccccdcdbccccccdbccccccccccccccccdddcccccccccccccccccdccdcdbcdccbcccccccccccbcccccccddccccbccccddcccccbccccccccccdcbcccdcccbccccccccccccbcccccccccbccccccbccdccccdccccccccccccccccbbcccccccdccdccccccccdcccccccdcdccccdccbdcccbccccccbccccbbcccdccdcdccbcccccccbcbcccccccbccbcbbccdcccdccccccdccdcbcccbcddcccbcccccbcccbccdcccccdcdcccccccbccbcbdccccccbccccccccbcccbccccdccccccccccbbbcccccdcccbccccdbbccbbcddcccdbccbdccccccccdcddccccdbdcddbcccdccccccdcdccccbccdccccccdccdccbccccccbcccccccbccccccccccccccbcccccccccbcccccccccccccccccccccccccccccccccdccccccccccccccccccccccccdcccccccccccccccccccccccccccccccccccccccccccccccccccccccccbccccccccccccccccccccccccccccccccccccccccccccccccccccccccccbcccccccccccccccdccccbccccccbcbcccccccccccccccccc^cj\ad\ge^ddb^l^Wicagchc\kchac]bfaccaef\\l_^adgbhde^iak\_]ggcifbdhdgaih]agfbd^dak[bfcee_i`_cf_^d__acc`ac`c_a`a_ccaebW_h`c^ajd^e_p\_cbdgk_[bcmai`ahheddfaj`ccgdYh]jf_a_^i^fndfddecac_ncc_ecgci[^am`hbhnZbirc`gf^[^k^e_caddh^a_hfda^ciak`cbjihjadnghe^fbcg_`g]`]\hcccccccccccccccccccccccccccccccdccccccccbcccccccccccccccccccccccccccccccccccccccccccccccbcccccccccccccccccccbccccccbccccccccccccccccccccccccccccccccbcccccccccccccccccccccccccccdcccccccccccccccccccccccccccccdcccccccccccccccccccccccccccccccccccccccccccccccccddcdcbcccdccccccccccccdcbdcccdbccccccccdcccccccdccbcccccccccbccccccccccccbccbccccccccccdcccddccccccdcccdccccccbddccdccdcccbcdddcccccbcccdcccbcccdccccdbcbbccccccccccccddccccbbdcbcdcccccbccccbccccccbccccccdcccccdbcccccccccccccccccbcccccdcbcdcccdbeccbcccdcbcccccbceccdccccccccbccdcccccccccdccccdccccccdcdcddbcdbccbcbdcbcdccbbccdccdcbdcccdcdcddcccdccddcccdccbdccdcccbcddddccccdcccccbdcccdcccebccdccccbdcccddccdccccdcccccdcccccbdddccccdcccbbddceccbbddddccedbdbcddccccbbbbcbddcccdddcbccccccccccccccccccbcacdcdcbccccdcccdfbcededccacabcaabeddeccecdcecddebbcdadbcecddcaebbbdbcdbecccccccdfedcdcbbeedcbbdbb`bccbd`bbcdfbe`dgcccccdcdcccbceddcdbbcdbdfcbadbbdbedcddcecbbfcbecfdacacecbdecede`badhcedecedacbaccdcaccabebdbccbcdadaddbbddbeacddfcbcccdebccccbbefcddebedfcecbedaccccccccddebcceceadcdbccbddcdccdbcabdddddbcbebdccbcdcddeeddeccccccdbbbcbcdbcdbcccdbccecccffcedcdcccbbbccccddbbccccdcbcddcdd`bdedec`dcccccebccccccccbcbdbdbdbcadcddddedbecdbdeccbdcbgceddccccdbcdecdceccdcfeeddecbbdbcdcbdebcdcaddcdcdcdecdccebcdccfdacddfdccccdfadddcbdbccdbcccccccccccbcccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccdbccccccccccccccccbcccccccccccccccccccccccbcccccccccccccccccccccccccbcccdcccccccccccccccccccccccccccdcccbccccccccccccccdcccccccccccccccccccccccccccccccccccccccccccccccccbccccccccdcccccbcccdcdccccbcccbbcccbbcccccbcddcbdbcccdccbccdccbcccbdccdcccccccdccccbccccccccccccccbbdbcccccdccccccbdcccbcdcbcccccddccbcccccccccccccccccccdccbccbcbccdcbccccccbccccccccbdcccbcdcbccccbcccccbccccbcdcccccbccccdccccbcdccccdccccbccccdcbcedebbbdcccdecbdbccecbccdcbcdcbcddccccddbdbcccebdbddbbbcececbdc`fdcbdbbeccbebbdeddddadbcddeecabdddb_aachbccbfbdcbcbcbcabcecfcbdcbdc`bddbccbeedbccceedddbbac`ccbdbfcabadbbeba_febbccdbdaacaddccbcbccebdd`ecbcdcdccfdcdcbddfbdabcbbbbeccedcdabacadeaabebcc`baccf`ccccccccccccdcccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccbdccbbbddcdcdbcccccccbbccccdbcdbdcccccccbcbcbcebbcbccddccbccbdbcbbccbccebccdbdccbccccbdaabbcbcbbbdcccbcdddccccdcbccbcbcbccccccccbcdbbccccdcdccbdccdcbcbcdbaccbcbcccbcbdbbecbcdccbccccccdccdcbadcccccccccdbcbbccdbaccdcdccddddcdbccdbdccaacdbccbbbdcddcccbcccdbccccccccccdccbcbcbccccccbbcdbdccccccccccccdcbcdcccbcdbcdcbccdcccbdcdccdcdccdcbcddccddbdcbbdcccccccbccdccccccccccccccccdccdccbdccccccbccccdccccdccccccccccbddbcccdccccccdcdcdccdcdccdccbcccbccddcdcccbcbccccbccbcccbcdccccdccbcddbccccbccdcbcccccccccccaddcccdbcccb^dYb\ecabfid]]idbi_gc]]eaaee]bacjcfbebaaf_^dc`ce_`bfcdmcf_bekabbf[b^j_hmfe`e\_gbjfccdeWeedidk_]dcafaakcj[`cgjh^``bc\ehe_cbiikdc[bZb^_jcgbbefaicbe]ca]^_adhcaf]fabcacj\`ca^\`^^l_aid`b^gi_f[ed[ihban]dca`cldYhfcb^]mh_`ik\df`i]fecihbfdalk`ebclc`gbf_geihibidig]]ccccccccccccccccccccccccccbccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccbccccccccccccccccccccccccccccccbcccccccccccccccccccccccccccccccbccccbcccbccccccccccccccccccccccccccccccccccccccbccccccccccccccccccccccccccccbcccccccccccc_h^cgceddgca^fc`ca_^degcdd`cbccec`b\kedbcfa^aahg^f_c_hbhbgc`_aecgageadagbbbgf_llib`h_adfebc`egef\cdibcdac`ebhabdbegd_ebf`fgjeebc`edcegfadf`adcgdc___dc`gedbdgc]cdb`hdacc`bdd_ee\`c_bkda_cc_kdbgbd_chdcb_^abafbZcbbdcff``f`e`dbdac`fhccfebcf_fkc`bbda`_fbhbbdcdcccccccccccccccccccccccccccccccccccccccccccccccccccbccccccccccccccbccccccccccccccccccccccdcccccccccccccccccccccccccccdccccccccccccccccccccccccccccdccccccccccccccccccccccccccccbcccbcccccbccccccccdcccccccccccccccccccccdccccccccccccccccbbbccccccccccdcccccccccccccbcccbccccbccccccccccccccccccbccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccbcccccccccccccccccccccccccccccccccccccbdcccccccccccccccccccbcccccbcccccccccccccccccccccbcccccccccbcccccccccccccccccccdcccccccccccccccccccccccccdcbd\\dab^idgjicgjTab\fafd\hg^bdcdadpdec[]a_cfdYheg]adhj`aX_ca\cfalfe^ikad_e\ej_eaaf_`c_Ubgfcccfj^`hg\fhef\kca]`__gd^jlfeb_a[dSiZd`]eaaj[\g`a\le`l`_gbac_`dbgfbagbi_dbd]clbbdeefeZgbicmfefadhacce\[e][lafj`Wgl`cgbjamcibbgjf`jehf_c[h_c^cadija_hccmfhp`eadafglhd`efh^\f_`aibicmhff`gc]_feY_]dci_b_cadeajaejffbce`km]bhkjefa_bdh^igkdh`faccbd`iccecg_fcecdclja_edebb`cde`abd`bh__bfaadfheg`fcbc`cadgahgdefdeg]ddba`dd`]d_`^ddeee_b\b\ce]iefgfbgb_afc`j]agi_cdgh]f\]Xcbii`_fe`_a`dd[dbeeb__cjhdgk_k_^bf[cificdc_df^`f`dld_kibceicfbddbdcbdcccdcccddcbbdcccbcbbccdcdcdcbdccccbdbdcccdcddccdeccccccccbccdccccccdbcccddccccdccdddcdcdccebcccedccecbcbbdccccccccdcdcccccbbbdbdcbcbcccdcbccccdcdccbcbbcccccdcccccccbccdcccbbbcbcbcdccdbbdcdccbcdccdccbbcabdbbccccedccbbbcccecddcbbddccdcccdccedcdccdccdddccccbcdcccddcccdccccbdcccccccccccccddcccccbcccdcdddccbccccccccccccccccddcccdccdcddccddcbcdddccdccccdcbccccccccdcccccccddbdccccccccccddddcbccdcccccccdddcccccccccdcdcbedcbbbcbcccccdccdccbcccdcccbcdcdcccdddccdcbccbccddccccccccccccdcbcbccddcccccdbcccbcccdccbfbdedmfcda`]fgccfgegedieacda`_f_agf^bedghcdb^\^_gea\c^cc`ecZa`lbh_dbbf_c`e\^_e`dbafh`_fbecad[fddcb`ahgcba_cddebcdc^_b^ecc_fhbbehdcadecbfeace_`bc^dcceb```_f`cdbba`e`fidlbce``ii`bck`adigcgdhdeea^e``ebihb\dc``cbeeddfdbbcbib]agcab^gad^bdc^fa]bebbdgfc_bee`hchhf`bhbkca_egd__acg_bf_aa^caebicbedc_adbbbga`hhdbeddb]a`^fd^abddfgeadc`gdc`ba`baeded`ddcdfdecg_cfgfdabbbdbicbbadgcbceccbe_dbbfdcdc`ed^abb`b_^a_dcbcd_cbbd`acfdgcggegdbbecbbe`c]d^cbceccjeebecicc`ccagjjdeachge_fb`ej_`dbbca`cefcdd`ebhj`ibbecbecbpeaceg_ccfe^cee_bbcccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccbccabccdccddaacbceebcdcdacbebdbcccccccdccdeaabdgcc`a`bbdcaddbcbcbcdddbbbcceccdbacacdacdfdabebdbcccefcbedcbcdabedfecdeccccbbceecdddebddccccdacdccccefdcafcdfedfccccacdbdbeaaddccccad`dcbcdccdecbcbbbcbdbcddbbdbaeabbdcbbadccadbcdccdbaeabcfdcfcbaccbccccbbddchcadcccbcccbccbcccdccccbcccccdcbcccbbcccccccccccccccbbbdbbccccbbccccdccbcccccbcbccccccbccccbcccbccbcccccccccccccccccbcccbccccccdccccccbccbccccbcdbccccccccbcdbccccbcccccbcbccccccccccccccccccccccccbccdccccccccccdcbcbbccccbbcccccccccccccbbcbcccccccccccccccdbcccccbcccbcbbccccccccdcbccccbbcbcbccccccccccccdccccecccccccdcbcccccccbccdcbcccccbcdbdcbddcbcddcdcbccccdcdccccccbccccbdcdccdbbcccccdccccccccccccccccbcccccbbbcbcccccbbccbcdddccccdcdcccbccdccccdcbdcdbcccbdcccbdccccbcccbccccbdcbccbbbcccbbccbbcccbccccccbcbbbcccbbdccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccecdeefaabcc`ce`cbbecdcccdccbb^cagbcbcecbcd`ddecbfcfad`b^ebaceccacde^aceadbdcaaccdddebdccbddcdaaacbecbcbccbbafbeedbabgacedddec`fcafdbcfcdc_gagbbcfcbddab`addb`dbedbcchbd`cdfaabadcbddbcbaebcbfcc``ccefadedcdc`fdbddjceccdebbcdbbddadccb`ffbadaddfad_hb`bdbb`bdde`cgedagchdhgV`hcbdbZ^_`dba^_lbe_cdac^hec`gbc\cZiZcaqahh]]b^^cdeb[acf]db_aaaie`gcfchlbbea`d]afdea`e^b^fcccei`f]d\hbgc[]\hke_ee_a`adcbeba]c^ffdhe`a_bh\dbggk`jkbdhf`dgcgbfcd^ebdabjaedi_ekf_abegbdbeadgafcbgecjgge`_^faWgg_\deefba`hbahah`a__ifjfg^afachbakbffbgffcddbdccdcccccbcbbbcccdccdccccccdcbccbccdccccdbddcccccccdcccccccccddcccccdccbcccccccdccddccbbddccccccbcccedecccdcccbcccccccbcccdcddbbccdccddbdcccccccccdccbdccccccdcccccccccccccccccbcddbccccccccccdccbcdccdccdbcdcccdcdcccdecbcdcbddccccdccccbcccccbcccbcccbdcddbccbbbaebbcbcbebdbab`cadbbceba_h`dcbc`deaddbecdgbebefccddbchdeb`abcdcedfbabdaddfebdb`bccaedbgddcdedcdaedebedeacadcdd`bbfddccbba`c`edbcbbbaaccbedge`lbdde`fa`dddbcccedbaeddabdabhbbbcebcacdbccbec`cbcdbaddgcceefbcbbcdccbcababbbdccebcccb_cbccebdcddd_cabdbcaddc`dccccccdcccccccccccccccccccccccccccccccccccccccccdccccdccccccccccccdcdcdccccccccccccccccccccccccccccccccccccccccdccdccccccccccccdccccccccccccdcccddccccccbdccdcccccccccddccccccccccccdcccccccccccccccddccccdccccdcccccccccccccccccccccccccccccccccdcccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccdccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc`ca]bcabac_l_d`c`da`Z_b^f`bliikghcb`]iYd_lZjj__[f^hbddjff`gdf`edcckib[kcdcegfa[_afkjkke^kaf`dfgak`fZa[^_]kcli^h_adbaeec`aa[`aeede`^b_bdbZ`jdg_^geegakm`bceabeefafgm]`ea]dbe`fbaehl`c_cfcefgagea^_\`abe_bckcbc\cXj``_[\ihe^bahjgaacb_cbh_`deijeaff_]`_pf^iaeec^d`cccccccccbdcccccdcccccccccccdcccdccccccccdccccccbccddccccbcccdcccccccccccccdcccccdcdccdcdcdcccccccccccddccccdcccccbdddccccbcdcccccccccccccccccccdccdccccbbcccdddcccdccccccccdccdcdccccccccdccccccdcccdcdcdcdcccdccccccdcddcccddcdcdcccbccccccccdcdccdccdccccccdccbccbccbccbcbcbccbcbccdcdbbbcccccdcccbcccccccccbdddcccccbcccccccccccccdcbcbcccbbccbdcccccbccccccdbcccccbcbccccccccbbcbccccdcbcccccccdccccccccbccccbcbcccbcdcccccbcbcbccbcbbcbdccdcbcbccdcccccccccccccbccccccccccddccccbccccedccbcccccccdcdcdccbbccccdccdccbccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccdccccccccccdccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccdccccccccccccccccccccd_acbacddec^_fcbeaZegYehhbiebdg]hebccbejccbd_d_g_ddhZd`\gfb`ebbdacgca^bbfeg`achgckbaccebddc_gceeeiaaagkedegbfd_ebacdida_`cgeabbdcibaabdcid`eciccdfaf]fbebaeba\dcf^bbl_gagcccagaiccdc`cc`_b_d^_abaaidcbgf`bceedgeaaebb[bhd_]efbdc_ogededee`ffeebcdhdc`egcgad`hfab`bbbbaccdbbcbaebacdbaccbeebccdedbcdbbfdcbbdcdcbabccedaaccbbcbadbebbbbbcbcbcdabebcbcfddcacabccccccedcaacaabbbcdbaadc`cae`ebecaccacdbdfadbaebecccabbcccdcddbdbcccdabcccdcbcdddcdbcbbdbbaddcbcacbccccbadcbdeccacbcbcbdcbcecdccebbbbbdcacdcdcbdcdcacdabecbcbaccbcbdbccccccccccccccccccccccccccccccccccccccccccccccccccccccccbcccccccccccccccccccccccccccccccccccccccccccccccccccbccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccdccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccbbcbcbccccbcccccbccdbcccbcdbcbcccccccbbccccccccdcbccbccbccbcdccbccbcbcccccccbbdbcbccdccbcbbcbbcbcccbcbcbbbccccbcccccbbccccdcbdccbdbbccbccccccacbbbcccbcccccccbccbccbcdccccbdccccccbccbccdcbccbbccbcccdcccccbccccccbcbccccccdcbcccccccbcccbdbccbbbccdccccbbcccbcdeabccddccbcac`cbcdcccceccc`bbbdcbccdbcccccccabcebbcbadeccabdccaccdcdbccb`cdccbdaccedebbcdbacbcb`cdabcccbdce`baabbabadccaccbabccbbdb_bbcce`bdcdcbccecabdcccdcdcbccbcabcbbcdcbccecdaccdbbbecbbbceccdbbdbbcbddbbcccb^aebbccbdecbdbddcccacccaadcccccabf_ebcccdcbdbcbfd`f^^blg_ag]aacfcfbcfcmf]ilef`dX^^eabdaaj]adedhg[b_ahfbce``hgdfk_\`rhkhdeaYb^l]a_h`X`_caecce[^ddg_bhagcbbhac_aaeab`faccde`]aekhecgacjd_eYe\ea`d`]gbfbh^pddZ`fbY]^cdacp]_^\``f[cg`dd\d^`^cadigfdgepf`ef[\c`ebbbgib`ggnh^cXbd`b_iaaaekobmeg^bdbeabgii^ajda`co]af`ccccbbcccccccbcccccccccccccccccccccccccccccccbccdbccccccccccccdccccccccccccccccccccbccccdccccccbcccccccccbcccccdcccccccccccccccccccbbcccccccccccccccccccccccbccccccccccccccccbccccccbcbbcccccccccccbccccbccccccccccbccccccccbbccccccccccccccccccccccccccccccccccccccccbccbcdbbdcccccccbccdbccccccbcdccbcccccdcbcccdccccbcbccccccbcbcccccbcccdbccbbccccccbbccbcccbcccccdcccccccccccdbcbcbdcbcccccbcbccccdcbcdccbccbccbcccccbebdbdccbbcccbcccdccccbccdcccccbcbcbbbdccdcdbdcbcccccccccdcbcdcdbdcccccdbcbdcbbbadcbcbccccccddbcdcccccccccccdccccccccccccccccccccddccccccccccccccccdcdccddccccccdcccdcbcccccccccccccccccccccccccccccccccdcccccccccccccccccccccccccccdcccccccccccccccccccdcccccccdcccccdcccccccccccccccccccccccdccccccccccccccccccccdccccccdcccccdccddccccccccccccccccccccccdccccccccccccccccccbccccccccccccccccccccccccccbccccccccccccccccccccccccccccccccccccccbcccccccccccbcccccccccccccccccccccbcccccccbccccccccccccccccbccccccccccccccccccbccccccbcccccccbcbccccccdcccccccccccccccccbccccccccccccccccccccccccccccccccccccccccbccccccccccbcccbcccccddcccccdcdccdcbccccccccdccdcccccccccdccddccccccdcbcccdcccccccccccccccccccccccccccdccccccdccdccccdccccdcccccccccccccccccdccccccccccccccccccccccdccccccccccccdccccccccdcccccdcccbcccdcccccddcccccccccccccbccccccccccccccbccccccccccccccccdccccccccccccccccccccccccddcdddcdddccddccbcddccbdcdccdcccccbccbdddccccccbdddccdccddddadcccdcccdccddcdcdcbccccccccccecbdcdbcddcdcebccccdcbddcccccbbccddcbddccdcdddcddcccccdcddccccecccccddccdccccccbccbcccdddddccccecccdccdccdcdccbcccbcdddcddceddceccdcdbcbcccdccdccccbdddcdcccdccedcbcdcccccccccccccccccccccbcccccccccccccccccccccccccccccccdcbccccccdccccccccccccccccccdcccccdccccccdcdcccdccccccccccccccccccbccdcccccccccccccccccccccccdccccccccdccbccdcccccccccccbcccccccccccccdcdcccccccccccccccccccccccdcccccccccdccccdddcccccccccccccccccdcccccccb`ielchfadd[gqjgc`edhlijb]jej^l]]clYjeaegi\a`_bbibk`aZhqj_q`f_i^`bga[``hi_abbkZZei`g`d`Vp]gdcae_g[`\ag^e_che`Zi\jZWjV]abZnf`o`d_e]Znfgkajij`f[o^`fh\iedbcshbiib``nXiahjaVXeadcdbdd[]lhYjfec]`be^efdb_dggc]`\e]bbmiab_amedbbffW_e~h]a[`jk^dfd]Xhgfe`^Sidbc\ligah`kcccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccdcccccccccccccccccccccdcccccccccccccccccdccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccdcccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccddddbbffeccdccccdcccbcbfccddccddbcdcbedcbbbcccfcccdbcccdcbbccedecdccccbebcccdecceccddccccfdceccdbbcccdcgcdddcccbbccdabcddcbfdbcbcbcceceadccccbcdgbdddecdbcddbcecbecfdcddcaccccefcbddedbcbdebcbccedccccdcbebdccbddccddcdcce`cbcbdbcccbbdcdecabccecddededddbdcbfdecebdbddcbcdbbcecdbdcbcbcccbdbcaaccbbdcbbeccccdbcbcbbcdecbeccddbbcbeddbcddccbbdccccccaccdcdcbdebccccecddadcccddecdecdfcabbdbbdcdbdccdbdaebccbddcbdccddcdceaebdbcceeccccddcccdbdcbbcd`bdbbdbccbbcdbcbbcbcddcacdc`dbaccfbdbcabbfcecdcdccecba`bcfdddbebecbccdcbdabcdcccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccdcccccccccccccccccccccccccccccccccccccccbcccdccdccccccccccccccccccccccccccdccccccccccccccccccbccccdcccccccdccccccccbcccccdcccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccacaaad`begbb[``b`a`be`addfb`ce``gdee^fhdcedbfe_e\dejbceZ`bdcacba[bbd`dcbdfddb_bbdbegbdc`bbacebfbefa_\cegedfdbcabdefd`a]dddebecddadbe__cad^eb_f`aedee_fdjafceccbebbe``ec]bbef`^`bfcedcabdaa`bdddc`ceecbdjadadcccea`cg__egccabdecbcb_bdchfebdcg`bdfce`_eddhadcdcd`ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccZd`efeegmfdNakd^[fggZdabbm^icid]e^f`[^chdcfhkdjdgb_f_bg]df`gcXfj_ajkehd[dilaajgal^adcZdb^bb^clZocbd[co`d]lkaf`dee^bclpe[d_ZfjbkeY__m]beob``Zl``Udc`glged]a^b[Zec^fjbfd^abZagc^]`bf\bga\[X`X^m`]b^h[ebbjh]kecgcgm\`aghY]ndfcklbibh^aZbffj`b`e`hbfdjqg\]icccdga\e\cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc[[khja_ddi[c`\ccacjcin``aei_ojfkagdddg^Z^ifaahbh_`cfcZjpebichhiibaedidd^^m`eele`dfdehm`Wcg^cb`jbh`e`^_k_eea]__k^aidn[Z`d`_jc]`gejeca^WbebbdaicidW^fjlbbfb^]g]_dakd[l\Z_laiadlabho`j_embemdif]_dlgaim`i^bmd]`igdechida\c]e\if\`dc_]eibbgZ[^cf\Zccfead\_ghXig^b_]`cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccbccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccdbdbfcbcbbbbcbab`bddcbccbdcccbcdcaccabccbdbccccabcbccbedebccccabbfbbcbcccebcbbacbbbccbacaccbcbbdcbcabcaddcbbbbccdcbcbbbccbabdccdbbbcccbcccccbcaccddabcdccdddbccbcdbcabbbbbccabdcddddcccdeddbdbbcccccbaacaccbcadbdbddcdefbdbcbbdddacbbcbccacccabcbccbbbedcbdbbbdbcccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccdcbccccccccccccccccccbcccccddcdcccccccccccccccccccccdccccccccccccccccccccccbcccccccccbcccccccccccccbccccccccccbcccccccccccccccccccccccccccccdccccccccccdccccccccccccccccbcccccccccccccccccccccdccccccccccccccccccccccccdbccbccccbdbccdccccccccccccccccbccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccdbccdfbddededcff`eeecebcbcdaaecddbdbbfcccbbceaceccadgcbcebcdddecdcedbcccdbbebc`dfbffcdbhefececdabaeceddccddgfdcaadcdebdcecageccbcdcedfcedcdbccedccdeebcddbb`fbeeffccdgbicfdcdddbbbdbdcdbcbecdecbecbadbdccefhbeaccbeabdbaeddadeccccbccdcaaddccgcdccagecbccccbbfdecccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccbcccccccccccccccdccccccccccccccccccccccccdcccbcccccbcccccccccbccccccccccccccccccccccccccccccccccccbccccccccddccccccbccccccdccccccbccccccbccdccccccdccccbcbcccdccccccccccccbcccccccccccccccccccccccbccccccccccbccccccccccccdccccdccccccccbcccccccccbcccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccdcccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccdcccccccccccccccccccccccccccccccccbcccccccccccccccdccccccccdcccccccccccccdcddccccdccccccccccdcdcccccccccccdcddcccccccdccccccccccdcccccccccdcccccdddccccdcdccccccccccdcdccccdcccccccccbcdccccccccccccdccccccccccccdccbccccccccccccccccdccccdcdccccccccccdccdcccccccdccccccccddcccccccccdccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccebddebcdcdbdcccedeeccceddecccdecdcdcdccdcddccdcdcdcbdbcccbdcdcccedddcdccccdcbdccccddddcdddccccccdccddccccdcccccccbdccddccccddcebccccdcccdcdccccdcdccccceddcdccddcccddcdddccbcdbdccccccdecccdcdcbdecccbddcdccceccdcdcdcddddccbedcccdecdddcddbdcedddcccccddcdcdccccccccccccccccccccccccccccbcccccdccccccccccccccccccccdcccccdcccccccccccccbbccccccccccccccccccbccdccccccccccccccccccccccccccccccccccccccbcccccdcccccccccbcccccdcccbcccccccccccccccbcccccccccccccdccccbcccdccccccccccccccccccccccccdcccdcccccbccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccbccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccbccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccddcddcccccdcdccbccbdccbcdccdcdcccccbcbccbcbccccdcccdcccbcccdbcdbdccbccbdcdccbccccbcccdcccbbccdcdbcdccdccccdcccddcccbccdcccccccccbdccdccddbcdcbcccccccdccdcbcdbcbccdcdbdcccccccbcbcccbdcdccdbcdcccddccccccecccccccbcddcccccbcbcccbccccccdccbbcdcdccbcccccdccccccccccccccccdccccccccccccccbccccccccccccccdcccccccccbccdccccccccccccccccdccdbdccccccbbccccbccdccdcdcdcccbccbccbcccdccccccdcccbcbcccccdcdbccddbcccccdcccbccdccccccdcccccccdddcccccbccccccbcccbdcccccdccdcbdcccccccccbcecccccbcccccdbcccdcccdccccccccccccccbcdcccccccccccccccccccccccccccccccccccccccccccccccdccccccccccccccccbcccccccccccccccbcccccccdccccccccccccccccccccccccccccccccccccdccccccccccccccccccccccbcccdcbccccccccccdccccccccccccbcccccccccccccccccccccccccccccbccccccccccbccccccdcccccbccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccdccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccdcccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccdccccccccccccccccccccccccccccccccccdcccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccca_bedafcech^ed^dadcbdgfdid`ihbafabadb^f]eficbbeee_cgbeccbfiabedeeaf`cbcgdbg^`cacecca`fcdcbddffcd`cbhdbdcaecedeb_a^ecdcbd^dhdeche`_ccgdedfeddbac\cccebbdafdeg`bbdaccfdbcbcddcgacbecafgcacda_e`dd_bcdgegef_fcea`dbbdccbg`ibda_d^addccaj^edgciacdececa`cbgeaeef]g_bdccdcddccccddccdcccccddccdccccccccdccdcdcddddcbcbccccccbcdccccddbccddcccccdcdcccccdccddcbccccccceddcbdccdddcdddcdcdcccbdcdccddcecccdceccccdccddcccddddccccccbcdcccdccccdccddcbcdccdcccbcdcccddcbccccdddcdcccccbcddcdddddddccddcdccccccdcdcccdcdccddcdcccdcccccdcccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccdccdcddccccdbcccdddccdccbcccccccccccbdcdcdcdccccecdecddccdcccccdccdcccdbccbcdcbcccdcdcdcdcccccddccccdcccccdbccdbcccdccccddcdcdcdcccddcccccccccccdbcccccdbceccdccdccccdccdcdcbccdccccdbccccdccccddcccdcdbcccdcccddbcccddcdcdbccccccbcccccdccccdccccdcdcccccccdccdccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccdbdbcdddeddcebddddccbdccccdddbdeccdcedcddddccccbbddbdcddccddcdbcdddcdecedcdcbfddedcdbdedddccddfdbdccccceddcceddcdbccccdfdcdedbcccccbecccddccccdeeebecfdddbcccdeccddccacccec`cbdeccddcedccdcdfdeccdbceddcdecdcddddacbdbcdbecdcccdccecccbbbcbdddccccccbdbdcbcbdcdaccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccddcccccccccccccccccccccccccccbccccccccccdccccbccdcccccccccccccccccccccbcccccccccccccdcdccccccccccccccccdccccccccccccccccdcccccccbccdccccdccccccccccccccccccccccccccccccdccdccccccccccccccccccccdccccccccccccccccccccccccccccccccdcccbccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccdccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccdccccccccccccccccccccccccccccccccccccccdcccccccccccccccdcccccccccccccccccccdccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccfcbcdccbccbedcbdbcacddbcbdccdcddeeebcdcdeccbbbbebdcebccbeecbcbbdccbcddcdcccccdbcdcbbcccdcccdceeddcdcbdbdddcfdbcefcdbccbccbdccbdddefdedacbebdccddccbcbadcbcfdccbdcbddbccdddbcbbabaccbccdbccccbbbccedccceaacbecdacddbeaccedcbadcbccabcecdfcbddbeebcceccdeddadcaccbccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccdcccccccddcdcdcdddccccccdbccccddcdccddcdccddccccdccddccccddcbccddcccccdccccdccccdccccccdcdcdddccdcdcdccccccdcccbcccbdddcccccccdcccccdccdbdcdcdcccccccccddcdcccdcccccdcddcccbccccbcdccdcdcbcdccccdcccdccccdcdccbcdcccddcbccccccccccbcdccddcccccddcdbcccbccccccdddcccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccbddddcccddccccdcbdcddccccccdcdddccccccedcdcdccdccccccdbbcdebcddbcdcddcccccccdccdcdddcedcdcccdddddddbddecdcccdcddcbccdbddcccccdcccccbccccbcbcdddddcdccdccbcccdecdddcccccdcdccacccdccdddcdddcdcdccceddccdddeccccddccdcccccdcddccddcddcdbdcdccccfdcdcdccbcdccdddccdcccccdccccccdcccccccccccdccccccccccccccccdccccdcccccccccccccdccccccccccdcccccccccccdcccccdcccdcdcdccccdcccddcccccccccccccbcccccccccccccccccdccccccdccdcdcccccdddccdcccccccccccccdccdcccccccccccdcdccccddcccccdccccccccdccccccccccdccdcccccccccdccccccccccccccdccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccddccccdcccccccccccccccdccccdccccccccccccccccccccdccccdcccccccccccccccccccccbcdccdccccccccdcccccccccccccccccccccccccccccccccccccccccccccccccdccccccccccccccccccccccccccccccccccccccccccccccccbccccccccccccccccccccccccccccccdccccccccccccccccccdcccccbccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccbcccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccddccbccbccddcccdccccccdccdcecbccccccccbcdcccccbcccbcddbcccccdcccdcccccdcccccdccccbcddcccccbcccddcccdcccdcdcccdccdccccccdcdbccccccccccccbcccccddcbcccccccdbcbcccccccbccccccccdbccccdbcddccdcdccccccbccbccccdccdccccdccccbccddccccddbcccccccbcccdccdcdcdacgcacfaeaf`efdcia`ckh`agee_e_``accffafbg`feagafbdhbdf`^b`a`c`cfbbbcdc`chebd^cbbai`_dfb`edbdag`efadbeibahc``Zidea_e_e``dc_d^aaeadbd__dcibba_bba`b`ebcbabef`f`cahdgbchdl`abcb^ace_gbed`abcgedaedbedaf`feba`cdfbdbabcccbeiffbaebbfdf`ha_eiabfibafga`gbac_c`cfdddgaccccccccccccccccccccccccccccccccccccccccccccccdccccccccccccccccccccccccccccccdccccccccccccccccccccdcccccccdccccccccccccccccccccdccccccccccccccccccccccccccccdcccccccccccccccccccccccccccccccccccccccccccdcccccccccccccccccccccccccdcccccccccccccccccccccccccccdccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccdcccdcccccccccdcccccdccccccccccccccbccdccccccdcccccccdcccccccccccccccccccccccbcccccccccccccdcccdccccccccccccccccdccccccccccccccccccccccccccccdccccccccccccccdcccccccccccccccccccccccccccccdcdccccccccccccccccbccccccccccccccccccccccccccccccccccdcecccccdcccccdccccdccccccbcccccdcccddcccccccddcdccdcccdddcccdcdcccdcccccdccdcccccdccddcddddccdcddccddccdccddccbdccddcccccccccddcccdddbccdcccdccccccddcccdccccddcdccdccccdcccccdcccdcccddcdccccdcccccccdcccdcdccccccdccddcccccccccccdddcdcccccdccdccdcccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccchihh``ibca[abhag^egi^faceacdghhdkfdce`dgcdff]daed__bddek_ibbda`edhegjec_egbcdc][a`jb_fegV\dkcf_fd`fd``e_aabde`fX_\f]gd^cflZ_``ke__fj_lh^badd_d^djgfgiacefn^jflncaajdcc`fjgcb_]_fl]dgbe\dba^agabc`iecadk_dgZbl[dc`jXfacgheeehdcj`fh]gdii]ch^faedefhc_^cnebeehkbb]cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccdcbccccccccccccbccdccccccccccccccbcdccccccbcbcccdccccdcdccbdccccccdcccccdccccdbccccccbccccbbcdccccddcbccccdcccccdcddcccccbccccccdbcccccccccdcccbbccccccddccdccccdccccddccccdccccccccbcbccdccccccccdccdcccccccccccdccccccbdbcccccccdbccbccdccccccbccccdcbcedcbddccccbddccdccccccccbcdccccccdccbdccccdcccdcccccccdcdccdcbbccdbccccccccccccdccdbdcccccccccbcccbccccccddcdccdccccccbcdcccdcccbdcccccbcccccbccccdbccccccccccccccbcccdccccbccccbccccddccccccccdccccccdccdcddbccdbccccccccdcccbccddcccccbccccccdbccccccbccbcbcbccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccdcccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccdccccccccccccccccccccccccccccccccdccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccbeddcbccdbdc_dbbdaecdddcddbbbdeadeeabccdcbdccfdecbcebcadadgddddcbcdddceabgebdccadeccc`ceedcdbadacdbgcceddcbbaccddceddcdacbdbdbcfbebaccdccdeaacdeccebedaba`aaaeececbbcbcdcdfbeeabedcacaacccddebcbdfcccdcdfebcbcabccacbbdcdccbcbedddcdcbdcbbacdedcfbfccccadcdabfbccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccbdbda`dbbbbdbdabdcdddcbcccdbbbcbdcbccbcdbbdcdcddbbbbaced`dbbcbdcd`cbdbcaabdedcddccbbcccbcbbbcdabbacbcccccdcdadbbbcbdccacbbabbbbccdbbdcccccbabcc`c`cddbccecbcdcccccdbdccecceccbccdbcbbebbbbcbbcccdbcbdbcabdbbdd`dcdcbdbbddaaabecbdaacdbdbccadcdccbcbceddbbdacdbbdcccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccbcccccccdddccccccccccccccccccccccccccdcccccdcccdcccccccccdcdccdccdccccdccdcccbcccccdcccccdccccdccccccbccccccccdcccdcccccccbcbccccccbccccccdcdccccccccccccdcccccccccdcddcdcccccccccccccccccccccccccccccccccccccccccccccccccccccccccdcccccccdcccccccccccccccdcccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccdccccccccccccccccddccccccccdcbcccccccccccccccccccccccccccccccccccccccdcccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccdcccccccccccccccccccccccccccccccccccccccccccdcdcccccccdccccccdccccccccccccccccccbcccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccfcc`d`bedcdfibecaccecc`bcdacfdicdccdcgadbdedbedbeacbbaadccb`c`aceccccddcbdbddaedgaefbbcbdcbcbaeaecbcebbeceacc`ecadcid`ceeebgecccddgdhagbacdedbed_cc]dbcbbdcdbabbeeadacadccddcde]ce_dddebddccbfcddf`dfcdbdcacdcddfbebdb^cbdd`dedbecdccdcabdccdbecdbZhededcacababcccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccbccccccccccccccccccccccccccdcccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccdcccccccccccccccdcccbdbcdbbccccccccdcbddcbaccbbccdbccdddbcdcbcccccdccbdcccccccccccccbccddcccdcccbccccccdccdcccbdcbdbcbdccccbdbecccccdcccdccdcbcbddcbbdcdcdacccdcbccdcdcdbbcbbccbdcccddcccccccdcdcabccccdbcdccccccdcdcccccccccccbcbbcbcccbcbbccdbccdccdcdedcccccccdbcbcccdcbdcccbccccccccccccccccccccbccccccccccccccbcccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccdccccccccdcccccccccccccccccccccccccccccbccccccccccccccccccccccccccccccccccccccccccccbccccccccccccccccccccccccccccccccccccccbcccccccccccccdcccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccdccdcccccccccccccccccccccccccccccccccccccccccccccccccccccccccccbcccccccccccccccccccccccccccccccccccccccccccccccccdccccccccccccdccccccccdbcccccccccccccccccccccccccccccbcccccbccdccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccdcccdccccccccccccccccdcccccdcccccccccccccccdcccdcccccccdccdccccdccccccccccccccccccccdccdccccccdcccccccccccccccdccccccdccccdcccccccccdccccccccdccdcdccccccccccccccccccccccdcccccccccccdccdccdccccdccccccdccccdccccccccdccccccccccccccbccccfaake^fmdY_bigbb]ciXaZfjkghfagiTp\_bd^dfj`efafc[b^dd__ie^[b_g\ahcaWalZWejfef_jccVbf^bf[ifhhemhiih__hcZsjddV]_cU_dbkcekggdega]efjceff`h_k`[gYkcbhiYad\]gb`_dgibeeg_Wb`]^Zf_f_cc]bca[d_^lgdhhgbmh]`haab`fb`gdeechbpf`fbWfnbabe]gif_behZniTte\Zhhdehhe^bciehtceo__bbgcca`ababcc_dfkfgg_abcca_bbfed\ehf`cah`fdb`\aeeggcedecaddadcccc`ief`he`fa^cbg`cedfdafcb_hdbfdbcdfjdcgef`cdcfcbadd_bdbbbaefdebecbbddedcafafhcibfcccc`e`jeaeeddgfbbdedfecb`ed`ecabc^af_fdccbebcebdeceeif__gccce_`cd`ccbdhcaaggffZbbcdd_bdecc\bcebacn`i`bbfc_g`faccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccdccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccdcccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccbccbcddaccccaceccbbccbbbbcdbccddcdbcbbccdcecdbccbdcccddccecbcbdccbcddcdccbcccbcdddbeccdcccdcbddcdbdbcbccccddcddcccbcccaddddcdccdcdcccccccccccdcdcbdcddcddcebedccdcddcdcdccddcccbcbcbcccbdccbdcddccbbccdcccccbcceccbdccccdcdccecddccbccbcbcbcbdcdccbdecbcccccbcccc`bfRagc]c]x[e^le__mj_Wj]^e^lfrjqk[mddd]_^ndXqcZiccd[W`al_YKiqUf\eZ^c^`kj[]lsgn`^k_Vlcge_YYdajjdfbkb`emprg`wschLXnlt^_[Zf_dedaeaUjc]]akhWgjYzQYY]:\Xjcabe~Lf\k`flbhenZjYbcT]a^\^keahYlhae_gaid_\bY`bbbh\\c]_nnp`[^_^ub^m[b_aeii]bhg^oahbTm`d\fXZg\NkX]kr[dhkWidWbbcccbcccacbcccbbccbccccbcdcdcbcbcbcbdccbcbbccccccdcccbccccbcbbbcccbbcccccccccecccbcccccccbccbccbccbcccbccbcdccbcccccccbcbdbbccccdbccccccbcccccbbbcccbccddcddbccccbcdcccccccccccbcbcccbccccdcccbccabccccccbcccbbcccccccdbbcbccdbcbcccbccccccbdccbbbccccccccccccc\fd^b`h_mjfnei`^Yfak`cagl]]^_igug_bgdc]m\dQa[ebbdaX`\^k`fqaf]Zff`j`f_]o`cld^aZbZc_Vifdbh]ed[hccogpe_^ddl^hk]fZfki]deojf]Zajlflfjci^_[fZYlb`dj[paebc]knbmR`fb_f\diW_gXgkeb_mZgZcj`ghc^be`hjVe[ZZbjhpg[b][itie^fna`blcYZpefu`\fj`iRfhU_ecgh_hmgia\h\gfaijj__h`gfiakb`^]ag[gbed[[hcubbqd[bcg]a^cZ`kaW_iriheaj\eh^bfe^j[dVbTe`Z]fXdgbhiobeg[^de_`a`daa_]VdcddehgZ[dlkVYYem_`cceqa^egce[j_eikkoVhbkcfdb``^hg`dj_caa]^^]oa`j_f\dd\^dg`pca^U_h`Ub_gbdeaXZfe^gfef][_ce`h_^e\ZYc``dhd_edaXlbc_bkhbXikaeifedegeoZfbfWi`Zb]cbagZnh_`dafiim^mjaW]]a^Sab_p\]adca[i`fh[]hbkY`[^ho`gdhehe`pg]j\gkqf]jpggca_ec_rhfeaohjfemfb\ib^a]g^ccmfc]^aei`k\d\hjcYchbYfbaef]bibd_b`_`Xga_ihcjWrc`]cdhk`b`\afvg_baqmhcdfi^j\_gffaW[^`eVUaZm`Vncabdch_^jc`lYmWa^^af^idVbjhjZ]fbkeghYjW]f\f_mb``X_Z_gjjiejfr^gY\Z[YVnb^d`kh`__bebbbd_bcaebchdbfcbc_ehbdnefdh`_ebaaa`egd`jck`bege]faf_ccag`_ee`cbebec_ae^_hgabch]`^cbbaacecedggeacdedabbg`eaeeef`bd`bdefdhhb^a`\adkccfi`ddfbc`d^d\gd^^bh`_b^bhadfbafcdbdcdcfda`cdaaecdhba_edfd_b`bf`e_`b_ah`c^gfghafgcdf_baf`cfcgaccibgfhiabfdaefbadecbdcea^jbe`efdibececc^ebhcbjebbdad_df`becdebcad`dfdagebbhbbea_eccaaabg_baef]ca_a_bhd_^bcfdced^iecbeabdbb`dfcfehgbbabafbbeifddkkbhf`dedf`\`gagfhedga_af`\^afdda_b__``[d^cebceaf`badggde`geadgcdeeeicccecbad]`gfggbdebebbbcbed]cdebaddbafba]gc`fb_ge\j_`aaagedafaiccg_bb^e_eccccccdcccccbcccccccbdccccccccccbcbccdccccbcbccccbcccccccccccccdcdcccccbccccdcccccccccccccccccccccccccccccccccccdccbcccccbcccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccdccdccccccccccccccccccccccdcbcccccccccccccccccccddcccccccccdccccccdcbccccfjmfge][jjabVZeej]e\fl`Zaq^\ilio\eY^fe\akM``crdgchccehglkiqffn`pha`ddaUljaaj[dcifXxeg_e`ojfhea`c`bik]bZi`fcdcgeQ`[blnW_b[hoi_]efgb]_ccnk^am\Zfkend`ghnemVlgec]ja^__bUUfZ`eic^d[aei]ga`c[cdgjTdk`aYdr`eWilP[cba``fbkb]_[Zja`dcdY]`bebdfi\`V__ga_^hgll[igabij\^_habedccdcecccacdeeecddbdadebdeecdedccecdebbbdcfbecfdebeecdceecbbcdgcebdcdebcacceeccecbecdeacddacddaccdebccdfccbdcebdcedeadcfbbdcdeccaeccbcdeabcbcddbcddcbdccddbcacbbceaccdcdegdddcdefdbbfdcbdadbecacbdcdccbbccbcedeebdeddddcccdcdcfcaacbcccdaccbceebcecdcccebfdcdak_dWnmV_Zddgf]e`Z^Vke^jh]d`jhadhhj^brgV[_aV_`_dh`]Zkm`ilh`cgh^Vpa\[sqXje]gkfZeXZd`d_\ibbSajieWei`ghaZZ]hYb\ydKkheR[]i_bkc__ge`\kafZdU^eaNfo`Xbifesj^bjgk_]mbkhhYh`mb\de_ds^]g]db]KW[j`ldji^]]\idgWjc]TqehvgegodT``Rh_iqfeomeYm[dbb^l_m]UiZebrgaliqcVi~aeaUc_`Y`mddcdecccecdffcbccbcbabbddddcdcdfecddedceccecfadedcfadbbccbedfeadbadacedccbfcecccddedcccccbbebacddceccaccbdadedbfcdbdceaebcedbddccbafcddebddacabcbfdcdddcgb`dbbbecedbddceccaceabcfcaadbddeeccecbbccaebedfcbcbdcccdc`cccedbcbbbegddaeceebebdcbddedfcbdadeebccbbccal[e\[`r]coakbb`hiP`baf_h]^jqdobg]ecijWdw_lhcdf]q[^Yb]^`agi^c__je[mgmc]c\c`^Ydf[ecb^agh_[^c\lc_]an_qfLgg]enli\]e^cXbOcY[b]ihegf]`gfhVZ]cT_[kWbmleZdZoUcdfffjf^[i^i]affcehg`fcn_eegZ^ev{\Uio^j^_gcqe\fXbra[o`ahebgicbfrVeUai`_Yjafaf_jbi`ogggWWLdj`moaga[jdanbcb[kdedcdccbaccdecacccdbcdddccbcdecdcbabdcdddcddcdcfceccddcbcdbedcbbccbcdccdcdddaecdcccccecdbcccbccddbdddcdccccbbddcbecccccdecdbccddbbcdacedeccdccddbddddaedcbcbdcbdbdcdecddbecbcdcbbbdbdcbacccdbecdcdddddedccdcccbcebccdedcbbcbdbdcdadbeccdddgddcdccccccdbbcdbeccdcfgfd`in\heZfqb`i_U^gU]eie\oebbpcdh_djbYuofsdfi`fUalVWjkgfleblaekb_dd`e[kc_fd^`e[\]]hie[dk_gp^cfhgi^h^_fc\amhl__^_hflm\ZcYhaeafiiRdic`ucd]ie`\nY]cOiq_ec[mdsdkZ\`dU^cgl_^gatddXg_e^cahp\df^Wj_aQ^YeRkaajgdWhYpaee^dY_Z^dcj]`^bZ_lbm[Zbie\gka][ak`[uf_pdc^iqnc_shkfciejeb_iZ^_Yqeibjhc^dea][Qedfa[`ceic`q_f`]c]^_mbi^kedfY`_\wfc[[fZ\ag\gWjfeebkSagjlkde_Zdhcdi_]egje]deg^^_f\Ni_be]iRb\fdajje`]cdaXgcd]\ibW_eWXb_o_lcecgsmfg_^alZbpcblde\c]fYe`vj^jmbScfgoaeackk^i^fe^_ngh`_akl\d`_[[igdcx]bVsacbfi]^\ml]Vf^iadjckob_bfchhih^^ga`cdfbddbfcebdccdfcdabeedccbdcebccbbebbdbddbbcccebcdcc`daabbdbaeccdcedccaececedcbbdccbccfddebdddfbcddbabcddbcdbcdcccabedddcabcdcccdddecfbddbcececbdbcddddbecccebccccbcaccebaaebbccdceddbbcedabccdcdbcccchcacdbdcbdb`ccadf_acdbf``decddbccbcedcdddcebddbedbccdedcacbcbcddcdbccccbddcbcdddcccdbccdbbdcdccdcdccdbddddbcdcccccccccdccbacccccdbcddccccbdccdcccccddcbceddccdcddccdccccccccccdddccdcccdccdccdcccdccdccbcecdcbccbccccdacddccccddccccdcdceccdcbcccdccccdddbcdbcdcdebccccccccbcebcccdcdbccdcbcddbccccdbcccdccddcccdcdcdccbcwjio^b\ana`Saf^iVgc]`jceccd_fcbdo`W_[TlYl_kh\Xj`j\j_a[gceegeil_]_X\`kdgca_fcda_^Yhejkejb_cYggfce_`^afg`_fd\aasbfel`f]c_ld`fU\[iXeUagceelaffaadhbeacpc\\\Zc_^UjfifX_ebeafggfq^l]knfl`bc[iagcbfgb_khldjmeb`YZWb\b`olZXbk\Wgc`kg]a]iYd`heh^^dlfcdfg^m\l_bW[ceicd^Z]_edbbggaegdb`eabbec_edbfddcace_d`fbbdbeccfgebdccbffbe``djde_e_cd`abccfeadefdeccdbe``bff`bdfedbifdacbcibbgcdbecdaaf`ddc\bab`bc^aebhabadacadde`eba``ddcac`_efahfadaacceggaeeagdja^bfb^afdea_dfhfdbaghcgedf``cfa`ab`a_`eadef`e^difbbbcebbb`ed_be`defdedcfffeeddc`efcbddccdcdcccbcdcdbcddccbdcdccccbcdbddbbcbecccdccdccdccccbacbcbdcadedccccbcdcecbcdcdddccbacbcdccccdbbcbddbcdccccbecbccbdcccccbcdcdddccaccdcbdccebccbbcbccbccbccccccdcdcdbdbbccdccdcccccdcdbcdecbccccacdcccdccccdcccdcdcddcddcbccbdcdddbbdbcebbbcdcceddcccbdccdccdd`gdia`je_bth]VgfakYbc[iWagu`_oXc^lhf_hfch[_dgjefbZ_^mlooac]ffblcal^Xechdgbdb`cbh]_fgk^`^`[bdmf\_]che`oYRjVv\^^\Y_cYU`^dhcikg^jed_lfe^fjfebdjbaX__bbhVicyc^a`[``gjYeg][dilc^ggpafkfhbn`]`gpXd`daqfXYad\d[hg`aejaj`gdj^`Zf`_eZ_di`jhb]fduecf]dbcadgTd]Zjdcgga]d]_dbfbcfcaacda`ccbcbegabbdabbddedaccacdbecbecbgbcdabfcdbabafcbbbca`bbcdbc^dbccaebbccbdcdcefeefaaedd_decccecbdeadcedebdec`dfabdcec`dbdebdcdccdddc`c`db`cbbddbabdccbfdbdddceafbddebaccdba`ceeddcedbecbadabd_bccfccceddeddcdadaa`efccccdgbcbbbb`cbcdbabbcacacbdcc`ceecccabcbbabccdcccbcdbbbbcbccdcccacbcbcbdcbbebdcbcacdbcccccbdcbaabbbbcdabdccdcbccdbcabccddcbbbbbaddbcbccc`ccbccbccbdcccbcbbbbccdaabacdccccccbbdbabccc`b`ccecbbcccacbccbcaccdceecdcbbcbbbcdbcbcb`bcabcdcdaddadbccdcaccbbbdbcdbbbdbcbcdcbcbc`bbcccbbcbaebccbcbdbcbabC``ugb]Toc`hNmhSz`bNWcfZir]b^nfXWdgcbhjec]adjdOihqp]TWjf_[mDc`qnakla[eLhfUVgfogah]`cblbFhe]\k^fdodQeoc`cfhZbijdje[vfjjleb\biW[jl^aba\memce[akdjeejVdclcajh`bflUecca_\_chekccifebkn]Zfl`jhY`^jfirjd`gi_a]rYcbaif]dk^bbe`o`cleUYkda\oZhhWU`cdced`a[dmc^\_f`ecZemfc^Z`ejf[M\[fa[QWVham_[ckUl\n^fYd_g`ad\iX]keh^[kgjYcb]hZWQddkc[ic`^h[]i^]`]i[jilfccWahiZgcif^bsXej\dajX]rqhbj]ddagllcjfa^^u\]ae]b_heqtceafe_ahSbofc^gZ[jeWl^pi]l^ohgch^qld][pTZphZeU`hYjdie_v[g_l\hap_\HcibSe^^qik]eZeZXrb`_]hfejjniW_n\dZfmmfjjbidx^bfbjp`h]dVW`edU[`m_\u[XaVqkcY]_agd^mlqpcQ^_on`mmdVdjZ^ka`mg\ecZ`Vgk`^lLdibehdpcdMfd^\m^[`]``ag`]]qhUZPdX^SekZZ^d^`jfe]`gZ[g_\ckg`nch[\]qelamjcYTdoigi[f^kgmdfdp]diiqk_chX_kgfcnmVcWv[uY^^_`bcT\c\idfd\g^`jkjcYae`b_i\j_iaZalg`ae^Wcd]bbd_clkdkeik^^^^qeif_eighcif\gXeodah_aeT]go\dfijbe^jXlac_cseddjhk`ceg[b`da_hjc_^gjj^geae_e^bbigiTd_onugf_iaicce`hf\bfbj_gYjlgfcT`f`]n^[hed_ddfgaf]^ijfbWXc``c\eZbSnhhi_\Ze^adfdcdh^i^`eaWadnmicb^kbg`^vdighXjbmklccbcbci]h]cebg`elhrh[aib_`k`X_fge\chikcm_a`dmbf_c\gYdb[`]dakfiXh^g_hbi`Webddgbf_^b\hkcfg^ekchb`ahgg]hgYmg_bcc`gg]f[^gffhf`nhhkjflajchebkjhefb^e]d]gmid_Z]eca^jXaenfdagdidiba]if`_kd__[_ae_ae^i]gnj]m_``][_bRgfa`m^d]iiX^d\a`jdbk]eYau_efckcgad^fdcb_ecehgaccebgVdO`hbdcbfoh_ckh^cjdqc`cZ_fbeai`geb_b`Zb\de`hYWjdfh`Y_d`jadce`]^nc_[noe^epe]kf\ajba^[`Zm[_ebf^c`dd_^ga`ebckeihabcjkada]`b_`jccm_geehng_aidieaeggn[k^[hfe_ac`jhcYt`cagbff_g_\dbbgdTkjii^Ybcb^_fgkZcfe^_c`Zh`eMiefYj_Xaejbj^f_\bciae^^c`dbad_c_ZZb^`la^XafcaZhgbajbej_\bia_caid_b_]ajaeWeekdSYhbdct]n^kl^bha`^gmfdan_\bd\e_ed[c_k`Wfb_fdbafeeb^\dWcbecfi`feeek``fdfcce]ggjZcbfhi^cdcdafopdef^Year`dYcqh`hhpaa]d`\ci[g^^Z^Padgd^bU`ghfbb[`[fbcb`dk`cco[fb`_`]eYka_d^gddUgaf_kpbhheoafgba`_afb\gaidegc\pfj^Wg_bdbjXa]V`edYX^ctbiacYehb\nigeg^c`bbg[jb_ehecf__]`ddf]cikddiX_foladla]eg_d^a\^_dgdahbjanjeak`d^hgd\__cjfbeacaaahaheb`e_]k`cck_`cgj_aaeccaeddbaeec`cbcbbebbdgfbaddgbeabgbabcbddfecedfddfa`aceddgcddcceaaddcccaddgdbecd`dfd`decfdbbfe`bded`afbbccbdcgdde`ffdeb`bdcdadceeddbfcaddda``dgcbcabcdbgaecaddceaacacbd`cejeegcbbddcfbcfcd`c_bbdgccccadbfdcccdcfbdafdediadbdbledcedeeccedeceeef^fcacdebagcccebccccccccccccccbcccdccccccccbcccccccccccccccccccccccddccccccccccccbcdccccccbcbcbcccccbccccccccccccccddccccccccbcdccccddbccdccccccccddcccccccbcccdcccccccdbccccccccccdccddccdccccccccccccdccccccccccdccccbcdcccccccdcbccccccccccccccccccccddcccccdccbccdcccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccbcccccccccccbccccbcdcccccdccbcccbccbcccccccccccccccccdcccccbccccccccdccbccccccccccccccccccccdcdcccccccccccccccccccccccccccbcccccccccccccccccdcccccccccccdccccccccccccccccccccccdcccccccccccbccdcdccccccccccbccccccccccdccccccccccccccdcdccccccdecfbdbcdcabedeaadcbabdccccdbbedcdacccdcdcdeccdbcbcedccecbccddfb`dcebddbdecbceacdbddbcdbaddbecdbcccdffd`dceaceabdcbedccdddaddceaebbbdcccaeccedddec`bbddfbdcebbcbcdccddadedefccccbbbddbdcccecccfdeddecdccbcccccabbdecbccdeddccdfcadccaccdacdceddcccccabbbccfedcddc_dbec`dgfa_jchlhe_dfcdbbcdbahdf`ie]hcldgafcdgT`cgibc]hbmc`ef]cg`agafdg^fjk]anghk^aad`j]b[`_e`^j^c`h]bb`bldf\c_hdagc|d`a^^delcdlibce`cafnkig^ej^`]_b^`kXdkhbb^b`cefcehjafmeai`abcYg`dcehad[]Xifa]cch[eaf_cYd`dlj\bh[bm`b]a^`]c_lifkbebc^Z``ch_bgchhbbfee_heefbmkbcch`]fSZfd[_eUefZcbefn?\bt^dWbck`bX]dagr[`e[dg^jbbhn`cdb`g`bgch`gl`nj[ee_Vb_Ul`^^^YddhZdgfe_heid_]kh\hem`ffhaiiYfj[`bbim^`gc]^[cfjcked`i`]hdZjW_[calekcaa`a]j]lgjcpaqaitbe[f_hilic[fh_a]ogoah^daY]oeqd]ahkbabm[d\qhc]]kb^akf__\c]eb`dlchVg]cb_\fagb`defe]`ebkbccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccagcahegc[g_^cd`dX[^a[cgdeeQag^`hgehggc`efa]e`]fdcdaac^`fac`baffe]a`_accbcbc]bhb\bga`fejiac`bbf]i]_jgcbedfijfgbdacbcjcc``^b_dihQhgdbf^ge^abbcfjgeZbacbh_db`e_ba_adhgef\^cbdebcab`g`idhce^ahhbh]ad`bbdc]he`cjgdfn`hcdjigb^dcfhhjma``a_d]`fda`i^acffh^fh_eg\aae^ghibcaccfdabdccc`cbddbdcaddcbbbdaabcbccdbbefddceccbcdceccbdbcccbfeccdccbcddcbcdcbbdadcdeaececcbbc`bbddbbaddddfcdbcaebbccdfbedcdddacceedadaaddcddedeccb`dbad`becccebcdbbadbcccdfddccaccbbbbbcccbcbceabdbcaaecbdccbcdafaedaddccedbdccdccdccccdcececbbdbbbda`debccdddedbcbcbcbdcdcdbcdeecbdbdcc`bbccbaccbddcdccdccbddbeccdccdbbddfacbacdcccccbbdbcccbdcbcbcbddac`ebcabcdccdbccdccaaccddcccccdcdccbcbdbabbcdccbcccdbccedbbcdbceabdcccbcbdbcdccdcccbbdbddbcebdbcdccccccbdcddddbcbdebcceccbbcccdbcfdbabcdcebcdcbcbcccdaddbcdccdadaddddbbbccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccdcbabcdccccbdccacbc`dcecacacbadbabdbccbadbbabbcbbbcedceeaccdddadbdcdcbbbbddbaceecdcdddcdbb`dcebddbdbbabcbdbbccbcbadbceccdccbebbdfdbbbcbcaccdbdcecdbbgbcgdbecbbcabdadabccbfdbcdaccdcbcadcbddabcecccbcecbccdabdddbdaacaccbbabdbcccccccbfcdbbbecebcdadccaadcecccaddcccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccdadbddbdcccecdccdcbadaebccccdcccdcbbbccceccccccbcccecbbebdcedbdcacccdcddbcbacbccccbbddcccddcbccbbdcbccdbcdefbdbcdbdcbddbcccdcdcdddceecccddcdcccbaccdcdcfbcbdcccddcccccecdbdccbbebbacbdcccccdcdcccdccccbcbdcdcbcccabecbeccebbccbcbccabcbcbbabbcdcdbcddebcdbdcbbcbad]eacc[cafcccacedeccbf`fcdebdbcabdaceddcb`f\gd^`h`^ceac`bhcaccc^cacc_bb`gebegc\ebegabfec`ade`ciba_dcc^bcaadddh_bfaeeaaefZcah__^adaedcehbd^c_`c`cdaceaedgcce\a_ae`bccd``lbaidccegag_a_debddbbedbcb_b_eabaiedcdcaabfg`caca_bdeedeefc_gdc^bccfdcbecaecaeafccceacbfkfekde]hcldfi_^YcchcYde`igda^ikg]]d`ebhd`e_ffdfa`Ya`f]ld`cg^]ebi`gZ`lc[heehaFfkb_a]gdad]`]hjbc_bdg\fckjhj[^eiefdefagdcjh`befgheYe]afb\jd_hcib^bl]_cdX[dbjeh_fcn`m[e^_abjgaa^dcgb`jc^]c`f^Z`cbXemgeb`cgjcba`a]ba^b`faddhcc`_d_dlib]gakc[hhae_ccdad`d^fkc`edhbjg^ccccdcccbcccccccccbccccbccccccccccccccccccccbccccccccccccccdcccccbcccccccccbcccbcccccccccccccccccccccccccccccccdccccdbccccccccccccccccccccccccccdcccbcccbccccccccdcccccccccccccdccccccccccccccccccccccccccccccccccccccccccccccccccdccccccccccccccccccccccccbccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccbcccccccccccccccccccccccccccccccccccccccbccccccccccccccccccbccccccccccccccccccccbcccccccccccccccccccccccccccccccbcccbccccbcbcccccccccccccbccccccccccccccccbccdcccccccccbccccbccccbcccccccccccccccccccccccccccccccccccbccccccccdccccbccccccccccccccbcccccccccccccccccccccbccccccccccccccccccccbcccccccccccccccccccccccccbccccccccccccccccccccccccccccccccccccccccccccccccccccccccbcccccccccbccccccccccccccccccccccccccccccccccccccccccccbcccccccccccccccccccccccccccccccccccccccccccccccccbccccccccccccccccdcccccdcccccccccdcbcdccbccdccccbbcbcccbccccccddcccccccccccdccdbbdbcdccccccccccccccccccbcccccccbccccccccccccdcccccdccccccdccdccccdbccccdcccbbccbcccccccccbcccccccccccdcdcccccccccccccccccccccccbcccccccccdcccccccdccbcccbccccccbccccccdcdccccccccccccccbccdcccccdcccccccbccdbcccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc`dcb_dgYdbi_c`engbYWZ\``mZ^`bge\ghdk^dlh]e]QUidcd_ekj^a_e_a[bkbped``\eoecfkf`c[Yifd\icnk]`bnegjc[_aaaScb_gahgba\g\c`bocl`efcg[c_]dbjecei\jfh[ecle`bbd]hj`ag_gii^[bjcfbca^blcfh\X`ahefcekZ_e^j_kN[d[aY]eagdYj]p_feaae`\cbYe_n_be^e`[bj]ddd^ZX]jihf\ahcdfmdfc]dp^eccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccbccccccccccccccccccccccccccccbcccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccbcccccccbbccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccbccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccbccbccccccbcccccccccccccccccccccccccbcccccccccccccccccccccccccccccccccccccccccccccccccccccccbcccccccccccccbcccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccaabfacdc`ddbc`accebadbdddaccbadddaccae``bccdadbccbe_bbde_aedcdfddfccbbdd`cccfdcaccadadecebbaabbabebdd`cdec^dagccaccdccccacabdccb`cc`cbbbecadfeccdcbc``dc_cfbddcgccbdcca_cdddccccfacdbfbad`b`bbcceabbcbadebdaedfde`cddbfdcabacbcc`ebacaaaebdeeacc_cdcfdacdbcbebdecccccccccccccccccccccccccbcccccccccccccccccbbbccccccccccccccccccdccccccccccbccccccccccccccccccccbccccbccccccccccccccccdcccccccccccccccccccbccccccccbccccccccbcccccccbccccccccccccccccccccccccccbccccccccccccccccccccccccccccccccccccccccccbccccccccccccccccccccccccccbcccccccccccccccccccccccccbccccccccccccbcccccbccccccbcccccccccccccccccccccccccccccccccccbcccccccccccccccccccccccccccccccccccccccbccccbcccccccccccccccccccccccccbccccccccccccbccccccccccccccccccccccccccccccccccccccccccbccccccbccccccccccbcccccdcccccccccccidg]iEdh`Srcei_]m`hda\kecfeflc`abec]Yicmdigcfd\a\`d_`hgfd^caec]kaZd\bifbeegeb\c]lj`db`il]ebkjZbgha\ba[eb^eN[ei\c]f]ajgYebdaaf`k`V_li`Y`mn^j^^odnjdnachema[f`loh\bZcdigkadok_cfYc\__b]d_bi_e_deb^_k_ac[kek`^`\d`figabfaia^ac^Y^b\i]aace`[]dif_d`nW\gafhf^hde\faab_mjkWd\koklck[dmVefkf[`rrd^cpac^UqWcW]e\ggi_jl\aflYdmchcebndcaefcadbcm]haehYZl`Y`lhe_Zi`dcab[ni_gio\a_ihcgibcgdaa[_`]fccj]\cl[mjjd]`afhj]\hbgi_al_bbiaidf\fah\fk9iiUg[][f\f`bc`_ghdef\\b`hdgliejc^^]^cX^YcIieejhfdac`cbg`cidbCdgadckej^WjbeYddagdjdbc_li`cj\ihf[cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccclQ\e_fcch`bdf_\hXh]e`mc`dgdadeb]j^^khc`gdjfbedkfaeicg]cfdcbjbdeahiahgckf`gd_bgahb^gael[_iZd_dM`]_eficci^egicd_`d]g`hcjbcfgd_ak_ca^b`eek^bf^``eg^Pdja]c\Aa_a`_dggecgd]backea_bah^bhld`dccahhg^fff`dfd^^befld\`ccUbfU\_m_`i_f_knchh[_cgccec^^f]`dr`^gcgd_]]agddgehccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccbghd_ag\\dciogclWfe^bed^il`fk_]_alY`f`gchOdRdgVf\Vebhd^f_ecZY_f[`dV]ikUhWbacbp_dfdVUglfadccgcoh\l`rdmbnifkifcf`afagcccndhfai^ba`g^ihj^^j_\cmicj^fdcod[``aeai`gjdU_dq[bXYldfZ^`dc\bglecfl^d]feb`_hkebZhqbdpcf_bbdkbefma`hc^ifbkfdd_d[ame]fbTaYjfQocbgbjbbk_Ylgb]bbghgahYgae`eaeebd_XZgb^\ncagNa^_c_hftbjps[cbckhjda^Vc^gchhde`n\^_\`ogccaghYc_[hmhafflkahacYffcOdgaedmhcbdek[hedd^ffck_bfcX`cmje[bcad[_g[n_eedchhmheehce_dhbdabc`p`]h`h`b\^ha_dge^m]dgXcgabccRgUbcdkiicd\sekZ`cd]ageehgd`fhc_qqgdf^a^adc_flgbec`Z_fa_codeb_if[__eRbZe^bgg_`Zdkie^e^bc\]bWjah_hfa[_bdgbg\g[\dXbeede_fc^^ehbahfafhad[`ifj`fXgcdh]im\j\ceedg`ee`ek_g`f``jbnhdhZbh^biddidd]k]__ZiZh`edd_cc_VdiaX\rh`cagejm_iga_fibjfecgccbc\eYWc\bfkkegfjZf`djbdggkoj^fb^d`a]cfn`hcadbfpbgc`aheh^kakfc[aZkcjjd`]hgicgdccbWbgjeae`S_d[cccccccccccccccbcccbcccccccccccbccccccccccccbcccccccccccccccccbcccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccbccccccccccccccccccccccccccccccdcccccccccccccccccccccccccbcccccccccccccccccccccccccccccccccccccccccccccbcccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccbcccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccbcccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccdcccccccccdcccccccccccccccccccccccccccccccdccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccdcccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccd^Xhdq`eaV_dk^[`agi\mlcbbchbhY`_gdebaib`ad``]]esf[bjhl_ag\fgbh^^idb]ib^iafhmffhfkhejccbmjbiao[_Wgidc]]baa\eaj`abcfgS\Ye``ba\]e_U[ajf`deebg\a`_]^cc_hdZ[dga`idbhUf_]`dhfneeZSc[joY]fcbd^g^g`_cfffg_c_hdlZi`kkce`c_haag`cf^\eaebd^^\`^dbiWck[ahwb_`fZh\\Y]e^bkbn`Xfbbn[_ctglPahfdaafecb^ejlfb]efib``od`fVcenlbmeafdidig^ccdZkh`_h^c^abcL]nfZ`i\_[`[`jhjgPhlnfb^ja_aeodg]`f^mdfdVRhkfagaZboPig`X`]macbfcnaTc_jd`h`[]aadW`lWa`^b^fpli`e_g]Vc\egb`d`f]XXeef_focecklf`_bc^`j[aa^nk]naacbcgij`ahclad[ld\Z``fUdebcbfmZfumiaedgaj\eabf\faZdXkeiieb]p`iWeemlX>X^dZjaSa]^]_oT^cje\^cmedXd^kakb`dmej^acibd\kd\lg`adfxd_W[fdil]`[cfwfch\o\k`mSbc_]`ZxXkd`ndd_gXhhdillZi`biUcZ_jfmbeab^cmdk_mmqgchq`gfceg]bjhW`meii[k`lge`dg^dfd\aagabh_c^m\le\`ih[bb^_lcgmd_d_ahf_Yj^Ufg]`c_jbeiUe`^ep^belfgcXe]`beeigg[kh\fmkdm_Ocejmc`^jc_\[fk[nd`hl^\^dcQaZlgcgbgib[^gcfkicfXei`bb`^beZZbca\gbeThhnc_c^]fPjh_gdic_gbgemilbVegmcgheeldb]^^eXe``a\cYfkk[]o\bbd`P]eebbb_a`fc^[idceg[Tdabd_afrk[hiicdld_gbac]a]`i^o[ffc]`aiiZg_g`d^e\clt`[cj[][c_]hggdedejg]bdS^\_edba_bdfhacnW]n\fk`fWjaddkocadcfi_dc_d`h`dgfcadb]eabacabbacbh`aeeadbbb`ddgfg`f^bbdbacdaefddebdd`eaa_ee]eabbadbdf`cbfefabee^ccggdda^e^ddbb`gaagcbfbhcbbbcdfaa`b^becda`eagab`eh``gbdeegcdebbcbadaabbcdc]d_bcbgddachecbab``_dbgdeadeaaa`dcdaecdb`bfc`dfedacecbadac``dcfc`bcdbdaadgcibgebdec`abdccccccccccccdccccdccccccccccccdcccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccdccccccccccdccbcccccccbccccccccccccccccccccccccccccccccccccccccccccdcdccccccccccccccccccccccccccccccccccbcccccccccccccccccccccccccbccccdcccccccdcccbccccccccadcbcbbcbbccaccbcbbcbbdcbbcbbaccbcbcbcabcbbbbccbcabbccabcccbcbbbcbbbccccccbba`bbccbabcccccdbccbbccbcdbbcccdabbbacacbcbdbcccbcccabcbbdbcccbbdcabccccbcbbcfbbdbbcbbcbcccbbbbcdccbcbbbcbcbbcbbcbcbbcbbbccbccbbccabbbcbcccbcacccbcbccccccbdabccbdbbbbccadaccbcccbbcdccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccgcYeZdff[iV`uhWg^cbgn\^dmc_bii]gjTfacmadWjjmaa`eg^gdk_`gae\c\hfc^`ffSRgcUfa\`mb_dja\fjabjYf]^dg^WWcgbme_lgohhYeoekfenhdZffXmdga_efa_b\ajafa[edZfagakecc\Za^aYhenccohk^`kdY_cc]af^i_bbg^^bk_e^_^VZekfa`g]aceZihcip_^c]j_Sb`n\]ggZdgbcoke\[g[nffagse```_]^mcdn]h\gfhfecx`eohg[debd\h`labeed^[be^^mf_cficbdichmdbamee]`mf_^fg`g^_idiZdb`fcimb^ead\ee]nibVqcgfb`ac]eclaXgabefbeec_dbcele^_c]ib`fgcbga\g\]imadce^\_m`hkgad]Y\jh[ccZib_gbkke`mia`^dc_bh_bff\[f_hcjfdajc_gb`ZjaTcageZj`bgUc]id_fka`d`gifjkbdkdfg\h\f_aaatZdha_c^[a`mjigccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccdaj\leLkggj[ag^mgdjhfdhWqdciXiac_i\im\pdio`bqhacbZ^^e`d`^dm^cc_]b[ajlb]cfc_kaa^ad`^ibflhfkgflkqdiicf_^aY[nab\bhaHic_m_agjUh[d_p\ccaj[cjaU^ec\na`pbfggnglcamicdlTe_c^el_ddWkbjdX`ck`ecm`gblf`b_Y]aj\iWhiYafZ^eb`h^ih[_Zb_g_c`giGc]daj]caUac`\fb_Xaifdghch^fa\`b[[ccccccccccccccccccbbcccccccccccbcccccccbbccccbccccbccbbccbccccbcccccccccccccccccccbcccccbbbccccccccccccccccccccdccccccdcccbcccccbcccccccccbcbcccccccccccccccccccccccbccccccccccccccccccccccbccccccccbcccccccccbcccccccccccbcccbcccccccccccbbccccbccccccccccccccccccccccccccccccccccccccccbbccccccccccccccccccccccccccbcccccccccccccbbccccccccccccccccccccccccbcccccccccccccccccdccccccccccccccbbcccccccccccccccccccbccccccdccccccccccccccccccccccccccccccccbccccccccccccccccccccccccccbccccccccccccbccccccccccccccccccccccccccccfmg]`jXghcX]cmhn^k_ei`_]h^f`Y`gaZ]_aqYl\]fbm`cbW\X]eagZ^l]b]_^ogaaicVk]h_g`fXbgndnVd_chch^n`ami\dl[Yoin^ge`i^ccdnab_hbfhcbli[p^ZfZ^^\je]^hYcf_d`dijd\ccZ[Z^j_hcji]Wdddbba]_]`acias]^ecsg[\\^hbgjabbmfifefggUa^cd`^ejkZ`ci_n]ae__egdreYeghafn^dfZcmp`ed[aab^dpfbgcbcbccccccccccdccdbcccccccccccccccccdcccccccccccccbccdcccccccccccccdcccccccccdccccccccccccccccdcccccccccccccccccccbdccddcccccccccccccccccccccccccccccccccccccccccccccccccddcccccccccdccccccccccccccccccccccccccdcccccccccccccdccccccccbcdccccccdccdccccccccccccdcccccccccccccccccccccccccccccccccccccccccccccccccccccccccbcccccccccccccccccccccccccccccccccccccccccccccccccccccdccccccccccccccccccccccccccccccccccccccccccccccccccccbcccccccccccccccccccccccccccbcccccccccccccccccccccccccccbcccccccccccdccccccccccccccccccccccdacama^f]l[[bjcd^hie\W^b`ia``eim_kYZdedWjae`ngabbfb^iic`b_Vg[bhaj^aZWbjcd^aagen```k_gheZc`iifdl\\ccc_k[Vic`\nbX]hZe_bhp\`big`nk]jb_`lkadab\ak``c`cg[bg`Sgjbcggc^eea_fjmaeie`hlbemagbdfgdh^cc`ihgebid]hlfbYg_eih^[ia]^ljkfcb[afg`ebj^f^^g]`YbgpecUZbrg`eda_kbl_c^`hjaibdmbbfnYaejbfdk^fqf^\YccccijVk]elj`ekdd_djZ`cd_nmgdZbYghlbd`f]kfcpf]g]\]_djYa`]im\Zhdc`ebpdxbcfe_cdi_bm_f^kah_gdg``Y`U^i^dgdcV\gXibnk\\_fa`cghck\]dbe`]_c^icfe[^cW`ZXTap^cbgo^_Zfagcac^\eZcecdX_]^d^hfm[bajU`^s^jYd^hTabdfoge^`hf^eeb\jlfjed`b`pf`^`]i]_d]\fa]^cdm_[acfd\hcla\ZgXle]^\aYbffcbV\`ZpXjcfdcg\dcY\`_gdccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccdpVmhfbabnfibljhd\c`[e\bbebc[fdcmab[e]^_c_a`ffbi`iZdgk`b_l^`bkc`bdcae_dehm^b]d]fibkaT`cbjfjbiebmYdpg_hbjXdm^fgb]dag[mbedVewge_Zdgeabhd]_Segi`c[YjZcacb^js_g`e\c^_dfacjja_ZgeL_cc`ccbebchSc^heb`]de^bd]a`Ndag]_]f]iai^`geheabf`j`dT_`mmgfkbe_]fe`bhkgr_ecfb]iYedjcccccccccccccccccccbccccccccccccccccccccccccccccccccbccccccccccccdcccccccccccccccccccccccccccccccbccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccbccccccccccccccccccccbcccccccccccccccccccccccccccccccccccccccccccbccccccccccccd_dabgljgcd_^eVhf`g`a[X]h[bVjk`bja]g]hccp[]\b^dYbsi]j_abcdaebeiZX_i]qihede^_fan`ibtae`cidk^b\ZgdgZ[`kZ_hc_\^nm`[jjaudbabZ`d^ZVddf]ai``iedbZf_f]e`naei[cePc^]`_k_adk`bf_qbbjfgg`e_cffabcibdea\e^ccj_fcb\^]^dk`cYhdd]Ycid\ce\jtmZ^b`[bdc`Z`Z_Xceihebaj\o`icjd_Ue\ZZY`]ig]abOc]gcgj^e]m`]e[f_eheae`fih_l^fehb`^atgc_^ZWbh^bed\Yei\dhbq]dmjim__fbYefmhfcbcabW^`b\d`cakecYVshcacjgb\hdeack]djkam_egbbQ`ck`]```[lheg`jhcnhd_bbfZjbafc_aqajgZb[kne_]Xacb`cc`dk^dRackb`d_ecgebegj`a`]fbhcefafhef`_mejncqfj`bh`adoeaWbffhaffbkfgeR\]b`adeccdcccbcccbcccdccccccbcccdcbcccbccdccccccccdccdcdccccbccccccbebcdbcccdcbcccccdbbcccccccbbccbcccccccdecceccbbcbcbcccccddccbbcccbbcccddbccdccbcbbcdccbbccccbdccccccccccdcddbcccdcdccccdcddbcdccccccccccbdccccccdcdcdcbcbdcdcbdcdcbccccbbcbcdbbbdcdccddcbcbcdbbcccc_eb]Vyifb^^jaegamdeflcdbhXah]okY\iafhbZ`f_ld`fe`m_aflegen`[he[WZc[]_^deoZbacjYY]fllncfal[]cg\aiYd]if^bialamdfcde_db]kf^jefV]ki^hacTTg\jdfk`c``aal[feaigdibffjZMngi^cdi`X_gZegZtj`p[fdbdb[b]aijhc^_fjgg`eo_`^`me[l_`hdejh_k^_a_bkfegriVhcodafih^hoccWl^eaa]ejf][fCk|p]Kj`fUM}@jjtL|upgJuv|Bj||_(RUKgzBt_v}lrlkoX6}w`z|V^IbHynTPWNusGk^{Mjd9vmiv~mCBzxypIwWe6ZmhtW^izvjWVEeDcoY:hwmo]ǭHY_~6vn_knsA6*C191-1GCPF}I$,E(@?(,2@:,?9.5F7(JIZ%h)7ܭB?J(X2{.*64,$(,ATq4/=NS"\eEL5D'%4&@J?JJI *7 A:+P'+@@?R-I(,2GMX(;24] +u';B 8 A)Q+?a[6-&+"NdN%U5kX? 37!T1?$=9/:&M9=6C,D'3+:9W+0.T4J8m=QC&;-0Q>53: +4,AjCs1@>6C;ɹ¬z딫ϣǶ~Ȼ̪ʲʥŭҒǨ5|ܯ гHʡ{njҫ̯wIJɗ\ى\D:An:E@F> J`Af6{kJEQMc.'WopNFSax?2?MAX;Rtc@5YI\]ZG8^b'fefBLelFc/K}+\kSZQqq,|Bl~z̛TxzDhyz~z}}wuu|{robdxAvuya~nos|)͍uac~iV^obgod5chRu{8x%ypxxw{cyo%~cryqy~nzs~`#P%y|Nw~_Oy~`z;}zhiZjukk|pyrp|Vk[nwhz~o~~syytyo}u}0|x`w}uxy}sqeh}|v|~j~st~}voop{hxqs~nr|}uzuzv~yxx}|y~}[sxr|{phqoz[bwWTpvvv{qz~s{kle}]a|ud}n~}|wp}~r|tp{|uyr]}|}oy{y~|yoa{z~y~{~y0ҍ|p{kw~}~|}~|zr`}}vYzZ{~htnyyu{^{{px~{xq~zmw|~zy~U|Cd|i{t|mw~rt~~zyy~s~|~{xjwttn}w~{j}i{yumitfrFleoUD~gS~[vzwb^crsdjfwqtlp{[bb_~}o]u]~txpw|}l`h_v͗yfM}^cvhz~pyjzxsu~v}bij{Yrrw}fmR^kc}g|xVxttqbvzxbluwpn~]ffb|\ha}cv}Qqtzv|vg|pi}qsqr\whs||}tlkzw\ro\nanimqkgxWzs~ylkjm_u}}Xl}dnkc|^ZdycrjYxnvUw[uZyn`Eklg~srzk~t~o}mWmXwaJGxEtIW{^ycX{kXk}}|rNjtadqDthff~|~f~mdt~tsszqh\o{|{ZlgoxPzsvMy{mc{itgt}fu\t^}wzczz{rmkqx=kvnlu~wwh|n`rove{~ud^^{|~ywW~wrwsnhfD{aqkql{gmvk[nudwwl~__`qgnɖnyhkmp\vcsqyiyarby_[p\f|^X{l}z{a~{ukintaavrPs{vgzvuiezntC@|b`z~tsnxszvwIkqruf{{rvouv\wtp]k}Q\mhmkR|qpiqEnsvztzyArpzsgzj|dW{d}cpcv{}q|~|gNwbr=m;iqmts_bnbn}YlUGu|Ribdm|v_t+>>th\asul{|`q{oj}Wsd{}ambT|hqhxkymz`i{ppmtc{Puze|rrd`{wkZssqzjy~~xeW}tzyxzveNs\r|t{idk^Nqpmg`eix}bvjspskqzu|Wo~Qccanw`}bu{wu^sh}|nu~|}s~aj~dRxyfbY|e{PwwJdzw]tmjm~~Xeuazm|}dkgyq|kfTltV^lskbsZt}eBrn}{rvVqxXr{~Xvkvh}txttK~ks_~|}xfBT}jVI`T~m\{XLTkxQxG|lWfgsnuyhaWqs}f`i]~mrRjyiyl`|kmkozgSyulZ{m|vw\lgs:jav}tcjyg~Roqy~Grww|oYn]rl_zjn:cIznfr{ki,kf_[^lE6d`mlvqwI}āyf2h{~cn7f8hȞvx]bezor~ejqDhp~m_H[ggfVel]{턿zm|]xX|pu؁pACi~{h}tmoqLhaboiwn{~spt{xdniklp\~vi}>rmiwaikouku{~l]qvzWoxnlńuiKbqeQaRRx;_SVe`w}*whykIqqiDUmwgpyxrgl8gvct`cmjuss[Z}zM|Uy5$dKb[rRjnWRtmݗ8quihrelWRuNx]Ks^^4uV`wwmo_>dUaU~qrneo}A{~dAsWS˛mu@q{o{u]l|uЭ~kq9eQhw4cbn_^z]y[{cY7DnWAxD{HsL]}tDlfhtfvV=Q`1Td+`ZNcfwfip`t֫BrzsGrBffjscn>nu*A)|>S^Bbg{_pfsfZ'szbϫ$Sxczl^IAzS}nPy`whq}hnC_gvfu]xxpkdn}bd\^nbUxuqwkjEdxeUwuPezWyuY}xykhY:y]ulC]OdcqWzox_IqN~izÂYT|{|tnsabtyjmnwns[abbhSzcryle{sS\nnYvd;Tjkn|\sq;[~RuwtsiJx~re1T`]utyM{{|Z}Vpxm_zquV{TiReo>wwi~qWp~o|j}h8eqvq~flli~t~~\t{swq^xoyvz̀vym|s~}srsx}xcdwe~{ab5q}fqzn}ygzz`[nrpt{|_w|qlf_]xw[|kbismHmqf|wyyLQti|nroxvLr`n{zf{B~fvjgxxpquequ{_bwpy|ch}Zilgx{~brlu|w}t\utZrzpluo}wggaxdWxo}omzgsvUtbxo|piqSYz{jI~yMAz|tyqpPwhrdny{|ox{jqtuqyym}rlb{`k~uen|^{vlyythrs_Y|m`s~b3|Sx]}lvx`vBvZgv_vcmxsMyuzlr\`tkXqakgrsi|UQvtkt~ZvLdLojdx^sMp}z|btwoyoucXrnz~~k`t|otfrLs{iUvTH}k^cwgsrhnh_ntLNsNwas`]vwxf?qsWff[kUxm}bsgyiY|X}ny{cwy}kb|dpg~qlsc{fmtunrT|~Gtljs;Z_WvZpx|aX}xvm|vNqWwyMneqyXthw|cj|\xvzj^hd|ih{v~u{v_^ruip`bfwzfgrmjxH`xQd~z{|yx[zrvYTYwy`e}ziw~Witva}wt|~gpq]|puqo|vjz^sgSpnduytvP]zg}UvZusofar|eJ|vh{pyztz~bj}gmtunyv~vkxmX~zqpytX{Yst_nqzplejry;}vvsopupbq`ew~Lfy~nt}vvl}rs~nxs}y`pt{u[mswsnevyhwlwl~v~joznkyulxwux~t{jptxzKgxqmtuilzaso}Izcbpf]s~Ǐv`{qsney~{fXz}tlYsbweouwhjnx{x[wo_|rQmirryvkfwVt|pz}q{{{of{}kqe~tf}x~gdKvsnQ}p[vpLqykdvetvu{b:moaiAuvkndfpvipfz|bg~zyXtw{{xsP||qx{[piwZgyxFQfhogmyYYurlqm^y}vstousyswv{gyzXjoxPmgp|~{|`vx}l~\~xeexyk6q{wzldthbanrapssB}^pux}~Ur|um|w8̀fz~oud~feXnkxh8[|[jbxlaJtr{~xz~xx}bp~\lqhf}p}\z{w~qjrGwte}y{yv]~}}vgLhwouytqkvlk~o~wuzie^vt|~srt~yGspteR~oke~^pk{nvMvfqrf~}{rnu\tvxX{tqemms{yrzy_w^wW}}y}z}amwS|z~vxwffiv_}rw~fmtmtdZjztuyhnff}\bzk|y[wc?xogmzzgvyWqmtXlnthiuyxl__}g|u_v~`nmmivȥgqngrc~k_ጪ}zTfqSZhj`VvxblAÓs~sMd[xqEUTjBtGn[BzpAe|ytkb~vlDkfj]ojztpeRswgaOjsrczvd{hzrS2nptafh}hpKKpz~o}s\emno/_1vbd@gKuSZ}c|{zllt|o``n{LoOmVWNSiϓZdpvR`|bsxj|kwmpXU|a8\PnkWzeP4bSzVrqgTor+iRbBF}kygTtdnToRha]zy|s|gsalx|t[ntrrf_yxz]kpdbcĐxpz}=gtdjtiyg@}8soldrqa{f{JinpC~~Qhd]nbx^nnZYbK\{Aa}u{{svR[|^zqcbq`{Qp?yok}avmzo?oysz{idNpZ$lx}vq|s`m~L|P|n}}rt|}s}{RTrcrw~®Koku}~ATvlz`w~{q&pso|vgl}MpY;epRUkzjZoo[|?HtvugkjxSqcPtzǮht{r~_Sz3L{t_Uiibh}ZRrlbJoxpivlBvrbux]ky|z@dh\*rtqFlF}e~_^s^{U|M_||voazxtoUx˨id[gt|~pyqx:dWf{aRwsOFazxtkqR|k~Ddajfsyp^x=i_o_vuf}mQvYgt{{u`eR|poc|p`h;jtv]vjkv^fQmv@uiwO{c`{}\sq}bk,_RT{'a8}&pq~:|(acvk}fxNw7ckaU2en\]oh¤udBTx~|g`i3a̢ueiq}kpuhhlkz}NTG~xvOHk{kfn|ZbyW9|fPSllcdRf]Znpc~zzn|Jae:r_qhu=~f~hC~cv|pz}W}wwWWoegcdrpzi|,MQ]L]]bpt}^seOOdnRdoszk[Rs|}k]kqypsfqHor_jito^gxsCkf[hcrwrju]hy:y>rYzjS|lpv|plq]Uvyzd|j[cft}tYimekQ_vf{OxweQ`]n~8Dykwf{~ziu|vm|yquUeZx\mTjJgtqcdllyons~xWh$sol{~uzhYNg{e nQqbypoɑ_uyweL2soRWd~^KhBņyadOhlxnpctkrd}ih[tQ]p~b}Njk4|oqtzxvcqkդOylxHB{q6t~2x_mYl~wKq}{mjpxs}|}smz|MKVylr}SU?ٮ~|WvpvC~kppVw~pfdYn]h}LeWSmtwSUSpiiɻwyaJqxeyXt{q|vl}wsvLY_gpX]jWszXzesumvo{QƅTw5~m^?|TAatm`ULrGTf|lax}tzgSZwv^fsYferpHqZpcf}>r6m{k~|`UsJhly\accvf\nyi~`c|m}|_ijup~hEHYMofaaknɈ}mzRx{qy~Www~z}l{`~lHs]aqrzqaj{~|R\x~gzfQiT]x-kOsuhzKVsyρvi}_LUohzh́m`Kq`oIlÎqdrdz}OsafUx;fy}}yZw`o},UlaM}fݔoj`tRfp2wsEhwykkz~niipgeQjjW[lgzdcTdzrmTSnu`xh<,ݕsmuvqUWuJlrtFura*LjF{/U]fi7r_zz~Mpv|Ȋdquxv]qZkh}u_gdYfpx<\bxPZp\Ȑroxs|=iJqr[iFfvyy|ttzTdV|x{JkZq}tme~qr~~[sP\q~Hraxn_hknzgTnzeoJq|}nqtm^{x猪u]|U}qubTixrR~Mm6f%Uaumvt`be_\E~gr{x`}wrr\^yynvapqUktv[V~XmLVx_]q]hnȽr{j`VW^r?gnLcqVXM>ȆڎkיhbiGӞzPىsŎ#_ZlX^r|WORmwfsE-nTUw~{X>hj`VUI|uUtB_jJ}EVgzwrllanask]UOnvgMha~{MgpvtwrFGp_jnssgQ|]L xlN`w[FEocmP0L\ilGȝaQp~|]mem|'V{?y\ǟ}gPYbqMyisrxsZ@}\Gi7=VEZIvˇHqYzKz~2]o0o;li6eAyjYj]ѝV|0R}XclYzWzoijgqLupsmGHvj[Ue\rmisew|uxqQ7s:tt!pٝeZ|e6_Vvv\hKKcAVCYxq9ndgPD$QbUpYn_S^TWGbcN.[26E]o`{Ne~QZr\nhQ\fZ^^jcTpYfb2xskvH_rn~burvuhk|h`xpa]ykmALKmh4Q²hKv^q~~sShfvÆ~nfw}j}xmy{h\\huoUb~zko[chWT}zp\xg[Oxht{`}̄zp~tWw݆ĵXwrZijv\bjvOr_sprsbr̡l]S^Ð{v^SjSv&oqzms}aiDg%^n]`Ge:l\`zs#jq@|whw|txuyRR<ˀsBnyp}Z\mqezXbls=ʭb^S[bpO?qu@jyaW5*l}GjoiIR|rt]IozjW{yYl[nkx΃qtaXp]nwgoqdeewRq_\ieD_~Y{rlwdqt˫xwud}tpr)DMmtLhaOEpW…Lse{@lQxehyjMozzpztgwvgM~OUPRvy`nqUqnhcxbMdtc~YɐyvbzanTY1ffnoK˖zNqI}z–oq[T|ɍ~{rgxx_|XkpǧuqLdvzokTtjY}Z}pTrm_Ϋzjl#iw~qnh~ypUv^nzbvXK_symapvcjx|kfildiiwspSi{cBhG}{pxu|Vxt~s|bNPgXUn}A\LWtwr}phj`ozQUltzy[4afWCo{?ujobUa`tk?g[Uwhys~zj^Vtmnn}{lqeprJƔxkbozdsuOʆelko}s|auSZ~rqkIZzQbl[oxrx}e[|rtqb?roovu_g^XcNzu،pozwGxzXzuEYW\k}v{mgvxw|WkfvTRci}xR_hl{`tK||dqvkwiSl|pQ`wtWjwikvujkxl[_rwaLeхw={}hje1l_iHvvFVpuMYUuTowv~\x{|qbsp2ylnz2b}Xm}aZiqRuhajTgyeՃ}tnEh|}h]x`[zΝynkyer~[rXjsXpVxqxuk|l?r\jdjzwRl}rpedyrpy}IvW|ÔPmjmS|ftxcemo_HqlpvxrRg?òmtTXhVk^¥ob`_WxbFAcwXl}wY_jl}fy]ux||w|nmGpkgXtw_nx]Vnlzb>lva3g}}UWbuo_lm[~YukjyjQyYzwbdwz]vi}Q~|ifjsqv~?hv}o}'cfl^KdD[lh~yuUmqwysobtj}vVTR}~ypaegEroqs_qywttbэQ8znvƳVU`bzkqjfnj{sqbe{zv{Tm~Q7tJbTCWbrwwzjlobZo}kTkZa~jewUDYtoswWQ_Mxud7WcP|sGemegrPa]lOePuuX\x~hÕnT{TOL~wt]e`pu^tx|4\pifoK{dKǟa_RuMs8uY[Rru9|^}w\~gw{btxx0wl_ubijT^KY^vEdhu4T^uXlwndywgqfbA|cQ:~O\c{=UwSnW`}p/MfrXgRkCR_|~yinbb|u?`ggv`fW|ohUדX]Za\NslEU~vq^Ybwe9~lb]zȌVv}hoxrzS_s\^~76yaTutx^ezw_Z?l}vRvyȌkd{l9\V٩aqp-ughht}`zqp|crpnlwpsz^t|RvUoxrujzRlDn|l}osP{|jbuRuupcVuxqcx|qs¡UZuoyxmu\e~wum~b^QXqxvy}c^otsghl~HPI~nxgv^vYbJ_i\G[hYhqf}oJ\ESxXzP8Up}_fIf{Rqrwl~kXtr^lSɍin_[xnjxiAp+yrorpIVm]t~owZh|{XtkzKW]}qz{twq|h^Rvm[mdrbcJYtAucVhÛo`uzrʁZʨW4H{sobwwPio}Fs]GwqoQzshbxWnitX~lzrukxpq_tUa}t~VjBXwqiFhtYk|ljeSnPkAs|gbGubuvq}hwkGxwx~?h_lPdv_EqHvs|wEMaavgD/Cx]_ev~uphcyjQk}u5KsqMrq`j{piy]Xvgmӊoxzb|orUxf_Q_e^#_~y~[qw@ijsmTpww(mTrmWpdxtTJpjo}zWscq\tYPd}dYsH;ioazzcyuthxȁopzyy\~j~phׄVlwLe{zl|v|]kwKW{wvYglwSy{f\m>avqmkiV`^}dsqho]LqenG#Up[w`>vg>|z\ΕXru][\~gWzsccc]|vzt}}GpohyJ{svg_yqcQtaVtgdv^de}V͂wrnkkWiNwDtgKuuqMhƔdNkXbv7fcRf}^_cnpN`}mZmOzdkyf}zIubX9T_wcbu[jWj%pnlcZbpu c{vKmfLlo_~nqfkvg]|Vor[kbiae@|yx]8JhoIv~MJ7iehYO%qr|T`ubvq^zp|m_npKRTQyvojhQ^owjhqx^s^]w}vWzwuY}cboTy}s>sgysu{~JJZhVTjbe`m{rQq<^tlgy[w}gk\HMmÄqu]cu^G\us[ylxakne_pUoreDDDtEz]vxhlUPkx^tz}x?rUT[Pqol|rcgayorP`uj]evQ5`aUg}AGxVkxQqXZbsuJ\q|vGQLu|yispwcsDBgzJouy}WwAv>ĂAinXHuSk~lrl°unml`rectNbSmEqvi|c2~h|nv{dC\}|xIV[uTơgcztoG[zrJ˦tltfeaōqZsl^eqadZqk\h|~Q~Ruk~fMtu8bs|w{h~ncyjJ]zQbey|ulPfw[ugspsmBKyOU~MPEhQ0FPpjrF>vVZUrxs8cg>__zo|fomg=tUrNsylIy\ljouN}{`y\tvXWhpfsTb|qdchsqd{obaVx\wc[_rZKKlz`nKa:fap\_QRzjzԡzqUo]PfgykhuTPyieJ_dn{iTylRXyXbxtazag}rAa|a~w]}usgifhj{f|q-|fjf_\ttmsqVktep`oE\xLR2cPqqeixd[d_}T[dpgqzvongezY}^PoeeQfmN?TVW{ttmX`ytjM_Wpw}ƕymi{\xeuawu|Shnsnt|\kgvtV~.|{Wy[rTx}dr]\Via}xx{ho;TueswexeF`sxtikjnvzmhXgw~[aT\AlvIYd~}u_sh:Yl)eT[uzwjIvu_Zpcwq$cnQ_|@}vroo<~nZvgNdNwxzw{qMa}~nyQWYvXghk˄Zjw\bhWEҮSz{b~zWnhulzwgȀk{Xk`UygPEdipT|hpvg?gg\Ragj`Y`S|pkaIni^{Xf`Yhv|zYYEqofGcRdw}H^{Qqx~c'sqPqwflohsHzpr]7|yqqvnN:WxuJoZ`_tXxV:kifji0~Ɔk]R|}|pNB`.Bwh|IbsklxKŇpwBfntw{qjZ{k\]b}ÈsPlqhqxc~mPggUtFxnnwpGVvttljOup`_z1zy_sVOoLqpodg\hSDgGgX]ySbikgehc7tyd{rDcunBtS\)XuTFqVu`hdzyevTa~(qc~OqoVχlt~ttSqP`xo^[KysS5m]rb}s΅|/Lbbkolu~^ttEhTmm]tPltYP~e~plm|m|]âxkcy_{]M]gXgR~^SxmWa/YmXna^OqerpriQ_zzijogWvjjTUqw\otRzqvYf}Gc,rhD\vckSuIB+_Y~ko\{}Tdv{_eym^bDdskga{cdfL8v|gjho{Rtp[nafochgy}sI|o4yTYZS{9Ps=qNcgY}ucu]0J/lwG'{~ulYcDZNd[gvNhu]oonSvMwjw[t}Y.sWjkxs`ips|yLPu^obYPp`RHkfVCElZ_hIOslq~RTvWfvΈȀKilwli%`crx]qUS쓫\ohr{scL9\Dl^\PeӃc}Ŀ^l{G\|c{kwp5bTxsÀzq}veNwkwOO}`UmbaBiOnpjQqc{ntx~mqz(ksWpy|qi~\c~oXrlr'U{|sy0O|D:aX_3iaV]x}u}bfH~|ë^(R}K{uX\lJ6GziJfEzV3Kixre5 p`UtkSfYteϞ1;VSIVhҮgjzFtWnx_lh@v9aZeOڏpp<%Bw&ytTSXa\|nk;}crSjjZpbZڰsxfjc{LqfQhdIqsynsEuf-[xZkvLw|C]gMypE|J}TP^Flli@{dE]uxHdUm\[omzoTTxxdhp`9]wCqmmpFrbQxpmzRT7Bskurukxf!dkZb}jo̴z=w[+oogolbXknf|^^~]pa\Iskr~ze;u{pagmRYkmn\Z~uru}sqsOVGvaiwlrfh{sMttrpgzzsj|uoQvsQ0]w½}sS^tY}||4kaj;ٗnW@|[Uk;+XtkiDU[}u];WFyeGwazTVigszLa0h{t~gNu|rVQxq`rq~r^}ozqO]i[{tj{kCWMmvY~ey={ic}`f}rfxmd=SuÍPt|f}W@qnz~xqQ\fZQxvRhsi%s^|murSpyydknprd~ikgx|jm`cx5]eAl|zsq_ɆzTf}gy}Pk`yG~UtcOŵh[ttdllexk|Zz>riyOrffUtZ~2vMui;XIpZo|cvzd6n{t~w~ @}kT^WSeyzka[VYu~mX4nvx\f|udtwX^ubekm]resXt~rn`gh_rhk[kNsoQ}~DV_Wr|7uU|kxUl~m]`s|S~nt}dMnZ}t}vQkv|yloOf`zyuy_NY}u^uht}pkwn|kjFdV;{L~Iwsyvbfl~Wjqrgqt}P}oZ~Y}}C_F^ssySZjXvPxrtl_jG_eY}{ihJ]]ywj:flTy}_|elʞnB\jkaqwVSEhorcRruy~PHa{?rkx[s]zYXVzr+|aolkiNkVwz{w~zpz|my}mxv|wmkw~zyk_vW||jpqfw~}WuFuG}jw[vFe|bjs^}umoo\MorUJwni~~uqz}y~u:U|0fvtiDswX{tk}mh[]~zjx|}o~jhF^sOofTvK{~z~mZwftbDZsv[Tgrexg^mjQvoNqp]gQ~{Vee{nZg\~y`~]]n\r6k^ZtniomwI^RVhjepyFflnSzswnk_|a}:my\\c]p|~q{[dcQ`}{wqsd?GzcNaXuz{fb{f(hrkZyuNqgrfysoxfUM@pgJ`am_xd|A`NQlnyl_O}zMyJ[VvXfjdifkix{\~Spxo[Vk]jQ-egTrb\H}jW{{x|]nQjodeqbwO5w\Hzrmxz}mush}j}]uh?k_y^x^z}hp`}^m4uypw|\exbz[i?cLq8oi}fqj"pgx[z~s}FpuUbuVrmlak^zYikY{v?[XJMhjoszln}_yyi^p|WrbvW`>hbvjetf|Mdψe R:`MrS^Usiapw~ysphkaijnzvuzxr|tlo|kwocj`M_ɣzcUсsyL|aksy}hoSik}syxNtdl9uvzqpPxpSkoxSunoQ{hxT_vuGzSD~iXm2bverp|Vjgv|etYW}dzpNnml|l}fimq`z|R؍ef~xpDřpz]{fyxsz tqXx}jd{V^sdrJioXkkdzJx|k~xtQwyuxP_zsyk[uof_^qinxixq}ZjV]sqmvvOm{oGxri`{zdppIeUvZv\Zc`hP_hRQ|oyxxShlBJWQu^~yzh~dYy~{f`qzjxrNqYJLGqlDlsci~%k^mgdVcb^Vczy|Ubjvqs~yWcgv{fyyqYYs~QlygoAJdr{?xycpuV|hzoxB{MS]<|kql~avuK~vvz}pmYx}xN[znyeb{c|Sha]bYPrzdlpd[f||GeZ[{PJfniu`kSpw~~dx|dcawycE}8~U]sIr`vx|tns~jbt{_xs|P~S~KrF{usu{5ZzNpzttUFm|rHwk\][rtxxgquu||axUiag}DqDjtsahb_ubj~wS}lȑ|wxnw_em`=k]rezry}z\oexqcl~|fql^iu_Zz|m>~jc/X_vew|NuCz|tetcwa5~D\Wfll\BKIf{mdUZ\tvf_zu{ \r\uhsuwX`vdfvlv}ic_ak|~yehd^uxia{UB{UoԈtUoHAO\c~ɇ%difWJZiZ-ebju$ߏ9sP{Dt kR[)EymTU\PKf0ΗGQ˫lP-w|L_I=uxOzQy`\GpaXe6Kh4ohnpmqqfjwglXvJI^a~8^qhx@mJvbo_AFT9g_?d@F[fQO_]oIVEfVY%QgTN]xYbZfxewziuaN~G7Eh?Q[`vlMheZa?t:~?^^SJ{TE\]wclhaKYfQ60KeoenfntmkcKlFhT|umwMQ\wYISXi\j{{gkC_zldyv\vkteJuKIvTY{pIzruhYk]}vo^tiXlYtnUrzqn_Insg]h4q.H,ro`^_slonfcf_u;j_feQr}eHSxhDtF‚y{mZjd_][7oqoم+Oe7Fycktq\vid}{_uOwMXyrdZvYkVoiP%ttY[]fXUGs=Y\_90MtY_Ivxx\BQDhiKfWZ`~_DXzLafdcl}dmdahwZW\ry]3FlJAX[ai94]zg^ajLibdxhj~pmQcQl@Gm~JGC`qf[wlWZg5Imb^Qu[xqy}\qs.lvtslxrJki|jqyxveloEpueay_@nt>i@aOZurdlp=OgaUzMHEwR@xrtFuen9c{WQ=ij]PiGjVk:89fthwP[dK|>H\[T~iXP?yIkge]GWi:ldQ]kekq_FrkP7WeIz~_laWLujf)9GL[QVVrxdv\KCefxygJJi0lpaiZunt[tA] [~2F[Y:kbVAg4BLwTM!-vt;c|bI`\wfqesPywR}Mu~d42AJmq?-b0UvRuvbZRmJqfhLQ?SucLwFgKUXn(b7EGJrVK7Ra_Ih}ahxzl&~7qY[Zrk}_=VomkxaF`\HiJ9l%f`q3RkdnKa}ip]3DPrvrree9niNa{rxl`qkztzsyHiuNmckyYhwhbJ}dAn6is`mwQ5YVippfOokcmuhfLY{ItQNKw+o]cՅp>DRlxxgW~_9bS[`{QfRgYOig|`rzSSYv wHerRJ`Nq]YsPkkl`u\Y}iC%M\V[\2OsmZpqJ=S\]_`j_mw=bh[\wCgjq?cDZ}TZ^YxdVzopWUM}`4Z`BpxvPOb]?~Y|?ypRvlNy[f^}scP_Xux_CONcuqlm8F^nnq@jfYj^hKS\ZH2\dL:vVpeu#GkIgpKZvD~i=|XZjb{exaaIG[QsuJCgigBZ_xUTVdgzRTcnnk_AIafQDGiW[XOMU}>qoc[j^iby~qgaMLXa_hA{8=h6TH[tVq\``|e>\pshINa2LVZuWcIjyBkDsNViwJ3bPEln]ME7LLi9kM_}er?T\3h^hAPWMVNA7fK~IiTfdu`_zX5]|S_sq^SoYQ5RA/$RszwfHH^T{^s5xaviMzjeQaBSq_ut=Jiu8>hNCgD]S~vwwR|:i>okwJr+\HYjnyKV_ue{suyky]K~RPMajq[JTnf]G^ssYKS`JLdawggemLG_XMYaCdj|SMWh]p>XgOWzWi`lw)S.{rssdfXs[OL{xXYw`j=e\EtOS]E?nL}rNWd[wrI[_jJ0C=NhahThn1yvZl[hu^jGTqf"cbX|}{nPUmNRSDRwLxlcZ{PV]|?[|sxuvXRo:mrSoO@[jez?lcL]O|wuOLh0HaokYrCrnv>cz}xV^k]c?czb}xfc>[@Yi]J5BYLn2LBehbvkR_lv)scdXnNk~LI4S[]>{N^zSFW^dQZto,|X@BQ5]_uo_\~i_M2fidwe|ZgcF5@wEuuv{tWiCrZcY_I^}jjidIRw}@`HEr_NtGr[ghNvu|wdPvwk`^7vckr{z`5o[P>`sra7K#wTbO]{D<9xph1[bp|LU9Oh~gT_]nq{_{biOHYFUrDpr~hgChUi\Znd{ZgcOjeVe(llpKhTaM|gnH|OjbZsQdf]f.nhOjFvjaRAYg0_jgG_nXUkXviXSv}IheOnUpR[TphHo{@z\t\u{`p\yf;v]iNbQ^zzDS]ZV`kRcW4TmmgCkpq|Dihp\KnpEkAVRXNvzo]~BXd_IUv_=fj~RM[qKso\[^un}aB]AT]zXVOI\}jof1ZuCGdQG@-x`0fjM]_j\>LkQC[MXfGC|/YXI`Z^Hbg(KAZV.c3nhFedfnOaE`a\@i_WjÇHCG|\lKTmJ_YcVvj[yELrGowxfwubjwKnb\Qgo}v4r\A`2UE^}[IzhU8jg:Wq81nCurXAscv^\fXtXVDqSuLQXoOBwscMvkcdyQmrhc\amqr{lun5ha\SQosW]L~ji\\p^"ImHx}+Vs_Ue0}fbh*gWjQvi]<}EfepZaM[`]}?qAqaot>,4PSc]ra,?\FJkaE>`J[-TX?HcZ>J|JP~EoCNHFEs;U]~qYRfo _EObV_7n{`bhkpxZmqkwtTeuT=8RlzhK?pChu:oZCVh$QcTvp?`uO9ucjrBE8Ziq\WZ|gDR_V[_EMsOfmj[z^lkYibuqU[\uwh,|JgicGR}TFGd\~Ywm>s}oy{@_.E;X]uzpixK>RiEj}xfF1xM-`hgI7xS;;s5WDg>[pWrTRP;lf4\.YwzuznH{!\u|-}&qz[`]QUQe]mFVRwTituwZ[fL{LOR]op`/jg]VlBc[lQEvMRncw6]>_}s^xW5XlvOc-U^|JtpIirY^qQylq{>[GXeh^5[lsGF4``kcKK4w`tn^R~q\goK[a]y5iE3dxiON72Q`d?JxcZ90Q\*nStSz#s`:sCQYV\SxdNnCV}}j>dyC_[1`hshGiHT\M&][WNEgwY6{vSbAC(?X\wsJ4nf]jCR_oQf7Zzu@~hwrTFp`S^0kiwpmyaqU]^2PPdXjoIm(a_Ar$oJ`QSNmviqWpHBbeX`2Zj\rD79*atnVzXEbSvO>P('G9`H;g'^,n4[`}cTSXzC\O>cpRXq>VkmJZy}TXGlWj8dlpYY{h{YG[EQD75jxec@]q\X%CkPEQy|IZ[Zfhj`s8JWqphy!fJhBDYl6oRqS`Jg(xU^TUqTFmODA2JZJEcOm7XeG|@'`JR>H?:rk~lK*)NX5`zjAs`bYMG>z~]n#obWo^\c~HklUfvwAuBfZ]p[{j{C|LrdmN3h%5:MtO]wJcLvXrDXB]r|LZmpbvjF^a0]ynQwthrhX_FVkaB\GYngWhnmQYss:pQkL-EwnnwOOUwQguaVYyMar};htLy\h[aulAevaplJMZx>W~Nzc}{yjVkE}mfz`{n`ASx{zzhqA^iJ/Y?Omn[NfaIh/nNII^\trMzXu9UillQoyag[[@`wdiefxLMYfPRO[^WsHp>lJe]W~m:r~hrvm{LxtbK|Z`]`QN`bME=bwg}gDz,j`HjZtzpgk{`YCTpDiol`ddq5J=N@Iixwt8:|WHcv@8^wwrsiISgzV[n}UbjVk~jPwih\rlIT=WWE[nU6|O6W1HAU{qNUu^@^b[Otd/6d!KTpcvWxys\`nvoGGJXctDbr^_WpxQu.K]dP|!r8CDQIWkzWw`[^zYbiods|dUi1k{VWiaTHt~]igs@^byM`Ic1Q7F}fKfTDctly{cgnOf';`Tldxdec[UOCcLfdUiuiZX6kbtVuS\mxiYoxeWg>TrPU}h9GbI_lNdbQJT{PgisbMXehqn}bxWLAbrdVWUWmntpuyq_RyaqlMJXD\fr8S|U;nsZi\Xsuu:ZnlWz]S[`=d;u{@\Pi|+l|uS/hLWQkfHgHm~~)XYlmb0y`ajY[[^VkHw_]J^ocmI+lZ;zjmGkMsn>LrfX[T-ii~QLs(_mZom{bt^NSVY_Tau(vM]Ea[Nm~^(U[WabbXei]f[LaNYT]KRQ8UWmYl`p]sVrsAsZeHaTu}NaODf_c;Tf]<+jhUk@}EcZS^YQfrPpxxfbmbffz@UtEBjcM`}mL`Sqf[xXa]azYKMT_qO`YvO\Gut\rKeXSrDvzkq/\Tc6ZlHBS]\~tVvtHl~JoqF[]tAYr-l}vjDsummlcMDfwkAOU_YiGJHL^#YOaNeIut^mgJbf[_uuYvH;iQup[v.{EWE!\LtxKe4CVxxeYLBVSdqyfzf[R{l.|bRbqy̆~rD}swi?]Yu~ጥ`=uwYstzō}Kto1{Xk|<NJ|xVxV~svlC\9܋jQb{z\{JXquu=WqxDylk@sR\|3~ltQix}UifuvAOYc|ziOv[ylquZy}o`t|dosuxo}^v|qcbuf||rzORWkaKȎ{dvmr|s8OpW`H{}yfpr|cxv\Ufbœ}xp1<}ag\KHzvhgtw_7^{HN>ĞtvyYIyhMWҰlXyҐyyY[ˌ~v~~VS=÷wfsz\WvcWFݛt~D[.ٵi~|lω~okDŐ|aVMмDIQu{zGCx}z^n>΄{@tvO]Ky>}|Nu-冺oZ||_t~X|኏flO^ցF`kK|k`ӆxyuUM{_uwNgMvb^艎{hHTtk{~\zxcɈycjIodKs1~vvr8|zSkOs"xhDay}>wkxuGfVL[OwvtLnzlUxi[?D|wqYrucy{}ljMyapjvkYQVWnyw\ovyplANhJr~y~{|~sj~`ywzʫp*wqc?Q{RfQ^wmu$yǀrr|YKM~rD\tzS|}~SZ~sYnԺ)zqxs}.v\Ւta~~]Ax)t~q^swG렒]z{O:kEx9yDѕ{p`T&Iz:vxe=ڈn}s-}|&tI}(.Zw:}{|ve!|o>weuNXOՍyzrAzuy;@yBn7C}yvyH]w;ߩЌ~}u,Fv}xuf?Qܢ|J\oz|4};kzdnq|R4f~v{*\qpWqyxI;oyXy}ghfb[hkyYnx2]Rq|~^ML_ozXgn@B{{YXdlszpudQpnvlq~VYW}lfp{nu{msShX{azf^|{ygvliQgv~]u^_nyFdrvYŲwTw\w|TuuxvuzqB{ioq÷Vzpw}s~xsv{ptta,zs-wqdw|L|eŭPv0v|$r|xdG{~c߲RqHuB|M~a{e}Zy^zzxuayʱzi\ȟ^|zv_v{ +w|e™c}Zcywqmu1x8:k~ǯ}m{ƦhwPC{05QmB{[zGIzyBz9*wAæ|[ʑHZzx_|]X|M{\Gۑz~qLo]up{bB:}w{fr~qWkwdI\ʀØlzajjZqtu;qtgrZHuhĂ~qk[}pqcuzwztr|vjgpknk\jzhnyfXozgxlwbui~}uz}s{u]À~yZzym]TiSgscy|Oy]yzbSzj]Xvxtƌlv|h|tz|q`nwayl~uN̑^B~ltk|~5o>]2w|YsCxwvouD{9^Yyuofz{my|ovTmWʍu{jfqzEb\[DyсmzwzrfssXhXbxxmgv}|jm{~zvow˘ayQayjikxn|~vle{tkq|jnvUxywv~sp[\}n_zwuKtsrt~atmsoyvynxfu{wazsvpȜnŅpYj?puts{x|H}nYjYq{u{{ywnsaovxpk|nG$`xhp~fJzu~D}~?czxo~zosk`mibzJoȉ|v}STSp}=ÇRz|{~}N|.Sx|xpyzxv{}tgTeu|eyckx~xV}jQo}U]sr~3Simy~zu|yWl}uxȕl~~$iygfjyeq~J_hru}t{fcb{W`}ۈ{4ewv`ewOl{j|{`|lvA`vezpy~{]aZVCw!Tا^Fn:~wڥ_,#Pu(eԁl`1y3?=`һYպz;䒼  +<;ٻe"U;CMҍ#;w:葳;X;@$F:A5`;!;@=<Xk;y;t)`[rAH+);o9#;PӧT<d<`+:vػI"0;]; vjU:y;cx0;G;<;=% hU31rn;0l^H;tQ: #h0;')3 +&!;»O;MԺw=<Ʉz;︻>A:ǻ2W<6a;;};<5Bs; ܺv;O[:f.;h;C{3XX9*1;型T9j;u;GF}yt;]SK;SB;Έ{Φ秺逼_;:;9}O4 +;#<#h2F3O:e!< =;IVE_;C;3:Ģ;h~H;J;C/%; :˚lhM;[:q:~x[; VX?LuS֦dH(2`~;-E;<>;ky:)<2s,;;"DD;=:S<>7⇺X;'s;}<{ ;JP;d;{;h;8?:!32[v;rm;8C,zl_6Ua-b;]q:ˆ;9ȻVHDEP;<;:s;&; +Lu~D<+0&bܠ{һKT1\<<:=@; Yػ\;4,!;:;^:i##7SѺTu<H<vp+z6l>U:y5);ۦ'<%:v(;L7:$ٸz4;C⫹D. lɻLn,NۻwP*p;'/ 3K#;,,;y;;Nw; t; 2;<;<:#ú; ƻY +:& <' KnO84ǻΘ;8 +V;_B>;z ܀;~;D;~;I5::;;`ǰ;iu;б; c;J e;.FG;,P![<{;ȩ-Z! b<ցVWꀹ:k;L;_4B(t$$;n;Ż&r}L t0Ż;;e Z;$=:-<@`Ժg[Xc;ED];ntֺȲ;U<;v;I Gbt:'޻z&ĻA9M:|vӺ :Eλ;n;뺐TIu|N:]whv;⡆;`ៅ:_:hP@톼 Aӻ\/&E;&c3;rI}.U/;_ r;fZs +fW;g-;H,y:vrD:rn;iy;:s<]9 $;%{]HoW!ANV;M;j*;>۞;K5^4 +|';:!;i;ٻ !Iwdu&/:[0;u/=4;[vQ;z2;#{q6 +!Jq;I:JӅh)C1F_$ƺUCd똶:Q5;01 h;V<&;^ +;Zλ٪[:级4;f9;9 ;=;u;^< Zٻg;V;Z:pd;)WK:YM6<+;P8ûr/ k\;F捻(~=;";PVB^ ` Z̻:`7x;9g)XW&<V<<ɺ;[z7< +Ry;׺iq<2b;ܷ6<bP@;R,Zf:V;b\;k dF |x{]L'6Yd;.;b9; ;y@<L};uRX:" +u$F;룻~Oy;ǘ[YS:-T`#6}5;JZ;(x:||-;';Er;$*<v~;O;[猹n;Ժ{u<Ӻ&&N*ә`i\;ڴ\;H"Z;&0Vb ?:sm0 ,R:0)kvqWL;_1;ʀ:T:IxG :Uݶ$<)Bl#;: ;cک80`;rϻN;sQW<;XX9<[-O6U5;d;A`9<:G8Lf:W?仔A/;P:?앺0Th::q':&:;Y\@ :MQ"{W+$@c |4 e <‰T7"'G<\Ȓm8;=.⤀ +.:\Vh:H@mxE ;%\:sFQOɻ+b;gC}D0<-ۻ)oI:Y<$3;8;Qi: =􊻼EpM;𻇳;b>: +u; ;"X;E;ㆺy;N;y:5;,;:Q;L  +U;T՞s;O8+N"< +dX.Fdѻ;6<񍁻jz dY8/* $%!<\5;!@;dށ9H`ں;"{]E;rv:E;] Ӏ;)჻5wo; ;J;Z 2T:,_+0jR:@9dZя;F`SjdLVF;~QyɇL;ȶ:Gn(:K Jew<;;8"=D3k9 sQ;aٻë;}O.o::,@d5#;:צ; D;5;Mw: -噻 c"}hQU1˻#;gl< \1< ;6 Do:' Bz;#0nO;G|9e :;P;;];v;;EQl42Y9Y K+*;,N;4P:;jn;E;1lCHzF/;ey֣9 <ҟڻXuf;Nr;8`K9'b!:ï.Rs:`ջ\㎻Žv+<;Q1;.y:CS;h*ʻl:8: ;Ɔe<2͇9^,:2i7;;.L0P :S屺ͻxP=^VNG%;@i<_h; ++5Ļ, Ի}ٺi\ӻSȺnG<]\CN+XW;KL<;~ ϻN<~)<:ɳ;T H5ŻDҸ;ޓ;DP;9zB;p\P;(Ѡ;*;;:f<88`nT޻ѥi;EK);b; +9ܷtl]FDV<쐻ܹm?;mH ;K;AR;@*:OTs<@LC:@XO +w:;9y;E9&lT>Pmj1;5?ˡ:{;%ﻒPDWb <0<ˬqAW;YsH5:P);BPyG;w:Y;ӭ; c3~;u;{˦:$KyQJ72f~;(p];<8:BAF:Ŀ;c;@_<a +<5;F%'՗;1<X;{)N;u;<:1;DJ ٻ%+J;): +P&;ܨb{,幠 +;:;lֹ+;A:5;W~;uO;먀;ؖQ< <0l亹c;WH9,<_8<ÊaEn:;7:<5:;;61F<o%i:`)B;L7<@x9οo);:}y;@q:e< ;Ì<\-e v>G?n;R:;+;r"-{;=X< :rƢ; 9*Ү;.;;{p61Õ;p +;㹷I;*KEg^G|K<C߻e;)0:3UqA';: *;RߗjD?<<ͅ&w;:^|4<ąt;׾:EGf;-d;t:!DɻT9tkg]ڳ 캜A 8;;A;ő;;yg;cI2<0KD(}8`<τcƷhwh0; =;ьc;fɻ4Q9;g!U ;AۺO%pyjwZ`;ez3;-0w;V:Hﲺ7R; ;d:[Q;]S;-Dj; ;x:h;eH:7;+9É_x; d`HT~;d+;ںx̕ ]:j:8|;R +[;P*m<`''f:(:UuxGKҺ2@:Ư=; +}裻9deϹr<;O ;iuq: N"yA0<>u;QX$;F0<^̫~";9I;^v;/t: ֺ_p:X;@E|;&!e;лD[;]bѻq;5;`l;F[:ۺضꓺ:;0^;@;W<4iLΗ.:[7_!ۻ乆; ":\iź,!a9˴ 1\;U?0 <:f.-@IUY, @\S<þ;Ad9;Sl;+3:;`&<.9/;x໪8.6)8j;Cɴ:;%cOR;EMn,N"v%@U.Whgo;iFԼջK1ちi^9dymhP; Ѥ bBᷚ@; akܺiI:ӌSúҺo:v;/@c컗7;]}d޶n:::Rx7;pDȻ͑;>y;:! + ;r[CW<<;|d;m;*;f;vk4;[S;};o@߻YE;1vQ;:*;I80?;oW{?<5_;Q ;O;离.;3; +;V:Ӻ̆:Gf7/;];?^xbِc ~;(̼(j;G4: ZcSR;A;~3;Rݼ9:-;؄$лЈ;NZZ?}q;m <@ +ɀ;c}蹈ֺ\549^:]M(a;H;6u_?L<(;׻|4ӫ˺1S:v;+W.`予] +׻|0;;%׊%7",< ;f:D;)|+;$(= &%z':h<+G%|S~; kG:9u;4Z̻FvՉ;h=;m< |; ;RX:5T{S-;p;&PA;!⻞5NFM8ĺfjqx:;\W9+m;%݆PZ:Ϲ}<;ޅtg9;M0d;W@ܻT (Q37t;l͆;V 9|3;E_ W#@N: 5;!h[Uc؎{;o!*ze3:> :I-6;7Yh5bF62%2:V^:ZM:Z;< <; 0p R=;ڷw5_ ֺx:`8;ȩ<|]UEv<,؞ S;H.f;O`;лu + ሻQ,t&8ջػ'V;ɮ̻k*;.Hǔ8yn2h09%+?<{p:*;8:Z;;+':S;Qe;;z/㻪;KJm(<_;ṉ;Oް;;Y8,;ZL;0#U;<"Qy;W\%;/'hl;Ϋ:x<_e:Fػ;X;:zȻdǻ9U;6;F;ƽ*k3vr;P;uw& }A&@2g:8R ;%w lJQ:4:0.vĺ:(^(g~8|;HwԵ;?9.4T/:ӻ;gO"hzVкϯں{L[|;q,;û9;{+ړl<<} N~fR;#pO:A;;D=YӉ; ܻ f;>N;ƥ;޲;u)<c;B6=;;3;u u\ܻ-⺏j;;6̺+Իq#e;QQǻ=;><<9p7\:iaC{ɻhtJE-;<2;Xt;[_ :n-$ƺZԺ;;x?6oN2:g/W;kE;_CY(h {;H|Q䴻Dޥ;ǝyȅ~99N:<;;B5_W̻cD-S:ݗT:P*;jV((;jj>"<աΓ^e9'e(;PϻΖ:;;Cר&Y&9M:[Һ=F k;;7W^%|;&|:6<3 EI<4.:;~99.x=֒;ڀ(gw;Su;;6;~ӹ\m;W%;ݻ8G)_6;b9F<˘wF|6: ?J|֌h ;/:VW;U;&;9>'M;% +:y:W;:~:* $1;f)9<;| +;]77Omʑ;F"m M8򎻴G ڽ;) + mN9g;z:3;.<8T9߇];3qn)/;m2a:!:5;J(~;6!_?;iN; "5=Qy;< O;Xb|s;3 =;s:o <"(sL4;ۨ! :.bzS;T;&k{ Q \ڶ;ѻ;qq;iҏ;2y: 9Dʻ`j:OyY%Ⱥ| <j;^λc4Gxn /pګ;g1{:d9 CW肻ПȻu7Lpa; n:{v3 %:+; D;㉰yl<ɻIC%`;%+~s;2꺮ݹO*;9yD$&;bHҺ%>Vϑ-ƺ +;W;d<\;`#ۺ7vcԻDx#<27;9*0;ٻ'Aƺi?p?}-Sj^zGh9 +:ӻAֺVrF;̝;T;]y»r'=ҋ;{><{v\L\;~%;=&K/:p;Nǻ)l;QFPQL8L;5K!e;_F:S`/;@A5;-;wGv9':9=8;O9;d݊:Nպ?){㚕;T2<0 +~!;;~-<줻ޗoO%}'U˺-+z;%r:"^ +/;#M9;}4w;9;P9Y<7S;m>`<9޸3"p*;+;$r:;;~; .*;2,<6prQ;v 9;%æ<+;i0;i֖;p.% <.;Ĕf4Z< ΁J 쏻و3;MB;Sa˻ۜ9ڝ,<:>:Q0z;[;-<֨:8:[Q;h;1!ǻ<}:i_W;գ̎?G+ Y;dt +DVP$dJQ;1û:߻;K<_3χ;? 0ME;;O: : $%p;V7:Xg~3";N<(扻';"@L<A1<;+p;%a2;); 黚T:)g;1 ;x; @N}<<;#e;4Tr:J6; +:|;]U;OU9:;;Z8&N:,3O;L<2 5;b/:8U:L~/ v:tqet;hн:D-n@F5 +N oЙ:@0;o::;$C1F;K; <;2͈;%<;$<Wt<=[뎺8ŻhV":iz;PeϻE <#Q3;󻹲e;o @ <:S}(O9HnԻ>7_6 ;Ԋx;Tn*/Q_<Һ׻B4Bű)x »+::ȶ8AF;k9\P:!r?;5λc|绒1%wɾ5`,};*NxO=;a/|:5y';䕔;!MD;.q;a';tQ"; `9-CR<Ի۬ +{;;WS]:SLj캒;?h=9fsP;6T<;_Vgػ&:gJ<,zI:5{;b;:C9Q;I)@lUg*<>b;9 ;'9ZFxV5X><8~;;)Ls:P;Q󭻨i<%I(s3$8f"dByV広tE;ӻ7;BZ;);CI.71`:>l_G::;2;>%F;!#^V.!:9>%<~ۺH;]x;|pըg-T;^ ^j}NN5W^#;J ie¼9<(l;;|;C %:)rk|Sջa(Ğ;ud;F {eZOm:"-;9p'XG<~_; {tqik89 B;)I;O ; PS;E<'t5=D\»}:ŻOQ6V; +@'MD:3λĻJP:";ÿ1;#L;><x<@l;;Ը:-(xWkZ!;`!;y=;:;;; +;Y<\u_aQ 6k;ld<4;cm< 6Oىr?U ݙػ>;%ZIA<;삑G9;.d$&ͻ\Ș;ES9}|d;:8I9lG:; ;CBM 5o +:.50%ỹ<7:7;,l⧻É;:6#;ػQ:dWDG;`;D;85ٻi4 +9 C:M;-;A<;;qy:(8(7:;]%:c[@#< ++9:|;<9~/yqn;=]";o.U7 + V ؐu/AҺ;};(>ܻN 01;`Nך9;IP;BʻtV;00I<3<;1wa5+M9-CCU9ڊ;/ 2;Lv +E;/;s<I8M^dV͜l:4Z;c].ȴ;⥞;ͻ;N:~p;y;(;O/O<r::q4E;1;v:;r~ º<λsZDnPۻn=:z:yN;׳;.<'B7f oMi;-;=s"98Y;i[;P<,;7Z Seᴻ[׻;x<;L[<u/&<;ҁị;k;t ;:I3Ȣh;FݻA;w\%izl0 2s;;/y:w=;}Ss::M멻:M`;[::\mݪ&軷f:+8;Շ`+i +VlcJo;X<'A<»<Ί+;"'IZz;ˋ8;p%:-;Kԩi::;U;{F1;kG;V;Nd% Z;x٬Vޠ:-h{;-ɉ;@i:f.<;NZNXd:D;;mP9X2k4ۻn;;f:YM:;P`;g; (˻*:Qa#<;n ;R;:;SHw;-S ;f;;<):  :ը;A8?6DB;~;$;/;>L:7l0_A<:;;k;QH-,<;=ͻ 7hhػq;'0\f"1;L; :3_VF6&𻮙vc~.<΅컢Ե8IS;;1].ርpnBؼ;4+RXn?쁿< 9 .";v`8E>D:*e;,j1Ʒ;:n;Ѽ< (;h >;"i73+; f<;4J@9Iޏ;S"q_?Cٗ,&P:㩻c1. ?Wm;;ڮݚ*;`!:D:jٻH ;[e>;J;2>;Rw λ;6%7;QP:(%1;އ,o,廤< :V>;:ʔ*Ur;Uu94T \!Eһꉐ;&A9;5:u29ul;:i;;lwV:4#I۹8;.7;o:|;Up;Lo:F:,u[j"/p(f@:o:PHzR"1;Nܻ{Aһ'@:菦A 0;kf}90<F98;{B<Żu%oi8 +9H-6;z"0^=(<<$Ƅ?:l;x%EX;lHqTE_2W<<._;:0;S9E. U<<<W;K: 9;¢;QW!;z;JI<ȭ؝X;䑻C ; ֫$: ') 2ם;_x;LiM_;\9FX E4<~89:l;w:cS5:|UE;t+ t#?b;{%n{\iՈd;z;YF&pκ5$;@ɂ Q:ˉRGۑ;R-;l #~<y!('<8 {D;s<<8;U~T;<6;ɻX>`6: +%;1=:+uc;rye<*;;nep;AIw<&1,{Kjr/;>'J)6;wԳ::;/  <$*z ;wȺ(:Vk +:( ;|7:J;V;#<*˼#\59GZ%3-ٞ*"y:߻ڄ[i,<ֻ-ջ^:S'w<*! W;tg]V;0<; +Ktk;9r%;X$;a"MDa 98b; <:;#rf)Ъᴔˤ;8E(;F;;o;ň/I;:^;Z<R%L:#軐9Bxm;j"mZ<2$)]ܺ.k;cC;+7:sb;Fi:IU;`˹n;9J9Ӎ;ja [|";Ż)һ⩎;ɳ0.iȺg9<;h,<;qsz;;f JM7M<O<36:W\B;;lo;/P w]~ؠH<6E`<=;@(@: s!;-<:J n^<;)ʺkk;A&pD;ڪH`O(;]);7uWꕊ?/<i<$- ]m] ;NU:DIr̻<:'ػ^':軔ޯ_r ;<8:n`^t; {;+ڹV,R].<ݕ;P2=qE;:GK\9:J*v;7 ֻC]p:QȻ <1<UK;嘻BG醺;h^i|k.׾ǻpX:b;U;ʼ35< J.:41K<;X;XR/ ;.`[%<;Ce9lŰ:C**{Je7P--;iYq<Y?&t:+;`S;;]^1E:_>$;AEqC;R ;<œ!; L;^Gڻf+7,L;c:;t;9;C;G< L3{Ǐ<ʕ:ׇ;fId/7[RoS^X;H6嘺73J;l.;ấ?;U7;:jzx:|?xGѻײ;17S f;,7:t:8 κo:|;;Vq;Ԓ;rֻGE(>{a+7SMѻRŞ;=; h9:F4;+;6/&<-;<<;D:KP;.0 |= <+ûĺP:mo?>%{!<;0; :/;);;û;-p>Ȼ0"; uN2;%&;ӹй@c;<ʁ;z8~[:e:mIqv.:;;^,I;K9;EMXsK;1wpaʻ/%^M;&贻Ǻ2 kL߻p;G1 qmz6G;!E&; %!ͻIl#92V;G;:&<{ӻaM6TC +Jʻc^ɻJ +Իh(h;zͺ }4GQ;~9it;l :;QO +6;V <dljo: Vٺ?;X:g@ܻŻ+ǧxC2u:˹E;Ƚ;ڡO <L߸Ŗm~ZIZh8t! <<:~λJ/;p#y;ԑP໸vI:`,q5;Y62H;,8 +<<}z~<3>;m<߫";g @%YI(+q-z<;r:§}:Ne;;Iά9c8R<Ӓлc4D.仌@C"};%A͊Lz9;QP 9:E uni3;Hamb;:0;3I;y: 9;nb׷<"-K<':T +t +:S);!;+::,滳}; d:U&&Cͺx:zz.@H]ŻѐNm;~_sV:ʕ 郳te;xHY+Vln;;o=;h n":|~n)_t|%)Dζ;; 9@e:7M;8 +R:Ɔ:Afۦ;| ׻ia;r;v:@q;|<39"? <)۽.X;M(J;;Y9 vj%;$-@ +;+;`K;@<^6?se#رQ=B;Q4;q*9Gn\3O!C^^6 ;>9븺j:BDT':;ύ8j:.;ti;2;;&<ҹ;՛ +;3<h;0$ѻ_;;t\;A6;5 ;u2:{.MջlH;5:}TeP;x: P.VڍL;默Ş;Ly:4t([F;!;no9quN?e9mf:":bca W:X U#:5qz;s23;3Ԁ;Q"L:_E˻5ں㉻[~9c#;S;*!Q0;o<;- :e Y;z>E:ȉ16;%m:Jͺj ̠}A9un됉e0K +;;[َ;(Ngf;#;<;ٻ;ժ;uCɻ 1ӻn;|;<׻ր.1G U+8:em;P:kJ_;:: +܎<8&y7k:~t;FYwp#;]'@Q*;k;<9ػZg:o_;0DDt;γە3 mD[c;/auYA;<;E(9:mcc {ݢ;3;)(;Tq5:>ӈg:0.<5j:Ψ9P0ai.0<.U; u[;bOLt;K;δ*;eT;S.\-lU8ꅶ^b7Y:(9{ֻ>g9Dڬ&:<̻[)<9!;͒=7E;2'j9 D;=M(L;/_~0A< Meg-; ;C/y; L9<;s;M;<9:4ITI5:2"o#λ!:cw;a;ҡ;I:t;Iyr.<<;!9JS:~:߻-/K<&w.;o@;#<E0}kl"<<9-<7 |<$:w_໩W;,O,<;-溮qR;ɒ μCP;b!ۻt;Q: <3;P:A<,TY;mr)O:8;$F\i@`m_JA;3;<:wyWQ3j9;_H[/;M%sW;^;ˊ><:<<9:ᅺ}9XXlڻlf;bd; ;&;[ѻ&g98(]>;;GA:Mv;w"X;t+y?;Ô& +2&<;@&+; ; +1!f|W<̻Kݻ>VA:a;FգB;T:y7 WN;ZD;=<<!<-W&;X(:0݃H±;>;gݹZ7:\g<@H`q;|.H]kh;;oK:Ff;;BB߻:,;=7ql?j};J.6 tR;DXY<]78;2(;?h9;E!4oҶ;p7ã8(:@=<#@;-<[m<3}QX;d;;{6<T;"<>y3;#v;T>;I;-:ec<=>};[ǻͣPD58;D ;3ې;;/;:<1*[<=J:q<(h̺o3$\Ê +[;3\;74^`晻v;`⺇w;>27>HѸٻؿP:lJ(;"S{;VU3xO}|Vs:I";Ä:;#ho;Z;ͺ~1" ;'l;H*(/ӻn,(2#::eJA +G(m:;:(m]K5@; ~1;D:;{;n=<:8#2@YM.;G;uke +s<~]';N%!$~;.;x4V;Z+_+LPS]zɹ;MRȺ5-^޻Օ::,;.0:0:X\O_t}S/ŶӖ9q;ݑxa;SyJ?Wj;ࣻK R;M ;?j: < p[;9';=pC[;0z;:2.;|Ab@+5&;F;IEl9;́;ZB:xa<Իrp:ⱺu9 +g< ;*;<B@ħ'jjD3;yœA_໅$;=mV9(?;;S::T8[s:Z ;Q<7;Ḭ(9-T;0~7;;iS;z5;*eu ;`r9BE +;w9e^JuyO;\R0B<Z4:x:iH## G|:B;.)<>;Hj)L%;V6F¤;nۺ⣐j/5q:npOl:Ўo%6 +H65;f+<א7<ڌ;v{u;:5eûI#-gmr7a?<ڻ􇏻.rhػ3:$!;}<)U]; A:\h'ƻ$J_໾xC::~CJ;Q:bH; ?iһY';IӬ";;[gE#%;FFSջ۫n9L{:1F;\Sn˺L 5eMX:ӿ3#t;nL&>ϺMO;~M:/ ;)㭸ke.ᢻ.;U ;:S; Yʒ:n +><&E6Ǻ7;c:+nv<)ּ:-C%ƻ#fF; cһWU:6H;9Jǻ}h;t`>F޻+;yZѫ;:ѩ$:jrF;^Y<9 (]^2<%i;hFϱ,<`+6|.;iN( ;2û=Bz ;tf# +C9*;6ݎ;4;g;?I;!;coǁ;|:;ˆ;f%uY19|Pa :A+/;(ٮ:8R`*h;ΣEO;#E"B;Ch;a +޹[):K(:;$#:{C2;5Q:;J&;EX& ys2:Q;!$;V,f;:g85|Z@P䑩;"E˻^D ;3h9Df`q:W:G<>U:[ջWa<@ڪ +;MzM~:h ָ;;37;%!+㹩mV;2;TmMx69;U׻Y;;nž;Jk\l9&$;ǂ:~S +;J:V;;ᗇ A:ȸ;=|::× ;K2&Z;Lܤ߻Z;oǺ*>˻E;x};3ϻO: -;ΪbE:N.;R-;Q;QD;{';C:`T {;WLD;8Ẅ;lD3޹ )<x;;*ӑ8<F9Q;z+:;2;Ep:f:Ҏ<{; U庐: $4/滤7U#;{XfoǺ<^\;ơ*<ܳ(;<(J̧;N<̻Y@;Nc;"ܻ;a:AE;Kl;lŻV;W;::;C_l!Z},HG6:3ń1"; O廊.;J'z3:ɵ70쇻~;W⬻98PO;=Yχ;ַ,;x;rY:q9R;?;gD: 8KE:59ٺ-*C:Q<Nz;9ߐ|7x 2,)J95ea_;J:"M<6jGTzVpK /F<:D;ӻ-9Z:<+Q:5:[94^nQ;Cp;%:</{.U:N;c!ƘB<ׄ:";7ƻՕ5Q:䴉 %<<;!Z:6;p:/B\;7;cߒ <^I,X:aD;͠;҉ݺ_ajV&Ҋ8(1q:G3<؞r8ٻ2(F֯:4ͺ%k;Z;N:8G;s:w+;jX^);h~r:RꦻE2g $(T;(::j8kN<<:R:&D.;H;#Ļ{ݻǟ:69U;}>9[;Π!<^jV;Z#K=;x~;6; i;l;>< ? < +e-#;Ju;3;;[<=b:;ἵ,;; e;O;;n +=:at!t8]ߝ;WKVo><;;(:$<;F:u. ;?F;"ްO:YId;`adeWȼ\7:?Y #:$ ;Ozκ:: +ػS3q>zx;;Iyj:oh/< =;:V/3Q$xy(;>m=;3 +_p;9 ;dI*zb;q^T;jV;X;Kr;+t#YCE;5<;'\K1<|GR ھ<>%*uں <9:B\GA;1;QuK;Í;:}$I+;?ZdɺTt;,׺濻,C:5-;9;V%7;\n y;7;U׺7<伻u%l;.;QVڻܐ;چ::|˻;;wxC:dm;>lm\zp;<%h㯙:V4;@LٺJJ<$<-滕;B w;;[QF=f*Ih:o |8Mdc;f\< Eӵ< +gfi#97蹻JB_ĻLB;:M;!Ļ;w;Cẍl;;ņo;%L<)F<\`69hB;dQ693^6 ;+;SԤ"Q;Fjw':5 <'Sr;":hw];Yh / :-j ׏W;ZD߻<%* {i;b`:FAki\Rķh; M;ڶ;9"9k<5<[r>+<;:;G\;!/b:y<~;`;d<*l;nHk:7:S%<$7kh;6;!dS컻fA;βu]sH/ڹ|9Kݻh9 +Le9Wɻ%tH: y Q;Wy;;p907H:@7 57\ۻ< :лP ;\9h;y;d>[;ܻٻ4B$,|K:o7;h<;:G;eRY70_ 89);L%5;X#Od<7ˆL[;wrl9TM%OT9-;n#H;3$CV:g;6M;B!:C";^:t@;wa˻V;Rk;C;X9OaZ;{;ݻ~A1R;K;ƻ::6۠f[;+<;Cz D_P:g@@;b5d;g;b;x;hۺHTỒ Hݛ'fg_kaPW;:ִr \;#d» ;#:';;z;U ;~$~ں/' ;q;l).;q7OH;UVS;1:Z:Ĉ;#b: OVb7(=7kλy'8:;9yh;֫;Һ-;̐9 ~H ;G:A:ڠL0];\qp9<94H "λlf:x;60;O .)ZƋ;NW)<6:U)<ϻlLSȆ<7U!9e +jh<5R1Xλ.;};r%;J;4ﻫ:Ll6+;B:mbS;R9ы;;P^;z *<ܓ<ڌMü:'=fX;u;ۺ[9:}ֺFD;uŋK9ƺD +>7#!:g;:.3;D|V?;V:O 9[ ; ;`;b3[ʥ;!0;dN_a;3:53<:CXX%;J5>?8:ͬ;m:B O;;{r;N;ߺM ;:&iB;}/TaU;AY\-:VQ#JXfλ;D~:c<;ȃ;π]:]D:2q;E;44JE4/;Cºغ)ٻ+;x<1l=v ܻZs;A;4N8u<{;+;+pGy ;в趙;% $໤:+Gb̻ڻ[s_URV;R(;;̅O`zC;o; 18^ E;:aR<};A}9Իк黙]:5]k5;A,ּqV4<6<* j;!U-얻R<ϣ; )ux;L?;v;,?`I;`A »< K1,6R;;p;`K;;U:'&;u\;JkH;)$)8";}:ujr;\'n|;m<ْ:<.ﺌcw:;4;mD<ʚ:c;X:63X;1;>.w<;;a:gӻo{;Rt[ɻb=x;f;<#9 Vc<47<9s:Hshw-:c:Kz0;pM;`i: +7<( 23޷;B;Ep;ۺɻv9;d;DԻ-P;<_m9ͳ;];߱(;0h<ϻԁSớVG[3 < L7;:G8mȧ1л8:<$;M'qT; uwB;Rn:?0p:8{`^+һ>{ <*BnA֔;QiiD;\K9{*< diz:&K<:ٺdrŏe;q=;;CG ;M:N̠uҺŻL<7Y2땵<<~f;a(9F<7;-Yֻ~:8;?`<;`9/M:;i %%Z:;B%q{t;1:֚;XH;;T;1ejo1;k賺+/zɺFc;6ں:o:xl;Gǻ˺;O!<4;=̹/;G;La:ͽ;c;pl:;u b̻*h<y;&뺟:㕒=#?U<4:!W!;=ޘ;~:z,=;@m=`?qYֻ(7<;l{;q:߸\<0%;BN-:6;S;R +;@/< +@/+;H;+K:wڪ;99|%ẩKQe=:T^_Ue˻f$;ƹ;2ź7櫻z;<;$f'; # H:0;~;s;^G-n^xOaȈ :Է9J˻>(;: 8.J ;ǩ ;tG da;Du7<.9iy:<;vѸ1G<;;w(EйTυ~;X;I4kl;:nrK򹹼Zqݻ8Yܻ%)˻׺W=; 绬 <$:<:7+<݌;H;t;l/Իno9pOu<8:W:c{;'<$,^#s:"$<^ӻ_t;x~(:t;CSz;~g8{sI:o; o);Ge篻M7nJk# +$#:=;.}Og;:,2q6:?ى&y tBv],@1H3J<ŻA<;1Tl/;T[ߧJ9:ZC;4ð;曻 ;x| ;r#кc ; <~A:z:?;4 +⫚@;+;* +{8zN;P<. ;1<" :w=;ِF܆9;Y떻zI<9@;$;kf;;D<-r;&;0+;t![а:M}>L=?H: ;|/B»~; +Qغ2 U"s;;;κјC;;N \;:28@;* :$:;Hۻ<#»}E;1 +*Y;vӻOڣ+<8rEHt;𯇹v3;8;:_;꿨:\j&9;"f0Hh);ʚӷ:;ƻ0!k(7!6<E;<;ީSa;kW㕺H!Ż +@ + ;;I;-u;?; ;q<5ǁ:Gֺ]Żg0ԺU6;s +Yw +b;Q"sT=%_?::2?pKgp;'<;Q;;o]ϸ5Ϻ;I4p Gb;\S;aٻm׹{ܻiƺHϻwĻ|:x;7Y:_ûĺ{( V +\?;;i];$x;h;Է';=;xDޥ;Ih;];ܻi;[: Ƙ;ыx1 뜻+;?Lk;Ռ=л׻>+5Ay:r;\^:g <99g\;~;f;<畺D;o嗎O@;^ZkͲ _:eV;TzGX<$M;e;:l;;2:q;`v:0#;ZȺ!:s 6:' !w +<Z;h';|BW}ȻsK3;y%<@Au9<9;-5;zi;5AB|ev393"Mиgq9.7x088 ;U⻵;*ȻJi';N;}ڻcA^4:{;ckW臻2ou<]-6J9> +ǻ[hia;>̻ ;Ә:חO;$;)8-r  .ᰧHk鸌ͻ} by W:z +H:xLڻ$H냺}n:VDkz}9@:_?,N;d;f;\Jn;2p^;d"Ը!p<Y< ݕQg ޢr:12Ⱥh{Q;ʸP:ƶUcZ;ajm ;z tgֻ;(R}gy=9P;ձǻ;X;P59=A\y&K#RvxLS;/;[M=ϊ;hƻ%z:-:[:G r/S܌κP;B >:'lIr|,ֆD+,);ԇBf<2;P91ۂ;Ԕh:=a;Ѕ;;lN˻@;M|w3:q3' 8;\,$ʭټ1ں)4E;(ǻۻU6q' ;-:y׺ɻ)<"g:&x;s<#w;^ZɻIpf0w: ;(;g7ϻ:^{0TTVkX;41:c:;e +;z:d<mo;9__;:A[N弜j 0}qO e%:;,;t%:0;<$;@ƻ 6lܻJA1D;A<;Dޛ>=9CoI;VX;+<4X;a:;ZrȻɡa; ;ȹi;R@ t;+;9a!~5;';25/G;jC^V:v; ;0/;Jr"@@FJP;0渺3;<;`tdj;U9ߕD;$R;ﺯ&X:6ȺȻ +J!;$;yZ;I1SuF;<|)ӻtio;q$=;To;D,r]:Y*Z;"<ҳb;ʻM^K?;s:" +};<;k#!;F;yFL ԕB;?:<Ԅ2=8;j:qH;ru;:.é;dci L;w:`dLͻeO8vVл~8*:3N:$; ޺$ t<~;Jo8z.yӻ)K<R:;};S:椗:C%;];6;oV09/i;6:,cȻ)2;{؊IŻ8k` (p㻌>/if;>W;`Co:j@k!;WH";qg;ı䷝xY5wۺtD:غe9Q.:;ID;>!Y<{;uEX+;H3V.92]ޝ:0sKx;CcԺ#{;f:=jKJ:);x:%v#;e:պq֟͘:A[-pY;磹:>08 ׻i9m[ +\bH~;8L lN<ֻ;D!di;ڻ$Hg8kYYnc:: 2FQ;7;<;BкQĹN; B;;u;`׻:;A;x:; ;V=&PTea:;19Hghv \A;}.:;9;WL:R=;V<|Y<$lJ;&A2;'-Ju: ;;C»%ea+» 7&W5}&9Rb\2;F(:_ ;qd;:Ļ:P;|;i9 <Vz˻;C(M;-S;<:/;Ö;7wY}~<;.iR;5U: !;d;Wf/Q;9;a:aD;2~9b;!:o<v:.:b;10< :0XzRE9 ;^һ_Ǻr;ǖD;;o;rֺm];8).Z<:?;qj:w;S:B;؂;!+;8(!;xeQ; +;pS?B޺Bu;--'b:ߑ +̺۸J(P5E;梊nk5Z;p'<p;H;;:%<<;9g_W;YC;V=;auM; U;E9 CTfpU:\:a;?RgЇ6og1;^.t,:4H;5n: ;T +:#N23ػv;AJ;đi;Si;J;d;(r:R/Diz#0;ڹzB::K; ;Z oIBBtT9㎻(л=0:vqLX<Ż;ˋ8R;?e^9ѽjZ:;958ьp_T,ͻs4.ClQ=;5肼 + h6<>; :+;.0I;S +; ;<< +<Ի 8Z,;-<r~;n;p:E뷺;r:IR;]o:Y#;:<;;:C9a(c<;:vN:<S=|/7;:ę;EA:깯:YWg6G.;7..;aߺj+3,Fi;X:v:÷s:7g:/<;, ߾:;: 廣>/w;;yw{ w x^;ge;品];:V};;6/TQ23A;[޻IA8Z;Ъ:;~_:!O<3z;i%߻:-7ػ(_TܸŒ:eٔ <廬;Z1U*;; +;w::o,%vH#:ֻa̳:Ϻ͛n;.[Z;h +xܻqey®Ļù;:;Bm\9_;=:iMWz:Bs;KӍS6?;9/ݺh:o;4};p;Un:%":=婻44;@q1;WmZ& ;2\;V8 )&ĻhmE<.;2%;[Z 8<Y;&:'B;k[:xnq<,;&Q*;]:Z; MJK{_}C<$Y);Z |:;rC<<6;u +<-b:\ TR!+|<;ȋ ;Nd4:Wni:;.*<۳I;dS;q;3 .:e9* 8G +a:C л]nUDq8AD<Hd:默:̡"Mr$F;V9*$ɻh&^:Xo//B׻eƻB9,;k^׊˺ U;cjѻbϺ"<$ :gď;J;\ܵGq>yP z;5YS(Mifs^;;!9.&B:nl9?;wq*>DGރ:]b;B*ضq*:;;* [: +;\;LC':;N9>_EC;B;2M1 +r-:dS;(<);&;g;:2[8F&oo- З8<}:u/;`(U9:jK;$ԃ;g:.<$Y&t zPlxE;9!;9fK]/; !n;s;0$<{:D>&;x|;K;;9J xdu;U;ŀ.};(B;;WUjW;AB d;;M^8໡k<:L#;4;5걼2:<0%O:-7,#9#}:ߛ:<; 8kӁ#cm~;+"I';_@V;F,<ӱ/<,:f;./;j;:_e{u.7tfq;ކ>зL W:R"u; I ;Wn;v^9_y;W<`;;>nZ:չ;5x~t;Em( S:;3ۃ;^Sr< @u鹼sM(jD}@b# ^;JŻ :b;oC4; τsGպ^Lة;'IFk'>A;^.'-O g_6u :;WѸA̺]~;3KM};;-+z3F/6X⺃ͻ;Tr;1:<:W9g;O;Cx :>jdI*8ͻJ;F!Ɍ; Z; :9:; +ϝ\кd"闻UEn+I͗:B:;A;;wY;|*1,K;`<܋;+Kӧ;2( :Tm;f;-{`ι ;Ct;J[{;AZ;\F`;|!l\1b΋E.9;;\ע8:ʺ]*A( 2 `1J. `L::è:`Y_JS;EGHN;<:+Z7';8-wy$E;J~F@ &E9;-h;I<`!I/㻸tc !;ow;7(\;C;N2;<;B9p]#)I $O;|K:pwлҫL;H yifVt;S%<_i;$4;)"<;)7;6N;5fλY-);幻> ;p;&Ja=:ө:O;KҮa +:|(:S^:B6+iĩN$ٻ;.::*;"i_;%9r;-<?/, Lk]L`ϫ;3拼:q`ZN-k;Zh绨l;{Z};2кk׻IC[;z»>jnC;λ:pnۻWα:!t zQt*@n;U;2任LtLQ;y^ <<;5v <:ۼIv;Ȼn:R<∻+8<gS;gY;-; ;/|;6q <]:\I.%;•\;c:~$;E K;6;T-(ɻ G9X;wդ;0Vlh9)sFuO.SĘV;< šW;tv;{p:嫥軕ǻ݂;`i;V <P'$<(w!R纋;v;;5sO_%/@/?ǖXh&T;;+л ++91:g5?;Ս:[;ѻ;F:H:xk9;^00D;l;, ;:۬{ +ĺF;bCCa;|n:<8,;:;J܉_C6:Y|fڻzJ{si۾ gn;Em;߁ ;]J:t; 8cͺ'qd2<$BP:a ;f[FUo_;-o0O<8'tﴻO):E0!Cg 7a<:0e.{6o+؅:nc 6;RP!C2<

;IȴT`ﺮ ;;];VI+;>< :f r;T#$;ʟ;9_*Z*N*̋ ;yp<ԤH;ܒ/u);ԥX:@;C:d5,<:lKkz:J6S7%a kРK:ɏ!~V$Z8RNg~b3d`L3΄d çpaj~QcrzZrfYMACuUYդG(lyϱ ZTBG,^yGB)*q}}Kw@c|c9ZCboř3c6KGD0f5(VRVtyV*uJsTdĻM;G;<t;"|躡'л]xP*9íRVb:(7:;@}ߺ;#;毺O޺檻4ϻOZjI;/95ݻ ;/3M;h;*s:ú)3< +λB};%9׋ 9: 7Br;5!~6qP; 97[+;Iӻ{::PjQ/S(9u< ;%ڻ09H<,D+; Ph;xN;B@:yN<"@;^P:5;V9~P9Իqd¹;:M[x;40;@;3lk;;KػAB<;D^: ;O;!y;rS7>m;";ӯN::4;)j;b_W7RWIл Q%<;,v;`,:k*(*ŻM9ӻw:;;Y<3n rC밞Z:L6;69':|j:  ;* rغsҦm;L߻ADچ<кh;󐔻m34;eBe»J:m;Dx;4nǻE];m";+7` F:5޻d;;:Ԑ::I;[ȻS1;\^_ f?y;Ag;wC.k;}&< ;JZ9fx:쯻;;ѪlKa99"Hz;;;u9/\`P${` b;(a;H/:z:0":Mзs;mӻ<ԉ;|< P):tB;8 CHkٻ:Mh;ɻ/ZQAJ ܩjg<ǁYܻ%û;-w_$R6N;$M<<s<7];aby}II";NkzG;:}<B0;2$ *~TRxۺ瀻t<;r ;V;}=q:g>]aha碻kV%,;L{ں>Sn"<T;߻ek={;*'9R~åј;:C"r:K%< )UTb;JERNs/Ȃ׻|/;o#ȃ::Mk t:b㳻$獻{ѻ^>:JջH<$t$p;鰻0:;y,j=fn:]Y;<|S;;< @;jV 7S;̻:;ޝIvjPr:;Q2ӻ:?`#;o<:p™fmϾŻ4<|qy?$;^ +bxڻ :A:R;";80/Q$XU:iZ;D%<& :9:Egi!;>9JO;*a[-N;טPA< ;9 +; ;ךS;]Ui:Q_ZW!{;e;NZ;cTa.;:p9:>i;Tnx.jP )W3ȶ;;(ѻp:|T[;Nps;;غ>;E;Jg0I;@;h;>1u;#elU*<D9 +9ܫ;Pm˶;ո:8?:}߻< o|"XF"< 95l;|}cAȺBSE:z;<M ;Jidխ<us̻ß;\AD!h)o; ԻWD̺&ػo[:T\*ȧe::9;܃7:;5;<[;gfid.;Ds U)j˻ȿA :\n).<".EZۻ}8{Di;l;h A; +;)':x9: :v$ 4t$*<;ѻ!H ;]]:;D;o;7ܹ{v +cFU:F_x;;G9w{˻U;Ȧ@;^ ;؄)<һ _93Ml;l.;+ +;I!w#ҹW::mrV;:;=:/ +un*8d=աʈ;8no̺VL6:h@`:,;C<l;/;-[<':"boo +:<9<D;*;\";ZX;^9k$OT:'<;;T;;I:,G>&=&P W, xWz8n;%Ѻvu:ۣ;=f;5:gh;3ջGaR:%hWq m,;IβT<:<; +?V;G~<) h:i ;+;kY\COq:<|n 3H- lA?;N+׻::֢:x|SVe%;JcI;78(%:Խ:44w;~q;L&<T +;qfdT&;W@<ܚ; f;,ϻN?5:1);B<;D;:{&;G``;9 ::ᕻN;:܁ե!D:Un}sy wp;AK0ֺ*9ބlc:Tv;|2ӻatOh;w <̀;J;=:V[:g9n;2m;;9R*;wY;%5<@ <ٹ<럻9<Ϲ5s;73Pu9}u8F<:u;۵_w:<6͍ӈ캕u$:$ƻ^)M}<98t:":_";S:gBܻ&?9d][$2b:",~&?:b:׹,;}lW#h;FE <><9?]::<;J&J»qH< n#;OC")mA;-ُPDL8ǻ>:C? ԳS6f#˰< O<Ļ<ㅻ2Bλ1.3<1;9A_<(:N;c?'ܻ|:Az:r;pz;Ż;p4N;㻂;Ww.;t*? O@:cQ:so};x;zV;.K6-:V::d5;\9Y޻;;<#Z4L> ;{9#<<ӊøj@ ~9V; :I.;/U*)|;OIv<- +;. ),;:6:2ֺ:!<҉;0;;Q;9fźi-!<29_9zX;;9S;DJ;ٻإ@;^p;C@e; C`ƻQ9Z&;gpܻ2๙:WK:m^X`9ɻs}Kl:z<@Q;,ܙ&UM7;}j;0:hT@;o1PVb̻WD#:;xN9Z;dk:3#; ;\8%< k Wdƻ:;hY;;Ի{0,@p^?2#:ՠW ۻB9L;m;ܶ:eX\w  Իk3:$C:hz;|!p9<l-;ē;P9;;G:;؈IgF;C6T< [;9YM%*k{D; #;&"<>G9x;mȻAㅻ~_rG|S;;%d,$<9nݶn@n]!w=]“3lv» ;gϹΞ;ȟP=C1z&; $;n@*? #;1|k;8҈p:<(bA4<# =jʻ;C< U;i;*8:T;@;кNXCz;#w9H3?;:볎-H;n?ݼ {2; Ccs;+-"n$He:x< + Ź;xyFN;Au [<;; +1;XD;̝<  ;q::ֲ;nYbD^ˊ8n <.ۈĹfgX7;63]л>i޺z/:Q<2bcn;K2;0HDU::a=<1G:y@;˼<@;>&k<¿;W㼺<V;I;\^FyK;2廚k:U~;r;G;06RM ;#Ӻs)< ;wf `qW׺*1;;:=!w!+Vi;;̝9͕<ŻJ%р;jȻW;{/a;jDĺk<;ǔ: ;6\p;l;: +OB1;0X:ջ +6lB2_F:`;#+;b;Lt:ה:ys+9: 玬;@ZԜcd<:B/\(;01;.^Ώ;-};,Aj 9#ҺPʻ#A +?;~2~:47;i<\%I;˥;;wL<' +ٻyp:@G47bLgW;;]bI ls:v:Q +:Y$R<^ջ<$R(;3;59_];Cc];;p\F +ʴY9B<>j;! #>ll<:˪U:}j>`q <a;);:U t;0;|`;/6%n;2*5:3yF*:ky/L`9*٧:a~˻ +.5Ju Z;uA<@$;f;I)K:_MA@ITT;T<y;f`<ݭRż v%<+疶9;֭;q:N9 4<$Գ/{);򚋻\.wI:ڑ +;;7è:HDžỖ}:{e3;lL;BλCP9 7;ɻL <-SO;Ɠ`;uU;]y ;Ɖ7;qn<ӊ\nDE iW= +ytՊ8TW;>gA 1;җݹѶ-;L:*;[ӡb[8(;vлE'F<+Z:.ֺ;[;Y;Oe: :z:Pܻ;S B;"A`!b'M}$/E6UO*9kkG<];::G<ŻW苻~~ +:V;;tc)-/c躪XV;t<;(*ЀỐ +Y;^ ֹЁG<c;󛺘\;VW#<ɷ{;/ó;&;":,3 :;rG;;BQ;ܯԺו#G;I?<@9ϒ:e;y:Ӫ;;*v;;ب/;<5+;;r <,<:Rj(;X`o:3U: ;P>:[6:<Ÿ&z;#k:DInYHw;; ;k؞;1Ǎ|ΧsU;~:x;"WKBI;ܺҴػ@(ݢE;JZ;6\9SI9 rO5Ȼĺ^n;L;U&:7; ;;lx; +ɢ +!<ӕ OcФCeE9Oq; `S;2:;N.;Z[@m7`<;;QOw<:A;N:*<1E^R<P;w+ǻ AHgfO߻ ;;6zl;%=<:%;5ًg;G湃ԻrO7˝;Ձ Sg;.;l:͖;Xđ~9n<غK:ՖH;؅<^;6<*:<ͻE- < O:EXцD:F9:}-ty3 V;Ժӈr;aһ:{;Y));tq96bL)<Һ67$ <le9^}U;ho<~;8U}@;(; $:Z#3c:4;[ҷ- ;;f^^9:";@Q;k;\;*:T%;F̻ۚ:;;dLҍ;;弻2;HHoXA;LV#)RC<_<֌ʵJݻ?;헷9>"d-jJ;(;ۖKֻo9:K!:o7;X;%Ro;_;6OϮX;vlG3^?F'{P Y<>:^ #Bh V;߈Q9rr;X|HFwgºWc%<ʻnS4:3;}( 1;ۏ::V:luA; b:;'\?Ȼ;;R;a!;:Ѻ:Ffû@P:pE\9;8;;[H`;D" g:(A;/Wۺ t<8ߺ7h&[x;;pd`_+*u<Ė<%e P;lo3gj>һpQ;< < \Hi:;^R!<$:<Z; &;Jz; /ƢeY;Ǭ:Dp;1{98;<q:gnѻ,sٻxD<$4Fo$:Q;;/lV;ę(;r#XWub6.%;;L;:!/;S; JI<8:}L[-;/ ;0;Ѐ;yZ3^; r;;$i<ٰ/;x*;v78x8;gh#<ȹ?;I&?[;;g@<5;sd;x;=(Ri;ݧ{<:ܪ;;ӻDȑ;\ "*B 9;J;;bm;J +oYTo; ;WFAb(_@Rq1;Zhb;g ;\4*(^[[<h:;3KY<; nz; #@V:X@=ۻdL:kõ;E{M:?Vzf:)0&V-nKq5Rػ][|8o:J;k;f,*#;S&/<Ĺ;n9ػ;bb;1k,; P|J;;(;@쾥S 1<:;\ָI2ջձ;Z<8YQ:*;.~ԹY2Y;č޻$;h$I;N-;=S<::r:0<ɠ̻Ppձb)g;:kJa<<:<@SN +*~9Ir;s=%M:&F;n;v;P;P7<;5;\T;X;:C&;o: ;Һ3;26:/ y';M@:M;e⿻S;w;Po];m;0Nغ`;c +d;!X[<Ƌ9z?:͵Ά;vwڻ{;IR:B;UmDe@<G;Ц'W;:<9C쥺kP;apZh:iD;!n;<'iia9?y9ڹ;Oe +:O?X:dnF{8ǽ:aŻt +b;&&8;{X$[.ôS<Us>. |[;'< ;"4;(N9\:: :S׻R*l;Jځ;$;#x- <Ր;`F+@Hv>=<;-ULUΒ׼< `<z<>sz:*:o;Ĉ9愻;[(:5:L;%:B;a;ōG<ñ:I:;9:=wxB!F";~MN'Ù;M;e|Gfg;t;yݖ|/g;|oJ;<g<;m 6NaD?;DQ;4HR#g:+/:vo;W%z;Lá;ȃ+I p;;*;::9YMG5~;۸:s&Y:ȻϐJz:NR> <%?3QN} H»pE9/gP;'d;U:/ݺкûS::W[; ; J4A9 x9^O+;YW*J;쏉ZЬy]I; cy;Q;<:@^Q:N;9ZCR;oDS;Ѻ,[!&ϟ;)h +;zڹ;Ѥ3һa<&<󩍺~P FϻV?B۝::H);Dh;d4vh!fr,;<>5Û;U;ػ{ˢ;Q;Ժz: +g;!y;ٺm72ʺ'(꠻uJ(H63MG;I6'0Ġ:\;֐;2;:P; 5 A;0źi ;2Q:4!<ݜhVB.:>h^j;$%<@.u;,:;d<:9#44n:λл;G^@:J];j09:Y?j'ӻ4Sλbi<>; S`h +:);;;* W@:?ջ+?9;-|Aջ N;w <@Kѝ;5:1r;8;$99wa:q q2;h< 8NS;Q;/<-W;u}m:XT;Ux9Ɓ_;G5;7"0~;&컒A$aY̧ںлyT9(,J;-;P98%0aCKo:Wͻ'g&<9@zH;װ=;:L#<턗 9B%] +[6s˧_;L{; +3.):6[gȻ8k/ϻlWHsx;9<%<=+;44ͪGH<[;NHV);q(R:~;+O;};z;Ny~;Oo;vTֺf<;f;l;<㍉P!&h,#XФ;GZ +׻;GMIRA jp:vYۂ7hdw;m.L;vj;jx:6@1S};U푻:$;1:Q;Yr; +(<\.T9S;E!SĻ So޳;;'KW;<9;z-FK!\ +T/ rj<5:WTT$bP';oL<3%,y9x <>.<Ϲ:/#F>ÌrZϺNQ_R< +Hź󳘺1:@m;.?; M;`:wU:D;-U;;zgP乞j"Aʎ2;';TlV;o9; @[:@h 6qk;Vc;A?7{6;8Œٻ5imkx:i׾:'CNgх;iGW$Q9d:P:q)fԈ:FȻW;ջ;HK;Eq;,];3uǹ蓻;;&<;⟻ջcZ+2UyZN;S8$l;A?:j=j o$v;^1$rŻvl~!qXٮ;FFP;Er7u;e1_;I ;Ef7к ;y%:N;o;rE@;kt:%;hǝ;:;,_f;*g KKN»b];:9>:D;eX-5;m:0F60;b;h;6ڻh;,:Ne;:.㺓M:jI)\:cc:2; 钻BsPԺGFH;m;},Ie:֭;YL<ZLBۻ;8;}K컲Kĺ h:}f: :;0^4آ:m?;iX:(%ֻn%E%;W^U?ԻѻV-o,:$f;D;U9ûbv:';Ho;,;c;/<5 ;qzYn;,a+mP(9z;-b,RVL8;:v8;uyP<04;J'.wȢ<ܣ;ߥ;:J䆡)| e;ƳyvP;3:I< +;NH;ܡg:⻋5Ø;ځ:n;u;;o:ʻ4+e;x7;@t:û滺 GL <=X*Y<=j:.|:A"y5/yeۚ8u;/;Lg;5);TrK:5_& +:W;a4:1H;خͻ;[m"TX]R;c/N_;TF:r;_Ip һ;9'f8%gfio>;xֻhHS,;t;ra;:ΖUEcY}i:@): :1;ЗW;':L;#;%9t;\:ծlػWRO;~;@ M;?7W<~q;}6;|r ;P;d xV:2߻޹M?9_;_wԻE;:{y% +غ=1/U8A&;YP9?Y:T'i:=m:d#/ηZ;.~ %x::'qAi; +:|7?;[\ ?#c ^; ⻳<_:g;̱;a^;ƹ;7' :dk};?ICRfVNʻ ++1%;U9䠺oԡ#<|FηD;>1\" B֥I;6ulݛIл5;h:/YfAiv;7๰K;Jn$8Ǻ8dI8 ;QM;N:T:^~;\ ;^|d&v; <\:,ɹX;M:л9DkmP,H:S7:K.:\<;^G_:ޕ;b +;7"=8A; <%C:CL; :ڳp:=:1fgCp;%7<;G; +V5;Ϣ1G:D9D;j4; +Gh-U;<:C;Rr>(-:{/4T:73;e Gvu|b;u:~D-G|]8ava?8;b!Z;؊Cj";ҭ#:jW*|vE;.:;t7]:ҍʭ;hY;;A:rp: :yLM/ƻ-:`lʀ,h\^bH; )ͻ$D:΄h-4YXqD95%q=W$F,O:Lo:K +:;02,:1;Z ;( <5_]?Coi㗻 MdD S/ HCh+Ż5; z_~λU;;;=;w»?;;)Z;~xF/!\;[:W`;_/< <|;$_7 <2;.;Sa;O|7C;Yͻ-p<, /;PNQT'<)c[;`%:b+;ӄ!<x̻Dμ+,F;mx S5iۺ9P^\;;&(:vXyX3 :!)h.4<:;Z<%b;&Um9.b>;{%;uCg Z=Q;G:;.DNﻈ M ;Wܻ<2%ڄ;^<%;6<-0;9Ʈǎ K;1Y^:Uûƶ`<+ڮ;bvǻW;vD_;o%<;3-; +=:2ہ"Ԇx!O9%綻0 B:drѸ; "<98 5m;۷LG/D:MkSZ;;\$<]kW<4ٻ4'<]:Wv,9O~<ۂwC"/% 3;4;^}p;u9;> N6ze;[9< q H<1:/~; l8)ֻ3S; +{}:Ǻ&aXkJ;9;(@;5;d6:J=;fN; 8Z;S5:8»<<;k;u6<=";;@?;D;;[tZb +:wHJ=});V/<1,::;ƺM<$P;;6;k:91dum:hY;;\0$a8;X; <ǔ]:*:MU: j} + Rcפ:h4:"XE.T;@UK;bp]u 6ލ;ܻTٕ; %:?/l:b9eG<8pc%<!~ѻ:6z7҇;v; #ܺƻ% ;Ge+:<)l +;ÖHVu< +O ƻdd;a;gֻf <.:DZ@_:::z/;;ln;:س2O_(敻o_g# 2;Mn:A6 76Gh::b\f6:;À7%;X_p4-7i=Kj<9~;qX;ĻQ;߄;s:`< H﻽Yt SeI$<-<<^b;(9=3;=1;E4Fw::dq:A;F)9 :5+;w;뀻=;pf:SIq;?_ +;gq;:xֻh;^;;%:~i,eRt,O)ԓ;w<46:i:;)zŻx;x; qDg<ٻo=鑻L49;s;'tɷ;<);Ȟ;g;;Ǻ;޻H$%޻kĻZ?@mN̻{.9;):'vWڻil;x ?502;LW<P;+R:*H(E)a /:˻ +4:;;w{;R':r󻾶-;Gm'^;;:I?9DWRT<ػ{;Rܻ79;];AC;8:ၻI=+|t;A:(`M;a䤹 R:K%:+ջ7l;OM|{3#iM<<26;y & +;KW;H +8~;:<}Y-"<ջほ i^S:A<綻o]r`Gr<ɻʏ;lnUs;5i;,a8w*T[:M Ϋ?I5Mê;;uB k:cU7F42hϻ$;bJ;u$3H;M;9];Y&:b\̚[9;,D<K';hIOK;~g9E: B <^2?;q +I) i:&D*#9BS-;2λMؠ.E@ŻlZ9{;J?eYʺeY0:<8;^;FO*< :ZB;q:SĻem;1:'; +< ;:;[7<"W$+:ˀ;5!;: 94|qOлZG0w;ͺ:kꐺ[l;;0;;$| fr/l;,;۩ͻ:|-<;ۃ˺N2;-F91}9Lz;B]jK;9UH?&'E\;\jrg:W;ݿkj;sٻaz;.8x;);;dL9>;|;oPZ;8";$;KںA:;4;;,፻eʻL;"S( +99 +<(-;)YP;It:Ӈ;,+-; +;4&R"+mC<<8g WV<6_N;%;ֻ/9B,,<4t:^Tu<@ +;;Y:3Qsg&dt~3^j;S<~;˦@;Kj\gKpR;.XUӌ:w;Q1;Dy;>_;f;+;9&:tQX%:6ro;OB?m:5K;F]:):O&Zл;=kx9 ;m;Lp;'кپƮwv,i;&V;Unlۻ`#!ރ;91w;?JKx!EZ + T;'Q0Jv5$.hl?<_; +-;9e<_FUjxh +8ۻݻ$;qwT[4;ԷH;~9qH;g; ];Ȼ;|q:{:)@4@(<~17';C,&[ `npPx;sgŦ;'O; ]f;L;.][n+z; ?;(M;m;;X\8@D;&K:9wa;!M;nL;7"l;?:<;fH;|ٮ<^;j&<$Z:vGj;;`8;<;G󹻏]%\ʃ<@;;- V:p;m@Z;-s,|:A ;so;@'Z]~:eٻLw;8(#;Ŝ;B%*;; ϻ3Ӎb(E8 v;O;{*;o;߳Z;On:̲p;:;:IaId +:F 8 NS:)dxٺ$VX;d;;TD +b;i8zd9#TjJںں8L*`m;ým!ź;`]*!9:_50@H^;+; ;:7B;z/>@Ō;0xH)va;,5;K;?*;+>;샻h9c<:%<0jI;i';+cJGK;vq:U;~f.9'<#;쾘n;DfQ`nQM:VmX; |}@ :A1; B; ,)E{;v<~^G <&;DU9r7;C<܃8<:(딻$<':e:^C99*;ۻˊ/𖼔:{29{hsغPT; _ycx;8%ûc;;+;/<7:wU;#q3;B<dz9M%;'6+<;Sckv'<\3:;[;t; + ;;̀;:ꚻ;:;tfN;<)>;<Hɻ}IlJ4;R[cK ;,G!:;69d;e ڨS ػ*Obq$2N:4Q<v$;1M<}eߺ +컇!Rk1;nF4@:A_;)1&?(;:h,yE:q<h 3.{"9;z>Z;%;G:ﺸz2;ûU_<푠<~4KiF;;aa4P:;;"<I;&آ;hNH U;W<); l1p[p]:4;4κ{J<1ϼ:*׻HbtD<*Uzy;ܗ;^;k-<8K;jm:;;:bz= pm~[~;s0z2rio%;wл1: s:ɾ=t:F;Gۻ9E6W<޹JdA;=9S$;Z8t.n?[,:9; <_ɺ@K](T;<.;$aL]#;=NN,`oqaF֊M_f;ܸ@Yݺşݻq 3P:MM";h9b:>:Gdj.ɻƆ;ʩ;b<:|<:A6;Rp;: +;O;qq$zSi9;sɺ:z*: l;=Wx;+f+:,2;6ݻ;nn;<Ρ9RP:aNߺ"9>:'G;l;h!8p;Z2<|; $:(0q< ~ +C'CQxQ;8}<#;":nt9:O;"kLG`<;E*9<vJ m$;TӸ;柼9xe;)rƜ˻oiee;8=V)ʻ:B:SI;uSN;~N :vM<*8;NkX:XPJ:'ɻO:+V; <2;O;:<3к֓J{zSM;KջEu;8<hjcպ Cy;w4=E:DAj:f ;O;,# :Xy +5у/; -лP[BtOL;_<;3i:H:iA3 {&hA1U;;sIDFؾ'<~<[})h;O&;L};ʺ;2;7;w;_z;.<ғ;4 0<g¹wsE,7fh ;?D<۸M;fŌ;\.< ZU;;2:@L7;ofJ@;1:q;'0f;< ;6ATA<#R;<;BQjO;昻xvtZƻ30b<s:( < ;;4c%;['0 I;AA泺F:\1;挡;#Qk;U;وxeZ$I; ;f;3&<欂𯯺G:<Vo<~;h;.4<}<([;J;Z[3޹7::Zкߕܑ +:s]M;M;`!Dh;|̺rJ#ߤ;@Z;99h<);<ǹə< : +oV#;4\;ȺA;`:e:ǹ;# ;K۫;;bw;C;['rnasͻH:J;;(Ul:;*N;z^;;/Xn:;]V,-;N;"6I=8:4y4w;e9`K-9@4,;)`G˹]F+軱;+Ϸ$ T1׭;+q*$;j]49;;S: <ȻT:v{ Ň;UQ<=:jsF; +;C߻R:;H4<q~:`>:u&&⺷dfn@򀷓{:;U;:3N:Q; +Z; `;λ] Ȥ;; : 4 +6;:V;݄99y;4Y;]Ļ%;:qf'y̺3 ,:;{e߻y-LX;y\wkϺe|Uh@:w:[ػ;I;˦->a컄}ͻ: ]5q;)B(UK;J(;;h!:zպ;ԲsQ;/y;ϵW^-u`z:\;5;h:;`5Zga xt:QD;h;?^'A";蘻ȌT<*|;kC"%p}׍:E˺ +aq:Oy?ip׌;>9;b瓻ҵ|;ӡ GGp:Z;E&*4Kp9Ēжh6̻uet:+;׷:Ao^\:;;܋X;#ֳ[ <&;]p7:E[;P;@SW*<<8֞Rw%:agc;LT9;1o6;sD;*ON;m<;:c;9W(x!:iκG;7;::Q3PĻ:H69S9;8 :;"8 $s;MFV'<7]:m9giعrb:^98;X.*gCABr:I<9$9F㷤9!k;/;Az<:4S;>5;kT:;ϤI;.[l:'G庯ֺ_;֏C:Nhd;E;#t:;\*ƒ;t4<O%;b::s-< +x <a!Zƺ<;y-<,.勻:{+y"g*.H;ǀg2W;`úT:J)\0<::J.<%nAMNBJv;sU/N;Ő@ٻMЈ*])LA;edI<%U8Т:>߷< ʯċFMK\~y-n;)^9ݘһخ6'1҆;W8`Xsp$;;B&;U<ƞDfc+;h9.m(@ ::`wr;y_y ;q82;G;5X};ζ:];-4\r ƻ<麋ciDy9:;;I39:.R;m<):P;iZ4y:/%FGUwGcā:Eo>d ww=1:/:7|9eF_,t;PQ҂5;Һ;sm;ye9!ٻR'G; :F);f:o1.;S;K2*;)[iO;;IuB-W;(:ХЏ ;r:V,;1+/ ;p:lVʠM:W+;t; ;);Pz95/hQ;;:;M;;#=:U:V6:,;J<,:K;K]^q;Ž;@z;s~Ӻr\N^[Q.ݫ1}fE ߺ?y:kJ:;v9;>=',`e.j_1<`;฻Sg1P̺Tٻ<>09:K7;y{t:ԝ3,z8_>ٳ5;*;};`L(<&S:?;4AER;ՈOX;m4Ի$B:PJ:eC'N;%Kg" ;πP@><{U;cͼ;;٥|;㺐6X;u̜;@!tG; DCwt;Pef:9x<]1ĺ,;,;L6H<< b;:o<4;; +< V:ɻp;bH/:h';~ԹoǏ 0;*;'P;8{o|HZ~s:&3;:& ;0Ց<޻}=:#.;Y";{kỳ0uX8;"セz;܎g@JR&:;ZVT;72L*%7:uZ;6;L`O;滂`r[=:4-;<>\r;;Ȯ4Ne]8;jʼ_a9u<;p/:;se;voE<*;psy<5rP%2;O{F;p<7k9;= &.b)a*R;qL;};BfÄ<9 +U(;a \DQ;;c: +5𻋉պ{#te97ͺr:ާ+5_;5ֹ&; ^_9-»?>!4H' +;bN,2;/hXѹ:d; ;u;2<:,; ;:;MC]z) +@"R;F:>Š;;yl;)]˛w[ƻܻ<,w;';i5;7~;?_y;='<sU;Am,;c;E}%K;dJ=}:fe-`<;D9G^DS9;o:]5My&›:*A\;]8,W;U: +箻9~:A:;]d;;\; ;ju:.E]Ii9';~:i +o;=m;6=J;u;S **lT;e\D:;bPCTF0;;:;ջh,;u"}; 3L14;Qֈcߢߡ;3";L;@;r9^_;x&%芺ݫ+:"7;Z#ܼZ!m%S}L?;;ON%;? ʻFršd858C<:ѻ)> -;=8^:gX:-:׹`^.;+V$;ӻ(;W":<'3ͺ~4ÛO%:`}ϻ0NW;S;<X><3T;s_4TպM❂9%UB4;,n(<;6G!/:3`t4V^;hYm[һ,;1.9:bT;>dqX;\Z~;=6,>ջܺs<Ϲx<&延3NP;< +T;m;aZm:y.]h^.{: %Hb0ٞ;CE;+89F;Ra5;;|Y!;e@<Ù<:;승~W+$;eGl;8o{: ՚:K+`=<@ 7kպ ;̦ +S;9:V<;{;%<;{@ѻ;i;Ċ58*z޻.R].1C'j ; ;Rp;\V;"':,V*)Y +_3_9kT;@yc;ɺJM;AB;F/;$:컪eva +:;"?:N ;ϻ;9V3ڻT";,);cc;wf;t;y;|!oPrٿ ;Wɍ:oA]Jm;ÄFW|(; :9(Ⱥ^mػ !D;*;TeR66PG ;`T;&rF:};]Q:\::#;902:;9/z <8ܺ̃#:uQE/;Ԥ :&;HA:qKo~9ʺ;ie7<7w:z;:_Kܻ@O0:F6uq8;[;^[<^6:U.;$;,4u3';[仧0:*:sUHJsFBd;b ni~:V߹7:V8<%;q;W;;`;4C(:g;<=#ֻp+§M; ?<8۫[<٪l*.Ի;:sM$:W<;r;;Dx;W9:? 8:;HŦ;ǻx;o;-;^;G>;I|; ;%<Mc;5˺u(ݺaH ;Ewҋ894;ߪi; 7;\09\ @Q޻$:쨒ϛ ך;;I}Q;]!eW;X;W# +T6:;;u;ྺzL޺i9Y;':9zK@VR5hƎr +:J;Rz5;<4B@;;8H;pO;vͻBH5 ka%<屻Q<;̷;l~fqZ2;ˆ}C:+ˡ6;;8 v;LͿ;r^!:eJSy-k9;H?:L:;.>˻Hy9 9}Vʫ֎F085:9v;Ѻ#+;;; M@:&;$S ;>a<2;R99:k$:-'ٞ:ɺpi-Ӈ;ƻy;h;ZA:C&@;3 +7o| +ǝ9GE񂑼)ľ9g<$:[׺#Z;lvz-:; *;"<89U;O8:L:Q<'~ߺg9b3o3F[t0ջO<~{<'(;ڒ HnLa;E4ͺ): /; + +:;s-*<ㆺ;;;Ow;_N:ƻy8";im;/E!;gt%;yE/;t'9PDro:9?m,ûTYM:ZG:;DY:Wok<GÔ +9 '; ;'_%;mRRmܻ5 ;!:ח:/-8Bs ;.s$< +лúz;>xYź:ӢU:R::<;ֻxg4;/tS9%Y{D; K˥?9$2 +<;-;32;&<}];,˻2W;jL<|Qh;jf}ES;<_028ݺ'Ժ)/;*dD:9;Zq};2;3%:h;;6 ;LP;I;BYN2;;:hפh;DdK:A1m A<bJ}Mb?qqUR;; 1๑vyjcd8@‹:7`e2<&[I$9e׻;Q4Lu;Ϩ:kػrA:0;O$9:@Z<ō;2:Qd5<8S;0.l;{nH1;`*#[;9ΡẖB;7TKP;@̻!<8ϔ:1x1ջ*#m;;-T;]<y? ;)N:m@;7M9WU ,)3B +hֻ=v(;S:;J6ӻ\ӻ:O<ev:l:{;9;z;;M'D:6];ʂ<;6;;Q;༺;6TQf;r:H˻'%Fr/<.%;-2fպhOrL+ < cwj;;;;2;>'; +6<PD;\1#9|~׻`'Q;<jS f<}N)]uz|!l~;*d*~a+9 '; +ZŅ;xk[v;E;%o;<)+<ƺ2;1KWu@^8) p˻CǏ:a:zE9 :N;ΎP:ۻ;o0]; +;;6S仼Va]:9^;ai<9=ܺ]$xۻ:X%3^S;<+;Vϻ;;9$!ǻ»<|;'t> <݀9$0;Dv#"@;ÿ;Tl;9gf;d ׺躀j);=@<N<dq:ѶoZ9v;U*h:. s<:o[u3𵻢:0:*Ļ79M9 ֻ)1<;4dn +9<#:#;ʍ;k<";o:!=:6\lA;ň"1<Û:(ؖĻ<Bf;K:!?TNx\6ױy-WHD򈻒=;#(6;6 +;-\Z:.(8Q:v3N&;1I;.;-E9Z?0Gm;а;%<@~0UP;0;٤o9\4Q;%;~G ;{A3C:[yR;&#;;`0@o;;p`:m3;ќ`;Am; B<|Kw;>; ;r;Ά;;+ۻ7$<( BO̾x;qh7;+:\:{oW:]Żn;ƒ$IߩNo;<F:;[ + +<(:&;;cB: ;*,';/%;&л;;ܡ:|.<LT +]RXl<N::B +6;L; :dVMBs;f9<4M[,< +;"0kH};ɗ1߹fi[6:/"L'n;\h;:x12t;HSJ7KAF")O:ہ~IJPO8n;_:s;?zrAjH]m:+ m;J;#:;I;Qh:;rd޺.k:ף%: ƻ89ʻ1;M𪻐 ˩&;RhǻQF= ;$ +<@&xFNB5<nLDߺ{:>;7;Lg~;B:J&;,@M:Pyy+]D5ʺ9tn >;;V;|4;5 K;pY=8:#:8<};g24;6;үr;8;Pw^:Ļϟ:=:~p;%Z/;$k :;r~qM<0;]?|; Ļ>b;kw;w;;S;釭(H;]6ͷ<2>}%һ!bUKU~;)»{Ԗ;:+5/<<4;ԂW;ҩ:% Իam; ;PyOAo +:;{W< 77۲:\; ɤ7ɺ6J;;l;;%:!:3޷/ ;;'8X;(B)Eлh;c;:F<̖;;HD$<^;9Q1;(: +{;ε5;:»]i";A%<;뗿;:s8;&;9;DH ;:;:~n;U:=;z;E;X;; "wȈ;‰Ϻa.= :/s;0ͻf;`;.(rC6;ۚ;'84;;/֖;@ºh;-_<| SRµG~9Hx;m;2e =;?};&ƻp 9;l<#ƻA0;TVʺj9r:?»#!SO;!!޺ +wKIúS ɿ;"Ƽ;o)(;D;rV@fh<";m;E;ihI/4;C_;Zj!7X2];3B2;" +:P)(<&<~/<;5P;M7ֻ1jC;eYDM;;d d<;=^;.lI?;V;C_V<}û +Gܻa坻s:;V;:` ;:xA;OO y:#;i +Ⱥ D <[g;֞ǻu;{9:)0;fk;mlI9g:K;<;Q9<"F ;>M@ȸ Ics;؛vXd;ƃ{;!&<0ٺ,;G&;;;8;$K;397ֺ@<2hUZ]9R:UD<Йk-:Ļ̵iAۻp< :54)~8@:f;u;)K2g۹>;M1R9c.z;0:<;:α7xՃlf+EBiO;i;[պ :];gh$;%;-"薂l85;t;-GFUb6d:Ka9';;%p4:e:hI;б:'M;.I<\#J ;??x;{nY=c!$<9\;j̹9 :oz׺R" +[b]IƆ;1-;6@G.;Z +<ʁi;}%m;I P$;v;>N;HI;,5K;;:L-#bPGA:!߻';*;aNJ;/; :!; <"';)(7r!;;d~O3E.;/)'uwϿ15;$ P;A|к;:<׍ud";׻%ʻt +;H\:;Mu%<7;aQ;jET<#K;ulM[:%;BV:Zh:9Gz:\<%T;%;;`'^3>AO:[û! <)ջ_80(˒]#K:saj;7|&i;i#3;d:6N;3<О;(<=a;6 +<;l`[j8L5,-OK;U0;;܊!;ZN8;4Xc-<-%hfX<*;t;~-ͺкZ;{;D;8_CIG벻)xW:o9vU.鳻ijpл=y0jh<0;[λif̼1ҩ7OGD奇;';fiSiS::O;4:h9Nh;67:;r]T9h =;3; :%:Lq,]&:[J Ż":x#;b;`":(-u.h;`SR:EԺ޻:v/=Z +j;{2:5h;m|;Wc; ;+:L[<;dHy;;:]>:g;E;4+; +>X:Ļ09:F`<ջ9~P;46:?]W<;p;:ROJr+<»m z;7ʻ;;i;Tλ~ꖻ w%;7}$Y:i:}j|c@L2ǻn&-:A:O» ί ݻʻ}1^ ;L;gNmڴ:N;7<" ;~ޠ:]mSï?s;%=:6;=< ;sW;G8Y9:0@ĻaI{1;:q: +:;!::ndwλtzn\;x:F:;d:;<\)Yto;;G(;):;-rK;(q!;5; ;2:2ǻfcE<| P;:F:r✬E͹;ϑ?;=<8ꮺЮcZ$jUlzU8/ʻ3T;?<+J;[9!;m?;;!WF<^JŻh͇;d;Q : ;^G +;2 <ٙ2<:CY;ػ;{Ļ ;<;y|ݿFºm,;X+|zS<"<';0;I'c^,c;P;au䑻t:; >9_ ?*;DУƄ);+;»s;] ;91lǺM'w׻4MQ97ƻ݂Ȣ;lJ;X˺Z9f詻T58jx1ڻK;T}*yolS:W (绔b;ÌJW; 80xVlb~:/e^{;{ºMi5W̟:jչ:Zt޻c;%»6`:hG< Bx Z<Դ; ;3:m*;b;>">;E97;e;>.  9iܷs)236B;D\a8 <}>Һߵ:p7 1;HA;0; +?Q<:6=˻P T:@;Ȼ;!];,CU:;;'y8-99+;% ֈΝguʵq;3!V$"O:I :=ݻɞڷ;;*<뇱:lzȻ#0m:\<;3;ٚһx; ~:A;:Ω?P:4C;V;1;Q48'L+pi\ۺKĻ^:0:#KDH -d;09mջ:Jb t;Y:(VF;{*$;i7NՖf3<v:1ێHQEԻ]^g;?C6J;=;§-kE;v;:%;m{F5ǻ:8sL +?!y09l:,Zc : v;͘:;ݦ:(:a㬺PX;>9&i:_:ۻo:Eջ%d:P +>sһbVvSlV:::biO:T躝;@(ƻ8;xϹsE;hM! c;NYi~bplC.;~`p:P;F {3RY;p -+Wv)кSa : h;ʋJ:%;h !غzԦpĺ˜;;!;o'<<:V<`f:COr9) (;ϻ6;}U@ɀ;R:텻;hXE; ;/> _`;~ק-z;spi#?:1<V: {#]%/97 ;ػ'L/;8L;l;̍)<7 K^;:OYL;;n*';SA%m9π;(;{:09;ûkĻ +%;(P)ґ1Ff;-"/:-;J; t3Z";3;%IҿAn;=ͻ*;_i:G%.A*>-H89b=:b,(9=`;yB<ǻˍ;<#*f< ; DW~);𬻛s-`;;T N;i<Ւ2A=;1 :]瀻ٯă;]aog:o9i9 +;"8;7L:6gUVV;^(:9 i;;mJ*<Њ;sKx;ȺA:b!1Է:;,hܻM-:H;6!/;:~;PH9#;Ǥ*;vƻ;,I+;`ۻ4`q;`:;T-;{;B}⪻';<;Wv̖=8~y|_;E;.)@'$:1x;';:;{';aׯESd$:g:Ր.2t;& #;ńK:Fc!;': +z `U8uՔH׻׺;eDN;`;6&F<)8::;d㋻ ?;:F;W;9/R;[.: w9:8Զl9 (ٳHz-1:QPM;>Ru:k;9;9M +ydh;; ~FM>;̳%;'x^;gܸ;ݻ;%<&;;:O Z;Aa:5黲E81_:@\3$ܹuO;'^&c;;}:FZ +:IO;떻#NFxM +:d;nƻ~(cw ƪ/R^::V"< +ɇ!;Nƻ[xS ;oԁ;зͻ :#:}:sm;8ޮZXR;e:ш;;mrBX֏*`=Pеغ۹xkYx_zopϣvJSgKhkcYdU;XD|Q ;2;%;Ɗ: oϻ^1:$;>E߻;X;4:e@;x: p_;yDd@KC;DUQ;: |:J.:$; ;9g5(Q 1C,~;ے:=#-z4.'9j;u;1 ++%:ߍ G;0^mVD;ΨZ%<*¹x ?4]˕;<;y"{X׹ :8< qy; ti;3zg+:;敻=NJJ.׺8<-!;E;Ѻ;ǻ*3;,V;#;!k;=$:;-:~Ż<}-:"f;^C ; 9;Ǫ;Fd<,;2};n3;h;ϩӺwB* ;8F;'M;/Z)暙; + ;i :a34M;`:DQaMO7;];"[ǭYI?LE4>--;;H ^3;?+b~ Vpk%v,Q:Ж;˞;kx:';;];!7Z;bq:9;C<ɻsַ;#ӻ6;=^;tS;ւ <X׻I&͝NhF +>Kv< 9F<ġ9vɻ)>1f]^F:2pT +ކ'<庰;{5Q];$K:;Fǻ |(;<&< Ն>![# :/);H"<]H#/&El;;㻞 /.ֻ ;;s:;1:: Z;~i/;DWc!#;:]b< nd.P;}&;m9j;ב;f;h~332*Nz<P;<:uȻ:jL;s9лMݟ;qPq2Ժ#b|.;$;;Cx\:ԕTd7:ؔTY;(ۃ96݁ ;[`aO;{ +#<ӪlcN;セM삻>>;[ٹ1J:];D9;= ;;Q2M;K;;[ra79F<:;˗ҙڻalRaiS(0i9G <ٮؖ?;hi9:_w*:-\:L;υ;cE:H:{:IO2:i;K;vc~'Q:hZ:d>;:0:O;6T,0::;@˺u{;ﭔ9=J%k:zgq|<%;U:f;;Zo!{B $ +;1 +I:;ER:eQaҹH;.:^qŹ<˴ 8r;+;;_aSCuQ l9 ;mջ^<#H'w(};5`9s;9HA\Xg;N&09O9ˎ;<<999O)ֻ;Z;NJk(;32H,5ջk:tg0Y;y;Q9 X'\k:wh;qҺ#sp:;@<6lMw世P%C<)b<˻{":;DW3k;t'; o:;H;(<׻/;%ЕCu9բӻ ; ;EgS J:(i#r:+yj;L;vQ};MD;Hɰ[n3;QRӓ <<_;쪺|":+K̻޻19N9t;gJLow;I<7. B|P;(T[;4;<'_;h;5:+2n;h @:Y;+;;Lq:"\ ;,.xl jǻh~0I9:<|;Ed<{-LTg;NJ;)}};:#9 :!8I;d:-3;Ý~;Y;3 +<9빻ֻ#. kӸ):3 ;T;㲒O"u:o&gwԻ޻(- )=㛺;ټ:ZH 乪D亘Uf\[/:6<e;Ęh;6<);KE2Z4>2<˽;tT;i"3v[l);S=:dH3:;J/:& :.E5:F ;+9 +<2%}B<{ɵ"`i!w),;:|m;\\к7{kⴻeC;-; +"; ^lܷ;{û [0wq:h<;RaI/b;!Aѻ,Y㤻5S;f:x7;Kֻ$g;m.Ѹ;`8p񂼨W < +Q;. M +ú IsdI9o[W5;F76;ǺP;T/pۺs#<݀;%˺;&; ;`A9ɥ;軬G̻rb;#:2gl#<:ÝL:Lu;] ,L): :rn$L#ཻN4@B;_l;`4H8?6t9r3 ջZ ͕]zl9 Pֈ:Z";:I;>;;VbC];l6;cDsq÷8D/;ZɌt;;C+ڻB9ږ;lrd&L h,0<:'}):ͺ;S,{ìgݸ].; ;32:e80):;\꼻¥y~㦺Ỳw1+; @yj;#⨻&;h;ov̻ %;BL<&(:vS~:):ڐ|9˹҆W~ʭ;ez׻\8adUe$"S-E;U|fZMۧ!;b0r;/xyA,:d<);z0xذn<; ܋&#YH(;X޺#Ё <|;4a +:0y ;`o]+<ʻ <~;<"P%翺 >7:m(ɺ9 +;j"Osk;Zm;{7D<;Z9pWn;|{38;9Pγ:--ػKJ;o <9kyc:ș\廜w7ܻ>^<m:׀;؀%<0P;V=-$ܔ6KT^3g$G<(:dŴ3:;ር}r;@^cD+mE}C<> 9֗; ;;A=':/Ļr:AA:>O:@;r;$;r9= A !;sO;R;KO<߫j;X!C!3*[;dһA82;<ҹ;xr;dM-8:ǧ_ u27R:`1;ej3;暼:M;6?;̕9"2;Ⱥ<_y<^ ;B:< ;G ;qO:N?λHk;Hx@yn Q3/:m>C9ʻE r<][.V6glO9Uh};2v:V:|U<\f}:zQ;);2(;`;x9G89Dť;5;;#,ջ;Ppѻn0ٿ>;qw;V%W4к};"78d;G:;Cݻ_UD7: 3/F;Ǭh +;,~`~S< %U;Lt;`F[ +:;Իs@s\Ѻr@U,cg2<УOy;.:;:_,O:GpG;"C<%(ݓ7x;@SR +NM&;K; lCș;Qm;5Ru6;{6D;>B3};Ә;"B:| [_<ɴvK;pꌽ:);$:q;)<ٻٰ;ǙRkV;䕻Ժ: ?<^p :GH9z;b+֤̻ 5M;I;tR&Ae:;+<78@`t;̻Ī;G;ʹ9d;Fɻ0< N;;Qb;d0;l;dG(t&A}ʶ)5e$Wl$;#һˆ;N{ ZQך1@&hJn<6<:<Q;2,;_;@ ;F"<Ⱥ0 +na=;ߩfZu&ڇ:w:ݟtла; ;A;;웻= <6;<9<;f^/oU:J-;nY;m<ϑ(< y :lՄ9?:;%q+mֺ$ׅv;y;:?;O`;!6;Ŧ& ޺5O亶;-n:?G.:Ϲg;_]Y; -s 9~:xDn*5;R;D!7+CR;<<:YxDݤ;;Quc7;^ɺpD[Ļ ;#3 +)'4G}ŹEL;;Y<";EN; ;ZZ= Kk߽<{%pu.Rz;ւ:z;,;};bɻʳ.Id;[$%YWD!3:u):9 1;:mO<=*<=/:2 +8;gb0P 9; +4w; ;; +&"9:7;;:;Ns;v <%;`b;,}<5' +%<< l0;亐 }ހ;:kC:%~*4ʻ:9~);yQ [k~ƨ +sA;l +ɻ«K9;9ٻ@l?o?A; ;O;"ź;(^;?_mK<:b;:6Z;켪,;E<<[y<[16EܻkU+:i8|r&:}e:z;dZ:G";D|%s:՚>;u ):Z +T5>h;,Ԣ /={ӻ̆9Ycл+1';?OTH k̾/9l;!9X9.;p6ͻ;ݻ|:zpg'ûO(N뼼!L: 三<@4F9ƺF?;b;#;B$Q~s:.͍0;z#o<*<p#;/p;>yom:<~:;y;r3k<$<9g;ֻn:29Ro+!Y1[(0;j9ꒀI;K/;zy;=:t0<cj;8D@D ZI; ɺ;l`;+׃;];Ȼ T$F*EտTR_KA;"F 1;:Ai; jK<w:2 '/*ŝ0t;> $5R:.KqRǻji8:Ż6:; wyt;sn<;,W;;~5D}><!4?@X4g_h:MFj <:;:혻xҶ'7W%/x`;ʂ:?y;?<^ܺȃ#Άuټ¤;ˑ`;;F:*_);?;|:|D{;F;f;v )Ļu<;P::p<;]T:; : ]ʮ 6f;4a}:<_8 fֻް_6;LX:(j:J5]]4.;"Z<,;T8avtغJM;S%;hûo':E&;Fњ-wL;; Ni 3:;x>\bໄF;);iD.ȑ7l߹;;3; ˻<O9'JY9GW%(L ׻{9)ڹ 7׻#* +{:< -;;;yGX*E <2,;;;υ; TٻTc9;dsn4;8̺E?<,w̞;Y:Dʻ~FB5=뼻-u{.pG<&:<;458: )8Qq$?;h;!Z.;D <;fr:X%mC;jZ;ϹԻ;1|Z;~J;:%< +F:4| < ;};de;Oۻ;қSA' [;sAE4vi$,9Z;r˻-ګō<6zj;Nr:`7;M9`;;;&o;: `"<1":EͻW;@ag74 L:c˰5}nh/;t~;ė9*;+P;Q;̞I;JIR +<Һ֚;",;n;;"̻rz;(X<+m}9Lw;-<!XԻU,|9ڻeFIøw;0݃ϻ;Ȏe]DRLV8;UHJA\;$<}՟;R<;2(ɻ;:oU;CҒ;;Dl7Nn1;.y: 8Gc;;5yf*TN@<2^:p;@ +:άӮ[:d1MsOV:;Ae;f'<;^)]oP 2; @/G:l&;;LͻY89,;Ӻ:* gԕ{:/ҫS; ^;:;o;ő/;V2 ;<9WRg6™.~X;S?|:'p<|0Mu;<;:S*x~Ժǝ99mCw7Ն;;GJZl};=E!9M;N)k;8a[ <~_;ɻOK!:t6R<*n: : ^;‘ʻ1fx[;O9Y:pŪ:<;Љ&y;> ;;F^;b:<;<ѱ:9`O;[;㌻WA5x{;y3`;:#BB; k; :(2<˔: y;T8:;lA;Oiϻ ݋;QLk4Bg@iL;,\:;9{,v!H; ;e=@纖Y {;ė4G;-Y;Bf:<:م;<;;VҺ.f;O;Cֱspd;$j%<{Ӭޮݺ\$g9p <\;bn(;`0<"B;68#/"۳: ;:+;J:A9;sy9Epu;-:5;+C1w;39?M:eI;b4r;)j,<;m;a;5:4:ķ~z;,<&|a:K-:\;>ӹB: ;\EҺ%XFV;7<19U097Cx;;rM/My2;9;q;!2tA +rp;\;&;c:y:IM:2<;";9<; +;:ٺ;#:C;Ļ-W:&[帷\::W8+>^$;HLt:!x;=Ν:i; ;(;䪗:_; 2fy绂B#oc19:r:Tһϫ:<(Ls`;i;|:f׺%;U"LI9)8\;Brum7:S`2;w> <*!;;s,XJP -$< +:Ȃu;9;;׶$WW<m;; SrDbt˻;hл8@ǻfCl(; 1Hh:%?;Bm;w<;f8<^;as!;`9!;V +)8YܻJAOʪ]:޻غ!$Ɋջ_D;>9G;|»Y*21t-յ_^A +DrRj[[۲KAz;̉*b;oߺǻ+44R< ::D:/1;f8d<:;COi:R9ԷH<8^; <A঴0仩2;';Az!` (/9>;,};;F9>9jt r;<7];'|;ƻU8]9cx;D;a; <K:B;?|?¡eI;oJD<=%<6+(;¹;&"&;*ۻ2 :|*9uLzIl͆<;*3 n;rϺ><ᠵ;2<; ?XY;:;1h ,:IlU9 $<;m`<吠Wl[ψ/n<<ɬ9Y_\廬I;,CDA<;ζ5~-; +<; #%;׻`D ~ lS:"^% 껼$d 빱s];lջ=<:9ҿ:8:>&f:8;zN;,TW:S:X+; ;W474t'=;̗:q<&8o앚<mRHй. ?e ;z;iF<4Cښw;eS(;F;C:軌;еκvvS=̹i&<u +9zd ++"K"ou;ϟkD"N&<ю xQ;/- ";w*52;(;( ::;2>9]8A;G[m;ۻJ;̴; E<w˘9 !7@;צw;:N <[:vJ7m;UǹK׻Q;;S ;:»6:k8;;l;1à\;l3\[Jzf<<:e6(pI;JΗ; +<:ũp=;%; 0a:<K;h:< +;zOSһ=x8N:Z{+]:DhSq:vmxJH:5<u;y>)>-pܵxOY8eл(Fsz:'[aT<}7tM: W]+&: +3T`;F;j;ZCT4;iU[;k5oԱ:G% <>#;mq:;4;by;!;Zs<Ň;+U6:<_?r@#.c9;<^(< +Q{(Yg<*^::V:$X;XպqK;>;8k;8g;F\ջ_;Q;p:lZ)<;X˻q ^AV!V*A/8<;gk;탻dt:hϦԻSf<ҿ\=;(NSw4;hVc +Ļ ed9ƉuJ;*;%/;t]; );:_+JA}<=Uĺ>5;p <;raѻҩt:1;d:W4gP;`;f;2cs>˜:ʠ滢t:xy Rlhݻ\;ȟ2úd\l;%:@;3<,9(bB.ʊ2%;ZxĻr;L0;4)=[ ::t*<:@:Xv(::5;<: ; +:(z;64;"R;7d:96y컊^(<]W:5;HH;h;6;zٺf8:i>a~:f;KȻ\;g;E;̺h8;(ʻxۺܒ;6E;:H{:ry;L9 <!l|K ;aG:; 猾:C*;O I;hGGEƻ\P;ܟK;R;Mn+;Y0<]We:x;P! ػRrI"@:벝u)rX;D;>,YHOm;8;E建ۨ: *>dc<5E;E<2;;;m;M5:jHk +Kp=8- +<DQ<>ߒ:aa;Э:}ûX@[;; < _P +;:L>:V{::^8 +?;24<|`I;[ºL';deq:'ڻ񦦺ǻ޻;M<$p l-;,i;k<&l5k<\7<;9_ot5:ux0Vf6v8 ;:{ +j `7; +»6:T;{4;ށػE掼 :4;꺧/;#9{0W/A;*JYՇh;@;DŻZ; ;.:"c<[Ah%.Aܳh+<:=8;ЦY< GJ⸾;%E;a:an;-Ż9l;Iv<,D; 7 <ܻ*~!;ԏȻ~0:W2;!0!ػΣ,ZYZ;n?ᖻuj:e:=1 E9.۝"Y;c1Q뀻M<&;[ +<LpC5:s;|K/;S,V$;; 9zZ;!;;S-z.U;n:DԻ/;̑L(q /Oݭ:;F ;4;K7';59 Z<;s܋yb!Z)_; 0{ <: L?c$3Ƅֻl( 9q=-f9+ЖȻG<=;x +<|:?9<7;)ɨ;~(;]< yQ;D?;O;g:P:I$kk쳋;)`J;Ҫ;cg;T@;j8 " <'HH;8bi0<9"Z_)<`kʺEc޻t7;'#ݖ3E:04`%@>:bлu y;] | <_Vo4o1ʅ>; \,C;q:)K k *<O9W;--O<ه;;!W;]; _<ێH-p޻~A9a9+ͻY`VƋ;-A::a;N.0+@{@B<2M QAƻ|9SݺZ +{» ; T:NaKH;:6т,U;ҹ;Ƒ;EM25L:;#(;e:ۻ,~;8CY: +,xQ;, *e$2:GO<;Z:G/ú%pRG +;O6kĺ\=,8ĻW3:B:a ^J‹pAP$&?h;s_:k:;B**G滣ۻ5B»2Ǻ^9߻|&;[:nj;V&7=;IL&ﺬͼһE;Me;! ;O>^a;3,(D^;$9/Wd&jX< +Hsg];C :!껎n užk:^;;kKl<֌:!dA;7NMK G;d*?:0;%;јIgݺAY +:f.%B<~)$8# v;5㘋;;Y=;H<+ ƻ{']N1t9ѻ[;,<&;<2ksu;:=<-- B&:Zǻ]9ˈ;r(3;]_ ;̻zHij$4b5'2<0;M>C:^&gy7D;s<6:pU,C&;~;s)'ug3;v:<Y<#o;7%r;&;M|3;Ta;;;!mIoQ;l<`;Zmv˼;;E.m<ﻯ2#i\MG;:mŻ*FDvG켡{4%ѿ;z,kI4ڪ*<Zzp:;}I;Q<\ƻB;CRWr?+<:9b<6:~k;U><*:H9zزqjo6b;C<1ʆ˖- %aD;D"x}D<$G;(C۬<'MO}ZI;|d ^<(;:n =o<z]E:;{H;SW;D; H< `i]!J; <8q/;.`:#H:q?`]B;O!\,r; ;';B; %:p;Y;A"$e6z;r46;56\YE}b|i;DoAb ٻW}Bhn4<+ڻ(;n<<[ [zﻀ<d!kH\;Y <}A:y9Wc;92R;|-~5BS< :| +<.n;,3:rd<l;h<<t;M?2<.S:';7x#:6\<όj;ɮ:<:$u:Έ@e;2;[; 7>; ;cav6[pn<4V;[ܻ;k  ER`e8.&F:܉u;Kn;Y? G[<6/Z:9l9&;eƻV黮o;UX[U;Q;;);= K =F:;=⑼;9%9_o<:6;l;rl+s)*<Ūǻk⻒>|<: C`.<5%0;/gy;ͺ;3.;g;8[;)6Nvw׺︃һ6rA:N`;D0\<%Jѽ?NW:K:;*Oն;}M:c;-H<~;!ús;.);˻̹9e;48Z;LOHl<[%|%:Lś;;˺h<;V:M;0ݺĹnX;Q#w<H<:"G~;`M:o9<{<a^xº#6˪;$eƺ8;QPw֚:]7 6gk$żpMB32;g.S;;L\;;X9NaɻCX!UrF;Ο-<~2κ8;+v +O$<;z,⻗7+;:6o㹏υ: < FU;n*B̺Ļh1;:Oy;tۻԮn ;-<|K<˛;d^ kCQ_JuLt;b8f?E;E85U;mFLl<{\!<өyI<'r& 6<`:UthǺ>0;]O:{f;a;ҽ))T +f;/];8 :rs:V.:hD/t:E m0e;] yJ<:b(5;ӰB"vep;;]!̂;:<<`0<1c;+:$D0<@<9RG!<á;FV7 +nE`;o;;\Ở_';H;Q;< s^<0Z7gV;F:һQߪ0\ۘY:+9Od;.:l<]ҺU;Z-/ +yuaƻ`?xHg;͇ӻЅ:X<( ڰ: Rv;#:v;I]3dpq>;B :~s t5K<];h;`;ߜ::h<{Y:E<8;>ӻ c*D(-Y_ ;7(,f;_J;D^D;n*O;d +9&,>;mG;` (<:;fK癓;>Eۺ9;|T6rza4/~*=%P;en5Wh"i;JUtJ/d9LoZ;WvZZa;}; <j:7F $<5ym:6%כ d;s;ȁm{2ҕ?;´;~.;kSX;5̻o,<[#߻ۻy;E]/:):9ex躳ѸZD/0sLszlE7z;@<` ݨ»;":5ࢻkƻd1;\;iE;~ ;WW;Q;:< :^f<5$ʺ( ;yf9y;%ǺDcx(<;;d<;i-]䜹BT| ;n'"}?Yd;G +}{#'<*./Q7֎;uW;຿Z';r;{:T;>;/;i4|;WL jź;H9P; j9<: A<Hrx;G i<T7B;.z;K;Q:z;K<'̺tYD'ֻIA:WҺשMA;K <<zlxT ;/|K;׊-g~:):Rw<Ƽ;i&;*L5<࠻qa0;!5;;4<:A; ǻ;Ez<>PVX9S3;x>覻vh<鹾׻0!;ҺQZ_q:^;?1S_<[{q :S< +!@`=<:/;mjq:̯a;:D:OcM:"?*$~Wr6m +<4(.;l Tm;<?," )?<X:ox;;++":<λ;yZ$V;d:y8)3,955;U;!;;]0Í<:^L;;5; :̖O5a;:4GlW +mrD>:ɓc;;< ;ю<>Tջ ; 8>;T ;86<<=sX";W;1;q;_ʺ(<;e9:Ssi:saN<;FO ;4nZK<\<һK.:';ގCL:U:яa;r;;\:s;;Vr;t<;XN<#M9[%QO6c; +*Uۻu#Z4?ZZ + ;3;AAg<'zMe: ca;~MP;B'.;B;8»x:<e&;^A:L:<»92VT;si~;:1MY ]3(u;;#1~!h+|;Vq1 + >_6g 9ù;q^;P%o9ֹ:j:W;;6T; ܻNjn}TPfElk; j얺m:/o;t;sm36;4ݻ]e,;⻀ +: +:\'&yU]:O;>绽;=ڞ;; 9:F9;<:=;8*:;%Jػڙ7M zPj]ǻ8úw7 9 ^.iQ1;댫p; +;];B:832; .mv{2 +v1;;<:EF);R;ݻ;D껈S;x;p%/,{:Dd< \&;{x;| +<&v; Ż?ܻҗػ+#"s쁻i<-<5w˔;lk]F;x<~cZ:7 O;ֻ;O";л*X9W<;:WC: WLϤ1:-ikh;=:.2/&:$9'l$*b'-X廫r*8<:>VYbg;kq;5PD ;rf8nkj*9E;- ;T;P")ʏ; +S;(͂8;pK'L;ﻑ\$is<|?wGy+`˻U9l<3;LD<҅9]h =Y[;F}ͻ;n3;;tU!.C;;Gi<Һ;}P>; +3L< +C/\;~;AX:";nN GK::&;.6;48;+ZkL;p;]>;1;Uv|E8Ei &9eW:~$U_W9; d_;Z):;T~DRK:[C;œf+"Z;or;a'ϑ衎;P{Q@{]_A l1e;Uȹh<*x;=<;&<I;poA<5T;R9;һ<6/O)!ۇzAu<_к!q;n-M;ۧ;);^DP;n o;jٻT0o;$⵻|0;.3UŻx ;:+ȻO袺Hƻ#@p; z9%; +T{;; +Q% &tSs/ng욻<4QO9;;VPd:,BgW;Mkqv3:i3Z;KD< RT;`=v6 ;K j;$k8j8e9E:H4:H9ƺ#3`oY;;Xg;h:Z:jμw#<בkԿ]ɺ@|;7_5"p;s9W!Pp;f*8^3<;?t@y<4<˳:Ru.:L6c+;ȻA|:;e"C;톺'Q;JǺ|k: 2U;*7;sS<;-+Z:ކ/ѻi7;$ ;I<;j;׻S#<]tOט+4D{|Xj;|Bۄ.;)4Dw:\V;h)D;csUeU-1& RP7]q@;F;c:VɯPM.R";Op;9CPKtչ޺wLK:5<]o;5 a>(;j#xyc;cB*:$ۻ I;;;;^0;BI:kv{:C# +;;,9:&/qC;=bL79lK%C;Fۻ$>N䗦;FP;.:ݻA:1SӺ\\x:;!<;9]dE;һL TQi1 m?urMWA;k;ԸN%}yyq;6;oE ;r+p:'X<Ũ\BuʻZ »*2ڽ;P;n :a;>+;,;W];7ͻw~Qy9sH;N;\;v^ʻ `'1Ծta;`9. U)RCA;gs;8)1;oCQ:wA/#û G;4@y#;I+;i1+4;G-Z:;C:j&XxQ8rJ-:;z; D;b;hi:y;[G;x y\;j;A_]::q8&({!\:|}+G!;xQ;8;n_>:9 6;qQ䒺z;@޻m8;h~;LY7r)ĻN ;F}:;M);$++89D,4<3j;:r8.3ŻkX:)8ʗ"+;M!;: Tu;rw*y<;P;ꃵf̻; +L/w; +;䂈;,87x8q:qH;Od:-;;w8:G2;l3Nc;;Wu0Q<++; ;L dN~8&n̺:;z:Dغ˻»Dhi<Φj]:Rb9'̃;#:? u;;/;X9NZZ:3|X<:@^ttrm PKAݻjrݑ d9:~;$D ʚO+iƋ>:67;H˾]H4;;Ԕ>r:yS7B;*:c@j.;9p;ڦn6Sw"t;l-/$:<;O;˻Ɂ<>};NѺ-6ē;W;"=;»Y-`cxB;lBZ҄ *9BH>t9E^.hA;ڠ;z<iҺȋ;B+: %<ӧ' ;=`g\,.m47I0u:/rq1<M ;G:)ҍ;LoUF<;U)x[G<;+;<:<)%;K$:kh!;Ȧ;A\boc{!_;zRԻ+;H;Y;1@Mw;aF MRR;XZ1P: wλhxv\e;ǡ;9B=d;%xz9n +g:X<7;+u ;;%4ySкo␼H»Z`,;R#`;ݻy<-;k; dZ:sKt;G;;,@:T:3:us3;rW`Ha|N:;C;[`:$;Ĩ:;1׹Ux; 5ѻgF!;\I;?h ;Cېǻ6;|5Ӻ(a;B 8eo,j查sR'>Yy:ջ@ xo-;Ż]#-;2G9<*d:OhiZƺc:&;M:<;G9WᲺ̓,Ž:^@h+ͻ-;A7:{:~ۧCz򻒯oXP8;3:;g¸;2$$]ĻT8;4F:g;co;|l:;8y9); +ѻZ 8CdS:̇:~O1;!'b;]VG;dk;WH;C(^kG;y;};^ M㬻I_:QnӺ+:h;:}ʯ:G .;<";B;9 s:[Xk+&1<4<&z;z9?ú L;9>;s$<6Cu7ChN:M:VQ<ƻ;';H;;/!;s1<;e9=([rE;:;r;=5F< CQ9\^+l ;E};f+;r񻝤;A<1<)l;ۻsOkq*;:;z9+'pźgdj;sWQ׸:e[R;r +UN;w;;7Xq :?;"PrhFK&+<(߭%jNDŽں)HwR~A;11; H@8I;p ޗ;T;$jYFT):I1e'ڻ;;l藺F<} dg2;v$I;y4Bd;|foPQK>ֻW;@/<4@(<];b +߻dž;0X:8E<%8E;VsրP&;r;D6Vwd_:29ǖ +=* 6n8Շ5_<B޻7jɬ[_:g +;TĻM:j_滣M,T;.m[0;U%F7r~ ٻ/;g^F㭢r̺ͬ;:)k@m=@pn/:%:ao8 +E;r:Em9@J]P;Y*4Zu;^;;\B;|a(9 +;3;9TJ) C_;Fk m~9Pl䌻Re9;!Y;&E: +;?u7;OfǺ@:Mj̻݀^^TC;xK;U;nz\;I8;})Ǥ7忠6:;5;ֻS&ػ7<86% Wf];ûpo5E;A;VQ:R#/;;A9qVp4;&{06z :cܜѻo8;-i?: q>ۻ2 9~ + w;<;њ.;y:ue/;4ӻ[\;Y<);,r ?};,h[9;7(#eApX[;4: :};ۑ;t; H;㨥i,};ʬ{j';vߋi;4;Վ;<7\V7<߄209<O4;O;Pb(go)\q; mbTMԄ:;;L:mm "H%G;V&0x:⺦h;x}4:6A@":p׻: d<@%$a&f:]k;Q3#/OG<)iJv;\4<]B;Zhܻl9<;`;%YN~: 2 ;>>ä; rWzv ; <$T;yC:QY;a9;&:BE&;p;Bq ;vf}9WQٻk:xC:[;;oR-;DaD;,'oku:V8b;5ԁ;W4:}>;Ec'@)O"ëH;=P}&8;T`B +<;;%<Ȼ\;"Ⱥ0f; 9ܺ`᪻κ~q;E9HU˺۰;;;UݻΎ:\qRޛ;5xEo:J];JF:4;+ »M{;Ł;j|Rpm;N ềd;kD;%Xuy;t;VqƼ^$Cϸ;\~9Ys<pT;.:(;n#:0:;_`;9g*WF:+;n;z7;(Kc:f `;8q;A9#%;&~ IDC r Eǒ!:Az;UQq5b:J6;bl$:,;ٻ:߳G;Cٺ~ p.:ʖc ;:[0<;"ߵc.<ן97:W3;穜:CD2Hn>ݻٜ:H: ΀;>9S <䫻B4_BH;)$:g6R:;U;D;!HW7J?;T6;;\,|Y<|ʺbe;c<V;rDɺydDֺ6w;Е81x0<⤙:5i;/5O;lz䋻푋X#< Z;9!Y4=[<.Z9;c'8:Xa:T71vV;lu<ܗmq;{M;NF;We;-H'LS;~2/X(Ǻ8e;@O;/xN;ݸ׉<t;M-ºi:h<);{: Ȼ <ڸƺ^O;qor溄.;; M<(;^&N;ώ8~B<"!;ɜ;ˢ:Q';9 <ֺs;RAƊ:/5㋻:@3<ź;"":jJG1;T5;9;fzЭ9e~;+!<(;ɺנ;- ;i;ҹ`oĚ;'tTV9;d*b5<:l;۾Y;#9 ;gqQ<;f9:7ePrs ;mw軍;Cq r03;"D_(cJ ;i9;;!8;滶ZicPû:F:ژy wo$!::9"ͻg:?::rr<Mvd<$/<@;H :jڰ1W/fhִ- ;DսjC;m;}':( ,; ;|Pg|;cڟ S:0;∍;;-=Ҏ:PζN6<!T;_%9jbr qފ)Hi4<;pC99<0<ѻ/s͏;9;I`ʽ5\*#ENMł*(;I:Hl&;%TN' `):.R(74;L.;d7;_U;^v;Qtԗ2@q j7T<[_Ĝ<:U`<8;F-:-;⓻;|-m ;<]v;K'; +QW}z<~PB+C8x׻: < :Pi;Xl;•;M%ֻMT:Ioݺ$s;45:u>><[:;B_ 3q͘:T]9SC˜:n9 ];6WI;a\<(Hv@]ÀTa:gJr;o#<~Ub+ +[<`;=O(a;ٍ9;"[:;&Vn9_!/df:ZMW(:uh<(9̜>p:K;|;;)@˻g;㏻Ѭ pS:rkJt%;'Q9=BZl骻O';)o:mE +<9:;ec[H0SZ$ ;59ѻj@лlR˹:-9;]*<(rm3F&.'n;E:+;"h-\D64ϻ2d`軚;';P>ɻ<8|Pl_;:<;bM;Eɞ;`; 9%;v:;ѻN;؜ 9%;~;.=;"9|aY&;O6F:Brv1:7;<96;Ï- du;"̍og: &;:WtGʻ3;5/ <9;!) Ks;1;w;5"M9<1;{;;n;Fu:"UzW:GFI{;.27X[;b:;.<1&r BR ;;>G +лq ;_;໹ 5:e +<-̺;?/_`ܻ%#;YEs>-;d;L4;|;a,DcIٔTF@v^-;&U]>Y<殏{;):O;zk9=%,h:0.;Y>z~)c6;N:;/8y*5λ6&;|Wջӑ{TO;,꺍zɸo;Y:j[yջwQ;ɻlu&]0<79b9;y;hy;+X7c9,+<;f;#݆;A;`;NPqؕ%~>;E8u) 8wJ`!<;89b3;xx]<}Kc;w;x"p| /p:7< "<6j[xC'G0`NHYx;9;qK&/;x:}{ɺJ +{i0Ł;:Z;W2*ٺ#ƶm;=Nv-*X[h#qS: +:2s;0 ;ٍ#0㺇S>Ļ:0;;teHH)0;B~;y[U;};@A<+9a|;(/׻h$:OS;G+qYH];$<$;;A EV4 *;̄x;ILn̻WN;ӻ[T; +9;d:tL%%;0;ڮ9]k]u%<)1J;Q <<N7;,g;+~3+g⃲;,A +?ٻ-m(LY;a>TEu<|ׅ; &5:C8;E:~Ceͺpݺ4;]҅˖;t;v ;:.;;CD7(>0H)8깥>;yPEy_:Mщ;; +::);};7<; &n:d ^ ]HFlsT/:G3O7Ī +; ;;vr(;1;o v"a ?p蒏{<#;o<͢v1G;d:LP;d:X<;^U;yv;) 6ʾ;h;һ2;3P\*g:兺 [R):a 9羻>;}#nz;[d^;5;/c6‡Ǧ́W<;9z.< ~;_F;T;;:f<L<$ ;6<~;Gxr8=i9j}M?ꇻ@N<ߚ;Wm;D8׺2qڻ#$;4\f9썻&ź:߅C;x:~VE~D; +G;e;~c2";5̺bֺ: brz +Cp;p:W50 +:Og$>;u!AWNR;:0wf9ۻG8<ӃkN#;A:;u+o5&:|T/ٺE>;$k;`P;y_ȺGٻ*;8f\U8;qUx9:::1;/BI:wj<û5Wc;Uo;yܻh99; +:#r!XX:J;v +;ͻ;gpT^]htE:>b3Y<%) KqU\;yeK;;G;4c 9B=%.< ;ֺ*0ݻ;_4:Ѽf;P b*;t2;;d+R;nJ[:9:ˋH二9JMԻF׹ғ;׻N:gUjjH.ѹ;")s;Qk-P;U+D:#_|;-;0 <:R:ә;(r&c +;ں;ɻ2r>:/;;AA@P퉚;Qo7<>Ӡ;0tT:KΒl;c; =]Y<;N)UӺMû:Ό:xY;@89?82 ;;6Q"-:jߪ;a,:̸^;:3g<<::=;NV]4;rֈ;Xy;QHP򋁼iqyi;y9ܺOĻ[#H;4<:o퀻];^(:h8Y/e;~l<--y;򐅺 <2ӻ̚I_U_;qϒ :?JܻG[;nC oP)ԻVxa;c!i:2P了:>;a;+ѻ\<;5蠻Th;A<|;8n_ػu:dλ.Թ :%mλûj2:(W; ޻Dʪ;a(_gW":!s;<9E<\hSCʧ;E=TIYZ;V:: ڻ^ <|\;|'U'~A2;i< Ժc_޺8 ; +KYUve:9;Bo:;r

U;RM;e +]m:Bps`@:9#e˻|dRgD;D`%;qo1J:1zٻ]\}7\.Ÿ;@49;Hܻypa:{e;;W*ۺYPma;) 3OѺ^Ih;B.G9lS}`{>\={9{ʻT%.Q;I]9<Q; ~r:ڻ\ P.< 햻EO:;M%ӻm ;<_U;X57;%ź:˻K];*&_ @I;ȻOԻ4;6{;8TF;Ȼɸ5;Ӿ8N(;?'}ջ+09`[Ⱥ2*; f;2k;k +:-B$; uib;Ժ妪S;N6)@:#d<ӈr;4<[ںٓ=; :Z;O;#<*;b:99;/Js!:qT;$%9VZ|A%'ǻ߬; T#:H;I:w:<$S49N ȩv<{;?;.:IY˝5;F= +)<#8 +LV3:I;%tՐ92T;rM:m*;e@b; +~;;fZ^6;;IIE^P{bY}{q;|;3F.D`;ENHn<8OX0,;m`0!;;e;;DP;q:/i?׺jź.;eo;t|껫o1 Lĭ)m3<:r1 E2D :1hfMr:$fû;'cj;l ;:޺6sk/;ueW&P7(Czi"Ѻ:\<һ' e;!:Z;@@%\T7^y_~mI-mV;:*":e }|<:l 88W'<P\;\:]}$<㴻.,<ݪRU ;gwi̻%T5;rA;j2:VXU;0:-;w.a:j,{Fș;+q;;J9;$瀻eк.<pºd:O:C`; +Tʻ8;9ah+<2::)9ZO::j:?Z;α8BIĻlta:J;FD;݋/J:g;;Z:Y<.3Id{ 6F~]9 ;o2;SQis:4:;|<:Xv;t;mC&`n֦<{Ӿί{tѧ׶fVɨyo˩]ƊRElik_mڒuƹDĉW!Мֱ۵͆ytigԏZh{lHml|IbBXy7LkKoZdߺ 1(P;.;X=<:s;G: +5~Aӯ;:$Mu;w;g ;V@ۺ"R|:f_;;;'m:A +[AX[!%ӹs4;κ7];yw:(d9; +n"xN=1Plt'g⻮ 0R7;2;""ņ8M;>,߻Z LO0l :"v;B!|bÏp;[S;bEY$;wͺk>:;Oɱ;tf]S:#wQ| hE?;-PȧﯠA<+$;;%`:@EX9g::.#;0LuŻL:+,PW?:kÁw:[;;rپN:%EQ:!K ;q68_RV;X່};od<_K'Z35; Gڻ͞;:f;".:#HһyŻDY9{,4L;;H:3U0%<,u: C@ïH:M<; Nb:{һf治C#*m;lEei;=3<& :soۻ$ (;53^;/>u:6;vh$30;ڨ;s;(8M;w] +PTA_Ha<E#55I;A;ۻ.D}%R;^c<}z;NRJ];ޛlP;VږûJ;>B;#7DG0;л!:C-)l;:L<;7:R3;@-; x:딸4͏;N9__=!<ٛJB;U.hGH:{;ܻ仇WҨ;<\&;- :e9;; 9B܁Oˆ2JGm</:o:3w9G>;t:㡻SA<~K:@5UA`;E tn:=l;:DG:D)1m;;WN<s6< *;:ε:9vs;xpN;{p;:0Xi;WXgp;d{:"<;!Τ:GǻC:W<_B:'cݺ^D<+=&UeP::`~:RA;E'=:;;dI};P:8 ^+pbbD9`s9_:&6 +x;d̻$X:g2%:n̻nD߁,;p +;f0Hx\E;O"c:_;^%<:̣K;4:7;:} -ϻ[;;̻Cٺq죤:؍;ᳺKg;"lE;ǭ: e:ea:5:&=.<2;BN Cs;4;ι@ov8$$< ;G;;V&<} ;:Tx_'+;S|p;4q,;l<:\b0';(4B@;Bb:]I9 +};ѻk;J;LX3\Yjl8;뚵:=; ;cJ2;Y:1;v㻾ɸ,*<[L6;W n";];)<3U5NC: -:=*:?u;7;;9gz;09*MPû@);;+ӻ6;._(ջVu9jV=U!ء';:;]_(<1C-,,;:X{vPI{);5:CES\<c;P_P;^:9S}9p:s; Z<4.:*u:%ջD,3; λmdc;ʞyÊ;Cz+֢UqfA<ϥ;,{;J52ې1s;w:8w;O-!X;{;fKXӺ)<07ZE@:]6);s:t,;IM;b a/<${n;ݜa89O㕹q;<<c{;* ;Ζ#:?9rI;{|N < +;<{X;JR;h"; >P9к!;l':W< 8;x0;iD0 +E0)2ѻ;;Kc!9P<xCnkպlݎz=72<}+1DŝλgЇ99%: ߱;:g7b;(x;h`[;"K (:3< 9:$w;{b "`9X;_:8KP:c6E9,w;!t`uΓp*;v<9;mݺZ:nw;l:HvK;7 9+@ءչ6);ow9I<$K9;RԞ. +:<>g; ?<];x;Ժj6; $j$m(XV;;a:;jġ;3;S*Rc9: uUX;9rںn6p5z;a<l";84ŵ; \T7FK)D5.`,8ƗP%u:9SY;H;W9g`˺ ;ԼpV3 O;gs^gHޭ:X:;k;;\A;;o;Fiuyi:;Hşͷܻ܁ ůPE; Yp꺕s+P5r$c:ZAJ 3;d)$HDQt;^, 4Թh:5"W; ;Ү <=#: лb9=;Yo:H2x +<Z1;XoںdrLGy; <3J< <6h;%<"G;9׻}nN^@G<':]2-щLĻػ+;`:;/;MR\;?;Gݛ(\:0;xώo:;:;z;T;Y5PSnjк9Cw}u"i;v;ꑇ:`w<Ŝ0/D;ƳC:shZOiŻM;b;&|;9UF9=O< :JҺA"ֻ5L-T4<`Yv5;:mM,;M2]s;w;v;+i;ջ+:G;8(scC05^ :`n;c!Yz1E;Va::+Bvɐ:TA)PE_~;d;w9サi8;>;rݯ;Q)7A;pa";F`Ļ:2%8pER#;R;+R;;d;uȹ&:0V:5:;پX- 2|ie=:z4<$9*^;{) a;P>n;t5ps;8AF ܭX;`Of:`ݺ;(ʻ,w;\;);vһeM +;D;X~;;+;xqw N;K>% :cB{"ӻ;l,<$+ A-APŻJ: J&Pb;p7":y⻵tma$㞻K;; Y-!#!:˕:O#;B'ǺՅ;#):?F;ŒVRo\; 2h!1t;E;=&5-:"9j; +=6]%(%Q<;Sx \;6;88G fn8;:;6ĺHdF;a ;!vpS:q;Kf=/:ܱ;Zr7bYg,; 8J0l[Qk21; < N¹̯tVB*JD<\zϻй@|;Fbs%< ԁ><:af:˩ջ7KqK1;ό;a:m~k;{C6V HFX5{u<':W9;*kG:J;q-::,D<0;[:3M5X1k{:p<^c2=:;yл:3;!sغ$:[뻶;"7L:Y(D::(;k;;# ;mӻ;s }8Ļ⺼L9+J?;!W<}];ԋP0[;T-3˺dhr;_+͆:S; :H亐F:}o;{;5}8-;<;ui6z̻ZSK;}5;ʹ;zf;2;v, *;r4V׹b!;ʹnh|;q׺9E;90;< ɋZ;#::WO뻛\ k: oPX;9H:;oYƺ_;JF*$;;i:;;W;Y;TI95;<;t@;C;E0b1n;e;;:,6;p0ԭ;7:Q!;0κ?aj >{!;9^;̻;R2;Л["o;UK ;tdA|V:ڴ~:%3,;7Ȼ:1;;:nɻY:0RĻ NI[< ;:h Cyvл :;Lƻ1נĻ׫ +;Hh:JE;9; Rd:W!擢;nދ;[;<};Djx:, ɺWg,:MkJ'V ޻ :![:˒r\꺖)º> 9=C,:<݂)"tI:\;λ;c.:f =[V^:R:;X; @-#-X;Mqj;YCZAUxb>;8h99gڴ]81<;@:9{:޻vK;As}f; +~듻gxu4:烚:7`:K:}R;[;y;;k<˹,H;$?;9>;V;>5;;:g:P<:.ƹ;uBU:<;l:=QI4|;U<!9g;y;&34;u ;W4ISwo0p;#:';J#/K_; +. +·>ِk<ƈ;Lņ%?4u:2;rihCѻd;SZ:s5A<;,K<.~ϻE:E3lGXG:m:I;?-j9:p͠U1G1;á;Cܻe#L&:8;qd;'&;/!;ZڻL +;瀺/$Ggʹ  ]$&滇 ;c\3л;&u44~9;MI;M; ;4:X|ijH0yN9b;^;8eN??̣;:6 +<,y&%>JEM;,B;<2;H+?<4R=;Pd;vԻ<-<f\:5ap;aV:$l;p::i) H;"yN0:|2k:qI.N:bdt-vi:%&T"ILDH:宻m,;;FXs:W:[;ox D;!;+廓* :;Z$A pV;<2;J;r1P +z8:-qm6;l :x1;Q;:ċ:;5FIPoo=b<+<h9!7<ߠ;;H>;RW;U;컝{;\;;<g:wź;:#< +q-Cz;!0 L;"<IU,\^>;Sc:n&ι| +D;OW:z ;k:]I;k :L;_m +7ӻ;c;!;C;V5:4;DqI=;a;NW<9$%.~:;<);nx~,0;G${i58%i击瘼Vdл+0;Fb}JOc'O;`K<8x:P&=ڍ5<;@:;=k,<1W`:ʺ"f<45q>y h»;;R2;:r, |;:*;1zG;'m;XT?;̢r;H,~; <(`5;5 9Ky[;EQ"ƺ1:;J.;v;|2;ax3:\M0;F9\@ܫ+wbzVP([,^B JW<2;Wź38?a;껎h;3;b<:ݮ;|9@;Xٻ@;Ɨ;Vl;S+~<%.컀9q; H"/S;e;3]I':>if;p;r='7:nѻcg^&8;J +ls +GRF'; 7;4mpX:t9$Os"(Mہ:ûT;$NU;"ȻjҺleػC:0:bN <];k@w(;O47㗻Au3ûH0Z廝N<bx;?s*1<"+ew?N9;gff۠d9%l1; ;zY'̤:Mڪ;fu;AټHVC$<;o +F;Ƀ5q;s;q,:!/#໽C^ֶ̻<;WY;f; Nгc@J 9(?\;;u һ$;H|*:x8 +=;L WQ;zٳ919]hj:Tۻ?3_#;}9Jk0B;6:H89;؁;3;?;;ȝ~hqx$<㶼=;χ4:!qh Ƨ'EPRu9~:-?; { <;!;?!7::7yi;7;κ#;I;;B,ԗ:;+;^ULDi:[;viz::`T;rE_Rл+8,u ;oBT*r< +;l:tL:o/`(; :V޻ʌb;(;”һ\3`!:k~;SG:yv X9i/W&;7X;O4;I +:g;1;o;A;n;йr;d2~A;ͤ$;Bxd:6X9{;>q;z<`Ir<л^AMA0;80G;{J<:l;5n :>ʻT;&:AO4;ㅖx'Be;$)仗:c;7 +;IXϫ v:*<պ9x߀B3 +;pɹ8;bR^HM"<.:;<&.% W\;Z/!-;P;O{;ݶ#]v̻X ;Vi9HV:?tK;L;Α;; +;w +#Oh+x/#p;0(:HZ㺗;+d;<]=:-кpPջD,=!к\R,!WQc^K(hYA#';Dfc;d:N;R9;㻹<[/ :"p<'Q<;A;D :<;Ūa;c;? &;O;v';i=9Cn<:&;5nB;ۂȟJ;x;4Ţ;r;:Qt=:p$:M;F^Ns2a<،:ԣt׻9[ r;x:ӓs;u,ص;JWH;h;bp. |"@Mqp7<Ծ:%E<庖;]8;>S:/ջ;=Z;;Yzt| *:$1=7ҶRd=V6;^yI غ q\.̺\bNg74t;":V E;:TSUûT_ƻ@f˨9'B;Qy*<nG:7r2;:OE~;; ;h:r ;;;3;? {;1lsyK;'<e;b5Tpv<ы<ō}NB<7F2J:G;{x,;f<;̤;O:a<~;G:E ;G9S&Q!:BW:1`:;T_;2w;`1;z9?<s:e&+|:n&ϵ- +ܺ;`;I;\"lL3mr ;+Boкxϻ +9:z:9$; f*;1sΚ5; qkH;ȫ:pKGFỬ[;`p$;9Ȳĺ fU ;k_;_,T;5.;C<'>7kcZ'bͥ5r;D:ӟ92:E}H/;]#:l=\3< <4􆻊;7I<ȴ;$ܖ;{=;C +<>;[GӺ];_\P⻆:V;";x:#ȷZ1N8sZ|<.I<6ۺȸ"V-;NT7kvˆf:a$:>34D;:;9;DXv6BEi}D;:G`ﺡy:c2˻ ^ū8q;TE;E ͱĺ;YOX7Ȼfv<;H":p6C!6y?ě:s;i::NXs :Ր6:*;`[?;Eܕ/ѻl)];$[;MhV:W^;YD̃k;,;3A;ـ;_MzQ>mG>%SN;C:^Ժ:+ ;n9;f:׫;s;;S!:_ҙ㻾G;'@V;2e;A';uyՏӣ;Q ;:we3in<:;[;类S>/; 9I9;u;U<1:Ռl9ͳbۺߣ)dY;[x?;a@];<|*;/12;˗;t :"t1;mؼ0X;;N滓*;(/J<-b;ۙ;!8]:OvU;A;3׾XrƢ;eSk :^:G 曆;cx8XI)ú4!:A{;z!:jﻪ:CC;v;.A;<;';+V;b;Mx:ވmպ;)ֹ:0^/:<%Q:ѕ;=:V%̿4ѻ <-0;q/R;*K:uW:v';$ܴ"-#;F̻0Rf<:a&;δͻge:;F;-<6dHc@;9N;_Ⱥ,;,; 8`};h;ɻg%6;!;@;P&gd;w,a<'离<1:~:B;;Pк!;A`[y;y;b ;N;׀i!CK:0ß:J|.:7Đd;XحR:21:!; ;mVb̂rĻK;};»*kN;H8^Xջ+m;<; ';xV%ꚷ;=y ѻܘ;UӺ4 +VQ:lp_*Iz47svQ +2l;< <cYI̹Z #.0Y»!b6H;ݺ:[=;; Fab,_.W<;: L;:(^a: ;1ڃ<:>na׽wB%tg:]BenrZR:ϻ0ճAsC;"dpV;_;9 <=ҟieG+tD;>!x(j;[%BCf:]:=&;;h9F߻XF;r!<=젻0ֈ;.;FN;X,l;s;soG;M]b+Ş; ٻ;{D}?#@ïŗ;2;#<":y;S:A:::RrM;ZV.;:A\|F 23 ;o֑9;;Ν;IBKy=g< ?;(<Ƕ::3<;9<ʟ:vٻ;0C;pl;֪?]L<%;\;2za:u<;ݻW<ُ;L;t;Ia3;,ejE/"b,;;;U;=T<; ǩzC);[{s;)ڔ;:~ :0,ʻ<2`;:YFZ'ͥ緻ڔԻYk:C.͖0V;;th+_ώ;gYePH;;W:$<F<tk9s|:~;MX=~s};:_^Żܡ;k栳;; +~ L]0SU +f};|;:^$X(;HPW;05;`@;A;h;Z;:jG2C:b;E;,;:';1j ;,9YϺe:-0^[ ֌,o:4vF빴1C+j?;xM;];r=;:bbǺCb:ua(*T:wVVbn\:m;:^;Q9<6x-ֻ*E; N";5;eg5_9q:ɗ;T<Һwf]<;I9R ;!887;;6aAJ?;P:`(Ȼ68;@;ͺJ;:)cԑ;5gf$u#TT:(XC8_ bɺOG:[Ϻqxm9J<;zƷk9p;*j:4>;6˻梻!S;HEe< 庁;*"];;|'VV;-]0it;q:'W%LqӨU=;V:3ػHObM;y;e:`WpaSF;<ոd3xNkʓ s;:yF;j;Ӗ9y⓺M# ;KW4z'X;Z;)';Z@;;;<9M};Ls<E:4;[1FӘ;w;39s8|:{a;;5%rM;rh3;:;BSӻ;.I l'm:޻;;1;IC ;̹Qn;2;M˫Ռ;K:cn:X;hwŷzZ;<冼^?/<0=R;V:1\:c⺿v;f;d:n::ElL<1L: 9tV(8%9D;/[뻡*fû*- 5۹&K;G +U.q:<<  N;M;;Hlib yfe#<,:7v4 + ֻqŻ =O;;T=zӻ464V̻89w޺:@a;68;=%N:Y׻;s9! E <qA:6֙r%;o;/<^oo;(PY=:_` 8Ўa;#L;֜QI!n\n<9?;Q;xtLY:Cr;\: RƗ7ܷ7iZFlZx:&; NX<;j2~u;;O!$RNIϻ:emK<~ۺ䲣;ֹ;;,IG;P&:9D/q9\;1;!G ;bx;,:׳gD!&y%{;jz<:\;~5u9-;nTA;;<;;Q:u:B;];޺"ň;i:9;t#:C;jͻ:&:,#;6.:tn9֞! ;^񏺜;AQ!YvɻZR; +ϻ!ϻ|h:՚FH<c%;;=:!j;h IN׺b +zW; xMQeW;5,RM9л⎻%d;v;ɺ`D矺?959=J:ؽ:j):C_̨t;~ =";& $ZL< )`;|;7:ڃ»8PT;@"o:@ջޭs:r: ;_j<:49<\p:Š;⻔;f;43 DmnK;6:@[;: 7w瑻^:(ӨD;3;q> KJ;Xr;:_52dQ;";@#<;Ps̻F/;;ѻgV;;ڹ&: +Q8l;R;oL;ZdԎ<(9>&Ŀ;3ahҠq`F<:-';KD輻Y*U;;9;;&{; uκӬ:*vE.:/ϽzS:;o*k;"7s" V;ۻ,;ze;ġ;N c:i()윴:y@;Ց9)ûA:+:E.S!;~;:H"AYU<~j.YCʗ }:BG +; oZ@iպ ֻ~T._^Ao:;ݠ t5T8K: 5s̻%ļ;aS:K~9Pۇ;CUg; +k3< ¹93<< + ;].':: 8;%:;+9J,1Ժ{:"M{;K(?;c;{c;~w;9 κ1;J;;y#黢o :j5û䃹:7ʭ;Shػ':9`A;V;ΑC<ڸ;»W卻gV9服;;;F,Qݻsf8S:g4;9:;r 8л$N3H9eq#o9.bx7ܵZ:䇥;Ѻe;^| "O;sƥ:zpY:q;кDjAѻX곻;o;E# (7ZQR;6;4#ߖK<9M:W;3?;d+[慆: kKp.l~;ɉ06F/;Xٺ:˪o-;»L.~r9`;#I;jmqu;0:Ч;Hp:i;X %97ŞK:ur:&yU6':6è;~H;e:);A;:; +;O; ;390};";,|;%҅:;_";G<:Ude;&,.ߺ8]hΰY.<lZt;ge> +;:l:-d:/:_;=;:f::;)V@9m +;B;Q:jG:޷(;K;E ;F~*u(;5:=%:>\K:;(:e 7 ;-;<<;!9:"<@lms<(ep;XGvA;{{%:+;Ƿ%de< Xa<3;I<6Lσ\x;W_Y:s3-;;;nq9"׹+9d;Sz<2`9p;9@Qn}j:i u);];̻fl?}3 ;-c:_<; +e <ջQu:* D:󋸡Y<Ի :mBY;Q%;#πqٺ9U;0;;{;9,<a;< <^$n3ﺑ7;>_m&;F;t;/C;:~j5:/JE;Uu=9j S#:r~_;53,jֻ + ZX]<*9l~M*<<[/J;9<< :Eջ:'';< xB;I[;5;rr+H;s?;t;:ƘkoMb; Ȼ ++Ii?<~dP@Ԛ;$'%];r6`l;;4TB;1V;* b <}&ά:R iU<'v9 ml;:7;)a|:;_:ľ:Y;g<׻!ƹ;9?;;K;W;h<1)<"E<4n: +;S6xF8+ջD4ܻl36<XY< )8;Q;::X_Ju օm9;Ļ<@RM;ր:; =;IA:W: a:빻H >:x6#:;c <:>̺z:VP:/;:ħ;q!<{$<0:\ 2<lx<Ԇa߻}ں+k;V˲{U^{;#:k;!sg +:e$/<K QݹJq+8I`;':ڎ*;;WEۢ*<:D,:_;S+<ѻ: e;uW7;3;;l̻0}ƺXt#;5i/s:䨍M;w ?ۖ:C>)n;NֺdI<?˺_.:~Q<>ƻ1;ֻ= <2:NUf<;H-A9Xv\:6@bG};̊;.:/V+rW ZZ;B:9<:x\;ûH;x<|e<}@~2(ě ~޻;?<#G<}:m8ź; [@a_@_;ֹm:,,bu1Kѻ 9Һպ)ĭt;FS;h [<:9s;U~;G;?gŁ ;4jʦ=Y;ۻw(;2 ::Yb;v_:;:Z;ȻY:P7;xq;P^%;vj9'd;VR2;݄:":رnu8{_f n<6JA>KYG:>F!¸XV"4yw;é; ػW4o<;80W;H,k;=R <1i;i;L;5 h:}K;; 3E;m;τT+ Ę;9#պyL;M1KL;E:b;;EgٻQ>{ɻ0< /ǹq `)S;e&j;ݺXp9/Ի5v0;H:-?q7;#ٻM?;;;k0/};ɐo5;NTDֻZu*m0r(<Y;A;q=<;Tܸ;t*:7M<V  9;8sx7¹<:l&M0tS|;#)v;gDit;=;o=;O,;F;m:Ԣ;89ٛ:K;&\M;sɗ;i:꡺\r;ę-2;h;;|ޥ|Q;K<~; r;t鸜;-78;;GmNf1<;/:h!Z;L;&;El;,{A:}ϻi ;6r;=QW;}۝;8;9[;;; +Em:,@av`?_{:0h;yr졹L E92,;-;*P; an6+;ePӻ:E_^Z;7;֓:;.F;*C2 <~7&PY,g;F ;GiS;z_5(;v/4b:V P:"풻⻀ ߺ+λQM;:;PDY8WU<$;c;-<ʶg ;Nc;ܨ*؃9R/P;r2PI+0;1̥;/;?h!H\;B, +E;|F;c^;C 阻:޳+<vh s?+0;r;fλo;z Ԑ;%3@R"Z!2L;;r:l;f\b6;Yiw# +M;|s9<~ɚ;:㺄:;:'#7;Б +#s,6:o-bR͸s9r.YQ +: h,a`<,7O֍㥷:r<Q躆J +q8@T;V:`M_d;0{K:p\ںI;=;e;;;6;X):as;Y;ֻ ;';on4;X2;ꆻg::>b;;K;kFƜ;;;WZ!;7d;{;<<-;J1;Nlr;ڄ<(օ:?^<=-`;J:Pӻ0Xl»;~Q;폎:>! Ľ;wۋ;B<4:h6 ;im3;}] <4RY/;l;]Q2{;:`;X;Zy&mʻS8~C:;<0#9U갻8<'ú}|;D;;`;R+:†;_";Z:yo*deBUk;TL؈C-;nE<7^6:W9"=!.-<`8!a;;!2:úއt$ ;F`47#㻥; bZ@:.t;һwˊޓR;';ow_~;u"!Վ qJIZ`H0-8uлp2%:[:G +AǺ4u낙֏ӻOH7G<)`<;LB; +;HY U.<@Ɉ;X6<֭x :<+p&5E:D,bֻBӽ;\9ڠU;A]:b;x0vF<켻N;y<)Y<_vc>:yW;*9gtX4X;ð}z̹6:U軁m.~*X:t!< ;F;;4 &<;S\׻t :Le~c%:%";;09:"D,~)<򾻭 fUٰ:#*wt;]7E;u;v`!rQ< vÌ|5k9l4"󺽄<{{7]}UqR:H.@@T;%;0;<\'m::%Є;vx;k w\G;@;)&W̕NP@rCx;V';p< +p9;¥x<3:q;LU<94GG:[9&;\:l'Ȕ;2M|uB;;6º1;,$;?XM<#;s)ݖ;/D97|EH6ygk лĻ"/;+GU:1<ӻGj;t;;1d)כ;xT3;-;`JC^ȫq; +jrP<9%N;9g;^b0g:|~n<Pt &.7ҹ:0ȵ]<әcm@o;qa+;4<);GZ4 <[,<Y,;;uy׻àセ:;1ǺuB$;D&޻曙;050;DmHP;ub;F<̡;S⍹V:4GE|;S<:;ǻ@_<Ļ]Yr: VH-W<<݁;;rQ99;GJmI4|8I~;ڐ:Nûn;ߨ;g;?!;]S7\;Gn+2<;*|;<3;.<:;:=%R8C#;d;;.%aKM9$;גٺD8ʻU#y;an$;;=W&|Ӂ;fĆ;蠻``'6~B;T6;ӺT˂l<7:';:ac$th$ ȻBz;T9!,v8id5;0;aN< b;;;5eaWƻ?p<(*c:5;,Y<::=<.7*5< ;Ż:)G<-;: <99; ;A8;m*;ڸ""9c1TO'ҙqM)<}=<,aՈ<[=;MһvHlP;pZ :}7|O9~]EW,;Xŷ"| +Giܻ%o;\4l:eYmXz:vR:6;1W٠rYb0x;x~;R;!<6;|.<;ڝ$m;+d<(*̻}P];1; +G;>_;LA;4;@RJ;՞;l;h<}"<9H:<;T;$<;846<ݓ\;{A<˺2o;tѻ8;e_;"x;( /g/%;y;:};x<QL<c?<(1-;;k;HJV:";o[w^;%J { ,]NXYݻM'<iպpk@G;kn<"g2;1 ;ggR9#<ݙ?;Ŷ;Kj<(6!> hL;pV?;oH;P̣ +Mm:uOу<(#ջM;gEݻac9B(h9nӜZmBSB;]} :E;[;`;,,;M;=3S::!z:;+:Xq>;X[; |%<ŗz;qN;qbp!<ý8 !`Gu}G,<S;U:/NeQnлQ;i;N; <`r<-[.<>(:w*U {;:,;VUP߻y;ۃb֗;;2%ǻp;3d;BV9V;;;;.闻lشJ>X0;1;::;璎;;S:"W;/$";Uw:[;:1,ț;/S; 7;D08 Af:Gz;),;:ޙȻ m?~,h\Ձ;o>w[;ny𻾛;6<;6h[v:u;4P t;^$q:<RAٻ軝:B::<ʜ<;U::)% <:*lھ[IP:<.9ﵻq&s:o[9(0yֻ7z;;g:.1;(/$#<:u: ;0wO⻅ʻH;]:;_ix;O";ߟ ͢9]j<9:ڬ ΍x;:@K]H=;a;S~U;T{l;ٹ?u9,;/;e; #;;V t+it;P<_!w; P;\;5uǻg7$;ws;g.Ǻ:9jFbf;X:);:ح;;6?;N;~ՒȻ\<3 ê<i:9qALT!0Uл>;N;;e0ӯ; +u;/+ʻp#T +?5Y<%M=< A쒺(I2:逷캾x;O/j::&a:fuܛA֜9\a~N0i:\.9m\l] <9 >i,7bW-<`);\;+w;4:=!usӞ;q:\:.u;һ)|:了лeѨx'>Z.)[;S81$:9R;:ֵ;RlGDѐ~i3߉v$;T'K;v;fU9źŻ9}b ׭9q +;$L:8`;,l<>xŇ<,++:8; +;,;byVs+<ֺ>H_4pE%Fo~; <$;:8L˻oh4o ;ш;(7u;:D;9Ȼ';q:;bj:749զSeU;xͧV,gR|;;;:VIA";WFUB<49>]Y  {O:v$3_혼;}n;3 +ֺm= y!RR;2ٻLre;;jA4S:?;CbFCѺ-#];8:שּׂ@պ:":lxȺ~8:y #5ȘVN]52:};o{9u$+"_)upǺ{6=غqz염l<:B-:b:n;/. :ϒH̻9d.Ỷ;:QMwk;]%vSe:Scg[]8ONnHUCy׻nһ9nbG9W#;~ 8 ːt:z#y:Zz2;:&TU:ۅ/v\bBZ:;0/;"S m:Z l +;a {͏̻/;P:< Br; +9*z4khE ;I9K=;:U)|U9]mْ;ij;-̑'>M/9Թ.)+;BF;.кR5;_;}rD;)Ȁ5@:;;Jq J<3H<;;Eܻ?;<Ĭy;oY!|l=f ;/.T٧ӸʾdbP~J$Јw%pic;, JC3<hMOmpݻ7g;wG;GBz$;B:``? F5ŷ;S;K%;I:B <P&;7t9l@];'[ 9j;;I<;;N:2O䱻`8}坻Qg%$;;e;ұ:E=a.sﺮ˻QJYm;5a:*I1;%%<x<8<;<;;ӝ;HD<U=;c: d9~;s,FH?4;:";HQ;:% ́<<4.:=X˜:\=-};S4qS:!;8;!K<& eEŰS@/::lDRQpN!6:XZ& +Tk@r;'˻;P8:ѻ94jѺ5; +:Fe2ET;LPcM;+ֿȂ޺,/:_;ONϻ:;GͺXXs4;ubf`;-R~P;EP;S<.3?;];z'cR(ں<7;;F ;+^:;'P;4hںfۨ;YU;Q:}>:;2;ͶVbv򺋗A +(Q;>9D7;,h;,;5 r?5;5> +w|ӻ;҃g j8ezܤ< C-<` a;\WE;<;C.QG;d <\M +;t뻯R%AH +: +ww⹦`F=dͳ :H кk*a5G%< X;gʻS;:/f;"}^!YQP; K@.~h<=,AM;<:N':SPC4I0 +UWŻ$wgI kAC:VѺڃwQ: X=;rA9(;M76Y;_: +;P߻4Fm:fp< 3N:߉MlL;޹:KI<];{y;;Sɻ>Ļ;^q9և6:*=:C<:k=< 6:X'c;-\;~;h:"/*:^ :T;+<'Χ});șںq;B;H;ۓxۻ<8%<ϝ$;; << zDИl9X3Q;r;!8 ;D-z;S9=a;n; k$,Y;r[8mٺ+T<բ5;͞ۺ(+::g;R5;*J;L" D;\;躀9& ;m2;DՄ9I.t;zI;dx; '<;N;:1h(y9:p ;`s<;1ͻ&e;HJ<l;pU;)";V<{;_;O/@ +Q;Kd;.%Hg[Y;;;ƍm;d&9#;л:b1<؃\R*KFKJ pMo;R;: =C <é +{";-K$<;ʻ9ڮMp;ڇ;1i Ȃ^ {L;a:=q4:E ;]b @ Pvn9t;;,?;c7;6Ҹ:Ի;԰;vG|O];6#<+q8ֺ;),taOX::<~:$û:mb/u[ɻYsFnI;(_^;qm:s`:NʸVJc*˹g:U74WW:D::];Jei;U;W;^ݻ;:L<;4;9Fٻ' <댺KRp;[b ;$:B;:29 "E_:hY1T⹝0;$ օ⩤?7SL,;;q;:i:1|:;Sl;O<*3v޶;(p;0;;:+<غϠp92 9};nc̻Z9:uO_ <.;X1Q;*; ;_;;It;翻)껐:U;`;¥c;|c;^:T9:<ȟ;>;ZOllN:2;Z+u:/;GY;;BbJ:; +p;O;5S&4T;a;T(麽dg;vs'Kə`8;lrtX9Jû:ѻ1;K.:6:H*^\~:[W 9)0zPEW;-;=lDj#<:/컌y:Jzڳ úܓ[#; :ܖ;Iy0}9:jK;,M<̿;gynN;ڑ; I;ޣCq; +{ 9BK4Ӻo:<>9:8:o;|wG6;$U%|5s5\;!:0]˻ۢ9dRѰ;;?;1<n;z;vŹ_/Z@; mi;f+F>^rf;I_ѻ#B;,(o9yei;-׻ >^:YX$:Dd]$VvA;k#:,<<¡PJ;d,"0;ܤ;Ȼ|ڒ:P$ܻD&;agz6A,;Iҏ;I4;;uQi.;+n:1mA;u;9? +ﺁ=;,Kn-; fn ;/]@ێ:v;&wav:P=:?ٺ ܾ;;v;~;IϻT,b4u+P;b]9rF< < <#gB%<;EGC:6:iV$$<&aF;+:&z~hg;&;8Mf\BK&;IrI;:?;/;\;S_>+f;:;R P;kv`1x:[<`$e;xO a?Ժ\%!<$:%6; H;AG;<\6;;wOQKܻ#:x*0;nADԻ0;x|%ɹx`);H_l4;; ;l^zL:OY;c;89f;l4;ð;} _6 YY&;;;޻(*鞻|I<`};Ѻ ޺vF9Ea;,z;K?D:~>Z91_9/F;c;Ifܑ)<5[ <㖬h +UȻ9+<4=;ʭ/6<^K;F";;c|.ͺ;d`I:p/;<CͻZt/ah8 ;hLƻvLx%Rn ܹm ;Zl++;Y@:/tl.;y:;5 ;w;ڷ썂;+uMD;;n滍K;0+J;:һZ$/;.;]9ߣ:1;;;;л- 7<*b;H";/8%eIT;GHE-;A\9@C;S;;jx;Bb'#Q;;Z_Bӳ-<=Ĺ-8*dO^;13E^Zy;n_<wG_<0T>Q;:[̄:UU:@;d;Y{&GDѺc; K~7;ȱ'$:;Cı95;3.&ѹ;mFhUl^: :؜:1;U~>ջ;aNu:<̺o;OP;pU;:;3#/<3hN;eK4:Ej:;L;-$:Sm=`ֻNat}:@;f,;UF;7;F; ;MC]gǍ: 7< &a;e< ;p:TGu1;m;2;#i9#;O<s$;+eә)hp-Vs;8;btm;c/;]F;C;e::9"IkDuz'*-e'$&+;u溄ԍ;a;T"}йkẗi:^1 +J;Śe?O;7;"k>d:MWU; +Ȼ@T;S;곹f_2VP;L$<:f}/HW6ڭ";,{6<0:98uu!޺t/VP2;" tLKN;P+ D߻޻ۚ;{;;2j{Ӻ\qdA9)59n88 +:)QV:ciYX;~Ļhq`:;q k;ۆ14 SH^-; [ۻ:tH5'8?r <Ѿ:j;:;9g <);l +;ͣ;,m/<9MK/3+K;+:;zc;Z;WL;6x=<ҹD:p;38-;[; ;>g=*;%&]I;DS;~";ֺ;\<ƂtX;7xZ:N˻K;?pa:ϺyDL -;єU\85:Mwͺ!q57Sߝ;pΞ;<ӆO;YGf;2Ⱦ;߻)’4;8];sZ;.XW;;y;9)7;X/7:;};Cʲ;X7:#^D亣;;f/;ve; V;o;G;&();;S.];n ;Ѕ;;qݎykǻx-;{:.^Dž;*^;::`;hyf81;a0:V0MaK-:u@Gm Y;Ɵ:Cͺq;gn;F%_ѻ= ;.'P;/W5;+LWJ;?;M-ni:1:;<І 8cp^N:J;Wջ22ֻ +4c+x(|/;D!< ;rb;T;;˕2C:;qF*"Ք;::5JP];xhͻ^<x2m;ax;LA99BݹSKn 7<)˄;(?;6:$9~;G;k @V%ܹJqb#ɰ:>;&u;[_;䩠ۿ;#ٻ{;K<;2;CL;[»7Z/;ҧƮ;^=;ݫa%U;ܻaAȺ <1Թs1s'Ƶ\;9h=OQԉ1s93<):B;.&'W)cB@:xc:vq0j;|;"151::c{W9+ût:ĺAI 糓;5;:r{ԥϐ)f;=4X:U:; M: ;[=q;b\5:q;;*:^n;7UQ.jci;rN9s;QP%ғ<3:h>TK9RԺ=1+zպDϻw<.Q:"‡;4Ļ&1#!;纣q8G<8yʻV4xm;]JE&V*^;0q; ;9x[p;zյ;`Y$ R<1X2ϻ;FI;"ػj^gѺX{iaZ +9M̻蓄; } +;Ʋ:Qji!wQگ;k3;Dȸ㦻Ŭ6α;4ӻ.MFƻj:8+œ; ?-x] +<зu&X:9$ tv;^<#;{̕9pYV;=91 :.;ED;7;xW}:Zz;z:*?I;ܪ;J`;3W5;Tk,û&0:;J + #< b;pB;- ;Պe=Q;;&$jn";[,@ouH;{;eG@fv;Hp: +7Q;|;j<@8=;);("m;-Ż-V}G;HD')Q9Ľ-S;TXeeK}U;;P:53'`;#޻̺;<];;H'K;[M 4ͥ`;WHN;J;ĉ#<s:zPll:+7j8ʳ; lDd^G;-Y+;m% +I;਍;: F̻"<|;C;;w; :2ջQ=y;L% ;ӻUٺ; +9 =;?TuB;{Bâ<;9(L;;#;0|λ뺽%/; u;٥ǻ;~Y~;zb;mG;E;:S< +;6:.' ::G:rЯ81d8#; ;Z_;: PY$bc':J,y;8%0\;L|D;v%氎d#o[;x&;QػAr<;D8F@;CʻFMAƖ%;b劺Lͺpλ;;ډIi;dS9rp3;=zq<~W3;B$:YZ;F;ƻ8;λy;纻lf8!8:;I<% ;p:C66z;8;ॆ<3ӻI_d<ϬB:.ؖ;?<0 ;EBl;.3=< +Ի +];G<;= fPt.<-U#_;Ƥ +M:4=lkK!2<S:5ֺ_8;zm<07Y<S~;W R,:$e;0A";;nl; }V:$;WYAջ\#.;:!Ё;0p} > +<ԻL:SN9;ym;ao; ;تCx;*2;H;{j: 8ػ.y;fúe㻚6zK]<غqһ.;M T}9%<(.;ī:dQT;{;\8ū[<05Ѻ̻%94&;)=AMh;;aM:qf89^&@3셺g3;0{OTw;<;;k<:"\P;}B;ǚZ9z:\S׶ O<;;CO<%;Ш$<;Չ;=ip(<̖;d;s!9;d ;(\^:Q!GX)g;EZgOT<&; D;9<;599;!&;;;; ;I:k軫ֆ/ ѢJ:lzD@;?5;% 0^>ڍt;w02N+& :4ld3;>/:;*P;ۻ"&;[9ފ:):$4T-no~⼻ncM_:<亨z;I&OK;}*bW<;߬L>m:{:e/<]>;l<jP:;AV%B1;ȢCR´;B/ɘg6JK9۠<׻|ת;,ꥺP w;^;Ѡ<绎K;[ +лlURhD|W;1C;!:|u*<⻣{;Ű'<+p6<&;8;=99T;O廽Uj;4};DŽ5%@yb!:w3;ߡ:19Ļ>CVNQ8?;{;w^::vfd&95:C);A; <+;yINQ; Y<:E ;:H7(eOݘ;2ӻ!2>;|D<>Zx9ֻq,? йb /&c< +:o6cy{vyWţ9F; h[D<:JI;u2ܹMB/,6 A㻻;6<}&8w"Ou;DPp;)&"Yo:Wx,GJ:N[x'; 4\#;9Ym&e ͋;M::[9"r:}6Ż}@cCd;;C;V).;q95:SN<{j;C$<+}q;; <*<19+;tqFA;{F9K䘹ؤ?ѻ8'#`81X; JdQ=ǻ!iƇ +;u37)cO4 F$9I!S;R T;M:4;T{;{g<Y޵ |; + ߺmA񻋝;-ꤺ:':Aaﻃl; ~<_#;+qC;dz G2Rp$6;жm줋;R/` V\ M(#oo;p\io; ,;K^< p:. ;ק]"컏޻9[anG:0L-;c;;һwW*;UIb: 4ĻG;D)"Ŵ@;[e;p޲:-B;:?;ε;<;[)wR;:7sTRux9C;2:$3;\;a;#w;en; <"Y7]/;ZYu9m<8;;=:`亩N:!9%;[;8O;::5<l]t_:»!">;f/h:S&1:;`X;ӟ#û A;dR:B]».54I:AJ_;;)< +X:j:``#<>Xf;S܆w<@;`nֻ"O_::)94;=;Eij8V|P;Hh;;H*;TY;=^*_V$ M[: ;%ûߔ:SIq;VqY;[ :ώC]C<#8:<: лmF: n8h;P:{;H ?_vTݺu;{8!,;ĻWI;;e;:nhh;ZQ;4) 6ȺO5lxTF!'<*]8;IH -^ǵ:l&-9 û;$&@;rO/:ObX}m;.l:+U;'<آ`ӻWg;.:_Zs'!׷vpi;z ;l:S4ע;WD:Qd9^~%ǻwz[-: +ddz׻< <;-l^;P^d};:2A<^;4s9y:+rH98k9;?/Ŗ;:k)s޻FyMH #;k,;;A,;~t:ּ;,;-߻L;WGлj +<9'9H$9Hb߇û!p;C кo;:JU!`0ɺ3c;] +i&8;EN:M4;^X߻gCx\:l&*;y%:;#<)T{~ <;Fx;P~;FF; yI: ;G;޻Jjjs;Z񡛻th;i*:x:z;i998:<+6;%8;1ƙlws[;ΏB: A:s X;m<:-ϻXZhŏKk;;λ;\=|ݮj;Oy; ֤պ ('AW;&f;u ;3N-Vh +E0u̺'KXde;bٻ;@JA<2;ɬݻ zX;w54:n- 4"jy:9R5:1,0 Qݻl19;1TT1;O:q;rѺ)%<,~׃;L;;k;/;%;dz;q!:!; :auC;:P;go 0R8ن:h ;=-kVӻ79,;<2Nhu':?;J;J0 +g:׸3U,?:8}!:;1;{T<#kYQk<ؼ)Iy+j;iq:3j1;xK;:lHt;;СNqI j}i<;OE;1Ż;v1/$;~h;O ;1"E:0w;<;9b<!<Tq:;f;;'t6\:r;Yv;p ȻZޤZ湉e},F/H2 :;D@;6ю;Q;7;rZ:KH;}< +*0#::Ӈۺ?H;Go;$hi*;9O;fܻ9;/ZAa<'5;;;kk(r.Iͺ̐7޹4/0;pm/9|g177ѻcp] ?3g[;JM:5w׸ \:;<8 :кs;[他+0y;;TwLS;m7;0;9N$;q ;Sٻ7VY^/;>:3ŭ:H#S;S$Yy5z9dn)`;z;Ի!Hy:kئrۻE-iMɼ:w24;p;3hҡ:9YfȺ;3ۺ`;%< E;M>ʻ\\<@;4;s8{;n ;";ɹd9I;`;&A9ػ3s6xLr1X<(+Zք;;Bp;o7p;o8;€:?< ;Z ;I;&3s;/ +[C: +%ED~!;{ʝ;GO8;-hy:RL<ղ;^%;?;Ғ%s <Խ:j!7:( +ջZ;~A;K0<ǧ9{[0;?;,߻&t;59K9Yd຦o; DCcӓ+<~k;@0;Oy:&C<)Zf1::Lt9z<@ <rr < ;^};Mػ0:n;l;';R ;19蕻O̺;߆:aAm;:i3.;k;ϻ6=;TI9X;');;*:r9LnI;%;4<:ש}%W:/<5m;8ٺH;(8ٵ;W;}X;W/ûz;p;74K89~<:Aٻ ^;:~>Pں<8hʻd]9:箺_i;Ӧ{Xһox PmֻiYZᘻ2<G + ;PE9V[;B;k3"p-}3;wкU(;2;:;^;;{;ن0`D;n p;/B; +c(; 2;ͻ;~2y;ڍU9 -NR::);I9X˻f+ʁ2j~;S:N5;y);::3;'ӺJ;s;dJ,b𺔤;&bQ;WV;UQ)ܚl=; }wEnn<.@q9h»֐ +A;hߺ%P"p:QV;譻 :Ep;$?Ȩݏwc:+tV\e+s{d9^9B] ;jhۻ=[<+y,X:8+.:;HI7t;9r*W;!::J\9Z9tQ69XǺ' _u,;j^)WN:-:;g*}=$F%;1R;Np̛Z;# 7;Ż͂;:NEU:⑂z]&gZ;q;aq>R8Wpd;4MڵI{;eɻ ;F/;1R + <9;:;I5hO;`Kqy*~4@O%8t:;;κp,e; 2p;:<$;YGX:m; 5 w;xd?Wl;ɘs$;;;H F:;l;a:q+;$ ѐ̻XEy;:5#< +q;שR:a?c;[|:d&;y;Qw ;8u;`:(9A 6;Kf;)n9r;^_D2by%;yĻAX'q;<;9cEA:B <#<bv=py;:>Q;~@%ߺg=[;Hͺ\;Ⱥp;D;jI»|:7;Hb;z;|:bR[͘փ_'Ǻb ;;_7":+лւ;ja;pe;~9:Dɻ|кY:zPZT};ޕN;2o<)0/i>;PŻ!D8ƻg]㹉ۣ:@59=ĉ޹RO,<{0MR;[-xwB$Y;T_z64E"'y;v<%No)xϻO84;'<;;"V9[32@a; ~TB;+P;s;; :<]'5z;ܡ;:yA|;ع;[[>>S5ۃ~ <$U;:Ĉ֨8;jn:)x;:'Ȃbz^ې;K H;@0<F7E K,;Ѳ!챹.:;KL(:C>#ߕ^кM&f;ٻoV0M :J:AMWf-w;lE3k;Hc; +93 ;S˿UĻ{Q,;F; 'кy4̻^;m黶)ܤJ;Pb=A;2niቼn͋#ReC6F@;}M9Rw5_;77~5`;f;20#:!:l<;*<踁S:7h3d2!$G7ۻܚ:+p+O|cqx};[ev4;{J,134;6D;=ƻ!GӺ; +ye*i;;)Z+G8ы80AHOc~:ͻLZ,J>);V::73q:eoֻ!r;>4;;F<;Т;ԫŻc:MO6;ƶ; +#쨻C :Jq;$׻;;;3B ;wP滢8fD<6?銻R;>a;Nnsع34[k`:N뻖 +u+vN4; ;?ϖ͹':yg;s;<;F}:ȓ?;I<&3< fD;_7HU#;8caa:ƻՄo>;,nH8?軾M4_Ȼ6|<}Ʊ=Һ +-g ;X1<` +<™:u +3߻Y;]IM<<(C¹Okpk&;l6;!puV;vq;:Y/"; ֡:2:ج:y}.;j:8yr :ᄎ +"(ܰ: ;O14[687<4>5::lE.fܺǻ':Us.{|,KD:v:Qm~}1;J9ٸ#I3I;bSZ ;xƻ:8[]9;W+;ޜ;V[A:B<7ӻ:Z+;"Zŵ@r#ƞ;<h;9Fz;&%?aq |)LE;[; + <: 9NH߸w;,:;b;(;]Bk;*:ƳZPÒ:cs +<;n4*8ö#N38).!;^ۻ"ܻ捻%;=л::D()߻?e<[p:M8; <,OyS;4*;ѧ<=K;q79S仝2;l"{8 <:_(ʺ$^;!D!:ّq ,;0Niug;Q>;:}V|9(;;:9fAƘ:뉻;b~; f;Z5%4;/;ڲQxC;{Fw; 弻$/&t[;;#;hV4: I9;Lu;x9ZYo๻꼺߼v^D;`; :F:P;s ;û[c:N)?(΃;X18nHm@v_};ۺ9%a9޿f7`:bK/]Y٘;2ẳcs;˹I;ˬG;xp +ǻ?+:ZL:7MSZ +_7;թ&t;O?T;*̗;HY:U*ԋ;_ 9;3;i,_;W:<P';R;MH<#,%78)7<ݻr R+ <W=;:a1ȻG;L;;hۏ;w;y8G@ @;~+>zQN;ֻv;@ ͺ)&<>Yu9=)m|0{K;;b_;n0;gNظmt646;;κWûy;F;M9qZ:9;YVǺhW4(ǖ;^0Z v;˹3:;7 <~Ɛ)ʻ8;V; rt;mI:3vܻ::&V<}x:E:;3W;ȻP:K5<;zČъI9O<;r;_;; l/;5;wu;֢ڻ߯;AiR<$]_!;ջQv)<Љ*,"<;õ<8e;-җK^:<_i@:_<낍:_{CRnԻD:C_ӳPO:N; \; +9;;~;鞻B̺)]ҹ_Ϻ%JN:?N;pWbW5|;:}1q? 8=y5<_x;`ߩ芻(ˆ:F;Qv;x8h7;8#$;*K< F": #;K:i)O;g|&rV8DF__<-܏-F:}91<+9N%;Ґ:sǻX^*ɻ?;P;!;^%:hi<x; 7wX u:@A ; +\;0T:L0:B"gK1Y;Z"#";( O>mj;;ATZ*ƻN;k;2S;5#A;j$1;]MP;L);Dž4;;d9֢;;ٻr;iT=;*ϻ;$s:eLb aehAݫ.G:V[}#;:S:Үf: ;ED9ľ5;ar:YJA:6e5:::di;?*C8Y~yLG<1X;2QػO ;S,۹z:`޻)cЅ{b./h`ue7;*:>@MŸ:ؙ=:36;( + ŅX;A\;a vcUI;#<-M);䬗;S<I8{o:):yy: d3؊NUs;ɻE<+2A;j<1+;;SA#ctm;܆.g"; ǻ闼yϻ]򤻗^:MM;o"Q; <;}x;6:^qFѼ);O>;RE`a;@cĺt?<;ڹ͍g(<84<<ы5@$8;[``<ɔy6aջϺ}T ;_ ;܎¹+_;,:;r;*&:p;P/+>Ÿл@ ;2G;K;`< ;;H皻~v=m: ֤j ޹Ǧ +<;;?;X;;P'9;>:8{;n7<ב滴 MSc<;^~R;Y;;igS;%<^6a:Aȷh:ZT;6;/;B]ֻT+W;-~;9Nzj;n%4o9c9><-lPT;;_=;Zfo_V:ȱ@. +6!;Ě=;;L:-;<;~;F;& :/6,;DS^;; :B˹| St;P7׉9R:.f:˝;馻c;,m:<,:l;H4eB;h)u];;Е<ۙ;,F;0!<{<'>;F'0; J;$;;n::$<tI~;rIG; A*;$g:C]lع;*v:*[RdX;UN;(=;Sͻ*<kpB2:5; H:Ue;;C׻דE;;[9'K5Ek2v:ՕͻI<ԺEm;0 P;^9|O8V;g4{M;;3Lp8U@s;jI?M׻TE8ocC#(<(<7ȼ"; ^:iٻ~>[ +M<º.ֿWb;ab;Pк"X{;EI: 3#</gW_;a<~3;;&;EP;2;SIc7s{;@;W[;U;|0CH:\ (;Ei9:c:;@V|"C »h[<ߺ1~=l0::p?^,(˻J."n7<;;5q;NֻYǻ;/[:߆}к@9`:K;˴:P;P ^h;hx;/g;Zλ?9Xw,(9u<9<]_<D;ֻc!<Η̼Y#ZRK9*;ܦ;h-λ O;]XJ:gU$<3:eSp;KNeT<S;J'@8/{5κb#@;QFջjZ5:յ=alKmȦ E<ĻE6:;,:MnZ1=DJڮ;E;%sͻd58%廆'Ep|͒oa3q d_:3q-<^afڻ9HFD9;b;-w:i,F $; ]:I;q;?^%0ԻF2yR<_P~;p_a88;bܻ̍r;&<`ܢ:J:(d:98:;32A"|]5>3Q:.;+;Ǻ~?e;J ;w;T;;ڽgW RFɻ2;|仙mJɕO::;*5IKY^8;;kǺN:r;i;V;C;M:6$;Hݻ ;z<:S`cv'RY=;U6;lb;;$ϻS_:;;7j;J;YA;ֹ6;؉w@VKS:G;oo;>;,;;6-QXP8՜;倿/ ;VD2z`y+;9@2u:ٻ-m;0䏺N4=Ǝ:NWQ:뎻|O +8\R9:F;lT:][<à:<\;Z,%*h;vC:`;f;̧:,S^gX):1;(#;p;gHW9W2;#;0ں;h7;Qٺ-y}:Eǻ*ֶ;:)9*JŜ+Xʊ6^ <ְ; ;1N}D~HdC<ښ;%0!::灻yWry;aI:6SE:2[LNC;DR;; <*Z;b0;ި<S':D);qn[;kx;<< O3;g;,<]ʻ>NcK:5bS);/2%;HF2BS:n1;û%;@;P;]%;Tc8.j&}\;QThP::ƭ +;q+;:RX[ N䔻好m|yGBŕ98kv2=:9x ;my ;^;y;NnK9^$<:58:1 m9;K7Nǻ:E<5:-ޠ5< <֬:"ɯ;C;ܼ澻j@;lL;ht+YX;"#;+m ;( w˥;**`K;2:L:b;Bg 9E8w{< +8d:(;<ĺ8;i;woO:G {:;;{¹:(peo; h;,<悝:߻i;o%:ߥA.^`?;;;ݚS:@9\/< YB<,H!E<;]u;ogO;.=f:{* <r:Iͺ{Bú:`;j qID:cO9 ;V9[8q;;4H?fl6M|Y@X`rg}E:RX<f#~2;&!*<5j;Ww;a;;9j6X<%:i2;g=< o;Z=<;M:Fq94;L;^wۻ8;F7Ϩ`;<x;;@p'kZ<[֛p)=܎-2;E-ۻQό;1<ݨ鹡/<٥IA;{<1;9<#k:h);.;)z^0d;3HIO_;/;WjBʻ'*ך;:YfJ] :<<f6S<;ۻͻK<-U<}:v+Ff; ;:F<<;zl;H%;ϻJ_N-;G:'/;ǻ<8;2=p#6';BE[$5@jX,<׻ ;1%d;;1dOC p]wU8:J_319o~>;WŌͻV;::r{=`9sc1;>; x:;iqw8<:f?Zg!;t }i~;2: h1QIY;3I: +<5\:F;;@d<ğ;+9ӻ<;sau";+;q" ;{U!;4L%:;۪; +<w;9&2;ą;WO&@;;+4k_8*;A1;L <*:a<6:{.;9\6D;0F.å` +0ցz;*;ڻ^:+qB.;ʻi7+B_m͚;J;mT8t7Ln*G]_!ǻm;&aWt;Gh;y𭹀!FirH<;zƺ=MhW!7;kGg벻P O?;X.P$;2bs-:T` jO;g@j"L;WAW.4ޓ;ۣ;=۹);#uX9c;)V;"9,< غz:ֻ4twf1;_h)%v*h;ίm<f8>k;һCػ +9 Q;A:֮$$6/0i0;3b=:2k&c;ޮĻ!)\;]Z3;{ߴ;?;\;;;Cd;jzƻB˩d;e:BqĺxQu&X=;(A 8,y;.9f9:'C;P,;옻hKC9HKMfaGԒ; "ƻ:? <cj;2\{Y$;9RQ'<$;BD;Ym0.<;"o];lNӺz;Ü;b͞;8<#:A ڮ;;u7qT@K:"^û%TQ1a ƅ;ny1+U: +:9^82}䵻"o; 8*>Z,!lȻo @X<0 R 6ʗ;q\+d3;>Æ~;?qr6N;Qlg~:%w5URcӺ:wDs; ]0;PʺEܺ;|,/o:ȄD;w9|滗:<';]Xc7ɋ68ۻ\Wn7;IR%:vК;$Ȫ];#:޺B$16G<,z9b5*m<x%L;76<-<~7;r;n8)9h*<4C:ܻ쟼}*~@3mF;];8;ϻ1\O<:h v:yE<9J/;Gg;FRH;K:;+ /~/;N):i oK<ɜ:: ;64Rqu;#<;5@;&|ѻB_8 *߹):;lktf;)-1 :d ס&<<Li;J;R=;0v;JG/;B;9v;9M:zi:6;D-;=Eǖ]·;ej:j;V:9'/P;꾎`M%1 +d9s$<eb;N!߻;<1<\wdײ;*:~~\r;IUY;L\<^;%u;m&E%;x;(:˘T9w:[;5;*:v;şһQ4'< E#<$;<5t;κsc;;ȻH<q; Ɏv< @;=<53_K˻ +O^;*)Dui Ŋ9U,FOiP;zl;/Ke<om'[\\9R<}w:Ӂ˂!Ź%>л:ں;3];8 ;ʫ5;^_ ^:dm!S>;MAw;;Q5;Wf<G<e:9<7^P˰ݵ mZ;;e"<>6y\:Z郻:mR;H!oҞP;O;nI@ k~_̥>Aӻq;`:Xn;cT#<Q( :ǻ: +;LX;»(9y]-;*u1;&;ؾ<5Ca*<^uO;WAV;gݻB;7VMO;NkQ4;һᘺ~ԏ7+ ;Fۻ`q[b0b;m;c_A;; ѹ;i-9%:E;SԺCRJ:w8^;e>:Y/2;AF< h:b|l<3ܻm`2Z:ڻ::J:JNr;;x;VꎻFij JǻcMs:_ǘ;"ɻ`W<9b<&F7œ;u骻u:cz;y:؉G߻I;;?f;:Sm2*һ_7~ Sݹ:EyÅժ׻AQ64V;sh ;ū|×;3黰 ;v;H#κҝ;%7HrmG)!!/;%7[:wG&4<9k5A\!aU y1:!;;2w:s7b;%;1KP;:ley;GPk1ϻXzB>;3-9Ҩ:UZ :8=<; żI;Ő;Ղx<K1ֺ)S );aٹV2ûskm>?th.;Kٺ∣0ӰU:xg> ;.H. ;`;B8Vĺ@+

j121W&d@: +r;1"Iz:;:+:q;s;qdӻ,$<;FE9K`mm7;eFy%yhI:e;0B;vۻ9Cfn7 kb;>l; q3`@;{:);xN8Ԑi`X<Ժ꘿;C;[ ۻ$eA:<1:Mk;C/: Z:w3i"ں4:u8)I;!;&f:,:&2/g;Q7;A;{:I$ıKHfP; b>黛+<ʓ+TػJ 8<(ϻP0%;T< ;86+Cƹ;t <X|?;LGhm*;'ix[?Whv; >;@#晉a-J: 껺f:}ٖV; Rɫ:5Iq*~9"Ưݿz?3~N;h:b#*e;6;w^;tN|j{h;$U;B: ;(:J<(ٓ:;OMA<$;T3ŚtD r:E=; <<<ۙ~.;;o%/gfY:Xd{6:+]荺s;;IN;;FJ +,ŀRC:S;S;ݻz`:f1e}<`r;1PV_ Msek:/;ИJҶvUH;PR^ƻ=;酻.th<̦<븄Ogv+.Bں V:s};tdF<ӦϻmB:0¸ߖÜ;W;B%HҺ}?C;{R;e+;o ǻ| =htWswQzOںJPoJS2: &Z;bW;6:(麩*}9׸:B +=; 0L hP˻;n;NY;Km9/8鈻YO;ai[*@ͻe*97R;5a 96ڻ>9; yHD׻<]:e*:P$r:DYw'lۻxt}:7<9G;#.̻;W>L<]L仢:́;?;\績:Rv;&~ ;^F:߮ںӑ< i;CG<ۣ:T%BchҺy;%B:> ;M;{ͻ~<ɻ:ػ& < y:m8;:mU:绫; ;^p bʻrջ[l;G\5ЊU;M:Ȣt ;ؽӘ!cT/٣;gĘ;;}Fú;Or$3|9;;:; 5-:oTn47{E;yM;ҵx;inʻx;5f;:M7gj 7C.;xC;[eKĹ#/:q'k2fĺv5<,ނX98;&Ӻtr;P{8RR<3;5q;5¥;_: %+:;O8;!*

bXJ:bmX9Z< Ӵ ;ﴹz :~4.x;e3fFDؽ;`x-x n?9<~5 +H;OSL<;/ :@<2<Υ)|I^<Hv%3Yǹm;>v< N; ϻp滀M;܇WEITp@)̹~V`JHv:G;Ih5;jk<+; %=;dA;lK1K<˥;OHK0%2

9R7;溞 ;7 +t;Fѹ0;; ˿<@ ;R +`pT;͐tp$<ر(@\<ɥ;T*4:U:&ֺ+;1An8@9R+i8;l8;$;">4rAQj;4;h;E:O;߽;^I;G:*u;[7;qj:"D^< ) ;6s;:R;Pg};NA$3v».:X<;;G:T!T;Zr;$;S<+7-8M5:񠻗m`Ǖ;7<0x:%nې p۹`b0c:jg;"l#a: +L<]K~;~\ uwzɷ;oû0D9;WBy;|<;;)?L8wOT;o;XZ~`<;V :$:8:€-<;?.5;;3aI<_;1;ev;G(Z[M"軀n;]RH0篻5k<{ +<;j( Zt;9* Ļ}¹; +Xw"y>d ׻6J~;z ;`ܹB);**<8:fS{1_; +ul UZmQ4֋;;sлނ +vG;PPa9T_;Ҋ<Ê<̾L;-ܻF;w<Ȗ[<Ѥ~\;:IYI;+ ^X?;#9  w +b$] ӻ ebP ;[Z/ ;ۦ<ѻC +:_> <;1)Lg:׻ + IO;y`к :;L#f#W9:О~;Ƃ%;ba:hjw<^Eغ^;;3^'W\[^[*7q-:e|;I;M{$|r(;$:.;j,$90<ś;2[;;W;H;g:MB;2(Q(<|U{C Ce; :);jP;6;7< ;;< ;"9,;`;H7<%;:Իv;hqY:m";҃!V1(%Ecӻu;fNa/:@cXtEIWzpM Y9k!;BZ{;Yd  zqs;s;&;6v;KJ< eC<"aTA;zŢ<ӓ;=պX3:ݘܻ;{;6Hk&y;Ii-΄HF- 7\+#T;i-ce;JkT#tՐ<[21[И˺q.;⛻䘻ϻ޻ B|4{O#<%i;4i;||:};ݻa;,WW;_;?=:B:Ü1]< X;OS3[FPbI̋; y:';|`dxS!Ag;*; 8:}?ܮ0_h:IA컍w5酻J;Y9⍻sabE+N䦺?iٸ(;iԹq`@(:|;j;Իָ;dvE3G,6ƻr#i;?̺妺%黻ܩO?,^U4vc;=,;c۠!y:<;/o7A&2<6%g8mq&C;<\( N;:;[8E:pSĻ5%/;Kѻ};;# <5u: ڻν4@%v;Wһ:'˻;GIsA»ֽ;%Cd4(<<|+x: (u:Sa;jz3(Һ{j7=| +:<ƞ<ԴEX?6;J\|oQ;, :;PgOd;g;R: sg0 FlRn ?ӎ;pb һNuP;'i;껿;AYAuO;7:+,9s;e;;]Ti仈&Ļ;p;eъ;>%IK5;;xB$9Q]U;;̻;ׇ;_:";(k<ػPæ;W<4W؞?:,ƻX8;(r"1%D<7׻<:-+k:<e;G?:%Y2O/<29T9;q<+@7]:1պyϻ~xX{Q WEҍcO;i;;JL|&Y7?B8YҨ;!;ZźQ:0tq;xS;?\Xt ֻR:U< _^g;u;|aջQ<1%XH`,8y5<|;9SV$:*3:=;UE::+ܹ$;.;ޏ;dŻzS9>Os;r>x> +=_KH<5k +6<g;:1;ka;k;؊9~ZgwܲuA;݃;P*;K;<;d[;h>!;;TZ<`);:Ph6HqtS,<G<(: 9.;w"W< zv<"<}ePAd < ;$#;%5T; 7 9ngav02K$b )4;/@U;E&r:D:lɻn9x:m;0 ;ŕ;:;|;YeH1+&Ak;Pq<-T>dt;;9G08o ;>;v9o<0wM<P;1)<|h}`];(;;Ki;C\<>;9;_: Y< :<*ԏ;;9;('W`DO1<>{89;Fֻ`;qx6M8_>a;N;P:9G^6BK"*u88;mrx;"(D;3<Ƿ< /;{<#<:˶ ;#<[b:滨O@<{L;3QS툻m:?:.;;;NS\;0P);;)ɹ5C ;I<-Y;);m.;&:D4:; 'TD<ٺ)n=;gsS{ +<*$3P:<t<:NƺYͻɌ:Eޫ;,\doȎ;GHz0;M@ͻ,u9u}/`;UnQ׻Qֹ +l{<;E<:i;Fw$<3'<'C]*;l9/]]su޻*: Cd0yAD:ku<݂:;lBri;:m;C\pP뇻C:$:7:I,<+";~ +:;¶%8F7Z;6,8O)t-U<;_;0|?:;KU VT1Ē1Sn j <);Ca;ɑ&-:S;VCJ:%01<[j gt< ;xÑ;f :huu:yDP6;;;B֏<[/0y?oqV4";Yu.<q`Fh;R; /<&4;{蚻̵iB<H<;i;Զ;#1:8U; 4:h/;{:^$;LS<̺He3;Wѻ ٺymQ<8HJ<=۠N? +;t9*!K;QIۻl乚*Wi+ N(ܮ;P47a:0Q9;<\d<<|Iw;灻re7;o;þ>qQ;D;YI!:̻]E<2s92;^-W,+b;sJ[ ;ؘ;ɇ;C7>+<ðA<ͻ[;` 黥;8q< U\3z;<"8l<9Lp:/;__;lw` ;3l<'g#;IHetH`w*9KK`8\?<+6E<< 쨻l;_<_-<;:Lm-N%):_/*g(0L58<];`@9LH,#x0̻MD˻^:sh;;]_;^N;JX;9:@<ҸK;0;o8b:Ew<:p!b +;B ;̟;;*;H; +;L>?$;e\޺;4; ;븻r;q/k:%<Ǿi<:2E;7'H\/f;h9L;ɉ<[D;!;u<;#;<ȱJ-:,"_<}"<0<0IT;r];uL +:ܛ;KǺ׌X8;R<;<A6zt&9D^CM#»M; 3=;0<e?; /@jFkE;M;:):p FZCE?\M;X9ۻ,h|;/:Kixʛ;p%;$on%cxC/c_<8Fx0넰H#AK<|./;#bH<(`9۔w-;<78/H8^;Qϻ!wѧ;;z!<,It{0sn<>]s!:o"Y:I;8; Tѻ2L:ezY-7ʨ:&$[;i牻؄>:T:.C:I9I?Y#<4;$Xt :p<:Hܿŭ;;b. 亇Y;0пh)<;T;Á;gh;Pk;Xٻ<X?&w;Z); 5X*:("< 1;b;3w" ԻA.kΞ;n;W;rSVO˺Sq;jt'ĸ:ƣ;e2;H?:G;,7:t~;eW;J;;;j - ~ӳ/ _Yط_;#\λ,EѻB.;+I:w#z w<.;);;w;s<_[m>;6<ԩaMU<{:r>$b0l;);]2ٺ:;m*M;H^u:"<6 <| ;!A\#<;ĸi;Vc<:?\&_x$%:$;:q:ң< +COz;4:"a;^9:,^;?$#b"<۽;A;ؔ.:&2|:;ӓ8];ͱ;;&tO';,; + 8<^W2Y;<,o;4% od:K;i<Ԣ&:D<+R<;˼2M:9 +c@;ȼ;"<@㉺|@:$;;J Ml";r #;Jl:;*;߆}:瞻Ǻ{:7xo :?4=AlO;Ļ-Q4;b.9nˁ+\wŻOZ7R:;w_3[;bu7lf4:łj~'ẙ!;3F:#:34^y+޷5;KH;z:5<[>;TJ OQ<`;5)Jڹ u'<];Bƛ; Bx;?ZFuv"u?,;B:LEQ)6к!>Ȁ:@@9l';;~T;>ގ(vSP9."ŕ;;zSz;?y[Q5&;;؋);AlK<^Vy;q5$]v;(:<;s3C:R";c9;t:OR:u<>Iy};;KoY"-h?6M;;{6:=Dث'$9<:9=<޺û S-6J];CX;e<,Xs;̻oO:;ڀQi-:|ӴNM]< kUK,5:;V7:3f;L+t:"M;Z;sl;iol@e;:eлcJ0;B4:Nq H8۳κ;fά1]%;;BR;f\+ 9;γ W! P;X:=;F<;*M;ޱ:7<&;z[d.ϺFoF+gһ;:<;@[; ~;ݻ-Q.;\v— Jט;>(i;EL;;j-8кGKh+]ֻ;;yAb"j<7'mQ.9;;mb:uC;i;e.*J< <U:.;=:9;&v]":; ;s<>`\<~hZ:2`L;_&;}:\;Vx G|:69vCmRQg7 +7;Dnޢ!Cp%<]sE;+;g<(A;1{z;W[<,8);(Bʻ`ں6- f$軽^;n +<n1ߵwJ;L;%{WaO%rQ׍:D!:`;>;#лp6;r <9k;雐:B;WB]8a|ƤOY;E;[=;޻2úeщ;;SMڂ-;((;f4O<ȜON3m:"H;cy:d;M姺Ek9I:;% <;CQRe< 3ˢ|  K7h2;!<7;8;aݱ:Bn_<.ɻex{\tA<+

U;㹒HO;M <hg;84/3ֻ^y:Pd#:;P;U+ڻOQUfu;w:rf;]'Ȼ;eRv;kZU #fnB9\;'Jo8<\J5 ԃ;DJ< +:W/f\O)P<Ȑ;eς_L +:׳;*y;1[8JpO'K;;lvE:O )Fk::+;=ͻqƻZ;IȻƻFS:;;D;6;օ7۸;jU9$;{ W{|WK=,p;N_!V:s3;9wjă}3g--˻̻wԻ(O;ŝ;.Px;A+y- ]^=\;d:ӻR;,;ں|':E5bWg +Z ::9<:m{; 58qfX\MEлW;'92;E6<f;;J3!;^;+;S$bH;q!sl;(2:;" B:dR0T(M; [;fӻZ<;+et;8<?< Gu;Xo;h<{PH<7;/''Bx9ںry';;Z:X|;_]2;f;'O;-߻J;4eNJy:3$@Qc ;u <$+q:?;h.+_=;sRO14;߻Ⱥ3ԻS;Rںº_>M~?o;; +|Ȼz_;^;-#ծ72ӻ' WhKi;# ";S :6Y:? *<u6GAh,;C ۺ^Z;>;p<ƻȹ";GѺvߦ:eV0~;$;8;\14?+p;^C;^>CZ'̻7-[򧴻 j:1;#߻H :e;` <#;Y;U;I<)wͻ ջe;h;{Bmz198:#$@<[ +W;0;:q`s|<0m;[;;I ;;[.8:.f #9'5=;[fy,̻$uFP;z;:;487Bл(; +l$=}܍;;3@;!d;ͽ:`,;(&<2P;{$]نUW:\5L|~>ջJ:|: 990Ӕ< ޶;t;^3;;];@;*";!C[ 93_Ujw#:<㚚e;z; Ȼix;Xo:\ﻍ;Ժ]0C;g:.d;Z;;?TСr=:1ۻϻ +B1nѩú' <?.;@J;A;G4{;M(TBlPUe`;i߻0 ߺ+ͻΏ: #w+I1;V»ț2<;h9O*\ !k* L;L@;ei;W9 Q; ,0S{a:Q1: ιc<`ƺ]k9.:S@&旻:9ۑ:2:9*;C9E-;76];|fvk;˻N;= M;^B8[`l;sG U9!;_D-ﻶ1;;:+>޻ +)5*ߐUM:̭h{t +7;9;N -9 :`;f"};f;;HG 6;i#[;~H;ex:9zYb_K: ;2;>:'&::+ :; e9S:tD:?J߀ĺ䜻M0dY޷{fk$1<#7h;n.";g;eo<9;b@v;ÙoՑ;A$' i;)y;Ć z;;ȶ<:qr;h:_<];ht:!x; rȅ߸r;+Z(Ɯd|;9k;W ;Mu<&;笰9%u!:$F;%:i8};B:U%:Z^;d;k&x,;xJ<?B<0ѻfBTG9;AG)E"<gЯMc>:(N;Z@\[9<@<ܺ:`vbc:Xp:o;{ϻʸ&E'i :sb.;jnO<;Ά];R:bc<ƹցJ<3fQߎE<{IGs۲R;wC<.c;1<X;":r,;Ur;>;l:;]G8;p3<_;L;b[x/:vM<5+:k*;;;:2;;F;;wO&;[QPԷDxk-<:R; H ;wn?t$;y5:z;ޖg +i:m:BȻs8h^>;h޶;;;A<XC>g:T8"|AbɻVKs &5:Sq<]z ;:\<<ݻE;;Ղ3;|);<;(; Qj;g;P^;qİ8i.;% =;Yd6;{_]κ4;@f7 <_mk)K+>:Kq jc;WTN;AG;U˔<`; <^6~r::-;nJM<*4߻Go;IY:%)<$cT2l~ ;/J;w ;m"c;v{:-_;7,<=Ļ|إ ؂:B;ƛ!N;7bq;A;!|#X8;@i5N4:;h;9u+;;.;ב\<Ɉ;:_ڻ v >;bMm)9;~;a:.Op; +[p-;W09;:;12Y;\;~#qnM: ;5;VM;D}mE;rff'<WH4PȻřk`#8k8:c :v::SP;|5w哺e| 2SenT:C;[Y;~;\4t];;%;]r ;^2};';W ;t7 EeTQλqުfWq7-}P{*:όR;;8ƺ=r#wP; t:M߂R-8@M;+P;:O>R; ߻A4hg9: z% +鼺a[|;^;e;;BE<없9:;؟^ߙ95/?r͊/;|+;nϨ <% !<+;U #:_*x:3Һhʍw95w1+k;;9k * ?;IT;Ynǻgs ;UO0;QŞ/˥k6D:e)w=(;or>Ļرxһ›2 +;b (;\=oS;A^-Eϴ:@Q<>Ժ' +:3 ]V1̒9Ug9x;a(ʻp^`eT;,;֢.;{缹5<͡I$:ͻ&.: :'ȏ nB;(@;;H?<:u;<ɻ c9XzqtnU Y;<uq]; X;l!<;V4;&&doMPp;;h;~;ou; +;\<7:D|껀S\:`;hP*8].) 9!4I`8 ?@rF:Ⱥ3<:E'9AE;ؔ߹|<ݭ(;|9G9V:yM; ;?Vغ}T:`-;BcP:9vA*޻-.Z;\;:s:?θ*;`3M̺+Po<鯎,::m();3 ;<,:̃ S6׻.kJ€5f%<;~jDf +O;$;r +殻HX@Gҟ[;#;3+;;hsl];$;7u0;gNl<9M>;ޚ$K:E;츻#hR6\; +;8d;* ;nyA;;a@.MQU:x +: +XS;{;b8`I gq;qhB;;J/7;Ȭ;b)ڽ㼃;2:<9ߜm;=^);#;J;9V"ͻK/;걻B=ܻѻ% ;ý7:C;ѮL,y3;_o:9az;;ǰWUS< B;q<.a7?'(V;<1S;$)X:~۹93p~M:G^;r;\:; +<(H<6kd ;b q;T޻i*GM۬;kݙz6.vJ<\af;PLN;Z;T;|;_ <u;B;;Ȼ,;fF:w <%V:o:eŻ5]y@; +E;X;;OmX]ĻU2;h;)姻c"ú}};XQ<#:HYJMO:E;x +<;3;-:-;c;};H;Y<F<(kѻϖ;mzjlLE:BCxUŤL9x7k; 3:ˌ:;/; %ӿ:\׻x}@:9;} ;!: S,)M:u:R8,cQ>_0*>̃:JK ;ņ;gY;NCcW;\:cD?e`F:;NY:\/*<㭺Ć;r1 ;a;i;꣜ Ⱥݬ;8:ػDmJ8E:6];;=s;eº5Y:1'%;*9O$s&w;ᬺ6ԁ;X92;b@պr;;;xr;o;;9'ؔB;;Fz;;Y^^#{1< :X:f D|땚B/;+:<;CJ{Q;8:1;~;s;2;su;':whRϘ:(e 黆Ω)<*g+:;!;y;Q.:;[; V;Sp ;W5:;;~V.<:F9S7E;Y?;1;׻ 5<$-jg`׺ȡ );t3ng4(;M\?Aw:pI֥%9{A:ٽ01T-*5<wqSi;; ++7;Lֻ6;[$<|;yv"(:ĺ^e;@>FҺxRp^ߧ;{f<:SֻB퐼oc:=?p4;hW<껜%fE:X3y;6;oҷf0<O%;MRi;ev;`5:P7zj;Id;;ѰD<xC 9 -;!"QϏ.HRT;QԻ,9;|A;zԡ; <{N@;k; <B*;$*-;;L;9z.:Z˨WIS;nj#G!<%e%;x;J# +;c;N3ػ<:6F:;j:ŻCu/D(E$E߻3=:vAɻ:`._;<[7J::';X;2lu@C|;;\i1h;2T:Ȼ;.<a*bci ;4sE:%; ;;5:%YM<՚9ŻZ܁ޔh; :r:jX;UD;D]#<+:O$<}w/=Dfw;:n!;i.:^.t +:o2<3Ο:%һVL;x|:*,:$ϹC;ނ<ǂ<:V:|;Z";%:d k⻀;Q] vW:[>V ֣;C";{4ӻ;uKC[9Ut9:A V +?;؄ƺy6;F:;hC<4 Y4:<$:y?VK-]{j3 ;S;Lj7G +@Ga;L銼mw)T>1W+a<Д<;O; 0I#t;PUܻ%;cB[,{]D܁Ǧ;O;b1> :ǢMmR;61 t -W⺘V;(%; L:M[ծb;;щQ;1u_;fIRٚ;SS \8qˀR6:ql;m<=:`: C (;+|*:R;nWA5;iQ<9VAi溂x:4]O2̣Jir;B;::K kcc:ᠺ;b/A :;j#<2:𪸻fMs47А: V[;N;yy;]:sW +aڈٺk ;쉻Y x +u;;;9w8~;js考5;YH޸<;`;H]:79;X9 ǩ>nو¦$继:c,խg;h:ncº 0:P;\;;;!BiF; :;}B˽ M ;R?<<3:Ȝ7S3_0-.xa*;<"c9􀻫d9O;d/*58c1;Zr<;IWM׋_V;v<*3޻<{9v!û&o\Yٺ.)պ<|;,;5w<:p<*9]@um*;b;h-&;K @-";׻f;M;ZDQ<+':fv;>d6'&$;7:9;ޘϙ;{\4ʻDQ[D];g:e;;/rm5]8&<;: <\rz92DZ +R:qϯYѻ+D3rx:TN;S;Ap;+_;:pU9y';]So;fw;af;;1Oݮ;`h:k;,2>:;^8kDK< ۻ=ϻBw;br\;ԩ.}} :;Ϩ;j';,_Ŕ: 9\Qq[Q8Jy{;E; B;mͪ͡<5V(sǻ6juq;)w9a:u@<3_ǔ};Xy6X9EE<;y;;l.W;"5ܻѺ R]r#:%;l<;d=ԦI9 :T c:Sa𗒻x;GxXI F+;ٺ"߻0"}96; ;UW<}6~лnV_;8Իb!T;;zݺ;#3?agmKJv[N +<ݻλ|;$u<;E`u쥏HdK-8͡9+PX;#S @n/R黫EAH;]2R;Cu;y)-<;u8NZ%u<#@;Y9U˻<Í֥ +<#: 7:bq㻻S`9`᩺H**)sO </Jw.xQqqX5~{ŵU{eh]Ygcdxη+;;(s;4$;۸L;6;ޠ;11кW+?뺻>;<{+e:)v,A;;a:X9 +:S;jͺ];S IUy;̆?<`λOL};󜻃ȹM/9 9:Lbu9G9u;6-k);{;9:ɏ;xx;γ`~K:r4; +u;ؤ0)#:AM<b;j;;$:Q;b;Z}M;TK滁9;4;o;N_, ]ۺk9,d:r2':k;~{<"D>;RۺF;b;9<^ .2K &Bto; VJ໩x:=Q Ge;+;\λ%FT= z};H-Rs*;9A;;95ϿQGX;Qj;owx ;ė;n$%dv9`l;:1uC׿va˭깆a:5.8%T;9º#;* +0; K", +ΐ;ZH:g" +⯺XDl:RD߻2L;4.${;ҋ5ZЄ +4FI;} 3;p/ 9Z;a + +*ӹ +ɑ  OK:#O;h  <Ƹ_cU=V̹m |m;Y9v,l";5;:V&:̔;]t77;ZXj;:?n^.wJJ 9e@;j: +';K 6;(ѺB|7YWX:]y;Ԃû4:]?G]&b;;: Pa < b;Ż Ę;U <;ֈNB<';Ʌ:M@9%:0>;dO<$K#;g;Wj;}^ζd6O߻;KR:ۺ8*غ;^;;l2F9˻ɢ}.:e.;bt;طya9hL;9B Q;gl9:`Lm;=Q/Pʩ:U;k!g;`;mF);dx;n;`b<4gz;FݺS+#z:)q;Ʊ?S;|N b:Tń:!Y6ٗ9;Z:MK1:;;};09ػ&e/9;e~;굻tN; #f)!:;uGW:QDp);}|/@+g󆻄m;UQR9'$O:~+Dm:aYUD;φ;b;&Bpr:Y93 r;;^㻎]:5P& ;2P*;}} 3EA;t>:;66dm_]ٲ;dW;U;: +B:aS;b+;;g:;|< ;;p9q;Ye"<-=;4/`;RP5;:1;:,-t:B̺+:X9;Ի(/;nvz|T ,F;7;[jh⦻+;^f;c,<;J <@su:8;dD<'j˻"9cyͻė:I<[Ȼ^;;x{Z;1;Pʟۻ; Y>;Bʺ;i:ٔyZ/ϬKQ:͸w;);&O dMc:h5:Q4 xV.ê:;pp';<,hJ;%|ʻ9C;];;b;Z8xW +%{j;ݺCDX:5毗2١9 B(n@6;MΐIي h;Rh;'Y<:8:W-;)2ͺV94H7IZ_"kwF;k!:X;ꅹ򢞻H"xC;[qfQ;#h;U;d8[;mYX;W;FԺ};%ȹ ё<_;gF;6";l1p;z~Vwj;;q4<\x;4Tr;;k:z4u-:L]gvjy[;ͦH*Sg<Q,;0uK;T:M<ݢ:#<]};sY;{4;;M_g<<::\cb㒺0} ~;VZ:: ;;f.?h;lɎ;`T~;ip?{л*;|iH +ixW;?}}:= L>ϸ:Z3 ;,Ə;9y kĺOS0t:S֭N:?7 +v<P.D Dܯ;K; e5H:>;ػź <8t;;;;Vr;Dy,d__ںѤ:w;,0;]n"vl%,;C;N^v^;Zw;v;/<lE>;W8<5r:C4xûج{3|;c:I .`;!;!.]⣻3;m6y:;*i];&i:Zm);C3]^גKP:wG:4\^s;$i 76G\;E::E;yfcDv;"9/D4<^Cb;!V;p\;:,)Й`C[8|'\<̔A;Wf:9ͻ޾;8;wB(wp=4<;nh!zZ,|:!;jBڽ\ RDbw9oz/lDG@ /'heestrHY;*75=*q1aJ˯:@Up~5SKq&;Z 2 ڻOM +9!/J:Uh;8Gf;*S޺ӉL\]bHRn\SI;:߻B87PM:*BCrcmD<Ļ$9 +:ںTc</<4;pS;@ɂ:E+Ź &: y8<<:?H:!2[k;a ,)l?dz;;ga:z;6 ;Ԛ ~cͺF ;фL6;<#䌻JEVN;o;H;NE<>9:lƒ <\3;z)P^ѹ1a;4ɻ ;Bz;K ;<98h} );-<6˘3;: <[;XM< 'g;<`:ct:x Ap;7uK:@X< +<q +[Y;1Y8ZT}:=Yخ:P9&;O<S(;=9=:A(Bw[WB:E3: g5ʻ: a;H-݈$W:.;ý\X:w;Bֺ;Dҹ;D;y?!`;S:0 +D&^;;]\c$N0E;:5;$"_;z:Eг;c5` 񡂼TŻ(P֡6W;ׁ::*w9nCaK^"Ļ(; z.;r";R08t?9;_:E;Kx;"+;;qP"3;:as;L 仾ͻ6o9}лYY7OH:0;\»q);C6<K ^;JㅺI29u:;1'Ƹ;#;>M; uuGwO9}t<~&A:<9:9ހ;g<ϻ|:2G~`^;R:XF;!ں>E;V0;Ϲ#<{А<&S4:)9:r=<\;u ;mk|kVHZǺtx |;\J;9ڻOy ?<ؙ;?f:֎׺;&k{aK%<<;C;~ʻoHn):kӕ;xǕ<::PU:L ͺ#;>;2;W8J;zs:;6;<@򤻙Cѹ*;"<6R:@;@ۨ<;a܏: Q?e_oy;MD;h0Ԉ;~$;ʓ;52;;_E9%h/`w:<:w; e;^;/5`m<+xV9<.C;t;7 M*Rvkyb8'|;2<ĵ˹Nw ә +ǻR=7F;9/Kʹ1 <0<e;'Ɇ;_;UcVJ9= >A쀺Ҽ;K;j8[h;div@d;eڹ5gv;z+ wD; 2~;Ԅp C;;n_Ǡ;]<;XyU ܺ;:; Q!YcZ+a) <޻r:-$;E>;;{:@ֺju(=9PUF:FC #;WА!;\:]􏺁e;e;b<ߎP9`O; +w +<ǻ O[ߘF0:cv +k;;f:K:N6a&26 k9K;ػ+-9:; $;Z \;nNH;Ϻ|JͻO{;nw;4_9 ; Tm@ʥĹ:ˑ@LZ;a'(<;)rƺf:T<#[ػ*;<;s;9$="<;ߨ;.o-;h;H0<`ߌP;2:ǖd^:&;㭬?;u;:*;EH;;hͺ(,-<Ҝ;0:X:/غdx*#e;'@Ƶpx:㨺|κ-V=] &_ŲջZo:A`8;_;^;:o1< U: +Dờ7=<_޻!:*<;'k;e-;;)<>i>$ ~;_A7:RC&=mD;C;t;i:X: >R"<:';Ԣ +N黍wI;3qԻf9.UD;Fk%;:#:7AN:R;+Fػ!Ez}Tr8;x$;c'+l툻zF;e S?9=O!;ǻ<<:;[;%?;ن;׭<ҎA;)L;f8<;Y:庉Z. ;.;Á^aȺ <$w+;c_ѻ5~׻G0 ;7 ,<\ܻtR:w;>:׸gcV;,t;y6;f:D;= u;MY;U4:_a~a9~*;Ǯ:o7;tW;.8;LQ;;l!;*Wc:.H; +;><`<Dk&&Ȼ&k;: z;٩.E;Y,;8F q Bf<+d : ;u F:O߮Sf,Jiɻ1M;;*=;W"*;q;k;mΚ:̺vs;};<;z <$ 9ۆ8fB;H;T68ϗ;.qjʛ\;^ur:;CJF`X:fqc[ܕ;Raڻh nJF<[,/H;"fr:;$:]tB`R);:~7m?\_;awWjT\<';4;v`H:j=: # ;۾֋: ;&Ի +24J:aspd λR":։; +ŝ[;QݻpHOZJ)S|;LV܌<0);#j>jT;,9;><=ao;w<;:d;X.:E;e::|;\8;;;;R;O;K΍{ V";SS:j +ͻ: T;K 8Ũ;%ScgS11I;ܙQ;߻7:<;X;]r;<Ǩo;<rꀺa;;/.^95 2;[:eO;;+:W<4;w;5c#<׻֝><;Lg<Q:Xϻ;;U <6<<,;g;e<|`#;~ ;7?ûZQgw$p;P;3P<:ɰs:Ec;5:Q:ʃ׺D7/ )8|cջRy@4u$:O);]M X9lS&·;:;o8;t ;兼iIN;v;cAQf:J;jr xK;{P<+;y];F]* [  ׻#;f~ai֨: z:7:O֝;%;P;16ᄏ) =;J͵);*ֻth)H q:mׄ4Mm;|E;(rb 6;Ӹ#;.&<%:W:p:y|<:bZ<;<;MD <[;-;;f 9 <5"<:З8Z ղM:?ӻz䷾iE;ϻT;Go c<Ȼu ͯ<;V}mW>\<™ǻfc<; ԙ;+ݖ <4 !});:.<;PގBG;n]:Mɻ?;;7 +#{Ѣ<@OjcƋN;p;$ s9&f{F9j;y2;Hغ_;OkH5A(;F:* λZ;;ǻF:=W;y儻D9:uZ9ۯ;9 Ӂ;;q/e<=&,Ń gݤ1a'ԛWeʻ%,b9k=;K<!< +=;"vɻ'Z:k<>;((LສN1 3:&R<&s;j ջ[;K(q;;Ms;.<;IJ0ѻB*;;O@<;op84A< <*j:G˻>:Z <(\v;1):9 [ 9ϐ9 Hї2T;LEIe><= F:`6 +;OdR;rp۸;+!:Q: I=;3: +6<#;zL;ީ;O;|9S;<9M:B! ҵ(;m\;!J1;_ƻ8u9L8|μݻ <'5źşr:ש>1;rbuX;h;5O8;gt3<qXXPg;+i;aoC2;Ż:;5Wz s<5- 4a-á<Ȭ;ɻȱ;B;;ȺjȺ;K}+9N;<;+;s̀M02;E7:;$C^;2):;,쌺-pr^;,qx;m`Z!;v;;ry[9<޻鈻ҀK:4 +ѹ~3G':N3rdJ:";;2:l':>#Lʻ`/$;o<)/;c\`4<&:[˻VW:]9l/ݺ*8<&+k;W88ii;f@}ײ0<>;O;P;ÆT 9v:ֆ(;WT;Hf C~-Q[e6ֻ.I;y?1-< <^y|$[;;CqdH;lDk;9͈:WG;JA;G>;:;ƺ;u;v 69 i;b:)`-\/;=:k];;aP:'A <| 6;=h{:摝:G;J;D:4J<:Qغ +ͻ<&09rm:Fo:v;E&H; +%~4 ;+;<&$뻄);>VP4<S9_a +:;O:K<-޸;dhT] hO;$;ؖ#;m; 0 X +;Y<;:)>f+;};4%;;?<9c2U*,/< a:S%xϻ|mb;MI;?Znb=&C;Z.;:4U<l~;Ew:*/FB0:0z0ZׅԻl0|;e >o-;_;!:ʤ;*݆~)L(ՊmqPq4ӻN'N<;J:$p;<ΠFEv_s;Ӄ;l`j?ê.:U~;<:ԡ@;=&;HD ؔ; _w×OϺV;ൺ4FX;}һSwQ<&:sQ<,E;;]m|B;;, +PU8:nӷ9Ռa:`TѺ<8ocO<<2ג T|sd,< +y!𔼼{2D:'lKO3)@gxr;тƣ`r:B!}sӻhv:T::D6߻,U6[dde;왚;"O8e91I仯CKKǾ;"\x9\ Sl:/\;Fs;;uk":Y:(p';.;91,Srջ%L8һ3ɥ8y;W0);TP"p߻a;P$^GA ::wxw7;L?DLq;(g:|ػJ :;4Nh{;MN;|;C;ιj;;;ïjKo% ;E?U|} ;g +Tt9<:s:8 +,y;*Z:z;*/;| wb<ǻf:;Իnaǻfox48H9b;8Ѻ? s:+Ȼҋh0:H@Hc< +Fr軂 9?:i;!9k;%=)=6I'<=;YalA-v ;;4CZ;suW;349>Z +:T9;=Ƈ<+>':n;w@;.D:01;9;ٻs_<ɺ +ĺ +Qi,;mʹ+; ;Rs;y9x;<̪CK(n;6w:kȻ4LM;Nta;\,{; j3Jw;J$^:9jJ:T;';|[wȽ>鹠 B:(붻Ll + <)غb0`;b4;Ň}:-+J9λɻW:xƻzK;xA!4o;7= ;*<;⻐_Uλ:{:Nv性;#9I9a;aȻ1uK$<>q;90;\fT;PEc %;@Ż0^:ʋl6fP|ػg<K]-Ƴ:Iҹ1}:^ٸ;E#v;#<{<8j7nLi:Ll=:\:};;U~ǻ|#9 Qo:F8k;LpǿMQ:K$חw9. ͻϠ9,);ĝO:ǝ;;@(-;A6'DW;ؿ; + +;M1)^d:Kg9A$Fn<qќ%<_.;=i_О9Տ:F0:BQº;nv;>k#р;;iY:1iZ)V;b;QѺ8x2# ;,r;e;qy;(<%R;<\jnj;*-y:;71E!;';);;W ;1(^XX:$;xZu:$)a7;;NH:K;!&:,(;B< +`<3d; Bf..;*99;JE:α9e8MѺT :6[ һp؛;tX +#:W;錻=[:q:{;1S\ֹ$<.Švͻzg@<4t< y*=;:wx?;r |3q;qsE*^V!M<[; <JYx`;X ?;bs: +9EhܩK +x5wJ5_;#:4;H[;#;$Mg;n):/q:Z7<|7Ⱥf 9ު{: F^;j:WN;A};[ӻʰ;Һ4Z :k*ںjغr.;( bS HSM;%;V:[;Z;;Y%(Y;[&; J<"7::w![rhm;:6벻4;u;X:BF};;9W92]::]6&;;601;Hqۛ; ѱ;>:k;r(;y_; x:ë;H|\8j;"3;哺VUl򻂇׹ɰ0r5]y a*B͑瞻Be;;;DI@ߜ:»3/#<>}+r@;+<,"z|VҌ}λ;w<5fqM :Nnc;Bg"AX)PEZa;nBm } %:޺;;<.:b;;Ȼʆj<;떺޺K%;LQC<+<&-; ꡺%<]o^]P)<; ,QS{?ҋ:5_PTF2;b՜:l;Ogl;Zgm:;>0<Ն;a޵:n./5@;-h:v:_;L;aA;a:$;;:]ٺ3Nm;1:{;LM;%;c;&DE^*h;ډ:gsۭfg;q:<3Q;[;env7;\뛺c@;X::<*W2D;]M/;u;s; ݺ9^: 9׺7;qX4 <+H‰@<9)ekD:[V;.G;"c^ջlC:p]~1Ȼe:jں*p:]; +$:ݽ:>b9PCs:":{<' :nO;Z[*M;jC C;)y1W+NH;t:~0:IJA(d<ꔺݨ:+Mb(;ANlY;0g.V;!;z<ʹ;{C;@;K΄:jD;w &;(WȻ˾GV9aպsH9V9b:ݹgP:.Ż~/;ܕĺb<(Zx8ʺe<ٝ;č^;fomI $k fzAsDZYdVJ93Y;KBL:|;<4G<~(ч;H:YwO;ޙ;duNq,y;;(dqV2(;Ò;饻 "F#;|[:/k;-+;Sh<:fGBF;|:F< . +ސ3:/QO;iI:9w9<6;:DScM;ka';//;\;8;v<0;8::#:!:C:88;UA;0_s;yl/!!mg<._;Ӆ^C;;=5;E<< fC"&Ϣ=<<;2;Y +`9B2<-;2F?m ;.A:V;ǁ .JO +;4:_%<^X;OE;Wީ:,i;1$H;je;O'tA:ԁ;Jvhģ:'*:;~R9;}#P +9O;%TϺ%@F纶 <*a;F_;rU;1;e'<ϻ::4<;W.໷,>Իf::ûTʎf<:UuoC0+<:Q;!1 < x\o: JJ<9ɻ_<+u!MhS<^;qπ<;Y;z{;)RK<3<; j<\9 ź܉~<&:;XQw~ƻ/L (ǻ";!{:* <Y<܁A9y96}:;+><;te!<P;h|Ѻ*g̻z$ <4\@>ȻR-< 8zł;;Wû)B k8;OR;)=:rrA :'B;ۗ:mv[<"Ԓ;:*H;ͻ/<\:}:_6ģ:j|;FN9QFL;25<8;`:<@:Bx4:P'< ;)1;&3M;3:*?;r:͹;~G.a;o建Af<4k:+;): 92{;U;;@<ȻG;k6 <϶K;9 :8 +;tsb ;ꐸi;2D:::U;W<P[Ye;\p+1";/!Dj;%<"໘Ѻ<$K;ݐwx@aPm;a+;;l:s;2<4;':wt;|E;D2;1S%;7t 3D;%<>P֤k7Б;S7Ǻ,Iz1]q;Wz医;r)t?:;T;0#9; %:nb;5ٺ;(9DQ>;:&O;R+r:oe:)1f;T;0;;a:xԻ?O:-:6?Pn::Xb];w;I?;6ѣ;|<lįQ:>˖1I;: 6ֻ;{񘻶c¹qLNջ;^;K(x6/û=%ʎ:cx컇̺8<<_;;~;І:ެIs;iR{F'q;?0"XT;R:vd`b;^;V:28;9lѺI,;<;a:I*_:x9<͚;$;!'칣\; Hs+~n;& +<狻$b:_9;;w.?]ջqq`a.<\k;Ųv9$<;?;*G:)$:DAIDk;>6:0";/y9N;F9֏';ڻT]:a;HeY˃;?;ʻ& +]d:-Ias:9Df9V;?T;4i9 +BzdcS;`LܺĻ(R$>>3G MADrλòR;:U:m:1;ݻ 7i80=ϭF!;?<:n:j; +;Q{/d;P;0 < C< ;磛;pj;(; ;&呫񻽭K֊wbM<;:ݾy3,+̂qekJM5f 9<ΐ;;wY;fwTub5<𻰠$:h$hxf;&;̏;RŲ<@B̻ҋ: ;6:a;!)2:;Eʻܻm:G-<䪻OYe;xե|b;,̻: +wӻ6 5*Y<ۻ'WC(|f_)<`;LK;%}ۂ#w<P)<};NFom8:SE(U;р; X; +<`9ZL:DXx6>sc^;PYa`:}»ҺO9<źi2TF9`[A<>Ms8N;%~;i{el͓9ƪg;;;:ůU; +%;~;; :gqS`q <7]J;' ZE%.3<;*<ė+;fU!(<※؋<;˰:9<(kJ/[;^<=;" o꠻ػ#Q:w&˗&98k;`;߻v-;d)dۻ;aM;;48wƦ:ϻj**;Ӿx;Q))/;Gl<c8aj<~/el;'%;9w:BB~ ;D~;\ٻVK1C以a;y(v;:G]i;&T<~P/<<ȺWw;6a9;+C;8:E<~;³$<k%g|"*3; pI˻nud:OJF|:GE;F׻:82:9(Q;呖n6!6Q9I ?ot5"ʜ <՞+q;)#n6ѺcR:g ;:a0|T;r.ww;|;ZOqw:\t?^;ْ:*V;{߿w90y;ug +;N'MPX<;,k< /;H0L9;"&<O;͏]}vO; :>3N9B >2E2:Iq ;e:Ď<:qVQ(TtK +7/<ﷸ@\;j&<Ő{k:챔;ǻ6 6$;/;)Pï9g&Ҟ<<:;K O;&<;BPo67ܻ[;T{ջ8J@;< M$xB:VֻI;sgVGI仩{ڳ;ŻYK^Sջr;<<J<8qI-; S6:v:dz8 <BƻL:=ٻ:Z߈9<ꊲ:0^2;ͻ99H;&q;fp.:aP:1C;N8 : ak;`;ӵx+J:W?;0<;?;}D;*< :"Ez<`4,PQm^zGܺu;}p<9s):=:<>;oN.u{<{;};ܻꚺ=!<;,8wnM^'; <̠ >L浺;44; &G=AL)9%q~c* -n;vj; q|:GS ;7{ѻw!;~l<%:9yZ<,H";>N<:;F5K1 +<_9P;T#(ջ3;Ó<:3F_;;BVv&&<x<,ZI}0td;ٻ;XD;;.;~nOu: +;!pDҘ:n̶;t`3;O<;M{s;`b)L:P ? <ٺI:Z8)Dd$(bI^:7Ļ;:gG_)Y;*8~9a\l(;8hlI;?;z:D&<2#;‡$gy<&ֺ;τ%u;be< ;6<:|; ~F.o*;n:= P D9_SL +:!;#끼,sC :軪2;;3;d:e/}; D;Ց;c<;T68L: +;TVT=.?^;ܐ:Ӷ%6;Nہ+:;Iod'u:O<;Z#:eG=L#<랁8zOґ+ٿ; ;;;:s;U㟻@TfF;'9;z. OȎ׺ 0T;LF y<;w3VN)g:㍺: ѺH;]b:]Ch"; ';-5-0-m< Ҕ:6,8:8;F;&-<;Q_ ʠ:8\y:;;';φ;y::E:ڀ6;S޻jc\^;;t 뙺|<=;US\;E;+߻6T)";#s:7 Ȼ<+< ;˿;;tr<#{˄;|=4<09mÛ;x1;q<2(::R;F-;ֆ 3:/#G; +: .;[YY: l;D:LOtxH:d@7((;8;A#ϡL<|n@09Osǻw;M?~ӻ'Z<:f;DJ``%:'Z +;g:0\;e;~h;(Q;;STV%} <;ổE:&QQ;g_;O:l:X$~葺6I;húJ;e^;0c:Ev6U'̻;}̈*:2<$;AP ;錨;䭻5];3qi;!;[# =; p9Y^Gs}ɻ;O2y;흛9,;^ YA )Ƌމ<@9xR<<-{;ߵ;l+=Eojo<0O|:7:;6Dg%xe-:OP;^K;6Z;1;Y3H!?;Xo9;OR?#l; ;9;j +WºuŻ5%EU-4 +<Ģ<3{9;De9i;; C[EO;΄Sص:vW/5ԹVA!B )9<SveQ&<R&; 5I8;Hm}B m,`rPsW\RN;, ;O'1b,:nY:-zeM:ǻj||!7^;Kۻ$:º<û"0:N1*M[d<``f;@9;o +vW:-ԽGJa>;Oλ׺E :ƻ:cw;: rʹ<t;,9d?<$P~TﻹRI:CTP۞s^;Sg;:׻}$g;쮻v3:V;5h:99:gҟ[;0j :J:#:V; Ih7̴8mqǻW;yc;XN<:Q;ى;66:.Q|-;%<0>im:++b;}:;Ο`;G)ػak:_:ٍ@x +,0'W <Ⱥ䐻Tn=2O3{;w;E;HO:Y:đ;Bh;-񗻕7%vG+|f%d.[4<:oHG7 9=.GQA;;(z纆uG<+; +j:&,;Y/;;;:U軅U4;~ x;v;g;<9f:N ;$<:ĭRt:5eT9V`;颺L9J:|;q; +<&j<=V;ƛקɻks;;: 5:SI<R;';|5;5S;R2;H;IcF,:Oڀ;|;8:F9 0n cuS<(:ɻH{:Y/<б:s<ƺ#;~9;#@u< :Ր;t*:\fA2zs;ɻ>^Y<3q a4:U;qIe1[G:&4ֳ <$p6;y> ܊0#;*‡O+(ټ)[;:URʒ9JϻH;&c:mŻXл&˺/ސ:;  ,z;p9<-B؊ 9cF#jDi:# :;%:9_x:9i;H;at:Ğ"Q:o':Ɩ)Fq5:iw"̺)>vN;¿V;*a ;*;2+;P;_D):ϼ@;;%Ż\Y;P:P<;g &<ܺד;Oi;Bj=Dr_;zs;Al;ן);_;m;:)V;";й%0pN;H';j3; +=.#;J8;"A1W;uzw;Bm:{=<$t#@#V;?K;NcvM;Cut$6h8 ;nW9xmu*K-tDL;<;5dA7>d$; s;Dzqj:/;H<<>GppлLg;䬻Ϋ;N5;U'{o8L3,V$ٝ(;!5-:v;:ǻ4;U/:- +]; պ*+39o;,޻Q)ނr;;y:;bD:DC:]/%^ R;ʻO^s#;<ūT:cѻԤ!8){!;; ٺi<_;j6;\u::Md;;qy#y!?h2:8`S;ѻ\nO;3">;c_<:3/ǻg8~7;.JW;~;MmpoG32/B:V\:ƻ8%;d;x;Sʒ=B/d9画_;ùND<;溣T*<\ +PK;W9NId.Ի{!+yғc;8;𙻃?+<Żḻ~)c};:dGy:l:;! >7~Kik.;2);9s]x;`S9^:Cjo;;`_;1(;-:R:fu;;Q9`Z##1;{ :Ʌw? <ź`ͻ/炻H +;ॹ7}g0<;};;=jgJͼ;( ;ŝ;;|z?;^1ú9xwO?;<95;:qN%g;:;rf9|_QӴλY><8+Цzn;J9\>:׺<ٳ:g|/ĺUZm<&r]a[;|:i ‡:< qԯ ;R1f:j0;`M?,:;rw@:;`7 _˨;&;<˲;:W:TЉ ;Oܸ#д:,:ջ8r:; ;y);g)AV;FYx<;Xg[< +‰;Z;:eƐ;i&Y1Ir*;';TH:u6[6; i6.$ +ֻd;qT;َ=<7Q;ܶ:϶S;;\ʻU1tA3;D2<`ǻF4/;8 2<:]+=v;lڻҧ# m?һm0ax;k;.v;T;NZ=I;o;g]<žLT9:K:1@n; ';gO)RGm_@;L;a;8;x\%$; I^ջ@;v29JR;pﻪ^:_/:C8/T;k N&n3a:u޳K~Zu] +~/;i Wڻ:;3bo#Y;;8:<*»ȃ:B<:+b;5ޮu9L:lfR;of;,ӻy%;)RǻЅ;w5~T;)9;. 5<,qNB<'+;(&"9j*;;y37 +:<%U<}2/;s;mVgђ8< 58(;>K:& ;;zp/;;\q~X:0u;!;:=i]4ƺ:jY{9A) h : ~ :?E]9_;92@T;Eo˺cE;Ӻ9Ȼb;Īj:闺Z{RmZ:S;];=f9% +V;p/<;?g;uDe2ZL;S3fAT;0K:{:XrZ;WZHA< .;M͐;.;u83:'>MʆF;$;h9M$&9lMB|:d7௺ )c;}>'׻X=V Uh]ri;kyҺtKL:O;޻:+x휻BMRK;jܻTtab»roɻj~+,́(: ;>C:3.>;b'9:]:ol1?$?sSY4*:ܻtv;%Hbcϙ=Bmv=[=;#[X?PL;Fc:7;_1:`<;:T K.);aM;z:߃;D +&<o ~;WquS-;9; mt;IĠw4ƻXҁ; +-;TX ;Ӳ;8)9;K:C;Q:96[;<磪W:zuj޺:5nhO;?;:t;5&0AS6 亓h;壺{|!#;;%w;;ۻ-A#+&ºD;幵?9\ ;^G;/#};34e:j:a1:(L< y);;e;q< B7x!%<:m:;^T:;G潻N};:gB;il <ź;(.d;U{p9m2N;Q93 41:22ܐ9:2K +8mE;+3:3ƻN޹rE;zǹ7;5J8:qŖz(8;&3' ^g;UX};:& ;׻NMd;s8ap+Z:dtυc;9溍9ٞf:RsËoȨ$;m;:u;<);2t ܻX2;<}h;d|]غ׎9aL:;K;ݻk;H::lV;`ߺ&+9|ch':z:[nj;.b9.<}m<<;h;;<ͻ&LHǻVGS;Q5;:@;9ʺX8&);-V;Ne@;e;#Y;Fq;̄;5;)98YVpa,;;xEuis.û/]HY +:\99͋: +(8}; ClN`;7X 85zV|':[9M<ﺽt ;BYղ:89]e;?b:;ׂeU;ԍ;a~;!;ͺ/;J;b;\ѫ9<(<+@]ˆ)3}:΍%|b;;(V<;[:>/9BM;X":g:W2I:Y6;-A/<d9۫;:;;2;Ū?i5;:g0:组Bx;U];}$»);& T;Q׻P;m:J;B;Z;1ຐr;uo:#L׹҅n(kp/ͻht1:;ne;):G#%<9q7S@5:1Jlz:ͧ:밻c/:Ժ%c!):$У;d<;;uX͓|;匹R ںH0<`;Zq:m͓;;غߓ;UI;oBg<͋ @N:e!XsWٺC#:ӥ;cM8:R<^c;;͟4;@f;ݕ<)Vz;.qbź+<+#ǻ-/ t@:K`4 ;coֺf;r;];򐢻a;];E$¹Ro;ۺkػ@E; <;EoG5K<ҝ;@ֻTw;ڠ;+(<;&;޴:E<]l;r :zc:= ;0z˻q;F޺`p;(8 7:Tx:y+v: :M;@F:ٺn>G ;c};1H<(;xP;Y.! +iRqت;Ň{|;qׂ;Z;_s:-'94^L;p}󸹈T:*;R;԰X91;%l8l߅%; º٦/;l2;Ѻ=G;/;u“n0:L%v;68(|;u)P:/;/2A7C<;9!E;;B1%j`;$<;NH;1< z;(18tNA;:`*T7[}[[;6;R:p3d;<;;`#;wY:}z;:;E ;; ; ͻ9d;{ʺwû;P;`;~ ;?;kv;%fL3ʓ; qQ>CN;r/;+:m=m ; +ݑ?IS89ywQf;*18;: );;Zx:%Fߺ;X;~:KKt;K给248у,rtN髦;(6i +1y>;R(:q; ;B;]G Hh;GX;=;o=!l;-ػ!+TI>Y"r::fRԻE$;T_;<oSk.-:]k.;;xTF컪;3]#;k#v]@%;##$:ѡ:cC~';j7.ͻ|:$_;WW9U:xqQaͻ59[X(:(W;ωuU'#;l;AZm9"ZDVV;޻;q5]&O;یϻC;+zԻ#[;:6w$<S^ݑ#Qq>;;';K!:'Os; >;m?.<;;z<; E;2:_R:2щ/ɡ}_c;:=79X< + Σ;ԻoX.;KM,gIb<]TiAk;XM:&PV;98;e< :zee;;W;s +;KUc:BDދ:^Q:fZ;EdZ;k-q:G&:w:b\;8;@:ov;f];+;܅:w|Fh%*2:DcUf;\CڄeлPӁ;^;LT.h;a45m<(7;LVˌ:::8;û t:EDpj;.!;ȄQ;{J 1<x:>T39| L;jz00;;0PH;Ǟ;<*yrV;<`;I'-jp0ػ3;-ںDيjL;}.ADt:PLs ;}駹G +:Q;;:JJ8Y}$0;:-:ܺLʻi;-A;$;ي8e;8RY:#:i;@8;Nc;% i;Su{kuzYREG^";;;90;::Di@h ;PW;";6;\x\:&8F;;p Š|pTSbJ;ٷ;>Z;~:&<;B:S[;;C;77;<mϻdhяC; + ;`;_:rMM";*A:#;һI;kQ:@):y; ;:;y;'$;R&; :;4;M ;79ǒ،ruU.:|~ ;>;MDO<ϻ;D.{+v%h;A;a,;3En;/|jw< he; .;,7滆&w];I<:-K ;f2O.H;pԹa;c,1D9ۺ~~6 :v` Z.`);N[W8f;2:;o-|*M绱1<Ҟt~i;::L2;c!9!1-l zSl:=ƻjX\ \;1;$: <;Wc8[>;jU8E#;$-:<Ƚ:=0m:z"<[ û F@|\T;,:8;BY;~w;R @Q;^#<#6r&ҀHUQ;^9IƳJ:Q:Ѝ8 rP0@x;{ '|sIj{;$Ի|ﻓOgavEu#6P8䬻⻫97\%W滜,~8RF:j 9Ė(7+~:m:eXŪLCιWfهV̻\J;3 (5!9bZz +!$;9׻^X:7dW:οϻ;EF A;攞;Ӷ`9Q;(E:?(5;;^d;ǻ;90;}S;֊Q6;v;; hW;#;X9 <$% vY %<.rɗ:⼻V7;::.;.n@ǻlT:qۻ; <:;0#T:j:g6F:r;Cv<%7;-<7ƻm;Dk즁B;: 1;;'K/<ቻ ޻:IbBI5;v,:(.< V<@8(;{C//:騻M6;a +A:6=ԻwFi@-;r:Hl;W"8;$Q:aA1;p < Ȥ7o5;lho1?;|ﻠ^m:|2<$t:x;=;:g ;7iW8dл";,8B_z;ld&&z00x;:,{<>{;]F:$<7FV[\Ouz;;i$Ż/< + $<Â;p;;pYr<=m1Bs3{gv}J펀,B5/a<";"v +<{֏xe}Gcy:sV;;:@;H +<9:%;:>o غn);$Ϧa:!<.A'ަt,<)9v;h"d;4ԝ94J5_N'jQ"-;drWMN;`̻C +:Kf[:;I=`7;מpo%`R0:ibP4ɕ:;H K;@1;c;;_s Vp{S&_`;D<9 ;T*;3!;톫:;ض;ΪT ޒ:h.;yA9Y;F;-2;ŻE#;F?J<*^5; ];ӨTX(V3%a;;}:Ux? :/&X;@]ཻe:m:&˺f`ŹS;WHԻ;.;@E9'i996;_wE߄J?zfݻn;n +;!껱H;;;]:5; с;;u<<)O;cܽ:Q&ȻP6"y;c3h\;Zֻ>;zF:`;Qs;:NNA)Z -`cۖ6#rN\kS$Ou=q m6:ʣ:C~*<0eH;(y:Xs ;<3TYH;;(;f_W-;:㌼.%ޠcwj1mһF3!+v? ,;Hܶ #?;f -[0ͻ=<\'œ+v;VBF; O;ؙ;3n;;;Yo<!w <+;5:LϺ6;ӡ`X;61k^ |ɻ{ :rht;9;#f0D;, ;Rw;b ;Z:x@;1ԏ:,Cu+㻚MW G$,noώR f=w8vkp䚻!@FfOeG;YK<;iR!egUd>ػj&8D{#}QE;=-!* uS#U;O< ;)-;D\ ;7.k_a;F<:쓖;ɺ%j:+]:y`Fֽ9w:r};Y0i;_-$<;D <]& <1A:d;5~; 5H-S>:<2<<軘 <bB;39<;V{l E<;;Ea<i_лŸ;JLz׻>t䋼Ze;v*:;I'Ua7:G;G[<o;;[]<9Saoܻ}S:V;\D;%6/:x)7; +];Wj۴;ǻ[;.{}F;'tZ:Vg F=D9q 4gE-:av;Uֺ;;1a:59λ_햹{9:4uK:s;<-}<e)vIm;#L;\V< +;,;Vx;;KEbһ9:f߻[/|;YϺ(/R?;=;Icf?ּI;=;G:9]W; ׻r;;-L']939P}i;Nkp(;ɝ-:8,a;ۗN:,e<:02;YܻR̻?;y u͔ +ܻY=|b=:TcHg $;A + +; D;6;;Bt1;-U;6$;><2:Jc: +ڻ<y;wș!:#:d<<͹:A^;(:;A%sٹxJ<ϼ Z:~}EI9d;Rp;@#/D:Ƙ;99@uկ;d;L:bV; G; ;ENX;:`^;aL :3)[<d;'A#/y^.!:-!k0?;u,5i{)k; $,u;m;@ѻJF;;P̻ 9Ɲ,߻_ ;kTV;q91 +;i慺:M;w6u;;Ǻ;i:7;ɻ^K;ʡ~HU<nJ<OM+<:;˃P;;;;ѻ~+;Y(K@92 0};u|;k/;]qR.;<;j<[9;<;L;"<%<;]kڻK[0lY:&6A;6; /<_:%:;%~<;e<IbV;#;ֺ^W;4<@:;:%;$ú}b@6>;l;<&s;&0*w;S;|8:j;]bmP3 +7<6p;e᧺6;gY#:m9<;8<<̳A9$I%$};F;A;fĻu :lB#R:$<v!=]9; n;;;\:&- ?9m;R <ͻW;ǻ:/ p;T@w~;[;F+; 1T@<:t㻉;G;dQ + ;W6l8x:ٻ+ơNh; 'm]Ļ˴-'l;vk:Pw; 5߻am(D;;}C;0w;5^9$:ɹȝb;+„;>:&;TN< A:DJH;q^gϟ9]Xʻ 9 XT9nT.rg:<:pٺM%NM:L);.P:E;0A;rS-[r˻!O;c^<ͻ ; +T;N;684:(;8y#;-y;;NX o;F;t ';]߃(s +aV:v]zXT!C:݉]i ;4;5";;t:JTN; -;İt9  Y̻ %:V5л:L%X[nM湀e:W*oI-V +bƻs 4 +/iz}+;[;5ކ;)>/;'ntx;4 +i;㟺ξ:gS[h%:좔;պ!<;`;{J!;+;B6;!2pZs9>@8V.;V8~^'(;Oc}ai;OYκ$Q%';:SW$7[;*-v1:m2  \u;ҹy;c +:si3:pZ!)'2]U2<a0f01;p;~/3; 5ӻ$<;$ۻ|0r;:u:P;M 9d U8h*k 8B;T0'*9Z绠-*T\r/UCdrػI{#;l9#a:6'j9л( +<\';uAsd;Hл* A)<;SĂ88;_=:ȣ=ʤp9hhP;#BV9&;CN); !iy` ~1 :&;UN;s :ǻĒ !< 9;ݕһ:B;{;$;1[3<$wnE$ +;j:|;E;I];画P;Ehff};[IA;#ڗкqF`;)I:і4,^8N/$Y ^F<-MZJq $*::<{*;";c>9ZqɻC\% +`*:5k:898EQA:5,<%;Ph~ITg<ܶ;8 ;뻁 ED˄庸D܅qn79;&4=<;UCH;u;m`!R:a5,<S)n>;'v:;G: iw@ԏ;jh1ٽ;hJ;+:lNȬf|T ֻ4+:m:NWP:Q}Uׁ BM=W瘺%:?`sa:m;;AͻK;GnX`]b;Ǽ<7 0Ѻc;?DKEe;>x w;;oN;W׻w;;ٲ;7h;_uꉷ +;<rN\SL|#:2>;;_-..2jd(A9;@@{ջ c0#ql ;Kb;3 +;><{Y; v:d;f.vb;UHPA溺v;k!\2;^+ɑH1;w:'^p.F:"W:n;nDn9 ͻUQ:w;2CzA:_2л"s;;ߺw;M3k;Z:dػ,߻J~Sw; U)<`v*|%h;ME;M]*\@oX;;[B"U7A;{ Nӻ#:d;h+ƻJU}d:Oa.ݹ@Zi;llVP;D; *!;/G0S8;rjһb:e;4;;÷v:;r);u4;%K";g:;519?;4<9#؏:ԑ98;ެ`Ի$;"PⴻV.XE9ͥ.q}v,:(a8,;#h'o;O$;A"##9;d%;|"w:}S ;N:;cQ;J;"횼9WM;Ue;i/;Ɇ><¨ _:9:$<> +>;<۹NG|x-Ȼ2;n5)<л0NB<ਟ:|)}˻BY f<;|-;{=B:=;%;h>l7L:5;Mn:AUױ;&@Z;z;VQ#-;`Ĺp<;df;Ď;<,w=tT/;r}: ;_߂;2Q7;;;x9%g:&7؈;&ut;96;< ѻ,K@f&Wb;8;-; hԻG}x<gs;Q/;O}+e:_AP;罗/;^s.'f"9G /I;ʜ;|=@ỻL;#@;k:2:Z7;Q.; +zzN<,3;E?;.v;GQ:,;:;מ;9;P;!Sh;MM6:1wS;; r;T: f#N-t TF: .;bL;ػ*;~ə8;\w:A;':;j(<";#p>Dxˢe.m <9eEh;<2e$6 d2˸u;ib$9Xr1ovC4z;11;b W|g[`K;YU|w; Jػ8"뼸;( <==庤O;:$04 H< {;~L;l>tNI5n9XaW;h:i;o@08ӪN̻Zܲ9;Jo;/:d߰;+5c:dXм޾wcH;嚻;X {:]w<ۺ>U;K -;~jjik:ϻ١;n9CXš;KA;c]o9EH;ۤF;X:9;P;he9<-;k_:&;;Yŋ;J::qQ90Ȼ(c3Gba#hN<~+źT! +;h2Pu ;j]_R3E <7#a:ȡ0޻FF;DŴ;K滂׊;i;Ǥ1;@W\;s8Q;%:ݻ~q +nM;>mq;e9Rû#;cٺ,ֻ4̹H; -ZՈRʽ;OHFV-;a ;;a:;2;; +x;7;=;'ܹ=Iٳ ;(K;_%ҰӕiWLƺŹVu < ջB8eki:[v;:2ֻQq$i;0$[(< +;+ ;=J;/P"8<[:}8: +4O^YI,A d(>ۼ夼㜜ȢuυZʵKilI8ddj|ĵlr\y\':wԨg:(a`3uջjQ0D :;;!!;qFLU;=+;\ɀ\ϻewVS@<;~~ +<p q:;@`:?R<;/(< +N;8<;5>;=0D?.qyYmѹK|O<ۺ{< ;xzO<8;[;lӛ;u?;MX8Jf~;%en;;' —;Q;L;§Ő&)4^; +ӻa<򀻛ж@i统=_N;a%ɻEaΡ;c9,a;柺2:);6⹿7g;fgĻH?9q$$" 6>K55;X;H;ܻթpX#;%D:"U4PӺFa弳;H'v U;;@&bĺI:;j;^:{y;L&<l:;z@:g%Enk &'A:|M M;uGr<ަ`mһ/K!; ;BpI[74;+ :ܘ;: ػJ:Y:\:R:RZ?X1;2TȺx4޳8d'B:+<і;?v<:;,h.ݺ3:ϻPkԇ廔SmDW6;oc?${:w Fځȳ7;&;ٻ ;xLIV5EA; ;f;_4ѻ;㕭;#iG<::r<7.;j;ZM:7Z;97;#J<;Q; w6.:S̺Q8;F8R;ȺH`:99l`9Eh;4rX;(:7_tT!6O ZГbN4K 8:07;vj<\@:#Z)< ܿTf;ߺAd;,;'ɲ::!-;;niyei;64ltN^8ܺ+<0=;\*|=.:Rks}:|x%Q=;g?ŠdH^g;n;˻%黋ỒL<%];2;"7,u3Sw <ζ;p0@;Z»;B2藽$Y;߻r;W < e;;:'833{;;f%;0@Wsr8w?">e5;W ;x_wAV0:RL.>Q+fj Ż2;;Ȯ;N,;";Z&;Nl>; ٽ;i(< ۻYKnԟ;!U Oe<1esv7N:ʮ1:#AXm;E< + <`&^`;k 33*ׅwNo~hg:Ӏu:Rr<:j;O;W:YິI8<^;ǺNڼ:<;Y0;";:u&1+I:Z(޺mڻ@c: \IYV~J ;CQ8j8>Jʦg:L/:)(R#< :<~|Lm8aO;? ; 3g\NV;ջy:F;ų;۫o9 ;L/;D:'< gD02ҷ7;>;';P! &-*;A:1j˻\e^Z;^:5;v2ޙ<_[ŮlM:;| 6lB;l;L7$<պ];•;(-U:;m 8S:k;+3<Č::4\ϻ6u<# ;%Np'b4*lL\XA8;I4; m;F.gYVM+EC;xV5w3R;VR +;:Z-?j,<줡;>̻١D=^@y:̴^\p*8m!#9k;g:: ,1Or|<ºUeO;džƤ;ǻ<(': ++bT7"7p5:Z:<;XbHO;꺡mY s;b;g;oq;6{ֹ`R9ͻGû㙚9:U:% ;{)8:޳^;x;M;Ỹ:L${;3AY)bChE;'.;S%!%!;UJi)G; 9p;;ֺeúZOȻ㻧L@7dX򷯻S:DuN7&;;+;'z,Xh#ޅ<2_<ⰺHs;&;֮};+r;\G;+Q;嗢덻vy@;.(V<+9~/:};E ;Nb4:+;:W;;6?ye;-;90-<<ՠkdl;3: 0:L$:<$m<;X.Jq~;v9q/p +C;<;c;O_ ZG)<&";Lv:߻>++Br9:*7q;;N;K:;{&<;*ר;nL;4ęp^ԺNj];S<;M:>;P:-( 6;T;>;Õкה'|ʕ<芫:Trʻ 2<1e;:t:ՉY;P<\Qª;Ofƺ +. Y’i);ּ;HY6;7cػ?:3;%';Ҥ(YEZ;ûP݇;]Ȼ6;b;S_Vxg>l;.Ӯ:B;mg߻eol;-E:; B5;:y O <);:W,q ^WGt;5$;>;X|U^\MMX(29^p;!O0;;S:y;t:H<=H92";$:a;|h;9|: t(3X$)ۺ:;_>y:} 91e;8ߘ:te);x;,-:sHK;+Fd:S$qI;&.-;o!:Ł:~컱;+; ໄ׷%xgΞ;n ys'VQ;:7Du";ڍd w.2E-<, ;;;Jm;l5;D){;o#nF:^?]<;ma:f; 4c;f ԡv:$9ϻ0y; ѹ1A\^;1<9{麕I;-W;@eh^e¦L[̻i<;4!q r;;F;;~G3Y<~+`S;&g;\86;# >ɾ;h:<ջ-;jwT<+ڹ \;ń;:cdO&74ɻ) ;U,Lﻰ;֚;;f;qM;@=,bQ%${0;|TȺk8KWq9:rۺdh?:һvW$;5;.J;Wq0T i:ӽ><`!$Qϻ;<(; y9\ۂֺ=4;j HQ);V^:0ƻĺ``;b::kswFSr+Ma<_yo<+; ;3J;)?\;};Y;z#< 7+'< ; n7yj;:É;:Z;;j;$;:x9ƻ1&'}R5i89e(:o+:]ֻ͌5;V:gp:R? t;;u]< v8<J#Md&;T <1 ;Q; %{ ;jH魻W:=;}7[;.<;˻;=agN'G+_9[;纻:Ƥ{9<:F\w9F^;- iLmL; @; +;g7|~;v; $!:d^;:#]!3i:=i):9O_i;ޗ;ͤ:MV&O +;;$<`f;s +غئ;|Q;3H;S9:2_:2H::X8Y;9;^k3:Mk:=|g.9;^:5\;b=QGa琹:ԆKvCھ;ˀ;$8Yx<m;?<1^:G <)cބ;%'Gkyq[;5!;q;"ne;;7j:fƻ;?h;?e=<{;l<ΊW<.;/;|::BA!;<1:1<8;h׻I4';;ֺ:;;D<> }ӑ;쐮9 CkX;9ȸ6@H8v껅2nsqҺлiBԃ;FںC:xq;;6߻4%$:6e<G<<6OV<#-7,=仳g8HM ;˄Q<κ;匌N2+<9 l*;s#~; 8欺 +SL<-EU;= )!oKd!T- Hĉ:O,{;E6۵3˻*;<ē%l;^xH;i;p;TfX;]]vANo:nj;%;s1;>"1EQ<:y;ûr<-;9 +:t:c䜕?䣺[&;"K**9H"]:!@<K+@<#FԻmjиP3:;g<&J!9;R;~$2fRvc$ < x:Z [V$;삐L' ܻc" ; +<,#4:U?;;#E:j߹)2D5J~2j(:Pb;JE;oA?Lki<<(0S,?\:һxX ~$;5yN< Z_9&:e'fN;];br8;xX<;.8~j;^"ފ:;WͺKY;9;´<;;Z;Q +;¦:~_*;=;Qw;4,;N@q2W:Aݻ| / +G$ºd࠼Ra"Ļ]S;q;<h`<;r9L<0R( ;O'<$< U;<_|Cf<h; ;4O캊5;߹<4;3;Ֆ:+=;R; z:V;"i;;dk炙|ջC޺+sG׻ܹ +?-KML;nX;w<:);;;<A(?9j;;}+Dݝ8@;03vq:6ED8:<;t ˣVme/z~;.;tk.Д;9;#X6㻮c;NKBڰV:F9J;y ƻ[yyQcw8ް;6I7; X;: =:;;-j<&h/8`Q;;I ;vRծ:̯75b⓻drX;^:숻0޻+AD1}=FK9;M ;z;WIJEںn)-<[%Ļ#M;Q>G;VB;: -{s&;Ѐ;-:Qmp}'׻Y;Zr;/!s;6F#;bR:B಻::;.@@]:;s [lNoq,ݻ kc:ա <ݨJ|`:0B;fC:.̺wٹι7N62 $zyzIB<6q;\[/Iz9IJ]HP:;7{Ap}[;U9<:ƓO':=';' a:x:;jSKιͽ::9 +I ;f;+&<5Ia6;CbQԸC <;(4;ڻ:!:`C;>tr/ X1h>)l9Gnz9;ܤ;A:`7LQ2F≼}+;IOJ_㔂Ṫ% <s$<: :ߦ9k+<6܆:o:8[:S;]U ;.I:Ҭ7'<:tcDow oJ <VsH9V:_.6Kl_;"QT;w1 ;O7;%:<97:h;%z U}W: ֻh;mފ=d; `y4S4;ڻKrTۻcU_: +sh;$;08)=.<}C̻ل;F뻓>;CL;3;Kw<א;aT+Kn:=27-p?4;v.(;8=.Z:B.;2j;;2ۚK~;;*<`dg&:( E ;87ƻȻWw)]';nh+; %A5<~;29€::*96N +ʂgC_<&EUQ<4;購as #GuZ;ۘXF sP;[:_ P<#J1;r;ŸRT`c{,EL;n:Bd<;r:>":v;;y!`~T~];g;0;⧑SM@;69/ǻnW;k;C/;O7;yp:Z<͊<=;s;/V;@k0xL(*, ;v9=p3<[;: a(;f嚺C湚6;oOu;Bb9M˻n5.:Fƒ< K +;Y89%m;K*8'1/<2꺑:Y<3~;"`<\;nѻ:ǩ;|@9baIzB:\%=tgT:<'#Kᡙ;qD<5ʟj9;-;;ze;vٻ&F;>;x:Ȼ+ +w; J< ?0DPH:;Ea3+;;/ <#0aKG;x;?<8r\;1CiOk ; f<3$;6S<5R;5:*j$ڻn<-NB;͞q&ĻE9U ;;{ԁ;҇򻘄`YY ` +Z{: +[f5": *W< :[#,:;b:Q{i< ;;Zr;-gY<; +s;nY;3$9?rj9/(J!h8;Y1;W}n:A` 8,:i[{Iyap{; ջ [N+v;*6GhGO;Ժe-@6,<:=;;uk@X=;UgR+';~&9HI7n;h;-0(<=rz,R," ˭;8sY &Ws>fVu;Z+;'c;)y<;:ڊD̺Rv@:tN<_9ȝ;;F<f)dλ6/;w:9yQ,{b-Ӻһ;e;gMP=9MuZp;,kv:&Z<?;T;0;p, + J;U:;;NL,;D;H;9; ַǻ:лa;K;g;Ö;N\|)| 甝:;z;!+;1><8|:,甿;Ql ;gS<?/:݇4aع<[;6o:G?ބw 8B:;; l)3ٙ.a;R o:zU<oT +<8 (LE?eTA`;b)񕻈Uj&;1 E40B)c6l~:w򋼶!~9:K;o6<8x?;:A-8쯻KwЌXD yt:Bbû; <=CS^:C:ҙ;-vfjS<ܐ:9;g:E< m<7:aI7;=(+:9;G;.dJΒt:j 6-<KK-V LiH;Ya;ɵp;2(9:GX;NdH<+:`:µȚ +;A;:K,;~WWǹD;ݻ g<<R;yfB8Z;)Y:;v&GpŻ=;2Wqw;{b6:1c)͒;Q< Յq̻P"ں(C:T;L %BLM/;W +U4;:䚊;YbPX#2<:V:2c:] ǺB4$<@.;:xv;cPX˻jÄ;»4Io;;rںHHl:Z;h٦ɇBDe ;:&qhi9 1B-u9*9; ;6ٹd;8/KN\:#:"';Z;8|;8RUbE:Ժ:׃պ|;wd򯻜"̻z;ųW;!H,:1=;_;Rݔ;zؒuJI<L.+;a;;}:.;i;`rR;@f{ +[Zo;;*O:Y:27]{3 + ';%:;{^<" *;)1ίbN_N-<{ +9]I%Ddź:E;: :5EջH%ʻI:.1;"9;,;;_[Z;j:9Ioع?98<>;b_8;;*"廛:;';;ت@U?;n[ϻטjC<[;4[8\9 v;t;O B;%̳;Hp; cy?;J;^X:(MUyI&o +;/}EĻ ;~h|0 R;'< ;EY:R;.;;ph;ӌ;4驻'$;; ;Hg;Lػ9Չ;!~;Mi޻}A 23;?rv;;eD; U_7<9 {9lb+BB6_< nx;;:;%Хf: GH'<`J;E0:)=;\K)pn%L;7;;(;f.9*,R:2B:|67;-:VA;jM;$8; ;#ɻz:K`<:-;4:Fc(jW9ٻy&<S:;h:tN:6<@<4h.ӥ;aDz :$L;(»d}<#;-9A;:?π:9oځ;K:x:;wY;v8u~; ی]1;$ ;7X;i9j;6: 2&;\]Z`:{ݻj-̆:XW<29oӺ3Wf<;9 򻟷Ӑ:<|#gIZ;NO:8.~y=ƻʻfV@;ӻn»Z ;^˺뻁88g`ƻ2p;$UIR;u;O<]Ⱥt5DkJ͎:VĻJ i::5:40ͻsҬ;_8];R:J$=;Z;qŎ;UC:$:4*~2s_1;ťT ̻ λl{5=W]_<-:t$wtn; U֥;¢:a="n:ũ3_(WV ;*7;۔=:xJ";T<7:V +#A»o#;#k:'1JFѺ;Zf::;I,ZtJ<:p@6;,]󣯻:gv;i;Hܲ9:vcnr;:wR30<6"c:̻ޟ;%;=Jwe̥9~u_;:/0; :Ym;7U +4j;:ӿȻæ;H;]$&k ;õ;{<{ܻmC|: K:sY;m3k9%;å,:з(gA27)Q;`>V<;(4FKݺ;hy;.<&_<;m<:ҺR ;hY:61*90sQןT2<;y*;~A;`:GJ;l;0:hϻ:D<9I<)ńi@;軺&;g2 +L<95;aR;^ڝ[kX;Џ;-<8qvI?b; ;;O١;D&:w.:*; ;_ﻗ +];Ν:ͻ膻sR;Ewe:h<;ԗ-̶ֺ:!wC;Q:R)z%<~#f !<64:<<ų;S;Ҟ{;MtC1, +3vF:2UNɺ+ۺ C:9jSC~Gm)t>J޻{Em:tc:R; H;pST$<*;2;[c:EĻ:*Z9<$(\ ;);M9;:6;E3:; +D<<ɻo Vsºw{;;;K];(к# ;Mߌ;Qi=_;-Sc<< <(b8N׻l2NF;3)<ƍ'9ˍ;ܽ;M;?3<<艹/黥9;#i# !; f;/< ]/:2ɞλ.;q(PVU!8<"Dp;抎;DXB;g;fZI̺n ]Lo2~]:aM<"}AT<^;)䊼7ŠM:JGKQ<};G;G;ZBGɻ>}Y ̺ <㻊/<;h{;;Z;즻|O<;^;<=?;gKཻ+k<V8Z:J<<}:QĻފ(t:?9"7E5!,<9l?;[<5;HԸ ;λ(rҺB<@$˻rݺ&<;J(;@ScŔl]%h;! +L; +;mC<"1oT^|;&:h;S%5;Ͳ]4;);OcJ<:*%·;غ;hG<;e:ś73~2ץ;6p;O9i77;5y; +97 ;)!;DPs@GVak⻹Mn-< c<E;]:);sMMCU;| >J; ]V: N<}[G8S΀ɡ ;0$}:߄DӝV(< ׺y%;0əO5;;/T+:};ԍ5(;2+ 꺲xRK{"Gb;";Ê:,>y|): <;sL8Aǂ;;X<o9%d)|1<;a{; +%<YofD:,Tg<hpPJ;e pgv9;;4z ڻO;T:9Q +.q;ɻj;v*9lay^;:bQWM:% H~;~[awܻ:'; +{;m;(b; 3Y;fK ;|;3 x6Tc;A;#:5;7;hk/,;i:; ;FO;(]+b ;KNf/A;;)һڄ8滷Xƻ }q0g 9:n)0 +;漅:. ~16_b<<ڑ=% ;祄+Җ{D`;;;DL;:GV;9w<*;o_XC:w_:U; g;kEȻ (侜;M;,h1%;e}.~ N;[:׳U񹻪}2o|Ļndk$;+:L + ?;GY Hpn;V; +asƲ Z+;oJ +3;Pͻ5  98 9;;gp%<-T[6ǩ:.z ݻ1.<%Q擻7;jk9<$]$;ȸ/!;:;"r`Q! Y{ͻ;d;v c*ƻE;kf<>=xZ(;T;h)$:@Ua|;_#;E8`h9^n;q캕4<޷:%~;w <dz0;y::r0< pV;;9ML0<O+<һX~A1B08<;4 ;j;<޻! +< +CcݏEWH;3sTY<8QWV: N:KW>K;ڹA-9:Ls<;,!;eL::܊;.< e'ݻ$-;n}E;6aM:P$SP|;w;hV`<;冻Q;/V;<96:f';P+9 +xG:vxG609VP]r;)j;/;(;]u<{`Co;8K<:U5;;w:PٲW;L;<12D*;|AᕵsҙU:ח;;^U; :һ;w;{R<.7n;;#vһ/u?ut.x;W;f/nԺfp+;_.E3<=#!a.;R=<#G*>;%M<.;[;FJCҺ"_ۇ;:n_$<ކ%!;x;߻`a3ܓ;[~';O<l +Ӈ;#:^%< 9 s:C;5!<'#:ѡ;@ ;7DQ;/5;7a92Д7;%e@ @<QIXO;-:4)g{0Y< [9΂:"A:6<ܻP 8𔽻 6;tt;3`;BNU;^yY9Kzʶ;叻8;m; Θ;UDc 4'o;ܠM;;; `;A@& {:Z6)Nc;t;1/< ț:+9e*.ɻ:;T~_qa5;;:;;qϓ;#?9؈;;H:Rպ{<߻y<K9Gs3L;%naz<e;;J5:b%;Ⱥ6<Qݻء|"'Jb;l8;Z64<;O4:p 'J<29Z⹃Rtẞ=nϻ<ǜ9Z;")u㰜M"_:ʢ8'<߆:Fus<8B<;n熻.)H< ;;$ɳ;uS<Փ?л+;ϻ;Ă캻:$; ;4G<#u;U:~?k;!R9aj:0U:#||ѥ]A;6Mb<KcLCf:O:| ;2M;eظyjGC< ;h<;(Q2D8:;;:;X<8Ӹ;ڧ}>;.Yؼ:; ;ٖof͹e;V ߻<";А;!9vVv&;˻]};_?Y:j;^<9̀;<#;+:8O!e;;mN@,uw;\K;:y;; K}|{q'm '-;ѐ;–tyZ;4;;:x;iĭ0Or;dI-< s<1T>;G;Fg>5j:;09 8X;;!>n;s ;xﹻ;D\jN_ю^g`:OM:+<&h1aB3G;.;Û;;ˇ;g;6 D;rRe};ylK!xܺM;n<;!; 4+;%;H9%78MÒ#Z`;Ii;FCԻù8⿸M*1eR+M;Ra@Ò< ^+j;w&;7a)_&k:f<>be;f;:՟;ٻ+:#I<5;<?eº:O;;+;cQͬ:T;ݹoT;_)Ù;Mk:pv:-/ =;:~;ð;3؀;Yc<r:: Ϻ3Ļ: [:r<<;vA%Lջ˧B&;1^;+;Z~1 ;;;=*;ۻ>9">;;*&W#:h~M<-#*<+`<ͻ-wX7,JIST<˰:']?'$:MZ:+; +cj;J;,0蹄4 |;_;h^6A(ڈ;R<.;TK;:W⡺ FC<ɣ;2G;R;$1;WֻֻnyuܻO;5"* *; +M;5Y9H;0!:+;쩻&_y;(p5:M;/-E;=cWjZ5Y0:<,<'@@M q B@Cs+lX2źUd.5<=;*Ի2;q;;q^9ȻSdRR;H +<;7;ٟ-k໻>ܻ5;2;X<"KB;9|@t<A:mvT(Wӻ7);2o;h:Wk;лzƻ$n:[PG5,ѻKz:wD(x0?ءEɻhѩ ;R6_uO:@;x#tt;B;EV;Tѻv&49Jhes;5:Z:)e$;v<ᐻH(;λwW=c[R+HK; \;sd;jֻ +c{Z2brK9fP;+ 򅼄׻ +;I95:ylѓ<n6dM;)|<:.n;;;;Y {AA¹ߤ$HC<99B/$;;&.?<[%v:2&ZѺMvz_;P[gWI& 's:ʧ$^,z;{+k:;dJKD:}; +&F7<.;M,;tO8p;źc[,;3ڦ: "uhv::‚;!;9Qg˺93+(:\;CXx8[@ɒnj8PZ;;Dλ ^< [; b:z%Zc!<A%9`<6 |@ʦtʻ>;=;X+(ET;t:ޣ8],>SP[?u;:k +;◻A;\b;UͻU-;ֱ;;ٺn<Ǻ:hX;;;[8;8 ;\XoW:sVox;v]J[N3k;:p;޻]66G:cq/{ʻ;3z%c<:Z ݨ:]9;M- ;?)8;Xk@:9a<7;9a ?;+;0(;IQc`&Ң;:˅;+?ʁ;%mHLV;\|;oJݖ;_;$.<0B ;am;~S +=;W:F; +#: +; 0m\ ;?+~|9R:g :@_*<0B:G<{b9*<+'gdFAkaz;S;_ޔCvȹQ;#E#:a:-;e9BTVV;z:a<;x» /6B纍ɺr d*0:9C;;h;@ܻ:t ~z;pu4:Q/;DžƻO-;g`=ֻ ;;t;+ol(5 T<:̽.;h!;ru+|ٻ;do; ;VZFQj-ּ;;:.; [0-:s^;y8Bf#;dٻ+a;<򏅻f ȩ;h^p;W>FS2":|X6;A*W!A;^; o3;d]<|i;m;@g{(<:fڻyt?;;`dpҐ:ho`?ss޻v'+DA;<"Z;;1>;1;}; 7J:r;Q;;LzlPAɻ Ȗ-x<:壻߰;(i PջAWʹܷK3h;n;W;:Y>:ܒm;RNN7mKM;կ < K;;+;\);W;5M<d6<:Ϗ:Ɗ-"ֺK8*䨺<*;^#;5;S;q<48r.źN~W;0;s[g;{:H&<乣_;8뻗.;8X<[qձCg;ZPE<<( PǢȻ9:Cέ::P$8D;*"E;ۮRy;0»wԻwuf;N;`/˺;wOﺇB<jm'"$} pU>湄;CJ:Ԡ:0; 5<Ԃ;.k?;9!j^6Cx;r9QmZ;p;8; 9w;,i<E<;f n8&u@!<:$C;NG#KGե[X;k=SpuA;kmU?VFY ;:I,Y;]eZqw;*x$>c<酻sR߿:t;ү!q:}e;Fv=;EO;;;5;ϨoÈA}'x20<_:r:{::Ր8i<}; ;H;- !;:Xők9<'6jͺ,C;; 2l8::<;ߙ:X:z9΋1-|#<=z +<Vb;EM: 9Kہ ;;*9Y<>;@$;rC:\;L22#< A<@ +;Xл$R;w;a*;$< fct:'uf( ;!;¹,w;٤;"ҺU:\!E9O;+ <4*OH N;20ǚ5;B;7t;J:Ds ;<;Ä;:q;Ho8໖}Z;P;q+~Vd;50:*;"ƕ;&27l;! +Zջ;Eͻ=<<)?w/;;BT¹39I%L;';4X;A; 胻7PW1N:;띻6imy:1;dt2:ͫ>:y;9%u;A!FañhKmZ2;PyOB%㡻w;<&<.|9FZ<:A;c ."Z;;w2&<\|;u׻kYHѻEΑ;~<9,B5K;ux4iȤ:;;K;'O9}<<}b3U;< <$ȣ'̻<k:k;;F<D<|;D<8᭻S<1;7*j"&;BRZ;];9;J䞻&*w!;*.;;Ń ";&;y 0b]<+W;l;::S0|<@;4`e;2:l +=ݺ;线*fV;;hl;;ɠ;:<&:9ֻ.n<껬;tq0(i;b +u;h ;y:ta9X;;`/;:J:4Aeb:"0;n:X;K&< 7<.Q;ź8κ-XD;M8|Y;Y< j9t?0;|pD;w:;u"'7-/(;H81<:!̹;<"Z]PyPQ[;;%D;R:ڨ;s.<%d|;:b;a;<~U~=uNZ8+t»ӡV-;L׎yF\2F;Z;O;6ǻJ9`;JEx<@m:S$߻M4';F ']Z꺺%;e5޻*9o;J;?;-];E-T;E:;;;px;W3 )KĘwÿu3w;==#:`8ʻgSɌc;r%:KO;j;7MwL8 n߻w:k; :;;Y:\$U`,1<_:_^:fR8T;<;ϻ90wXMEN7<ߺnԺ;ia<;;TRԦ5;&[J%uE:;F}籤(,#آ<rϻV@<:;::CɻB툼Zc8;*# 'Ϻ* ! !;$oRY;: +np; +;Ec<?I #;wu;O3;@w7*a;桻T: +ӻJjyp;ĮZ<9;*SU΀!;c; ; +K'5ѻse.;aO;`; S@#<‰;ҙ8<;Q;v0o;$Q;<8L_\fkzI?c:-`v&;K3+;䋼 ܺ=\k<?ǭ:1;{KлH!&/<õ;Ќ\ +;1:N<K9<~;ySn;j߻L3:ezw:;a8<<-rX; +:dž0V;9" ̻U. ;׻\ +W p;ܺp9O:;;f:E:Oq9Ȼ!%;;w9{&:⫷PJ;(SzG^d0CJ; :F s3RB;C;a/j;pՔ;iMAI;݈ :KKZѥX;},;Ii:Gʕy:`;¥:2;[ ;ZYD;劻C:&;`:7;|ȗ;8|"%/;ߊBu;Ra:.?:;vp:: 93}ځ л>9<:Ժ;kA`;h-I'KwB;#:FK+m9+Hx:9M*u~;Qͻ@x +:;;9;$T,;f;lS; Wrω~;ӻ :r5%k7;[_;SYp9;H;Ϝy9&9;M: st::<>X$ѨRlT;:]<8QY:oº틻A;bo:_;(} K;0<;$;Q;r'paS;.8:;UW+O;)k:\m4;)8}=ix{~ʻX;;0;KXel҈5Iʺ.:%;& ;i52nnz;q)/8BjPZ/_:㜻:~y+$;u:,&:9;I;L|P܀;?ͻ󔡺&击4ʻX清to;Sv<:<epW:dYi,wr;{Ð9;fwa-2/7;&K;u};b?΁99wV;HD<_ԻI~3;/ 0#;Ph Q0A$9:mI;^ڝ;y!;A;O/<ݏ:ї ;pG}4<}:3>;*pp;ow8:;,T?g:C;8;j¹.Q n9p[L;' ?< +:}SֺycN<% 9^;v,;;89c:c<;e;|E:V};;l;;l;͡;:C;2;j;gY`% <4;V2< +;F3;S\:qg:13;n;+t;֭%RZ:3,һ v:[T;4.y +;$F;O d:_99i;:<̣ݬn磶W +;C;Vi:cX;yMT2f:2;w{4+kGp;-Pq:l +;d= +96)Ö埻FẂ <;g$;Gû֡JH:؄MjRP<ջO;)Y9rC̻"~κM9/q;;]G"źy(;1P:a;B;bZC:+n:DJaah7)eijHֻga=_7X"f;:;M<*;2ݎ:vNOg!M;0ݻŠ;$5܉<3 <#Y; ;~;D95&K:3dUK;V O;ZW9۞:`::;Op<޹ʼ9 4ޢBF;];x C;l5:H;kB;WsAA;0ź9}_:M9Q,L7<*̸g0<<3v<臻O*Je#9:1;:z yۻn) ,w:'iw<䫸+'9;,;1Î;BNNQY:T):| iy: dʻ;gׇ;;Sѻ:<";;Y;|F;;SOԻ0\o?&]n;8/~+׹֔:hA;Eq/cߺ hλZ<.< ʻN:IjNX|Rֻ<;;PJT:D%U<{\FlyP(P;;Q:IF )5<^];1ջ=<:~[,m2;/36;4 E;ZL <;NH!;R;hO5`T<.it_Ϲx;(<"ɻ;;⻻8C /F00;uPO+qv;RRYQ* nl{M:1;T +;;[Y=;f;(,7i!<;4 n[;9;^m-Ժk;;;33:Eݐ5Z7Ga4;!;&2l ;sdc[W-Ŵ<ʻFػ@u';ҺH*;';bu~Vm<)vT;b;?;a9kQ3Mͩ.9O:;([kw<T[$iS;KQ|F;;;'e +;cm:;<;r>;:; <;̻ic;p*9:oZQU~Jú2?^1;/;̗:#:5aK:"hAQc5;:KN+ێ;;b;cg40a)V_:jvQBh8;wdyF;r}ڹʚ;ܔ:ɻiH;Y;6;>;[;@DØ`;|<>;G<_-;g};b%;qf<Ừ ໯;DzV' |K:2おA~a<;+s i|v:580};QWR2w<:r;&bg*;fl;0<8b,ܻZǯ:.C:Á2;x ;${:1tn;4 <Ǿ;֜B}nk~u%8: 9,Ӈ:p:D_q;ʁQ3;|=紻xt; k +<=(y.<@%B[F k\{wOm;M:;+;TCa +: nELWtϻdA{98ĻTZ;;;р:cZ6hD= Eܦa;{~;总_:=rZB:|s\9`_$ <|OF]:M9kY$3ʍ8ZSȺ*=;W;">;f;ŸC-;I;<[';a%;u^ ;LS)Qr ;dۯ;i/;w< Q.9Cp;K<;;;=;J,T<`mH;SYj-Љ;TV֏;9zH:,»v*߯; F4Yà:i3P:"7:feuӷ} "_;/;Tؗ0Z9;ZIŻ!g;6;b2yB:X9+9ƨ7B6ɻi'|$1:Ow:;(R;(:2,A;9;l<ɹA:8~u\,8:Xc\:fAlށ;u;$P9fm5޻zq1-`$<(ᠻ `c;:;:3N<;-9Ϻ]C;* +2GaF(;Sz;!< +@;Xw <_*<:>=If<4(:6;LaQq 0Fg;ԝܻʟ?B?8rz<6<ߺ;7'{Xn»c&kv[;q{` +"B9p[;zºfM9;,:;fnj;ł;NF<5+;~Ǻ$k&F;DǻR:y+绬+;Z!K;L_[6~ĻZ782,;n<9lEw=4E \܋;W:?X;.ƻ9%#ٸ;GB b;G;3;rXf:p7y9QX;pq;giZ6:ͦ + m<̌ @:n?!;j5:E;N;K%ߖW:)x;KOy;z;Gda;[8Ns!\4;&96;B&;>0BǪ;|xF<ڀƻ=Zӯ,6ջ1;#& ;:ŷ;UٻRp;g*lq;`.;;;G< +0XqDg<\;"1%̠;x5/]C;pSe;/<;5v n Ws8r$1I#^7?֐ۭ <<f [P<ǻBG;X:/;;}Ǐ;5:1rS<|;Ox;kO;<Od;u< ;5|96E</1 69Ta*~;"QԻĵ o:F; +&_r#o[IMҕ* +;+;*( R<\:;=t;Lø Z6R:¤m;!:lts;9/Y4a;V;(Zp>2<F;$;:;\;l(bS5:L;n3;$Ս_Wk:a@;: t ?;9g;p @<';9_o;z,fBN+;;;^;%ںF;?;@B:c9лBРz ʱ;6F :߮;|sD:K!;kk;Yi"*^],PlZ0<Eл-;$Q<{:x(,9Wл;/;ۆ;pL;'o7<Ξ>4ݯ\c${kG4;%h<%:g;D~]?;:rSL|޻ʆ;}@\;h&&;f:纝G;F;a k;C: |]b7#;6ʼnʻ;(Jλ\ +eN <+;I[;V%U; ; +g4<_Ƣ::<1 ;p2:J'4\;P"R"F<݉:?݀y:2I;/4 +\ػPf;{F;x;U\DLT$ۺڸ;һ(f;;kwt<8:!x;;@;`;6";U;zV+:eU<;ޘZ;9<^;w;@sn;: +a<.==;hՅ:;7oİ@{{;)-<{;(9.;Qru%h16;q :/m;;;;o»|D<N;K<;.>}#?::e`V\<9;V1;;x8 ;;p˻BK::6vUL:<î6;BwaX1ѻ^;^rû#]}rỈͻ<;AO |,;8:Sn;Cy<rJR+;j;;U:$Ƅ<r<=f__; K:m;b;p$=$Ab:}ﻬLºr<ԗ `謻;=:Z!<Ȼr;o{f6:7:pz<ûA;QƵޥ<(l:8-:;};IL;7;OZ\ +.غ}:V7RHߗ;%E@;!ILr<;T +7(;};Dﺑ;wUf;߬d:5%zw$<ԺLźY:t" ; :K#8F:b J;^D9ܜ J:";&Ë<úփ<.9MBI;3>y8^;ԏh;*<:m:;y;Gvy,JVjZS;iJu : G;9 :5;+R]<':Y; +;><.<񳺸;b=;$/|9:x+;[v :eFo7;)=ѻ!hDٗ;56@Î;WR<;h3a;p^!u~|5/<5^";n:H;`;h`:a, u͸:;FO]U;>;fIr;j;;ػ|hj<^D<[$,;8Y촻 6g$;^ly"30 -;̰PfڻmGoP;;09p~;ݨɻG!^(;79IPM+;+!߻݂HǸ((;in`<;=o$>A&/;s:V/; bz) _::v5q<;K;(U9G <&,;<>;'}7 ;46<9<]օ6ʴ<@xT(;`w5m3ya8k,\F:;;L:*:y<[׊:;ڻoǙ;9㚇:E~h;O;i; +%ٻ>=<X经=ﻼT:0<:]P;뻦W;:<;;ч';fX=[;3F;z +;.uS<:7;,;ֻI:'ڻeց=;q+^Vd5'<;y]<;A]yi;};}2:ջ.';һ-:^4<ǹla#0;e7OY:i?Z;cL;ɻC<]CP;U;]X!.&ik;0 Ll;%U;K;}"H<@%:Ď;GMo7Ի :I|:AyUr<5z<;X0'&=;+ER4N:0<E<.#;E;]p:e=(H76D</;G}d˻C' ;dD;};ls<1+;@LE<6^]$@ǁ1:(|ɞ: ?<7 ";|]л„;<;e:;'{(EһOQol>%;m5l"; ,;ԞR ;gֹwI,GL;G;#<:Xhy;iP+Й;;8~ :;:}"sκkwJXP{;AkF];J%SNYĦ::F:i1-o;@:7.;^F:X;a&<:@<yC"^9jV&;ŻWtK× +ߚ;~; a:̻ +M)/!<R;2cD4<(]K aT;tR;~Ӻ@%v;7<.:P;թ<<:ůo;:w;p[9h$DO;݊;>~-:vn]˻*^һVr;>5ѻ䈅yISW$ù9;m[:P2;F<܆Tkdȸ[͏;q\; +|X;Phwư7;[j$; -n;$:> 躨x;[&D'a:Ū["[;%;ǺA <.7;":;:Ż~;Ⱥ;CuZ(;+h9TH +;QAG9p,iE:;ֺ-:a;`;;}d:O+c;+S"E}:㻾j;XP<7kԎ::h;〼;0<: #&ȭ`Ԯ-NO;+t: f;;3L;fD:k3º̻ :@8 :u3Ig|u?d9&R)n:޻p;:iQ:MȺ eF;{;WTJ<;U6h;^;L,<'ҙ$=U8 +$1:h7ԺbjȔ;SE+ \;_04/:J :#v. f@;::8 ; ;Ȧ<[;2;D;.DC:Wwc@Ik;i7Y;QF</Nӡ;G48ǻ˛^M*;iC:DqG_Ż @q;%{#: <랆;4;i~d:M<[H:;f;7 +;ğٷ;^&;t:y8z0;Cۻs.6;8X2;/.ꀻ2|!ד+;KY(:޻t3;u#iF;Y$C<;U3$8i9)ZRd\^<ŧ;j޻yñ;_܂!$ I{`; 7JWݻBd;9]/dC"M;W;̆;^3r_};&^Nۏ;i;`r; ܻf"Ҿ *6"<Ÿ:;-< HB| +$ٻf.;l1o^,;*a<;8V; :)w (H"[:a2t߻DFm<8m m9V0@#ɸiB6y.c+:}53 +V1y;zFUw<B<biq}];Gz_92<#5aj lzݻ䴻|;:R2iHLB'l;So!;S9O<[<Ky;NL;1(m$H;;@а@;UV͂V;<$*L;Uh.<?h<x4QAm`;$Ỻ%*톮; 8[,);;;wΜ;_9،;9K &;V'pQ5m-έ9Ȭz:<:Z:p{W ײ +<=Q)~PNOŻk5\Vy:ҏ;4W3;,5* MFyO ||S:𲏼 d.ȭ;ҕ;39}g#:)j$;ȉM;޽~;K)fGE:;"\D<'iJrj ,;(I[: :;P;%; +1)(Z<*T;*';*EO<椔a:F<o4b h;\vr;ru<( +;@8j; b eo;}A:jA;L.<&ûR5W;śJ;;/;ј<ѷz0 OP}ݺYG;)<)<ԌXͺ][}*AnmG2o>h"/;i><Z<]Q)mѺg;219#);M9&չs(;҉;D:<;s.C<}t2᳻793}qrㅻoӎ: ;z:Ɲ= n;+]崻| <2?;_<・I<ޓ:;;yM;5J<];ȗU?,ub;yt +<SoYZSTZ'@|;$ <ծ;ñ;y.H$]:̡:̯;ѻ:8;cY:5;@ʻ:m,;Eۻ a!;Z;38;<{e:>zLϽGui;CUT9p9<% x!;:3:jA*8;WtFɒݡU(;Mҹ%L;}";ps/a:엑ʟcQhŻ;o3ٻ̞AtQ&;;$<-rYQ;9(J6l{a;<鲤$K R .;ѹo =hS":]Բ;ͺD:;Pō޻ +8=%<Z<>;;+;q=Y:=Q4K<YC.<ɺ;T;UʀZ:SC<KGI~Ϻx+5z;5:;i9xt$:t_̻k`;҆Ϻg9Fw K<& +P-Gئ5;<+ѻjD;f;3I<' ;yY;";6'<,It@2;i!P<;&M> <$4;L;=?<;mK$ ǻ;ZٴHKa9;_;:IQ>'g:#U{ʥ=F緻 =;m<ɫ:>\* /;aJ;#] +{IL;Ai.z;q98;aL;˭;^::n:ʱ +<*&;c;s}>ݧ:9k;\ {;m::;yR=лB:/<†;Żyȶ; p5n:ӻ,<:3rߺ؜^:<*QrI"#^0~|IĻtM29+ͻm݅лM' ,N +TI7`IqT;Ś;!պyF;٬RջhVl[c;r师L=ėG: ;z.S d;*»҄;gE@W;#;&<%;$:pmE7<5H;;;50;s\;?ܵ;Lպ&;S;ud;+XQ9;̦)Q2:-;X;UQIQ9:vz:Q9A|;!;2 ?;Ơg;m庖&;u;击wúF3 t׉(J;Fҕ&ۻ[u;;E@;Ɂհ*:GLOe9<:;ƀ:Bh.::P;;Yk9$g:vU6Ѻş;;7~;:r;] +<4;e i?;M0?;n;az;ݰ@; ;;L{`;t;7;*fdV9>I׻hq;e:&(% n#;/Š:-$*+|8:^v;䃻:>;9Fd;ںm!̹Q:[״ <:Ȣ:3(;ʶ;nw;G!;^;N6QxM<ĕ5;2I<.:B;M:)9=C':\;|;*B;;v +Ј:B:::'9!0d:1;:9@bK8 I;4κ'QC;;x; 5;ӺZ%x;!|;;Og;FU]t #:3̻g0=?:)_;?ɠT+ ;;ZB{=̣xV#<K:;ֻ3!~9e;VA;vx/k<;4绚{;w<_!;T;\%~u;)'5 6V<D n4쪻#nyG.`ǻ+Zͻ-;௖2cl8;zϻ !:"KfCc;\_c 4JtIO;P-;`<ۻ<;'<&1<;;9ʾ;, ;@81gU<ջ"e<;[sRo8{9T;:9X<9]5;q;?6Kaڭ;츺:J Ȼ[ 492=D5X:2;L3<:m8:?" +St(<ϼ<,r;X:- ];_J<I<9(;OS8R;edPûu:z4]q;h;;Y>;;;};B/;`:ҞݻU;,K<52&ҶH;.9:GY<;y:ƞr \3;Ӿ0<ԽZQ :B<JO:&zJ Ceq&$:;N;W?&v@`IFCMR_ža<yFZڏ6;Y ++;zl};;#O @P%0w5;m:XN;gv;vci8;7;;<+Mp<7; :9{˻B:e-Z;&;j"y;ٻ:;$:~anLCu;m;o;3ӺM<49<{3s;PZ;Ҋn < +5aYd a;;l;Ng* +z͖6;F*;&<ن;7; :v;X;k<;T<};)#B'[:C»D-;ԺS)p)ǮH[պ0*[zA㨻 s:K㺧;Fغ::PCu[9? ;웻 DbT;.񵜻K;2|89;⃻3; d;Q5]t;srS<.:<Ӹa;#H3gj:l۹`; 0;W$ O;ҾJ*:QŏRj» :9WU:|;&\s;< +8Ab;;kͻ9@::NIeP:ɣ;Q b;)b7xڻa4Żq;Fӥ@z:Vܒ;;G:ϥa9c=Ԥc;N;u˗;d;B:I;WO;;;s1m?<ۋ9Gڹbt;6<;ۡS:Zû :])<:O;؛;T <;`|?xBкp];B:d;QW t +QmdT:b߅^+Ե<Ϥ:&'<<&X;|gJdM9<;9< 4vN/:;gﻭ;*A;PmOf;(9нCx(ɻAk:ǝ;7ŻI:F׺907ںZ?ڻ:[Q;'M;̵:a bP;i:I.;lkA;yԔ;6;eƀ13ͻL!az%:}9rS<Wl;}J? i\<43];#Ɛuf:zۻ)f8˺;H^bջ q $:; >@;?;2jIsJ\s ;:P`I;(<C;[͜ +";6 ;!k_+k$xw6;|3`z"E~;鳹7;Q<λm;@;Yu;%; {*K3C:;Y:8Q+<=Uf%%;X mRo;eA=|߸;ϫ;Q/:;<(;:v풻 :lGݹڡ|;胺q9!; ;چb;j<_;úZ;a* wce;w 7&3\pE9!W<`;/;*9E;{:4һTɽO;H:BJ'z˙;)(;NղG<0ؔw;y]:ܩT +]<ʻ ];U;;C!;A<'I&[7b&<2<̨li,.U:WZ:a;e=.l:&n%Q:<+~Uº {9J:4W;c;σ_b\؋<ܻP MQ;<rȻ^;G:^: Ż;J _;d"0>:W;;BCa<7H;v";%N~;o&R2?:w lz;} ,):`:}?ZT6;<|}Ɨ:*~ͽ9'Id;jK;V;ƚ( ; %E+$6;;a¸j1;2,; ; 6;Me:R;;;X;;9,;0o.3;1;騽M9[I<;:; +>wA.G;@:sq:}z2Ļy險;lֺk;Z: +;;::9a8;׎;筚:[E1<ϑu: TBK:%2sb7;+BÉ9=g;gй<C9OI ٺ_I]N?:s:RFe9gB}FdfקŻX ;&;>Lr;1O;G;;ͬwnaP;Iz;+n/ <:s;;g:4%K;䇻GKP;˺8:{^|';;r":0Yv:n8:D<;:M=-g9ሻ~_&9p.hxpWPK7;P$:OJ:f2#;B;f˶li;#?;-wl8Co;ޅIn;x;;(ݻ05;1;(<0;&4ȇ"Ԏ;8»Қ;; .:<G~9}$;Bfs)r&0uYHx:J|9:Ç/[3iV;)<++ӻ즻0!;M@ܹ ;=̚<3<^s;aY;׫3Yx:~xڸ`;5+;cS;l kH;b;H6;۰>%o:#x:kλ:@kf;y<; <:8-<< k;6;4 ݺ2`1;˘:GTZ:,&];_:SM$'Mg;%{;vU;7Y:;;Y;᷅ +;M& :+J,YZ8h:5a;ȭ#h<@߻n96"ݺC@:;PJm;y:9;śӻ|D9K(A;"Dc;jS;q@;;`2;R<󠻡@bZE;лK;`;m;!kz'S#<墩%`;Wlb97 #;;V9;gߞ:eGJ;¦Z;fҸZ8#12;RzF:G+;\9],1;05g9_ݻ4Pjs;,ջr%<":|;i;8:;c n;$gU5;x曺׹]$9@n:;:yQP\׬;hT; +p9pPO&;$[8]3x<{*h$:qd2Fe:#:X;><}g, +:^:r];oṈ;l;YZ꺪,aGY<6:=s˻:V;$&{;Rw:Ej}{;tN:SM):E0$;ca}>":;x=_;;+5:uf 6;F;1ʻI,M;$_;E:+;;a; <`"":OK\a:W;+:";<&; H`C;X]n2; 9dp8Ë0;;<;J]<;w:}9|c<ރgK;ڝ:)Ks;n! )Pr5KGh;;,:#:;䁲wSym;b=Y<3ux`:9;Fȝ9;hFo:OY=;8Uϙt:<@[<{)޵JI;;;:hIJ W;/<;:5K6<ӆ;OT;%J ;cqM;oZ ;)ĮZ:e`P;9cUrDŽX<^6;` +<u@;`<$b4"]G;D ;Ïl'ƻ:޼j`>E<E;Y;II(F3;b;{:o^};uE;S^;צ̺d!Ҧd=8;Ud!xd":RgJ_;л׻;;S-,8}: +lU;Ŕ;V;p;б;V;;v;Nr; +6V;$htY5N&藼;rTή;DA;dɺ_;;WԻ6C:;fӻ; vz;Tʻ#;&: ,[9$|Ot)˺]`@;]<@};πk;I^::vz9 ,{;#c;E;úDz-0Q; ;nُ +:<V +;&(W<gO+e8M= +;o:x >@;:ai ;@\ۻZ Ƶ;>_r\nXKŎw.Xp;/rtpa4`M9;J;E:;R_;:.:ѶjN3&;>ǩY;B;v6 $$$;UCr +2:D;;syQ;-͌-l^/<Y:Ji;L;u?dL^FQ;e<剻: 5:H::? 6H8:Aϻ˖:0ܹ9r;L|2|:lbvGW^r":4r]Ļ9k;#<6QG;}S:ZӺ﯋:;%uɹǑ: + +y;;>:xZŻgL:x`ysh;;';{(~8>%2;9S:C$;;eB#,ԅ;";I:9;>E 9~Ti:W5/y;8$B;82:{@:3b;;2;;; +:_;k ;@;n;]d.;q;<<: : <€;F;/:<9Ѓ1..л_];x|(:)HqE;i.=X=5,;!:;H;zwM;2:^;:L9"; :w;7A<8>λB;L@ Y6Se;:ӻ;G;4W::{<BCT;;[;k*a߻Dw|;BSay;9<ٺ;#Aֺӻϻ;؋S'h»34H$1:]\=˻OՁ;%޻^o;\@;N`ǺF [;WݻP2-;;׹l+A¹;,<; O;fr6ET;9u;;:0k95;:O*^;Zл!M;;>,;`;.*;,: r5S{ar:tCi;n2;]XQ.b;j;:*#;a#;_;9 H;+;D:[:+Ȭ H̛;GvM;&S䵜;}; _;0Vͻ5:>;};T;z;f[껺v谻w;F94K>Iλ|9\1);ݻ4;+ i;0?;:; ^ɻ78I<]6;G8EzR;u<:-WN:% 5;B'a,u;;U4;w;298*;q; b;F+<*EMKpȸfĒ[|;!ZO߉;`mܺ޴;YuQ: +I[ȺS0W+L:Ri:I::C ;#9EA;H:⧺+`d;7;bJ˻q)ɻ:t;_;;X 8m"5 }n9'; :Bۺ\C 1;Y;$M;C3&N;OI;qpoT8;lֻ4;0:%;q,v;`$;kUŒ;:I;{;89<Κ;@쨹;r8 ee;z<ۻ;vam;y%* `;GZ;#8Nw;;5:6_9J5{e:XXz?F ɹe{;{:R;,';XN:{Nvn<|89;!ʺd;;툮<"-VD;?;c#; ;z7\v;4<^A:Gv;v[)<|{;A:H:v::<:| a <˻I>;b73c}-Y噇/;30>);5:F0»/;rg<;;;bs;*;0:d;费:(C#; dm:j໶'݇;kӻ$YZ\ٻ@Dϻ!!(PѻS>J;7;ૂ6 ;ӻK6$v;9ZY`s'%;4U;/d]9Vꚻݖ;٦ݻ3aS] z+;$;Mab1U\V97Q:];w͉( ;kk;-TPwG;'0ډ;k;V;/I;&ѻmO: 5<5H Q;=<"{;tWr|:ts#;Ha;8$; ;;> +XH ;۲ ;kR7;Xa;N#m;89;/sG;trfg:u*ѻ՚({ܣ: +A&<"|Rs/-*b)8"e:猻?;R;g;+~pQ:*ߟN;fѻ:* Y<dz; ;`/9;:?H9f;+d \+ۓl%a^;!ۻ6^-; [<I;T~;MpϢ(:pN; ٵ[V#;1;攑 ;k$Ǻ-I;PL8~:$¸f͝ ;z|NQ:$P}7);;Ϩ;ﻩ%v;:6 &w: ;E<RT<$;Fԥ;6;?;־ ;r.Oyk\9]:o,`gƁ;{P;#:, |jdc;! +oF;]㨻7qzJ;<Bgq~OF2:_@9|D;A:#ʼn :i<{\<g';e;\;~;W~;#*~r8 o?;"<@q0:z::.Q뻡;iI}ٻp;;ڹf<,T<ޞ@;ş:W0[ +:r] + XӺx< ;\yK:Ǹ82ǺM;$C ,G<Zv ;3Tc[hT‘"ɻXo('`<aOQ*gC;zN<@;vu2KKk%l:sM̉Ϝ; +<`;U3h:# ;p޹;;d+;ٻ2Xq;;@<‹_P ͻA!:ذ/}T0϶P쪻Sݍ;.;Yҡ1<@vd/D#ԻkD:Ӎ<_:o31:|;;:׻ߠ98z;M̍|A92f;ᲂ8ě;vy;b$;n Ի?W;UĻ;nR;c,f:7.aZ;%0;E;{;6<;;з׺H"; :Ȳ;6;2!o}.;$!;{Cֻeɻx;.;Bxy{{x;Y/~;a:X;;%c̻;|z :3|:1<먻X< ;db?/qM:_:;! +;;!؟: <:<@;f!%l=.hGɆ5<+ǻ;'F;T ^ko;r»2 #;ӝϻh׻:ng>;.;!X +;;ߩ!;Wrc<WgH<<;z-<;?: |;;/:׻1<K)<^u;oiO=;]6 j|;)m91 ;c!<:`::6]6 <,9;-t;(9V9:4;PC;/ɷ?a%;:'Ի^+-b˻̸ﹰ.sV*Vs:ڎ:375$bsӣVe|<出D< + 9Q9 ~K;v; z:< 2{:G:8;"Fɺ%:< y:F:e; +`;캼8b(4p jr(9Qkj:U7tu;31};NH;, b;.[;R;r8n-@ڶ ;_;'2;-<9:9*1e;K;:~,7;f;nzf;X99=c:_>lȿ):<%(_4F);I5NzoϻwJ*,<[Y; +^컙"L;j }d;;n_һU\;M:M;eX;xӻK:؃:ʻDa_:w9;`)n;y<`oùivH:Yjx1;?uںy;Xg4!;+Y"Rf"<Y#*| ;pZW;@ : Cr; ;NaS:wW~;=:aXJ35V뿓;/-;yŻ䐺l 4$(:QZWyк-2<sw +;ʮ2;Ii\;oϻ1:$ֻ: r9sҜ;aY'"<4:Q hʻGK<Q< :^/v.< fZ';ֹS;;yTpEC;!;O;cgk[;qz+;;H]<#T:K3RԢ6/Ⱥ92 +^; kY0ܻ.z T8㴺<'!̻;%2zCʻH;5?<99:a;`9Wcp`9tsq&h;9>;;r/; O;ݚ9j9j88:%;Wg S;.AF:^{n1n+;E-[S;xAk.;e%;/ь::N:\Nj;<;xd:;Be տL,a9A ;gd;}l;I;`wr<ۤ|AWyK)D@v/9Sx; <躷 +;MY<wW8w4X߻p4e:':8";l*;7}^C:;;6-CcA%Z;:;:-;F9 ;iHPc+uI:o>=H +9 +bQ{;85+;!W;D:n;<ӻl;㾵;*5Y\<[gg;K61;G͹滱n;y<8#:~8c:'/;<׮$%Xo;u; 2Gx +Z:Ip» 1;-;']ˀ0: ;$;-:h 4:ӻ4RXYokF:a_;S ֻ3 ;g94c;T3h:( ;;#98 <%ûr%QN:;R0G»; :{QzWIgw/)z;݃뻳!q::ͭ:_;'[; ;;Ѵ9:;Sv +9 ;q 9 .ɻ;@uk];:r8VI'p*;e;&{;`XdI` ; @ûs;X <˻5; <$';M~];G9&2;8a1<8J;d>t{c:<;9hq;Y; g{ ;!~3`:l;:RNX:x};J_1>2<րV@EQ;ࢺ 3<sx:t;>;GgaN;R]:<ҩ;35XDޞͺf!'<0;:b:!,;Y ;W;C;Ts;zS\i'; v:]+;V;x=;o;T>/;ƼW:;;/#8; ;&<]g: +:  +a;!5^7;_6<bݡ;X:Smw3VP&%<v<Dx<ԻA:S?%@'&<[-ػ;Jdn;in8:M,xQT94n7˻`z;˚9Mwp9D_?ht M~d:;$?g;R6;43;׊q;.;/:;Q3;6R컶;;},Ym:+7r:pd'ג28;D:B/3;kۻl;;R;vga͹z5K;أN;M+;o,:}ܺ}=79!<ÿ:xU8pT;"%!";6P &;s;-:=`;k:F;ڸ;@w0;?8!<ջ=:D]:&;@ =;(8Cuw79i;l :ڂPS;:ls1;*Y: G§.;:;l5: ; ]<;;@ٻ8R9;,7v:]Rd&99;1<+n;E : ;<ׁ>:Aco|F;<]LĻܷ;};;>/@X;'%#~5I;no/M]dsLS;`Tj:g"+6%Ê;YMS"H;;: 7N99-<5p;%)ɻJ;ہ:X:-B>¸;(;\:<;ON)_[;1-a$Ư;;,;9P;Iʖ;Gx\/^;Aӻ;K;M{4 LK;2X8 _ro;╻)U:U} Y;o99P:I;7;?S/S;;C;n!+iA;J;:Q5k$& ;SߟBJp8: ЕdtҐH;& l:5;Y[G!ʚ5:W +/;ZA:p4$ Cʻٹ*?<:$EK)$u;qX;{ƻ + ]; ǂ6P^d;5:qxJhe;xuлO;KVa_d;$̘:aU;P#= 9Vӻ; #:z娻KdH|<{,;GF74:|!;%׷;;UWhY<\:[[y:=:P+:ߝ;*w;w<;M1Q;.09]E,n 4;cx:N;:^AB8U; ;kr;3:Ɛ;lG%;qӇ:3@:bhy<ĒS <ȼf;: :[372m»/4;0NA;R +@;!s5:d9ߙbe_:x߻T:R8;uP; 狵X?ɻY9;8;- 4;@w»-6{;;L9S];Ԍ< ; 9꺬^^;G<;RG:M2;dջ^%; 9S,:\('_;;9C[;:S˻nZ:;1i; +&D;k52;vu:k@;!7<5};@ػE?2W쯺q:5e_1;k;3( ŵ޺;ch(9ǀ;/bJ;f93q:e;1j; +\;d +m=x9J8}*A7>1 ;O4\$QԻ +}Ɋr4:)u;MZW{И<(ܻld;P|u;;~:L9{~;#a9 +;Y?<M;F:z,et;Sil^u;qe;Ⱥq;LK;V!;nZ;7: R8I+9โ69; tt:< (:=g;6އ;W$1;mIZ;lJ/;uf7軃i7;c.;⻝V <,» 5t>T:7?#D:]b$;{;3 +;6;һln;:J.1.::g .I83:%0v;;-_'مGhL:0m|n9+4k*(;2(< 4#F̺|;Jƻ^<};ehP1;F;Y8/;;bN̾}ջ,O>(:;[R8;+;H !5<3 +}^< +9 ;:۞=;;h;5;"?*=;l;+: !Gߎ;xMHw6ٻ;?OPz.8Tz;nWhpH:ײxؙ[:JMCu;0hu;f,;5,xvPۿw#ڻ:̻&:*n(];jt:;p;:Vpe=Cv;e㎻.;~g;:\CԸ':ۂI>кzm;.Qc޻?:>]ijhsz]rNl,YlEL^_jJ^k}~bƒ`a~ɬw~gWz{2Jl+^*NS1y]JD[1Lu'Df.D>)PIQѽҼmdPxtzw{tscuzxNlkrpXidzc~e_{jc[|w~dv\y{Q~tq}|fz~se`DvfbtH_us@klnmtnVc{_qaZwsz]nwrTb{)s\oWlmhT,s}oxtfWs|p}lW?|ttkzvrfmqzrcCpd{sso`pCnq~l`g|vUct]ywlym{qmkWd{~l[~z~gx\xmxvyr~s|jegt~t|kuqyk{gq{t[zocxt{~xZnchpm{Vww\sy}muysv`|vw_v|nqy~n~xu\vkybkldbk~glut{XzsuswvyW}x|{s|picm{y{w|tpq~fv~_TwzvUr|{_}tzdjj~}xxmpbzstesuj}b{cs|hwrrhxs|vc[Tcns]iu{y~fsurfwwQzoyyvwploy}{Kntcvzxzejtevgwwh|q~dyiaQ{Tzv~qqf{okthy\zVuqzji~_acdtg}l{~b{\jgqfbwm~ruL_pwxoPl~]yoltU8poxmo{rxkroytvoz|c|ko|{w}{~X}i@sygftjuy{h\v]gz|uk~^m|m|rn`v}~dT}zptQ[s}x|sbwfuu}vqmi{ywoseiQtP}ujvvhz^prHnx_vmnblRpnhQu_xVy~xvstandorofp{zyj^Q{m~oevr|wvGwR_fuswtx>j}qleKanV]]xtt\zSUyP~gsvnkpSaT\xtszzo}k}|}dpcXmrp\qwvgsVs}rub]up^h^ioi_tkzvotmwldnxg{ey}{k}zi}clj}~~p~ckrktdaxavnvmoqzryz~tsh}Xefuis}stv^ktp_nx}~ypcstfvtzs~xrh~iop|[jhxZick|{|efm^gz_Vh\v^mvf[HyZM`{wn|zKynr]vgp~EwvvYvGsbjq}ylbuGc\|oby{~prfstgqpuu}}_Ԑkl{NI|}lt{|jigSo_vvlbttukqomjxum~fzyf}hu}urruUgs~gtregt]V`uwnzbrgtgfetyBx{oa|y]{vc|fsyc{hocjztlu}qWinuxvoim{e}yrruwst`x|Y|~}[yq|kzikXt]kzw\}oYlc|w_^XrqRiduo`ujbM{{xxetzXpwa}w~e}zjm|sSuxvgff~^{ocqtthrW|e~zjqillvjvnThmqxZ]xwjZiQ[yfbq~jvqly`xbvXk[|{c|{oafzr~{E}}{`oh{oTtwYekeYn}zhjZtmytdxTZ~u~{h}}y~gyydemwp|urthenwskuf|xiyy}mowyxywyqyupVz]nq}b^_W\rryg|tsyyj}okw_vnlo^Imvjgy}|w}}h{ytQriz}oxgv{z|kvrkxpmuuy|hg}v|zpzlvrm^qxtxidtfhuc}ovod[lcfwblxqxvzgwLolvzk~x{|xp}|p}}}brchmoyj{zqtqz}sinrezv{peOx{oy]aS{oaYjOag}dPeYovooezygVTp|dl_bdyj]}Yja^l]ry|[Nxnwvtr_Xs{{iUmmwr~{zXoQBUvfUwMsm@{zlmU_pA}~khczBzxexRxlwr{upuwXjzvos^mnkwxiYsui~mpvxlNy{v{jocql|u_w}tGfpmN{ha^xc\|zwsWf|ev]yqe{qa~bRhcsyhWvvQnqTkiSqma~]\uJ{\wq|thud{_Suyn|sh||mrƔhk+~~>ywYxgnys{wu{hxf{lp{}pu`h[{Zap2ymzMojXxEpjjbnIvgPwjpsgal\irrwhcsk\}weo}cr[hvwrWyu]~rlyxyzwHzzxj`nwxxynNi|a~x\s|fpywsqQxiilllfypqY||{|yyjyXktfztkkxaZGLuii}qmdv~||Hq{f^cftolmSxAhxpXv^vGsukk]CzxNwz{[|[^q~tfoYq[zdetQtafvsvshtsuu_xp_bsp^wfycx]u|zvrg]pkuzNttzkrt}svp|j|sypirzx|fexq}grz{uu}|}vfv{l|z[tmyclglUqit`soss~~ey{m^ztvywG{kmOmZwqveqiyxmi~qpbn[WmNrjhcy}\xgm_dfdv|zwuqz^}vs{SIrFa}P~r|_ruyhCxi|qqe~prh~f|xcalg|yxisxljpKhKiL@xfEspvzmsq`sToTz{pylro|~q~tuovo{dlwvzny|}}p}q`ag^p|uog{zp[zYk_}wdUtUml~nkvx}|UhdqRu~^lCchiqtly{zX^i{lbxoqSz|^uipdfczg|mtHwvurlrzkg_k{wqwqwfwjjsp~}l}s~J|kjjkDmnpwt\iyrnm~lz{ro~wkyo{xn[gqjmzqZy_r`kpl`[YvXe_r{kov<~|OnzMjzvb{w`ai}{NxZy~Hzd~]udg^bwtn|}bxqy}eY~QW}uzhqz]~boregepXrxwtseovgb|}RZbwLdcQk|oue}}s{_l}d~`yx|eyx`hr{toUZs_j^|szoX||msw}nuyMlzWZxsmKwj|q}fqu|yuxky}yzr}XT_lnyznjJxYsjq}]ztOejYmcp`~|~\qp^{oslgg|unIpu}rkufv}Opumzbbmwupk~jsV^Ygq|eVRcslkybbuKqmr_`rseTp|pvjzuu}PsqxirWaupxcsohztkgmn}~Oy{}tpjT{x}emov}lnviwdv_j|nkhoZ~\Uyq|ZWwmmy|~}c{]pV{xqsRyrwS`ltRcasqbovtkfnkQ`tmaxzwqxpuY\|ze{xMnqwlwXuutk_rl~{wgnyzqu|\G\jme{t|yzo}brmtrxjHSnvrtrulxsz{zxujoR|zmv}wrp=Unuy}ncQ}aunJw`Xwky}~mulalhp~x}~v~[Jxhf`wi~flxtEw{Bwyy@vtgpzh`ZUohkiziYXeyxq{ishwfsuemnWx|aXs}xxkxp|u_`rowlzyUwzpmY|Penf|Y{mts|i`kyn~xwfrvbjudqQhV~|mpzjlq{tir{m~>ekvkyr}{`\d~~zvrq|sf|lw|gmh{}qMWnnxmsqhKa|spbksjnqsxmxFtvgyq7yylay|mqkeswnqx^cmiTw~o[b{`f~{wsypowqcvp|wrVzVd{}r|}gx_}Wr{ojr_syhmrmnqgpuUsjn{[wxZu~ow]qm`umnkgaoz\fqyoyst{z{hf}afo}zb~b|]bmzer[l[sz^lIlq}l|s{~ezo|uE]ypisr^tvzvesh_|ssw}V{Ճzlqqmqwym{rr|{r^xuuvvtnra]Z~iiz}wipgh}l}Wu{wkveoiolvztr|^}kk~tkg}|lrx}ut}WkTx_ybs|zV|vu{W}}wziuj^pj|ifwjxln]>@z^e}lps;vcy{ZqVq,i\`OZpZwm`px7bfXa|lbY\d=Uu=py^`CqxjfizRuvnytku}uw]ojok{^]~wzzsxc_yf}qsnx~\g`kusmtu}wgQztlxcSyBs]yq}pEotZn^ȎvywgjUd}c`{o`tuyslflqzmn~ralx_}yFYQq{cpnduvxzy|lyUv/iyLvq_fowl{]mvwxq{|Hvtdvq^l_zSUewRRsT?vo^}~mfzwwhsdSss`Ruz|YapuwufM~_bzVxtvfwgQx]un~izj~|vmmlWRfridwxC~oUq[{EznkA_}^xvq{~zuO{VZXDi}U_{}jZmWzfDovdnxaqddgrsttqXd{~OVwIXzy]u[~|{{wfj5xbnxz|wzoqMinyfk|qbYAdSqkwphLuu-q|V]stCxtaWqoCxHYp~Rp|hkxPkopSwi_m{}kx`grdm]nyEpboN~ospyZnlo_Uv^Yhnoez]JdaXb^ZvbZ|{rcp{c}w{{|]wqs}{uhrozo{_{nv`z}~iu_{w|vfpzwxms|{}ko{klzzbr_prwmon_v[s~Oumutzquwod{nngSvAkw{8hhfyzz`fcevmouow}ggishGuxwzZctv|x\oxgZd|rda_|[vkgiplool|_kdQysrzygxzV|tOjghainrzqrwZ|zpvvbM~rzZ~daY|{|rrpt_U]tt}Wk{r__fxjey_nkwzqstlo}svo}Zwuz}[tmb{}vru{j|KzDzbes]umKmq{eXYvrRaVkvj~vZyRgopb{UOcT`{e[uc{{rxypn]cK~Nj_NoQwnuXsv`]V}r=cd^}s{{cg_jptXWgFdcgbtZafqpzizwuNgvRhnfb^ihdnr~|w}sxz|yagfUrszUgbvgbr^Ygs}kXahNfxp~pioZy}uys]zhqf>pytwdccl{`n~Ctp_[K_XsizezkcU`c}u}Hipkno^WXSTizrxuwbZkpgǍwXwzv{sy~J`yK`stlnQvgzouSnYsYo|vblqcw}|nvsrZhΆǁXb{hQla|}k~ϔe|Xp~pi{Lcs\wVwQip^ixdjkdfxwp\t\Cx~gp|ejmpc}gre\L}xzdegJukurLfl]Snmxkyvbfuro}t{jDST×k\?Nnbp^X2hpPXmh`pzoklzyg}|{{`rvrTbc|u{\_YX~mygxhtrim\m}듭n^hvdh_rbZ8tYf|topmgw^W[PssoOT}[=pyepzXhs{sh}qxdg`l{wrVgqtl`~Tn~]rswWoLqswcmyojPkhT[kRXssqlul/[ziemneYWccg[nP{|e`lR{}Y}hzc¶wy{_}zhepcaoMwxrrt|ihysv^t`Up\iht{NwjXyw|fg{hiTbv[pizaA{`hmfqIDs_]v`OJwzŠywdiAr~duwm_rghyM8eZ^oGL`zywgp}LetyOUpefjpN~s|x_ckHtmvrhyGnXKpwvu}Sgcizs\ehrpCt`h{wnxQ`sEV}xnmGl`Xmm[y~y{w~vwsf]gwW_ZI|uvwx^]Veaf}owrgt??`Wxfkq4eywZhuit~zysjēuuiusvwxdk\nd`SpwyYZsSniz|LTu^sPvg|u{klvprb|Sov}cxbzphsigms_tqXeRpT}b||vfo_t[]x^romzenl}Xx}xhle|vkyzUkxrmu{|lWzkij_VjwK{v~bexebst~ahx|Wayfu~ZyI{V~|ozhLxrukpmdWcMzhUhWqN{kdshWM[tcRfdkfl_^h}re|~jvpmhz{ynyha|kwuW]tkvogFvhirzczbXlmɡ_zpQpsUW^Y{UYqxny|rsem[8:C_jsfxzxwgXoWJXn}l]ozwU}u]zznrnnbAjIAAM|gxvP~^zkgayzv^theiUcrc\tX}dWptmlrw҇h|luLl]vqxI~|kggqjpicxc~tFvkiwl^^OVeyMsS|cyWWUgaQv~cPk9YlTrŏIDuYJ?ʼl|χXu5mwks}czjXÃftcV{yGL2ac2.Ugfh}Tr:~XYx{q|QzkssAMzXDe0i`vdah|p^cbzgfxpw|ouSofo^~~qZW[nUtxtnRlq_yÈkOTWy]r{~Vt~vgkgjYusePupLekeRcgTw@ibsk{`oVZKederdzmT\}y~vQYvkZ{{~goxspctq`f[y`lvzrxtpygzl}soYQqc|{srKwptjatbxjPvW}Yxwl}Id[x}mwexiYcxrhylVn[oZporov}r]tix}spz|upvtysxxv}yqlyotXofyaS|jOYhpWicwiZNܕQх]Myfny]hUuVrf\ysslm^Yc_XP|ygZfKrezhmE_~tCxUN~]|KXvybfZJix_DqZHbfkrDlxœ_jl_d`z}p)gk{o}vzI_hvͥhlKc{tPfe]]r]}[qkSebosN^k[nbY]jrfTyudUoQdfq^V];eWs}cHhtv|j{[udyekc/WfwwsdxYb{~\{ākypgPyYQvlWYLZ'io&Q}>ZmyCl/qc`k|o_ZXFju{4jqVN_vg[IztMKtdlgclq}uU}ofqRu}id\^pff|uk{pep^avGpyzloZZln~xkyHqu~rq^`Ouxw_ȈUwKijUjcvjwmx}y~U̧vyi}]ZpmN~sEa~YokEytjov~uewYwmTkztZTprb~tnxwV|xsri~rqntm\ynhd}sSsTQtpRu{nmyrr|i|tqkEy|vyLTlOivP?ur{pN:WOƀ}`lu{3oiphf9tihKY@ÏKSwafR4fqukQhNujmhVmlVƏ~}lp[}~XzXse`}p{oxtlseVwXRgbon^mr{ymjwnzdiPgrjps@}ydan܌udS[_Xaw}Zh]o{`nvuZs{eyC}h`]zg_ezl_fEzo=ebqauKm|vexue-P~iKxtwzaM_iqmdz|{yfa`RU~Ana8dzW\~ehkֆmw{hX¨Sucx~pkmoymZ}mz}{q]nwyo}tynN~o`pp|8Ex|Bfyr|ultoQyuzlKkaxnSrjsgWqntc~~w\zaKcavvzqje?|prpotlfnpbn|xYnub[V~lLJGbo|guvzIPicnzjcmU-j\JY?fkyShmrWbYr}dRzmzu^kwwpfqUvRjg˵C\\RcٛTuM@[Xog~t(o~7fksfqv~hwye{~\Kxvy|j{rΏy~y]z{i}nhtur@hLb~sbuPrmfw~li1lQjxG|n]T~>tz||wUwyPK?{xs_[rb~{dxf|~xÃe\tyzy}njrS{dZp``V~zo}lt]vgxds`gp~oagpkvizr.~[z[oxytxuĥrw}rFszfi}kzP[mSZ|VgZxsVx|ij|@kUĶsqh~Y:zrOT[{hoexmpc|SW}OPewc|RmrN}mhol[wV]Z[aljmyxby~yS9prhtvSyXx_}xi{Z[6n^}CgttxcVvԋuc}`lXOumuY_Ps|h_g](`l_qy~@yat`JrmGmƅwtb\q}nYlUx`rmKznlxk_Z}\OzwFkuh{]~@CdMkDVHoDU\HkzRjqwK8~zxqUrx|pi|hLhhv|bc`m}mslv[vf}vgZ[otH`ihSyDLxfnhJTPUz}N{}sVe|el_ZlqfxbtMmujxGxzqls\YWmNMacvwY]mܘU~pXW~Χb[4/d{zuXMͶPlpeo[IzuugsW}nnWIÔq`Vx}nKlkwja|{?+P>}HYvRnwb`|oaؚzeAqTYΎpA?twz[Fqi|SzvrzwqYߏCYsc4oL[}zXrb{tG|b>rq7kgsA]tfX8vƃVepvɝqyW\dgAtd˘OC\hcr8Ftqtcvo[1hUt|HPcZavSnsvm#zfiej\|jhwbyqsLsc6uiVV]aQŐHI~{ògtgds|^`_]x|EjWLdzk_wW`xYkzzkPeFNnNpdK _irpji[Ro{n7MPkrQtngli@xpsex^TmUqkbkjdžKW]cqrgvsfgr}yv~nvt}phy|xigrqg~CtkYdxa{}|qi~paYkt|[vsbSetp}eoc|[vqYL~uL|{sbgl|b}mo|Yh~[th~Ts~gxZnsqze\kmHf|oT`jLeFoZvlhzllvw{tty|[kp]sZa1`ls^]aSykS9>VQvi{Ҡ_p[c{^]mzVx~oZ[FUhWzik[[damnedRIeAvRvSxrcc^bD~}~~u['Raxn~r[NroUupeQ@vjxpefq~oՆq]tqoX~tqz_{{ubzme\}lfh[u4VtZg_q`~rW}Z_l;~xFulm[i~w`jpokW}V_=jilgraГ>tzl}S8vlyWqvQSJsYTpcjHrsY9uKjF[]yodekbsgYro{P`\nc\mmǨPҙE_i|Zh:fWkol7uyxlbfVw`~fqwyoOH7asCaa^urVfkohfg^dNojagbTfz}}XsYIidgzvkxg{lpmmu~nvvhkaRjh~poqvYtthqf}^veoh{aDzTyQE\M6\U}bi\k_|pVf{/mgvW'Udl_reya]nj`ZZcOdJAsl|ggtxPjlolo]\Iz~dMl.OXeXvYkȀr:~ORYlpnnmx|AsxާqTbr]bmhIXnU~WXl2@uMpI_}zxoqtzWVzV]N{ZaPnsbMq{pHZ]WuRScowXiUWfnqq|w5lp6lhLmvvWnz^jAoLxw\K{{uIWQpjb?3Vnzaltgl|{vHzsuU^{sphy{l7ti{myixslft~yTGnW~YehlyFdyQz +rnycm\is}sچzX]zN|obl{Yljix{P`P^f_mkvbxbDafěxvovVlqf)odjPK~jmpb/m\`jaevp}k[X[|vu_mvCaisf`mMepfoöwm^Kr|yS{uƨw|s[|n}wt}YgyxؙmNosŠIJXi{KChfuO}g^dgqZ}œׯmVbUuz)Xo}LjgvwniOu@x_}MlVqDkpGQoYYOX[vxsS~FdzVqGnbgcvx=h_TQhd|r.qxfti}uhk{c>`DA~Q{bm}m}Ktmsaw{Muxmcw}wiZ{nYrXipdOztvkpgvCV|^Uyq|upgPu@e`zc}gbn`oifp`A}vaw׉{lYewmclikpDY~=c?~ys_{rnxyShxEhpލ\~QSTNxf_[A_cskydbiuOUWwLu{_WQYyNH_pacmkHbq[pqbhaK`}}l[jc<|QNfq{x\1vliV{MpSvzJWj`xXSrNb/ta|XU9t7ejNH}a|gxg񌀇ylRzU{gqP>lxwXmk[wwN~j;wylmvbz|{KNq[w^srFP|orv^tzuzxHg`dtdArvq|VNQf|rƄ[}m`̞h[uvhzZ}rSH]q\VZzm~W{xndIvIpbdw8}[Zm[JTrtZOy{iw7OgtdxY`khmtgdvqsb{d_~z[j{og|vxrt`ocfUezfjvs}tnvVktcxvy{ppt|s~qwupfmp~9qqsr_fkNjZkjYMtMxy_}ys`uOwYNgX=m/r[l9kFpgljg\h|yhsLr<7}E;Z\4lbY\t~yp|xh|Q{ex{F}fu|7mMxTlxqo~}cj_>r|{cpMrX]Osuw|}|rИox+q`yoIzzd|wIck}e}k]f|\nno{`u`uYyvy^tlEzT|{h]qNgi{ՋQozijmQe}uMIg~SSX~vewFjC>G}vs^Ѓ~^}nL}É'wiej[ĢuKbZesYdhcatjxxTgrDFtRn{ctt[ypp^yXaPc{jroav\uzCcVxbd~m1yn}c`qwϑPEcRs}yyt|ĉ;xa@luH^N3{mVZG}akukXKv͂/[Foxnh|?JS;viS[Vpxe_rWzg~D=e~]|VpWbyo[K~}VhBYzlWbUH~cvYTNo|zp{|{`L{txS{ˏhxbOonAndxy\QMof~khPuhnrx_RhP`~w]~>l@2~Zϓt^vwT{mqyq@uRuo_Y^bnJ7WFR];XORr|jЁXQq^rRrvOu~oNE]mGq^ynXsyZXd{Zsɋ|_e]hTĪfcZh]h\lU|go\whyheR}tsIuRAgxDŽmvfhtVψdUMehnlXh}ugnKX]yEjOurzV1U]dkbkpfkudsNyamXƃq`lJyr~r~waGzwcyuHoyJo\oz^w=r~VQ~Aºm^CogxwtÙePtdLi8mnd}qQ*tߗYdYopXK_fqsUEuTDnXwppИ{c^Whkevq=E=j8q_ɡqqlQSr̓xGt0iAx{FuybfspY@Gj>Y_cD\IJmc|@vmpS{p;?g\=qY|ckaȎ[nrzvRcu||`O8tpЈQQȗcQSVc|tBIv[xYS~͡yPnS[e[}{AŐ;Gy{fwkOmVS[Qj}mc`lnjwohXiegjm|lcud\k`|yU`kvLX\bfaVrtoWMvmSmypFuby[qӈ{Tvhk̻~]vKy}[~\gvTfrqFotNvolQ]cgzsyIghVwows\yVRyorw[e~nEzmdxufo{UgphS^H}o~ixu]Kw_X[jz|tqxx}ar{ijpc~iyycoVwxuRc^wwtcqrOsb_g6]X~sidSW[`T=kYvS(vvVsmriqecTqwp~~/MLYEqxg^~|w[sodo~uZzb~qxV;GW_dthjcoj_p_}{\kw]~OFInzr"o*cjYdkscy5qQp}yqmrp^`e}u}[@wLhW~r6yvjktsT?{qdc\Ew]XhQOn_z[qϭz{v\y^q\`ysqm[s[jgcQ{Y}o5qba]vVlbq|~Y~|mxx~o|~{\[nU_r\leCWj[kWXKhI|fTz~]f^yh j}SwKbxm~QQOQk`x+~uk{xfcyTY_}o\fyy[zE{SjMxgqjrJ7xhQi.ZOUm8iP}cnsJ~Yn}Vyhgd^b`cm}eviƑ|qp|smTuOjnrtom[gelwUuqi[qbb~s~pvƔ}wqxqlqDd^`q{u}U{]|bzklqrloeu_mquOrwkH^hnobGa{nhhli|S>~{aP{bmatUnvcg[~anXrhzAlmTRM{hjTiaPwȯp|lccVionŠktltW^}b^z{l_n~eX[v|qslXAv[\jASyp{CJtnO\gTxayj[|vRkHmOrk8.1щfN~\sl[W[EfZYgtug*aozwkālpX@69`ltX^amvbqaqUcgxt\szqSEgyv`Fvnay_aTVOFVR}XhhZ]ֈeR_Yjs@is|hӏ}_ʙ}jmXzxUnvjvnskuq[WogcWrpz=t~tdvtc=dc}wg>q}pJW]mUUjwh~lund]s}|Zsxpme_z`UebPfQMvru_x^ueW\IjhnPXOiHfiy[cTM|[5ld^rfkhrl0ki{hx{nNyFkYWoYdx?mZov0CLx|KGnZjbqW{X~>bnvYZlSϜ{o~O^n[uxNGyz0oJtx~ig_TlcRʜhZdv|y}П`p~tasTzj{ogďBfzwzv6Zq~dawoheyd,sBk|yR|z[Q;kmiQouVib~a_^RVA{vjck||lek{Tmp_||g~kl_qrx{jBGh`_pwpwY_e|oDRxxժbs?naw,{W]dzuxf;srVQAdaJnGrUtjmZ~C?xlqqrrjn]vq}gfWgwqzlXv?k|zS5JLVzIyzIhorwuwcg}\TdtMinWqj{yHP_YvOYtgH`~fvkpxtbu;Vxy\HsvYTmusJ@[|x`מcafn]q_qrsxoiQocqkbWIrVhvM_}yWolLQx}nzjbcqno2[fSt~c}^vyKfjslppmgpPj4op`y~M]YrmϏcmS3ƟSaswrVnp\7utVrvdnfl{WR]_eocrU_eihmpv?wbzm8SYNn}(Io}MfPsbjuVtwm_v1>q~|tdv{\ysqRvgyxYC?q~Jdn`STfkY8\wmc}}v@QYsfaS|{C֑lLzeBpghrU]QzYbfboccgXv~_w}zjif}Uvhrefhgl|G]d\fbEg7]yx\ygulZuvF}r^KiaUdkruqkrqT{rWgІ}ppliYZbqmR^jtlN^[pNdu~gdMhbrk_Gktu4~z^2hr{;k\LHv?ZHaOyK\scczXk|cfZor|rД~pao,mj}wn`3A^aNiSv`aǬ{oJumto4mbgYSq+-P'znszuolVhoiqUk{LuOAqh`wvUdlgGpw\i|nϗxm_O[z|uqlXjZK~zۏyM{th`uvXrmSeawmzv\Y~Gh\omuar~ik|em}knlYYfrfuqvxg~tyv}Yvc9{nqtplXvRqwd}c`wrz~|YmpP@pCLqqq~{uYC||cSszyMZwwv]x{fctNiƌzmsnnPUm`Caa{jjR5XkNb)nk`Y}nÏ[ȢLrbZV|nNs`b]YspmlZUdHlwo]x^jrn[i{Wx7`^oMBɕq}yzewkqrqjqZErsfoljcuvr|O`vzOrxcm}wx{Rz^\nztmCjfyWgvrrwtBxVzo0jr\tmxTvtoSeiyeiOe~cCx_bUFu[BuiyOTrvv{ĆtGz]g{peG^twtn~Zcunkc]>oHy]gm}vWs|lkdCf{Ott]t`~vPxD|VrybjDb[Imq}v*iolv{^blQhov~x^3Df{UqaOg^qZfG~jdsuwkQwidQ~SxnpqxiKunll~Wv:Xgm{IZzk|u|}hZqlxno{oJmKiėh\zo|_vIb[JwqURjorF~M|Wpgdk~'qiux|liOYdouNeyPvym~uv]VjyzLOqvjV^JcTvjOtf{ssuPp~~Wbm]qrY{[|rkn[]\plgLoyW{@Rwbs]tJjjqj@W{l\mhcSrqnYVrev{hqSyRxoXx9okwB~|d_xxiuwke~hmMizpE|jx\l|v~zeRqK}gi_qBpGfh~X}Wv{M